Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
101 commits
Select commit Hold shift + click to select a range
71c508b
Add Pro prompt redaction integration
Jul 13, 2026
40710fc
Harden prompt redaction hook handling
Jul 14, 2026
7de5e1e
Harden Pro prompt redaction integration
Jul 20, 2026
09d4c54
feat(memory): add global and session search
Jul 30, 2026
4a479e6
fix(subagent): preserve interruption state and prevent replay
Aug 4, 2026
a7217cf
fix(subagent): preserve session metadata on cancellation
Aug 4, 2026
a689fba
Improve SOC dashboard activity context
Aug 4, 2026
8d64a23
Fix SOC task center metric semantics
Aug 4, 2026
84b85e2
Fix SOC task center overview totals
Aug 4, 2026
0a877c4
Refine SOC task center section metrics
Aug 4, 2026
dfe30a9
Merge remote-tracking branch 'origin/dev' into codex/situation-page-t…
Aug 4, 2026
76696f0
chore: sync main into dev after main-57f86dbd0e47
github-actions[bot] Aug 4, 2026
35d8cd4
Merge pull request #675 from AgentFlocks/chore/sync-main-into-dev-mai…
duguwanglong Aug 4, 2026
922d1f7
Merge pull request #676 from AgentFlocks/codex/situation-page-test-opt
duguwanglong Aug 4, 2026
c44b138
refactor(memory): establish filesystem memory foundation
Jul 30, 2026
15d51dd
fix(memory): sync index before every search
Aug 3, 2026
bfc9119
feat(workspace): organize and edit memory files
Aug 3, 2026
0061809
Merge pull request #677 from AgentFlocks/codex/resubmit-memory-founda…
duguwanglong Aug 5, 2026
9e6238d
Merge origin/dev into feat/memory-search
xiami762 Aug 5, 2026
6e1a67b
feat(webui): configure ordered auto fallback models
xiami762 Aug 5, 2026
ee1a2b2
refactor(auto): consolidate fallback routing helpers
xiami762 Aug 5, 2026
c3b5e10
fix(memory): isolate memory and session search
Aug 6, 2026
178d559
Merge pull request #669 from AgentFlocks/fix/subagent-interrupt-retry…
stephamie7 Aug 6, 2026
1e0864c
refactor(hooks): remove unused slug generator
Aug 6, 2026
19e7864
Merge pull request #665 from AgentFlocks/feat/memory-search
duguwanglong Aug 6, 2026
1e2e2a1
merge(dev): resolve configurable fallback model conflicts
Aug 6, 2026
dfc7deb
Merge pull request #678 from AgentFlocks/feat/configurable-auto-fallb…
duguwanglong Aug 6, 2026
6189828
fix(session): unify retry policy across model modes
Aug 6, 2026
a66ca5a
Merge pull request #679 from AgentFlocks/fix/unify-session-retry-policy
stephamie7 Aug 6, 2026
3e282e4
fix(webui): exclude fixed prompt costs from context usage
duguwanglong Aug 6, 2026
71119c8
Merge pull request #680 from AgentFlocks/fix/initial-context-usage
xiami762 Aug 6, 2026
fa5ffae
feat(syslog): support Sangfor SE format
duguwanglong Aug 6, 2026
04b1e12
Merge pull request #681 from AgentFlocks/feat/syslog-se-format
xiami762 Aug 6, 2026
d870fcf
feat: collect EDR threat asset analysis APIs
luguili-booker Aug 6, 2026
a44c636
fix: support 163 email channel setup
Aug 7, 2026
5bd6856
Merge pull request #683 from AgentFlocks/codex/fix-163-imap-id
stephamie7 Aug 7, 2026
c1cd260
fix(release): gate Gitee release on matching tag SHA
stephamie7 Aug 7, 2026
b5f96c3
fix(workflow): prevent isolated RPC memory growth
duguwanglong Aug 7, 2026
c382958
refactor(tools): simplify tool definitions and scheduling
Aug 7, 2026
b6e35af
fix(tools): distinguish scheduler catalog tags
Aug 7, 2026
6bf41b6
fix: parse DeepSeek DSML tool calls
Aug 7, 2026
b4c5e9d
fix(workflow): bound RPC response memory
duguwanglong Aug 7, 2026
0f4f5a4
Merge pull request #686 from AgentFlocks/refactor/simplify-tool-defin…
duguwanglong Aug 7, 2026
5f84f22
Merge pull request #685 from AgentFlocks/fix/scheduled-workflow-memory
stephamie7 Aug 7, 2026
bfa701a
Merge pull request #687 from AgentFlocks/codex/fix-deepseek-dsml-tool…
duguwanglong Aug 7, 2026
2d030ef
feat(prompt): require approval for Flocks config operations
duguwanglong Aug 7, 2026
67c8a72
fix: support distinct email login username
Aug 7, 2026
9a5ced5
feat: support email XOAUTH2 authentication
Aug 7, 2026
0f33b17
fix: clear stale email auth credentials
Aug 7, 2026
b634e6d
fix(browser): restore current-profile inspect flow
xiami762 Aug 7, 2026
beb9c7d
feat(config): unify model settings and reasoning defaults
xiami762 Aug 8, 2026
be9dae0
Merge pull request #691 from AgentFlocks/fix/restore-browser-inspect-…
stephamie7 Aug 10, 2026
96e58a6
refactor(config): limit changes to reasoning effort
xiami762 Aug 10, 2026
54d9fd5
fix(workflow): bound model response memory
duguwanglong Aug 10, 2026
6fd5652
Merge pull request #690 from AgentFlocks/codex/email-username-login
stephamie7 Aug 11, 2026
de39a6e
Merge pull request #693 from AgentFlocks/fix/diagnose-workflow-memory…
stephamie7 Aug 11, 2026
28bce32
Merge pull request #682 from AgentFlocks/codex/edr-threat-assets-api
duguwanglong Aug 11, 2026
232e021
fix(webui): deduplicate bash tool errors
xiami762 Aug 11, 2026
02200e4
Merge origin/dev into codex/pro-prompt-redaction-clean
stephamie7 Aug 11, 2026
e55c873
Merge pull request #538 from AgentFlocks/codex/pro-prompt-redaction-c…
stephamie7 Aug 11, 2026
7a54151
feat: add EDR asset inventory classification API
luguili-booker Aug 11, 2026
b9287e7
Merge pull request #694 from AgentFlocks/fix/webui-deduplicate-bash-e…
stephamie7 Aug 12, 2026
9c2c447
feat(provider): update Alibaba Qwen model catalog
Aug 12, 2026
382d3ad
Merge pull request #692 from AgentFlocks/feat/reasoning-effort-levels
duguwanglong Aug 12, 2026
e2a0933
Merge pull request #689 from AgentFlocks/feat/protect-flocks-config-o…
stephamie7 Aug 12, 2026
0344133
fix(compaction): account for post-call tool results
duguwanglong Aug 12, 2026
04af11a
Merge pull request #699 from AgentFlocks/fix/proactive-context-compac…
stephamie7 Aug 12, 2026
f7bda7b
fix: add manual Gitee release retry
stephamie7 Aug 12, 2026
3ea1ce4
fix(ci): retry QEMU setup on pull timeout
stephamie7 Aug 12, 2026
00f79f2
feat: converge session execution policy controls
chenjie-booker Jul 29, 2026
e4d573f
fix: restore session policy controls
chenjie-booker Jul 29, 2026
598581b
fix: align Slack and email channel security
chenjie-booker Jul 29, 2026
5bb018f
fix: preserve ingress context and session permission defaults
chenjie-booker Jul 30, 2026
e880ba5
fix: keep HTTP controls outside action approval
chenjie-booker Jul 30, 2026
3132b73
refactor: decouple core execution policy
chenjie-booker Jul 30, 2026
a5b1444
feat: integrate filesystem control hooks and UI policy details
chenjie-booker Jul 31, 2026
c73b6f6
refactor: simplify filesystem control metadata and security UI contract
chenjie-booker Jul 31, 2026
776da36
fix: align filesystem path checks with session workspace context
chenjie-booker Aug 1, 2026
b31b328
fix: constrain apply_patch to one file
chenjie-booker Aug 1, 2026
0cbaf6c
feat: consolidate security control experience
chenjie-booker Aug 1, 2026
4258722
fix: reflect batch model test outcomes
chenjie-booker Aug 1, 2026
827f8dd
fix: separate workspace and project filesystem roots
chenjie-booker Aug 3, 2026
e89f365
refactor: align lifecycle hook stages across ingress and session flows
chenjie-booker Aug 6, 2026
9c6aae2
fix: preserve interrupted tool lifecycle state
chenjie-booker Aug 6, 2026
e266a6f
fix: align security config network rule validation
chenjie-booker Aug 6, 2026
cca15ba
feat: add network mode handling to permission flows
chenjie-booker Aug 6, 2026
ccd2dc0
feat: expand security config network controls in webui
chenjie-booker Aug 7, 2026
a614217
fix: align hook failure test with OSS behavior
chenjie-booker Aug 12, 2026
5300986
fix(provider): map global reasoning effort by model capability
Aug 12, 2026
1f351eb
fix(azure): support reasoning effort requests
Aug 12, 2026
73579d9
Merge pull request #655 from AgentFlocks/feat/safty_control
stephamie7 Aug 12, 2026
dc889f4
Merge pull request #700 from AgentFlocks/fix/reasoning-effort-capabil…
duguwanglong Aug 12, 2026
8d107a1
chore(release): bump version to v2026.8.12
stephamie7 Aug 12, 2026
f6684c0
fix(session): restore HookStage import for LLM hook probes
duguwanglong Aug 12, 2026
6ad8499
Merge pull request #701 from AgentFlocks/fix/llm-hook-stage-import
stephamie7 Aug 12, 2026
f63538f
Merge pull request #697 from AgentFlocks/codex/edr-asset-inventory-api
stephamie7 Aug 12, 2026
1bbf1ed
fix(channel): use runtime server port for message delivery
duguwanglong Aug 12, 2026
829e521
Merge pull request #702 from AgentFlocks/fix/channel-message-server-port
stephamie7 Aug 12, 2026
2ed6cf0
Merge pull request #698 from AgentFlocks/feat/update-alibaba-qwen-models
duguwanglong Aug 12, 2026
d584c0b
Merge pull request #684 from AgentFlocks/fix-gitee-release-tag-gate
duguwanglong Aug 12, 2026
a55599b
test(hub): align triage progress fixture
stephamie7 Aug 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 5 additions & 0 deletions .flocks/flocks.json.example
Original file line number Diff line number Diff line change
@@ -1,5 +1,10 @@
{
"provider": {},
"default_models": {
"default_parameters": {
"reasoning_effort": "high"
}
},
"mcp": {},
"channels": {},
"plugin": [],
Expand Down
122 changes: 99 additions & 23 deletions .flocks/flockshub/plugins/webuis/soc_ui/soc_dashboard/api/handlers.py
Original file line number Diff line number Diff line change
Expand Up @@ -719,6 +719,38 @@ def _workflow_stats_sample_deltas(conn, workflow_name, start_time=0, end_time=0)
return deltas


def _workflow_stats_call_delta_from_samples(conn, workflow_name, start_ms, end_ms):
if not _table_exists(conn, WORKFLOW_SNAPSHOT_TABLE):
return None
previous = conn.execute(
f"SELECT call_count FROM {WORKFLOW_SNAPSHOT_TABLE} "
"WHERE workflow_id = ? AND sampled_at < ? "
"ORDER BY sampled_at DESC LIMIT 1",
(workflow_name, start_ms),
).fetchone()
if previous is None:
return None
rows = conn.execute(
f"SELECT sampled_at, call_count FROM {WORKFLOW_SNAPSHOT_TABLE} "
"WHERE workflow_id = ? AND sampled_at >= ? AND sampled_at < ? "
"ORDER BY sampled_at",
(workflow_name, start_ms, end_ms),
).fetchall()
if not rows:
return None
total = 0
previous_count = max(_safe_int(previous[0]), 0)
for _, call_count in rows:
current_count = max(_safe_int(call_count), 0)
total += (
current_count - previous_count
if current_count >= previous_count
else current_count
)
previous_count = current_count
return max(total, 0)


def _workflow_metric_value(stats, key, fallback=0):
value = stats.get(key)
return max(_safe_int(fallback if value is None else value), 0)
Expand Down Expand Up @@ -1231,6 +1263,9 @@ def _task_center_empty():
return {
"generatedAt": datetime.now().astimezone().isoformat(timespec="seconds"),
"sessionCount": 0,
"activeExecutionCount": 0,
"scheduledActiveCount": 0,
"workflowActiveCount": 0,
"scheduledTasks": [],
"workflows": [],
"sourceStatus": {
Expand Down Expand Up @@ -1260,7 +1295,7 @@ def _today_bounds():

def _task_center_task_rows(limit=12):
if not TASK_DB.is_file():
return 0, [], 0, 0
return 0, [], 0, 0, 0
try:
with sqlite3.connect(f"file:{TASK_DB}?mode=ro", uri=True, timeout=1.0) as conn:
conn.row_factory = sqlite3.Row
Expand All @@ -1269,7 +1304,7 @@ def _task_center_task_rows(limit=12):
_table_exists(conn, "task_schedulers")
and _table_exists(conn, "task_executions")
):
return 0, [], 0, 0
return 0, [], 0, 0, 0
today_start, tomorrow_start = _today_bounds()
today_start_iso = today_start.isoformat(timespec="seconds")
tomorrow_start_iso = tomorrow_start.isoformat(timespec="seconds")
Expand All @@ -1291,8 +1326,8 @@ def _task_center_task_rows(limit=12):
"SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) AS success_count, "
"SUM(CASE WHEN status IN ('pending', 'queued', 'running') THEN 1 ELSE 0 END) AS active_count, "
"SUM(CASE WHEN "
"julianday(COALESCE(completed_at, updated_at, started_at, queued_at, created_at)) >= julianday(?) "
"AND julianday(COALESCE(completed_at, updated_at, started_at, queued_at, created_at)) < julianday(?) "
"julianday(COALESCE(started_at, queued_at, created_at)) >= julianday(?) "
"AND julianday(COALESCE(started_at, queued_at, created_at)) < julianday(?) "
"THEN 1 ELSE 0 END) AS today_execution_count "
"FROM task_executions WHERE scheduler_id = ?",
(today_start_iso, tomorrow_start_iso, scheduler["id"]),
Expand Down Expand Up @@ -1345,9 +1380,10 @@ def _task_center_task_rows(limit=12):
tasks[:limit],
sum(task["executionCount"] for task in tasks),
sum(task["todayExecutionCount"] for task in tasks),
sum(task["activeCount"] for task in tasks),
)
except Exception:
return 0, [], 0, 0
return 0, [], 0, 0, 0


def _workflow_manifest_name_map():
Expand Down Expand Up @@ -1593,7 +1629,7 @@ def _workflow_link_context(latest):

def _task_center_workflow_rows(limit=12, include_mock=False):
if not WORKFLOW_DB.is_file():
return [], 0, 0
return [], 0, 0, 0
try:
with sqlite3.connect(f"file:{WORKFLOW_DB}?mode=ro", uri=True, timeout=1.0) as conn:
conn.row_factory = sqlite3.Row
Expand All @@ -1602,7 +1638,7 @@ def _task_center_workflow_rows(limit=12, include_mock=False):
_table_exists(conn, "workflow_stats")
or _table_exists(conn, "workflow_executions")
):
return [], 0, 0
return [], 0, 0, 0
today_start, tomorrow_start = _today_bounds()
today_start_ms = int(today_start.timestamp() * 1000)
tomorrow_start_ms = int(tomorrow_start.timestamp() * 1000)
Expand Down Expand Up @@ -1650,6 +1686,7 @@ def _task_center_workflow_rows(limit=12, include_mock=False):
finished_at_expr = "finished_at" if "finished_at" in execution_columns else "NULL"
updated_at_expr = "updated_at" if "updated_at" in execution_columns else "NULL"
execution_time_expr = f"COALESCE({finished_at_expr}, {updated_at_expr}, started_at, 0)"
execution_start_expr = "started_at"
active_time_expr = f"COALESCE({updated_at_expr}, started_at, 0)"
latest_select = ", ".join(
[
Expand All @@ -1668,11 +1705,13 @@ def _task_center_workflow_rows(limit=12, include_mock=False):
]
)
workflows = []
total_execution_count = 0
total_today_execution_count = 0
total_active_count = 0
now_ms = int(time.time() * 1000)
for workflow_id in workflow_ids:
workflow_name = names.get(workflow_id, workflow_id)
if UUID_RE.match(str(workflow_id)) and workflow_name == workflow_id:
continue
hidden_workflow = UUID_RE.match(str(workflow_id)) and workflow_name == workflow_id
trigger_state = _workflow_trigger_state(conn, workflow_id)
stats = None
if _table_exists(conn, "workflow_stats"):
Expand All @@ -1687,8 +1726,8 @@ def _task_center_workflow_rows(limit=12, include_mock=False):
exec_summary = conn.execute(
"SELECT COUNT(*) AS execution_count, "
"SUM(CASE WHEN status IN ('success', 'completed') THEN 1 ELSE 0 END) AS success_count, "
f"SUM(CASE WHEN {execution_time_expr} >= ? "
f"AND {execution_time_expr} < ? THEN 1 ELSE 0 END) "
f"SUM(CASE WHEN {execution_start_expr} >= ? "
f"AND {execution_start_expr} < ? THEN 1 ELSE 0 END) "
"AS today_execution_count "
"FROM workflow_executions WHERE workflow_id = ?",
(today_start_ms, tomorrow_start_ms, workflow_id),
Expand Down Expand Up @@ -1732,18 +1771,40 @@ def _task_center_workflow_rows(limit=12, include_mock=False):
_safe_int(active_summary["active_count"] if active_summary else 0),
0,
)
execution_count = max(
_safe_int(stats["call_count"] if stats else 0),
exec_execution_count = max(
_safe_int(exec_summary["execution_count"] if exec_summary else 0),
0,
)
success_count = max(
_safe_int(stats["success_count"] if stats else 0),
_safe_int(exec_summary["success_count"] if exec_summary else 0),
)
today_execution_count = max(
exec_today_execution_count = max(
_safe_int(exec_summary["today_execution_count"] if exec_summary else 0),
0,
)
if stats is not None:
execution_count = max(_safe_int(stats["call_count"]), 0)
stats_today_count = _workflow_stats_call_delta_from_samples(
conn,
workflow_id,
today_start_ms,
tomorrow_start_ms,
)
today_execution_count = (
max(_safe_int(stats_today_count), 0)
if stats_today_count is not None
else exec_today_execution_count
)
success_count = max(_safe_int(stats["success_count"]), 0)
else:
execution_count = exec_execution_count
today_execution_count = exec_today_execution_count
success_count = max(
_safe_int(exec_summary["success_count"] if exec_summary else 0),
0,
)
total_execution_count += execution_count
total_today_execution_count += today_execution_count
total_active_count += active_count
if hidden_workflow:
continue
last_run_at = 0
if latest:
last_run_at = (
Expand Down Expand Up @@ -1812,21 +1873,36 @@ def _task_center_workflow_rows(limit=12, include_mock=False):
)
return (
workflows[:limit],
sum(workflow["executionCount"] for workflow in workflows),
sum(workflow["todayExecutionCount"] for workflow in workflows),
total_execution_count,
total_today_execution_count,
total_active_count,
)
except Exception:
return [], 0, 0
return [], 0, 0, 0


def _get_task_center(include_mock=False):
session_count, tasks, scheduled_execution_count, scheduled_today_execution_count = _task_center_task_rows()
workflows, workflow_execution_count, workflow_today_execution_count = _task_center_workflow_rows(
(
session_count,
tasks,
scheduled_execution_count,
scheduled_today_execution_count,
scheduled_active_count,
) = _task_center_task_rows()
(
workflows,
workflow_execution_count,
workflow_today_execution_count,
workflow_active_count,
) = _task_center_workflow_rows(
include_mock=include_mock,
)
return {
**_task_center_empty(),
"sessionCount": session_count,
"activeExecutionCount": scheduled_active_count + workflow_active_count,
"scheduledActiveCount": scheduled_active_count,
"workflowActiveCount": workflow_active_count,
"scheduledTasks": tasks,
"scheduledExecutionCount": scheduled_execution_count,
"scheduledTodayExecutionCount": scheduled_today_execution_count,
Expand Down
Loading
Loading