Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
132 commits
Select commit Hold shift + click to select a range
1473f07
fix(langfuse): restore trace capture for SDK v4
xiami762 Apr 25, 2026
55e0152
feat(webui): add runtime model failover
Jul 21, 2026
443779c
fix(webui): harden auto model failover
Jul 22, 2026
4be6b84
chore: merge dev into langfuse observability fix
Jul 22, 2026
dd1519d
feat(webui): simplify automatic model failover
Jul 22, 2026
83a98e3
Merge remote-tracking branch 'origin/dev' into feat/webui-auto-model-…
Jul 22, 2026
02950e8
fix(hub,webui): resolve WinError 5 on Windows SOC WebUI plugin install
HerryOS Jul 22, 2026
b9b5424
Merge remote-tracking branch 'origin/dev' into feat/webui-auto-model-…
Jul 22, 2026
dabc332
fix(cli,tests): decode Windows subprocess output as utf-8/replace; ma…
HerryOS Jul 22, 2026
2411bd4
fix(webui): recover missing question prompts
Jul 22, 2026
9fc5560
fix(webui): scope question recovery to current turn
Jul 22, 2026
b293ea0
fix(webui): reconcile optimistic user messages by id
Jul 22, 2026
6d1f17f
chore: sync main into dev after main-a4d183003100
github-actions[bot] Jul 23, 2026
0841b78
Merge pull request #615 from AgentFlocks/chore/sync-main-into-dev-mai…
duguwanglong Jul 23, 2026
528e7ee
fix(webui): bound restart readiness requests
xiami762 Jul 23, 2026
e093ba5
Merge pull request #616 from AgentFlocks/fix/restart-readiness-fetch-…
stephamie7 Jul 23, 2026
de91c81
fix(supervisor): debounce backend port probe failures
xiami762 Jul 23, 2026
ef340b2
Merge pull request #600 from AgentFlocks/fix/session-question-recovery
stephamie7 Jul 23, 2026
d4810f6
Merge remote-tracking branch 'origin/dev' into feat/webui-auto-model-…
xiami762 Jul 23, 2026
ca5cd10
fix(session): make LLM stream timeouts adaptive
xiami762 Jul 23, 2026
e123c63
fix(channel): honor persisted auto model mode
xiami762 Jul 23, 2026
91e2125
Merge pull request #594 from AgentFlocks/feat/webui-auto-model-failover
duguwanglong Jul 23, 2026
1065ad8
ci: trigger autotest dispatch on release publish
stephamie7 Jul 23, 2026
fc91657
feat(webui): refresh session management layout
duguwanglong Jul 23, 2026
d9d63f2
fix(provider): align Kimi reasoning protocols
xiami762 Jul 23, 2026
50fe2e7
merge: integrate origin/dev and refresh session UI
duguwanglong Jul 23, 2026
d20184b
Merge pull request #617 from AgentFlocks/fix/supervisor-port-probe-de…
stephamie7 Jul 23, 2026
66d5e28
feat(webui): align session execution timeline with design
duguwanglong Jul 23, 2026
2164a72
fix(provider): explicitly enable Kimi K2.7 thinking
xiami762 Jul 23, 2026
be3a39d
fix(webui): choose project before creating session
duguwanglong Jul 23, 2026
619352e
fix(dev): proxy browser requests to backend
duguwanglong Jul 23, 2026
1d45e28
fix(webui): keep project picker closed for new sessions
duguwanglong Jul 23, 2026
6f664df
Merge branch 'dev' into fix/adaptive-llm-stream-timeouts
xiami762 Jul 23, 2026
914844f
fix(webui): restore delegated subagent execution view
duguwanglong Jul 23, 2026
86e693e
fix(webui): sync subagent conversation display
duguwanglong Jul 23, 2026
9472b6f
fix(session): omit temperature from goal judge
xiami762 Jul 23, 2026
1a99742
style(webui): increase session page typography
duguwanglong Jul 23, 2026
95a99a8
Merge pull request #618 from AgentFlocks/fix/adaptive-llm-stream-time…
duguwanglong Jul 23, 2026
ad5793a
fix(webui): label skill loading tool clearly
duguwanglong Jul 23, 2026
a6717df
fix(webui): align chat labels and skill loading display
duguwanglong Jul 23, 2026
dc784e5
style(webui): neutralize user message bubbles
duguwanglong Jul 23, 2026
17e748b
Merge branch 'dev' of github.com:AgentFlocks/flocks into codex/sessio…
duguwanglong Jul 23, 2026
b48fc81
feat(provider): update Moonshot Kimi model catalog
xiami762 Jul 23, 2026
6307bdf
feat(webui): rename sessions as workbench tasks
duguwanglong Jul 23, 2026
1053e43
chore(webui): rename workspace navigation label
duguwanglong Jul 23, 2026
fbb391b
fix(provider): correct Kimi K3 request defaults
xiami762 Jul 23, 2026
9a8e63b
Merge pull request #620 from AgentFlocks/fix/kimi-reasoning-protocols
duguwanglong Jul 23, 2026
26093c4
Merge pull request #599 from AgentFlocks/fix/langfuse-v4-observability
duguwanglong Jul 24, 2026
f925e0e
feat: add session execution modes
Jul 24, 2026
8c3c133
feat(session): enhance workbench activity feedback
duguwanglong Jul 24, 2026
b350646
style(webui): remove workbench header menu
duguwanglong Jul 24, 2026
78df415
feat(session): unify workbench presentation
duguwanglong Jul 24, 2026
b5a638b
refactor: remove ask execution mode
Jul 24, 2026
9f98e85
style(session): normalize workbench icon sizing
duguwanglong Jul 24, 2026
f6a6c7d
style(session): simplify task search placeholder
duguwanglong Jul 24, 2026
23a425d
feat(hooks): expand agent lifecycle hooks
Jul 24, 2026
18d994f
Merge remote-tracking branch 'origin/dev' into feat/claude-style-life…
Jul 24, 2026
f3da1c5
fix(provider): preserve compatible provider behavior
Jul 24, 2026
3db3434
style(session): align workbench sidebar content
duguwanglong Jul 24, 2026
26a8cf9
style(session): unify task group collapse control
duguwanglong Jul 24, 2026
abbdabd
fix(provider): normalize OpenAI reasoning usage
Jul 24, 2026
455ba78
Merge pull request #623 from AgentFlocks/feat/session-management-dark-ui
xiami762 Jul 24, 2026
9a83279
Merge pull request #625 from AgentFlocks/fix/provider-compatibility-r…
duguwanglong Jul 24, 2026
0e05608
fix(hooks): harden lifecycle termination boundaries
Jul 24, 2026
eb1547b
feat: add plan approval and goal feedback
Jul 24, 2026
6cc2d00
Merge remote-tracking branch 'origin/dev' into feat/execution-modes
Jul 24, 2026
075698b
fix(hooks): normalize interrupted lifecycle states
Jul 24, 2026
4a41b3b
test(workflow): isolate poller persistence
Jul 24, 2026
8313ae2
feat: persist session plan artifacts
Jul 24, 2026
6650732
Merge pull request #624 from AgentFlocks/feat/claude-style-lifecycle-…
duguwanglong Jul 24, 2026
44097db
Add Kimi K2.7 Code HighSpeed model
Jul 24, 2026
48c43ec
Merge remote-tracking branch 'origin/dev' into feat/execution-modes
Jul 24, 2026
920549d
Merge pull request #626 from AgentFlocks/codex/add-kimi-k27-k3-models
stephamie7 Jul 24, 2026
7582750
fix(session): unify conversation history rendering
duguwanglong Jul 24, 2026
3d597d1
Merge pull request #627 from AgentFlocks/feat/session-conversation-ui
stephamie7 Jul 24, 2026
fc47de6
fix(plan): improve approval handoff and delegation
Jul 27, 2026
0738868
fix(webui): harden session loading and presentation
duguwanglong Jul 27, 2026
fda5e75
fix(plan): structure adjustment feedback
Jul 27, 2026
c2b0bd1
style(webui): refine session workspace hierarchy
Jul 27, 2026
05e90be
Merge pull request #628 from AgentFlocks/feat/fix-session-loading-con…
xiami762 Jul 27, 2026
4301305
feat(session): add archived task management
duguwanglong Jul 27, 2026
1e4e623
Merge branch 'dev' of github.com:AgentFlocks/flocks into feat/archive…
duguwanglong Jul 27, 2026
3fc52f6
fix(session): refine archive management UI
duguwanglong Jul 27, 2026
8192493
fix(session): remove redundant create-session buttons
duguwanglong Jul 27, 2026
8acb518
fix(session): highlight archive restore action
duguwanglong Jul 27, 2026
6066f3e
Merge pull request #622 from AgentFlocks/feat/execution-modes
duguwanglong Jul 27, 2026
417e329
Merge branch 'dev' of github.com:AgentFlocks/flocks into feat/archive…
duguwanglong Jul 27, 2026
dca454c
feat(tool): add timestamp formats to get_time
duguwanglong Jul 27, 2026
4bb3200
feat(webui): add composer resource picker
Jul 27, 2026
3d86443
merge: sync dev into composer resource picker
Jul 27, 2026
fb2442d
fix(session): harden archive lifecycle and cleanup
duguwanglong Jul 27, 2026
da17309
fix(webui): refine composer resource picker
Jul 27, 2026
d58c7b9
Merge pull request #629 from AgentFlocks/feat/archive-management
xiami762 Jul 27, 2026
002dd43
Merge pull request #631 from AgentFlocks/feat/get-time-timestamp
xiami762 Jul 27, 2026
7fdc11b
fix(hub): restore plugin backup when swap fails
duguwanglong Jul 27, 2026
57ed0fb
Merge branch 'dev' of github.com:AgentFlocks/flocks into codex/pr-602…
duguwanglong Jul 27, 2026
67f6e1d
fix(session): preserve prompt queue across archive restore
duguwanglong Jul 27, 2026
a2d3198
Merge pull request #632 from AgentFlocks/fix/restore-archived-queue-i…
stephamie7 Jul 27, 2026
ecd8944
Merge pull request #602 from HerryOS/fix/webui-soc-winerror5
xiami762 Jul 27, 2026
bbbe48b
fix(cli): add safe server-only restart
Jul 27, 2026
717f2bc
fix(webui): recover chat state after server restart
Jul 27, 2026
d588e88
Merge pull request #633 from AgentFlocks/fix/safe-server-only-restart
stephamie7 Jul 28, 2026
57970b7
fix(soc): 优化态势指标与告警筛选
duguwanglong Jul 28, 2026
73901cc
fix(soc): 校正威胁字段与严重等级口径
duguwanglong Jul 28, 2026
327d63a
fix(cli): rebuild stale WebUI assets on restart
xiami762 Jul 28, 2026
9b66847
feat(session): support moving tasks between projects
duguwanglong Jul 28, 2026
8a6c30a
docs: move hooks guide into docs directory
xiami762 Jul 28, 2026
bd0c0d2
fix(session): reset replay boundary when clearing history
duguwanglong Jul 28, 2026
de08a21
Merge pull request #638 from AgentFlocks/feat/move-task-to-project
xiami762 Jul 28, 2026
5ad115d
Merge pull request #636 from AgentFlocks/fix/rebuild-stale-webui
duguwanglong Jul 28, 2026
c0f2439
chore: stop tracking docs
xiami762 Jul 28, 2026
923eb01
Merge pull request #639 from AgentFlocks/chore/stop-tracking-docs
duguwanglong Jul 28, 2026
4c1456c
Merge pull request #635 from AgentFlocks/fix/soc-dashboard-metrics
stephamie7 Jul 28, 2026
5d95d1f
feat: add HTTP EDR login and dashboard API collection
luguili-booker Jul 28, 2026
9f5dc60
Merge pull request #640 from AgentFlocks/codex/edr-http-login-dashboa…
duguwanglong Jul 28, 2026
60078ce
Merge pull request #630 from AgentFlocks/feat/composer-resource-picker
duguwanglong Jul 28, 2026
230a307
fix: diagnose EDR HTTP login failures
luguili-booker Jul 28, 2026
ca71e46
Merge pull request #642 from AgentFlocks/codex/edr-http-login-dashboa…
duguwanglong Jul 28, 2026
0aa8240
fix: probe EDR auth with agent overview API
luguili-booker Jul 28, 2026
c4292a6
docs: make EDR runtime paths installation independent
luguili-booker Jul 28, 2026
a14f865
Merge pull request #643 from AgentFlocks/codex/edr-http-login-dashboa…
duguwanglong Jul 28, 2026
16998a8
feat: add opt-in EDR HTTP login tracing
luguili-booker Jul 29, 2026
165eaed
Revert "feat: add opt-in EDR HTTP login tracing"
luguili-booker Jul 29, 2026
9b445bd
refactor: split EDR login and dashboard modules
luguili-booker Jul 29, 2026
547353f
fix: request EDR ui after http login
luguili-booker Jul 29, 2026
d744c60
refactor: remove legacy EDR HTTP login flow
luguili-booker Jul 29, 2026
1fc30d1
docs: define EDR login fallback policy
luguili-booker Jul 29, 2026
4b49a70
Merge pull request #644 from AgentFlocks/codex/edr-http-login-dashboa…
duguwanglong Jul 29, 2026
0ff1381
ci: match autotest fallback by release version
stephamie7 Jul 29, 2026
3c88a39
ci: match fallback artifacts by release version
stephamie7 Jul 29, 2026
387874a
chore: bump version to v2026.7.29
stephamie7 Jul 29, 2026
adf9564
Merge pull request #619 from AgentFlocks/fix-autotest-release-trigger
duguwanglong Jul 29, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .flocks/flockshub/index.json
Original file line number Diff line number Diff line change
Expand Up @@ -14640,7 +14640,7 @@
"name": "SOC Workspace WebUI",
"description": "SOC workspace pages for posture, overview, and alert investigation.",
"descriptionCn": "SOC 工作区页面,包含态势、SOC 总览和告警调查。",
"version": "1.0.0",
"version": "1.1.4",
"category": "workflow-automation",
"tags": [
"siem",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,8 @@
"_source_type",
"net_type",
"direction",
"threat_severity",
"threat_level",
"threat_name",
"threat_type",
"threat_phase",
Expand Down Expand Up @@ -228,7 +230,7 @@ def _incident_from_row(row: InternalDataRow) -> dict[str, Any]:
record = row.raw
record_id = _record_id(record)
observed_at = _observed_at(record)
threat_name = _first_text(record, "threat_name", "_threat_type", "report_title") or "SOC alert"
threat_name = _first_text(record, "threat_name", "report_title") or "SOC alert"
threat_msg = _first_text(record, "threat_msg", "report_title", "threat_type")
verdict = _verdict_bucket(record)
table_cells = _table_cells(record)
Expand Down Expand Up @@ -425,7 +427,7 @@ def _verdict_bucket(record: dict[str, Any]) -> str:
return "success"
raw = " ".join(
_text(record.get(key)).lower()
for key in ("attack_verdict", "threat_result", "risk_level", "threat_level")
for key in ("attack_verdict", "threat_result")
)
if any(marker in raw for marker in ("success", "attack_success", "succeeded")):
return "success"
Expand Down
2 changes: 1 addition & 1 deletion .flocks/flockshub/plugins/webuis/soc_ui/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
"name": "SOC Workspace WebUI",
"description": "SOC workspace pages for posture, overview, and alert investigation.",
"descriptionCn": "SOC 工作区页面,包含态势、SOC 总览和告警调查。",
"version": "1.0.0",
"version": "1.1.4",
"author": "Flocks Team",
"license": "MIT",
"homepage": "",
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
type Translate = (text: string) => string;

const identityTr: Translate = (text) => text;

const FILTER_VALUE_TEXT: Record<string, Record<string, string>> = {
direction: {
in: '入站',
inbound: '入站',
ingress: '入站',
out: '出站',
outbound: '出站',
egress: '出站',
lateral: '横向',
},
threat_severity: {
critical: '严重',
severe: '严重',
high: '高危',
medium: '中危',
low: '低危',
info: '信息',
informational: '信息',
},
threat_level: {
critical: '严重',
severe: '严重',
high: '高危',
medium: '中危',
low: '低危',
info: '信息',
informational: '信息',
},
threat_phase: {
recon: '侦察',
reconnaissance: '侦察',
access: '访问',
initial_access: '初始访问',
execution: '执行',
persistence: '持久化',
privilege_escalation: '权限提升',
defense_evasion: '防御规避',
credential_access: '凭据访问',
discovery: '发现',
lateral_movement: '横向移动',
collection: '收集',
command_and_control: '命令与控制',
exfiltration: '数据渗出',
impact: '影响',
exploit: '利用',
exploitation: '利用',
},
threat_result: {
attack_success: '攻击成功',
success: '成功',
succeeded: '成功',
attack_failed: '攻击失败',
failed: '失败',
blocked: '已阻断',
detected: '已检测',
attack: '攻击行为',
benign: '安全',
safe: '安全',
normal: '正常',
unknown: '未知',
},
};

function normalized(value: string) {
return value.trim().toLowerCase();
}

function localizedValueText(key: string, value: string) {
return FILTER_VALUE_TEXT[key]?.[normalized(value)] || '';
}

export function filterOptionText(key: string, value: string, tr: Translate = identityTr) {
if (key === 'rsp_status_code') return value || tr('未知响应');
if (key === '_source_type' || key === 'net_type') return value || 'unknown';
const localizedText = localizedValueText(key, value);
return localizedText ? tr(localizedText) : value || tr('空值');
}

export function matchesFilterOptionSearch(
key: string,
value: string,
search: string,
tr: Translate = identityTr,
) {
const query = normalized(search);
if (!query) return true;
const localizedText = localizedValueText(key, value);
return [value, localizedText, localizedText ? tr(localizedText) : '']
.some((candidate) => normalized(candidate).includes(query));
}
43 changes: 38 additions & 5 deletions .flocks/flockshub/plugins/webuis/soc_ui/soc_alerts/src/index.tsx
Original file line number Diff line number Diff line change
@@ -1,8 +1,9 @@
import { Fragment, useCallback, useEffect, useMemo, useRef, useState } from 'react';
import { api } from '@flocks/webui-contract-sdk';
import { filterOptionText, matchesFilterOptionSearch } from './filterValues';

type Tone = 'red' | 'orange' | 'blue' | 'green' | 'purple' | 'slate';
type FilterKey = '_source_type' | 'net_type' | 'direction' | 'threat_name' | 'threat_type' | 'threat_phase' | 'threat_result' | 'rsp_status_code' | 'sip' | 'dport' | 'dip' | 'req_host' | 'threat_rule_id';
type FilterKey = '_source_type' | 'net_type' | 'direction' | 'threat_severity' | 'threat_level' | 'threat_name' | 'threat_type' | 'threat_phase' | 'threat_result' | 'rsp_status_code' | 'sip' | 'dport' | 'dip' | 'req_host' | 'threat_rule_id';
type TimeRangeKey = '15m' | '1h' | '2h' | '24h' | 'today' | '7d' | '30d';
type TimeFilterMode = 'relative' | 'custom';
type TimePanelTab = 'auto' | 'custom';
Expand Down Expand Up @@ -201,6 +202,8 @@ const EN_TEXT: Record<string, string> = {
'数据源': 'Data Source',
'协议类型': 'Protocol',
'流量方向': 'Traffic Direction',
'严重等级': 'Severity',
'威胁级别': 'Threat Level',
'威胁名称': 'Threat Name',
'威胁类型': 'Threat Type',
'攻击阶段': 'Attack Stage',
Expand Down Expand Up @@ -261,6 +264,34 @@ const EN_TEXT: Record<string, string> = {
'展开趋势图': 'Expand timeline',
'攻击成功': 'Attack Success',
'攻击失败': 'Attack Failed',
'入站': 'Inbound',
'出站': 'Outbound',
'横向': 'Lateral',
'严重': 'Critical',
'高危': 'High',
'中危': 'Medium',
'低危': 'Low',
'信息': 'Informational',
'侦察': 'Reconnaissance',
'初始访问': 'Initial Access',
'执行': 'Execution',
'持久化': 'Persistence',
'权限提升': 'Privilege Escalation',
'防御规避': 'Defense Evasion',
'凭据访问': 'Credential Access',
'发现': 'Discovery',
'横向移动': 'Lateral Movement',
'收集': 'Collection',
'命令与控制': 'Command and Control',
'数据渗出': 'Exfiltration',
'影响': 'Impact',
'利用': 'Exploitation',
'成功': 'Success',
'失败': 'Failed',
'已阻断': 'Blocked',
'已检测': 'Detected',
'安全': 'Benign',
'正常': 'Normal',
'未知': 'Unknown',
'暂无可展示的告警数据。': 'No alerts to display.',
'显示 {start}-{end} / {total} 条,每页 {pageSize} 条': 'Showing {start}-{end} / {total}, {pageSize} per page',
Expand Down Expand Up @@ -356,6 +387,8 @@ const BASE_FILTER_CONFIGS: FilterConfig[] = [
{ key: '_source_type', label: '数据源' },
{ key: 'net_type', label: '协议类型' },
{ key: 'direction', label: '流量方向' },
{ key: 'threat_severity', label: '严重等级' },
{ key: 'threat_level', label: '威胁级别' },
{ key: 'threat_name', label: '威胁名称' },
];

Expand All @@ -377,6 +410,8 @@ const DEFAULT_FILTER_VALUES: Record<FilterKey, string[]> = {
_source_type: ['tdp'],
net_type: ['http'],
direction: [],
threat_severity: [],
threat_level: [],
threat_name: [],
threat_type: [],
threat_phase: [],
Expand Down Expand Up @@ -990,9 +1025,7 @@ function readFilterValue(incident: IncidentCluster, key: FilterKey) {
}

function optionText(key: FilterKey, value: string, tr: Translate = identityTr) {
if (key === 'rsp_status_code') return value || tr('未知响应');
if (key === '_source_type' || key === 'net_type') return value || 'unknown';
return value || tr('空值');
return filterOptionText(key, value, tr);
}

function optionLabel(key: FilterKey, value: string | string[], tr: Translate = identityTr) {
Expand Down Expand Up @@ -1118,7 +1151,7 @@ function FilterDropdown({
}, [open, value]);

const choices = options.filter((option) => option && option !== ALL_FILTER_VALUE);
const visibleChoices = choices.filter((choice) => optionText(config.key, choice, tr).toLowerCase().includes(search.trim().toLowerCase()));
const visibleChoices = choices.filter((choice) => matchesFilterOptionSearch(config.key, choice, search, tr));
const selected = new Set(draft.map(normalized));

const toggleChoice = (choice: string) => {
Expand Down
Loading
Loading