Browse Source

refactor: 将核心 Python 包从 agent 迁移为 cyber_agent

SamLee 1 ngày trước cách đây
mục cha
commit
a60f75a8e0
100 tập tin đã thay đổi với 455 bổ sung455 xóa
  1. 1 1
      .gitignore
  2. 0 5
      agent/tools/builtin/content/__main__.py
  3. 10 10
      api_server.py
  4. 12 12
      cyber_agent/README.md
  5. 10 10
      cyber_agent/__init__.py
  6. 0 0
      cyber_agent/cli/__init__.py
  7. 10 10
      cyber_agent/cli/extraction_review.py
  8. 7 7
      cyber_agent/cli/interactive.py
  9. 10 10
      cyber_agent/client.py
  10. 2 2
      cyber_agent/core/__init__.py
  11. 3 3
      cyber_agent/core/dream.py
  12. 3 3
      cyber_agent/core/memory.py
  13. 1 1
      cyber_agent/core/presets.py
  14. 4 4
      cyber_agent/core/prompts/__init__.py
  15. 0 0
      cyber_agent/core/prompts/compression.py
  16. 1 1
      cyber_agent/core/prompts/knowledge.py
  17. 0 0
      cyber_agent/core/prompts/runner.py
  18. 25 25
      cyber_agent/core/runner.py
  19. 39 39
      cyber_agent/docs/architecture.md
  20. 31 31
      cyber_agent/docs/cognition-log.md
  21. 0 0
      cyber_agent/docs/comparison-with-claude-code.md
  22. 6 6
      cyber_agent/docs/context-management.md
  23. 43 43
      cyber_agent/docs/decisions.md
  24. 31 31
      cyber_agent/docs/memory.md
  25. 2 2
      cyber_agent/docs/multimodal.md
  26. 0 0
      cyber_agent/docs/prompt-guidelines.md
  27. 1 1
      cyber_agent/docs/scope-design.md
  28. 22 22
      cyber_agent/docs/skills.md
  29. 5 5
      cyber_agent/docs/tools-refactor-plan.md
  30. 15 15
      cyber_agent/docs/tools.md
  31. 14 14
      cyber_agent/docs/trace-api.md
  32. 0 0
      cyber_agent/llm/__init__.py
  33. 0 0
      cyber_agent/llm/claude.py
  34. 0 0
      cyber_agent/llm/claude_code_oauth.py
  35. 0 0
      cyber_agent/llm/gemini.py
  36. 0 0
      cyber_agent/llm/openrouter.py
  37. 1 1
      cyber_agent/llm/pricing.py
  38. 0 0
      cyber_agent/llm/prompts/__init__.py
  39. 0 0
      cyber_agent/llm/prompts/loader.py
  40. 1 1
      cyber_agent/llm/prompts/wrapper.py
  41. 0 0
      cyber_agent/llm/qwen.py
  42. 0 0
      cyber_agent/llm/usage.py
  43. 0 0
      cyber_agent/llm/yescode.py
  44. 2 2
      cyber_agent/skill/__init__.py
  45. 0 0
      cyber_agent/skill/models.py
  46. 3 3
      cyber_agent/skill/skill_loader.py
  47. 0 0
      cyber_agent/skill/skills/browser.md
  48. 0 0
      cyber_agent/skill/skills/core.md
  49. 0 0
      cyber_agent/skill/skills/planning.md
  50. 0 0
      cyber_agent/skill/skills/research.md
  51. 4 4
      cyber_agent/tools/__init__.py
  52. 2 2
      cyber_agent/tools/adapters/__init__.py
  53. 1 1
      cyber_agent/tools/adapters/base.py
  54. 1 1
      cyber_agent/tools/adapters/opencode-wrapper.ts
  55. 2 2
      cyber_agent/tools/adapters/opencode_bun_adapter.py
  56. 2 2
      cyber_agent/tools/advanced/__init__.py
  57. 2 2
      cyber_agent/tools/advanced/lsp.py
  58. 2 2
      cyber_agent/tools/advanced/webfetch.py
  59. 20 20
      cyber_agent/tools/builtin/__init__.py
  60. 2 2
      cyber_agent/tools/builtin/bash.py
  61. 1 1
      cyber_agent/tools/builtin/browser/__init__.py
  62. 3 3
      cyber_agent/tools/builtin/browser/baseClass.py
  63. 0 0
      cyber_agent/tools/builtin/browser/sync_mysql_help.py
  64. 3 3
      cyber_agent/tools/builtin/content/__init__.py
  65. 5 0
      cyber_agent/tools/builtin/content/__main__.py
  66. 0 0
      cyber_agent/tools/builtin/content/cache.py
  67. 1 1
      cyber_agent/tools/builtin/content/ingestion.py
  68. 1 1
      cyber_agent/tools/builtin/content/media.py
  69. 0 0
      cyber_agent/tools/builtin/content/platforms/__init__.py
  70. 8 8
      cyber_agent/tools/builtin/content/platforms/aigc_channel.py
  71. 9 9
      cyber_agent/tools/builtin/content/platforms/x.py
  72. 7 7
      cyber_agent/tools/builtin/content/platforms/youtube.py
  73. 1 1
      cyber_agent/tools/builtin/content/registry.py
  74. 8 8
      cyber_agent/tools/builtin/content/tools.py
  75. 0 0
      cyber_agent/tools/builtin/content/transcription.py
  76. 2 2
      cyber_agent/tools/builtin/context.py
  77. 0 0
      cyber_agent/tools/builtin/feishu/FEISHU_TOOLS_PROMPT.md
  78. 1 1
      cyber_agent/tools/builtin/feishu/__init__.py
  79. 2 2
      cyber_agent/tools/builtin/feishu/chat.py
  80. 1 1
      cyber_agent/tools/builtin/feishu/chat_test.py
  81. 10 10
      cyber_agent/tools/builtin/feishu/feishu_agent.py
  82. 0 0
      cyber_agent/tools/builtin/feishu/feishu_client.py
  83. 2 2
      cyber_agent/tools/builtin/feishu/websocket_event.py
  84. 0 0
      cyber_agent/tools/builtin/file/__init__.py
  85. 1 1
      cyber_agent/tools/builtin/file/edit.py
  86. 1 1
      cyber_agent/tools/builtin/file/glob.py
  87. 1 1
      cyber_agent/tools/builtin/file/grep.py
  88. 0 0
      cyber_agent/tools/builtin/file/image_cdn.py
  89. 1 1
      cyber_agent/tools/builtin/file/read.py
  90. 4 4
      cyber_agent/tools/builtin/file/read_images.py
  91. 2 2
      cyber_agent/tools/builtin/file/write.py
  92. 2 2
      cyber_agent/tools/builtin/file/write_json.py
  93. 1 1
      cyber_agent/tools/builtin/glob_tool.py
  94. 1 1
      cyber_agent/tools/builtin/im/__init__.py
  95. 1 1
      cyber_agent/tools/builtin/im/chat.py
  96. 7 7
      cyber_agent/tools/builtin/knowledge.py
  97. 3 3
      cyber_agent/tools/builtin/memory.py
  98. 1 1
      cyber_agent/tools/builtin/resource.py
  99. 4 4
      cyber_agent/tools/builtin/skill.py
  100. 7 7
      cyber_agent/tools/builtin/subagent.py

+ 1 - 1
.gitignore

@@ -77,7 +77,7 @@ frontend/react-template/yarn.lock
 frontend/react-template/node_modules/
 frontend/react-template/node_modules/
 
 
 # Feishu 运行时聊天记录(自动维护,包含联系人 PII)
 # Feishu 运行时聊天记录(自动维护,包含联系人 PII)
-agent/tools/builtin/feishu/chat_history/
+cyber_agent/tools/builtin/feishu/chat_history/
 
 
 # Runtime artifacts (one-off scripts, data, cache)
 # Runtime artifacts (one-off scripts, data, cache)
 .image_cache/
 .image_cache/

+ 0 - 5
agent/tools/builtin/content/__main__.py

@@ -1,5 +0,0 @@
-"""CLI 入口:`python -m agent.tools.builtin.content <cmd> [...]`"""
-from agent.tools.builtin.content.tools import cli_main
-
-if __name__ == "__main__":
-    cli_main()

+ 10 - 10
api_server.py

@@ -17,13 +17,13 @@ from fastapi import FastAPI, Request, WebSocket
 from fastapi.middleware.cors import CORSMiddleware
 from fastapi.middleware.cors import CORSMiddleware
 import uvicorn
 import uvicorn
 
 
-from agent.trace import FileSystemTraceStore
-from agent.trace.api import router as api_router, set_trace_store as set_api_trace_store
-from agent.trace.run_api import router as run_router, experiences_router, set_runner
-from agent.trace.websocket import router as ws_router, set_trace_store as set_ws_trace_store
-from agent.trace.examples_api import router as examples_router
-from agent.trace.logs_websocket import router as logs_router, setup_websocket_logging
-from agent.trace.upload_api import router as upload_router, set_trace_store as set_upload_trace_store
+from cyber_agent.trace import FileSystemTraceStore
+from cyber_agent.trace.api import router as api_router, set_trace_store as set_api_trace_store
+from cyber_agent.trace.run_api import router as run_router, experiences_router, set_runner
+from cyber_agent.trace.websocket import router as ws_router, set_trace_store as set_ws_trace_store
+from cyber_agent.trace.examples_api import router as examples_router
+from cyber_agent.trace.logs_websocket import router as logs_router, setup_websocket_logging
+from cyber_agent.trace.upload_api import router as upload_router, set_trace_store as set_upload_trace_store
 
 
 
 
 # ===== 日志配置 =====
 # ===== 日志配置 =====
@@ -71,8 +71,8 @@ set_upload_trace_store(trace_store)
 
 
 # 如需启用 POST /api/traces(新建/运行/停止/反思),取消以下注释并配置 LLM:
 # 如需启用 POST /api/traces(新建/运行/停止/反思),取消以下注释并配置 LLM:
 
 
-from agent.core.runner import AgentRunner
-from agent.llm import create_openrouter_llm_call
+from cyber_agent.core.runner import AgentRunner
+from cyber_agent.llm import create_openrouter_llm_call
 
 
 runner = AgentRunner(
 runner = AgentRunner(
     trace_store=trace_store,
     trace_store=trace_store,
@@ -109,7 +109,7 @@ app.include_router(logs_router)
 @app.on_event("startup")
 @app.on_event("startup")
 async def on_startup():
 async def on_startup():
     """服务器启动时执行状态对齐"""
     """服务器启动时执行状态对齐"""
-    from agent.trace.run_api import reconcile_traces
+    from cyber_agent.trace.run_api import reconcile_traces
     await reconcile_traces()
     await reconcile_traces()
 
 
 @app.websocket("/ws_ping")
 @app.websocket("/ws_ping")

+ 12 - 12
agent/README.md → cyber_agent/README.md

@@ -71,19 +71,19 @@ agent/
 
 
 一次完整的 Agent 执行。所有 Agent(主、子、人类协助)都是 Trace。
 一次完整的 Agent 执行。所有 Agent(主、子、人类协助)都是 Trace。
 
 
-**实现位置**:`agent/trace/models.py:Trace`
+**实现位置**:`cyber_agent/trace/models.py:Trace`
 
 
 ### Goal(目标节点)
 ### Goal(目标节点)
 
 
 计划中的一个目标,支持层级结构。
 计划中的一个目标,支持层级结构。
 
 
-**实现位置**:`agent/trace/goal_models.py:Goal`
+**实现位置**:`cyber_agent/trace/goal_models.py:Goal`
 
 
 ### Message(执行消息)
 ### Message(执行消息)
 
 
 对应 LLM API 的消息,每条 Message 关联一个 Goal。
 对应 LLM API 的消息,每条 Message 关联一个 Goal。
 
 
-**实现位置**:`agent/trace/models.py:Message`
+**实现位置**:`cyber_agent/trace/models.py:Message`
 
 
 ---
 ---
 
 
@@ -92,9 +92,9 @@ agent/
 ### 基础使用
 ### 基础使用
 
 
 ```python
 ```python
-from agent.core.runner import AgentRunner, RunConfig
-from agent.trace import FileSystemTraceStore, Trace, Message
-from agent.llm import create_qwen_llm_call
+from cyber_agent.core.runner import AgentRunner, RunConfig
+from cyber_agent.trace import FileSystemTraceStore, Trace, Message
+from cyber_agent.llm import create_qwen_llm_call
 
 
 runner = AgentRunner(
 runner = AgentRunner(
     llm_call=create_qwen_llm_call(model="qwen3.5-plus"),
     llm_call=create_qwen_llm_call(model="qwen3.5-plus"),
@@ -155,7 +155,7 @@ async for item in runner.run(
 ### 自定义工具
 ### 自定义工具
 
 
 ```python
 ```python
-from agent.tools import tool, ToolContext, ToolResult
+from cyber_agent.tools import tool, ToolContext, ToolResult
 
 
 @tool(description="自定义工具")
 @tool(description="自定义工具")
 async def my_tool(arg: str, ctx: ToolContext) -> ToolResult:
 async def my_tool(arg: str, ctx: ToolContext) -> ToolResult:
@@ -203,7 +203,7 @@ examples/research/
 | POST | `/api/traces/{id}/run` | 续跑或回溯 |
 | POST | `/api/traces/{id}/run` | 续跑或回溯 |
 | POST | `/api/traces/{id}/stop` | 停止运行 |
 | POST | `/api/traces/{id}/stop` | 停止运行 |
 
 
-**实现**:`agent/trace/api.py`, `agent/trace/run_api.py`
+**实现**:`cyber_agent/trace/api.py`, `cyber_agent/trace/run_api.py`
 
 
 ---
 ---
 
 
@@ -212,7 +212,7 @@ examples/research/
 本仓库自带项目级 Claude Code skill:[`.claude/skills/agent/`](../.claude/skills/agent/)
 本仓库自带项目级 Claude Code skill:[`.claude/skills/agent/`](../.claude/skills/agent/)
 
 
 - `SKILL.md` — skill 元数据(description 给 Claude Code 路由用)
 - `SKILL.md` — skill 元数据(description 给 Claude Code 路由用)
-- `invoke.py` — 20 行薄脚本,`from agent import invoke_agent` 然后透传命令行参数
+- `invoke.py` — 20 行薄脚本,`from cyber_agent import invoke_agent` 然后透传命令行参数
 
 
 ### 在本仓库使用(自动激活)
 ### 在本仓库使用(自动激活)
 
 
@@ -234,10 +234,10 @@ ln -s "$(pwd)/.claude/skills/agent" ~/.claude/skills/agent
 
 
 ### SDK 入口
 ### SDK 入口
 
 
-Claude Code skill 脚本最终调用 `agent/client.py::invoke_agent`,该函数也是公开 SDK 供任何 Python 代码复用:
+Claude Code skill 脚本最终调用 `cyber_agent/client.py::invoke_agent`,该函数也是公开 SDK 供任何 Python 代码复用:
 
 
 ```python
 ```python
-from agent import invoke_agent
+from cyber_agent import invoke_agent
 
 
 # 远端:查询知识库
 # 远端:查询知识库
 result = await invoke_agent(
 result = await invoke_agent(
@@ -256,7 +256,7 @@ result = await invoke_agent(
 
 
 路由规则:`agent_type.startswith("remote_")` → HTTP 调用 KnowHub `/api/agent`;否则在当前进程起 `AgentRunner`。
 路由规则:`agent_type.startswith("remote_")` → HTTP 调用 KnowHub `/api/agent`;否则在当前进程起 `AgentRunner`。
 
 
-**实现**:`agent/client.py:invoke_agent` / `.claude/skills/agent/invoke.py`
+**实现**:`cyber_agent/client.py:invoke_agent` / `.claude/skills/agent/invoke.py`
 
 
 ---
 ---
 
 

+ 10 - 10
agent/__init__.py → cyber_agent/__init__.py

@@ -11,24 +11,24 @@ Reson Agent - 模块化、可扩展的 Agent 框架
 """
 """
 
 
 # 核心引擎
 # 核心引擎
-from agent.core.runner import AgentRunner, CallResult, RunConfig
-from agent.core.presets import AgentPreset, AGENT_PRESETS, get_preset
+from cyber_agent.core.runner import AgentRunner, CallResult, RunConfig
+from cyber_agent.core.presets import AgentPreset, AGENT_PRESETS, get_preset
 
 
 # 执行追踪
 # 执行追踪
-from agent.trace.models import Trace, Message, Step, StepType, StepStatus, ChatMessage, Messages, MessageContent
-from agent.trace.goal_models import Goal, GoalTree, GoalStatus
-from agent.trace.protocols import TraceStore
-from agent.trace.store import FileSystemTraceStore
+from cyber_agent.trace.models import Trace, Message, Step, StepType, StepStatus, ChatMessage, Messages, MessageContent
+from cyber_agent.trace.goal_models import Goal, GoalTree, GoalStatus
+from cyber_agent.trace.protocols import TraceStore
+from cyber_agent.trace.store import FileSystemTraceStore
 
 
 # 技能系统
 # 技能系统
-from agent.skill.models import Skill
+from cyber_agent.skill.models import Skill
 
 
 # 工具系统
 # 工具系统
-from agent.tools import tool, ToolRegistry, get_tool_registry
-from agent.tools.models import ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolRegistry, get_tool_registry
+from cyber_agent.tools.models import ToolResult, ToolContext
 
 
 # SDK 公开入口:统一调用 remote / 本地 Agent
 # SDK 公开入口:统一调用 remote / 本地 Agent
-from agent.client import invoke_agent
+from cyber_agent.client import invoke_agent
 
 
 __version__ = "0.3.0"
 __version__ = "0.3.0"
 
 

+ 0 - 0
agent/cli/__init__.py → cyber_agent/cli/__init__.py


+ 10 - 10
agent/cli/extraction_review.py → cyber_agent/cli/extraction_review.py

@@ -6,23 +6,23 @@
 反思侧分支产出的知识条目默认写为 cognition_log: type="extraction_pending",
 反思侧分支产出的知识条目默认写为 cognition_log: type="extraction_pending",
 不会直接上传到 KnowHub。本 CLI 提供人工审核 + 批量提交入口。
 不会直接上传到 KnowHub。本 CLI 提供人工审核 + 批量提交入口。
 
 
-两种入口(共享同一核心逻辑,见 agent/trace/extraction_review.py):
-- 独立脚本:python -m agent.cli.extraction_review --trace <TRACE_ID> [--list|--review|--commit]
-- interactive.py 菜单项 8/9(见 agent/cli/interactive.py)
+两种入口(共享同一核心逻辑,见 cyber_agent/trace/extraction_review.py):
+- 独立脚本:python -m cyber_agent.cli.extraction_review --trace <TRACE_ID> [--list|--review|--commit]
+- interactive.py 菜单项 8/9(见 cyber_agent/cli/interactive.py)
 
 
 用法示例
 用法示例
 --------
 --------
 # 查看当前 trace 的所有未审核条目
 # 查看当前 trace 的所有未审核条目
-python -m agent.cli.extraction_review --trace abc-123 --list
+python -m cyber_agent.cli.extraction_review --trace abc-123 --list
 
 
 # 交互式逐条审核
 # 交互式逐条审核
-python -m agent.cli.extraction_review --trace abc-123 --review
+python -m cyber_agent.cli.extraction_review --trace abc-123 --review
 
 
 # 把已 approved 的条目批量提交到 KnowHub
 # 把已 approved 的条目批量提交到 KnowHub
-python -m agent.cli.extraction_review --trace abc-123 --commit
+python -m cyber_agent.cli.extraction_review --trace abc-123 --commit
 
 
 # 一条龙:review 完直接 commit
 # 一条龙:review 完直接 commit
-python -m agent.cli.extraction_review --trace abc-123
+python -m cyber_agent.cli.extraction_review --trace abc-123
 """
 """
 
 
 from __future__ import annotations
 from __future__ import annotations
@@ -34,8 +34,8 @@ import sys
 from pathlib import Path
 from pathlib import Path
 from typing import List, Optional
 from typing import List, Optional
 
 
-from agent.trace.store import FileSystemTraceStore
-from agent.trace.extraction_review import (
+from cyber_agent.trace.store import FileSystemTraceStore
+from cyber_agent.trace.extraction_review import (
     PendingExtraction,
     PendingExtraction,
     CommitReport,
     CommitReport,
     list_pending,
     list_pending,
@@ -220,7 +220,7 @@ async def cmd_commit(store: FileSystemTraceStore, trace_id: str) -> int:
 
 
 def build_parser() -> argparse.ArgumentParser:
 def build_parser() -> argparse.ArgumentParser:
     p = argparse.ArgumentParser(
     p = argparse.ArgumentParser(
-        prog="python -m agent.cli.extraction_review",
+        prog="python -m cyber_agent.cli.extraction_review",
         description="审核并提交反思侧分支暂存的待审核知识条目。",
         description="审核并提交反思侧分支暂存的待审核知识条目。",
     )
     )
     p.add_argument("--trace", required=True, help="Trace ID")
     p.add_argument("--trace", required=True, help="Trace ID")

+ 7 - 7
agent/cli/interactive.py → cyber_agent/cli/interactive.py

@@ -9,9 +9,9 @@ import asyncio
 from typing import Optional, Dict, Any
 from typing import Optional, Dict, Any
 from pathlib import Path
 from pathlib import Path
 
 
-from agent.core.runner import AgentRunner
-from agent.trace import TraceStore
-from agent.trace.models import Message, Trace
+from cyber_agent.core.runner import AgentRunner
+from cyber_agent.trace import TraceStore
+from cyber_agent.trace.models import Message, Trace
 
 
 
 
 # ===== 非阻塞 stdin 检测 =====
 # ===== 非阻塞 stdin 检测 =====
@@ -240,14 +240,14 @@ class InteractiveController:
                 return {"action": "stop"}
                 return {"action": "stop"}
 
 
             elif choice == "8":
             elif choice == "8":
-                # 审核待提交知识(复用 agent/cli/extraction_review.py 的交互式 review)
-                from agent.cli.extraction_review import cmd_review
+                # 审核待提交知识(复用 cyber_agent/cli/extraction_review.py 的交互式 review)
+                from cyber_agent.cli.extraction_review import cmd_review
                 await cmd_review(self.store, trace_id)
                 await cmd_review(self.store, trace_id)
                 continue
                 continue
 
 
             elif choice == "9":
             elif choice == "9":
                 # 提交已审核知识到 KnowHub
                 # 提交已审核知识到 KnowHub
-                from agent.cli.extraction_review import cmd_commit
+                from cyber_agent.cli.extraction_review import cmd_commit
                 await cmd_commit(self.store, trace_id)
                 await cmd_commit(self.store, trace_id)
                 continue
                 continue
 
 
@@ -416,7 +416,7 @@ class InteractiveController:
                 after_seq = selected_msg.parent_sequence or (selected_msg.sequence - 1)
                 after_seq = selected_msg.parent_sequence or (selected_msg.sequence - 1)
 
 
             # 导入 RunConfig
             # 导入 RunConfig
-            from agent.core.runner import RunConfig
+            from cyber_agent.core.runner import RunConfig
 
 
             # 构建运行配置
             # 构建运行配置
             config = RunConfig(
             config = RunConfig(

+ 10 - 10
agent/client.py → cyber_agent/client.py

@@ -4,7 +4,7 @@ Agent SDK 入口 —— 统一调用 remote / 本地 Agent 的公开 API。
 使用方式(任何进程,只要装了 cyber-agent 包):
 使用方式(任何进程,只要装了 cyber-agent 包):
 
 
     import asyncio
     import asyncio
-    from agent import invoke_agent
+    from cyber_agent import invoke_agent
 
 
     # 远端(HTTP 调用 KnowHub 服务器)
     # 远端(HTTP 调用 KnowHub 服务器)
     result = asyncio.run(invoke_agent(
     result = asyncio.run(invoke_agent(
@@ -20,8 +20,8 @@ Agent SDK 入口 —— 统一调用 remote / 本地 Agent 的公开 API。
         project_root="./examples/production_plan",
         project_root="./examples/production_plan",
     ))
     ))
 
 
-skill 脚本只需要 `from agent import invoke_agent` 然后透传命令行参数即可——
-不依赖仓库相对路径,也不会触发 `agent.tools.builtin` 的 eager tool registry 加载。
+skill 脚本只需要 `from cyber_agent import invoke_agent` 然后透传命令行参数即可——
+不依赖仓库相对路径,也不会触发 `cyber_agent.tools.builtin` 的 eager tool registry 加载。
 """
 """
 
 
 import importlib
 import importlib
@@ -44,7 +44,7 @@ def _load_default_env() -> None:
         return
         return
     # 先试 cwd 向上查找
     # 先试 cwd 向上查找
     load_dotenv()
     load_dotenv()
-    # 再试 cyber-agent 仓库根(编辑安装时 agent/__init__.py 所在仓库的 .env)
+    # 再试 cyber-agent 仓库根(编辑安装时 cyber_agent/__init__.py 所在仓库的 .env)
     repo_env = Path(__file__).resolve().parent.parent / ".env"
     repo_env = Path(__file__).resolve().parent.parent / ".env"
     if repo_env.exists():
     if repo_env.exists():
         load_dotenv(repo_env, override=False)
         load_dotenv(repo_env, override=False)
@@ -77,7 +77,7 @@ async def invoke_agent(
     """
     """
     if agent_type.startswith("remote_"):
     if agent_type.startswith("remote_"):
         # 懒 import,避免加载整个 tool registry(远端调用只需要 httpx)
         # 懒 import,避免加载整个 tool registry(远端调用只需要 httpx)
-        from agent.tools.builtin.subagent import _run_remote_agent
+        from cyber_agent.tools.builtin.subagent import _run_remote_agent
         return await _run_remote_agent(
         return await _run_remote_agent(
             agent_type=agent_type,
             agent_type=agent_type,
             task=task,
             task=task,
@@ -135,7 +135,7 @@ async def _run_local_agent(
     # 2. 加载 .env:依次查项目根、两级父目录(兼容 monorepo)、cyber-agent 仓库根
     # 2. 加载 .env:依次查项目根、两级父目录(兼容 monorepo)、cyber-agent 仓库根
     try:
     try:
         from dotenv import load_dotenv
         from dotenv import load_dotenv
-        import agent as _agent_pkg
+        import cyber_agent as _agent_pkg
         agent_repo_root = Path(_agent_pkg.__file__).parent.parent
         agent_repo_root = Path(_agent_pkg.__file__).parent.parent
         for candidate in (
         for candidate in (
             root / ".env",
             root / ".env",
@@ -179,7 +179,7 @@ async def _run_local_agent(
     presets_path = root / "presets.json"
     presets_path = root / "presets.json"
     if presets_path.exists():
     if presets_path.exists():
         try:
         try:
-            from agent.core.presets import load_presets_from_json
+            from cyber_agent.core.presets import load_presets_from_json
             load_presets_from_json(str(presets_path))
             load_presets_from_json(str(presets_path))
         except Exception as e:
         except Exception as e:
             logger.warning(f"加载 presets.json 失败: {e}")
             logger.warning(f"加载 presets.json 失败: {e}")
@@ -192,9 +192,9 @@ async def _run_local_agent(
             logger.warning(f"加载 tools 包失败: {e}")
             logger.warning(f"加载 tools 包失败: {e}")
 
 
     # 6. 创建 AgentRunner
     # 6. 创建 AgentRunner
-    from agent.core.runner import AgentRunner
-    from agent.trace import FileSystemTraceStore
-    from agent.llm import create_qwen_llm_call
+    from cyber_agent.core.runner import AgentRunner
+    from cyber_agent.trace import FileSystemTraceStore
+    from cyber_agent.llm import create_qwen_llm_call
 
 
     trace_store_path = getattr(cfg_mod, "TRACE_STORE_PATH", ".trace")
     trace_store_path = getattr(cfg_mod, "TRACE_STORE_PATH", ".trace")
     skills_dir = getattr(cfg_mod, "SKILLS_DIR", "./skills")
     skills_dir = getattr(cfg_mod, "SKILLS_DIR", "./skills")

+ 2 - 2
agent/core/__init__.py → cyber_agent/core/__init__.py

@@ -7,8 +7,8 @@ Agent Core - 核心引擎模块
 3. Agent 预设(AgentPreset)
 3. Agent 预设(AgentPreset)
 """
 """
 
 
-from agent.core.runner import AgentRunner, CallResult, RunConfig
-from agent.core.presets import (
+from cyber_agent.core.runner import AgentRunner, CallResult, RunConfig
+from cyber_agent.core.presets import (
     AgentPreset,
     AgentPreset,
     AGENT_PRESETS,
     AGENT_PRESETS,
     get_preset,
     get_preset,

+ 3 - 3
agent/core/dream.py → cyber_agent/core/dream.py

@@ -20,9 +20,9 @@ from datetime import datetime
 from pathlib import Path
 from pathlib import Path
 from typing import Any, Awaitable, Callable, Dict, List, Optional, Tuple
 from typing import Any, Awaitable, Callable, Dict, List, Optional, Tuple
 
 
-from agent.core.memory import MemoryConfig, load_memory_files, format_memory_injection
-from agent.trace.models import Trace
-from agent.trace.store import FileSystemTraceStore
+from cyber_agent.core.memory import MemoryConfig, load_memory_files, format_memory_injection
+from cyber_agent.trace.models import Trace
+from cyber_agent.trace.store import FileSystemTraceStore
 
 
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 
 

+ 3 - 3
agent/core/memory.py → cyber_agent/core/memory.py

@@ -1,12 +1,12 @@
 """
 """
 Memory 系统(Phase 2+)
 Memory 系统(Phase 2+)
 
 
-详见 agent/docs/memory.md。核心概念:
+详见 cyber_agent/docs/memory.md。核心概念:
 - Memory:Agent 身份私有的主观记忆,Markdown 文件,人类可读写
 - Memory:Agent 身份私有的主观记忆,Markdown 文件,人类可读写
 - Dream:记忆反思操作(回顾多个 trace 的执行历史,更新记忆文件)
 - Dream:记忆反思操作(回顾多个 trace 的执行历史,更新记忆文件)
 
 
 本模块只提供 MemoryConfig 数据类和记忆文件加载逻辑。
 本模块只提供 MemoryConfig 数据类和记忆文件加载逻辑。
-Dream 操作在 agent/core/dream.py(Phase 3)。
+Dream 操作在 cyber_agent/core/dream.py(Phase 3)。
 """
 """
 
 
 from __future__ import annotations
 from __future__ import annotations
@@ -22,7 +22,7 @@ logger = logging.getLogger(__name__)
 
 
 @dataclass
 @dataclass
 class MemoryConfig:
 class MemoryConfig:
-    """持久化记忆配置(见 agent/docs/memory.md 第五节)"""
+    """持久化记忆配置(见 cyber_agent/docs/memory.md 第五节)"""
 
 
     base_path: str = ""
     base_path: str = ""
     # 记忆文件根目录。所有文件路径相对此目录解析。
     # 记忆文件根目录。所有文件路径相对此目录解析。

+ 1 - 1
agent/core/presets.py → cyber_agent/core/presets.py

@@ -89,7 +89,7 @@ def load_system_prompt_from_file(path: str) -> str:
         FileNotFoundError: 文件不存在
         FileNotFoundError: 文件不存在
         ValueError: 文件格式错误或缺少 $system$ 分节
         ValueError: 文件格式错误或缺少 $system$ 分节
     """
     """
-    from agent.llm.prompts import load_prompt
+    from cyber_agent.llm.prompts import load_prompt
 
 
     prompt_path = Path(path)
     prompt_path = Path(path)
     if not prompt_path.is_absolute():
     if not prompt_path.is_absolute():

+ 4 - 4
agent/core/prompts/__init__.py → cyber_agent/core/prompts/__init__.py

@@ -1,5 +1,5 @@
 """
 """
-agent.core.prompts - Agent 系统 Prompt 集中管理
+cyber_agent.core.prompts - Agent 系统 Prompt 集中管理
 
 
 子模块:
 子模块:
 - runner.py     系统提示、工具中断、任务命名、经验格式
 - runner.py     系统提示、工具中断、任务命名、经验格式
@@ -8,7 +8,7 @@ agent.core.prompts - Agent 系统 Prompt 集中管理
 - subagent.py   子 Agent 评估、结果格式化、知识管理
 - subagent.py   子 Agent 评估、结果格式化、知识管理
 """
 """
 
 
-from agent.core.prompts.runner import (
+from cyber_agent.core.prompts.runner import (
     DEFAULT_SYSTEM_PREFIX,
     DEFAULT_SYSTEM_PREFIX,
     TRUNCATION_HINT,
     TRUNCATION_HINT,
     TOOL_INTERRUPTED_MESSAGE,
     TOOL_INTERRUPTED_MESSAGE,
@@ -20,13 +20,13 @@ from agent.core.prompts.runner import (
     build_agent_continue_hint,
     build_agent_continue_hint,
 )
 )
 
 
-from agent.core.prompts.knowledge import (
+from cyber_agent.core.prompts.knowledge import (
     REFLECT_PROMPT,
     REFLECT_PROMPT,
     COMPLETION_REFLECT_PROMPT,
     COMPLETION_REFLECT_PROMPT,
     build_reflect_prompt,
     build_reflect_prompt,
 )
 )
 
 
-from agent.core.prompts.compression import (
+from cyber_agent.core.prompts.compression import (
     COMPRESSION_PROMPT_TEMPLATE,
     COMPRESSION_PROMPT_TEMPLATE,
     COMPRESSION_EVAL_PROMPT_TEMPLATE,
     COMPRESSION_EVAL_PROMPT_TEMPLATE,
     SUMMARY_HEADER_TEMPLATE,
     SUMMARY_HEADER_TEMPLATE,

+ 0 - 0
agent/core/prompts/compression.py → cyber_agent/core/prompts/compression.py


+ 1 - 1
agent/core/prompts/knowledge.py → cyber_agent/core/prompts/knowledge.py

@@ -10,7 +10,7 @@
 
 
 "pending" 语义:条目落到 cognition_log 的 extraction_pending 事件,
 "pending" 语义:条目落到 cognition_log 的 extraction_pending 事件,
 等待人工(或 reflect_auto_commit=True 时由框架自动)review + commit 才进入 KnowHub。
 等待人工(或 reflect_auto_commit=True 时由框架自动)review + commit 才进入 KnowHub。
-详见 agent/docs/memory.md 第三节"提取-审核-提交两阶段"。
+详见 cyber_agent/docs/memory.md 第三节"提取-审核-提交两阶段"。
 """
 """
 
 
 # ===== 压缩时阶段性反思 =====
 # ===== 压缩时阶段性反思 =====

+ 0 - 0
agent/core/prompts/runner.py → cyber_agent/core/prompts/runner.py


+ 25 - 25
agent/core/runner.py → cyber_agent/core/runner.py

@@ -23,22 +23,22 @@ from dataclasses import dataclass, field
 from datetime import datetime
 from datetime import datetime
 from typing import AsyncIterator, Optional, Dict, Any, List, Callable, Literal, Tuple, Union
 from typing import AsyncIterator, Optional, Dict, Any, List, Callable, Literal, Tuple, Union
 
 
-from agent.trace.models import Trace, Message
-from agent.trace.protocols import TraceStore
-from agent.trace.goal_models import GoalTree
-from agent.trace.compaction import (
+from cyber_agent.trace.models import Trace, Message
+from cyber_agent.trace.protocols import TraceStore
+from cyber_agent.trace.goal_models import GoalTree
+from cyber_agent.trace.compaction import (
     CompressionConfig,
     CompressionConfig,
     compress_completed_goals,
     compress_completed_goals,
     estimate_tokens,
     estimate_tokens,
     needs_level2_compression,
     needs_level2_compression,
     build_compression_prompt,
     build_compression_prompt,
 )
 )
-from agent.skill.models import Skill
-from agent.skill.skill_loader import load_skills_from_dir
-from agent.tools import ToolRegistry, get_tool_registry
-from agent.tools.builtin.knowledge import KnowledgeConfig
-from agent.core.memory import MemoryConfig
-from agent.core.prompts import (
+from cyber_agent.skill.models import Skill
+from cyber_agent.skill.skill_loader import load_skills_from_dir
+from cyber_agent.tools import ToolRegistry, get_tool_registry
+from cyber_agent.tools.builtin.knowledge import KnowledgeConfig
+from cyber_agent.core.memory import MemoryConfig
+from cyber_agent.core.prompts import (
     DEFAULT_SYSTEM_PREFIX,
     DEFAULT_SYSTEM_PREFIX,
     TRUNCATION_HINT,
     TRUNCATION_HINT,
     TOOL_INTERRUPTED_MESSAGE,
     TOOL_INTERRUPTED_MESSAGE,
@@ -143,7 +143,7 @@ class RunConfig:
     enable_research_flow: bool = True  # 是否启用自动研究流程(知识检索→经验检索→调研→计划)
     enable_research_flow: bool = True  # 是否启用自动研究流程(知识检索→经验检索→调研→计划)
     # --- 知识管理配置 ---
     # --- 知识管理配置 ---
     knowledge: KnowledgeConfig = field(default_factory=KnowledgeConfig)
     knowledge: KnowledgeConfig = field(default_factory=KnowledgeConfig)
-    # --- Memory 配置(见 agent/docs/memory.md) ---
+    # --- Memory 配置(见 cyber_agent/docs/memory.md) ---
     # None = 默认 Agent(无长期记忆);赋值 MemoryConfig 使该 Agent 成为 memory-bearing Agent
     # None = 默认 Agent(无长期记忆);赋值 MemoryConfig 使该 Agent 成为 memory-bearing Agent
     memory: Optional["MemoryConfig"] = None
     memory: Optional["MemoryConfig"] = None
 
 
@@ -251,7 +251,7 @@ class AgentRunner:
             reflect_model: per-trace 反思模型
             reflect_model: per-trace 反思模型
             dream_model: 跨 trace 整合模型
             dream_model: 跨 trace 整合模型
         """
         """
-        from agent.core.dream import run_dream
+        from cyber_agent.core.dream import run_dream
         if not self.trace_store or not self.llm_call:
         if not self.trace_store or not self.llm_call:
             raise RuntimeError("dream 需要 trace_store 和 llm_call 均已配置")
             raise RuntimeError("dream 需要 trace_store 和 llm_call 均已配置")
         return await run_dream(
         return await run_dream(
@@ -586,7 +586,7 @@ class AgentRunner:
         trace_obj.status = "running"
         trace_obj.status = "running"
         # 广播状态变化给前端
         # 广播状态变化给前端
         try:
         try:
-            from agent.trace.websocket import broadcast_trace_status_changed
+            from cyber_agent.trace.websocket import broadcast_trace_status_changed
             await broadcast_trace_status_changed(config.trace_id, "running")
             await broadcast_trace_status_changed(config.trace_id, "running")
         except Exception:
         except Exception:
             pass
             pass
@@ -930,7 +930,7 @@ class AgentRunner:
         self.log.info("执行单次 LLM 压缩")
         self.log.info("执行单次 LLM 压缩")
 
 
         # 构建压缩 prompt(使用 SINGLE_TURN_PROMPT)
         # 构建压缩 prompt(使用 SINGLE_TURN_PROMPT)
-        from agent.core.prompts import build_single_turn_prompt
+        from cyber_agent.core.prompts import build_single_turn_prompt
         goal_prompt = goal_tree.to_prompt(include_summary=True) if goal_tree else ""
         goal_prompt = goal_tree.to_prompt(include_summary=True) if goal_tree else ""
         compress_prompt = build_single_turn_prompt(goal_prompt)
         compress_prompt = build_single_turn_prompt(goal_prompt)
         compress_messages = list(history) + [
         compress_messages = list(history) + [
@@ -1117,7 +1117,7 @@ class AgentRunner:
                     )
                     )
                     # 广播状态变化给前端
                     # 广播状态变化给前端
                     try:
                     try:
-                        from agent.trace.websocket import broadcast_trace_status_changed
+                        from cyber_agent.trace.websocket import broadcast_trace_status_changed
                         await broadcast_trace_status_changed(trace_id, "stopped")
                         await broadcast_trace_status_changed(trace_id, "stopped")
                     except Exception:
                     except Exception:
                         pass
                         pass
@@ -1221,7 +1221,7 @@ class AgentRunner:
                 elif branch_type == "knowledge_eval":
                 elif branch_type == "knowledge_eval":
                     prompt = await self._build_knowledge_eval_prompt(trace_id, goal_tree)
                     prompt = await self._build_knowledge_eval_prompt(trace_id, goal_tree)
                 else:  # compression
                 else:  # compression
-                    from agent.trace.compaction import build_compression_prompt
+                    from cyber_agent.trace.compaction import build_compression_prompt
                     prompt = build_compression_prompt(goal_tree)
                     prompt = build_compression_prompt(goal_tree)
 
 
                 branch_user_msg = Message.create(
                 branch_user_msg = Message.create(
@@ -1479,7 +1479,7 @@ class AgentRunner:
                         summary_text = summary_text.replace(
                         summary_text = summary_text.replace(
                             "**生成摘要后立即停止,不要继续执行原有任务。**", ""
                             "**生成摘要后立即停止,不要继续执行原有任务。**", ""
                         ).strip()
                         ).strip()
-                        from agent.core.prompts import build_summary_header
+                        from cyber_agent.core.prompts import build_summary_header
                         summary_content = build_summary_header(summary_text)
                         summary_content = build_summary_header(summary_text)
 
 
                         if goal_tree and goal_tree.goals:
                         if goal_tree and goal_tree.goals:
@@ -1541,7 +1541,7 @@ class AgentRunner:
                         and getattr(config.knowledge, "reflect_auto_commit", False)
                         and getattr(config.knowledge, "reflect_auto_commit", False)
                     ):
                     ):
                         try:
                         try:
-                            from agent.trace.extraction_review import auto_commit_branch
+                            from cyber_agent.trace.extraction_review import auto_commit_branch
                             report = await auto_commit_branch(
                             report = await auto_commit_branch(
                                 self.trace_store,
                                 self.trace_store,
                                 trace_id,
                                 trace_id,
@@ -1659,7 +1659,7 @@ class AgentRunner:
                                 trigger_event_for_tool = current_trace.context.get("active_side_branch", {}).get("trigger_event", "unknown")
                                 trigger_event_for_tool = current_trace.context.get("active_side_branch", {}).get("trigger_event", "unknown")
                         if tool_name in ("toolhub_call", "toolhub_search", "toolhub_health"):
                         if tool_name in ("toolhub_call", "toolhub_search", "toolhub_health"):
                             try:
                             try:
-                                from agent.tools.builtin.toolhub import set_trace_context
+                                from cyber_agent.tools.builtin.toolhub import set_trace_context
                                 set_trace_context(trace_id)
                                 set_trace_context(trace_id)
                             except ImportError:
                             except ImportError:
                                 pass
                                 pass
@@ -1781,7 +1781,7 @@ class AgentRunner:
                         # 设置 trace_id 上下文供 toolhub 使用(图片保存到 outputs/{trace_id}/)
                         # 设置 trace_id 上下文供 toolhub 使用(图片保存到 outputs/{trace_id}/)
                         if tool_name in ("toolhub_call", "toolhub_search", "toolhub_health"):
                         if tool_name in ("toolhub_call", "toolhub_search", "toolhub_health"):
                             try:
                             try:
-                                from agent.tools.builtin.toolhub import set_trace_context
+                                from cyber_agent.tools.builtin.toolhub import set_trace_context
                                 set_trace_context(trace_id)
                                 set_trace_context(trace_id)
                             except ImportError:
                             except ImportError:
                                 pass
                                 pass
@@ -2403,7 +2403,7 @@ class AgentRunner:
             if contact_id and chat_id:
             if contact_id and chat_id:
                 # 尝试导入 IM 模块并检查通知
                 # 尝试导入 IM 模块并检查通知
                 try:
                 try:
-                    from agent.tools.builtin.im import chat as im_chat
+                    from cyber_agent.tools.builtin.im import chat as im_chat
                     notification = im_chat._notifications.get((contact_id, chat_id))
                     notification = im_chat._notifications.get((contact_id, chat_id))
                     if notification:
                     if notification:
                         count = notification.get("count", 0)
                         count = notification.get("count", 0)
@@ -3005,7 +3005,7 @@ class AgentRunner:
         return self.tools.get_schemas(list(tool_names))
         return self.tools.get_schemas(list(tool_names))
 
 
     # 默认 system prompt 前缀(当 config.system_prompt 和前端都未提供 system message 时使用)
     # 默认 system prompt 前缀(当 config.system_prompt 和前端都未提供 system message 时使用)
-    # 注意:此常量已迁移到 agent.core.prompts,这里保留引用以保持向后兼容
+    # 注意:此常量已迁移到 cyber_agent.core.prompts,这里保留引用以保持向后兼容
 
 
     async def _build_system_prompt(self, config: RunConfig, base_prompt: Optional[str] = None) -> Optional[str]:
     async def _build_system_prompt(self, config: RunConfig, base_prompt: Optional[str] = None) -> Optional[str]:
         """构建 system prompt(注入 skills)
         """构建 system prompt(注入 skills)
@@ -3025,7 +3025,7 @@ class AgentRunner:
             base_prompt: 已有 system 内容(来自消息),
             base_prompt: 已有 system 内容(来自消息),
                          None 时使用 config.system_prompt 或 preset.system_prompt
                          None 时使用 config.system_prompt 或 preset.system_prompt
         """
         """
-        from agent.core.presets import AGENT_PRESETS
+        from cyber_agent.core.presets import AGENT_PRESETS
 
 
         # 确定 system_prompt 来源
         # 确定 system_prompt 来源
         if base_prompt is not None:
         if base_prompt is not None:
@@ -3064,12 +3064,12 @@ class AgentRunner:
         if config.max_iterations and config.max_iterations > 0:
         if config.max_iterations and config.max_iterations > 0:
             system_prompt += f"\n\n## Execution Constraint\n这是一项有严格步数限制的任务。你最多可以用 {config.max_iterations} 轮交互来解决问题。\n请务必【边查边写、随时存档】!每当你收集或得出一个有价值的独立结果(如收集到一个独立 Case),请立刻调用工具写入或追加到结果文件中,绝对不要等到所有任务都做完再最后一次性输出。这样即使触达步数上限被强制打断,你已经收集的成果也能安全保留!"
             system_prompt += f"\n\n## Execution Constraint\n这是一项有严格步数限制的任务。你最多可以用 {config.max_iterations} 轮交互来解决问题。\n请务必【边查边写、随时存档】!每当你收集或得出一个有价值的独立结果(如收集到一个独立 Case),请立刻调用工具写入或追加到结果文件中,绝对不要等到所有任务都做完再最后一次性输出。这样即使触达步数上限被强制打断,你已经收集的成果也能安全保留!"
         # Memory 注入(memory-bearing Agent)——在 system prompt 末尾追加
         # Memory 注入(memory-bearing Agent)——在 system prompt 末尾追加
-        # 初版选择 system prompt 追加(见 agent/docs/memory.md 待定问题 1)。
+        # 初版选择 system prompt 追加(见 cyber_agent/docs/memory.md 待定问题 1)。
         # 好处:run 启动一次性注入、所有后续轮次都能看到、与 skills 注入方式一致。
         # 好处:run 启动一次性注入、所有后续轮次都能看到、与 skills 注入方式一致。
         # 代价:若记忆文件很大会持续占 prompt tokens —— 待观察后决定是否切换方案。
         # 代价:若记忆文件很大会持续占 prompt tokens —— 待观察后决定是否切换方案。
         if config.memory:
         if config.memory:
             try:
             try:
-                from agent.core.memory import load_memory_files, format_memory_injection
+                from cyber_agent.core.memory import load_memory_files, format_memory_injection
                 files = load_memory_files(config.memory)
                 files = load_memory_files(config.memory)
                 memory_text = format_memory_injection(files)
                 memory_text = format_memory_injection(files)
                 if memory_text:
                 if memory_text:

+ 39 - 39
agent/docs/architecture.md → cyber_agent/docs/architecture.md

@@ -134,7 +134,7 @@ agent/
 
 
 跨 Provider 续跑时,出方向转换前检测历史中的 tool_call_id 格式,不兼容时统一重写为目标格式(保持 tool_use / tool_result 配对一致)。同格式跳过,零开销。Gemini 按 function name 匹配,无需重写。
 跨 Provider 续跑时,出方向转换前检测历史中的 tool_call_id 格式,不兼容时统一重写为目标格式(保持 tool_use / tool_result 配对一致)。同格式跳过,零开销。Gemini 按 function name 匹配,无需重写。
 
 
-**实现**:`agent/llm/openrouter.py:_normalize_tool_call_ids`, `agent/llm/yescode.py:_normalize_tool_call_ids`
+**实现**:`cyber_agent/llm/openrouter.py:_normalize_tool_call_ids`, `cyber_agent/llm/yescode.py:_normalize_tool_call_ids`
 
 
 ---
 ---
 
 
@@ -183,7 +183,7 @@ class RunConfig:
     after_sequence: Optional[int] = None       # 从哪条消息后续跑(message sequence)
     after_sequence: Optional[int] = None       # 从哪条消息后续跑(message sequence)
 ```
 ```
 
 
-**实现**:`agent/core/runner.py:RunConfig`
+**实现**:`cyber_agent/core/runner.py:RunConfig`
 
 
 ### 三种运行模式
 ### 三种运行模式
 
 
@@ -233,7 +233,7 @@ async def run(messages: List[Dict], config: RunConfig = None) -> AsyncIterator[U
     yield trace
     yield trace
 ```
 ```
 
 
-**实现**:`agent/core/runner.py:AgentRunner`
+**实现**:`cyber_agent/core/runner.py:AgentRunner`
 
 
 ### 回溯(Rewind)
 ### 回溯(Rewind)
 
 
@@ -304,7 +304,7 @@ await runner.stop(trace_id)
 
 
 agent 工具的合成结果对齐正常返回值格式(含 `sub_trace_id` 字段),主 Agent 可直接使用 `agent(task=..., continue_from=sub_trace_id)` 续跑被中断的子 Agent。合成消息持久化存储,确保幂等。
 agent 工具的合成结果对齐正常返回值格式(含 `sub_trace_id` 字段),主 Agent 可直接使用 `agent(task=..., continue_from=sub_trace_id)` 续跑被中断的子 Agent。合成消息持久化存储,确保幂等。
 
 
-**实现**:`agent/core/runner.py:AgentRunner._heal_orphaned_tool_calls`
+**实现**:`cyber_agent/core/runner.py:AgentRunner._heal_orphaned_tool_calls`
 
 
 - `run(messages, config)`:**核心方法**,流式返回 `AsyncIterator[Union[Trace, Message]]`
 - `run(messages, config)`:**核心方法**,流式返回 `AsyncIterator[Union[Trace, Message]]`
 - `run_result(messages, config, on_event=None)`:便利方法,内部消费 `run()`,返回结构化结果。`on_event` 回调可实时接收每个 Trace/Message 事件(用于调试时输出子 Agent 执行过程)。主要用于 `agent`/`evaluate` 工具内部
 - `run_result(messages, config, on_event=None)`:便利方法,内部消费 `run()`,返回结构化结果。`on_event` 回调可实时接收每个 Trace/Message 事件(用于调试时输出子 Agent 执行过程)。主要用于 `agent`/`evaluate` 工具内部
@@ -321,7 +321,7 @@ agent 工具的合成结果对齐正常返回值格式(含 `sub_trace_id` 字
 | GET  | `/api/traces/running`       | 列出正在运行的 Trace                       |
 | GET  | `/api/traces/running`       | 列出正在运行的 Trace                       |
 | WS   | `/api/traces/{id}/watch`    | 实时事件推送                               |
 | WS   | `/api/traces/{id}/watch`    | 实时事件推送                               |
 
 
-**实现**:`agent/trace/api.py`, `agent/trace/websocket.py`
+**实现**:`cyber_agent/trace/api.py`, `cyber_agent/trace/websocket.py`
 
 
 #### 控制端点
 #### 控制端点
 
 
@@ -366,7 +366,7 @@ curl -X POST http://localhost:8000/api/traces/{trace_id}/compact
 
 
 响应立即返回 `{"trace_id": "...", "status": "started"}`,通过 `WS /api/traces/{trace_id}/watch` 监听实时事件。
 响应立即返回 `{"trace_id": "...", "status": "started"}`,通过 `WS /api/traces/{trace_id}/watch` 监听实时事件。
 
 
-**实现**:`agent/trace/run_api.py`
+**实现**:`cyber_agent/trace/run_api.py`
 
 
 ---
 ---
 
 
@@ -428,7 +428,7 @@ class Trace:
     completed_at: Optional[datetime] = None
     completed_at: Optional[datetime] = None
 ```
 ```
 
 
-**实现**:`agent/trace/models.py`
+**实现**:`cyber_agent/trace/models.py`
 
 
 ### Goal(目标节点)
 ### Goal(目标节点)
 
 
@@ -479,7 +479,7 @@ class Goal:
 - `done` - 完成当前目标(附带 summary)
 - `done` - 完成当前目标(附带 summary)
 - `abandon` - 放弃当前目标(附带原因)
 - `abandon` - 放弃当前目标(附带原因)
 
 
-**实现**:`agent/trace/goal_models.py`, `agent/trace/goal_tool.py`
+**实现**:`cyber_agent/trace/goal_models.py`, `cyber_agent/trace/goal_tool.py`
 
 
 ### Message(执行消息)
 ### Message(执行消息)
 
 
@@ -541,7 +541,7 @@ Message 提供格式转换方法:
 - `branch_type`: "compression" | "reflection" | None(主路径)
 - `branch_type`: "compression" | "reflection" | None(主路径)
 - `branch_id`: 同一侧分支的消息共享 branch_id
 - `branch_id`: 同一侧分支的消息共享 branch_id
 
 
-**实现**:`agent/trace/models.py`
+**实现**:`cyber_agent/trace/models.py`
 
 
 ---
 ---
 
 
@@ -588,9 +588,9 @@ AGENT_PRESETS = {
 }
 }
 ```
 ```
 
 
-**实现**:`agent/core/presets.py`
+**实现**:`cyber_agent/core/presets.py`
 
 
-**System Prompt 构建优先级**(`agent/core/runner.py:_build_system_prompt`):
+**System Prompt 构建优先级**(`cyber_agent/core/runner.py:_build_system_prompt`):
 
 
 1. 消息中已有 system → 使用消息中的
 1. 消息中已有 system → 使用消息中的
 2. `config.system_prompt` 显式指定 → 使用 config
 2. `config.system_prompt` 显式指定 → 使用 config
@@ -615,7 +615,7 @@ AGENT_PRESETS = {
 **加载方式**:
 **加载方式**:
 
 
 ```python
 ```python
-from agent.core.presets import load_presets_from_json
+from cyber_agent.core.presets import load_presets_from_json
 
 
 load_presets_from_json("examples/production/presets.json")
 load_presets_from_json("examples/production/presets.json")
 ```
 ```
@@ -660,7 +660,7 @@ result2 = agent(
 
 
 **实现**:`HybridTraceStore` 自动路由到本地或远程存储,远程访问通过 HTTP API 实现。
 **实现**:`HybridTraceStore` 自动路由到本地或远程存储,远程访问通过 HTTP API 实现。
 
 
-**实现位置**:`agent/trace/hybrid_store.py`(规划中)
+**实现位置**:`cyber_agent/trace/hybrid_store.py`(规划中)
 
 
 ### agent 工具
 ### agent 工具
 
 
@@ -720,7 +720,7 @@ async def evaluate(
 
 
 ### 消息类型别名
 ### 消息类型别名
 
 
-定义在 `agent/trace/models.py`,用于工具参数和 runner/LLM API 接口:
+定义在 `cyber_agent/trace/models.py`,用于工具参数和 runner/LLM API 接口:
 
 
 ```python
 ```python
 ChatMessage = Dict[str, Any]                          # 单条 OpenAI 格式消息
 ChatMessage = Dict[str, Any]                          # 单条 OpenAI 格式消息
@@ -728,9 +728,9 @@ Messages = List[ChatMessage]                          # 消息列表
 MessageContent = Union[str, List[Dict[str, str]]]     # content 字段(文本或多模态)
 MessageContent = Union[str, List[Dict[str, str]]]     # content 字段(文本或多模态)
 ```
 ```
 
 
-**实现位置**:`agent/tools/builtin/subagent.py`
+**实现位置**:`cyber_agent/tools/builtin/subagent.py`
 
 
-**详细文档**:[工具系统 - Agent/Evaluate 工具](../agent/docs/tools.md#agent-工具)
+**详细文档**:[工具系统 - Agent/Evaluate 工具](../cyber_agent/docs/tools.md#agent-工具)
 
 
 ### ask_human 工具
 ### ask_human 工具
 
 
@@ -787,7 +787,7 @@ MessageContent = Union[str, List[Dict[str, str]]]     # content 字段(文本
 
 
 **持久联系人/Agent**:通过工具按需查询(如 `feishu_get_contact_list`),不随任务注入。
 **持久联系人/Agent**:通过工具按需查询(如 `feishu_get_contact_list`),不随任务注入。
 
 
-**实现**:`agent/core/runner.py:AgentRunner._build_context_injection`, `agent/tools/builtin/subagent.py`
+**实现**:`cyber_agent/core/runner.py:AgentRunner._build_context_injection`, `cyber_agent/tools/builtin/subagent.py`
 
 
 ---
 ---
 
 
@@ -856,7 +856,7 @@ runner = AgentRunner(
 **Runner 修改**:
 **Runner 修改**:
 
 
 ```python
 ```python
-# agent/core/runner.py
+# cyber_agent/core/runner.py
 
 
 class AgentRunner:
 class AgentRunner:
     def __init__(
     def __init__(
@@ -899,12 +899,12 @@ class AgentRunner:
         return "\n\n".join(parts)
         return "\n\n".join(parts)
 ```
 ```
 
 
-**实现位置**:`agent/core/runner.py:AgentRunner._build_context_injection`(待实现)
+**实现位置**:`cyber_agent/core/runner.py:AgentRunner._build_context_injection`(待实现)
 
 
 ### 示例:A2A IM Hook
 ### 示例:A2A IM Hook
 
 
 ```python
 ```python
-# agent/tools/builtin/a2a_im.py
+# cyber_agent/tools/builtin/a2a_im.py
 
 
 class A2AMessageQueue:
 class A2AMessageQueue:
     """A2A IM 消息队列"""
     """A2A IM 消息队列"""
@@ -980,14 +980,14 @@ async def check_messages(ctx: ToolContext) -> ToolResult:
     )
     )
 ```
 ```
 
 
-**实现位置**:`agent/tools/builtin/a2a_im.py`(待实现)
+**实现位置**:`cyber_agent/tools/builtin/a2a_im.py`(待实现)
 
 
 ### 配置示例
 ### 配置示例
 
 
 ```python
 ```python
 # api_server.py
 # api_server.py
 
 
-from agent.tools.builtin.a2a_im import (
+from cyber_agent.tools.builtin.a2a_im import (
     A2AMessageQueue,
     A2AMessageQueue,
     create_a2a_context_hook,
     create_a2a_context_hook,
     check_messages
     check_messages
@@ -1111,7 +1111,7 @@ def create_timer_hook(timer):
 
 
 **持久联系人/Agent**:通过工具按需查询(如 `feishu_get_contact_list`),不随任务注入。
 **持久联系人/Agent**:通过工具按需查询(如 `feishu_get_contact_list`),不随任务注入。
 
 
-**实现**:`agent/core/runner.py:AgentRunner._build_context_injection`, `agent/tools/builtin/subagent.py`
+**实现**:`cyber_agent/core/runner.py:AgentRunner._build_context_injection`, `cyber_agent/tools/builtin/subagent.py`
 
 
 ---
 ---
 
 
@@ -1157,7 +1157,7 @@ ToolResult(
 )
 )
 ```
 ```
 
 
-**详细文档**:[工具系统](../agent/docs/tools.md)
+**详细文档**:[工具系统](../cyber_agent/docs/tools.md)
 
 
 ---
 ---
 
 
@@ -1174,7 +1174,7 @@ ToolResult(
 ### 目录结构
 ### 目录结构
 
 
 ```
 ```
-agent/skill/skills/         # 内置 Skills(始终加载)
+cyber_agent/skill/skills/         # 内置 Skills(始终加载)
 ├── planning.md              # 计划与 Goal 工具使用
 ├── planning.md              # 计划与 Goal 工具使用
 ├── research.md              # 搜索与内容研究
 ├── research.md              # 搜索与内容研究
 └── browser.md               # 浏览器自动化
 └── browser.md               # 浏览器自动化
@@ -1196,9 +1196,9 @@ agent/skill/skills/         # 内置 Skills(始终加载)
 agent(task="...", agent_type="deconstruct", skills=["planning", "deconstruct"])
 agent(task="...", agent_type="deconstruct", skills=["planning", "deconstruct"])
 ```
 ```
 
 
-**实现**:`agent/skill/skill_loader.py`
+**实现**:`cyber_agent/skill/skill_loader.py`
 
 
-**详细文档**:[Skills 使用指南](../agent/docs/skills.md)
+**详细文档**:[Skills 使用指南](../cyber_agent/docs/skills.md)
 
 
 ---
 ---
 
 
@@ -1225,7 +1225,7 @@ agent(task="...", agent_type="deconstruct", skills=["planning", "deconstruct"])
 2. **多轮推理**:LLM 可调用 `knowledge_search`、`knowledge_save`、`resource_save` 等工具
 2. **多轮推理**:LLM 可调用 `knowledge_search`、`knowledge_save`、`resource_save` 等工具
 3. **结构化保存**:通过 `knowledge_save` 工具将知识保存到 KnowHub
 3. **结构化保存**:通过 `knowledge_save` 工具将知识保存到 KnowHub
 
 
-**实现**:`agent/trace/run_api.py:reflect_trace`
+**实现**:`cyber_agent/trace/run_api.py:reflect_trace`
 
 
 ### 知识工具
 ### 知识工具
 
 
@@ -1267,7 +1267,7 @@ async def resource_save(
     “””保存资源文件到知识库”””
     “””保存资源文件到知识库”””
 ```
 ```
 
 
-**实现**:`agent/tools/builtin/knowledge.py`
+**实现**:`cyber_agent/tools/builtin/knowledge.py`
 
 
 ---
 ---
 
 
@@ -1292,7 +1292,7 @@ Context 管理涵盖注入(向模型上下文添加信息)和压缩(在 to
 - **Level 1**:Goal 完成压缩(确定性,零 LLM 成本)— 保留 goal 工具消息,移除执行细节
 - **Level 1**:Goal 完成压缩(确定性,零 LLM 成本)— 保留 goal 工具消息,移除执行细节
 - **Level 2**:LLM 摘要(Level 1 后仍超限时触发)— 通过侧分支生成 summary 重建 history
 - **Level 2**:LLM 摘要(Level 1 后仍超限时触发)— 通过侧分支生成 summary 重建 history
 
 
-**实现**:`agent/trace/compaction.py`, `agent/core/runner.py:_manage_context_usage`
+**实现**:`cyber_agent/trace/compaction.py`, `cyber_agent/core/runner.py:_manage_context_usage`
 
 
 **详细设计**:[Context 管理](./context-management.md)
 **详细设计**:[Context 管理](./context-management.md)
 
 
@@ -1316,10 +1316,10 @@ class TraceStore(Protocol):
 
 
 **实现**:
 **实现**:
 
 
-- 协议定义:`agent/trace/protocols.py`
-- 本地存储:`agent/trace/store.py:FileSystemTraceStore`
-- 远程存储:`agent/trace/remote_store.py:RemoteTraceStore`(规划中)
-- 混合存储:`agent/trace/hybrid_store.py:HybridTraceStore`(规划中)
+- 协议定义:`cyber_agent/trace/protocols.py`
+- 本地存储:`cyber_agent/trace/store.py:FileSystemTraceStore`
+- 远程存储:`cyber_agent/trace/remote_store.py:RemoteTraceStore`(规划中)
+- 混合存储:`cyber_agent/trace/hybrid_store.py:HybridTraceStore`(规划中)
 
 
 ### 跨设备存储
 ### 跨设备存储
 
 
@@ -1338,7 +1338,7 @@ class TraceStore(Protocol):
 
 
 **认证**:通过 API Key 认证,配置在 `config/agents.yaml`。
 **认证**:通过 API Key 认证,配置在 `config/agents.yaml`。
 
 
-**实现位置**:`agent/trace/hybrid_store.py`, `agent/trace/remote_store.py`(规划中)
+**实现位置**:`cyber_agent/trace/hybrid_store.py`, `cyber_agent/trace/remote_store.py`(规划中)
 
 
 ### 存储结构
 ### 存储结构
 
 
@@ -1413,12 +1413,12 @@ class TraceStore(Protocol):
 | 文档                                                            | 内容                            |
 | 文档                                                            | 内容                            |
 | --------------------------------------------------------------- | ------------------------------- |
 | --------------------------------------------------------------- | ------------------------------- |
 | [Context 管理](./context-management.md)                         | 注入机制、压缩策略、Skill 指定注入 |
 | [Context 管理](./context-management.md)                         | 注入机制、压缩策略、Skill 指定注入 |
-| [工具系统](../agent/docs/tools.md)                              | 工具定义、注册、双层记忆        |
-| [Skills 指南](../agent/docs/skills.md)                          | Skill 分类、编写、加载          |
-| [多模态支持](../agent/docs/multimodal.md)                       | 图片、PDF 处理                  |
+| [工具系统](../cyber_agent/docs/tools.md)                              | 工具定义、注册、双层记忆        |
+| [Skills 指南](../cyber_agent/docs/skills.md)                          | Skill 分类、编写、加载          |
+| [多模态支持](../cyber_agent/docs/multimodal.md)                       | 图片、PDF 处理                  |
 | [知识管理](./knowledge.md)                                      | 知识结构、检索、提取机制        |
 | [知识管理](./knowledge.md)                                      | 知识结构、检索、提取机制        |
 | [Scope 设计](./scope-design.md)                                 | 知识可见性和权限控制            |
 | [Scope 设计](./scope-design.md)                                 | 知识可见性和权限控制            |
-| [Agent 设计决策](../agent/docs/decisions.md)                    | Agent Core 架构决策记录         |
+| [Agent 设计决策](../cyber_agent/docs/decisions.md)                    | Agent Core 架构决策记录         |
 | [Gateway 设计决策](../gateway/docs/decisions.md)                | Gateway 架构决策记录            |
 | [Gateway 设计决策](../gateway/docs/decisions.md)                | Gateway 架构决策记录            |
 | [组织级概览](../gateway/docs/enterprise/overview.md)            | 组织级 Agent 系统架构和规划     |
 | [组织级概览](../gateway/docs/enterprise/overview.md)            | 组织级 Agent 系统架构和规划     |
 | [Enterprise 实现](../gateway/docs/enterprise/implementation.md) | 认证、审计、多租户技术实现      |
 | [Enterprise 实现](../gateway/docs/enterprise/implementation.md) | 认证、审计、多租户技术实现      |

+ 31 - 31
agent/docs/cognition-log.md → cyber_agent/docs/cognition-log.md

@@ -13,7 +13,7 @@
 
 
 ## 概述
 ## 概述
 
 
-每个 trace 维护一个 `cognition_log.json`,按时间顺序记录所有认知事件(知识查询、评估、提取三态、记忆反思),为知识质量反馈和 Memory 系统的 dream 操作(详见 `agent/docs/memory.md`)提供数据。
+每个 trace 维护一个 `cognition_log.json`,按时间顺序记录所有认知事件(知识查询、评估、提取三态、记忆反思),为知识质量反馈和 Memory 系统的 dream 操作(详见 `cyber_agent/docs/memory.md`)提供数据。
 
 
 > 此文件原名 `knowledge_log.json`,扩展为统一事件流后更名。读取时仍兼容旧文件名和 `entries[]` 字段。
 > 此文件原名 `knowledge_log.json`,扩展为统一事件流后更名。读取时仍兼容旧文件名和 `entries[]` 字段。
 
 
@@ -63,7 +63,7 @@ Agent 通过 `POST /api/knowledge/ask` 查询知识时记录。一次查询返
 }
 }
 ```
 ```
 
 
-**写入时机**:`agent/trace/goal_tool.py:inject_knowledge_for_goal`,`POST /api/knowledge/ask` 返回后。
+**写入时机**:`cyber_agent/trace/goal_tool.py:inject_knowledge_for_goal`,`POST /api/knowledge/ask` 返回后。
 
 
 ### `evaluation`:知识评估
 ### `evaluation`:知识评估
 
 
@@ -94,7 +94,7 @@ LLM 在侧分支内按 `{evaluations: [{query_sequence, assessments: [{knowledge
 
 
 ### `extraction_pending` / `extraction_reviewed` / `extraction_committed`:知识提取三态
 ### `extraction_pending` / `extraction_reviewed` / `extraction_committed`:知识提取三态
 
 
-Agent 的反思侧分支不再直接 upload 到 KnowHub,而是暂存为 pending,经人工 review 后才 commit。详见 `agent/docs/memory.md` 第三节"提取-审核-提交两阶段"。
+Agent 的反思侧分支不再直接 upload 到 KnowHub,而是暂存为 pending,经人工 review 后才 commit。详见 `cyber_agent/docs/memory.md` 第三节"提取-审核-提交两阶段"。
 
 
 #### `extraction_pending`
 #### `extraction_pending`
 
 
@@ -118,7 +118,7 @@ Agent 的反思侧分支不再直接 upload 到 KnowHub,而是暂存为 pendin
 }
 }
 ```
 ```
 
 
-**写入时机**:`agent/tools/builtin/knowledge.py:knowledge_save_pending` 工具调用时。
+**写入时机**:`cyber_agent/tools/builtin/knowledge.py:knowledge_save_pending` 工具调用时。
 
 
 #### `extraction_reviewed`
 #### `extraction_reviewed`
 
 
@@ -136,10 +136,10 @@ Agent 的反思侧分支不再直接 upload 到 KnowHub,而是暂存为 pendin
 `decision` 取值:`approve` / `edit` / `discard`。`edit` 时附加 `edited_payload` 字段。
 `decision` 取值:`approve` / `edit` / `discard`。`edit` 时附加 `edited_payload` 字段。
 
 
 **写入时机**:
 **写入时机**:
-- CLI:`python -m agent.cli.extraction_review --review`
+- CLI:`python -m cyber_agent.cli.extraction_review --review`
 - Interactive 菜单第 8 项
 - Interactive 菜单第 8 项
 - HTTP:`POST /api/traces/{tid}/extractions/{eid}/review`
 - HTTP:`POST /api/traces/{tid}/extractions/{eid}/review`
-- 共享核心:`agent/trace/extraction_review.py:review_one`
+- 共享核心:`cyber_agent/trace/extraction_review.py:review_one`
 
 
 #### `extraction_committed`
 #### `extraction_committed`
 
 
@@ -154,11 +154,11 @@ Agent 的反思侧分支不再直接 upload 到 KnowHub,而是暂存为 pendin
 }
 }
 ```
 ```
 
 
-**写入时机**:`agent/trace/extraction_review.py:commit_approved`(调用 `knowledge_save` 成功后)。`reflect_auto_commit=True` 时由反思侧分支退出 hook 自动触发 `auto_commit_branch`。
+**写入时机**:`cyber_agent/trace/extraction_review.py:commit_approved`(调用 `knowledge_save` 成功后)。`reflect_auto_commit=True` 时由反思侧分支退出 hook 自动触发 `auto_commit_branch`。
 
 
 ### `reflection`:记忆反思
 ### `reflection`:记忆反思
 
 
-仅 memory-bearing Agent 使用(详见 `agent/docs/memory.md`)。Dream 操作触发的 per-trace 记忆反思。
+仅 memory-bearing Agent 使用(详见 `cyber_agent/docs/memory.md`)。Dream 操作触发的 per-trace 记忆反思。
 
 
 ```json
 ```json
 {
 {
@@ -172,7 +172,7 @@ Agent 的反思侧分支不再直接 upload 到 KnowHub,而是暂存为 pendin
 
 
 `sequence_range` 是本次反思覆盖的消息区间 `[start, end]`。`consumed_at` 在跨 trace 整合(dream 的第二阶段)消化了该反思后写入;未消化时此字段缺省。
 `sequence_range` 是本次反思覆盖的消息区间 `[start, end]`。`consumed_at` 在跨 trace 整合(dream 的第二阶段)消化了该反思后写入;未消化时此字段缺省。
 
 
-**写入时机**:`agent/core/dream.py:per_trace_reflect`(写入时 `consumed_at` 缺省);`agent/core/dream.py:cross_trace_integrate`(整合后补 `consumed_at`)。
+**写入时机**:`cyber_agent/core/dream.py:per_trace_reflect`(写入时 `consumed_at` 缺省);`cyber_agent/core/dream.py:cross_trace_integrate`(整合后补 `consumed_at`)。
 
 
 ---
 ---
 
 
@@ -186,7 +186,7 @@ Agent 的反思侧分支不再直接 upload 到 KnowHub,而是暂存为 pendin
 
 
 **时机**:Goal status 变为 `completed` 或 `abandoned`
 **时机**:Goal status 变为 `completed` 或 `abandoned`
 
 
-**触发逻辑**(`agent/trace/store.py:update_goal`):
+**触发逻辑**(`cyber_agent/trace/store.py:update_goal`):
 
 
 ```
 ```
 Goal 完成
 Goal 完成
@@ -197,7 +197,7 @@ Goal 完成
   → 设置 trace.context["pending_knowledge_eval"] = true
   → 设置 trace.context["pending_knowledge_eval"] = true
   → 设置 trace.context["knowledge_eval_trigger"] = "goal_completion"
   → 设置 trace.context["knowledge_eval_trigger"] = "goal_completion"
-Runner 主循环下一次迭代开头检测到标志(agent/core/runner.py:_agent_loop)
+Runner 主循环下一次迭代开头检测到标志(cyber_agent/core/runner.py:_agent_loop)
   → 清除标志
   → 清除标志
   → 将 "knowledge_eval" 加入 force_side_branch 队列
   → 将 "knowledge_eval" 加入 force_side_branch 队列
 ```
 ```
@@ -206,7 +206,7 @@ Runner 主循环下一次迭代开头检测到标志(agent/core/runner.py:_age
 
 
 **时机**:上下文 token 数超过阈值,即将执行压缩
 **时机**:上下文 token 数超过阈值,即将执行压缩
 
 
-**触发逻辑**(`agent/core/runner.py:_manage_context_usage`):
+**触发逻辑**(`cyber_agent/core/runner.py:_manage_context_usage`):
 
 
 ```
 ```
 压缩条件触发
 压缩条件触发
@@ -226,7 +226,7 @@ Runner 主循环下一次迭代开头检测到标志(agent/core/runner.py:_age
 
 
 **时机**:主路径无工具调用,Agent 即将结束
 **时机**:主路径无工具调用,Agent 即将结束
 
 
-**触发逻辑**(`agent/core/runner.py:_agent_loop`):
+**触发逻辑**(`cyber_agent/core/runner.py:_agent_loop`):
 
 
 ```
 ```
 任务即将结束
 任务即将结束
@@ -245,11 +245,11 @@ Runner 主循环下一次迭代开头检测到标志(agent/core/runner.py:_age
 
 
 ### 侧分支类型
 ### 侧分支类型
 
 
-复用 `SideBranchContext` 机制,类型 `"knowledge_eval"`(`agent/trace/models.py:Message.branch_type`)。
+复用 `SideBranchContext` 机制,类型 `"knowledge_eval"`(`cyber_agent/trace/models.py:Message.branch_type`)。
 
 
 ### 评估 Prompt 结构
 ### 评估 Prompt 结构
 
 
-完整实现:`agent/core/runner.py:_build_knowledge_eval_prompt`
+完整实现:`cyber_agent/core/runner.py:_build_knowledge_eval_prompt`
 
 
 ```
 ```
 你是知识评估助手。请评估以下知识查询结果在本次任务执行中的实际效果。
 你是知识评估助手。请评估以下知识查询结果在本次任务执行中的实际效果。
@@ -294,7 +294,7 @@ LLM 直接输出 JSON:
 ## 数据流
 ## 数据流
 
 
 ```
 ```
-知识查询(agent/trace/goal_tool.py:inject_knowledge_for_goal)
+知识查询(cyber_agent/trace/goal_tool.py:inject_knowledge_for_goal)
 POST /api/knowledge/ask → KM Agent 整合回答
 POST /api/knowledge/ask → KM Agent 整合回答
@@ -333,7 +333,7 @@ LLM 按 query 维度、逐 source 评估,输出 JSON
 
 
                     ···
                     ···
 
 
-Dream 触发(memory-bearing Agent,详见 agent/docs/memory.md)
+Dream 触发(memory-bearing Agent,详见 cyber_agent/docs/memory.md)
 Phase 1: per_trace_reflect(逐 trace,reflected_at_sequence < last_sequence)
 Phase 1: per_trace_reflect(逐 trace,reflected_at_sequence < last_sequence)
   ↓ 读取增量消息 + cognition_log 中 query/evaluation/extraction_* 事件
   ↓ 读取增量消息 + cognition_log 中 query/evaluation/extraction_* 事件
@@ -352,19 +352,19 @@ Phase 2: cross_trace_integrate
 
 
 | 集成位置 | 文件 | 说明 |
 | 集成位置 | 文件 | 说明 |
 |---|---|---|
 |---|---|---|
-| 知识查询时写 log | `agent/trace/goal_tool.py:inject_knowledge_for_goal` | `goal(focus=...)` 触发 ask → 写入 `query` 事件 |
-| Goal 完成时设置标志 | `agent/trace/store.py:update_goal` | 设置 `trace.context["pending_knowledge_eval"]` |
-| 主循环检测标志 | `agent/core/runner.py:_agent_loop` | 每轮迭代开头检测,触发 `["knowledge_eval"]` |
-| 压缩前触发评估 | `agent/core/runner.py:_manage_context_usage` | 压缩前检查 pending,先评估再压缩 |
-| 任务结束兜底 | `agent/core/runner.py:_agent_loop` | 退出前检查 pending,强制触发评估 |
-| 侧分支类型 | `agent/trace/models.py:Message.branch_type` | Literal 中包含 `"knowledge_eval"` |
-| 即时写入评估 | `agent/core/runner.py:_agent_loop` | 解析 JSON 后调 `store.update_knowledge_evaluation` |
-| 知识提取暂存 | `agent/tools/builtin/knowledge.py:knowledge_save_pending` | LLM 工具,写 `extraction_pending` 事件 |
-| 提取审核 / 提交 | `agent/trace/extraction_review.py` | 写 `extraction_reviewed` / `extraction_committed` 事件 |
-| 反思侧分支 auto-commit | `agent/core/runner.py`(反思分支退出分支) | `reflect_auto_commit=True` 时调 `auto_commit_branch` |
-| 记忆反思写入 | `agent/core/dream.py:per_trace_reflect` | 写 `reflection` 事件(consumed_at 缺省) |
-| Reflection 消化标记 | `agent/core/dream.py:cross_trace_integrate` | 整合后补 `consumed_at` |
-| Log 文件格式 | `agent/trace/store.py` | ✅ 已从 entries[] 迁移到 events[];读写兼容旧文件名 |
+| 知识查询时写 log | `cyber_agent/trace/goal_tool.py:inject_knowledge_for_goal` | `goal(focus=...)` 触发 ask → 写入 `query` 事件 |
+| Goal 完成时设置标志 | `cyber_agent/trace/store.py:update_goal` | 设置 `trace.context["pending_knowledge_eval"]` |
+| 主循环检测标志 | `cyber_agent/core/runner.py:_agent_loop` | 每轮迭代开头检测,触发 `["knowledge_eval"]` |
+| 压缩前触发评估 | `cyber_agent/core/runner.py:_manage_context_usage` | 压缩前检查 pending,先评估再压缩 |
+| 任务结束兜底 | `cyber_agent/core/runner.py:_agent_loop` | 退出前检查 pending,强制触发评估 |
+| 侧分支类型 | `cyber_agent/trace/models.py:Message.branch_type` | Literal 中包含 `"knowledge_eval"` |
+| 即时写入评估 | `cyber_agent/core/runner.py:_agent_loop` | 解析 JSON 后调 `store.update_knowledge_evaluation` |
+| 知识提取暂存 | `cyber_agent/tools/builtin/knowledge.py:knowledge_save_pending` | LLM 工具,写 `extraction_pending` 事件 |
+| 提取审核 / 提交 | `cyber_agent/trace/extraction_review.py` | 写 `extraction_reviewed` / `extraction_committed` 事件 |
+| 反思侧分支 auto-commit | `cyber_agent/core/runner.py`(反思分支退出分支) | `reflect_auto_commit=True` 时调 `auto_commit_branch` |
+| 记忆反思写入 | `cyber_agent/core/dream.py:per_trace_reflect` | 写 `reflection` 事件(consumed_at 缺省) |
+| Reflection 消化标记 | `cyber_agent/core/dream.py:cross_trace_integrate` | 整合后补 `consumed_at` |
+| Log 文件格式 | `cyber_agent/trace/store.py` | ✅ 已从 entries[] 迁移到 events[];读写兼容旧文件名 |
 
 
 ---
 ---
 
 
@@ -392,5 +392,5 @@ Phase 2: cross_trace_integrate
 
 
 ### 7.3 相关文档
 ### 7.3 相关文档
 
 
-- **Memory 系统整体**:`agent/docs/memory.md` —— cognition_log 是其数据底座,Memory/Dream 设计与使用规范在那里
+- **Memory 系统整体**:`cyber_agent/docs/memory.md` —— cognition_log 是其数据底座,Memory/Dream 设计与使用规范在那里
 - **KnowHub 决策历史**:`knowhub/docs/decisions.md` —— 如果需要 knowledge_log → cognition_log 重构等历史决策的背景
 - **KnowHub 决策历史**:`knowhub/docs/decisions.md` —— 如果需要 knowledge_log → cognition_log 重构等历史决策的背景

+ 0 - 0
agent/docs/comparison-with-claude-code.md → cyber_agent/docs/comparison-with-claude-code.md


+ 6 - 6
agent/docs/context-management.md → cyber_agent/docs/context-management.md

@@ -44,7 +44,7 @@ Trace 创建时构建一次,后续续跑不重复发送。
 
 
 优先级:`messages 中的 system message` > `config.system_prompt` > `preset.system_prompt` > `DEFAULT_SYSTEM_PREFIX`
 优先级:`messages 中的 system message` > `config.system_prompt` > `preset.system_prompt` > `DEFAULT_SYSTEM_PREFIX`
 
 
-**实现**:`agent/core/runner.py:_build_system_prompt`
+**实现**:`cyber_agent/core/runner.py:_build_system_prompt`
 
 
 ---
 ---
 
 
@@ -71,7 +71,7 @@ Trace 创建时构建一次,后续续跑不重复发送。
 - 仅在主路径执行(侧分支中跳过)
 - 仅在主路径执行(侧分支中跳过)
 - 检查模型是否已主动调用,避免重复
 - 检查模型是否已主动调用,避免重复
 
 
-**实现**:`agent/core/runner.py`(`CONTEXT_INJECTION_INTERVAL`, 工具执行后的自动注入逻辑)
+**实现**:`cyber_agent/core/runner.py`(`CONTEXT_INJECTION_INTERVAL`, 工具执行后的自动注入逻辑)
 
 
 **详细文档**:[架构设计 § Context Injection Hooks](./architecture.md#context-injection-hooks上下文注入钩子)
 **详细文档**:[架构设计 § Context Injection Hooks](./architecture.md#context-injection-hooks上下文注入钩子)
 
 
@@ -204,15 +204,15 @@ knowhub/agents/skills/         # KnowHub Librarian 的 skills
 
 
 在 goal 工具执行 `done` 操作后,立刻对该 goal 执行压缩。优点是 history 始终保持精简,缺点是如果后续需要回溯到该 goal 的中间过程,信息已丢失(存储层仍保留原始消息)。
 在 goal 工具执行 `done` 操作后,立刻对该 goal 执行压缩。优点是 history 始终保持精简,缺点是如果后续需要回溯到该 goal 的中间过程,信息已丢失(存储层仍保留原始消息)。
 
 
-**触发点**:`agent/core/runner.py`(工具执行后检测 `goal(done=...)` 调用)
+**触发点**:`cyber_agent/core/runner.py`(工具执行后检测 `goal(done=...)` 调用)
 
 
 #### `on_overflow` 模式
 #### `on_overflow` 模式
 
 
 在 `_manage_context_usage` 检测到 token 超限时,遍历所有 completed goal,逐个执行压缩,直到 token 数降到阈值以下或所有 completed goal 都已压缩。如果仍超限,进入 Level 2。
 在 `_manage_context_usage` 检测到 token 超限时,遍历所有 completed goal,逐个执行压缩,直到 token 数降到阈值以下或所有 completed goal 都已压缩。如果仍超限,进入 Level 2。
 
 
-**触发点**:`agent/core/runner.py:_manage_context_usage`
+**触发点**:`cyber_agent/core/runner.py:_manage_context_usage`
 
 
-**实现**:`agent/trace/compaction.py:compress_completed_goals`
+**实现**:`cyber_agent/trace/compaction.py:compress_completed_goals`
 
 
 ### Level 2:LLM 摘要压缩
 ### Level 2:LLM 摘要压缩
 
 
@@ -231,7 +231,7 @@ knowhub/agents/skills/         # KnowHub Librarian 的 skills
 
 
 压缩完成后重建 history 为:`system prompt + 第一条 user message + summary(含详细 GoalTree)`
 压缩完成后重建 history 为:`system prompt + 第一条 user message + summary(含详细 GoalTree)`
 
 
-**实现**:`agent/core/runner.py:_agent_loop`(侧分支状态机), `agent/core/runner.py:_rebuild_history_after_compression`
+**实现**:`cyber_agent/core/runner.py:_agent_loop`(侧分支状态机), `cyber_agent/core/runner.py:_rebuild_history_after_compression`
 
 
 ### 任务完成后反思
 ### 任务完成后反思
 
 

+ 43 - 43
agent/docs/decisions.md → cyber_agent/docs/decisions.md

@@ -449,8 +449,8 @@ Step 工具等核心功能如何让 Agent 知道?
 **选择:Skill 分层**
 **选择:Skill 分层**
 
 
 **设计**:
 **设计**:
-- **Core Skill**:`agent/skills/core.md`,自动注入到 System Prompt
-- **普通 Skill**:`agent/skills/{name}/`,通过 `skill` 工具加载到对话消息
+- **Core Skill**:`cyber_agent/skill/skills/core.md`,自动注入到 System Prompt
+- **普通 Skill**:`cyber_agent/skill/skills/{name}/`,通过 `skill` 工具加载到对话消息
 
 
 **理由**:
 **理由**:
 1. **核心功能必须可见**:Step 管理等功能,模型需要始终知道
 1. **核心功能必须可见**:Step 管理等功能,模型需要始终知道
@@ -629,7 +629,7 @@ execution trace v2.0 引入了 Blob 存储系统用于处理大输出和图片
 
 
 **统一工具,三种模式**:
 **统一工具,三种模式**:
 - 单一工具 `subagent` 支持三种模式:`explore`(并行探索)、`delegate`(委托执行)、`evaluate`(结果评估)
 - 单一工具 `subagent` 支持三种模式:`explore`(并行探索)、`delegate`(委托执行)、`evaluate`(结果评估)
-- 实现位置:`agent/tools/builtin/subagent.py`
+- 实现位置:`cyber_agent/tools/builtin/subagent.py`
 
 
 **Explore 模式的并行执行**:
 **Explore 模式的并行执行**:
 - 使用 `asyncio.gather()` 实现真并行
 - 使用 `asyncio.gather()` 实现真并行
@@ -689,7 +689,7 @@ Agent(含 sub-agent)有时不创建 goal 就直接执行工具调用,导
 
 
 **Prompt 配合**:`core.md` 引导 LLM "先明确目标再行动",但不强制。
 **Prompt 配合**:`core.md` 引导 LLM "先明确目标再行动",但不强制。
 
 
-**实现**:`agent/core/runner.py:AgentRunner.run`
+**实现**:`cyber_agent/core/runner.py:AgentRunner.run`
 
 
 ### 理由
 ### 理由
 
 
@@ -743,7 +743,7 @@ Agent(含 sub-agent)有时不创建 goal 就直接执行工具调用,导
 3. **可组合**:新建/续跑/回溯共享同一个执行流水线,差异仅在 Phase 1
 3. **可组合**:新建/续跑/回溯共享同一个执行流水线,差异仅在 Phase 1
 4. **回溯能力**:支持从任意断点插入消息重新运行,原始数据保留(标记而非删除)
 4. **回溯能力**:支持从任意断点插入消息重新运行,原始数据保留(标记而非删除)
 
 
-**实现**:`agent/core/runner.py`, `agent/trace/models.py`, `agent/tools/builtin/subagent.py`
+**实现**:`cyber_agent/core/runner.py`, `cyber_agent/trace/models.py`, `cyber_agent/tools/builtin/subagent.py`
 
 
 ---
 ---
 
 
@@ -771,7 +771,7 @@ Agent(含 sub-agent)有时不创建 goal 就直接执行工具调用,导
 2. **开销可控**:只注入活跃协作者(通常 2-5 个),不浪费 context
 2. **开销可控**:只注入活跃协作者(通常 2-5 个),不浪费 context
 3. **可扩展**:未来新增通信渠道只需在对应工具中更新 collaborators 即可
 3. **可扩展**:未来新增通信渠道只需在对应工具中更新 collaborators 即可
 
 
-**实现**:`agent/core/runner.py:AgentRunner._build_context_injection`
+**实现**:`cyber_agent/core/runner.py:AgentRunner._build_context_injection`
 
 
 ---
 ---
 
 
@@ -801,7 +801,7 @@ Agent(含 sub-agent)有时不创建 goal 就直接执行工具调用,导
 
 
 内部统一为 `_run_agents()` 函数,`single = len(tasks)==1` 区分 delegate/explore 行为。
 内部统一为 `_run_agents()` 函数,`single = len(tasks)==1` 区分 delegate/explore 行为。
 
 
-#### 18b. 增加消息线格式类型别名(`agent/trace/models.py`)
+#### 18b. 增加消息线格式类型别名(`cyber_agent/trace/models.py`)
 
 
 ```python
 ```python
 ChatMessage = Dict[str, Any]                          # 单条 OpenAI 格式消息
 ChatMessage = Dict[str, Any]                          # 单条 OpenAI 格式消息
@@ -827,14 +827,14 @@ MessageContent = Union[str, List[Dict[str, str]]]     # content 字段(文本
 
 
 ### 变更范围
 ### 变更范围
 
 
-- `agent/trace/models.py` — 类型别名
-- `agent/tools/schema.py` — `Literal`/`Union` 支持
-- `agent/tools/builtin/subagent.py` — `agent` + `evaluate` 工具,`_run_agents()` 统一函数
-- `agent/tools/builtin/__init__.py`, `agent/core/runner.py` — 注册表更新
-- `agent/tools/builtin/feishu/chat.py`, `agent/tools/builtin/browser/baseClass.py` — 类型注解修正
-- `agent/__init__.py` — 导出新类型
+- `cyber_agent/trace/models.py` — 类型别名
+- `cyber_agent/tools/schema.py` — `Literal`/`Union` 支持
+- `cyber_agent/tools/builtin/subagent.py` — `agent` + `evaluate` 工具,`_run_agents()` 统一函数
+- `cyber_agent/tools/builtin/__init__.py`, `cyber_agent/core/runner.py` — 注册表更新
+- `cyber_agent/tools/builtin/feishu/chat.py`, `cyber_agent/tools/builtin/browser/baseClass.py` — 类型注解修正
+- `cyber_agent/__init__.py` — 导出新类型
 
 
-**实现**:`agent/tools/builtin/subagent.py`, `agent/trace/models.py`, `agent/tools/schema.py`
+**实现**:`cyber_agent/tools/builtin/subagent.py`, `cyber_agent/trace/models.py`, `cyber_agent/tools/schema.py`
 
 
 ---
 ---
 
 
@@ -924,12 +924,12 @@ POST /api/traces/{id}/reflect
 
 
 ### 变更范围
 ### 变更范围
 
 
-- `agent/trace/models.py` — Trace.status 增加 `"stopped"`
-- `agent/core/runner.py` — `_cancel_events` 字典,`stop()` 方法,agent loop 检查取消
-- `agent/trace/run_api.py` — 合并 `continue`/`rewind` 为 `run`,新增 `stop`/`reflect` 端点
+- `cyber_agent/trace/models.py` — Trace.status 增加 `"stopped"`
+- `cyber_agent/core/runner.py` — `_cancel_events` 字典,`stop()` 方法,agent loop 检查取消
+- `cyber_agent/trace/run_api.py` — 合并 `continue`/`rewind` 为 `run`,新增 `stop`/`reflect` 端点
 - `api_server.py` — 注入路由
 - `api_server.py` — 注入路由
 
 
-**实现**:`agent/trace/run_api.py`, `agent/core/runner.py`, `agent/trace/models.py`
+**实现**:`cyber_agent/trace/run_api.py`, `cyber_agent/core/runner.py`, `cyber_agent/trace/models.py`
 
 
 ---
 ---
 
 
@@ -997,12 +997,12 @@ def build_llm_messages(head_sequence, messages_by_seq):
 
 
 ### 变更范围
 ### 变更范围
 
 
-- `agent/trace/models.py` — Message 新增 `parent_sequence`,`status`/`abandoned_at` 保留但标记弃用
-- `agent/trace/store.py` — 新增 `get_main_path_messages()`,Trace 追踪 `head_sequence`
-- `agent/trace/protocols.py` — 新增 `get_main_path_messages()` 接口
-- `agent/core/runner.py` — agent loop 中设置 parent_sequence,rewind 使用新模型
+- `cyber_agent/trace/models.py` — Message 新增 `parent_sequence`,`status`/`abandoned_at` 保留但标记弃用
+- `cyber_agent/trace/store.py` — 新增 `get_main_path_messages()`,Trace 追踪 `head_sequence`
+- `cyber_agent/trace/protocols.py` — 新增 `get_main_path_messages()` 接口
+- `cyber_agent/core/runner.py` — agent loop 中设置 parent_sequence,rewind 使用新模型
 
 
-**实现**:`agent/trace/models.py`, `agent/trace/store.py`, `agent/core/runner.py`
+**实现**:`cyber_agent/trace/models.py`, `cyber_agent/trace/store.py`, `cyber_agent/core/runner.py`
 
 
 ---
 ---
 
 
@@ -1037,10 +1037,10 @@ Message Tree 解决了消息层面的分支问题,但 GoalTree 是独立的状
 
 
 ### 变更范围
 ### 变更范围
 
 
-- `agent/core/runner.py:_rewind()` — 快照旧树到事件,重建干净树
-- `agent/trace/store.py` — rewind 事件增加 `goal_tree_snapshot`
+- `cyber_agent/core/runner.py:_rewind()` — 快照旧树到事件,重建干净树
+- `cyber_agent/trace/store.py` — rewind 事件增加 `goal_tree_snapshot`
 
 
-**实现**:`agent/core/runner.py`
+**实现**:`cyber_agent/core/runner.py`
 
 
 ---
 ---
 
 
@@ -1104,11 +1104,11 @@ Message Tree 解决了消息层面的分支问题,但 GoalTree 是独立的状
 
 
 ### 变更范围
 ### 变更范围
 
 
-- `agent/trace/goal_models.py` — `to_prompt(include_summary)` 双视图
-- `agent/trace/compaction.py` — 压缩触发逻辑、Level 1/Level 2 实现
-- `agent/core/runner.py` — agent loop 中集成压缩
+- `cyber_agent/trace/goal_models.py` — `to_prompt(include_summary)` 双视图
+- `cyber_agent/trace/compaction.py` — 压缩触发逻辑、Level 1/Level 2 实现
+- `cyber_agent/core/runner.py` — agent loop 中集成压缩
 
 
-**实现**:`agent/trace/compaction.py`, `agent/trace/goal_models.py`, `agent/core/runner.py`
+**实现**:`cyber_agent/trace/compaction.py`, `cyber_agent/trace/goal_models.py`, `cyber_agent/core/runner.py`
 
 
 ---
 ---
 
 
@@ -1161,11 +1161,11 @@ Rewind 事件 payload 中增加 `head_sequence` 字段,便于前端感知分
 
 
 ### 变更范围
 ### 变更范围
 
 
-- `agent/trace/run_api.py` — `TraceRunRequest.after_sequence`、reflect 隔离
-- `agent/core/runner.py` — `RunConfig.after_sequence`、`_prepare_existing_trace`、`_rewind` 修正
-- `agent/trace/api.py` — messages 查询参数 `mode`/`head`
+- `cyber_agent/trace/run_api.py` — `TraceRunRequest.after_sequence`、reflect 隔离
+- `cyber_agent/core/runner.py` — `RunConfig.after_sequence`、`_prepare_existing_trace`、`_rewind` 修正
+- `cyber_agent/trace/api.py` — messages 查询参数 `mode`/`head`
 
 
-**实现**:`agent/trace/run_api.py`, `agent/core/runner.py`, `agent/trace/api.py`
+**实现**:`cyber_agent/trace/run_api.py`, `cyber_agent/core/runner.py`, `cyber_agent/trace/api.py`
 
 
 ---
 ---
 
 
@@ -1323,18 +1323,18 @@ context = {
 **API 触发实现**:
 **API 触发实现**:
 - `/api/traces/{id}/reflect` — 设置 `RunConfig(force_side_branch="reflection")`,启动后台任务
 - `/api/traces/{id}/reflect` — 设置 `RunConfig(force_side_branch="reflection")`,启动后台任务
 - `/api/traces/{id}/compact` — 设置 `RunConfig(force_side_branch="compression")`,启动后台任务
 - `/api/traces/{id}/compact` — 设置 `RunConfig(force_side_branch="compression")`,启动后台任务
-- `agent/cli/interactive.py:manual_compact()` — 同样使用 `force_side_branch="compression"`,消费 `run()` 生成器
+- `cyber_agent/cli/interactive.py:manual_compact()` — 同样使用 `force_side_branch="compression"`,消费 `run()` 生成器
 
 
-**实现位置**:`agent/trace/run_api.py:reflect_trace`, `agent/trace/run_api.py:compact_trace`, `agent/cli/interactive.py:manual_compact`
+**实现位置**:`cyber_agent/trace/run_api.py:reflect_trace`, `cyber_agent/trace/run_api.py:compact_trace`, `cyber_agent/cli/interactive.py:manual_compact`
 
 
 ### 变更范围
 ### 变更范围
 
 
-- `agent/trace/models.py` — Message 增加 `branch_type` 和 `branch_id` 字段
-- `agent/core/runner.py` — 增加 `SideBranchContext`,重构 `_agent_loop`
-- `agent/trace/compaction.py` — `_compress_history` 改为状态机模式
-- `agent/trace/protocols.py` — 查询接口支持过滤侧分支消息
+- `cyber_agent/trace/models.py` — Message 增加 `branch_type` 和 `branch_id` 字段
+- `cyber_agent/core/runner.py` — 增加 `SideBranchContext`,重构 `_agent_loop`
+- `cyber_agent/trace/compaction.py` — `_compress_history` 改为状态机模式
+- `cyber_agent/trace/protocols.py` — 查询接口支持过滤侧分支消息
 
 
-**实现**:`agent/core/runner.py:_agent_loop`, `agent/trace/models.py:Message`, `agent/trace/compaction.py`
+**实现**:`cyber_agent/core/runner.py:_agent_loop`, `cyber_agent/trace/models.py:Message`, `cyber_agent/trace/compaction.py`
 
 
 ---
 ---
 
 
@@ -1353,7 +1353,7 @@ context = {
 6. **Skill 白名单机制**:远端每个 `agent_type` 定义 `ALLOWED_SKILLS`,调用方传的 skill 经白名单过滤。其他配置(`tools`/`model`/prompt)仍然纯服务器端。
 6. **Skill 白名单机制**:远端每个 `agent_type` 定义 `ALLOWED_SKILLS`,调用方传的 skill 经白名单过滤。其他配置(`tools`/`model`/prompt)仍然纯服务器端。
 7. IO 契约:不发明 per-agent-type schema——Agent 之间通过 message 交流,结构化信息由 Agent 的 prompt 约定写进 message 文本,caller 自己 parse。
 7. IO 契约:不发明 per-agent-type schema——Agent 之间通过 message 交流,结构化信息由 Agent 的 prompt 约定写进 message 文本,caller 自己 parse。
 8. 续跑:服务器不维护 `caller_trace_id → sub_trace_id` 映射;caller 显式传 `continue_from`。
 8. 续跑:服务器不维护 `caller_trace_id → sub_trace_id` 映射;caller 显式传 `continue_from`。
-9. SDK 入口:`agent.invoke_agent()`(`agent/client.py`),统一路由 remote/本地。对应 Claude Code skill 薄脚本 `~/.claude/skills/agent/invoke.py` 透传 CLI 参数。**不再**用 `python -m agent.tools.builtin.subagent`——该路径触发 double-import bug(`agent.tools.builtin.__init__.py` 传递 import + runpy 作为 `__main__` 重载,环境变量在两次加载之间被污染)。
+9. SDK 入口:`cyber_agent.invoke_agent()`(`cyber_agent/client.py`),统一路由 remote/本地。对应 Claude Code skill 薄脚本 `~/.claude/skills/agent/invoke.py` 透传 CLI 参数。**不再**用 `python -m cyber_agent.tools.builtin.subagent`——该路径触发 double-import bug(`cyber_agent.tools.builtin.__init__.py` 传递 import + runpy 作为 `__main__` 重载,环境变量在两次加载之间被污染)。
 10. 远端 Agent 的三条安全约束,每个 handler 直接在自己的 `RunConfig` 里配置(不搞抽象 helper):
 10. 远端 Agent 的三条安全约束,每个 handler 直接在自己的 `RunConfig` 里配置(不搞抽象 helper):
     - 禁止调用 `agent` / `evaluate`(防递归)——用 `tools=[...]` 精确列表 或 `exclude_tools=["agent","evaluate"]`
     - 禁止调用 `agent` / `evaluate`(防递归)——用 `tools=[...]` 精确列表 或 `exclude_tools=["agent","evaluate"]`
     - 关闭自动知识提取 / 复盘(`enable_extraction` / `enable_completion_extraction` = False)
     - 关闭自动知识提取 / 复盘(`enable_extraction` / `enable_completion_extraction` = False)
@@ -1367,6 +1367,6 @@ context = {
 
 
 **可用 agent_type 不做动态发现**:项目通过 prompt 显式告诉主 Agent 可用的远端类型,避免启动时依赖服务器。
 **可用 agent_type 不做动态发现**:项目通过 prompt 显式告诉主 Agent 可用的远端类型,避免启动时依赖服务器。
 
 
-**实现**:`agent/tools/builtin/subagent.py`(路由)、`knowhub/server.py::agent_api`(`/api/agent`)、`knowhub/agents/librarian.py` / `research.py`(去 trace_map)。文档:`agent/docs/tools.md § Agent 工具`、`knowhub/docs/remote-agents.md`、`knowhub/docs/api.md`。
+**实现**:`cyber_agent/tools/builtin/subagent.py`(路由)、`knowhub/server.py::agent_api`(`/api/agent`)、`knowhub/agents/librarian.py` / `research.py`(去 trace_map)。文档:`cyber_agent/docs/tools.md § Agent 工具`、`knowhub/docs/remote-agents.md`、`knowhub/docs/api.md`。
 
 
 ---
 ---

+ 31 - 31
agent/docs/memory.md → cyber_agent/docs/memory.md

@@ -29,7 +29,7 @@
 
 
 **输出**:调用 `upload_knowledge` 工具,保存 experience/tool/strategy/case 到 KnowHub。
 **输出**:调用 `upload_knowledge` 工具,保存 experience/tool/strategy/case 到 KnowHub。
 
 
-**Prompt**:`REFLECT_PROMPT`(压缩时)和 `COMPLETION_REFLECT_PROMPT`(任务完成后),定义在 `agent/core/prompts/knowledge.py`。
+**Prompt**:`REFLECT_PROMPT`(压缩时)和 `COMPLETION_REFLECT_PROMPT`(任务完成后),定义在 `cyber_agent/core/prompts/knowledge.py`。
 
 
 **已知问题**:任务完成时触发的 reflection 使用 `config.knowledge.get_reflect_prompt()`(`runner.py:1249`),没有区分压缩场景和完成场景。应该在完成场景使用 `get_completion_reflect_prompt()`。
 **已知问题**:任务完成时触发的 reflection 使用 `config.knowledge.get_reflect_prompt()`(`runner.py:1249`),没有区分压缩场景和完成场景。应该在完成场景使用 `get_completion_reflect_prompt()`。
 
 
@@ -37,7 +37,7 @@
 
 
 **目的**:评估被注入的知识是否有用,记录到本地 `knowledge_log.json`。
 **目的**:评估被注入的知识是否有用,记录到本地 `knowledge_log.json`。
 
 
-**触发时机**(详见 `agent/docs/cognition-log.md`):
+**触发时机**(详见 `cyber_agent/docs/cognition-log.md`):
 - Goal 完成时(`store.py:update_goal`,设置 `pending_knowledge_eval` 标志)
 - Goal 完成时(`store.py:update_goal`,设置 `pending_knowledge_eval` 标志)
 - 压缩前(必须在压缩前完成评估,否则执行上下文丢失)
 - 压缩前(必须在压缩前完成评估,否则执行上下文丢失)
 - 任务结束时(兜底)
 - 任务结束时(兜底)
@@ -176,7 +176,7 @@ Trace 模型新增字段:
                                            # None = 从未被记忆反思处理
                                            # None = 从未被记忆反思处理
 ```
 ```
 
 
-反思摘要不存在 Trace 模型中,而是作为 `reflection` 事件写入 `cognition_log.json`(详见 `agent/docs/cognition-log.md`)。
+反思摘要不存在 Trace 模型中,而是作为 `reflection` 事件写入 `cognition_log.json`(详见 `cyber_agent/docs/cognition-log.md`)。
 
 
 - Agent run 产生新 message → `reflected_at_sequence` 自然落后于实际 sequence
 - Agent run 产生新 message → `reflected_at_sequence` 自然落后于实际 sequence
 - 记忆反思完成 → 更新 `reflected_at_sequence` 为当前最新 sequence
 - 记忆反思完成 → 更新 `reflected_at_sequence` 为当前最新 sequence
@@ -283,7 +283,7 @@ if branch_type == "reflection":
 
 
 **2. Trace 模型扩展**
 **2. Trace 模型扩展**
 
 
-`agent/trace/models.py:Trace` 新增字段:
+`cyber_agent/trace/models.py:Trace` 新增字段:
 
 
 ```python
 ```python
 reflected_at_sequence: Optional[int] = None    # 上次记忆反思的 sequence
 reflected_at_sequence: Optional[int] = None    # 上次记忆反思的 sequence
@@ -292,7 +292,7 @@ reflected_at_sequence: Optional[int] = None    # 上次记忆反思的 sequence
 
 
 **3. RunConfig 扩展**
 **3. RunConfig 扩展**
 
 
-`agent/core/runner.py:RunConfig` 新增可选字段:
+`cyber_agent/core/runner.py:RunConfig` 新增可选字段:
 
 
 ```python
 ```python
 memory: Optional[MemoryConfig] = None
 memory: Optional[MemoryConfig] = None
@@ -300,7 +300,7 @@ memory: Optional[MemoryConfig] = None
 
 
 **4. KnowledgeConfig 扩展**
 **4. KnowledgeConfig 扩展**
 
 
-`agent/core/runner.py:KnowledgeConfig`(或对应类)新增字段:
+`cyber_agent/core/runner.py:KnowledgeConfig`(或对应类)新增字段:
 
 
 ```python
 ```python
 reflect_auto_commit: bool = False
 reflect_auto_commit: bool = False
@@ -356,10 +356,10 @@ async def dream() -> ToolResult:
 
 
 **4. 提取审核 CLI 流程**
 **4. 提取审核 CLI 流程**
 
 
-为支持"提取-审核-提交"两阶段(见第三节),新增 `agent/cli/extraction_review.py` 模块。**不是 Agent 工具**(Agent 不应自我审核),是 CLI 内部模块 + 独立可执行脚本:
+为支持"提取-审核-提交"两阶段(见第三节),新增 `cyber_agent/cli/extraction_review.py` 模块。**不是 Agent 工具**(Agent 不应自我审核),是 CLI 内部模块 + 独立可执行脚本:
 
 
 ```python
 ```python
-# agent/cli/extraction_review.py
+# cyber_agent/cli/extraction_review.py
 
 
 async def list_pending(trace_id: str) -> list[PendingExtraction]:
 async def list_pending(trace_id: str) -> list[PendingExtraction]:
     """读 cognition_log,返回 type=extraction_pending 且未 reviewed 的条目"""
     """读 cognition_log,返回 type=extraction_pending 且未 reviewed 的条目"""
@@ -379,11 +379,11 @@ async def commit_approved(trace_id: str) -> CommitReport:
 可独立调用:
 可独立调用:
 
 
 ```bash
 ```bash
-python -m agent.cli.extraction_review --trace XXX --list
-python -m agent.cli.extraction_review --trace XXX --commit
+python -m cyber_agent.cli.extraction_review --trace XXX --list
+python -m cyber_agent.cli.extraction_review --trace XXX --commit
 ```
 ```
 
 
-**集成到现有交互式 CLI**(`agent/cli/interactive.py:174` 的菜单)扩展两项:
+**集成到现有交互式 CLI**(`cyber_agent/cli/interactive.py:174` 的菜单)扩展两项:
 
 
 ```
 ```
   1. 插入干预消息并继续
   1. 插入干预消息并继续
@@ -533,7 +533,7 @@ Memory 是 opt-in 的增量能力。但**知识提取的提交行为变了**:
 4. `[OPEN]` **Per-trace 反思的成本控制**:很短的 trace 不值得反思。当前 `per_trace_reflect` 无下限阈值,所有 `reflected_at_sequence < last_sequence` 的 trace 都会反思。
 4. `[OPEN]` **Per-trace 反思的成本控制**:很短的 trace 不值得反思。当前 `per_trace_reflect` 无下限阈值,所有 `reflected_at_sequence < last_sequence` 的 trace 都会反思。
 5. `[OPEN]` **Knowledge eval 结果回传 KnowHub**:仍然只存本地 cognition_log。
 5. `[OPEN]` **Knowledge eval 结果回传 KnowHub**:仍然只存本地 cognition_log。
 6. `[DECIDED]` **Dream 中评估趋势的呈现方式** → LLM 直接读 cognition_log 原始事件。见 `dream.py:_build_reflect_input`,把 query / evaluation / extraction_pending / extraction_committed 事件摘要化后一并塞给 LLM,不做预计算统计。
 6. `[DECIDED]` **Dream 中评估趋势的呈现方式** → LLM 直接读 cognition_log 原始事件。见 `dream.py:_build_reflect_input`,把 query / evaluation / extraction_pending / extraction_committed 事件摘要化后一并塞给 LLM,不做预计算统计。
-7. `[DECIDED]` **Dream 操作的实现形式** → 两者都提供。Agent 主动调用走 `dream` 工具(`agent/tools/builtin/memory.py`,`memory` 组),外部调度走 `AgentRunner.dream()` 方法。
+7. `[DECIDED]` **Dream 操作的实现形式** → 两者都提供。Agent 主动调用走 `dream` 工具(`cyber_agent/tools/builtin/memory.py`,`memory` 组),外部调度走 `AgentRunner.dream()` 方法。
 8. `[OPEN]` **未 review 的 pending 提取何时清理**:目前没有 TTL,pending 无限期累积。等观察积压速度再定(例如 30 天未 review 自动 discard / 归档)。
 8. `[OPEN]` **未 review 的 pending 提取何时清理**:目前没有 TTL,pending 无限期累积。等观察积压速度再定(例如 30 天未 review 自动 discard / 归档)。
 9. `[OPEN]` **review 的"edit"分支允许多深**:初版只支持改 markdown 字段(task/content/score/tags)。改 type 或 metadata 目前需 discard 重写。
 9. `[OPEN]` **review 的"edit"分支允许多深**:初版只支持改 markdown 字段(task/content/score/tags)。改 type 或 metadata 目前需 discard 重写。
 10. `[OPEN]` **批量 review 的辅助能力**:当前逐条看。未做批量 approve / 相似条目去重 / LLM 预筛。
 10. `[OPEN]` **批量 review 的辅助能力**:当前逐条看。未做批量 approve / 相似条目去重 / LLM 预筛。
@@ -549,36 +549,36 @@ Memory 是 opt-in 的增量能力。但**知识提取的提交行为变了**:
 
 
 | 改动 | 位置 |
 | 改动 | 位置 |
 |---|---|
 |---|---|
-| Trace 新字段 `reflected_at_sequence` | `agent/trace/models.py:Trace` |
-| cognition_log 事件 schema(含新增的 extraction_pending/reviewed/committed + reflection) | `agent/trace/store.py:append_cognition_event` docstring |
+| Trace 新字段 `reflected_at_sequence` | `cyber_agent/trace/models.py:Trace` |
+| cognition_log 事件 schema(含新增的 extraction_pending/reviewed/committed + reflection) | `cyber_agent/trace/store.py:append_cognition_event` docstring |
 
 
 ### 10.2 提取-审核-提交两阶段
 ### 10.2 提取-审核-提交两阶段
 
 
 | 职责 | 位置 |
 | 职责 | 位置 |
 |---|---|
 |---|---|
-| LLM 暂存用工具(core 组默认可见) | `agent/tools/builtin/knowledge.py:knowledge_save_pending` |
-| 反思 prompts(已改为调 `knowledge_save_pending`) | `agent/core/prompts/knowledge.py` |
+| LLM 暂存用工具(core 组默认可见) | `cyber_agent/tools/builtin/knowledge.py:knowledge_save_pending` |
+| 反思 prompts(已改为调 `knowledge_save_pending`) | `cyber_agent/core/prompts/knowledge.py` |
 | Auto-commit 开关(默认 False) | `KnowledgeConfig.reflect_auto_commit` |
 | Auto-commit 开关(默认 False) | `KnowledgeConfig.reflect_auto_commit` |
-| 反思侧分支退出时的 auto-commit hook | `agent/core/runner.py` 反射分支退出分支内 |
-| 核心逻辑(list_pending / review_one / commit_approved / auto_commit_branch) | `agent/trace/extraction_review.py` |
-| **独立 CLI 入口** | `python -m agent.cli.extraction_review --trace <ID> [--list/--list-all/--review/--commit]` |
-| **交互式菜单入口** | `agent/cli/interactive.py` 菜单项 8(review)/ 9(commit) |
-| **HTTP API 入口** | `GET /api/traces/{tid}/extractions`、`POST .../extractions/{eid}/review`、`POST .../extractions/commit`(见 `agent/trace/run_api.py`) |
+| 反思侧分支退出时的 auto-commit hook | `cyber_agent/core/runner.py` 反射分支退出分支内 |
+| 核心逻辑(list_pending / review_one / commit_approved / auto_commit_branch) | `cyber_agent/trace/extraction_review.py` |
+| **独立 CLI 入口** | `python -m cyber_agent.cli.extraction_review --trace <ID> [--list/--list-all/--review/--commit]` |
+| **交互式菜单入口** | `cyber_agent/cli/interactive.py` 菜单项 8(review)/ 9(commit) |
+| **HTTP API 入口** | `GET /api/traces/{tid}/extractions`、`POST .../extractions/{eid}/review`、`POST .../extractions/commit`(见 `cyber_agent/trace/run_api.py`) |
 
 
-三种入口共享同一个核心模块 `agent/trace/extraction_review.py`。
+三种入口共享同一个核心模块 `cyber_agent/trace/extraction_review.py`。
 
 
 ### 10.3 Memory + Dream
 ### 10.3 Memory + Dream
 
 
 | 职责 | 位置 |
 | 职责 | 位置 |
 |---|---|
 |---|---|
-| MemoryConfig 定义 | `agent/core/memory.py:MemoryConfig` |
-| 记忆文件加载(支持 glob + 去重) | `agent/core/memory.py:load_memory_files` |
-| 记忆注入格式 | `agent/core/memory.py:format_memory_injection` |
-| 注入到 system prompt | `agent/core/runner.py:_build_system_prompt`(memory 段落在 skills 段之后) |
-| Dream per-trace 反思 | `agent/core/dream.py:per_trace_reflect` |
-| Dream 跨 trace 整合 | `agent/core/dream.py:cross_trace_integrate` |
-| Dream 顶层入口 | `agent/core/dream.py:run_dream` |
-| **Agent 工具入口(memory 组)** | `agent/tools/builtin/memory.py:dream` |
+| MemoryConfig 定义 | `cyber_agent/core/memory.py:MemoryConfig` |
+| 记忆文件加载(支持 glob + 去重) | `cyber_agent/core/memory.py:load_memory_files` |
+| 记忆注入格式 | `cyber_agent/core/memory.py:format_memory_injection` |
+| 注入到 system prompt | `cyber_agent/core/runner.py:_build_system_prompt`(memory 段落在 skills 段之后) |
+| Dream per-trace 反思 | `cyber_agent/core/dream.py:per_trace_reflect` |
+| Dream 跨 trace 整合 | `cyber_agent/core/dream.py:cross_trace_integrate` |
+| Dream 顶层入口 | `cyber_agent/core/dream.py:run_dream` |
+| **Agent 工具入口(memory 组)** | `cyber_agent/tools/builtin/memory.py:dream` |
 | **外部调度入口** | `AgentRunner.dream(memory_config, trace_filter=..., reflect_model=..., dream_model=...)` |
 | **外部调度入口** | `AgentRunner.dream(memory_config, trace_filter=..., reflect_model=..., dream_model=...)` |
 | 默认 prompts | `dream.py:DEFAULT_REFLECT_PROMPT` / `DEFAULT_DREAM_PROMPT`(可通过 `MemoryConfig.reflect_prompt`/`dream_prompt` 覆盖) |
 | 默认 prompts | `dream.py:DEFAULT_REFLECT_PROMPT` / `DEFAULT_DREAM_PROMPT`(可通过 `MemoryConfig.reflect_prompt`/`dream_prompt` 覆盖) |
 
 
@@ -593,7 +593,7 @@ RunConfig(knowledge=KnowledgeConfig(reflect_auto_commit=True))
 
 
 要让一个 Agent 变成 memory-bearing:
 要让一个 Agent 变成 memory-bearing:
 ```python
 ```python
-from agent.core.memory import MemoryConfig
+from cyber_agent.core.memory import MemoryConfig
 
 
 RunConfig(
 RunConfig(
     memory=MemoryConfig(
     memory=MemoryConfig(

+ 2 - 2
agent/docs/multimodal.md → cyber_agent/docs/multimodal.md

@@ -21,7 +21,7 @@ Prompt 层 (SimplePrompt) → OpenAI 格式消息 → Provider 层适配 → 模
 
 
 ### 1. Prompt 层多模态支持
 ### 1. Prompt 层多模态支持
 
 
-**实现位置**:`agent/llm/prompts/wrapper.py:SimplePrompt`
+**实现位置**:`cyber_agent/llm/prompts/wrapper.py:SimplePrompt`
 
 
 **功能**:构建 OpenAI 格式的多模态消息
 **功能**:构建 OpenAI 格式的多模态消息
 
 
@@ -54,7 +54,7 @@ messages = prompt.build_messages(
 
 
 ### 2. Gemini Provider 适配
 ### 2. Gemini Provider 适配
 
 
-**实现位置**:`agent/llm/gemini.py:_convert_messages_to_gemini`
+**实现位置**:`cyber_agent/llm/gemini.py:_convert_messages_to_gemini`
 
 
 **功能**:将 OpenAI 多模态格式转换为 Gemini 格式
 **功能**:将 OpenAI 多模态格式转换为 Gemini 格式
 
 

+ 0 - 0
agent/docs/prompt-guidelines.md → cyber_agent/docs/prompt-guidelines.md


+ 1 - 1
agent/docs/scope-design.md → cyber_agent/docs/scope-design.md

@@ -296,7 +296,7 @@ def rank_by_scope_priority(results, context):
 
 
 ## 实现位置
 ## 实现位置
 
 
-- `agent/tools/builtin/knowledge.py`:知识管理工具(KnowHub API 封装)+ KnowledgeConfig
+- `cyber_agent/tools/builtin/knowledge.py`:知识管理工具(KnowHub API 封装)+ KnowledgeConfig
 
 
 ## 扩展性
 ## 扩展性
 
 

+ 22 - 22
agent/docs/skills.md → cyber_agent/docs/skills.md

@@ -8,8 +8,8 @@ Skills 是 Agent 的领域知识库,存储在 Markdown 文件中。
 
 
 | 类型 | 加载位置 | 加载时机 | 文件位置 |
 | 类型 | 加载位置 | 加载时机 | 文件位置 |
 |------|---------|---------|---------|
 |------|---------|---------|---------|
-| **Core Skill** | System Prompt | Agent 启动时自动加载 | `agent/skills/core.md` |
-| **内置 Skill** | 对话消息 | 模型调用 `skill` 工具时 | `agent/skills/{name}/` |
+| **Core Skill** | System Prompt | Agent 启动时自动加载 | `cyber_agent/skill/skills/core.md` |
+| **内置 Skill** | 对话消息 | 模型调用 `skill` 工具时 | `cyber_agent/skill/skills/{name}/` |
 | **自定义 Skill** | 对话消息 | 模型调用 `skill` 工具时 | `./skills/{name}.md` |
 | **自定义 Skill** | 对话消息 | 模型调用 `skill` 工具时 | `./skills/{name}.md` |
 
 
 ### Core Skill
 ### Core Skill
@@ -19,11 +19,11 @@ Skills 是 Agent 的领域知识库,存储在 Markdown 文件中。
 - Step 管理(计划、执行、进度)
 - Step 管理(计划、执行、进度)
 - 其他系统级功能
 - 其他系统级功能
 
 
-**位置**:`agent/skills/core.md`
+**位置**:`cyber_agent/skill/skills/core.md`
 
 
 **加载方式**:
 **加载方式**:
 - 框架自动注入到 System Prompt
 - 框架自动注入到 System Prompt
-- `load_skills_from_dir()` 总是自动加载 `agent/skills/` 中的所有 skills(包括 `core.md`)
+- `load_skills_from_dir()` 总是自动加载 `cyber_agent/skill/skills/` 中的所有 skills(包括 `core.md`)
 
 
 ### 内置 Skill
 ### 内置 Skill
 
 
@@ -32,7 +32,7 @@ Skills 是 Agent 的领域知识库,存储在 Markdown 文件中。
 - browser_use(浏览器自动化)
 - browser_use(浏览器自动化)
 - 其他领域 skills
 - 其他领域 skills
 
 
-**位置**:`agent/skills/{name}/`
+**位置**:`cyber_agent/skill/skills/{name}/`
 
 
 **加载方式**:模型调用 `skill` 工具
 **加载方式**:模型调用 `skill` 工具
 
 
@@ -95,8 +95,8 @@ mkdir skills
 **方式 1:自动加载到 System Prompt**
 **方式 1:自动加载到 System Prompt**
 
 
 ```python
 ```python
-from agent import AgentRunner
-from agent.llm import create_gemini_llm_call
+from cyber_agent import AgentRunner
+from cyber_agent.llm import create_gemini_llm_call
 import os
 import os
 
 
 # 加载自定义 skills 到 System Prompt
 # 加载自定义 skills 到 System Prompt
@@ -106,16 +106,16 @@ runner = AgentRunner(
 )
 )
 
 
 # 结果:
 # 结果:
-# - agent/skills/core.md 自动加载(总是)
-# - agent/skills/ 中的其他 skills 自动加载
+# - cyber_agent/skill/skills/core.md 自动加载(总是)
+# - cyber_agent/skill/skills/ 中的其他 skills 自动加载
 # - ./skills/ 中的 skills 也会自动加载
 # - ./skills/ 中的 skills 也会自动加载
 ```
 ```
 
 
 **方式 2:运行时动态加载**
 **方式 2:运行时动态加载**
 
 
 ```python
 ```python
-from agent import AgentRunner
-from agent.llm import create_gemini_llm_call
+from cyber_agent import AgentRunner
+from cyber_agent.llm import create_gemini_llm_call
 import os
 import os
 
 
 runner = AgentRunner(
 runner = AgentRunner(
@@ -131,7 +131,7 @@ async for item in runner.run(
 ```
 ```
 
 
 **Agent 工作流**:
 **Agent 工作流**:
-1. Agent 启动时自动加载 `agent/skills/` 中的所有 skills(包括 `core.md`)
+1. Agent 启动时自动加载 `cyber_agent/skill/skills/` 中的所有 skills(包括 `core.md`)
 2. 如果提供了 `skills_dir`,也会加载自定义 skills 到 System Prompt
 2. 如果提供了 `skills_dir`,也会加载自定义 skills 到 System Prompt
 3. Agent 接收任务
 3. Agent 接收任务
 4. Agent 可以调用 `list_skills()` 查看可用 skills
 4. Agent 可以调用 `list_skills()` 查看可用 skills
@@ -142,7 +142,7 @@ async for item in runner.run(
 ### 4. 手动测试
 ### 4. 手动测试
 
 
 ```python
 ```python
-from agent.tools.builtin.skill import list_skills, skill
+from cyber_agent.tools.builtin.skill import list_skills, skill
 
 
 # 列出所有 skills
 # 列出所有 skills
 result = await list_skills()
 result = await list_skills()
@@ -164,7 +164,7 @@ runner = AgentRunner(
     # 不需要指定 skills_dir,内置 skills 会自动加载
     # 不需要指定 skills_dir,内置 skills 会自动加载
 )
 )
 
 
-# 结果:agent/skills/ 中的所有 skills 都会被加载到 System Prompt
+# 结果:cyber_agent/skill/skills/ 中的所有 skills 都会被加载到 System Prompt
 ```
 ```
 
 
 ### 可选加载额外的自定义 Skills
 ### 可选加载额外的自定义 Skills
@@ -175,7 +175,7 @@ runner = AgentRunner(
     skills_dir="./my-custom-skills",  # 可选:加载额外的自定义 skills
     skills_dir="./my-custom-skills",  # 可选:加载额外的自定义 skills
 )
 )
 
 
-# 结果:agent/skills/ + ./my-custom-skills/ 中的所有 skills 都会被加载
+# 结果:cyber_agent/skill/skills/ + ./my-custom-skills/ 中的所有 skills 都会被加载
 ```
 ```
 
 
 ### 动态加载(运行时)
 ### 动态加载(运行时)
@@ -188,12 +188,12 @@ skill(skill_name="browser-use")
 
 
 # 搜索路径(优先级):
 # 搜索路径(优先级):
 # 1. ./skills/browser-use.md         ← 项目自定义
 # 1. ./skills/browser-use.md         ← 项目自定义
-# 2. ./agent/skills/browser-use/     ← 框架内置
+# 2. ./cyber_agent/skill/skills/browser-use/     ← 框架内置
 ```
 ```
 
 
 **实现位置**:
 **实现位置**:
-- `agent/skill/skill_loader.py:load_skills_from_dir()` - 自动加载机制
-- `agent/tools/builtin/skill.py` - skill 工具(动态加载)
+- `cyber_agent/skill/skill_loader.py:load_skills_from_dir()` - 自动加载机制
+- `cyber_agent/tools/builtin/skill.py` - skill 工具(动态加载)
 
 
 详见 [`SKILLS_SYSTEM.md`](../SKILLS_SYSTEM.md)
 详见 [`SKILLS_SYSTEM.md`](../SKILLS_SYSTEM.md)
 
 
@@ -214,7 +214,7 @@ skill(skill_name="browser-use")
 
 
 **返回**:Skills 列表,包含名称、ID 和简短描述
 **返回**:Skills 列表,包含名称、ID 和简短描述
 
 
-**实现位置**:`agent/tools/builtin/skill.py`
+**实现位置**:`cyber_agent/tools/builtin/skill.py`
 
 
 ## 环境变量
 ## 环境变量
 
 
@@ -229,6 +229,6 @@ SKILLS_DIR=./skills
 
 
 - 完整文档:[`SKILLS_SYSTEM.md`](../SKILLS_SYSTEM.md)
 - 完整文档:[`SKILLS_SYSTEM.md`](../SKILLS_SYSTEM.md)
 - 示例:`examples/feature_extract/run.py`
 - 示例:`examples/feature_extract/run.py`
-- Skill 文件:`agent/skills/` 目录
-- 工具实现:`agent/tools/builtin/skill.py`
-- 加载器实现:`agent/skill/skill_loader.py`
+- Skill 文件:`cyber_agent/skill/skills/` 目录
+- 工具实现:`cyber_agent/tools/builtin/skill.py`
+- 加载器实现:`cyber_agent/skill/skill_loader.py`

+ 5 - 5
agent/docs/tools-refactor-plan.md → cyber_agent/docs/tools-refactor-plan.md

@@ -171,7 +171,7 @@ async def content_detail(
 ### 内部实现(不注册给 LLM)
 ### 内部实现(不注册给 LLM)
 
 
 ```
 ```
-agent/tools/builtin/content/
+cyber_agent/tools/builtin/content/
 ├── __init__.py           # 空
 ├── __init__.py           # 空
 ├── tools.py              # 3 个 @tool 入口
 ├── tools.py              # 3 个 @tool 入口
 ├── registry.py           # PLATFORM_IMPLS 路由表
 ├── registry.py           # PLATFORM_IMPLS 路由表
@@ -183,7 +183,7 @@ agent/tools/builtin/content/
 
 
 ### 迁移步骤
 ### 迁移步骤
 
 
-1. 新建 `agent/tools/builtin/content/` 目录结构
+1. 新建 `cyber_agent/tools/builtin/content/` 目录结构
 2. 把 `search.py` 的 `search_posts` / `select_post` / `get_search_suggestions` 逻辑移到 `content/platforms/aigc_channel.py`,拆成按 channel 分的纯函数
 2. 把 `search.py` 的 `search_posts` / `select_post` / `get_search_suggestions` 逻辑移到 `content/platforms/aigc_channel.py`,拆成按 channel 分的纯函数
 3. 把 `crawler.py` 的 `youtube_search` / `youtube_detail` / `x_search` 移到 `content/platforms/`
 3. 把 `crawler.py` 的 `youtube_search` / `youtube_detail` / `x_search` 移到 `content/platforms/`
 4. 在 `content/tools.py` 写 3 个 @tool 入口,内部调用路由
 4. 在 `content/tools.py` 写 3 个 @tool 入口,内部调用路由
@@ -227,7 +227,7 @@ Step 2(需要细看时):        content_detail(platform, id, extras)
 
 
 ### 现状
 ### 现状
 
 
-28 个 `@tool`(在 `agent/tools/builtin/browser/baseClass.py`),按任务语义分组:
+28 个 `@tool`(在 `cyber_agent/tools/builtin/browser/baseClass.py`),按任务语义分组:
 
 
 | 类别 | 数量 | 工具 |
 | 类别 | 数量 | 工具 |
 |---|---|---|
 |---|---|---|
@@ -411,7 +411,7 @@ async def browser_interact(action, index, text, path, keys, clear):
 2. 把 30 个原 `@tool` 函数**去掉 @tool 装饰器**,降级为内部函数 `_navigate_to_url` / `_click_element` 等
 2. 把 30 个原 `@tool` 函数**去掉 @tool 装饰器**,降级为内部函数 `_navigate_to_url` / `_click_element` 等
 3. 在 `baseClass.py` 底部新增 11 个 @tool 入口函数,每个内部根据 action 路由到对应的内部函数
 3. 在 `baseClass.py` 底部新增 11 个 @tool 入口函数,每个内部根据 action 路由到对应的内部函数
 4. 从 `browser/__init__.py` 更新导出列表
 4. 从 `browser/__init__.py` 更新导出列表
-5. 更新 `agent/docs/tools.md` 的浏览器工具小节
+5. 更新 `cyber_agent/docs/tools.md` 的浏览器工具小节
 6. 更新现有的浏览器 prompt(破坏性)
 6. 更新现有的浏览器 prompt(破坏性)
 
 
 ### 未决策的设计问题
 ### 未决策的设计问题
@@ -441,7 +441,7 @@ async def browser_interact(action, index, text, path, keys, clear):
 1. **破坏性改动集中做**——所有重命名、删除、合并都在同一个 PR 里完成,不要分期做。分期反而让用户迁移更痛苦
 1. **破坏性改动集中做**——所有重命名、删除、合并都在同一个 PR 里完成,不要分期做。分期反而让用户迁移更痛苦
 2. **每个工具族都要有对应的 CLI 入口 + 自包含 `if __name__ == "__main__"`**——参考 toolhub / librarian 已有的模式
 2. **每个工具族都要有对应的 CLI 入口 + 自包含 `if __name__ == "__main__"`**——参考 toolhub / librarian 已有的模式
 3. **对应的 skill 写到 `~/.claude/skills/`**——让 Claude Code 等外部 Agent 能用
 3. **对应的 skill 写到 `~/.claude/skills/`**——让 Claude Code 等外部 Agent 能用
-4. **破坏性改动后同步更新 `agent/docs/tools.md` 和所有现存 prompt**
+4. **破坏性改动后同步更新 `cyber_agent/docs/tools.md` 和所有现存 prompt**
 
 
 ---
 ---
 
 

+ 15 - 15
agent/docs/tools.md → cyber_agent/docs/tools.md

@@ -106,8 +106,8 @@ inject_params={
 - 工具执行前:注入 `hidden_params` 和 `inject_params`
 - 工具执行前:注入 `hidden_params` 和 `inject_params`
 
 
 **实现位置**:
 **实现位置**:
-- Schema 生成:`agent/tools/schema.py:SchemaGenerator.generate()`
-- 参数注入:`agent/tools/registry.py:ToolRegistry.execute()`
+- Schema 生成:`cyber_agent/tools/schema.py:SchemaGenerator.generate()`
+- 参数注入:`cyber_agent/tools/registry.py:ToolRegistry.execute()`
 
 
 ---
 ---
 
 
@@ -824,10 +824,10 @@ RunConfig(tools=["knowledge_search", "read_file"]) # 精确指定(优先于 to
 
 
 ### 实现位置
 ### 实现位置
 
 
-- 分组声明:`@tool(groups=[...])` — `agent/tools/registry.py`
+- 分组声明:`@tool(groups=[...])` — `cyber_agent/tools/registry.py`
 - 分组存储:`ToolRegistry._tools[name]["groups"]`
 - 分组存储:`ToolRegistry._tools[name]["groups"]`
 - 分组过滤:`ToolRegistry.get_tool_names(groups=[...])`
 - 分组过滤:`ToolRegistry.get_tool_names(groups=[...])`
-- 配置入口:`RunConfig.tool_groups` — `agent/core/runner.py`
+- 配置入口:`RunConfig.tool_groups` — `cyber_agent/core/runner.py`
 
 
 ### 分组一览
 ### 分组一览
 
 
@@ -842,8 +842,8 @@ RunConfig(tools=["knowledge_search", "read_file"]) # 精确指定(优先于 to
 框架提供一组内置的基础工具,用于文件读取、编辑、搜索和命令执行等常见任务。这些工具参考了 [opencode](https://github.com/anomalyco/opencode) 的成熟设计,在 Python 中重新实现。
 框架提供一组内置的基础工具,用于文件读取、编辑、搜索和命令执行等常见任务。这些工具参考了 [opencode](https://github.com/anomalyco/opencode) 的成熟设计,在 Python 中重新实现。
 
 
 **实现位置**:
 **实现位置**:
-- 工具实现:`agent/tools/builtin/`
-- 适配器层:`agent/tools/adapters/`
+- 工具实现:`cyber_agent/tools/builtin/`
+- 适配器层:`cyber_agent/tools/adapters/`
 - OpenCode 参考:`vendor/opencode/` (git submodule)
 - OpenCode 参考:`vendor/opencode/` (git submodule)
 
 
 **详细文档**:参考 [`docs/tools-adapters.md`](./tools-adapters.md)
 **详细文档**:参考 [`docs/tools-adapters.md`](./tools-adapters.md)
@@ -897,7 +897,7 @@ RunConfig(tools=["knowledge_search", "read_file"]) # 精确指定(优先于 to
 
 
 **关于标签/标题:** `read_images` 的拼图**不显示文件名**,只显示索引序号——因为本地文件名(如 `IMG_1234.jpg`)对 LLM 理解内容没有帮助,而索引到原始路径的对照表通过返回文本提供,LLM 可以用"第 3 张"这种引用方式精确指代。对比之下 `content_search` 的拼图**会**显示 label(帖子/视频标题),因为这些是内容型元数据,有实际信息量。这一差异反映在 `build_image_grid(labels=...)` 参数上:传 `None` 只画序号,传列表则在每格下方画标题。
 **关于标签/标题:** `read_images` 的拼图**不显示文件名**,只显示索引序号——因为本地文件名(如 `IMG_1234.jpg`)对 LLM 理解内容没有帮助,而索引到原始路径的对照表通过返回文本提供,LLM 可以用"第 3 张"这种引用方式精确指代。对比之下 `content_search` 的拼图**会**显示 label(帖子/视频标题),因为这些是内容型元数据,有实际信息量。这一差异反映在 `build_image_grid(labels=...)` 参数上:传 `None` 只画序号,传列表则在每格下方画标题。
 
 
-网格和降采样的实现在 `agent/tools/utils/image.py`,`content_search` 等内容工具也复用同一套拼图逻辑。
+网格和降采样的实现在 `cyber_agent/tools/utils/image.py`,`content_search` 等内容工具也复用同一套拼图逻辑。
 
 
 ### Agent 工具
 ### Agent 工具
 
 
@@ -975,11 +975,11 @@ async def agent(
 
 
 #### SDK / CLI 调用
 #### SDK / CLI 调用
 
 
-公开 SDK 入口:`agent.invoke_agent()`(定义在 `agent/client.py`),和 `agent` 工具签名一致,路由规则相同。任何 Python 进程只要装了 `cyber-agent` 包就能调用:
+公开 SDK 入口:`cyber_agent.invoke_agent()`(定义在 `cyber_agent/client.py`),和 `agent` 工具签名一致,路由规则相同。任何 Python 进程只要装了 `cyber-agent` 包就能调用:
 
 
 ```python
 ```python
 import asyncio
 import asyncio
-from agent import invoke_agent
+from cyber_agent import invoke_agent
 
 
 result = asyncio.run(invoke_agent(
 result = asyncio.run(invoke_agent(
     agent_type="remote_librarian",
     agent_type="remote_librarian",
@@ -998,7 +998,7 @@ result = asyncio.run(invoke_agent(
 
 
 - 本地 `agent_type`:在项目 `presets.json` 中定义(工具权限、system prompt、skills 等),支持从 `.prompt` 文件加载 system prompt
 - 本地 `agent_type`:在项目 `presets.json` 中定义(工具权限、system prompt、skills 等),支持从 `.prompt` 文件加载 system prompt
 - 远端 `agent_type`:在**服务器** `knowhub/agents/` 下定义(如 `knowhub/agents/research.py`),客户端 presets 不需要配置
 - 远端 `agent_type`:在**服务器** `knowhub/agents/` 下定义(如 `knowhub/agents/research.py`),客户端 presets 不需要配置
-- 详见 `agent/docs/architecture.md` 的 "Agent 预设" 章节
+- 详见 `cyber_agent/docs/architecture.md` 的 "Agent 预设" 章节
 
 
 ### Evaluate 工具
 ### Evaluate 工具
 
 
@@ -1032,12 +1032,12 @@ async def evaluate(
 - `sub_trace_ids` 记录所有创建的 Sub-Trace
 - `sub_trace_ids` 记录所有创建的 Sub-Trace
 - Goal 完成后,`summary` 包含格式化的汇总结果
 - Goal 完成后,`summary` 包含格式化的汇总结果
 
 
-**实现位置**:`agent/tools/builtin/subagent.py`
+**实现位置**:`cyber_agent/tools/builtin/subagent.py`
 
 
 ### 快速使用
 ### 快速使用
 
 
 ```python
 ```python
-from agent.tools.builtin import read_file, edit_file, bash_command
+from cyber_agent.tools.builtin import read_file, edit_file, bash_command
 
 
 # 读取文件
 # 读取文件
 result = await read_file(file_path="config.py", limit=100)
 result = await read_file(file_path="config.py", limit=100)
@@ -1361,7 +1361,7 @@ async def search_notes(
 参数解析、asyncio.run、结果输出这些 CLI 样板代码**直接内联**在工具文件里,不要抽取到共享 `cli.py` 模块——这样每个工具文件可以独立迁移到其他项目。
 参数解析、asyncio.run、结果输出这些 CLI 样板代码**直接内联**在工具文件里,不要抽取到共享 `cli.py` 模块——这样每个工具文件可以独立迁移到其他项目。
 
 
 ```python
 ```python
-# 示例:agent/tools/builtin/toolhub.py 末尾
+# 示例:cyber_agent/tools/builtin/toolhub.py 末尾
 if __name__ == "__main__":
 if __name__ == "__main__":
     import sys, asyncio, os, uuid
     import sys, asyncio, os, uuid
 
 
@@ -1462,12 +1462,12 @@ python <绝对路径>/tool.py <子命令> --key=value
 <调用后怎么解读输出,典型 workflow>
 <调用后怎么解读输出,典型 workflow>
 ```
 ```
 
 
-**尺寸原则:** SKILL.md **越短越好**。它每次触发时都会进入 context 占据 token。和 `agent/docs/tools.md` 的职责区分:
+**尺寸原则:** SKILL.md **越短越好**。它每次触发时都会进入 context 占据 token。和 `cyber_agent/docs/tools.md` 的职责区分:
 
 
 | 文件 | 读者 | 触发 | 长度 |
 | 文件 | 读者 | 触发 | 长度 |
 |------|------|------|------|
 |------|------|------|------|
 | `SKILL.md` | **运行时的 Claude Code**(动态加载) | 每次匹配自动加载到 context | **短**(20 行以内为佳) |
 | `SKILL.md` | **运行时的 Claude Code**(动态加载) | 每次匹配自动加载到 context | **短**(20 行以内为佳) |
-| `agent/docs/tools.md` | **开发者**(静态阅读) | 从不自动加载 | 长,可以详细展开原理、设计取舍 |
+| `cyber_agent/docs/tools.md` | **开发者**(静态阅读) | 从不自动加载 | 长,可以详细展开原理、设计取舍 |
 
 
 SKILL.md 只写"调用这个工具所需的最小信息集",原理和细节放到 docs。
 SKILL.md 只写"调用这个工具所需的最小信息集",原理和细节放到 docs。
 
 

+ 14 - 14
agent/docs/trace-api.md → cyber_agent/docs/trace-api.md

@@ -6,10 +6,10 @@
 
 
 ## 架构概览
 ## 架构概览
 
 
-**职责定位**:`agent/trace` 模块负责所有 Trace/Message 相关功能
+**职责定位**:`cyber_agent/trace` 模块负责所有 Trace/Message 相关功能
 
 
 ```
 ```
-agent/trace/
+cyber_agent/trace/
 ├── models.py          # Trace/Message 数据模型
 ├── models.py          # Trace/Message 数据模型
 ├── goal_models.py     # Goal/GoalTree 数据模型
 ├── goal_models.py     # Goal/GoalTree 数据模型
 ├── protocols.py       # TraceStore 存储接口
 ├── protocols.py       # TraceStore 存储接口
@@ -70,7 +70,7 @@ trace.head_sequence   # 当前主路径头节点 sequence(用于 build_llm_mes
 - **主 Trace**:标准 UUID,例如 `2f8d3a1c-4b6e-4f9a-8c2d-1e5b7a9f3c4d`
 - **主 Trace**:标准 UUID,例如 `2f8d3a1c-4b6e-4f9a-8c2d-1e5b7a9f3c4d`
 - **Sub-Trace**:`{parent_uuid}@{mode}-{timestamp}-{seq}`,例如 `2f8d3a1c...@explore-20260204220012-001`
 - **Sub-Trace**:`{parent_uuid}@{mode}-{timestamp}-{seq}`,例如 `2f8d3a1c...@explore-20260204220012-001`
 
 
-**实现**:`agent/trace/models.py:Trace`
+**实现**:`cyber_agent/trace/models.py:Trace`
 
 
 ### Message - 执行消息
 ### Message - 执行消息
 
 
@@ -103,7 +103,7 @@ tool_msg = Message.create(
 - `assistant` 消息:优先取 content 中的 text,若无 text 则生成 "tool call: XX, XX"
 - `assistant` 消息:优先取 content 中的 text,若无 text 则生成 "tool call: XX, XX"
 - `tool` 消息:使用 tool name
 - `tool` 消息:使用 tool name
 
 
-**实现**:`agent/trace/models.py:Message`
+**实现**:`cyber_agent/trace/models.py:Message`
 
 
 ---
 ---
 
 
@@ -138,12 +138,12 @@ class TraceStore(Protocol):
     async def append_event(self, trace_id: str, event_type: str, payload: Dict) -> int: ...
     async def append_event(self, trace_id: str, event_type: str, payload: Dict) -> int: ...
 ```
 ```
 
 
-**实现**:`agent/trace/protocols.py`
+**实现**:`cyber_agent/trace/protocols.py`
 
 
 ### FileSystemTraceStore
 ### FileSystemTraceStore
 
 
 ```python
 ```python
-from agent.trace import FileSystemTraceStore
+from cyber_agent.trace import FileSystemTraceStore
 
 
 store = FileSystemTraceStore(base_path=".trace")
 store = FileSystemTraceStore(base_path=".trace")
 ```
 ```
@@ -174,7 +174,7 @@ store = FileSystemTraceStore(base_path=".trace")
 - ✅ 每个 Sub-Trace 是顶层独立目录
 - ✅ 每个 Sub-Trace 是顶层独立目录
 - ✅ Sub-Trace 有完整的 Trace 结构(meta + goal + messages + events)
 - ✅ Sub-Trace 有完整的 Trace 结构(meta + goal + messages + events)
 
 
-**实现**:`agent/trace/store.py`
+**实现**:`cyber_agent/trace/store.py`
 
 
 ---
 ---
 
 
@@ -212,7 +212,7 @@ GET /api/traces/{trace_id}/messages?mode=main_path&head=15&goal_id=3
 - `head`: 可选 sequence 值 — 指定主路径的 head(默认用 trace.head_sequence,仅 mode=main_path 有效)
 - `head`: 可选 sequence 值 — 指定主路径的 head(默认用 trace.head_sequence,仅 mode=main_path 有效)
 - `goal_id`: 可选,按 Goal 过滤
 - `goal_id`: 可选,按 Goal 过滤
 
 
-**实现**:`agent/trace/api.py`
+**实现**:`cyber_agent/trace/api.py`
 
 
 ### 控制端点
 ### 控制端点
 
 
@@ -295,7 +295,7 @@ GET /api/experiences
 
 
 返回 `./.cache/experiences.md` 的文件内容。
 返回 `./.cache/experiences.md` 的文件内容。
 
 
-**实现**:`agent/trace/run_api.py`
+**实现**:`cyber_agent/trace/run_api.py`
 
 
 ---
 ---
 
 
@@ -334,7 +334,7 @@ ws://43.106.118.91:8000/api/traces/{trace_id}/watch?since_event_id=0
 2. 自动设置父 Goal 的 `status = "completed"`
 2. 自动设置父 Goal 的 `status = "completed"`
 3. 在 `goal_updated` 事件的 `affected_goals` 中包含级联完成的父节点
 3. 在 `goal_updated` 事件的 `affected_goals` 中包含级联完成的父节点
 
 
-**实现**:`agent/trace/websocket.py`
+**实现**:`cyber_agent/trace/websocket.py`
 
 
 ---
 ---
 
 
@@ -345,7 +345,7 @@ ws://43.106.118.91:8000/api/traces/{trace_id}/watch?since_event_id=0
 并行探索多个方向:
 并行探索多个方向:
 
 
 ```python
 ```python
-from agent.goal.explore import explore_tool
+from cyber_agent.goal.explore import explore_tool
 
 
 result = await explore_tool(
 result = await explore_tool(
     current_trace_id="main_trace_id",
     current_trace_id="main_trace_id",
@@ -365,7 +365,7 @@ result = await explore_tool(
 将大任务委托给独立 Sub-Agent:
 将大任务委托给独立 Sub-Agent:
 
 
 ```python
 ```python
-from agent.goal.delegate import delegate_tool
+from cyber_agent.goal.delegate import delegate_tool
 
 
 result = await delegate_tool(
 result = await delegate_tool(
     current_trace_id="main_trace_id",
     current_trace_id="main_trace_id",
@@ -386,8 +386,8 @@ result = await delegate_tool(
 ### Agent 执行时记录
 ### Agent 执行时记录
 
 
 ```python
 ```python
-from agent import AgentRunner
-from agent.trace import FileSystemTraceStore
+from cyber_agent import AgentRunner
+from cyber_agent.trace import FileSystemTraceStore
 
 
 store = FileSystemTraceStore(base_path=".trace")
 store = FileSystemTraceStore(base_path=".trace")
 runner = AgentRunner(trace_store=store, llm_call=my_llm_fn)
 runner = AgentRunner(trace_store=store, llm_call=my_llm_fn)

+ 0 - 0
agent/llm/__init__.py → cyber_agent/llm/__init__.py


+ 0 - 0
agent/llm/claude.py → cyber_agent/llm/claude.py


+ 0 - 0
agent/llm/claude_code_oauth.py → cyber_agent/llm/claude_code_oauth.py


+ 0 - 0
agent/llm/gemini.py → cyber_agent/llm/gemini.py


+ 0 - 0
agent/llm/openrouter.py → cyber_agent/llm/openrouter.py


+ 1 - 1
agent/llm/pricing.py → cyber_agent/llm/pricing.py

@@ -151,7 +151,7 @@ class PricingCalculator:
         if env_path := os.getenv("AGENT_PRICING_CONFIG"):
         if env_path := os.getenv("AGENT_PRICING_CONFIG"):
             return env_path
             return env_path
 
 
-        # 获取 agent 包的根目录(agent/llm/pricing.py -> agent/)
+        # 获取 agent 包的根目录(cyber_agent/llm/pricing.py -> agent/)
         agent_dir = Path(__file__).parent.parent
         agent_dir = Path(__file__).parent.parent
         project_root = agent_dir.parent  # 项目根目录
         project_root = agent_dir.parent  # 项目根目录
 
 

+ 0 - 0
agent/llm/prompts/__init__.py → cyber_agent/llm/prompts/__init__.py


+ 0 - 0
agent/llm/prompts/loader.py → cyber_agent/llm/prompts/loader.py


+ 1 - 1
agent/llm/prompts/wrapper.py → cyber_agent/llm/prompts/wrapper.py

@@ -7,7 +7,7 @@ Prompt Wrapper - 为 .prompt 文件提供 Prompt 实现
 import base64
 import base64
 from pathlib import Path
 from pathlib import Path
 from typing import List, Dict, Any, Union, Optional
 from typing import List, Dict, Any, Union, Optional
-from agent.llm.prompts.loader import load_prompt, get_message
+from cyber_agent.llm.prompts.loader import load_prompt, get_message
 
 
 
 
 class SimplePrompt:
 class SimplePrompt:

+ 0 - 0
agent/llm/qwen.py → cyber_agent/llm/qwen.py


+ 0 - 0
agent/llm/usage.py → cyber_agent/llm/usage.py


+ 0 - 0
agent/llm/yescode.py → cyber_agent/llm/yescode.py


+ 2 - 2
agent/skill/__init__.py → cyber_agent/skill/__init__.py

@@ -6,8 +6,8 @@ Skill - 技能系统
 2. Skill 加载器(从 Markdown 加载技能)
 2. Skill 加载器(从 Markdown 加载技能)
 """
 """
 
 
-from agent.skill.models import Skill
-from agent.skill.skill_loader import SkillLoader, load_skills_from_dir
+from cyber_agent.skill.models import Skill
+from cyber_agent.skill.skill_loader import SkillLoader, load_skills_from_dir
 
 
 __all__ = [
 __all__ = [
     "Skill",
     "Skill",

+ 0 - 0
agent/skill/models.py → cyber_agent/skill/models.py


+ 3 - 3
agent/skill/skill_loader.py → cyber_agent/skill/skill_loader.py

@@ -39,7 +39,7 @@ from pathlib import Path
 from typing import List, Dict, Optional
 from typing import List, Dict, Optional
 import logging
 import logging
 
 
-from agent.skill.models import Skill
+from cyber_agent.skill.models import Skill
 
 
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 
 
@@ -372,7 +372,7 @@ def load_skills_from_dir(skills_dir: Optional[str] = None) -> List[Skill]:
     从目录加载所有 Skills
     从目录加载所有 Skills
 
 
     加载优先级:
     加载优先级:
-    1. 始终加载内置 skills(agent/skills/)
+    1. 始终加载内置 skills(cyber_agent/skill/skills/)
     2. 如果指定了 skills_dir,额外加载该目录的 skills
     2. 如果指定了 skills_dir,额外加载该目录的 skills
 
 
     Args:
     Args:
@@ -383,7 +383,7 @@ def load_skills_from_dir(skills_dir: Optional[str] = None) -> List[Skill]:
     """
     """
     all_skills = []
     all_skills = []
 
 
-    # 1. 加载内置 skills(agent/skill/skills/)
+    # 1. 加载内置 skills(cyber_agent/skill/skills/)
     builtin_skills_dir = Path(__file__).parent / "skills"
     builtin_skills_dir = Path(__file__).parent / "skills"
     if builtin_skills_dir.exists():
     if builtin_skills_dir.exists():
         loader = SkillLoader(str(builtin_skills_dir))
         loader = SkillLoader(str(builtin_skills_dir))

+ 0 - 0
agent/skill/skills/browser.md → cyber_agent/skill/skills/browser.md


+ 0 - 0
agent/skill/skills/core.md → cyber_agent/skill/skills/core.md


+ 0 - 0
agent/skill/skills/planning.md → cyber_agent/skill/skills/planning.md


+ 0 - 0
agent/skill/skills/research.md → cyber_agent/skill/skills/research.md


+ 4 - 4
agent/tools/__init__.py → cyber_agent/tools/__init__.py

@@ -2,13 +2,13 @@
 Tools 包 - 工具注册和 Schema 生成
 Tools 包 - 工具注册和 Schema 生成
 """
 """
 
 
-from agent.tools.registry import ToolRegistry, tool, get_tool_registry
-from agent.tools.schema import SchemaGenerator
-from agent.tools.models import ToolResult, ToolContext, ToolContextImpl
+from cyber_agent.tools.registry import ToolRegistry, tool, get_tool_registry
+from cyber_agent.tools.schema import SchemaGenerator
+from cyber_agent.tools.models import ToolResult, ToolContext, ToolContextImpl
 
 
 # 导入 builtin 工具以触发 @tool 装饰器注册
 # 导入 builtin 工具以触发 @tool 装饰器注册
 # noqa: F401 表示这是故意的副作用导入
 # noqa: F401 表示这是故意的副作用导入
-import agent.tools.builtin  # noqa: F401
+import cyber_agent.tools.builtin  # noqa: F401
 
 
 __all__ = [
 __all__ = [
 	"ToolRegistry",
 	"ToolRegistry",

+ 2 - 2
agent/tools/adapters/__init__.py → cyber_agent/tools/adapters/__init__.py

@@ -4,8 +4,8 @@
 提供统一的适配器接口,将外部工具(如 opencode)适配到我们的工具系统。
 提供统一的适配器接口,将外部工具(如 opencode)适配到我们的工具系统。
 """
 """
 
 
-from agent.tools.adapters.base import ToolAdapter
-from agent.tools.adapters.opencode_bun_adapter import OpenCodeBunAdapter
+from cyber_agent.tools.adapters.base import ToolAdapter
+from cyber_agent.tools.adapters.opencode_bun_adapter import OpenCodeBunAdapter
 
 
 __all__ = [
 __all__ = [
     "ToolAdapter",
     "ToolAdapter",

+ 1 - 1
agent/tools/adapters/base.py → cyber_agent/tools/adapters/base.py

@@ -10,7 +10,7 @@
 from abc import ABC, abstractmethod
 from abc import ABC, abstractmethod
 from typing import Any, Callable, Dict
 from typing import Any, Callable, Dict
 
 
-from agent.tools.models import ToolResult, ToolContext
+from cyber_agent.tools.models import ToolResult, ToolContext
 
 
 
 
 class ToolAdapter(ABC):
 class ToolAdapter(ABC):

+ 1 - 1
agent/tools/adapters/opencode-wrapper.ts → cyber_agent/tools/adapters/opencode-wrapper.ts

@@ -22,7 +22,7 @@ import { resolve } from 'path'
 
 
 // 动态导入工具(避免编译时依赖)
 // 动态导入工具(避免编译时依赖)
 async function loadTool(toolName: string) {
 async function loadTool(toolName: string) {
-  // 从 agent/tools/adapters/ 定位到 vendor/opencode
+  // 从 cyber_agent/tools/adapters/ 定位到 vendor/opencode
   const toolPath = resolve(__dirname, '../../../../vendor/opencode/packages/opencode/src/tool')
   const toolPath = resolve(__dirname, '../../../../vendor/opencode/packages/opencode/src/tool')
 
 
   switch (toolName) {
   switch (toolName) {

+ 2 - 2
agent/tools/adapters/opencode_bun_adapter.py → cyber_agent/tools/adapters/opencode_bun_adapter.py

@@ -16,8 +16,8 @@ import subprocess
 from pathlib import Path
 from pathlib import Path
 from typing import Any, Dict, Optional
 from typing import Any, Dict, Optional
 
 
-from agent.tools.adapters.base import ToolAdapter
-from agent.tools.models import ToolResult, ToolContext
+from cyber_agent.tools.adapters.base import ToolAdapter
+from cyber_agent.tools.models import ToolResult, ToolContext
 
 
 
 
 class OpenCodeBunAdapter(ToolAdapter):
 class OpenCodeBunAdapter(ToolAdapter):

+ 2 - 2
agent/tools/advanced/__init__.py → cyber_agent/tools/advanced/__init__.py

@@ -6,8 +6,8 @@
 需要 Bun 运行时:https://bun.sh/
 需要 Bun 运行时:https://bun.sh/
 """
 """
 
 
-from agent.tools.advanced.webfetch import webfetch
-from agent.tools.advanced.lsp import lsp_diagnostics
+from cyber_agent.tools.advanced.webfetch import webfetch
+from cyber_agent.tools.advanced.lsp import lsp_diagnostics
 
 
 __all__ = [
 __all__ = [
     "webfetch",
     "webfetch",

+ 2 - 2
agent/tools/advanced/lsp.py → cyber_agent/tools/advanced/lsp.py

@@ -5,8 +5,8 @@ Language Server Protocol 集成,提供代码诊断、补全等功能。
 """
 """
 
 
 from typing import Optional
 from typing import Optional
-from agent.tools import tool, ToolResult, ToolContext
-from agent.tools.adapters.opencode_bun_adapter import OpenCodeBunAdapter
+from cyber_agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools.adapters.opencode_bun_adapter import OpenCodeBunAdapter
 
 
 
 
 # 创建适配器实例
 # 创建适配器实例

+ 2 - 2
agent/tools/advanced/webfetch.py → cyber_agent/tools/advanced/webfetch.py

@@ -5,8 +5,8 @@ WebFetch Tool - 通过 Bun 适配器调用 OpenCode
 """
 """
 
 
 from typing import Optional
 from typing import Optional
-from agent.tools import tool, ToolResult, ToolContext
-from agent.tools.adapters.opencode_bun_adapter import OpenCodeBunAdapter
+from cyber_agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools.adapters.opencode_bun_adapter import OpenCodeBunAdapter
 
 
 
 
 # 创建适配器实例
 # 创建适配器实例

+ 20 - 20
agent/tools/builtin/__init__.py → cyber_agent/tools/builtin/__init__.py

@@ -7,36 +7,36 @@
 参考版本:opencode main branch (2025-01)
 参考版本:opencode main branch (2025-01)
 """
 """
 
 
-from agent.tools.builtin.file.read import read_file
-from agent.tools.builtin.file.read_images import read_images
-from agent.tools.builtin.file.edit import edit_file
-from agent.tools.builtin.file.write import write_file
-from agent.tools.builtin.glob_tool import glob_files
-from agent.tools.builtin.file.grep import grep_content
-from agent.tools.builtin.bash import bash_command
-from agent.tools.builtin.skill import skill, list_skills
-from agent.tools.builtin.subagent import agent, evaluate
+from cyber_agent.tools.builtin.file.read import read_file
+from cyber_agent.tools.builtin.file.read_images import read_images
+from cyber_agent.tools.builtin.file.edit import edit_file
+from cyber_agent.tools.builtin.file.write import write_file
+from cyber_agent.tools.builtin.glob_tool import glob_files
+from cyber_agent.tools.builtin.file.grep import grep_content
+from cyber_agent.tools.builtin.bash import bash_command
+from cyber_agent.tools.builtin.skill import skill, list_skills
+from cyber_agent.tools.builtin.subagent import agent, evaluate
 # sandbox 工具已废弃(2026-04);search.py / crawler.py 已重构为 content/ 工具族(2026-04)
 # sandbox 工具已废弃(2026-04);search.py / crawler.py 已重构为 content/ 工具族(2026-04)
-from agent.tools.builtin.knowledge import(knowledge_search,knowledge_save,knowledge_save_pending,knowledge_list,knowledge_update,knowledge_batch_update,knowledge_slim)
-# Memory / Dream(见 agent/docs/memory.md)
-from agent.tools.builtin.memory import dream
+from cyber_agent.tools.builtin.knowledge import(knowledge_search,knowledge_save,knowledge_save_pending,knowledge_list,knowledge_update,knowledge_batch_update,knowledge_slim)
+# Memory / Dream(见 cyber_agent/docs/memory.md)
+from cyber_agent.tools.builtin.memory import dream
 # 知识上传/查询已统一到 agent 工具:
 # 知识上传/查询已统一到 agent 工具:
 #   agent(agent_type="remote_librarian", task=...)         # 查询
 #   agent(agent_type="remote_librarian", task=...)         # 查询
 #   agent(agent_type="remote_librarian_ingest", task=...)  # 上传(异步)
 #   agent(agent_type="remote_librarian_ingest", task=...)  # 上传(异步)
 #   agent(agent_type="remote_research", task=...)          # 深度调研
 #   agent(agent_type="remote_research", task=...)          # 深度调研
-from agent.tools.builtin.context import get_current_context
-from agent.tools.builtin.toolhub import toolhub_health, toolhub_search, toolhub_call
-from agent.tools.builtin.resource import resource_list_tools, resource_get_tool
-from agent.tools.builtin.content import (
+from cyber_agent.tools.builtin.context import get_current_context
+from cyber_agent.tools.builtin.toolhub import toolhub_health, toolhub_search, toolhub_call
+from cyber_agent.tools.builtin.resource import resource_list_tools, resource_get_tool
+from cyber_agent.tools.builtin.content import (
     content_platforms, content_search, content_detail, content_suggest,
     content_platforms, content_search, content_detail, content_suggest,
     extract_video_clip, import_content,
     extract_video_clip, import_content,
 )
 )
-from agent.trace.goal_tool import goal
+from cyber_agent.trace.goal_tool import goal
 # 导入浏览器工具以触发注册 (因 P1 流水线不需要,且加载缓慢,暂时全局屏蔽)
 # 导入浏览器工具以触发注册 (因 P1 流水线不需要,且加载缓慢,暂时全局屏蔽)
-# import agent.tools.builtin.browser  # noqa: F401
+# import cyber_agent.tools.builtin.browser  # noqa: F401
 
 
-import agent.tools.builtin.feishu
-import agent.tools.builtin.im
+import cyber_agent.tools.builtin.feishu
+import cyber_agent.tools.builtin.im
 
 
 __all__ = [
 __all__ = [
     # 文件操作
     # 文件操作

+ 2 - 2
agent/tools/builtin/bash.py → cyber_agent/tools/builtin/bash.py

@@ -17,7 +17,7 @@ import logging
 from pathlib import Path
 from pathlib import Path
 from typing import Optional, Dict
 from typing import Optional, Dict
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 # 常量
 # 常量
 DEFAULT_TIMEOUT = 120
 DEFAULT_TIMEOUT = 120
@@ -46,7 +46,7 @@ logger = logging.getLogger(__name__)
 
 
 
 
 def _get_project_root() -> Path:
 def _get_project_root() -> Path:
-    """获取项目根目录(bash.py 在 agent/tools/builtin/ 下)"""
+    """获取项目根目录(bash.py 在 cyber_agent/tools/builtin/ 下)"""
     return Path(__file__).parent.parent.parent.parent
     return Path(__file__).parent.parent.parent.parent
 
 
 
 

+ 1 - 1
agent/tools/builtin/browser/__init__.py → cyber_agent/tools/builtin/browser/__init__.py

@@ -5,7 +5,7 @@
 28 个原始工具已合并为 14 个语义化入口(2026-04 重构)。
 28 个原始工具已合并为 14 个语义化入口(2026-04 重构)。
 """
 """
 
 
-from agent.tools.builtin.browser.baseClass import (
+from cyber_agent.tools.builtin.browser.baseClass import (
     # 会话管理(非 @tool,供框架内部调用)
     # 会话管理(非 @tool,供框架内部调用)
     init_browser_session,
     init_browser_session,
     get_browser_session,
     get_browser_session,

+ 3 - 3
agent/tools/builtin/browser/baseClass.py → cyber_agent/tools/builtin/browser/baseClass.py

@@ -39,7 +39,7 @@ Native Browser-Use Tools Adapter
 文件操作说明:
 文件操作说明:
 - 浏览器专用文件目录:.cache/.browser_use_files/ (在当前工作目录下)
 - 浏览器专用文件目录:.cache/.browser_use_files/ (在当前工作目录下)
   用于存储浏览器会话产生的临时文件(下载、上传、截图等)
   用于存储浏览器会话产生的临时文件(下载、上传、截图等)
-- 一般文件操作:请使用 agent.tools.builtin 中的文件工具 (read_file, write_file, edit_file)
+- 一般文件操作:请使用 cyber_agent.tools.builtin 中的文件工具 (read_file, write_file, edit_file)
   这些工具功能更完善,支持diff预览、智能匹配、分页读取等
   这些工具功能更完善,支持diff预览、智能匹配、分页读取等
 """
 """
 import logging
 import logging
@@ -66,8 +66,8 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 
 
 # 导入框架的工具装饰器和结果类
 # 导入框架的工具装饰器和结果类
-from agent.tools import tool, ToolResult
-from agent.tools.builtin.browser.sync_mysql_help import mysql
+from cyber_agent.tools import tool, ToolResult
+from cyber_agent.tools.builtin.browser.sync_mysql_help import mysql
 
 
 # 导入 browser-use 的核心类
 # 导入 browser-use 的核心类
 from browser_use import BrowserSession, BrowserProfile
 from browser_use import BrowserSession, BrowserProfile

+ 0 - 0
agent/tools/builtin/browser/sync_mysql_help.py → cyber_agent/tools/builtin/browser/sync_mysql_help.py


+ 3 - 3
agent/tools/builtin/content/__init__.py → cyber_agent/tools/builtin/content/__init__.py

@@ -10,14 +10,14 @@
   import_content     - 内容批量导入 CMS
   import_content     - 内容批量导入 CMS
 """
 """
 
 
-from agent.tools.builtin.content.tools import (
+from cyber_agent.tools.builtin.content.tools import (
     content_platforms,
     content_platforms,
     content_search,
     content_search,
     content_detail,
     content_detail,
     content_suggest,
     content_suggest,
 )
 )
-from agent.tools.builtin.content.media import extract_video_clip
-from agent.tools.builtin.content.ingestion import import_content
+from cyber_agent.tools.builtin.content.media import extract_video_clip
+from cyber_agent.tools.builtin.content.ingestion import import_content
 
 
 __all__ = [
 __all__ = [
     "content_platforms",
     "content_platforms",

+ 5 - 0
cyber_agent/tools/builtin/content/__main__.py

@@ -0,0 +1,5 @@
+"""CLI 入口:`python -m cyber_agent.tools.builtin.content <cmd> [...]`"""
+from cyber_agent.tools.builtin.content.tools import cli_main
+
+if __name__ == "__main__":
+    cli_main()

+ 0 - 0
agent/tools/builtin/content/cache.py → cyber_agent/tools/builtin/content/cache.py


+ 1 - 1
agent/tools/builtin/content/ingestion.py → cyber_agent/tools/builtin/content/ingestion.py

@@ -9,7 +9,7 @@ from typing import Any, Dict, List
 
 
 import httpx
 import httpx
 
 
-from agent.tools import tool, ToolResult
+from cyber_agent.tools import tool, ToolResult
 
 
 AIGC_BASE_URL = "http://aigc-channel.aiddit.com/aigc/channel"
 AIGC_BASE_URL = "http://aigc-channel.aiddit.com/aigc/channel"
 DEFAULT_TIMEOUT = 60.0
 DEFAULT_TIMEOUT = 60.0

+ 1 - 1
agent/tools/builtin/content/media.py → cyber_agent/tools/builtin/content/media.py

@@ -12,7 +12,7 @@ import tempfile
 from pathlib import Path
 from pathlib import Path
 from typing import Dict, List, Optional
 from typing import Dict, List, Optional
 
 
-from agent.tools import tool, ToolResult
+from cyber_agent.tools import tool, ToolResult
 
 
 VIDEO_DOWNLOAD_DIR = Path(tempfile.gettempdir()) / "youtube_videos"
 VIDEO_DOWNLOAD_DIR = Path(tempfile.gettempdir()) / "youtube_videos"
 VIDEO_DOWNLOAD_DIR.mkdir(exist_ok=True)
 VIDEO_DOWNLOAD_DIR.mkdir(exist_ok=True)

+ 0 - 0
agent/tools/builtin/content/platforms/__init__.py → cyber_agent/tools/builtin/content/platforms/__init__.py


+ 8 - 8
agent/tools/builtin/content/platforms/aigc_channel.py → cyber_agent/tools/builtin/content/platforms/aigc_channel.py

@@ -11,9 +11,9 @@ from typing import Any, Dict, List, Optional
 
 
 import httpx
 import httpx
 
 
-from agent.tools.models import ToolResult
-from agent.tools.utils.image import build_image_grid, encode_base64, load_images
-from agent.tools.builtin.content.registry import (
+from cyber_agent.tools.models import ToolResult
+from cyber_agent.tools.utils.image import build_image_grid, encode_base64, load_images
+from cyber_agent.tools.builtin.content.registry import (
     PlatformDef, ParamSpec, register_platform,
     PlatformDef, ParamSpec, register_platform,
 )
 )
 
 
@@ -172,7 +172,7 @@ async def search(
     # 让 evaluator 用真实时长替代 body 长度作为内容信号。
     # 让 evaluator 用真实时长替代 body 长度作为内容信号。
     if evaluator and posts:
     if evaluator and posts:
         try:
         try:
-            from agent.tools.builtin.content.transcription import probe_durations_for_posts
+            from cyber_agent.tools.builtin.content.transcription import probe_durations_for_posts
             await probe_durations_for_posts(platform_id, posts, concurrency=8)
             await probe_durations_for_posts(platform_id, posts, concurrency=8)
         except Exception as e:
         except Exception as e:
             import logging
             import logging
@@ -250,7 +250,7 @@ async def _build_images_collage(urls: List[str]) -> Optional[Dict[str, Any]]:
     img_bytes = buf.getvalue()
     img_bytes = buf.getvalue()
 
 
     try:
     try:
-        from agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
+        from cyber_agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
         import hashlib
         import hashlib
 
 
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]
@@ -303,7 +303,7 @@ async def detail(
         and has_video
         and has_video
         and extras_d.get("include_transcript", True)
         and extras_d.get("include_transcript", True)
     ):
     ):
-        from agent.tools.builtin.content.transcription import transcribe_video_from_post
+        from cyber_agent.tools.builtin.content.transcription import transcribe_video_from_post
         transcribe_error: Optional[str] = None
         transcribe_error: Optional[str] = None
         try:
         try:
             transcript_text = await transcribe_video_from_post(platform_id, post)
             transcript_text = await transcribe_video_from_post(platform_id, post)
@@ -327,7 +327,7 @@ async def detail(
 
 
         # cache writeback 不再以"成功"为前提:失败的 "" 也写回,让下次 cache hit 短路掉
         # cache writeback 不再以"成功"为前提:失败的 "" 也写回,让下次 cache hit 短路掉
         import os as _os
         import os as _os
-        from agent.tools.builtin.content import cache as _cache
+        from cyber_agent.tools.builtin.content import cache as _cache
         trace_id = extras_d.get("__trace_id__") or _os.getenv("TRACE_ID")
         trace_id = extras_d.get("__trace_id__") or _os.getenv("TRACE_ID")
         content_id = (
         content_id = (
             post.get("channel_content_id")
             post.get("channel_content_id")
@@ -414,7 +414,7 @@ async def _build_collage(posts: List[Dict[str, Any]]) -> Optional[str]:
     
     
     # 尝试上传到 CDN,替换冗长的 base64
     # 尝试上传到 CDN,替换冗长的 base64
     try:
     try:
-        from agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
+        from cyber_agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
         import hashlib
         import hashlib
         
         
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]

+ 9 - 9
agent/tools/builtin/content/platforms/x.py → cyber_agent/tools/builtin/content/platforms/x.py

@@ -9,9 +9,9 @@ from typing import Any, Dict, List, Optional
 
 
 import httpx
 import httpx
 
 
-from agent.tools.models import ToolResult
-from agent.tools.utils.image import build_image_grid, encode_base64, load_images
-from agent.tools.builtin.content.registry import PlatformDef, register_platform
+from cyber_agent.tools.models import ToolResult
+from cyber_agent.tools.utils.image import build_image_grid, encode_base64, load_images
+from cyber_agent.tools.builtin.content.registry import PlatformDef, register_platform
 
 
 CRAWLER_URL = "http://crawler.aiddit.com/crawler/x/keyword"
 CRAWLER_URL = "http://crawler.aiddit.com/crawler/x/keyword"
 COMMENT_URL = "http://crawler.aiddit.com/crawler/x/comment"
 COMMENT_URL = "http://crawler.aiddit.com/crawler/x/comment"
@@ -49,7 +49,7 @@ async def search(
         # 让 evaluator 用真实时长替代 body 长度作为内容信号。
         # 让 evaluator 用真实时长替代 body 长度作为内容信号。
         if evaluator and tweets:
         if evaluator and tweets:
             try:
             try:
-                from agent.tools.builtin.content.transcription import probe_durations_for_posts
+                from cyber_agent.tools.builtin.content.transcription import probe_durations_for_posts
                 await probe_durations_for_posts("x", tweets[:max_count], concurrency=8)
                 await probe_durations_for_posts("x", tweets[:max_count], concurrency=8)
             except Exception as e:
             except Exception as e:
                 import logging
                 import logging
@@ -121,7 +121,7 @@ async def _build_images_collage(urls: List[str]) -> Optional[Dict[str, Any]]:
     img_bytes = buf.getvalue()
     img_bytes = buf.getvalue()
 
 
     try:
     try:
-        from agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
+        from cyber_agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
         import hashlib
         import hashlib
 
 
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]
@@ -207,18 +207,18 @@ async def detail(post: Dict[str, Any], extras: Optional[Dict[str, Any]] = None)
 
 
     # 把作者评论写回 cache,让下游离线流程(如 extract_sources)也能拿到
     # 把作者评论写回 cache,让下游离线流程(如 extract_sources)也能拿到
     if author_comments:
     if author_comments:
-        from agent.tools.builtin.content import cache as _cache
+        from cyber_agent.tools.builtin.content import cache as _cache
         if trace_id and content_id:
         if trace_id and content_id:
             _cache.update_post_field(trace_id, "x", content_id, "author_comments", author_comments)
             _cache.update_post_field(trace_id, "x", content_id, "author_comments", author_comments)
 
 
     # 视频字幕:检测到 video_url_list 时通过 Deepgram 转写 (default on, opt-out via extras)
     # 视频字幕:检测到 video_url_list 时通过 Deepgram 转写 (default on, opt-out via extras)
     transcript_text: Optional[str] = post.get("video_transcript")  # cache hit reuse
     transcript_text: Optional[str] = post.get("video_transcript")  # cache hit reuse
     if not transcript_text and extras_d.get("include_transcript", True):
     if not transcript_text and extras_d.get("include_transcript", True):
-        from agent.tools.builtin.content.transcription import transcribe_video_from_post
+        from cyber_agent.tools.builtin.content.transcription import transcribe_video_from_post
         transcript_text = await transcribe_video_from_post("x", post)
         transcript_text = await transcribe_video_from_post("x", post)
         if transcript_text:
         if transcript_text:
             post["video_transcript"] = transcript_text
             post["video_transcript"] = transcript_text
-            from agent.tools.builtin.content import cache as _cache
+            from cyber_agent.tools.builtin.content import cache as _cache
             if trace_id and content_id:
             if trace_id and content_id:
                 _cache.update_post_field(trace_id, "x", content_id, "video_transcript", transcript_text)
                 _cache.update_post_field(trace_id, "x", content_id, "video_transcript", transcript_text)
 
 
@@ -289,7 +289,7 @@ async def _build_tweet_collage(tweets: List[Dict[str, Any]]) -> Optional[str]:
     img_bytes = buf.getvalue()
     img_bytes = buf.getvalue()
     
     
     try:
     try:
-        from agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
+        from cyber_agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
         import hashlib
         import hashlib
         
         
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]

+ 7 - 7
agent/tools/builtin/content/platforms/youtube.py → cyber_agent/tools/builtin/content/platforms/youtube.py

@@ -11,9 +11,9 @@ from typing import Any, Dict, List, Optional
 
 
 import httpx
 import httpx
 
 
-from agent.tools.models import ToolResult
-from agent.tools.utils.image import build_image_grid, encode_base64, load_images
-from agent.tools.builtin.content.registry import (
+from cyber_agent.tools.models import ToolResult
+from cyber_agent.tools.utils.image import build_image_grid, encode_base64, load_images
+from cyber_agent.tools.builtin.content.registry import (
     PlatformDef, ParamSpec, register_platform,
     PlatformDef, ParamSpec, register_platform,
 )
 )
 
 
@@ -295,7 +295,7 @@ async def detail(post: Dict[str, Any], extras: Optional[Dict[str, Any]] = None)
     if download_video:
     if download_video:
         import asyncio
         import asyncio
         try:
         try:
-            from agent.tools.builtin.content.media import download_youtube_video, parse_srt_to_outline
+            from cyber_agent.tools.builtin.content.media import download_youtube_video, parse_srt_to_outline
             video_path = await asyncio.to_thread(download_youtube_video, content_id)
             video_path = await asyncio.to_thread(download_youtube_video, content_id)
             if captions_text:
             if captions_text:
                 video_outline = parse_srt_to_outline(captions_text)
                 video_outline = parse_srt_to_outline(captions_text)
@@ -313,7 +313,7 @@ async def detail(post: Dict[str, Any], extras: Optional[Dict[str, Any]] = None)
     field_present = "video_transcript" in post
     field_present = "video_transcript" in post
     transcribe_error: Optional[str] = None
     transcribe_error: Optional[str] = None
     if not field_present and include_transcript:
     if not field_present and include_transcript:
-        from agent.tools.builtin.content.transcription import transcribe_video_from_post
+        from cyber_agent.tools.builtin.content.transcription import transcribe_video_from_post
         if not post.get("video_id"):
         if not post.get("video_id"):
             post["video_id"] = content_id
             post["video_id"] = content_id
         try:
         try:
@@ -335,7 +335,7 @@ async def detail(post: Dict[str, Any], extras: Optional[Dict[str, Any]] = None)
 
 
         # cache writeback 失败的 "" 也写,下次 cache hit 短路
         # cache writeback 失败的 "" 也写,下次 cache hit 短路
         import os as _os
         import os as _os
-        from agent.tools.builtin.content import cache as _cache
+        from cyber_agent.tools.builtin.content import cache as _cache
         trace_id = extras.get("__trace_id__") or _os.getenv("TRACE_ID")
         trace_id = extras.get("__trace_id__") or _os.getenv("TRACE_ID")
         if trace_id and content_id:
         if trace_id and content_id:
             _cache.update_post_field(trace_id, "youtube", content_id, "video_transcript", final_value)
             _cache.update_post_field(trace_id, "youtube", content_id, "video_transcript", final_value)
@@ -433,7 +433,7 @@ async def _build_video_collage(videos: List[Dict[str, Any]]) -> Optional[str]:
     img_bytes = buf.getvalue()
     img_bytes = buf.getvalue()
     
     
     try:
     try:
-        from agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
+        from cyber_agent.tools.builtin.file.image_cdn import _upload_bytes_to_oss
         import hashlib
         import hashlib
         
         
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]

+ 1 - 1
agent/tools/builtin/content/registry.py → cyber_agent/tools/builtin/content/registry.py

@@ -8,7 +8,7 @@
 from dataclasses import dataclass, field
 from dataclasses import dataclass, field
 from typing import Any, Callable, Coroutine, Dict, List, Optional
 from typing import Any, Callable, Coroutine, Dict, List, Optional
 
 
-from agent.tools.models import ToolResult
+from cyber_agent.tools.models import ToolResult
 
 
 
 
 # ── 类型定义 ──
 # ── 类型定义 ──

+ 8 - 8
agent/tools/builtin/content/tools.py → cyber_agent/tools/builtin/content/tools.py

@@ -15,16 +15,16 @@ import os
 import uuid
 import uuid
 from typing import Any, Dict, Optional
 from typing import Any, Dict, Optional
 
 
-from agent.tools import tool, ToolResult, ToolContext
-from agent.tools.builtin.content.registry import (
+from cyber_agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools.builtin.content.registry import (
     all_platforms, get_platform, match_platforms,
     all_platforms, get_platform, match_platforms,
 )
 )
-from agent.tools.builtin.content import cache as _cache
+from cyber_agent.tools.builtin.content import cache as _cache
 
 
 # 导入平台模块以触发自注册(副作用导入)
 # 导入平台模块以触发自注册(副作用导入)
-import agent.tools.builtin.content.platforms.aigc_channel  # noqa: F401
-import agent.tools.builtin.content.platforms.youtube       # noqa: F401
-import agent.tools.builtin.content.platforms.x             # noqa: F401
+import cyber_agent.tools.builtin.content.platforms.aigc_channel  # noqa: F401
+import cyber_agent.tools.builtin.content.platforms.youtube       # noqa: F401
+import cyber_agent.tools.builtin.content.platforms.x             # noqa: F401
 
 
 
 
 def _get_trace_id(context: Optional[Dict[str, Any]]) -> str:
 def _get_trace_id(context: Optional[Dict[str, Any]]) -> str:
@@ -273,7 +273,7 @@ def _parse_args(argv: list) -> dict:
 
 
 
 
 def cli_main(argv: Optional[list] = None) -> None:
 def cli_main(argv: Optional[list] = None) -> None:
-    """CLI 入口:通过 `python -m agent.tools.builtin.content` 调用(见 __main__.py)"""
+    """CLI 入口:通过 `python -m cyber_agent.tools.builtin.content` 调用(见 __main__.py)"""
     import sys
     import sys
     import asyncio
     import asyncio
 
 
@@ -287,7 +287,7 @@ def cli_main(argv: Optional[list] = None) -> None:
     }
     }
 
 
     if len(argv) < 2 or argv[1] not in commands:
     if len(argv) < 2 or argv[1] not in commands:
-        print(f"Usage: python -m agent.tools.builtin.content <{'|'.join(commands)}> [--key=value ...]")
+        print(f"Usage: python -m cyber_agent.tools.builtin.content <{'|'.join(commands)}> [--key=value ...]")
         sys.exit(1)
         sys.exit(1)
 
 
     cmd = argv[1]
     cmd = argv[1]

+ 0 - 0
agent/tools/builtin/content/transcription.py → cyber_agent/tools/builtin/content/transcription.py


+ 2 - 2
agent/tools/builtin/context.py → cyber_agent/tools/builtin/context.py

@@ -9,7 +9,7 @@
 框架也会在特定轮次自动调用此工具进行周期性上下文刷新。
 框架也会在特定轮次自动调用此工具进行周期性上下文刷新。
 """
 """
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 
 
 @tool(
 @tool(
@@ -59,7 +59,7 @@ async def get_current_context(
             chat_id = im_config.get("chat_id")
             chat_id = im_config.get("chat_id")
             if contact_id and chat_id:
             if contact_id and chat_id:
                 try:
                 try:
-                    from agent.tools.builtin.im import chat as im_chat
+                    from cyber_agent.tools.builtin.im import chat as im_chat
                     notification = im_chat._notifications.get((contact_id, chat_id))
                     notification = im_chat._notifications.get((contact_id, chat_id))
                     if notification:
                     if notification:
                         count = notification.get("count", 0)
                         count = notification.get("count", 0)

+ 0 - 0
agent/tools/builtin/feishu/FEISHU_TOOLS_PROMPT.md → cyber_agent/tools/builtin/feishu/FEISHU_TOOLS_PROMPT.md


+ 1 - 1
agent/tools/builtin/feishu/__init__.py → cyber_agent/tools/builtin/feishu/__init__.py

@@ -1,4 +1,4 @@
-from agent.tools.builtin.feishu.chat import (feishu_get_chat_history, feishu_get_contact_replies,
+from cyber_agent.tools.builtin.feishu.chat import (feishu_get_chat_history, feishu_get_contact_replies,
                                          feishu_send_message_to_contact,feishu_get_contact_list)
                                          feishu_send_message_to_contact,feishu_get_contact_list)
 
 
 __all__ = [
 __all__ = [

+ 2 - 2
agent/tools/builtin/feishu/chat.py → cyber_agent/tools/builtin/feishu/chat.py

@@ -5,8 +5,8 @@ import httpx
 import asyncio
 import asyncio
 from typing import Optional, List, Dict, Any, Union
 from typing import Optional, List, Dict, Any, Union
 from .feishu_client import FeishuClient, FeishuDomain
 from .feishu_client import FeishuClient, FeishuDomain
-from agent.tools import tool, ToolResult, ToolContext
-from agent.trace.models import MessageContent
+from cyber_agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.trace.models import MessageContent
 
 
 # 从环境变量获取飞书配置
 # 从环境变量获取飞书配置
 # 也可以在此设置硬编码的默认值,但推荐使用环境变量
 # 也可以在此设置硬编码的默认值,但推荐使用环境变量

+ 1 - 1
agent/tools/builtin/feishu/chat_test.py → cyber_agent/tools/builtin/feishu/chat_test.py

@@ -8,7 +8,7 @@ PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..
 if PROJECT_ROOT not in sys.path:
 if PROJECT_ROOT not in sys.path:
     sys.path.append(PROJECT_ROOT)
     sys.path.append(PROJECT_ROOT)
 
 
-from agent.tools.builtin.feishu.chat import (
+from cyber_agent.tools.builtin.feishu.chat import (
     feishu_get_contact_list,
     feishu_get_contact_list,
     feishu_send_message_to_contact,
     feishu_send_message_to_contact,
     feishu_get_contact_replies,
     feishu_get_contact_replies,

+ 10 - 10
agent/tools/builtin/feishu/feishu_agent.py → cyber_agent/tools/builtin/feishu/feishu_agent.py

@@ -5,7 +5,7 @@
 支持工具调用:浏览目录、读取文件、执行 bash 命令。
 支持工具调用:浏览目录、读取文件、执行 bash 命令。
 
 
 用法:
 用法:
-    python -m agent.tools.builtin.feishu.feishu_agent
+    python -m cyber_agent.tools.builtin.feishu.feishu_agent
 
 
 环境变量:
 环境变量:
     FEISHU_APP_ID / FEISHU_APP_SECRET: 飞书应用凭证
     FEISHU_APP_ID / FEISHU_APP_SECRET: 飞书应用凭证
@@ -31,15 +31,15 @@ PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..
 if PROJECT_ROOT not in sys.path:
 if PROJECT_ROOT not in sys.path:
     sys.path.insert(0, PROJECT_ROOT)
     sys.path.insert(0, PROJECT_ROOT)
 
 
-from agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuMessageEvent, FeishuDomain, ReceiveIdType
-from agent.tools.builtin.feishu.chat import (
+from cyber_agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuMessageEvent, FeishuDomain, ReceiveIdType
+from cyber_agent.tools.builtin.feishu.chat import (
     FEISHU_APP_ID,
     FEISHU_APP_ID,
     FEISHU_APP_SECRET,
     FEISHU_APP_SECRET,
     get_contact_by_id,
     get_contact_by_id,
     load_chat_history,
     load_chat_history,
     save_chat_history,
     save_chat_history,
 )
 )
-from agent.llm.qwen import qwen_llm_call
+from cyber_agent.llm.qwen import qwen_llm_call
 
 
 logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(name)s] %(levelname)s %(message)s')
 logging.basicConfig(level=logging.INFO, format='%(asctime)s [%(name)s] %(levelname)s %(message)s')
 logger = logging.getLogger("FeishuAgent")
 logger = logging.getLogger("FeishuAgent")
@@ -336,8 +336,8 @@ def _tool_run_bash(command: str) -> str:
 
 
 def _tool_send_image(path: str) -> str:
 def _tool_send_image(path: str) -> str:
     """发送图片到飞书"""
     """发送图片到飞书"""
-    from agent.tools.builtin.feishu.chat import FEISHU_APP_ID, FEISHU_APP_SECRET
-    from agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuDomain, ReceiveIdType
+    from cyber_agent.tools.builtin.feishu.chat import FEISHU_APP_ID, FEISHU_APP_SECRET
+    from cyber_agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuDomain, ReceiveIdType
 
 
     if not _current_chat_id:
     if not _current_chat_id:
         return "错误:无法获取当前会话 ID"
         return "错误:无法获取当前会话 ID"
@@ -356,8 +356,8 @@ def _tool_send_image(path: str) -> str:
 
 
 def _tool_send_file(path: str) -> str:
 def _tool_send_file(path: str) -> str:
     """发送文件到飞书"""
     """发送文件到飞书"""
-    from agent.tools.builtin.feishu.chat import FEISHU_APP_ID, FEISHU_APP_SECRET
-    from agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuDomain
+    from cyber_agent.tools.builtin.feishu.chat import FEISHU_APP_ID, FEISHU_APP_SECRET
+    from cyber_agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuDomain
 
 
     if not _current_chat_id:
     if not _current_chat_id:
         return "错误:无法获取当前会话 ID"
         return "错误:无法获取当前会话 ID"
@@ -376,8 +376,8 @@ def _tool_send_file(path: str) -> str:
 
 
 def _tool_zip_and_send(path: str) -> str:
 def _tool_zip_and_send(path: str) -> str:
     """打包目录并发送到飞书"""
     """打包目录并发送到飞书"""
-    from agent.tools.builtin.feishu.chat import FEISHU_APP_ID, FEISHU_APP_SECRET
-    from agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuDomain
+    from cyber_agent.tools.builtin.feishu.chat import FEISHU_APP_ID, FEISHU_APP_SECRET
+    from cyber_agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuDomain
 
 
     if not _current_chat_id:
     if not _current_chat_id:
         return "错误:无法获取当前会话 ID"
         return "错误:无法获取当前会话 ID"

+ 0 - 0
agent/tools/builtin/feishu/feishu_client.py → cyber_agent/tools/builtin/feishu/feishu_client.py


+ 2 - 2
agent/tools/builtin/feishu/websocket_event.py → cyber_agent/tools/builtin/feishu/websocket_event.py

@@ -10,8 +10,8 @@ PROJECT_ROOT = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..
 if PROJECT_ROOT not in sys.path:
 if PROJECT_ROOT not in sys.path:
     sys.path.append(PROJECT_ROOT)
     sys.path.append(PROJECT_ROOT)
 
 
-from agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuMessageEvent, FeishuDomain
-from agent.tools.builtin.feishu.chat import (
+from cyber_agent.tools.builtin.feishu.feishu_client import FeishuClient, FeishuMessageEvent, FeishuDomain
+from cyber_agent.tools.builtin.feishu.chat import (
     FEISHU_APP_ID, 
     FEISHU_APP_ID, 
     FEISHU_APP_SECRET, 
     FEISHU_APP_SECRET, 
     get_contact_by_id, 
     get_contact_by_id, 

+ 0 - 0
agent/tools/builtin/file/__init__.py → cyber_agent/tools/builtin/file/__init__.py


+ 1 - 1
agent/tools/builtin/file/edit.py → cyber_agent/tools/builtin/file/edit.py

@@ -14,7 +14,7 @@ from typing import Optional, Generator
 import difflib
 import difflib
 import re
 import re
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 
 
 @tool(description="编辑文件,使用精确字符串替换。支持多种智能匹配策略。", hidden_params=["context"], groups=["core"])
 @tool(description="编辑文件,使用精确字符串替换。支持多种智能匹配策略。", hidden_params=["context"], groups=["core"])

+ 1 - 1
agent/tools/builtin/file/glob.py → cyber_agent/tools/builtin/file/glob.py

@@ -13,7 +13,7 @@ import glob as glob_module
 from pathlib import Path
 from pathlib import Path
 from typing import Optional
 from typing import Optional
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 # 常量
 # 常量
 LIMIT = 100  # 最大返回数量(参考 opencode glob.ts:35)
 LIMIT = 100  # 最大返回数量(参考 opencode glob.ts:35)

+ 1 - 1
agent/tools/builtin/file/grep.py → cyber_agent/tools/builtin/file/grep.py

@@ -14,7 +14,7 @@ import subprocess
 from pathlib import Path
 from pathlib import Path
 from typing import Optional, List, Tuple
 from typing import Optional, List, Tuple
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 # 常量
 # 常量
 LIMIT = 100  # 最大返回匹配数(参考 opencode grep.ts:107)
 LIMIT = 100  # 最大返回匹配数(参考 opencode grep.ts:107)

+ 0 - 0
agent/tools/builtin/file/image_cdn.py → cyber_agent/tools/builtin/file/image_cdn.py


+ 1 - 1
agent/tools/builtin/file/read.py → cyber_agent/tools/builtin/file/read.py

@@ -19,7 +19,7 @@ from urllib.parse import urlparse
 
 
 import httpx
 import httpx
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 # 常量(参考 opencode)
 # 常量(参考 opencode)
 DEFAULT_READ_LIMIT = 2000
 DEFAULT_READ_LIMIT = 2000

+ 4 - 4
agent/tools/builtin/file/read_images.py → cyber_agent/tools/builtin/file/read_images.py

@@ -15,8 +15,8 @@ Read Images Tool - 批量读取图片工具
 
 
 from typing import Any, Dict, List, Literal, Optional, Tuple
 from typing import Any, Dict, List, Literal, Optional, Tuple
 
 
-from agent.tools import tool, ToolResult, ToolContext
-from agent.tools.utils.image import (
+from cyber_agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools.utils.image import (
     build_image_grid,
     build_image_grid,
     downscale,
     downscale,
     encode_base64,
     encode_base64,
@@ -230,7 +230,7 @@ async def read_images(
 # 因此 CLI 只支持 grid 模式;如果你需要单张图,直接用 Read 工具即可。
 # 因此 CLI 只支持 grid 模式;如果你需要单张图,直接用 Read 工具即可。
 #
 #
 # 用法:
 # 用法:
-#   python agent/tools/builtin/file/read_images.py --out=<path> <img1> <img2> ...
+#   python cyber_agent/tools/builtin/file/read_images.py --out=<path> <img1> <img2> ...
 #
 #
 # 必填参数:
 # 必填参数:
 #   --out=/path/grid.jpg     拼图保存路径(必须显式指定,避免污染 /tmp)
 #   --out=/path/grid.jpg     拼图保存路径(必须显式指定,避免污染 /tmp)
@@ -239,7 +239,7 @@ async def read_images(
 #   --max_dimension=1024     每张图预先降采样的最大边长(默认 1024)
 #   --max_dimension=1024     每张图预先降采样的最大边长(默认 1024)
 #
 #
 # 示例:
 # 示例:
-#   python agent/tools/builtin/file/read_images.py \
+#   python cyber_agent/tools/builtin/file/read_images.py \
 #     --out=/tmp/compare.jpg \
 #     --out=/tmp/compare.jpg \
 #     ~/Downloads/a.jpg ~/Downloads/b.jpg ~/Downloads/c.jpg
 #     ~/Downloads/a.jpg ~/Downloads/b.jpg ~/Downloads/c.jpg
 #
 #

+ 2 - 2
agent/tools/builtin/file/write.py → cyber_agent/tools/builtin/file/write.py

@@ -13,7 +13,7 @@ from pathlib import Path
 from typing import Optional
 from typing import Optional
 import difflib
 import difflib
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 
 
 @tool(description="写入文件内容(创建新文件、覆盖现有文件或追加内容)", hidden_params=["context"], groups=["core"])
 @tool(description="写入文件内容(创建新文件、覆盖现有文件或追加内容)", hidden_params=["context"], groups=["core"])
@@ -78,7 +78,7 @@ async def write_file(
     # 落盘前自动将内容中的外站图片 URL 替换为自有 CDN 链接(仅处理文本文件)
     # 落盘前自动将内容中的外站图片 URL 替换为自有 CDN 链接(仅处理文本文件)
     if not append:  # 追加模式不做替换,避免重复处理
     if not append:  # 追加模式不做替换,避免重复处理
         try:
         try:
-            from agent.tools.builtin.file.image_cdn import replace_image_urls
+            from cyber_agent.tools.builtin.file.image_cdn import replace_image_urls
             new_content = await replace_image_urls(new_content)
             new_content = await replace_image_urls(new_content)
         except Exception as cdn_err:
         except Exception as cdn_err:
             import logging
             import logging

+ 2 - 2
agent/tools/builtin/file/write_json.py → cyber_agent/tools/builtin/file/write_json.py

@@ -6,7 +6,7 @@ import json
 from pathlib import Path
 from pathlib import Path
 from typing import Optional, Dict, Any
 from typing import Optional, Dict, Any
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 
 
 @tool(description="专门且唯一安全的 JSON 数据文件写入工具。传入 Python Dict/Object,自动为你生成格式化和转义无误的 JSON 文件。严禁使用普通的 write_file 写 JSON。参数 file_path 是文件绝对路径字符串,json_data 是要写入的原生 JSON 对象(直接传 dict,无需提前序列化)", hidden_params=["context"], groups=["core"])
 @tool(description="专门且唯一安全的 JSON 数据文件写入工具。传入 Python Dict/Object,自动为你生成格式化和转义无误的 JSON 文件。严禁使用普通的 write_file 写 JSON。参数 file_path 是文件绝对路径字符串,json_data 是要写入的原生 JSON 对象(直接传 dict,无需提前序列化)", hidden_params=["context"], groups=["core"])
@@ -70,7 +70,7 @@ async def write_json(
     try:
     try:
         # 落盘前自动将 JSON 数据中的外站图片 URL 替换为自有 CDN 链接
         # 落盘前自动将 JSON 数据中的外站图片 URL 替换为自有 CDN 链接
         try:
         try:
-            from agent.tools.builtin.file.image_cdn import replace_image_urls_in_obj
+            from cyber_agent.tools.builtin.file.image_cdn import replace_image_urls_in_obj
             json_data = await replace_image_urls_in_obj(json_data)
             json_data = await replace_image_urls_in_obj(json_data)
         except Exception as cdn_err:
         except Exception as cdn_err:
             import logging
             import logging

+ 1 - 1
agent/tools/builtin/glob_tool.py → cyber_agent/tools/builtin/glob_tool.py

@@ -13,7 +13,7 @@ import glob as glob_module
 from pathlib import Path
 from pathlib import Path
 from typing import Optional
 from typing import Optional
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 # 常量
 # 常量
 LIMIT = 100  # 最大返回数量(参考 opencode glob.ts:35)
 LIMIT = 100  # 最大返回数量(参考 opencode glob.ts:35)

+ 1 - 1
agent/tools/builtin/im/__init__.py → cyber_agent/tools/builtin/im/__init__.py

@@ -1,4 +1,4 @@
-from agent.tools.builtin.im.chat import (
+from cyber_agent.tools.builtin.im.chat import (
     im_setup,
     im_setup,
     im_check_notification,
     im_check_notification,
     im_receive_messages,
     im_receive_messages,

+ 1 - 1
agent/tools/builtin/im/chat.py → cyber_agent/tools/builtin/im/chat.py

@@ -10,7 +10,7 @@ import os
 import sys
 import sys
 from typing import Optional
 from typing import Optional
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 # 将 im-client 目录加入 sys.path
 # 将 im-client 目录加入 sys.path
 _IM_CLIENT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "im-client"))
 _IM_CLIENT_DIR = os.path.abspath(os.path.join(os.path.dirname(__file__), "..", "..", "..", "..", "im-client"))

+ 7 - 7
agent/tools/builtin/knowledge.py → cyber_agent/tools/builtin/knowledge.py

@@ -12,8 +12,8 @@ import uuid
 import httpx
 import httpx
 from dataclasses import dataclass
 from dataclasses import dataclass
 from typing import List, Dict, Optional, Any
 from typing import List, Dict, Optional, Any
-from agent.tools import tool, ToolResult, ToolContext
-from agent.core.prompts import build_reflect_prompt, COMPLETION_REFLECT_PROMPT
+from cyber_agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.core.prompts import build_reflect_prompt, COMPLETION_REFLECT_PROMPT
 
 
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 
 
@@ -29,16 +29,16 @@ class KnowledgeConfig:
 
 
     # 压缩时提取(消息量超阈值触发压缩时,在 Level 1 过滤前用完整 history 反思)
     # 压缩时提取(消息量超阈值触发压缩时,在 Level 1 过滤前用完整 history 反思)
     enable_extraction: bool = True         # 是否在压缩触发时提取知识
     enable_extraction: bool = True         # 是否在压缩触发时提取知识
-    reflect_prompt: str = ""               # 自定义反思 prompt;空则使用默认,见 agent/core/prompts/knowledge.py:REFLECT_PROMPT
+    reflect_prompt: str = ""               # 自定义反思 prompt;空则使用默认,见 cyber_agent/core/prompts/knowledge.py:REFLECT_PROMPT
 
 
     # agent运行完成后提取(不代表任务完成,agent 可能中途退出等待人工评估)
     # agent运行完成后提取(不代表任务完成,agent 可能中途退出等待人工评估)
     enable_completion_extraction: bool = True      # 是否在运行完成后提取知识
     enable_completion_extraction: bool = True      # 是否在运行完成后提取知识
-    completion_reflect_prompt: str = ""            # 自定义复盘 prompt;空则使用默认,见 agent/core/prompts/knowledge.py:COMPLETION_REFLECT_PROMPT
+    completion_reflect_prompt: str = ""            # 自定义复盘 prompt;空则使用默认,见 cyber_agent/core/prompts/knowledge.py:COMPLETION_REFLECT_PROMPT
 
 
-    # 提取-审核-提交两阶段开关(见 agent/docs/memory.md 第三节)
+    # 提取-审核-提交两阶段开关(见 cyber_agent/docs/memory.md 第三节)
     reflect_auto_commit: bool = False
     reflect_auto_commit: bool = False
     # False(默认): reflection 仅写 cognition_log: type="extraction_pending",
     # False(默认): reflection 仅写 cognition_log: type="extraction_pending",
-    #               人工通过 CLI(agent/cli/extraction_review.py)review + commit 才进 KnowHub
+    #               人工通过 CLI(cyber_agent/cli/extraction_review.py)review + commit 才进 KnowHub
     # True         : reflection 直接 upload_knowledge(旧行为),适合无人值守的 example
     # True         : reflection 直接 upload_knowledge(旧行为),适合无人值守的 example
 
 
     # 知识注入(agent切换当前工作的goal时,自动注入相关知识)
     # 知识注入(agent切换当前工作的goal时,自动注入相关知识)
@@ -304,7 +304,7 @@ async def knowledge_save_pending(
     暂存一条待审核的知识提取(不直接写入 KnowHub)。
     暂存一条待审核的知识提取(不直接写入 KnowHub)。
 
 
     写入 cognition_log: type="extraction_pending",等待人工通过 CLI
     写入 cognition_log: type="extraction_pending",等待人工通过 CLI
-    (agent/cli/extraction_review.py)review + commit 才会进入 KnowHub。
+    (cyber_agent/cli/extraction_review.py)review + commit 才会进入 KnowHub。
     参数与 knowledge_save 对齐,review 通过后字段透传给 knowledge_save。
     参数与 knowledge_save 对齐,review 通过后字段透传给 knowledge_save。
 
 
     Args:
     Args:

+ 3 - 3
agent/tools/builtin/memory.py → cyber_agent/tools/builtin/memory.py

@@ -1,5 +1,5 @@
 """
 """
-Memory 相关工具 —— 目前只包含 dream 操作(见 agent/docs/memory.md 第四节)。
+Memory 相关工具 —— 目前只包含 dream 操作(见 cyber_agent/docs/memory.md 第四节)。
 
 
 dream 整理 Agent 身份的长期记忆:回顾最近 trace 的执行历史,
 dream 整理 Agent 身份的长期记忆:回顾最近 trace 的执行历史,
 逐个 trace 做反思,再跨 trace 整合写回记忆文件。
 逐个 trace 做反思,再跨 trace 整合写回记忆文件。
@@ -15,7 +15,7 @@ from __future__ import annotations
 import logging
 import logging
 from typing import Optional
 from typing import Optional
 
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 logger = logging.getLogger(__name__)
 logger = logging.getLogger(__name__)
 
 
@@ -61,7 +61,7 @@ async def dream(
             error="runner dependencies missing",
             error="runner dependencies missing",
         )
         )
 
 
-    from agent.core.dream import run_dream
+    from cyber_agent.core.dream import run_dream
     report = await run_dream(
     report = await run_dream(
         store=runner.trace_store,
         store=runner.trace_store,
         llm_call=runner.llm_call,
         llm_call=runner.llm_call,

+ 1 - 1
agent/tools/builtin/resource.py → cyber_agent/tools/builtin/resource.py

@@ -5,7 +5,7 @@
 import os
 import os
 import httpx
 import httpx
 from typing import List, Dict, Optional, Any
 from typing import List, Dict, Optional, Any
-from agent.tools import tool, ToolResult
+from cyber_agent.tools import tool, ToolResult
 
 
 KNOWHUB_API = os.getenv("KNOWHUB_API", "http://43.106.118.91:9999").rstrip("/")
 KNOWHUB_API = os.getenv("KNOWHUB_API", "http://43.106.118.91:9999").rstrip("/")
 
 

+ 4 - 4
agent/tools/builtin/skill.py → cyber_agent/tools/builtin/skill.py

@@ -9,13 +9,13 @@ import subprocess
 from pathlib import Path
 from pathlib import Path
 from typing import Optional
 from typing import Optional
 
 
-from agent.tools import tool, ToolResult
-from agent.skill.skill_loader import SkillLoader
+from cyber_agent.tools import tool, ToolResult
+from cyber_agent.skill.skill_loader import SkillLoader
 
 
 # 默认 skills 目录(优先级:项目 skills > 框架 skills)
 # 默认 skills 目录(优先级:项目 skills > 框架 skills)
 DEFAULT_SKILLS_DIRS = [
 DEFAULT_SKILLS_DIRS = [
     os.getenv("SKILLS_DIR", "./skills"),      # 项目特定 skills(优先)
     os.getenv("SKILLS_DIR", "./skills"),      # 项目特定 skills(优先)
-    "./agent/skill/skills"                    # 框架内置 skills
+    "./cyber_agent/skill/skills"                    # 框架内置 skills
 ]
 ]
 
 
 # 默认单一目录(用于 list_skills)
 # 默认单一目录(用于 list_skills)
@@ -36,7 +36,7 @@ def _check_skill_setup(skill_name: str) -> Optional[str]:
     if skill_name in ["browser-use", "browser_use"]:
     if skill_name in ["browser-use", "browser_use"]:
         try:
         try:
             # 动态导入 browser-use skill 的 setup 模块
             # 动态导入 browser-use skill 的 setup 模块
-            from agent.skill.skills.browser_use.setup import (
+            from cyber_agent.skill.skills.browser_use.setup import (
                 _check_browser_use_cli,
                 _check_browser_use_cli,
                 _check_chromium_installed
                 _check_chromium_installed
             )
             )

+ 7 - 7
agent/tools/builtin/subagent.py → cyber_agent/tools/builtin/subagent.py

@@ -12,11 +12,11 @@ import os
 from datetime import datetime
 from datetime import datetime
 from typing import Any, Dict, List, Optional, Union
 from typing import Any, Dict, List, Optional, Union
 
 
-from agent.tools import tool
-from agent.trace.models import Trace, Messages
-from agent.trace.trace_id import generate_sub_trace_id
-from agent.trace.goal_models import GoalTree
-from agent.trace.websocket import broadcast_sub_trace_started, broadcast_sub_trace_completed
+from cyber_agent.tools import tool
+from cyber_agent.trace.models import Trace, Messages
+from cyber_agent.trace.trace_id import generate_sub_trace_id
+from cyber_agent.trace.goal_models import GoalTree
+from cyber_agent.trace.websocket import broadcast_sub_trace_started, broadcast_sub_trace_completed
 
 
 
 
 # ===== 远端路由常量 =====
 # ===== 远端路由常量 =====
@@ -96,7 +96,7 @@ def build_evaluate_prompt(goal_description: str, result_text: str) -> str:
 
 
 def _make_run_config(**kwargs):
 def _make_run_config(**kwargs):
     """延迟导入 RunConfig 以避免循环导入"""
     """延迟导入 RunConfig 以避免循环导入"""
-    from agent.core.runner import RunConfig
+    from cyber_agent.core.runner import RunConfig
     return RunConfig(**kwargs)
     return RunConfig(**kwargs)
 
 
 
 
@@ -347,7 +347,7 @@ def _make_event_printer(label: str):
     prefix = f"  [{label}]"
     prefix = f"  [{label}]"
 
 
     def on_event(item):
     def on_event(item):
-        from agent.trace.models import Trace, Message
+        from cyber_agent.trace.models import Trace, Message
         if isinstance(item, Message):
         if isinstance(item, Message):
             if item.role == "assistant":
             if item.role == "assistant":
                 content = item.content
                 content = item.content

Một số tệp đã không được hiển thị bởi vì quá nhiều tập tin thay đổi trong này khác