feat: 工具系统迁移 + 重型插件骨架 + 前端交互增强

- 工具系统从 kilostar/plugin/tool_plugin/ 迁移到 data/toolset/(manifest.json 声明式)
- 新增 plugin_runtime 模块:BaseOrganization / GlobalPluginManager / loader / tool_bridge
- 新增 org_task + org_task_event 表及 DAO(alembic 0009)
- 新增 /api/v1/plugin 路由(submit/status/stream/install/reload)
- 新增 data/plugin/example_dept 示例重型插件
- regulatory_node 支持聊天历史上下文注入
- send_file 改为 artifact 存盘 + SSE 推送下载链接
- 前端 WorkflowFileCard 组件 + ToolSettings README 渲染
- utils 整理:合并 access/role_check、standalone_proxy→ray_compat、删除废弃模块
- 项目结构文档移至 docs/STRUCTURE.md 并详细展开

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
2026-06-17 05:20:00 +00:00
parent 9b73ae4db4
commit 6d658b4f4d
74 changed files with 2591 additions and 1308 deletions
+63
View File
@@ -0,0 +1,63 @@
"""组织事件协议:组织 → 前端/PG 的统一推送格式。"""
from __future__ import annotations
import time
from dataclasses import dataclass, field
from typing import Any, Dict, List, Literal
OrgEventType = Literal[
"log", # 普通文本日志
"step", # 阶段推进(agent 切换、工具调用前后)
"artifact", # 生成了产物(沿用 send_file 的 url 协议)
"approval_request", # 需要用户审批
"done", # 任务完成
"error", # 任务失败
]
@dataclass
class OrgEvent:
"""组织事件:一个 task 的执行过程会产生一连串这种事件。
被 SSE 推给前端面板,被 DAO 追加到 ``org_task.events`` JSONB 字段。
序列化用 ``to_dict``,反序列化用 ``from_dict``。
"""
task_id: str
type: OrgEventType
payload: Dict[str, Any] = field(default_factory=dict)
ts: float = field(default_factory=time.time)
def to_dict(self) -> Dict[str, Any]:
return {
"task_id": self.task_id,
"type": self.type,
"payload": self.payload,
"ts": self.ts,
}
@classmethod
def from_dict(cls, data: Dict[str, Any]) -> "OrgEvent":
return cls(
task_id=data["task_id"],
type=data["type"],
payload=data.get("payload", {}),
ts=data.get("ts", time.time()),
)
@dataclass
class TaskState:
"""组织内存中的任务状态(重启不保留,但事件流通过 PG 持久化)。"""
task_id: str
org_name: str
trace_id: str
user_id: str
status: Literal["pending", "running", "completed", "failed"] = "pending"
description: str = ""
source: Literal["cabinet", "user"] = "user"
events: List[OrgEvent] = field(default_factory=list)
result: Any = None
error: str | None = None