refactor(runtime): remove Eino and make Pi the sole agent engine

Delete the Eino model adapters, callbacks, middleware, orchestration,
summarization and single-agent runner together with their dependencies.
Chat, batch tasks, workflow Agent nodes and sub-agents now share the Pi
runtime, and dispatch is a single code path instead of an engine switch.

Configuration migrates eino_middleware/eino_skills to runtime/skills and
drops the retired callback settings while old files still load. Settings,
i18n and docs describe Pi only. Also carry the Pi follow-up fixes: empty
required lists are omitted from tool schemas, historical tool results stay
with their call batch, model proxies work over HTTP/1.1, single-query
retrieval skips query expansion, and finalization docs match Pi lifecycle
events.
This commit is contained in:
Sycun committed 2026-11-12 17:55:36 +08:00
1 parent 35508eb614
commit cfaa95d7bd
473 files changed
+3481 -37365

No files matched your search

@@ -66,7 +66,7 @@ Cookie: ...
#### 发送到 CyberStrikeAI
- 弹窗选择:**项目 / 角色 / 对话模式**(动态 API)+ 测试指令
- 支持 **Eino Single**、**Deep**、**Plan-Execute**、**Supervisor**
- 支持 **Pi Single**、**Deep**、**Plan-Execute**、**Supervisor**
- **Latest XHR**:一键选中最近 API 请求并打开发送弹窗
- **Stop**:中止本地 SSE + 调用服务端 `/api/agent-loop/cancel`
@@ -1,5 +1,5 @@
const AGENT_MODES = [
{ id: 'eino_single', label: 'Eino Single (ADK)', path: '/api/eino-agent/stream' },
{ id: 'single', label: 'Pi Single', path: '/api/eino-agent/stream' },
{ id: 'deep', label: 'Deep (DeepAgent)', path: '/api/multi-agent/stream', orchestration: 'deep' },
{ id: 'plan_execute', label: 'Plan-Execute', path: '/api/multi-agent/stream', orchestration: 'plan_execute' },
{ id: 'supervisor', label: 'Supervisor', path: '/api/multi-agent/stream', orchestration: 'supervisor' },
@@ -144,7 +144,7 @@ async function loadConfig() {
tokenExpiresAt: sess[SESSION_TOKEN_EXPIRY_KEY] || '',
lastProjectId: data[STORAGE_KEYS.lastProjectId] || '',
lastRole: data[STORAGE_KEYS.lastRole] || '',
lastAgentMode: data[STORAGE_KEYS.lastAgentMode] || 'eino_single',
lastAgentMode: data[STORAGE_KEYS.lastAgentMode] || 'single',
lastInstruction: data[STORAGE_KEYS.lastInstruction] || DEFAULTS.lastInstruction,
filterApiOnly: data[STORAGE_KEYS.filterApiOnly] !== false,
captureEnabled: data[STORAGE_KEYS.captureEnabled] !== false,
@@ -763,7 +763,7 @@ async function onValidate() {
}
function fillAgentSelect(sel, selected) {
fillSelect(sel, AGENT_MODES.map((m) => ({ id: m.id, label: m.label })), selected || 'eino_single');
fillSelect(sel, AGENT_MODES.map((m) => ({ id: m.id, label: m.label })), selected || 'single');
}
function csSelectWrap(input) {
@@ -909,7 +909,7 @@ async function onSendConfirmed() {
const instruction = $('dlg-instruction').value.trim() || defaultInstruction();
const projectId = $('dlg-project').value || '';
const role = $('dlg-role').value || '';
const agentMode = $('dlg-agent').value || 'eino_single';
const agentMode = $('dlg-agent').value || 'single';
try {
await saveConfig({
@@ -986,11 +986,17 @@ function handleStreamEvent(runId, type, message, ev) {
if (message) appendToRun(runId, 'final', message);
break;
case 'eino_agent_reply_stream_start':
case 'agent_reply_stream_start':
appendToRun(runId, 'progress', '\n\n[Sub-agent reply]\n');
break;
case 'eino_agent_reply_stream_delta':
case 'agent_reply_stream_delta':
if (message) appendToRun(runId, 'progress', message);
break;
case 'eino_agent_reply':
case 'agent_reply':
if (message) appendToRun(runId, 'progress', '\n\n[Sub-agent reply]\n' + message + '\n');
break;
case 'progress':
appendToRun(runId, 'progress', '\n[progress] ' + message + '\n');
setRunStatus(runId, 'running');
@@ -6,7 +6,7 @@
- Configure **Host / Port / HTTPS / Username / Password** and choose an agent mode
- Click **Validate** to login (`POST /api/auth/login`) and verify token (`GET /api/auth/validate`)
- Right-click any HTTP message in Burp and send it to CyberStrikeAI for **streaming web pentest** (agent modes: **Eino Single**, Deep, Plan-Execute, Supervisor — maps to `/api/eino-agent/stream` or `/api/multi-agent/stream`)
- Right-click any HTTP message in Burp and send it to CyberStrikeAI for **streaming web pentest** (agent modes: **Pi Single**, Deep, Plan-Execute, Supervisor — maps to `/api/eino-agent/stream` or `/api/multi-agent/stream`)
- Keep a **test history sidebar** (searchable) so you can revisit previous runs
- Output is split into **collapsible Progress** + **Final Response** (Markdown rendering supported)
- View captured **Request / Response** for each run
@@ -11,7 +11,7 @@
- 弹出发送对话框,可针对**当前流量**选择:
- **项目**(`GET /api/projects`,新建对话时绑定 `projectId`)
- **角色**(`GET /api/roles`)
- **对话模式**(Eino 单代理 / Deep / Plan-Execute / Supervisor,按次选择并记住上次取值)
- **对话模式**(单代理 / Deep / Plan-Execute / Supervisor,按次选择并记住上次取值)
- **测试指令**(可编辑 prompt 前缀)
- 选择会记住上次取值,便于连续测同类流量
- **测试历史侧边栏(可搜索)**:每次发送都会新增一条记录,方便回看与对比
@@ -92,17 +92,21 @@ public class BurpExtender implements IBurpExtender, IContextMenuFactory {
tab.setFinalResponse(runId, message);
break;
case "eino_agent_reply_stream_start":
case "agent_reply_stream_start":
tab.appendProgressToRun(runId, "\n\n[子代理回复]\n");
break;
case "eino_agent_reply_stream_delta":
case "agent_reply_stream_delta":
if (message != null && !message.isEmpty()) {
tab.appendProgressToRun(runId, message);
}
break;
case "eino_agent_reply_stream_end":
case "agent_reply_stream_end":
tab.appendProgressToRun(runId, "\n");
break;
case "eino_agent_reply":
case "agent_reply":
if (message != null && !message.isEmpty()) {
tab.appendProgressToRun(runId, "\n\n[子代理回复]\n" + message + "\n");
}
@@ -40,7 +40,7 @@ final class CyberStrikeAIClient {
}
enum AgentMode {
EINO_SINGLE("Eino Single (ADK)", "/api/eino-agent/stream", null),
SINGLE("Pi Single", "/api/eino-agent/stream", null),
DEEP("Deep (DeepAgent)", "/api/multi-agent/stream", "deep"),
PLAN_EXECUTE("Plan-Execute", "/api/multi-agent/stream", "plan_execute"),
SUPERVISOR("Supervisor", "/api/multi-agent/stream", "supervisor");
@@ -295,12 +295,12 @@ final class CyberStrikeAIClient {
}
void streamTest(Config cfg, String token, String message, StreamListener listener) {
streamTest(cfg, token, message, "", "", AgentMode.EINO_SINGLE, listener);
streamTest(cfg, token, message, "", "", AgentMode.SINGLE, listener);
}
void streamTest(Config cfg, String token, String message, String role, String projectId,
AgentMode agentMode, StreamListener listener) {
AgentMode mode = agentMode != null ? agentMode : AgentMode.EINO_SINGLE;
AgentMode mode = agentMode != null ? agentMode : AgentMode.SINGLE;
String urlStr = cfg.baseUrl + mode.streamPath;
Map<String, Object> payload = new HashMap<>();
@@ -37,7 +37,7 @@ final class SendOptionsDialog {
) {
CyberStrikeAIClient.AgentMode defaultMode = lastAgentMode != null
? lastAgentMode
: CyberStrikeAIClient.AgentMode.EINO_SINGLE;
: CyberStrikeAIClient.AgentMode.SINGLE;
JPanel panel = new JPanel(new BorderLayout(0, 10));
panel.setBorder(BorderFactory.createEmptyBorder(4, 4, 0, 4));