Pārlūkot izejas kodu

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

SamLee 1 dienu atpakaļ
vecāks
revīzija
a60f75a8e0
100 mainītis faili ar 455 papildinājumiem un 455 dzēšanām
  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/
 
 # Feishu 运行时聊天记录(自动维护,包含联系人 PII)
-agent/tools/builtin/feishu/chat_history/
+cyber_agent/tools/builtin/feishu/chat_history/
 
 # Runtime artifacts (one-off scripts, data, 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
 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:
 
-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(
     trace_store=trace_store,
@@ -109,7 +109,7 @@ app.include_router(logs_router)
 @app.on_event("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()
 
 @app.websocket("/ws_ping")

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

@@ -71,19 +71,19 @@ agent/
 
 一次完整的 Agent 执行。所有 Agent(主、子、人类协助)都是 Trace。
 
-**实现位置**:`agent/trace/models.py:Trace`
+**实现位置**:`cyber_agent/trace/models.py:Trace`
 
 ### Goal(目标节点)
 
 计划中的一个目标,支持层级结构。
 
-**实现位置**:`agent/trace/goal_models.py:Goal`
+**实现位置**:`cyber_agent/trace/goal_models.py:Goal`
 
 ### Message(执行消息)
 
 对应 LLM API 的消息,每条 Message 关联一个 Goal。
 
-**实现位置**:`agent/trace/models.py:Message`
+**实现位置**:`cyber_agent/trace/models.py:Message`
 
 ---
 
@@ -92,9 +92,9 @@ agent/
 ### 基础使用
 
 ```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(
     llm_call=create_qwen_llm_call(model="qwen3.5-plus"),
@@ -155,7 +155,7 @@ async for item in runner.run(
 ### 自定义工具
 
 ```python
-from agent.tools import tool, ToolContext, ToolResult
+from cyber_agent.tools import tool, ToolContext, ToolResult
 
 @tool(description="自定义工具")
 async def my_tool(arg: str, ctx: ToolContext) -> ToolResult:
@@ -203,7 +203,7 @@ examples/research/
 | POST | `/api/traces/{id}/run` | 续跑或回溯 |
 | 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/)
 
 - `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 入口
 
-Claude Code skill 脚本最终调用 `agent/client.py::invoke_agent`,该函数也是公开 SDK 供任何 Python 代码复用:
+Claude Code skill 脚本最终调用 `cyber_agent/client.py::invoke_agent`,该函数也是公开 SDK 供任何 Python 代码复用:
 
 ```python
-from agent import invoke_agent
+from cyber_agent import invoke_agent
 
 # 远端:查询知识库
 result = await invoke_agent(
@@ -256,7 +256,7 @@ result = await invoke_agent(
 
 路由规则:`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
-from agent.client import invoke_agent
+from cyber_agent.client import invoke_agent
 
 __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",
 不会直接上传到 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 的所有未审核条目
-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
-python -m agent.cli.extraction_review --trace abc-123 --commit
+python -m cyber_agent.cli.extraction_review --trace abc-123 --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
@@ -34,8 +34,8 @@ import sys
 from pathlib import Path
 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,
     CommitReport,
     list_pending,
@@ -220,7 +220,7 @@ async def cmd_commit(store: FileSystemTraceStore, trace_id: str) -> int:
 
 def build_parser() -> argparse.ArgumentParser:
     p = argparse.ArgumentParser(
-        prog="python -m agent.cli.extraction_review",
+        prog="python -m cyber_agent.cli.extraction_review",
         description="审核并提交反思侧分支暂存的待审核知识条目。",
     )
     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 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 检测 =====
@@ -240,14 +240,14 @@ class InteractiveController:
                 return {"action": "stop"}
 
             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)
                 continue
 
             elif choice == "9":
                 # 提交已审核知识到 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)
                 continue
 
@@ -416,7 +416,7 @@ class InteractiveController:
                 after_seq = selected_msg.parent_sequence or (selected_msg.sequence - 1)
 
             # 导入 RunConfig
-            from agent.core.runner import RunConfig
+            from cyber_agent.core.runner import RunConfig
 
             # 构建运行配置
             config = RunConfig(

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

@@ -4,7 +4,7 @@ Agent SDK 入口 —— 统一调用 remote / 本地 Agent 的公开 API。
 使用方式(任何进程,只要装了 cyber-agent 包):
 
     import asyncio
-    from agent import invoke_agent
+    from cyber_agent import invoke_agent
 
     # 远端(HTTP 调用 KnowHub 服务器)
     result = asyncio.run(invoke_agent(
@@ -20,8 +20,8 @@ Agent SDK 入口 —— 统一调用 remote / 本地 Agent 的公开 API。
         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
@@ -44,7 +44,7 @@ def _load_default_env() -> None:
         return
     # 先试 cwd 向上查找
     load_dotenv()
-    # 再试 cyber-agent 仓库根(编辑安装时 agent/__init__.py 所在仓库的 .env)
+    # 再试 cyber-agent 仓库根(编辑安装时 cyber_agent/__init__.py 所在仓库的 .env)
     repo_env = Path(__file__).resolve().parent.parent / ".env"
     if repo_env.exists():
         load_dotenv(repo_env, override=False)
@@ -77,7 +77,7 @@ async def invoke_agent(
     """
     if agent_type.startswith("remote_"):
         # 懒 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(
             agent_type=agent_type,
             task=task,
@@ -135,7 +135,7 @@ async def _run_local_agent(
     # 2. 加载 .env:依次查项目根、两级父目录(兼容 monorepo)、cyber-agent 仓库根
     try:
         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
         for candidate in (
             root / ".env",
@@ -179,7 +179,7 @@ async def _run_local_agent(
     presets_path = root / "presets.json"
     if presets_path.exists():
         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))
         except Exception as e:
             logger.warning(f"加载 presets.json 失败: {e}")
@@ -192,9 +192,9 @@ async def _run_local_agent(
             logger.warning(f"加载 tools 包失败: {e}")
 
     # 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")
     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)
 """
 
-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,
     AGENT_PRESETS,
     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 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__)
 

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

@@ -1,12 +1,12 @@
 """
 Memory 系统(Phase 2+)
 
-详见 agent/docs/memory.md。核心概念:
+详见 cyber_agent/docs/memory.md。核心概念:
 - Memory:Agent 身份私有的主观记忆,Markdown 文件,人类可读写
 - Dream:记忆反思操作(回顾多个 trace 的执行历史,更新记忆文件)
 
 本模块只提供 MemoryConfig 数据类和记忆文件加载逻辑。
-Dream 操作在 agent/core/dream.py(Phase 3)。
+Dream 操作在 cyber_agent/core/dream.py(Phase 3)。
 """
 
 from __future__ import annotations
@@ -22,7 +22,7 @@ logger = logging.getLogger(__name__)
 
 @dataclass
 class MemoryConfig:
-    """持久化记忆配置(见 agent/docs/memory.md 第五节)"""
+    """持久化记忆配置(见 cyber_agent/docs/memory.md 第五节)"""
 
     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: 文件不存在
         ValueError: 文件格式错误或缺少 $system$ 分节
     """
-    from agent.llm.prompts import load_prompt
+    from cyber_agent.llm.prompts import load_prompt
 
     prompt_path = Path(path)
     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     系统提示、工具中断、任务命名、经验格式
@@ -8,7 +8,7 @@ agent.core.prompts - Agent 系统 Prompt 集中管理
 - subagent.py   子 Agent 评估、结果格式化、知识管理
 """
 
-from agent.core.prompts.runner import (
+from cyber_agent.core.prompts.runner import (
     DEFAULT_SYSTEM_PREFIX,
     TRUNCATION_HINT,
     TOOL_INTERRUPTED_MESSAGE,
@@ -20,13 +20,13 @@ from agent.core.prompts.runner import (
     build_agent_continue_hint,
 )
 
-from agent.core.prompts.knowledge import (
+from cyber_agent.core.prompts.knowledge import (
     REFLECT_PROMPT,
     COMPLETION_REFLECT_PROMPT,
     build_reflect_prompt,
 )
 
-from agent.core.prompts.compression import (
+from cyber_agent.core.prompts.compression import (
     COMPRESSION_PROMPT_TEMPLATE,
     COMPRESSION_EVAL_PROMPT_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 事件,
 等待人工(或 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 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,
     compress_completed_goals,
     estimate_tokens,
     needs_level2_compression,
     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,
     TRUNCATION_HINT,
     TOOL_INTERRUPTED_MESSAGE,
@@ -143,7 +143,7 @@ class RunConfig:
     enable_research_flow: bool = True  # 是否启用自动研究流程(知识检索→经验检索→调研→计划)
     # --- 知识管理配置 ---
     knowledge: KnowledgeConfig = field(default_factory=KnowledgeConfig)
-    # --- Memory 配置(见 agent/docs/memory.md) ---
+    # --- Memory 配置(见 cyber_agent/docs/memory.md) ---
     # None = 默认 Agent(无长期记忆);赋值 MemoryConfig 使该 Agent 成为 memory-bearing Agent
     memory: Optional["MemoryConfig"] = None
 
@@ -251,7 +251,7 @@ class AgentRunner:
             reflect_model: per-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:
             raise RuntimeError("dream 需要 trace_store 和 llm_call 均已配置")
         return await run_dream(
@@ -586,7 +586,7 @@ class AgentRunner:
         trace_obj.status = "running"
         # 广播状态变化给前端
         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")
         except Exception:
             pass
@@ -930,7 +930,7 @@ class AgentRunner:
         self.log.info("执行单次 LLM 压缩")
 
         # 构建压缩 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 ""
         compress_prompt = build_single_turn_prompt(goal_prompt)
         compress_messages = list(history) + [
@@ -1117,7 +1117,7 @@ class AgentRunner:
                     )
                     # 广播状态变化给前端
                     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")
                     except Exception:
                         pass
@@ -1221,7 +1221,7 @@ class AgentRunner:
                 elif branch_type == "knowledge_eval":
                     prompt = await self._build_knowledge_eval_prompt(trace_id, goal_tree)
                 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)
 
                 branch_user_msg = Message.create(
@@ -1479,7 +1479,7 @@ class AgentRunner:
                         summary_text = summary_text.replace(
                             "**生成摘要后立即停止,不要继续执行原有任务。**", ""
                         ).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)
 
                         if goal_tree and goal_tree.goals:
@@ -1541,7 +1541,7 @@ class AgentRunner:
                         and getattr(config.knowledge, "reflect_auto_commit", False)
                     ):
                         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(
                                 self.trace_store,
                                 trace_id,
@@ -1659,7 +1659,7 @@ class AgentRunner:
                                 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"):
                             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)
                             except ImportError:
                                 pass
@@ -1781,7 +1781,7 @@ class AgentRunner:
                         # 设置 trace_id 上下文供 toolhub 使用(图片保存到 outputs/{trace_id}/)
                         if tool_name in ("toolhub_call", "toolhub_search", "toolhub_health"):
                             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)
                             except ImportError:
                                 pass
@@ -2403,7 +2403,7 @@ class AgentRunner:
             if contact_id and chat_id:
                 # 尝试导入 IM 模块并检查通知
                 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))
                     if notification:
                         count = notification.get("count", 0)
@@ -3005,7 +3005,7 @@ class AgentRunner:
         return self.tools.get_schemas(list(tool_names))
 
     # 默认 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]:
         """构建 system prompt(注入 skills)
@@ -3025,7 +3025,7 @@ class AgentRunner:
             base_prompt: 已有 system 内容(来自消息),
                          None 时使用 config.system_prompt 或 preset.system_prompt
         """
-        from agent.core.presets import AGENT_PRESETS
+        from cyber_agent.core.presets import AGENT_PRESETS
 
         # 确定 system_prompt 来源
         if base_prompt is not None:
@@ -3064,12 +3064,12 @@ class AgentRunner:
         if config.max_iterations and config.max_iterations > 0:
             system_prompt += f"\n\n## Execution Constraint\n这是一项有严格步数限制的任务。你最多可以用 {config.max_iterations} 轮交互来解决问题。\n请务必【边查边写、随时存档】!每当你收集或得出一个有价值的独立结果(如收集到一个独立 Case),请立刻调用工具写入或追加到结果文件中,绝对不要等到所有任务都做完再最后一次性输出。这样即使触达步数上限被强制打断,你已经收集的成果也能安全保留!"
         # Memory 注入(memory-bearing Agent)——在 system prompt 末尾追加
-        # 初版选择 system prompt 追加(见 agent/docs/memory.md 待定问题 1)。
+        # 初版选择 system prompt 追加(见 cyber_agent/docs/memory.md 待定问题 1)。
         # 好处:run 启动一次性注入、所有后续轮次都能看到、与 skills 注入方式一致。
         # 代价:若记忆文件很大会持续占 prompt tokens —— 待观察后决定是否切换方案。
         if config.memory:
             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)
                 memory_text = format_memory_injection(files)
                 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 匹配,无需重写。
 
-**实现**:`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)
 ```
 
-**实现**:`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
 ```
 
-**实现**:`agent/core/runner.py:AgentRunner`
+**实现**:`cyber_agent/core/runner.py:AgentRunner`
 
 ### 回溯(Rewind)
 
@@ -304,7 +304,7 @@ await runner.stop(trace_id)
 
 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_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                       |
 | 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` 监听实时事件。
 
-**实现**:`agent/trace/run_api.py`
+**实现**:`cyber_agent/trace/run_api.py`
 
 ---
 
@@ -428,7 +428,7 @@ class Trace:
     completed_at: Optional[datetime] = None
 ```
 
-**实现**:`agent/trace/models.py`
+**实现**:`cyber_agent/trace/models.py`
 
 ### Goal(目标节点)
 
@@ -479,7 +479,7 @@ class Goal:
 - `done` - 完成当前目标(附带 summary)
 - `abandon` - 放弃当前目标(附带原因)
 
-**实现**:`agent/trace/goal_models.py`, `agent/trace/goal_tool.py`
+**实现**:`cyber_agent/trace/goal_models.py`, `cyber_agent/trace/goal_tool.py`
 
 ### Message(执行消息)
 
@@ -541,7 +541,7 @@ Message 提供格式转换方法:
 - `branch_type`: "compression" | "reflection" | None(主路径)
 - `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 → 使用消息中的
 2. `config.system_prompt` 显式指定 → 使用 config
@@ -615,7 +615,7 @@ AGENT_PRESETS = {
 **加载方式**:
 
 ```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")
 ```
@@ -660,7 +660,7 @@ result2 = agent(
 
 **实现**:`HybridTraceStore` 自动路由到本地或远程存储,远程访问通过 HTTP API 实现。
 
-**实现位置**:`agent/trace/hybrid_store.py`(规划中)
+**实现位置**:`cyber_agent/trace/hybrid_store.py`(规划中)
 
 ### agent 工具
 
@@ -720,7 +720,7 @@ async def evaluate(
 
 ### 消息类型别名
 
-定义在 `agent/trace/models.py`,用于工具参数和 runner/LLM API 接口:
+定义在 `cyber_agent/trace/models.py`,用于工具参数和 runner/LLM API 接口:
 
 ```python
 ChatMessage = Dict[str, Any]                          # 单条 OpenAI 格式消息
@@ -728,9 +728,9 @@ Messages = List[ChatMessage]                          # 消息列表
 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 工具
 
@@ -787,7 +787,7 @@ MessageContent = Union[str, List[Dict[str, str]]]     # content 字段(文本
 
 **持久联系人/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 修改**:
 
 ```python
-# agent/core/runner.py
+# cyber_agent/core/runner.py
 
 class AgentRunner:
     def __init__(
@@ -899,12 +899,12 @@ class AgentRunner:
         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
 
 ```python
-# agent/tools/builtin/a2a_im.py
+# cyber_agent/tools/builtin/a2a_im.py
 
 class A2AMessageQueue:
     """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
 # api_server.py
 
-from agent.tools.builtin.a2a_im import (
+from cyber_agent.tools.builtin.a2a_im import (
     A2AMessageQueue,
     create_a2a_context_hook,
     check_messages
@@ -1111,7 +1111,7 @@ def create_timer_hook(timer):
 
 **持久联系人/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 工具使用
 ├── research.md              # 搜索与内容研究
 └── browser.md               # 浏览器自动化
@@ -1196,9 +1196,9 @@ agent/skill/skills/         # 内置 Skills(始终加载)
 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` 等工具
 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 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)
 
@@ -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`。
 
-**实现位置**:`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 指定注入 |
-| [工具系统](../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)                                      | 知识结构、检索、提取机制        |
 | [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/docs/enterprise/overview.md)            | 组织级 Agent 系统架构和规划     |
 | [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[]` 字段。
 
@@ -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`:知识评估
 
@@ -94,7 +94,7 @@ LLM 在侧分支内按 `{evaluations: [{query_sequence, assessments: [{knowledge
 
 ### `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`
 
@@ -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`
 
@@ -136,10 +136,10 @@ Agent 的反思侧分支不再直接 upload 到 KnowHub,而是暂存为 pendin
 `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 项
 - 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`
 
@@ -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`:记忆反思
 
-仅 memory-bearing Agent 使用(详见 `agent/docs/memory.md`)。Dream 操作触发的 per-trace 记忆反思。
+仅 memory-bearing Agent 使用(详见 `cyber_agent/docs/memory.md`)。Dream 操作触发的 per-trace 记忆反思。
 
 ```json
 {
@@ -172,7 +172,7 @@ Agent 的反思侧分支不再直接 upload 到 KnowHub,而是暂存为 pendin
 
 `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`
 
-**触发逻辑**(`agent/trace/store.py:update_goal`):
+**触发逻辑**(`cyber_agent/trace/store.py:update_goal`):
 
 ```
 Goal 完成
@@ -197,7 +197,7 @@ Goal 完成
   → 设置 trace.context["pending_knowledge_eval"] = true
   → 设置 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 队列
 ```
@@ -206,7 +206,7 @@ Runner 主循环下一次迭代开头检测到标志(agent/core/runner.py:_age
 
 **时机**:上下文 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/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 结构
 
-完整实现:`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 整合回答
@@ -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)
   ↓ 读取增量消息 + 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 相关文档
 
-- **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 重构等历史决策的背景

+ 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`
 
-**实现**:`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上下文注入钩子)
 
@@ -204,15 +204,15 @@ knowhub/agents/skills/         # KnowHub Librarian 的 skills
 
 在 goal 工具执行 `done` 操作后,立刻对该 goal 执行压缩。优点是 history 始终保持精简,缺点是如果后续需要回溯到该 goal 的中间过程,信息已丢失(存储层仍保留原始消息)。
 
-**触发点**:`agent/core/runner.py`(工具执行后检测 `goal(done=...)` 调用)
+**触发点**:`cyber_agent/core/runner.py`(工具执行后检测 `goal(done=...)` 调用)
 
 #### `on_overflow` 模式
 
 在 `_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 摘要压缩
 
@@ -231,7 +231,7 @@ knowhub/agents/skills/         # KnowHub Librarian 的 skills
 
 压缩完成后重建 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 分层**
 
 **设计**:
-- **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 管理等功能,模型需要始终知道
@@ -629,7 +629,7 @@ execution trace v2.0 引入了 Blob 存储系统用于处理大输出和图片
 
 **统一工具,三种模式**:
 - 单一工具 `subagent` 支持三种模式:`explore`(并行探索)、`delegate`(委托执行)、`evaluate`(结果评估)
-- 实现位置:`agent/tools/builtin/subagent.py`
+- 实现位置:`cyber_agent/tools/builtin/subagent.py`
 
 **Explore 模式的并行执行**:
 - 使用 `asyncio.gather()` 实现真并行
@@ -689,7 +689,7 @@ Agent(含 sub-agent)有时不创建 goal 就直接执行工具调用,导
 
 **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
 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
 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 行为。
 
-#### 18b. 增加消息线格式类型别名(`agent/trace/models.py`)
+#### 18b. 增加消息线格式类型别名(`cyber_agent/trace/models.py`)
 
 ```python
 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` — 注入路由
 
-**实现**:`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/traces/{id}/reflect` — 设置 `RunConfig(force_side_branch="reflection")`,启动后台任务
 - `/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)仍然纯服务器端。
 7. IO 契约:不发明 per-agent-type schema——Agent 之间通过 message 交流,结构化信息由 Agent 的 prompt 约定写进 message 文本,caller 自己 parse。
 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):
     - 禁止调用 `agent` / `evaluate`(防递归)——用 `tools=[...]` 精确列表 或 `exclude_tools=["agent","evaluate"]`
     - 关闭自动知识提取 / 复盘(`enable_extraction` / `enable_completion_extraction` = False)
@@ -1367,6 +1367,6 @@ context = {
 
 **可用 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。
 
-**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()`。
 
@@ -37,7 +37,7 @@
 
 **目的**:评估被注入的知识是否有用,记录到本地 `knowledge_log.json`。
 
-**触发时机**(详见 `agent/docs/cognition-log.md`):
+**触发时机**(详见 `cyber_agent/docs/cognition-log.md`):
 - Goal 完成时(`store.py:update_goal`,设置 `pending_knowledge_eval` 标志)
 - 压缩前(必须在压缩前完成评估,否则执行上下文丢失)
 - 任务结束时(兜底)
@@ -176,7 +176,7 @@ Trace 模型新增字段:
                                            # 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
 - 记忆反思完成 → 更新 `reflected_at_sequence` 为当前最新 sequence
@@ -283,7 +283,7 @@ if branch_type == "reflection":
 
 **2. Trace 模型扩展**
 
-`agent/trace/models.py:Trace` 新增字段:
+`cyber_agent/trace/models.py:Trace` 新增字段:
 
 ```python
 reflected_at_sequence: Optional[int] = None    # 上次记忆反思的 sequence
@@ -292,7 +292,7 @@ reflected_at_sequence: Optional[int] = None    # 上次记忆反思的 sequence
 
 **3. RunConfig 扩展**
 
-`agent/core/runner.py:RunConfig` 新增可选字段:
+`cyber_agent/core/runner.py:RunConfig` 新增可选字段:
 
 ```python
 memory: Optional[MemoryConfig] = None
@@ -300,7 +300,7 @@ memory: Optional[MemoryConfig] = None
 
 **4. KnowledgeConfig 扩展**
 
-`agent/core/runner.py:KnowledgeConfig`(或对应类)新增字段:
+`cyber_agent/core/runner.py:KnowledgeConfig`(或对应类)新增字段:
 
 ```python
 reflect_auto_commit: bool = False
@@ -356,10 +356,10 @@ async def dream() -> ToolResult:
 
 **4. 提取审核 CLI 流程**
 
-为支持"提取-审核-提交"两阶段(见第三节),新增 `agent/cli/extraction_review.py` 模块。**不是 Agent 工具**(Agent 不应自我审核),是 CLI 内部模块 + 独立可执行脚本:
+为支持"提取-审核-提交"两阶段(见第三节),新增 `cyber_agent/cli/extraction_review.py` 模块。**不是 Agent 工具**(Agent 不应自我审核),是 CLI 内部模块 + 独立可执行脚本:
 
 ```python
-# agent/cli/extraction_review.py
+# cyber_agent/cli/extraction_review.py
 
 async def list_pending(trace_id: str) -> list[PendingExtraction]:
     """读 cognition_log,返回 type=extraction_pending 且未 reviewed 的条目"""
@@ -379,11 +379,11 @@ async def commit_approved(trace_id: str) -> CommitReport:
 可独立调用:
 
 ```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. 插入干预消息并继续
@@ -533,7 +533,7 @@ Memory 是 opt-in 的增量能力。但**知识提取的提交行为变了**:
 4. `[OPEN]` **Per-trace 反思的成本控制**:很短的 trace 不值得反思。当前 `per_trace_reflect` 无下限阈值,所有 `reflected_at_sequence < last_sequence` 的 trace 都会反思。
 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,不做预计算统计。
-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 / 归档)。
 9. `[OPEN]` **review 的"edit"分支允许多深**:初版只支持改 markdown 字段(task/content/score/tags)。改 type 或 metadata 目前需 discard 重写。
 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 提取-审核-提交两阶段
 
 | 职责 | 位置 |
 |---|---|
-| 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 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
 
 | 职责 | 位置 |
 |---|---|
-| 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=...)` |
 | 默认 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:
 ```python
-from agent.core.memory import MemoryConfig
+from cyber_agent.core.memory import MemoryConfig
 
 RunConfig(
     memory=MemoryConfig(

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

@@ -21,7 +21,7 @@ Prompt 层 (SimplePrompt) → OpenAI 格式消息 → Provider 层适配 → 模
 
 ### 1. Prompt 层多模态支持
 
-**实现位置**:`agent/llm/prompts/wrapper.py:SimplePrompt`
+**实现位置**:`cyber_agent/llm/prompts/wrapper.py:SimplePrompt`
 
 **功能**:构建 OpenAI 格式的多模态消息
 
@@ -54,7 +54,7 @@ messages = prompt.build_messages(
 
 ### 2. Gemini Provider 适配
 
-**实现位置**:`agent/llm/gemini.py:_convert_messages_to_gemini`
+**实现位置**:`cyber_agent/llm/gemini.py:_convert_messages_to_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` |
 
 ### Core Skill
@@ -19,11 +19,11 @@ Skills 是 Agent 的领域知识库,存储在 Markdown 文件中。
 - Step 管理(计划、执行、进度)
 - 其他系统级功能
 
-**位置**:`agent/skills/core.md`
+**位置**:`cyber_agent/skill/skills/core.md`
 
 **加载方式**:
 - 框架自动注入到 System Prompt
-- `load_skills_from_dir()` 总是自动加载 `agent/skills/` 中的所有 skills(包括 `core.md`)
+- `load_skills_from_dir()` 总是自动加载 `cyber_agent/skill/skills/` 中的所有 skills(包括 `core.md`)
 
 ### 内置 Skill
 
@@ -32,7 +32,7 @@ Skills 是 Agent 的领域知识库,存储在 Markdown 文件中。
 - browser_use(浏览器自动化)
 - 其他领域 skills
 
-**位置**:`agent/skills/{name}/`
+**位置**:`cyber_agent/skill/skills/{name}/`
 
 **加载方式**:模型调用 `skill` 工具
 
@@ -95,8 +95,8 @@ mkdir skills
 **方式 1:自动加载到 System Prompt**
 
 ```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
 
 # 加载自定义 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 也会自动加载
 ```
 
 **方式 2:运行时动态加载**
 
 ```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
 
 runner = AgentRunner(
@@ -131,7 +131,7 @@ async for item in runner.run(
 ```
 
 **Agent 工作流**:
-1. Agent 启动时自动加载 `agent/skills/` 中的所有 skills(包括 `core.md`)
+1. Agent 启动时自动加载 `cyber_agent/skill/skills/` 中的所有 skills(包括 `core.md`)
 2. 如果提供了 `skills_dir`,也会加载自定义 skills 到 System Prompt
 3. Agent 接收任务
 4. Agent 可以调用 `list_skills()` 查看可用 skills
@@ -142,7 +142,7 @@ async for item in runner.run(
 ### 4. 手动测试
 
 ```python
-from agent.tools.builtin.skill import list_skills, skill
+from cyber_agent.tools.builtin.skill import list_skills, skill
 
 # 列出所有 skills
 result = await list_skills()
@@ -164,7 +164,7 @@ runner = AgentRunner(
     # 不需要指定 skills_dir,内置 skills 会自动加载
 )
 
-# 结果:agent/skills/ 中的所有 skills 都会被加载到 System Prompt
+# 结果:cyber_agent/skill/skills/ 中的所有 skills 都会被加载到 System Prompt
 ```
 
 ### 可选加载额外的自定义 Skills
@@ -175,7 +175,7 @@ runner = AgentRunner(
     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         ← 项目自定义
-# 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)
 
@@ -214,7 +214,7 @@ skill(skill_name="browser-use")
 
 **返回**: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)
 - 示例:`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)
 
 ```
-agent/tools/builtin/content/
+cyber_agent/tools/builtin/content/
 ├── __init__.py           # 空
 ├── tools.py              # 3 个 @tool 入口
 ├── 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 分的纯函数
 3. 把 `crawler.py` 的 `youtube_search` / `youtube_detail` / `x_search` 移到 `content/platforms/`
 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` 等
 3. 在 `baseClass.py` 底部新增 11 个 @tool 入口函数,每个内部根据 action 路由到对应的内部函数
 4. 从 `browser/__init__.py` 更新导出列表
-5. 更新 `agent/docs/tools.md` 的浏览器工具小节
+5. 更新 `cyber_agent/docs/tools.md` 的浏览器工具小节
 6. 更新现有的浏览器 prompt(破坏性)
 
 ### 未决策的设计问题
@@ -441,7 +441,7 @@ async def browser_interact(action, index, text, path, keys, clear):
 1. **破坏性改动集中做**——所有重命名、删除、合并都在同一个 PR 里完成,不要分期做。分期反而让用户迁移更痛苦
 2. **每个工具族都要有对应的 CLI 入口 + 自包含 `if __name__ == "__main__"`**——参考 toolhub / librarian 已有的模式
 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`
 
 **实现位置**:
-- 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.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 中重新实现。
 
 **实现位置**:
-- 工具实现:`agent/tools/builtin/`
-- 适配器层:`agent/tools/adapters/`
+- 工具实现:`cyber_agent/tools/builtin/`
+- 适配器层:`cyber_agent/tools/adapters/`
 - OpenCode 参考:`vendor/opencode/` (git submodule)
 
 **详细文档**:参考 [`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` 只画序号,传列表则在每格下方画标题。
 
-网格和降采样的实现在 `agent/tools/utils/image.py`,`content_search` 等内容工具也复用同一套拼图逻辑。
+网格和降采样的实现在 `cyber_agent/tools/utils/image.py`,`content_search` 等内容工具也复用同一套拼图逻辑。
 
 ### Agent 工具
 
@@ -975,11 +975,11 @@ async def agent(
 
 #### 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
 import asyncio
-from agent import invoke_agent
+from cyber_agent import invoke_agent
 
 result = asyncio.run(invoke_agent(
     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`:在**服务器** `knowhub/agents/` 下定义(如 `knowhub/agents/research.py`),客户端 presets 不需要配置
-- 详见 `agent/docs/architecture.md` 的 "Agent 预设" 章节
+- 详见 `cyber_agent/docs/architecture.md` 的 "Agent 预设" 章节
 
 ### Evaluate 工具
 
@@ -1032,12 +1032,12 @@ async def evaluate(
 - `sub_trace_ids` 记录所有创建的 Sub-Trace
 - Goal 完成后,`summary` 包含格式化的汇总结果
 
-**实现位置**:`agent/tools/builtin/subagent.py`
+**实现位置**:`cyber_agent/tools/builtin/subagent.py`
 
 ### 快速使用
 
 ```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)
@@ -1361,7 +1361,7 @@ async def search_notes(
 参数解析、asyncio.run、结果输出这些 CLI 样板代码**直接内联**在工具文件里,不要抽取到共享 `cli.py` 模块——这样每个工具文件可以独立迁移到其他项目。
 
 ```python
-# 示例:agent/tools/builtin/toolhub.py 末尾
+# 示例:cyber_agent/tools/builtin/toolhub.py 末尾
 if __name__ == "__main__":
     import sys, asyncio, os, uuid
 
@@ -1462,12 +1462,12 @@ python <绝对路径>/tool.py <子命令> --key=value
 <调用后怎么解读输出,典型 workflow>
 ```
 
-**尺寸原则:** SKILL.md **越短越好**。它每次触发时都会进入 context 占据 token。和 `agent/docs/tools.md` 的职责区分:
+**尺寸原则:** SKILL.md **越短越好**。它每次触发时都会进入 context 占据 token。和 `cyber_agent/docs/tools.md` 的职责区分:
 
 | 文件 | 读者 | 触发 | 长度 |
 |------|------|------|------|
 | `SKILL.md` | **运行时的 Claude Code**(动态加载) | 每次匹配自动加载到 context | **短**(20 行以内为佳) |
-| `agent/docs/tools.md` | **开发者**(静态阅读) | 从不自动加载 | 长,可以详细展开原理、设计取舍 |
+| `cyber_agent/docs/tools.md` | **开发者**(静态阅读) | 从不自动加载 | 长,可以详细展开原理、设计取舍 |
 
 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 数据模型
 ├── goal_models.py     # Goal/GoalTree 数据模型
 ├── protocols.py       # TraceStore 存储接口
@@ -70,7 +70,7 @@ trace.head_sequence   # 当前主路径头节点 sequence(用于 build_llm_mes
 - **主 Trace**:标准 UUID,例如 `2f8d3a1c-4b6e-4f9a-8c2d-1e5b7a9f3c4d`
 - **Sub-Trace**:`{parent_uuid}@{mode}-{timestamp}-{seq}`,例如 `2f8d3a1c...@explore-20260204220012-001`
 
-**实现**:`agent/trace/models.py:Trace`
+**实现**:`cyber_agent/trace/models.py:Trace`
 
 ### Message - 执行消息
 
@@ -103,7 +103,7 @@ tool_msg = Message.create(
 - `assistant` 消息:优先取 content 中的 text,若无 text 则生成 "tool call: XX, XX"
 - `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: ...
 ```
 
-**实现**:`agent/trace/protocols.py`
+**实现**:`cyber_agent/trace/protocols.py`
 
 ### FileSystemTraceStore
 
 ```python
-from agent.trace import FileSystemTraceStore
+from cyber_agent.trace import FileSystemTraceStore
 
 store = FileSystemTraceStore(base_path=".trace")
 ```
@@ -174,7 +174,7 @@ store = FileSystemTraceStore(base_path=".trace")
 - ✅ 每个 Sub-Trace 是顶层独立目录
 - ✅ 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 有效)
 - `goal_id`: 可选,按 Goal 过滤
 
-**实现**:`agent/trace/api.py`
+**实现**:`cyber_agent/trace/api.py`
 
 ### 控制端点
 
@@ -295,7 +295,7 @@ GET /api/experiences
 
 返回 `./.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"`
 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
-from agent.goal.explore import explore_tool
+from cyber_agent.goal.explore import explore_tool
 
 result = await explore_tool(
     current_trace_id="main_trace_id",
@@ -365,7 +365,7 @@ result = await explore_tool(
 将大任务委托给独立 Sub-Agent:
 
 ```python
-from agent.goal.delegate import delegate_tool
+from cyber_agent.goal.delegate import delegate_tool
 
 result = await delegate_tool(
     current_trace_id="main_trace_id",
@@ -386,8 +386,8 @@ result = await delegate_tool(
 ### Agent 执行时记录
 
 ```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")
 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"):
             return env_path
 
-        # 获取 agent 包的根目录(agent/llm/pricing.py -> agent/)
+        # 获取 agent 包的根目录(cyber_agent/llm/pricing.py -> agent/)
         agent_dir = Path(__file__).parent.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
 from pathlib import Path
 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:

+ 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 加载技能)
 """
 
-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__ = [
     "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
 import logging
 
-from agent.skill.models import Skill
+from cyber_agent.skill.models import Skill
 
 logger = logging.getLogger(__name__)
 
@@ -372,7 +372,7 @@ def load_skills_from_dir(skills_dir: Optional[str] = None) -> List[Skill]:
     从目录加载所有 Skills
 
     加载优先级:
-    1. 始终加载内置 skills(agent/skills/)
+    1. 始终加载内置 skills(cyber_agent/skill/skills/)
     2. 如果指定了 skills_dir,额外加载该目录的 skills
 
     Args:
@@ -383,7 +383,7 @@ def load_skills_from_dir(skills_dir: Optional[str] = None) -> List[Skill]:
     """
     all_skills = []
 
-    # 1. 加载内置 skills(agent/skill/skills/)
+    # 1. 加载内置 skills(cyber_agent/skill/skills/)
     builtin_skills_dir = Path(__file__).parent / "skills"
     if builtin_skills_dir.exists():
         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 生成
 """
 
-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 装饰器注册
 # noqa: F401 表示这是故意的副作用导入
-import agent.tools.builtin  # noqa: F401
+import cyber_agent.tools.builtin  # noqa: F401
 
 __all__ = [
 	"ToolRegistry",

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

@@ -4,8 +4,8 @@
 提供统一的适配器接口,将外部工具(如 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__ = [
     "ToolAdapter",

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

@@ -10,7 +10,7 @@
 from abc import ABC, abstractmethod
 from typing import Any, Callable, Dict
 
-from agent.tools.models import ToolResult, ToolContext
+from cyber_agent.tools.models import ToolResult, ToolContext
 
 
 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) {
-  // 从 agent/tools/adapters/ 定位到 vendor/opencode
+  // 从 cyber_agent/tools/adapters/ 定位到 vendor/opencode
   const toolPath = resolve(__dirname, '../../../../vendor/opencode/packages/opencode/src/tool')
 
   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 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):

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

@@ -6,8 +6,8 @@
 需要 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__ = [
     "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 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 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)
 """
 
-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)
-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_type="remote_librarian", task=...)         # 查询
 #   agent(agent_type="remote_librarian_ingest", 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,
     extract_video_clip, import_content,
 )
-from agent.trace.goal_tool import goal
+from cyber_agent.trace.goal_tool import goal
 # 导入浏览器工具以触发注册 (因 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__ = [
     # 文件操作

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

@@ -17,7 +17,7 @@ import logging
 from pathlib import Path
 from typing import Optional, Dict
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 # 常量
 DEFAULT_TIMEOUT = 120
@@ -46,7 +46,7 @@ logger = logging.getLogger(__name__)
 
 
 def _get_project_root() -> Path:
-    """获取项目根目录(bash.py 在 agent/tools/builtin/ 下)"""
+    """获取项目根目录(bash.py 在 cyber_agent/tools/builtin/ 下)"""
     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 重构)。
 """
 
-from agent.tools.builtin.browser.baseClass import (
+from cyber_agent.tools.builtin.browser.baseClass import (
     # 会话管理(非 @tool,供框架内部调用)
     init_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/ (在当前工作目录下)
   用于存储浏览器会话产生的临时文件(下载、上传、截图等)
-- 一般文件操作:请使用 agent.tools.builtin 中的文件工具 (read_file, write_file, edit_file)
+- 一般文件操作:请使用 cyber_agent.tools.builtin 中的文件工具 (read_file, write_file, edit_file)
   这些工具功能更完善,支持diff预览、智能匹配、分页读取等
 """
 import logging
@@ -66,8 +66,8 @@ sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
 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 的核心类
 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
 """
 
-from agent.tools.builtin.content.tools import (
+from cyber_agent.tools.builtin.content.tools import (
     content_platforms,
     content_search,
     content_detail,
     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__ = [
     "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
 
-from agent.tools import tool, ToolResult
+from cyber_agent.tools import tool, ToolResult
 
 AIGC_BASE_URL = "http://aigc-channel.aiddit.com/aigc/channel"
 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 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.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
 
-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,
 )
 
@@ -172,7 +172,7 @@ async def search(
     # 让 evaluator 用真实时长替代 body 长度作为内容信号。
     if evaluator and posts:
         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)
         except Exception as e:
             import logging
@@ -250,7 +250,7 @@ async def _build_images_collage(urls: List[str]) -> Optional[Dict[str, Any]]:
     img_bytes = buf.getvalue()
 
     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
 
         md5_hash = hashlib.md5(img_bytes).hexdigest()[:12]
@@ -303,7 +303,7 @@ async def detail(
         and has_video
         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
         try:
             transcript_text = await transcribe_video_from_post(platform_id, post)
@@ -327,7 +327,7 @@ async def detail(
 
         # cache writeback 不再以"成功"为前提:失败的 "" 也写回,让下次 cache hit 短路掉
         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")
         content_id = (
             post.get("channel_content_id")
@@ -414,7 +414,7 @@ async def _build_collage(posts: List[Dict[str, Any]]) -> Optional[str]:
     
     # 尝试上传到 CDN,替换冗长的 base64
     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
         
         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
 
-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"
 COMMENT_URL = "http://crawler.aiddit.com/crawler/x/comment"
@@ -49,7 +49,7 @@ async def search(
         # 让 evaluator 用真实时长替代 body 长度作为内容信号。
         if evaluator and tweets:
             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)
             except Exception as e:
                 import logging
@@ -121,7 +121,7 @@ async def _build_images_collage(urls: List[str]) -> Optional[Dict[str, Any]]:
     img_bytes = buf.getvalue()
 
     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
 
         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)也能拿到
     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:
             _cache.update_post_field(trace_id, "x", content_id, "author_comments", author_comments)
 
     # 视频字幕:检测到 video_url_list 时通过 Deepgram 转写 (default on, opt-out via extras)
     transcript_text: Optional[str] = post.get("video_transcript")  # cache hit reuse
     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)
         if 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:
                 _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()
     
     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
         
         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
 
-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,
 )
 
@@ -295,7 +295,7 @@ async def detail(post: Dict[str, Any], extras: Optional[Dict[str, Any]] = None)
     if download_video:
         import asyncio
         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)
             if 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
     transcribe_error: Optional[str] = None
     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"):
             post["video_id"] = content_id
         try:
@@ -335,7 +335,7 @@ async def detail(post: Dict[str, Any], extras: Optional[Dict[str, Any]] = None)
 
         # cache writeback 失败的 "" 也写,下次 cache hit 短路
         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")
         if trace_id and content_id:
             _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()
     
     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
         
         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 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
 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,
 )
-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:
@@ -273,7 +273,7 @@ def _parse_args(argv: list) -> dict:
 
 
 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 asyncio
 
@@ -287,7 +287,7 @@ def cli_main(argv: Optional[list] = None) -> None:
     }
 
     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)
 
     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(
@@ -59,7 +59,7 @@ async def get_current_context(
             chat_id = im_config.get("chat_id")
             if contact_id and chat_id:
                 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))
                     if notification:
                         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)
 
 __all__ = [

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

@@ -5,8 +5,8 @@ import httpx
 import asyncio
 from typing import Optional, List, Dict, Any, Union
 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:
     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_send_message_to_contact,
     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 命令。
 
 用法:
-    python -m agent.tools.builtin.feishu.feishu_agent
+    python -m cyber_agent.tools.builtin.feishu.feishu_agent
 
 环境变量:
     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:
     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_SECRET,
     get_contact_by_id,
     load_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')
 logger = logging.getLogger("FeishuAgent")
@@ -336,8 +336,8 @@ def _tool_run_bash(command: 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:
         return "错误:无法获取当前会话 ID"
@@ -356,8 +356,8 @@ def _tool_send_image(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:
         return "错误:无法获取当前会话 ID"
@@ -376,8 +376,8 @@ def _tool_send_file(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:
         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:
     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_SECRET, 
     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 re
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 @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 typing import Optional
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 # 常量
 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 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)

+ 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
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 # 常量(参考 opencode)
 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 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,
     downscale,
     encode_base64,
@@ -230,7 +230,7 @@ async def read_images(
 # 因此 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)
@@ -239,7 +239,7 @@ async def read_images(
 #   --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 \
 #     ~/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
 import difflib
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 
 @tool(description="写入文件内容(创建新文件、覆盖现有文件或追加内容)", hidden_params=["context"], groups=["core"])
@@ -78,7 +78,7 @@ async def write_file(
     # 落盘前自动将内容中的外站图片 URL 替换为自有 CDN 链接(仅处理文本文件)
     if not append:  # 追加模式不做替换,避免重复处理
         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)
         except Exception as cdn_err:
             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 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"])
@@ -70,7 +70,7 @@ async def write_json(
     try:
         # 落盘前自动将 JSON 数据中的外站图片 URL 替换为自有 CDN 链接
         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)
         except Exception as cdn_err:
             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 typing import Optional
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 # 常量
 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_check_notification,
     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
 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_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
 from dataclasses import dataclass
 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__)
 
@@ -29,16 +29,16 @@ class KnowledgeConfig:
 
     # 压缩时提取(消息量超阈值触发压缩时,在 Level 1 过滤前用完整 history 反思)
     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 可能中途退出等待人工评估)
     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
     # 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
 
     # 知识注入(agent切换当前工作的goal时,自动注入相关知识)
@@ -304,7 +304,7 @@ async def knowledge_save_pending(
     暂存一条待审核的知识提取(不直接写入 KnowHub)。
 
     写入 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。
 
     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 的执行历史,
 逐个 trace 做反思,再跨 trace 整合写回记忆文件。
@@ -15,7 +15,7 @@ from __future__ import annotations
 import logging
 from typing import Optional
 
-from agent.tools import tool, ToolResult, ToolContext
+from cyber_agent.tools import tool, ToolResult, ToolContext
 
 logger = logging.getLogger(__name__)
 
@@ -61,7 +61,7 @@ async def dream(
             error="runner dependencies missing",
         )
 
-    from agent.core.dream import run_dream
+    from cyber_agent.core.dream import run_dream
     report = await run_dream(
         store=runner.trace_store,
         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 httpx
 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("/")
 

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

@@ -9,13 +9,13 @@ import subprocess
 from pathlib import Path
 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)
 DEFAULT_SKILLS_DIRS = [
     os.getenv("SKILLS_DIR", "./skills"),      # 项目特定 skills(优先)
-    "./agent/skill/skills"                    # 框架内置 skills
+    "./cyber_agent/skill/skills"                    # 框架内置 skills
 ]
 
 # 默认单一目录(用于 list_skills)
@@ -36,7 +36,7 @@ def _check_skill_setup(skill_name: str) -> Optional[str]:
     if skill_name in ["browser-use", "browser_use"]:
         try:
             # 动态导入 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_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 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):
     """延迟导入 RunConfig 以避免循环导入"""
-    from agent.core.runner import RunConfig
+    from cyber_agent.core.runner import RunConfig
     return RunConfig(**kwargs)
 
 
@@ -347,7 +347,7 @@ def _make_event_printer(label: str):
     prefix = f"  [{label}]"
 
     def on_event(item):
-        from agent.trace.models import Trace, Message
+        from cyber_agent.trace.models import Trace, Message
         if isinstance(item, Message):
             if item.role == "assistant":
                 content = item.content

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels