From 9d85d293df3def52daa465bac947caa5463fb721 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 15:24:24 +0200 Subject: [PATCH 01/12] chore(parity): add five tender demand rows to the hermiq matrix, back-fill pending --- openspec/parity/capabilities.json | 120 ++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 688d97daf..1fe131510 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -5434,6 +5434,126 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"" } + }, + { + "id": "td-no-training", + "area": "compliance", + "name": "Guarantee that the organisation's data is never used to train the models its agents call.", + "source": "tender", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/364027", + "originNote": "Gemeente Zaanstad zaaksysteem (2025-01-17) requirement 17539; also UWV 415648 requirement 123258", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + } + }, + { + "id": "td-explain", + "area": "oversight", + "name": "See in plain language how an AI outcome came about, so a person keeps the final say.", + "source": "tender", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/402469", + "originNote": "Tilburg University DMS (2025-11-26) requirement 57596; also Juridisch Loket 307676 requirement 102700 and Molenlanden 415259 requirement 71423", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + } + }, + { + "id": "td-validated-sources", + "area": "memory", + "name": "Limit an assistant to answering only from documents the organisation has validated.", + "source": "tender", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/371293", + "originNote": "Veiligheidsregio Utrecht klantcontactsysteem (2025-03-17) requirement 4339", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + } + }, + { + "id": "td-ai-literacy", + "area": "compliance", + "name": "Help users build AI literacy with explanation or training modules inside the product.", + "source": "tender", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/415259", + "originNote": "Gemeente Molenlanden zaaksysteem 2026 (2026-03-11) requirement 71423", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + } + }, + { + "id": "td-bias-test", + "area": "reuse", + "name": "Test agents for bias on a regular basis and keep the result.", + "source": "tender", + "origin": "tender", + "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/415259", + "originNote": "Gemeente Molenlanden zaaksysteem 2026 (2026-03-11) requirement 71423", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + } } ], "pending": [ From 20d66becce5dba12ef1b33b22fe68df15a236e87 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 15:55:19 +0200 Subject: [PATCH 02/12] chore(parity): fold the hermes-agent source reading (219 cells) and 198 dify cells --- openspec/parity/capabilities.json | 1679 ++++++++++++++++++----------- 1 file changed, 1063 insertions(+), 616 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 1fe131510..3e062e983 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -30,11 +30,11 @@ "key": "hermes-agent", "name": "Hermes Agent", "vendor": "Nous Research", - "readOn": "2026-07-23", + "readOn": "2026-09-26", "columnAddedOn": "2026-09-26", "evidenceGrade": "docs-only", - "readHow": "18 curated feature rows (competitor id 1410, captured 2026-07-03) plus 147 release-note rows (v2026.5.16 to v2026.7.20, captured 2026-07-23) in the intelligence database; hermiq's ADR-001 records a source-level study of Hermes, which is not a research file and was not used to rate; nobody has driven Hermes for this matrix", - "unknownReason": "not covered by the 18 curated Hermes feature rows or its 147 release-note rows in the intelligence database (captured 2026-07-03 and 2026-07-23); nobody has driven Hermes for this row" + "readHow": "source read at v2026.9.24 (f97608f, shallow clone of github.com/NousResearch/hermes-agent), not driven: CLI subcommands, web dashboard pages and routers, gateway adapters, tools and skills registries, tests and i18n, every row rated with path:line evidence; no instance booted", + "unknownReason": "source read at v2026.9.24, not driven: the code reading could not settle this row" }, { "key": "copilot-studio", @@ -219,15 +219,15 @@ "feature": "agent-management-ui", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "partial", + "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38288 \"Full profile builder in the dashboard: Build a complete Hermes profile from the browser - pick its model, choose its skills, attach its MCP servers - without hand-editing config.yaml.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:18 `hermes profile create --description`; web/src/pages/ProfilesPage.tsx:442 New Profile form -> POST /api/profiles (hermes_cli/web_routers/profiles.py:704); ProfilesPage.tsx:556 edit SOUL.md (personality / system prompt) -> PUT /api/profiles/{name}/soul (profiles.py:906); web/src/pages/ProfileBuilderPage.tsx:32 builder wizard (identity, model, skills, MCPs) Note: An agent in Hermes is a profile: a name, a description and SOUL.md instructions. Old partial undersold it.", "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", - "dify": "docs-only: competitor_features#38549 \"You can build Dify Agents through the UI: set a base prompt, upload Skills and files, and connect tools and knowledge from the Dify ecosystem.\"" + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:706 POST /agent creates an agent with name, description, role and icon; web/features/agent-v2/roster/components/create-agent-dialog.tsx:61 and agent-form-fields.tsx:73 the create form; web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/index.tsx:1088 the Prompt (instructions) editor" } }, { @@ -248,13 +248,14 @@ "feature": "agent-management-ui", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#38558 \"Agent App enters open beta: an agent roster for managing and reusing agents across a workspace\"" + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:630 GET /agent lists every workspace agent with draft/published counts; web/features/agent-v2/roster/components/agent-roster-list.tsx:238 shows a Draft badge and :408 updated time, but no owner; only a 'Created by me' filter (roster-toolbar.tsx:90). The classic Studio list shows author (web/app/components/apps/app-card/index.tsx:175) but no status Note: list plus status, or list plus author, never both on one screen", + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:1184-1217 profile list shows gateway running/stopped, model and skill count; hermes_cli/subcommands/profile.py:14 `hermes profile list`; hermes_cli/profiles.py:538 ProfileInfo has no owner field (name, model, provider, gateway_running, description, role only) Note: No owner column and no organisation: one operator's install lists its own profiles." } }, { @@ -276,11 +277,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38288 \"Full profile builder in the dashboard: Build a complete Hermes profile from the browser - pick its model, choose its skills, attach its MCP servers - without hand-editing config.yaml.\"" + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:540-673 per-profile SOUL, description, model editing; schedules and runs sit on other pages scoped by the managing-profile selector (web/src/i18n/en.ts:103 managingProfileBanner; web/src/pages/CronPage.tsx, SessionsPage.tsx); hermes_cli/subcommands/profile.py:76 `profile show` Note: Configuration and skills per profile exist, but schedules, runs and skills are not on one agent page.", + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/navigation.tsx:62-86 detail page with Configure (model, prompt, tools, skills, knowledge, files), Access Point, Logs, Monitoring; api/controllers/console/agent/roster.py:1133 logs. No schedules: agents have no scheduler of their own, schedules only exist as trigger nodes on workflow apps Note: schedules are missing from the agent page" } }, { @@ -306,8 +308,8 @@ "n8n": "partial", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31140 \"LLM provider abstraction: ProviderTransport ABC: Nous/Anthropic/Bedrock/OpenRouter/local vLLM, switch with no code change\"", - "dify": "docs-only: competitor_features#30989 \"Model provider hub: Dozens of LLM providers incl. local.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/profiles.py:942 PUT /api/profiles/{name}/model called from web/src/pages/ProfilesPage.tsx:673 setProfileModel(provider, model); hermes_cli/commands.py:157 `/model` switch (session-scoped, --global persists)", + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 Model field with ModelParameterModal picking provider and model per agent; classic agent apps pick the model in app config (api/controllers/console/app/model_config.py)", "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"" } }, @@ -329,15 +331,16 @@ "feature": "agent-management-ui", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { - "dify": "docs-only: competitor_features#30994 \"Workspaces & RBAC: Team workspaces with member roles.\"", + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/permissions.ts:37 the per-agent Resource Access page is shown only when systemFeatures.rbac_enabled; api/configs/enterprise/__init__.py:38 RBAC_ENABLED default False (enterprise); community has workspace-wide roles only, every member sees every agent, and a published web app URL is open to anyone who has it Note: enterprise-licensed for per-agent me/group/org scoping", "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", - "open-webui": "docs-only: competitor_features#31811 \"Role-Based Access Control (RBAC): Built-in RBAC with user groups and model access controls\"" + "open-webui": "docs-only: competitor_features#31811 \"Role-Based Access Control (RBAC): Built-in RBAC with user groups and model access controls\"", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:32-37 per-platform _ALLOWED_USERS / ALLOW_ALL_USERS allowlists read per profile home (authz_mixin.py:339 _authorization_home_for_source); gateway/slash_access.py:1-27 admin vs user command lists Note: Who may talk to a profile's bot is a per-platform user-id allowlist; no only-me / group / organisation visibility model and no org directory." } }, { @@ -358,14 +361,16 @@ "feature": "cost-guardrails", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "partial", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31612 \"Message-metered pricing: $0.01/message or $200/mo pack; cost spikes with generative/autonomous use.\"", - "open-webui": "docs-only: competitor_features#38864 \"Automation scheduling limits: Administrators can now set AUTOMATIONMAXCOUNT and AUTOMATIONMININTERVAL to limit how many automations each non-admin user can create\"" + "open-webui": "docs-only: competitor_features#38864 \"Automation scheduling limits: Administrators can now set AUTOMATIONMAXCOUNT and AUTOMATIONMININTERVAL to limit how many automations each non-admin user can create\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-63 agent.max_turns (turn cap) and agent.run_budget_seconds (wall-clock per run), per profile config.yaml; hermes_cli/config_defaults.py:1338 delegation.max_iterations per subagent; gateway/platforms/api_server.py:1322 api_server.max_concurrent_runs; searched 'max_cost|spend_limit|token_budget|cost_cap' in *.py: no token or run-count quota per agent Note: Caps iterations and wall clock per run, not tokens or number of runs.", + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 PUT /agent sets max_active_requests, enforced in api/services/app_generate_service.py:153,384 (concurrent requests per app); dify-agent/src/dify_agent/runtime/runner.py:94,403 a fixed 500-step and run-timeout limit per run. No per-agent run count or token budget Note: only a concurrency cap and a server-wide step limit, no token or run quota" } }, { @@ -386,11 +391,15 @@ "feature": "agent-management-ui", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/pause.py:1-27 `hermes pause` / `hermes resume` write/remove the ESTOP sentinel; agent/estop.py:31-39 sentinel lives in the profile's $HERMES_HOME, so `hermes -p pause` holds that profile's cron, kanban and new gateway turns without deleting it; web/src/pages/ProfilesPage.tsx:1184 per-profile gateway running/stopped Note: CLI only; the dashboard shows gateway state but has no pause toggle (searched 'estop' in web/src and hermes_cli/web_routers: none).", + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/access/components/web-app-access-card.tsx:254 and service-api-access-card.tsx:114 per-surface In service/Out of service toggles; api/controllers/console/agent/roster.py:1013 POST /agent//api-enable. No single off switch: workflows that bind the agent as a node keep running it (models/agent.py:407 WorkflowAgentNodeBinding) Note: off per access point, not per agent" + } }, { "id": "ag-owner", @@ -410,11 +419,15 @@ "feature": "compliance-control-packs", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profiles.py:538-575 ProfileInfo fields (name, model, provider, description, display_name, role) carry no owner; searched 'owner' in hermes_cli/profiles.py and profile_identity.py: only file-permission and routing-index ownership Note: Single-operator install; no human owner per profile.", + "dify": "source read at 1.17.1, not driven: api/services/app_service.py:672 created_by is set to the creating account and api/services/app_service.py:282 filters on it ('Created by me'); no owner field that can be assigned, models/agent.py:212 only created_by/updated_by/archived_by Note: creator is recorded, not an accountable owner that can be named" + } }, { "id": "ag-offboard", @@ -433,11 +446,15 @@ "feature": "agent-lifecycle-governance", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'owner|transfer|hand over|reassign' in hermes_cli/profiles.py and profile_cmd.py: none; hermes_cli/subcommands/profile.py:86 `profile rename` and :115 export/import move a profile, not an owner Note: No owner concept to hand over.", + "dify": "source read at 1.17.1, not driven: searched 'transfer|owner|created_by =' in api/controllers/console and api/services/app_service.py: only workspace ownership transfer exists (api/controllers/console/workspace/members.py:418 send-owner-transfer-confirm-email); no endpoint or UI reassigns an agent or app to another member" + } }, { "id": "ag-nl-builder", @@ -456,14 +473,15 @@ "feature": "agent-management-ui", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "yes", "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", - "dify": "docs-only: competitor_features#38550 \"We also provide an agent that helps you build Dify Agents: Through conversation, it can configure the Linux sandbox environment, install required packages, and create new Skills and files that your Dify Agent can use later.\"" + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:846 build-draft/checkout and :941 build-draft/apply; web/i18n/en-US/agent-v-2.json 'Build your agent by chatting ... it fills in the form on the left'; web/features/agent-v2/agent-detail/configure/page.tsx:49 Build mode is on in Community Edition (only Preview is cloud/enterprise)", + "hermes-agent": "source read at v2026.9.24, not driven: skills/autonomous-ai-agents/hermes-agent/SKILL.md:26 bundled skill teaches the agent Hermes' own profiles so it can run `hermes profile create` through its terminal tool; hermes_cli/profile_describer.py:1-25 auto-generates a description from an existing profile (the reverse); searched 'create.*bot.*from.*descri' and profile-creating tool names in *.py: no dedicated plain-language agent builder Note: The agent can build a profile only by driving the CLI itself; the dashboard builder is a form wizard." } }, { @@ -484,11 +502,15 @@ "feature": "hermiq-agent-application-slug", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 under gateway.multiplex_profiles each profile is served at /p//v1/...; api_server.py:1336-1345 /v1/models advertises the profile name as the model id; gateway/profile_routing.py:1-11 routes senders/chats to profiles Note: A caller addresses an agent by profile name in the URL; no registry that ties an agent to a consuming application.", + "dify": "source read at 1.17.1, not driven: api/models/agent.py:407 WorkflowAgentNodeBinding ties a roster agent to a workflow app node; api/controllers/console/agent/composer.py:54 agent-composer on a workflow node, :125 copy-from-roster; roster.py:474 published references listed on the agent's Access page ('Workflow access')" + } }, { "id": "ag-capability-profile", @@ -508,14 +530,14 @@ "feature": "agent-capability-profile", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "yes", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38288 \"Full profile builder in the dashboard: pick its model, choose its skills, attach its MCP servers - without hand-editing config.yaml.\"", - "dify": "docs-only: competitor_features#38549 \"You can build Dify Agents through the UI: set a base prompt, upload Skills and files, and connect tools and knowledge from the Dify ecosystem.\"" + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SkillsPage.tsx:140 skills / toolsets / hub views scoped by profile (SkillsPage.tsx:169 getToolsets(selectedProfile)); hermes_cli/web_routers/tools.py:230 GET /api/tools/toolsets; web/src/pages/ProfileBuilderPage.tsx:753 review step lists model, skills and MCPs Note: Skills and toolsets per profile are on one page (tabbed); MCP servers sit on McpPage; data access is not modelled (tools reach the whole host). Old yes rested on a docs line; the data part of the sentence has no screen.", + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/ has model-config, prompt-editor, tools, skills, knowledge and files sections on the one Configure page; web/i18n/en-US/agent-v-2.json agentDetail.configure.tools/skills/knowledgeRetrieval/files" } }, { @@ -537,11 +559,15 @@ "featureConfidence": "medium", "defectCandidate": "A schedule bound to a deleted agent stays enabled; ScheduleService's dispatch/findDueSchedules path has no agent-existence check, so the schedule keeps firing and presumably errors on every tick instead of stopping.", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:52 `hermes profile delete`; hermes_cli/profiles.py:1682 delete_profile removes the profile home (jobs live under it); web/src/pages/ProfilesPage.tsx:725 deleteProfile -> DELETE /api/profiles/{name} (hermes_cli/web_routers/profiles.py:869); web/src/i18n/en.ts profiles.confirmDeleteMessage 'deletes profile ... config, keys, memories, sessions, skills, cron jobs'", + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:780 DELETE /agent/; api/services/app_service.py:1078 delete_app archives the backing agent and unbinds it; api/tasks/remove_app_and_related_data_task.py:90,632,681 deletes the app's triggers and WorkflowSchedulePlan rows so schedules stop; web/i18n/en-US/agent-v-2.json roster.deleteDialog 'web app, API access, and workflows that use it stop working'" + } }, { "id": "ag-import-export", @@ -561,13 +587,14 @@ "feature": "agent-template-gallery", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#38725 \"Or upload your exported file via Creator Center: From 1.14.0-rc1: New Agent x Skills for Production Workflows (2026-02-14)\"" + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/sidebar-actions.tsx:33,52 Export (app DSL YAML); web/features/agent-v2/roster/components/roster-create-menu.tsx:29 import dialog; api/services/app_dsl_service.py:561,723,789 AGENT mode handled on import and export Note: imports into another Dify instance, not a Nextcloud; imported agents start with web app and API off (app_dsl_service.py:605)", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` to .tar.gz and :122 `profile import`; hermes_cli/web_routers/profiles.py:988 POST /api/profiles/{name}/export and :1006 POST /api/profiles/import; hermes_cli/commands.py:88-90 /export and /import slash commands Note: Moves between Hermes installs; there is no Nextcloud target." } }, { @@ -594,8 +621,8 @@ "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31372 \"AI Chat with tools (agentic mode): Chat-with-AI can call virtual integrations (tools) to perform actions; backed by the Context Agent ExApp. Chains multiple tools to complete a task.\"", - "hermes-agent": "docs-only: competitor_features#31129 \"Agent loop core: AIAgent (run_agent.py) powers CLI, gateway, API and scheduler uniformly\"", - "dify": "docs-only: competitor_features#30986 \"Visual LLM app builder: No-code chatflow/workflow app studio.\"", + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ChatPage.tsx:1-16 dashboard Chat page embeds the full `hermes --tui` over WebSocket /api/pty (hermes_cli/web_routers/chat_ws.py:432); hermes_cli/main.py CLI/TUI chat; gateway adapters under plugins/platforms/ carry the same conversation", + "dify": "source read at 1.17.1, not driven: web/app/(shareLayout)/agent/[token]/page.tsx full-page ChatWithHistoryWrap for an agent; web/app/(shareLayout)/chat/[token] for chat apps; web/app/(commonLayout)/installed/[appId] in-console Explore chat; api/controllers/web/completion.py chat-messages", "n8n": "docs-only: competitor_features#3912 \"core: Allow expressions in tool default values on chat hub tools: From n8n@2.14.0 (2026-03-24)\"", "open-webui": "docs-only: competitor_features#31813 \"RAG document ingestion / knowledge base: Upload docs and chat over them with retrieval\"" } @@ -617,13 +644,15 @@ "feature": "agent-engine-port", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38737 \"Streamed reasoning display: Models that emit thinking or reasoning now show that content as it streams, and it renders correctly in the chat overview and in exported conversations.\"" + "open-webui": "docs-only: competitor_features#38737 \"Streamed reasoning display: Models that emit thinking or reasoning now show that content as it streams, and it renders correctly in the chat overview and in exported conversations.\"", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/stream_consumer.py:1-5 on_delta() queues model deltas and progressively edits one platform message; hermes_cli/cli_stream_mixin.py streams tokens in the CLI; hermes_cli/web_routers/chat_ws.py:432 PTY stream to the dashboard chat", + "dify": "source read at 1.17.1, not driven: api/controllers/web/completion.py:45-63 response_mode streaming (agent apps are streaming-only, :50); service API the same (api/controllers/service_api/app/completion.py); web chat renders SSE chunks (web/app/components/base/chat/chat-with-history/chat-wrapper.tsx)" } }, { @@ -645,11 +674,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31131 \"FTS5 session search: Full-text search across all past sessions with LLM summarization\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:150-152 /resume and /sessions; hermes_cli/subcommands/sessions.py:22 `hermes sessions list` and :285 browse; hermes_cli/web_routers/sessions.py:167 GET /api/sessions; web/src/pages/SessionsPage.tsx:534-540 Resume in Chat", + "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:48 GET /conversations, :129 rename, :179 pin/unpin; web/app/components/base/chat/chat-with-history/sidebar lists past conversations to reopen" } }, { @@ -669,11 +699,15 @@ "feature": "agent-engine-port", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:696 DELETE /api/sessions/{id} and :414 bulk-delete (web/src/i18n/en.ts sessions.confirmDeleteMessage 'permanently removes ... cannot be undone'); hermes_cli/subcommands/sessions.py:123 `sessions archive` soft-hides, sessions.py:750 PATCH archived flag; searched 'trash|undelete|recycle|soft.?delete' in hermes_state_sessions.py and hermes_cli/sessions*.py: no bin Note: Delete is permanent and archive is a soft hide; there is no bin to restore a deleted conversation from.", + "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:116 DELETE /conversations/; api/services/conversation_service.py:232 soft-delete flag then api/tasks/delete_conversation_task.py:105 purges related data. Searched 'restore|trash|bin|undelete' in api/services/conversation_service.py and api/controllers/web: no restore from a bin Note: delete only, no bin or restore" + } }, { "id": "ch-tool-steps", @@ -695,11 +729,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38242 \"Watch your subagents work: delegatetask dispatches now return live transcript files you can tail -f the moment the subagents launch: every tool call, result, and streamed reply, one human-readable log per child.\"" + "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 display.tool_progress 'all' with tool_progress_grouping (one bubble or one message per tool) in chat platforms; hermes_cli/commands.py:176 /verbose cycles tool progress off/new/all/verbose in the CLI; web/src/i18n/en.ts sessions.roles.tool shows tool messages in session history", + "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/agent-content.tsx:15-38 renders each agent_thought with its tool call; answer/tool-detail.tsx tool input/output; agent v2 'Ran commands' activity in web/features/agent-v2/agent-detail/configure/components/preview/chat-conversation.tsx and answer/agent-roster-response-content.tsx" } }, { @@ -721,11 +756,15 @@ "feature": "agent-engine-port", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/base.py:1183-1231 SUPPORTED_DOCUMENT_TYPES (.pdf, .docx, .md, .csv ...) accepted as chat file attachments from messaging platforms; hermes_cli/web_routers/files.py:501 POST /api/files/upload and :330 /api/chat/image-upload; hermes_cli/commands.py:297 /image; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: Attaching a file and asking about it works; there is no Nextcloud Files source.", + "dify": "source read at 1.17.1, not driven: api/controllers/web/files.py:23 POST /files/upload and api/controllers/web/remote_files.py:102 upload by URL, enabled per app by web/app/components/base/features/new-feature-panel/file-upload; files go into the chat message. No picker for a document store such as Nextcloud Files: upload from the local device or a URL only Note: attach by upload or URL, not from Nextcloud" + } }, { "id": "ch-feedback", @@ -744,13 +783,15 @@ "feature": "agent-engine-port", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38806 \"Feedback user attribution spoofing: Submitting evaluation feedback can no longer forge the user_id field through mass-assignment, preventing authenticated users from attributing ratings to other users and corrupting Elo leaderboard rankings and admin feedback exports.\"" + "open-webui": "docs-only: competitor_features#38806 \"Feedback user attribution spoofing: Submitting evaluation feedback can no longer forge the user_id field through mass-assignment, preventing authenticated users from attributing ratings to other users and corrupting Elo leaderboard rankings and admin feedback exports.\"", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-15 only detects affection ('good bot', hearts) to animate the pet, it records no rating", + "dify": "source read at 1.17.1, not driven: api/controllers/web/message.py:107 POST /messages//feedbacks; web/app/components/base/chat/chat/answer/operation.tsx:123-144 like/dislike buttons on each answer" } }, { @@ -770,11 +811,15 @@ "feature": "companion-everywhere", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: apps/desktop/electron/quick-entry.ts:1-19 Quick Entry, a global-hotkey (Cmd/Ctrl+Shift+Space) mini composer over any desktop app; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: Reachable from anywhere on the desktop via the Electron app, not from inside Nextcloud pages.", + "dify": "source read at 1.17.1, not driven: web/public/embed.js (461 lines) injects a floating chat bubble into any web page that includes the script; web/i18n/en-US/app-overview.json:47 points to a separate 'Dify Chatbot Chrome Extension' (not in this repo); nothing embeds the assistant across the Dify console itself or inside Nextcloud Note: a site owner can place the bubble on their pages; no Nextcloud integration" + } }, { "id": "ch-object-leaf", @@ -793,11 +838,15 @@ "feature": "agent-object-leaf", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:264 /browser connects the agent to the user's live Chromium browser via CDP so it can read the page being viewed (tools/browser_cdp_tool.py); tools/computer_use_tool.py screen access; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: The agent can read whatever page is open, but no app hands it the current record as context.", + "dify": "source read at 1.17.1, not driven: web/public/embed.js:93-96 the host page passes config.inputs (e.g. a record id) into the embedded chat as app input variables; the agent only sees what the host page chooses to pass, no connector reads the record or its links from another app Note: a host page can hand context in, nothing looks the record up" + } }, { "id": "ch-prompt-library", @@ -817,11 +866,15 @@ "feature": "the-declared-tool-surface-and-the-prompt-library", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: agent/skill_commands.py:1 every installed skill is a /skill-name slash command in CLI and gateway; hermes_cli/commands.py:226 /bundles; plugin-catalog/prompt-snippets.yaml:1-5 community desktop prompt-snippet library (catalog plugin, not core); searched 'record type' concepts: none Note: Ready-made prompts exist as skills and snippets, but none is scoped to a record type or set centrally for an organisation.", + "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx:48,87 builder sets an opening statement and fixed suggested questions per app; web/app/components/base/chat/chat/answer/suggested-questions.tsx. No prompt library keyed to a record type Note: per-app starter questions only" + } }, { "id": "ch-voice-in", @@ -842,14 +895,16 @@ "feature": "speech-services", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31386 \"Voice input: Hands-free natural-language invocation of agent commands.\"", - "open-webui": "docs-only: competitor_features#38876 \"STT preprocessing bypass option: Administrators can now enable AUDIOSTTSKIP_PREPROCESSING to send audio files directly to the speech-to-text backend, reducing memory and CPU consumption during large uploads for better transcription performance\"" + "open-webui": "docs-only: competitor_features#38876 \"STT preprocessing bypass option: Administrators can now enable AUDIOSTTSKIP_PREPROCESSING to send audio files directly to the speech-to-text backend, reducing memory and CPU consumption during large uploads for better transcription performance\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/voice_mode.py:1-5 push-to-talk capture with STT via tools/transcription_tools.py; hermes_cli/commands.py:202-205 /voice and /wake ('Hey Hermes' wake word); gateway/run_voice.py transcribes inbound voice messages on messaging platforms", + "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:62 POST /audio-to-text; web/app/components/base/features/new-feature-panel/speech-to-text.tsx per-app switch; needs a speech2text model from a provider plugin" } }, { @@ -873,12 +928,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { - "hermes-agent": "docs-only: competitor_features#38361 \"Opt-in autospeechtags for xAI TTS: inserts light [pause] tags between paragraphs and sentences for more natural-sounding voice replies. Default OFF. (#29376)\"", - "open-webui": "docs-only: competitor_features#38875 \"Mistral TTS support: Mistral can now be used as a text-to-speech provider, with admin settings for the API key, base URL, voices, and model selection.\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/tts_tool.py:1-6 text-to-speech tool with Edge, ElevenLabs, OpenAI, local Piper/NeuTTS and more, Opus voice bubbles on messaging platforms; gateway/streaming_tts_consumer.py speaks streamed replies; hermes_cli/commands.py:202 /voice", + "open-webui": "docs-only: competitor_features#38875 \"Mistral TTS support: Mistral can now be used as a text-to-speech provider, with admin settings for the API key, base URL, voices, and model selection.\"", + "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:119 POST /text-to-audio; web/app/components/base/features/new-feature-panel/text-to-speech (voice, autoplay) per app; needs a TTS model from a provider plugin" } }, { @@ -899,13 +955,15 @@ "feature": "nc-native-tools", "featureConfidence": "medium", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31889 \"Smart Picker in-app invocation: Invoke AI from any Nextcloud text field\"" + "nextcloud-assistant": "docs-only: competitor_features#31889 \"Smart Picker in-app invocation: Invoke AI from any Nextcloud text field\"", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; searched 'insert into|smart picker|text field' in apps/desktop/electron and web/src: the desktop Quick Entry (apps/desktop/electron/quick-entry.ts:2) opens a composer, it does not insert results into other apps' text fields", + "dify": "source read at 1.17.1, not driven: searched 'smart picker|reference provider|text field|browser extension' in web/ and api/: Dify is a standalone app, AI help inside text fields exists only for its own prompt editors (api/controllers/console/app/generator.py:327 instruction-generate); nothing inserts AI output into other applications' text fields" } }, { @@ -925,13 +983,15 @@ "feature": "nc-native-tools", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31383 \"Text tasks (summarize/headline/reformulate/formalize/context-write): core:text2text task-type family via Task Processing providers.\"" + "nextcloud-assistant": "docs-only: competitor_features#31383 \"Text tasks (summarize/headline/reformulate/formalize/context-write): core:text2text task-type family via Task Processing providers.\"", + "hermes-agent": "source read at v2026.9.24, not driven: searched '\"summarize\"|\"translate\"|\"rephrase\"|\"reformulate\"' as command or action names in *.py and *.ts outside tests: no one-click text action; summarising or translating happens only by asking in chat Note: The chat can do it when asked; no one-click action on a selected text.", + "dify": "source read at 1.17.1, not driven: a builder can make a Completion (text generator) app that summarises or translates (web/app/(shareLayout)/completion/[token]); no built-in one-click summarise/reformulate/translate action on arbitrary text Note: possible by building an app, not a ready one-click action" } }, { @@ -953,13 +1013,14 @@ "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31381 \"Document & image generation: Generate spreadsheets, slides, PDFs and images from chat instructions.\"", - "hermes-agent": "docs-only: competitor_features#38354 \"Two new imagegen providers: Krea joins the imagegen lineup as a built-in plugin: Krea 2 Medium ($0.03) and Krea 2 Large ($0.06), auto-discovered, selectable via hermes tools -> Image Generation -> Krea.\"", - "open-webui": "docs-only: competitor_features#31818 \"Image generation integration: DALL-E, Gemini, ComfyUI, AUTOMATIC1111 image backends\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/image_generation_tool.py:1-5 image generation tool (FAL models chosen in `hermes tools`); agent/image_gen_registry.py pluggable providers with plugins/image_gen/; the model calls it from any chat surface", + "open-webui": "docs-only: competitor_features#31818 \"Image generation integration: DALL-E, Gemini, ComfyUI, AUTOMATIC1111 image backends\"", + "dify": "source read at 1.17.1, not driven: core builtin tools are only audio, code, time, webscraper (api/core/tools/builtin_tool/providers/); searched 'text2img|image_generation|generate image' in api/core and web/i18n/en-US: none in core. Image generation comes only from marketplace tool plugins Note: marketplace plugin only" } }, { @@ -982,11 +1043,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31131 \"FTS5 session search: Full-text search across all past sessions with LLM summarization\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:268 GET /api/sessions/search behind web/src/i18n/en.ts sessions.searchPlaceholder 'Search message content'; tools/session_search_tool.py:1-9 FTS5 recall over the session DB for the agent; hermes_state_fts.py full-text index", + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/conversation.py:55,119-126 builders search one app's logs by keyword over queries and answers; the end-user chat sidebar (web/app/components/base/chat/chat-with-history/sidebar) has no search and api/controllers/web/conversation.py:48 lists without a keyword Note: admin log search per app, no search for the person across their own conversations" } }, { @@ -1006,13 +1068,15 @@ "feature": "agent-engine-port", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38872 \"Responses citation visibility: Responses API flows now emit citation sources more consistently, making linked references easier to preserve and display in chat output.\"" + "open-webui": "docs-only: competitor_features#38872 \"Responses citation visibility: Responses API flows now emit citation sources more consistently, making linked references easier to preserve and display in chat output.\"", + "hermes-agent": "source read at v2026.9.24, not driven: agent/anthropic_message_convert.py:52-56 carries provider citation blocks through the transcript; tools/web_tools.py web_search/web_extract return result URLs that the model quotes in its text; searched 'citation' in *.py: no source panel or structured citation rendering in gateway, CLI or dashboard Note: Sources appear only as links the model writes into the answer.", + "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/citation.tsx:44 per-app Citations switch; web/app/components/base/chat/chat/citation/popup.tsx:31,109 shows each source document and segment with a link to /datasets//documents/ (link shown to console users)" } }, { @@ -1033,13 +1097,15 @@ "feature": "agent-engine-port", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38831 \"Public chat sharing permission control: Administrators can now control whether users are allowed to create publicly shareable chats through a dedicated permission setting.\"" + "open-webui": "docs-only: competitor_features#38831 \"Public chat sharing permission control: Administrators can now control whether users are allowed to create publicly shareable chats through a dedicated permission setting.\"", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'share.*(link|url)|public.*session|shared_session' in hermes_cli/web_routers/sessions.py and gateway/platforms/api_server.py: none; hermes_cli/web_routers/sessions.py:787 GET /api/sessions/{id}/export and hermes_cli/commands.py:66 /save export to a file; hermes_cli/shared_session_attach.py:1-4 attaches local runtimes, not colleagues Note: Export to a file exists; no share link.", + "dify": "source read at 1.17.1, not driven: searched 'share conversation|shareConversation|conversation.*share' in web/i18n/en-US and api/controllers/web/conversation.py (list, delete, rename, pin only): the web app URL and QR code share the app (web/i18n/en-US/agent-v-2.json access.webApp.qrCode), no link to one conversation" } }, { @@ -1061,13 +1127,13 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "hermes-agent": "docs-only: competitor_features#31136 \"Cron scheduler: Natural-language scheduled tasks, /api/jobs REST, delivery to any channel\"", - "dify": "docs-only: competitor_features#30992 \"Scheduling / triggers: Scheduled and triggered app runs.\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:794-799 5-6 field cron expressions via croniter; hermes_cli/subcommands/cron.py:23 `hermes cron create`; web/src/i18n/en.ts cron.schedule 'Schedule (cron expression)' on web/src/pages/CronPage.tsx -> POST /api/cron/jobs (hermes_cli/web_routers/cron.py:248)", + "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:10-19 Schedule Trigger start node with mode cron and cron_expression; api/schedule/workflow_schedule_task.py:18 poller (ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK default true, api/configs/feature/__init__.py:1461); an agent runs on it as an Agent node in that workflow Note: the schedule belongs to a workflow app that holds the agent node, not to the agent itself", "n8n": "docs-only: competitor_features#31094 \"Cron & interval scheduling: Schedule Trigger node runs workflows on cron expressions.\"", "open-webui": "docs-only: competitor_features#31816 \"Scheduled prompt Automations: Recurring prompts via RRULE/cron in a background worker loop\"" } @@ -1089,16 +1155,17 @@ "feature": "agent-schedule", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "dify": "docs-only: competitor_features#30992 \"Scheduling / triggers: Scheduled and triggered app runs.\"", + "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:17,34-55 visual mode with hourly/daily/weekly/monthly frequency, on_minute, time, weekdays; api/services/trigger/schedule_service.py:257 visual_to_cron; web/i18n/en-US/workflow.json nodes.triggerSchedule.useVisualPicker Note: hourly is the finest visual step; 'every 15 minutes' needs cron", "n8n": "docs-only: competitor_features#31094 \"Cron & interval scheduling: Schedule Trigger node runs workflows on cron expressions.\"", - "open-webui": "docs-only: competitor_features#31816 \"Scheduled prompt Automations: Recurring prompts via RRULE/cron in a background worker loop\"" + "open-webui": "docs-only: competitor_features#31816 \"Scheduled prompt Automations: Recurring prompts via RRULE/cron in a background worker loop\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:791-792 'every 30m' / '30m' become recurring interval schedules; web/src/i18n/en.ts cron.scheduleModes.interval 'Every interval' with minutes/hours/days units on CronPage" } }, { @@ -1118,13 +1185,15 @@ "feature": "agent-schedule", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"" + "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:801-812 ISO timestamp parses to a one-shot job in the configured timezone; web/src/i18n/en.ts cron.scheduleModes.once 'Once' / onceAt 'Run at'", + "dify": "source read at 1.17.1, not driven: searched 'once|run_at|one-time|date' in api/core/workflow/nodes/trigger_schedule/entities.py and api/services/trigger/schedule_service.py: only recurring frequencies and a 5-field cron (api/libs/schedule_utils.py:33-39), which repeats yearly; no fire-once date" } }, { @@ -1146,12 +1215,13 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "hermes-agent": "docs-only: competitor_features#38286 \"Automation Blueprints: schedule things without learning cron - Pick an automation by name and Hermes asks you for what it needs - no cron syntax, no slot=value typing.\"" + "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:780-790 natural phrases ('every monday 9am', 'weekdays at 9am') convert to cron via _natural_every_to_cron; tools/cronjob_tools.py:1 cronjob_manage tool lets the agent create jobs from a chat request; hermes_cli/commands.py:236 /cron", + "dify": "source read at 1.17.1, not driven: searched 'natural language|describe|generate cron|text to cron' in web/i18n/en-US/workflow.json and api/services/trigger: the schedule node takes a visual picker or a cron string only (web/i18n/en-US/workflow.json nodes.triggerSchedule.*) Note: the workflow generator does not know the schedule node either: searched 'trigger-schedule|trigger_schedule|cron' in api/core/workflow/generator/, no hits" } }, { @@ -1171,14 +1241,15 @@ "feature": "agent-schedule", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "partial", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "hermes-agent": "docs-only: competitor_features#38250 \"Perceived-latency round 2: mtime-cached timezone resolution (#59389)\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_time.py:1-5 tz-aware now() in the configured IANA timezone (HERMES_TIMEZONE or config timezone); cron/jobs.py:1195-1216 next fire computed on local wall clock with both DST folds tried so 09:00 local stays 09:00 across fall-back; cron/jobs.py:832 intervals measure elapsed time across DST Note: Old partial; the scheduler handles DST explicitly.", + "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:19 timezone per schedule; api/libs/schedule_utils.py:41-50 croniter evaluated in the pytz zone and converted to UTC, so fires follow local wall time across DST; web/i18n/en-US/workflow.json nodes.triggerSchedule.invalidTimezone" } }, { @@ -1198,13 +1269,15 @@ "feature": "agent-management-ui", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"" + "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:157 `hermes cron run` (next scheduler tick); hermes_cli/web_routers/cron.py:292 POST /api/cron/jobs/{id}/trigger behind web/src/i18n/en.ts cron.triggerNow 'Trigger now' on CronPage", + "dify": "source read at 1.17.1, not driven: api/core/trigger/debug/event_selectors.py:140-200 a schedule test run waits for the next computed slot, it does not fire at once; the same workflow can be run now only through a second User Input start node ('Choose the start node to run', web/i18n/en-US/workflow.json common.chooseStartNodeToRun) or the workflow run API Note: no 'run now' on the schedule itself" } }, { @@ -1224,14 +1297,16 @@ "feature": "agent-schedule", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "open-webui": "docs-only: competitor_features#38863 \"Automation tools in chat: Built-in chat tools can now create, update, list, pause, and delete scheduled automations directly in conversation when automation access is enabled.\"" + "open-webui": "docs-only: competitor_features#38863 \"Automation tools in chat: Built-in chat tools can now create, update, list, pause, and delete scheduled automations directly in conversation when automation access is enabled.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:149-152 `cron pause` / `cron resume`; hermes_cli/web_routers/cron.py:282-287 POST /api/cron/jobs/{id}/pause|resume behind CronPage Pause/Resume (web/src/i18n/en.ts cron.pause)", + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:167,197 POST /apps//trigger-enable sets AppTriggerStatus ENABLED/DISABLED; api/schedule/workflow_schedule_task.py:55-78 the poller only picks ENABLED triggers" } }, { @@ -1253,13 +1328,14 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "hermes-agent": "docs-only: competitor_features#38368 \"Microsoft Teams - end-to-end: The full Microsoft Graph stack lands together: auth + client foundation, a webhook listener that receives Teams events, a pipeline plugin runtime, and outbound delivery.\"", - "n8n": "docs-only: competitor_features#31096 \"Webhook triggers: Inbound HTTP webhooks start workflows.\"" + "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-10 HMAC-validated inbound POST routes render the payload into an agent prompt or fire an existing cron job; hermes_cli/subcommands/webhook.py:16-50 `hermes webhook subscribe --prompt --events --skills --deliver --cron-job`; web/src/pages/WebhooksPage.tsx:207 create subscription", + "n8n": "docs-only: competitor_features#31096 \"Webhook triggers: Inbound HTTP webhooks start workflows.\"", + "dify": "source read at 1.17.1, not driven: api/controllers/trigger/webhook.py:59 /triggers/webhook/ any method starts the workflow; web/i18n/en-US/workflow.json blocks.trigger-webhook 'receives HTTP pushes from third-party systems'; configurable params, headers and response (nodes.triggerWebhook.*); the agent runs as a node in that workflow" } }, { @@ -1279,11 +1355,15 @@ "feature": "agent-webhook-trigger", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/webhook.py:136 re-running `webhook subscribe --secret ` replaces the route secret (else keeps it); hermes_cli/subcommands/webhook.py:58 `webhook remove` revokes the route; web/src/pages/WebhooksPage.tsx:335-355 secret shown once at creation; hermes_cli/subcommands/hooks.py:34 revoke is for hooks, not webhook secrets Note: Rotation is a re-subscribe with a new secret on the CLI; no rotate or revoke-secret action in the dashboard.", + "dify": "source read at 1.17.1, not driven: api/services/trigger/webhook_service.py:966,994-1001 the random webhook_id in the URL is the only secret, generated once at node sync; no regenerate endpoint (api/controllers/console/app/workflow_trigger.py:94 is GET only); revoke by disabling the trigger (:167) or deleting the node. No HMAC/signature check Note: revoke yes, rotate no" + } }, { "id": "sc-event", @@ -1303,15 +1383,17 @@ "feature": "flow-agent-listener", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "yes", - "dify": "unknown", + "dify": "partial", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "copilot-studio": "docs-only: competitor_features#31603 \"Autonomous agents: Agents that trigger on events and act without a human prompt (5 messages/action).\"", - "n8n": "docs-only: competitor_features#31096 \"Webhook triggers: Inbound HTTP webhooks start workflows.\"" + "n8n": "docs-only: competitor_features#31096 \"Webhook triggers: Inbound HTTP webhooks start workflows.\"", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-5 routes accept events from outside systems with header event filters (GitHub, GitLab, Linear, generic); gateway/hooks.py:1-9 lifecycle hooks (session, agent, command events) run handlers; cron/scheduler_script.py pre-run script gates a job; searched 'nextcloud' repo-wide: none Note: Agents start on outside-system events via webhooks, not on Nextcloud file or record events.", + "dify": "source read at 1.17.1, not driven: api/controllers/trigger/trigger.py:17 /triggers/plugin/ receives events from trigger plugins with subscriptions (api/controllers/console/workspace/trigger_providers.py:191); the event sources (GitHub, Slack, etc.) come from marketplace trigger plugins. No internal event bus for Dify's own events, no Nextcloud source Note: marketplace plugin only" } }, { @@ -1332,11 +1414,15 @@ "feature": "agent-schedule", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/webhook.py:47-51 a webhook route can fire an existing cron job (--cron-job); the same job keeps its schedule (cron/jobs.py:772 parse_schedule) and can be run by hand (hermes_cli/web_routers/cron.py:292 trigger); cron/jobs.py:2650-2657 manual run-now without consuming the next slot Note: Triggers are chosen per job or route rather than per profile.", + "dify": "source read at 1.17.1, not driven: a workflow chooses its start node(s): User Input, Schedule Trigger, Webhook Trigger or a plugin trigger (web/i18n/en-US/workflow.json blocks.trigger-schedule, blocks.trigger-webhook, onboarding.triggerDescription; common.chooseStartNodeToRun); api/controllers/console/app/workflow_trigger.py:128 lists an app's triggers Note: chosen per workflow app that wraps the agent" + } }, { "id": "sc-retry", @@ -1355,15 +1441,16 @@ "feature": "agent-schedule", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "yes", + "dify": "partial", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "dify": "docs-only: competitor_features#38562 \"Workflow run archives can now be exported: active runs are properly aborted during Celery warm shutdown to prevent orphaned tasks. Redis connections are more resilient with TCP keepalive support and expanded retry coverage.\"", - "n8n": "docs-only: competitor_features#3039 \"Error Handling: Built-in error handling with retry and fallback paths\"" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json nodes.common.retry.* per-node retry on failure with max retries and a fixed retry interval in ms (api/core/workflow/generator/prompts/builder_prompts.py:111 retry_config); fail branch / default value error handling (nodes.common.errorHandle.*). Searched 'backoff|exponential' in api/core/workflow: no growing waits, no whole-run retry Note: fixed interval, node level only", + "n8n": "docs-only: competitor_features#3039 \"Error Handling: Built-in error handling with retry and fallback paths\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/unreachable_retry.py:1-17 and :31 RETRY_DELAYS_SECONDS (300, 900, 1800): growing waits, stops after three, but only for fires that never reached the model (transient network error, zero API calls); cron/quota_hold.py:1-12 parks a job until a provider quota window reopens Note: Generic run failures are not retried; the bounded ladder covers unreachable-model failures only." } }, { @@ -1383,13 +1470,15 @@ "feature": "agent-schedule", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"" + "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 durable failure incidents grouped by job and error signature (detected, alerted, closed); hermes_cli/subcommands/cron.py:174-181 `hermes cron incidents list|ack`; cron/jobs.py:2254 dead-pin auto-pause Note: Failing jobs land in an incident list someone can acknowledge; the failed runs are not parked for replay and there is no dashboard view of incidents.", + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:27,121,150 run logs filter by status (failed) and web/app/components/app/workflow-log/filter.tsx; searched 'dead letter|dead_letter|quarantine|parked' in api/: no list that parks repeatedly failing runs Note: a failed-status filter per app, not a dead-letter list" } }, { @@ -1410,14 +1499,16 @@ "feature": "agent-schedule", "featureConfidence": "medium", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "n8n": "docs-only: competitor_features#38156 \"core: Close the durable scheduler's record-then-dispatch effect boundary: From n8n@2.32.0 (2026-07-21)\"" + "n8n": "docs-only: competitor_features#38156 \"core: Close the durable scheduler's record-then-dispatch effect boundary: From n8n@2.32.0 (2026-07-21)\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:2648-2670 claim_job_for_fire refuses a new fire while a fresh fire_claim exists (cleared by mark_job_run on completion, TTL for crashes); cron/jobs.py:3050 still-in-flight runs are skipped", + "dify": "source read at 1.17.1, not driven: api/schedule/workflow_schedule_task.py:94-114 _process_schedules advances next_run_at and dispatches every due schedule without checking for a running execution; searched 'overlap|already running|skip_if_running|concurrency' in api/schedule and api/services/trigger: nothing" } }, { @@ -1438,14 +1529,16 @@ "feature": "agent-schedule", "featureConfidence": "medium", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "open-webui": "docs-only: competitor_features#38862 \"Scheduled chat automations: Create and manage automations from the Automations page or directly in chat, with full run history\"" + "open-webui": "docs-only: competitor_features#38862 \"Scheduled chat automations: Create and manage automations from the Automations page or directly in chat, with full run history\"", + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/CronPage.tsx with web/src/i18n/en.ts cron.last 'Last', cron.next 'Next', overdueSince; hermes_cli/web_routers/cron.py:233 GET /api/cron/jobs and :243 /runs; hermes_cli/subcommands/cron.py:20 `cron list` and :168 `cron runs`", + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:45-65,128 GET /apps//triggers lists one app's triggers with status, no next run or last result; next 5 run times only in the node panel (web/i18n/en-US/workflow.json nodes.triggerSchedule.nextExecutionTimes). No workspace-wide schedule list Note: per app, no next run or last result in the list" } }, { @@ -1465,14 +1558,16 @@ "feature": "nc-native-tools", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31376 \"Files tool: Read, create, move, copy, delete files and create public share links.\"", - "open-webui": "docs-only: competitor_features#38760 \"Open WebUI Computer agent support: Open WebUI can now connect to Open WebUI Computer through its OpenAI-compatible gateway, letting chats run full agent sessions on your own machine with file, terminal, git, and web access.\"" + "open-webui": "docs-only: competitor_features#38760 \"Open WebUI Computer agent support: Open WebUI can now connect to Open WebUI Computer through its OpenAI-compatible gateway, letting chats run full agent sessions on your own machine with file, terminal, git, and web access.\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file, write_file, patch, search_files tools and :1371 registration in the file toolset, plus terminal tool for moves; searched 'nextcloud' repo-wide (excluding website/): none outside one test Note: Works on the host or sandbox filesystem; no Nextcloud Files connection.", + "dify": "source read at 1.17.1, not driven: core has no file-store tool (searched 'nextcloud|webdav' in api/, web/app, web/i18n: no hits; builtin tools are audio, code, time, webscraper in api/core/tools/builtin_tool/providers/). Official marketplace plugin langgenius/dify-official-plugins tools/nextcloud/tools/ has list_files, search_files, upload_file, download_file, create_folder, delete_file: no move Note: marketplace plugin only (official 'nextcloud' plugin, read on main not at a tag), and it cannot move files" } }, { @@ -1492,14 +1587,16 @@ "feature": "nc-native-tools", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31373 \"Calendar tool: List calendars, schedule events, find free time slots via natural-language chat.\"", - "open-webui": "docs-only: competitor_features#38866 \"Calendar workspace and event management: Open WebUI now has a full Calendar workspace. Create and manage events, set up recurring schedules, get reminders via in-app toasts or browser notifications, and see your scheduled automations alongside your calendar.\"" + "open-webui": "docs-only: competitor_features#38866 \"Calendar workspace and event management: Open WebUI now has a full Calendar workspace. Create and manage events, set up recurring schedules, get reminders via in-app toasts or browser notifications, and see your scheduled automations alongside your calendar.\"", + "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:1-27 bundled skill reads Google Calendar, checks conflicts and creates events through a gws CLI or bundled Python client (needs Google OAuth); optional-mcps/calendly; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Calendar only; no CalDAV, so a Nextcloud calendar is out of reach.", + "dify": "source read at 1.17.1, not driven: no calendar tool in core (api/core/tools/builtin_tool/providers/ has audio, code, time, webscraper). Marketplace: official langgenius/dify-official-plugins tools/google_calendar/tools/{list_events,create_event}.yaml, feishu/lark calendars, and a community CalDAV plugin langgenius/dify-plugins shaba/caldav that could point at a Nextcloud calendar Note: marketplace plugin only" } }, { @@ -1519,13 +1616,15 @@ "feature": "nc-native-tools", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31379 \"Contacts tool: Look up contact and user information to feed other tools.\"" + "nextcloud-assistant": "docs-only: competitor_features#31379 \"Contacts tool: Look up contact and user information to feed other tools.\"", + "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:15-22 Contacts via the Google People API in the bundled google-workspace skill; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Contacts only; no CardDAV or Nextcloud Contacts.", + "dify": "source read at 1.17.1, not driven: no contacts tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_contacts/tools/{search_contacts,get_contact}.yaml; community langgenius/dify-plugins shaba/carddav Note: marketplace plugin only" } }, { @@ -1546,13 +1645,15 @@ "feature": "nc-native-tools", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31377 \"Deck tool: Manage Deck board cards, labels and assignments.\"" + "nextcloud-assistant": "docs-only: competitor_features#31377 \"Deck tool: Manage Deck board cards, labels and assignments.\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/kanban_tools_schemas.py:89-371 kanban_create, kanban_comment, kanban_complete tools on Hermes' own multi-profile kanban board (hermes_cli/kanban.py); optional-mcps/ has asana, linear, monday, clickup MCP entries; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Cards on Hermes' own board or third-party boards; no Nextcloud Deck.", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|deck' in api/ and web/i18n: nothing in core. Marketplace kanban tools only for other products: official tools/trello/tools/{create_new_card_on_board,update_card}.yaml, monday, linear, jira Note: cards on Trello-like boards via plugins, not Nextcloud Deck" } }, { @@ -1572,13 +1673,15 @@ "feature": "nc-native-tools", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31375 \"Mail tool: Send emails, manage mail accounts and folders.\"" + "nextcloud-assistant": "docs-only: competitor_features#31375 \"Mail tool: Send emails, manage mail accounts and folders.\"", + "hermes-agent": "source read at v2026.9.24, not driven: skills/email/himalaya/SKILL.md:1-3 bundled IMAP/SMTP skill; plugins/platforms/email/plugin.yaml:5-8 email gateway polls IMAP and replies over SMTP; tools/send_message_tool.py:35 send_message delivers to the email target; skills/productivity/google-workspace Gmail", + "dify": "source read at 1.17.1, not driven: core email is only the Human Input node's delivery method (web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*, api/services/feature_service.py:81 on for self-hosted). A generic send-email tool comes from the official tools/email/tools/send_mail.yaml plugin or gmail/outlook plugins Note: agent-callable email is marketplace plugin only" } }, { @@ -1600,12 +1703,13 @@ "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31374 \"Talk tool: List conversations, send messages, create public conversations from the agent.\"", - "hermes-agent": "docs-only: competitor_features#31137 \"Multi-platform gateway: Single daemon routes 22+ platforms (Telegram/Slack/Signal/Email/Matrix/Teams)\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/send_message_tool.py:1-2 and :35 send_message posts to any connected chat platform (plugins/platforms/: telegram, discord, slack, matrix, mattermost, teams, signal and more); plugin-catalog/hermes-talk.yaml:1-5 is realtime voice, not Nextcloud Talk; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Posting into a team chat works; there is no Nextcloud Talk adapter.", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/i18n: nothing in core. Marketplace chat tools for other products: official tools/slack/tools/send_message.yaml, tools/teams/tools/send_channel_message.yaml, discord, dingtalk, wecom Note: posts to Slack/Teams via plugins, not Nextcloud Talk" } }, { @@ -1626,13 +1730,15 @@ "feature": "nc-tasks-tool", "featureConfidence": "low", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31378 \"Tasks tool: Create, list, complete, update and delete tasks.\"" + "nextcloud-assistant": "docs-only: competitor_features#31378 \"Tasks tool: Create, list, complete, update and delete tasks.\"", + "hermes-agent": "source read at v2026.9.24, not driven: skills/apple/apple-reminders/SKILL.md:1-3 'add, list, complete' reminders (macOS); tools/kanban_tools_schemas.py:89 kanban_complete and :371 kanban_create; optional-mcps/todoist; tools/todo_tool.py in-session todo list Note: No CalDAV tasks; Nextcloud Tasks is not reachable.", + "dify": "source read at 1.17.1, not driven: no task tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_tasks/tools/{create_task,update_task}.yaml, microsoft_todo, todoist, feishu_task Note: marketplace plugin only" } }, { @@ -1652,13 +1758,15 @@ "feature": "unified-search-tool", "featureConfidence": "low", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31384 \"Unified search tool: Access all Nextcloud search providers from the agent.\"" + "nextcloud-assistant": "docs-only: competitor_features#31384 \"Unified search tool: Access all Nextcloud search providers from the agent.\"", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; tools/session_search_tool.py searches only Hermes' own conversations and tools/file_tools.py:1270 search_files only the host filesystem Note: No Nextcloud unified search provider or equivalent cross-app search.", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|unified search|unified_search' in api/ and web/: nothing. The official marketplace nextcloud plugin (langgenius/dify-official-plugins tools/nextcloud/tools/search_files.yaml) searches files only, not everything Nextcloud search reaches" } }, { @@ -1680,12 +1788,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { - "hermes-agent": "docs-only: competitor_features#38358 \"xAI Web Search lands as a plugins/web/xai/ provider: slots alongside Brave / Tavily / Exa / SearXNG / DDGS / Firecrawl - reuses your existing Grok OAuth or XAIAPIKEY credentials, no new env vars.\"", - "open-webui": "docs-only: competitor_features#31814 \"Web search integration: Pluggable web search providers for grounded answers\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/web_tools.py:1-9 web_search and web_extract over pluggable backends in plugins/web/ (brave_free, ddgs, exa, firecrawl, searxng, tavily, perplexity ...); tools/browser_tool.py full browser for reading pages", + "open-webui": "docs-only: competitor_features#31814 \"Web search integration: Pluggable web search providers for grounded answers\"", + "dify": "source read at 1.17.1, not driven: core ships only a page reader (api/core/tools/builtin_tool/providers/webscraper); web search engines are marketplace plugins (official tools/duckduckgo, tavily, searxng, google, bing, brave, perplexity in langgenius/dify-official-plugins); web/i18n/en-US/agent-v-2.json tools.addMenu.tool 'like web search or integrations' Note: reading pages is core, searching needs a plugin" } }, { @@ -1705,11 +1814,15 @@ "feature": "agent-tool-governance", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'openregister|register' as a record store in *.py and optional-mcps/: none; searched 'nextcloud' repo-wide (excluding website/): none outside one test", + "dify": "source read at 1.17.1, not driven: searched 'openregister' in api/ and web/app: no hits; no OpenRegister connector in core or in the official plugin list (langgenius/dify-official-plugins tools/). Only reachable by a hand-built custom OpenAPI tool or HTTP node" + } }, { "id": "tl-mcp-client", @@ -1731,15 +1844,16 @@ "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "yes", - "dify": "unknown", + "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31385 \"Remote MCP client: Consume external MCP servers, but streamable_http only and cannot use per-user access tokens.\"", - "hermes-agent": "docs-only: competitor_features#31146 \"MCP integration: Connects to MCP servers for external tools\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/mcp_tool.py MCP client (stdio, HTTP, OAuth in tools/mcp_oauth.py); hermes_cli/subcommands/mcp.py:27 `hermes mcp add` and :52 configure tool selection; hermes_cli/web_routers/mcp.py:110 POST /api/mcp/servers behind web/src/pages/McpPage.tsx; optional-mcps/ catalog of 65 servers", "copilot-studio": "docs-only: competitor_features#31607 \"MCP support: Copilot Studio can consume MCP tool servers.\"", "n8n": "docs-only: competitor_features#3906 \"AI Agent Node: Extract tool name correctly for MCP tool calls: From n8n@2.14.0 (2026-03-24)\"", - "open-webui": "docs-only: competitor_features#31815 \"Model Context Protocol (MCP) tools: MCP tool/server support for external tools\"" + "open-webui": "docs-only: competitor_features#31815 \"Model Context Protocol (MCP) tools: MCP tool/server support for external tools\"", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/tool_providers.py:1373 add an MCP server as a tool provider, :1501 MCP OAuth, :1577 list its tools; api/core/mcp/types.py:26 client negotiates protocol 2025-06-18; web/i18n/en-US/agent-v-2.json tools.toolTabs.mcp so agents pick MCP tools" } }, { @@ -1759,14 +1873,15 @@ "feature": "governed-cli-mcp-transport", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#38560 \"The workflow-as-MCP server now supports MCP protocol 2025-06-18: with version negotiation and structured tool output, while remaining backward compatible with older clients.\"", - "n8n": "docs-only: competitor_features#38148 \"core: Acquire expression isolate for MCP Trigger tool calls in queue mode: From n8n@2.32.0 (2026-07-21)\"" + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/mcp_server.py:79 enable an app's MCP server, :181 refresh its URL; api/controllers/mcp/mcp.py:44 /mcp/server//mcp endpoint serving the app as an MCP tool to outside agents Note: each app is exposed as a tool, not the workspace's whole tool catalogue", + "n8n": "docs-only: competitor_features#38148 \"core: Acquire expression isolate for MCP Trigger tool calls in queue mode: From n8n@2.32.0 (2026-07-21)\"", + "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:1-7 `hermes mcp serve` stdio MCP server exposing a channel bridge: mcp_serve.py:468 conversations_list, :600 messages_send, :626 channels_list, :662-672 approvals; plugins/platforms/a2a lets outside agents message Hermes Note: Outside agents reach conversations, messaging and approvals, not Hermes' own tool set (files, terminal, web, skills)." } }, { @@ -1792,9 +1907,9 @@ "n8n": "yes", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38355 \"Nous-approved MCP catalog with interactive picker: A curated catalog of Nous-vetted MCP servers, mirroring the optional-skills shape. Run hermes mcp and you get an interactive picker; install with one keystroke.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:213-215 /tools list and /toolsets; hermes_cli/web_routers/tools.py:230 GET /api/tools/toolsets behind web/src/pages/SkillsPage.tsx:140 toolsets view with descriptions; tools/tool_search.py lets the agent search the tool catalog", "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", - "dify": "docs-only: competitor_features#30990 \"Tools/plugins marketplace: Plugin ecosystem of tools/connectors.\"", + "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/tool-provider-list.tsx list every installed tool provider (plugins, custom, workflow-as-tool, MCP) with each tool's description; api/controllers/console/workspace/tool_providers.py lists them", "n8n": "docs-only: competitor_features#31095 \"400+ app connectors: Large library of prebuilt integration nodes.\"" } }, @@ -1817,12 +1932,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { - "hermes-agent": "docs-only: competitor_features#38288 \"Full profile builder in the dashboard: pick its model, choose its skills, attach its MCP servers - without hand-editing config.yaml.\"", - "open-webui": "docs-only: competitor_features#38785 \"Access preview for users and groups: Administrators can now preview exactly which models, knowledge bases, and tools a given user or group can access, making it easier to audit and verify permission setups.\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/tools.py:280-285 PUT /api/tools/toolsets/{name}?profile= enables/disables a toolset per profile and per platform (platform_toolsets.), behind web/src/pages/SkillsPage.tsx toolsets view; hermes_cli/commands.py:213 /tools disable|enable ; agent/subagent_lifecycle.py:415 subagents only get a subset of the parent's toolsets", + "open-webui": "docs-only: competitor_features#38785 \"Access preview for users and groups: Administrators can now preview exactly which models, knowledge bases, and tools a given user or group can access, making it easier to audit and verify permission setups.\"", + "dify": "source read at 1.17.1, not driven: tools are picked per agent (web/i18n/en-US/agent-v-2.json agentDetail.configure.tools.*; classic agent apps list tools in model config). But every Agent v2 run also gets a shell tool (dify-agent/src/dify_agent/layers/shell/layer.py:259,303 run) and 'Tools the agent installs in its sandbox won't appear here but stay available to it' (agent-v-2.json tools.tip) Note: explicit list for classic agents; Agent v2 always has a shell, so not 'nothing else'" } }, { @@ -1844,11 +1960,15 @@ "featureConfidence": "high", "defectCandidate": "ToolAccessRequestService::notifyOwner() (lib/Service/ToolAccessRequestService.php:758-766) raises notification subjects 'tool_access_requested'/'tool_access_granted', neither of which is in lib/Notification/Notifier.php's KNOWN_SUBJECTS list (lines 58-65), so INotifier::prepare() throws UnknownNotificationException and the bell-menu entry for it never renders.", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'request.{0,20}(tool|toolset).{0,20}(access|enable)|ask.{0,20}(user|owner).{0,20}enable' in *.py: none; hermes_cli/tool_availability_notices.py:1-6 only prints startup notices for toolsets missing requirements; tools/tool_search.py:1-7 discloses deferred tools that are already granted Note: The agent cannot ask its owner for a new tool through any built-in flow.", + "dify": "source read at 1.17.1, not driven: searched 'request access|requestAccess|ask.*owner|tool request' in web/i18n/en-US and dify-agent/src: only static 'contact your Workspace Owner' tour text (web/i18n/en-US/common.json:624); no flow where an agent asks for a missing tool" + } }, { "id": "tl-code-exec", @@ -1874,8 +1994,8 @@ "n8n": "partial", "open-webui": "yes", "evidence": { - "hermes-agent": "docs-only: competitor_features#31139 \"Six execution backends: Local/SSH/Docker/Daytona/Singularity/Modal; 8 parallel workers\"", - "dify": "docs-only: competitor_features#38558 \"Agent App enters open beta: It introduces a built-in sandbox for code execution and shell commands, a skill system that lets agents call tools and APIs.\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/code_execution_tool.py:1-9 code execution through a session kernel; tools/environments/ docker.py, modal.py, daytona.py, singularity.py, vercel_sandbox.py, ssh.py isolated terminal backends (tools/terminal_tool_backends.py:1-3); hermes_cli/web_routers/tools.py:661 PUT /api/tools/terminal/backend", + "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/layers/shell/layer.py:303 agent runs scripts in a per-agent Linux sandbox (dify-agent-runtime/docker/Dockerfile); workflow Code node (web/i18n/en-US/workflow.json blocks.code) runs in dify-sandbox; builtin code tool api/core/tools/builtin_tool/providers/code Note: agent-v-2.json communityEditionIsolationTip: in Community Edition the sandbox is only Landlock-protected and shares a PID namespace, not strongly isolated", "n8n": "docs-only: competitor_features#3038 \"Code Nodes: JavaScript and Python code execution within workflows\"", "open-webui": "docs-only: competitor_features#38760 \"Open WebUI Computer agent support: Open WebUI can now connect to Open WebUI Computer through its OpenAI-compatible gateway, letting chats run full agent sessions on your own machine with file, terminal, git, and web access.\"" } @@ -1900,12 +2020,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { - "hermes-agent": "docs-only: competitor_features#38266 \"First-class coding Projects in the desktop app: a sidebar of your codebases, a coding rail, a review pane, git worktree management, and agent-facing project tools.\"", - "open-webui": "docs-only: competitor_features#38760 \"Open WebUI Computer agent support: letting chats run full agent sessions on your own machine with file, terminal, git, and web access.\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool.py runs git in the working tree; hermes_cli/subcommands/worktree.py:8-26 isolated git worktrees and tools/subagent_worktree.py per-subagent worktrees; hermes_cli/commands.py:173 /diff and :83 /rollback checkpoints (tools/checkpoint_manager.py); skills/software-development/ bundled coding skills", + "open-webui": "docs-only: competitor_features#38760 \"Open WebUI Computer agent support: letting chats run full agent sessions on your own machine with file, terminal, git, and web access.\"", + "dify": "source read at 1.17.1, not driven: dify-agent-runtime/docker/Dockerfile:31-37 installs git and openssh-client in the agent sandbox; dify-agent/src/dify_agent/layers/shell/layer.py:303 the agent runs shell scripts there, secrets via the env editor (agent-v-2.json advancedSettings.envEditor); official github/gitlab plugins add PR and commit tools Note: through the generic shell, no dedicated git UI" } }, { @@ -1925,16 +2046,17 @@ "feature": "custom-tool-extensibility", "featureConfidence": "low", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31883 \"Model Context Protocol (MCP) tools: Admins add custom services to Context Agent via MCP\"", - "dify": "docs-only: competitor_features#30990 \"Tools/plugins marketplace: Plugin ecosystem of tools/connectors.\"", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/tool_providers.py:685 add a custom tool from an OpenAPI schema (web/i18n/en-US/tools.json createTool.schema), :904 publish a workflow as a tool, :1373 add an MCP server; agent-v-2.json tools.cliDialog installs a CLI tool into the agent sandbox", "n8n": "docs-only: competitor_features#3045 \"Community Nodes: Community-contributed custom integration nodes\"", - "open-webui": "docs-only: competitor_features#31817 \"Pipelines / custom function plugins: Python function pipelines and filters extend the chat flow\"" + "open-webui": "docs-only: competitor_features#31817 \"Pipelines / custom function plugins: Python function pipelines and filters extend the chat flow\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:456 register_tool in the plugin context; hermes_cli/subcommands/plugins.py:18 `hermes plugins install` from a git URL, into ~/.hermes/plugins; web/src/i18n/en.ts pluginsPage.installHeading 'Install from GitHub / Git URL'; hermes_cli/subcommands/mcp.py:27 add any MCP server" } }, { @@ -1956,11 +2078,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38247 \"Your sessions, your data - export everything: hermes sessions export now writes Markdown, Quarto, HTML, prompt-only, and even Hugging Face-ready trace formats, with the full filter surface (age, workspace, platform).\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/sessions.py:69-78 `hermes sessions export --format jsonl|trace` writes full transcripts including every tool call and argument, filterable by age and source; hermes_cli/web_routers/sessions.py:787 GET /api/sessions/{id}/export (one session) Note: Tool calls export inside whole transcripts; there is no tool-call-only list or dashboard export across sessions.", + "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI writes query, answer, inputs, sources and feedback (api/services/retention/conversation/message_export_service.py:53-62), no tool calls; api/controllers/console/workflow_run_archive.py:93-130 run-archive download is Cloud paid-plan only; tool spans reach Langfuse and other tracers (api/core/ops) Note: no community export of the tool-call list; old partial rested on the message export, which leaves tool calls out" } }, { @@ -1980,13 +2103,14 @@ "feature": "settings-management", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "partial", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38303 \"The web dashboard is now a full admin panel: There's a Channels page that sets up every gateway messaging platform (Telegram, Discord, Slack, etc.) from the browser.\"" + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ChannelsPage.tsx:42-51 live connected/disconnected/fatal state per messaging platform; web/src/pages/SystemPage.tsx:106 runs `doctor` with a live log and :187 memory-provider status, :210 credential pool; hermes_cli/web_routers/mcp.py:195 POST /api/mcp/servers/{name}/test; hermes_cli/doctor_connectivity.py:1-4 provider API probes Note: Spread over Channels, MCP and System pages rather than one list. Old partial.", + "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/routes.ts:2-11 one page for model providers, builtin tools, MCP, custom tools, workflow tools, data sources, endpoints, triggers, agent strategies, extensions, each showing Authorized/Unauthorized (web/i18n/en-US/tools.json auth.authorized, auth.unauthorized) Note: shows whether a connection is authorised, not a live health check" } }, { @@ -2008,13 +2132,14 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", - "hermes-agent": "docs-only: competitor_features#31130 \"Persistent memory (MEMORY.md/USER.md): Curated cross-session memory files with periodic persistence nudges\"", - "open-webui": "docs-only: competitor_features#38763 \"Reworked memory system: Memory has been overhauled with distinct memory types - long-lived personal memories and per-conversation context - managed through a structured add, update, and delete flow.\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:1-5 persistent MEMORY.md (agent notes) and USER.md (user profile) injected into every session; agent/background_review.py:1-6 after each turn a forked agent decides what to save; plugins/memory/ bundled providers (honcho, mem0, supermemory, openviking, retaindb, holographic, byterover)", + "open-webui": "docs-only: competitor_features#38763 \"Reworked memory system: Memory has been overhauled with distinct memory types - long-lived personal memories and per-conversation context - managed through a structured add, update, and delete flow.\"", + "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 Agent v2 working directories are owned per conversation, workflow run or build draft, so end-user runs do not carry facts into the next conversation; only builder-applied persistent files and the build note (agent-v-2.json workingDirectory.persistentFilesTooltip) carry over. Learned memory comes from marketplace plugins (official bailian_memory; community mem0, zep in langgenius/dify-plugins) Note: marketplace plugin for learned memory; plugins not read" } }, { @@ -2036,13 +2161,14 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", - "hermes-agent": "docs-only: competitor_features#31132 \"Honcho dialectic user modeling: Pluggable memory provider builds a persistent model of the user\"", - "open-webui": "docs-only: competitor_features#38763 \"Reworked memory system: long-lived personal memories and per-conversation context - managed through a structured add, update, and delete flow, giving models a more reliable way to remember and apply what they've learned about you.\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 target 'user' = who the user is (name, role, preferences, style) in USER.md; plugins/memory/honcho/__init__.py:1-5 per-peer user modeling with peer cards; mem0 user_id canonical across gateways (plugins/memory/mem0/__init__.py:1-7) Note: USER.md is per profile, not per person; per-person modelling needs the honcho or mem0 provider.", + "open-webui": "docs-only: competitor_features#38763 \"Reworked memory system: long-lived personal memories and per-conversation context - managed through a structured add, update, and delete flow, giving models a more reliable way to remember and apply what they've learned about you.\"", + "dify": "source read at 1.17.1, not driven: searched 'user profile|user_memory|remember' in dify-agent/src and api/core/memory (token_buffer_memory.py only): no per-person memory in core; conversation variables are per conversation (api/controllers/console/app/conversation_variables.py:88). Per-user memory only via marketplace memory plugins (community mem0, zep) Note: marketplace plugin only, plugin behaviour not read" } }, { @@ -2063,15 +2189,16 @@ "feature": "agent-memory", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "yes", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", - "hermes-agent": "docs-only: competitor_features#38290 \"The memory tool got a major upgrade - atomic batch operations: The memory tool gained an operations array that applies a batch of add/replace/remove edits atomically against the final character budget.\"", - "open-webui": "docs-only: competitor_features#38763 \"Reworked memory system: managed through a structured add, update, and delete flow\"" + "hermes-agent": "source read at v2026.9.24, not driven: memories are plain files $HERMES_HOME/memories/MEMORY.md and USER.md (hermes_cli/web_routers/ops.py:481-492); web/src/pages/SystemPage.tsx:1234-1243 shows their sizes and Reset buttons only; hermes_cli/commands.py:223 /memory pending|approve|reject reviews staged writes; tools/memory_tool.py:311 agent can replace/remove entries on request Note: No viewer or editor in dashboard or CLI; correcting means editing the file by hand or asking the agent.", + "open-webui": "docs-only: competitor_features#38763 \"Reworked memory system: managed through a structured add, update, and delete flow\"", + "dify": "source read at 1.17.1, not driven: builders see and edit the agent's persistent files and generated build note (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, files.buildNote, workingDirectory.*) and conversation variables per conversation (api/controllers/console/app/conversation_variables.py:88); there is no learned-memory store to inspect Note: the agent's files are editable, but there is no memory of learned facts to review" } }, { @@ -2091,13 +2218,15 @@ "feature": "agent-memory", "featureConfidence": "high", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"" + "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:56 hard char budgets (memory 2200, user 1375) and :323-324 'IF FULL ... reissue as ONE batch that removes or shortens enough stale entries'; agent/background_review.py:1-6 background review updates existing memory; plugins/memory/holographic/__init__.py:1-5 trust scoring and temporal decay", + "dify": "source read at 1.17.1, not driven: searched 'consolidat|dedupe memory|stale|forget' in dify-agent/src and api/core: dify-agent/src/dify_agent/runtime/compaction.py only compacts the current run's context; nothing merges or prunes stored memory" } }, { @@ -2118,15 +2247,16 @@ "feature": "vector-rag", "featureConfidence": "medium", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31881 \"Context Chat (RAG over Nextcloud data): RAG over Files, Collectives and Analytics\"", - "dify": "docs-only: competitor_features#30988 \"RAG pipeline & knowledge base: Built-in document ingestion + retrieval.\"", - "open-webui": "docs-only: competitor_features#31813 \"RAG document ingestion / knowledge base: Upload docs and chat over them with retrieval\"" + "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/datasets.py:446 create a knowledge base, datasets_document.py:384 upload documents, web/app/(commonLayout)/datasets/create; agents search it via Knowledge Retrieval (web/i18n/en-US/agent-v-2.json knowledgeRetrieval.*; dify-agent/src/dify_agent/layers/knowledge/layer.py)", + "open-webui": "docs-only: competitor_features#31813 \"RAG document ingestion / knowledge base: Upload docs and chat over them with retrieval\"", + "hermes-agent": "source read at v2026.9.24, not driven: plugins/memory/retaindb/__init__.py:515-564 retaindb_upload_file, retaindb_ingest_file, retaindb_list_files with semantic search (RetainDB cloud API); plugins/memory/openviking/__init__.py:1-6 OpenViking tiered knowledge with semantic search; searched 'knowledge base|vector|embedding' for a built-in document store: none Note: Only through a bundled memory-provider plugin backed by an outside service, driven by agent tools; no upload UI or built-in knowledge base." } }, { @@ -2147,11 +2277,15 @@ "feature": "agent-context-system", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_builder.py:1656-1668 every run loads the working directory's .hermes.md, AGENTS.md chain, CLAUDE.md and .cursorrules plus the profile SOUL.md; agent/context_references.py:1 @file:, @folder:, @git:, @url: references per message; agent/context_file_sources.py:1-6 /context lists what was loaded Note: Context follows the working directory and per-message references; there is no named, reusable bundle of files and records attached to an agent.", + "dify": "source read at 1.17.1, not driven: an agent's Files are kept in its persistent working directory and available in every run (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, workingDirectory.persistentFilesTooltip; api/models/agent.py:218 AgentHomeSnapshot); knowledge retrievals attach per agent. No named bundle of files and records that can be reused across agents Note: per-agent files, not a named reusable context bundle" + } }, { "id": "me-compression", @@ -2172,12 +2306,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { - "hermes-agent": "docs-only: competitor_features#31145 \"Context compression: ContextCompressor summarizes middle turns near token limits\"", - "open-webui": "docs-only: competitor_features#38759 \"Automatic context compaction for long chats: Conversations that grow past a configurable token threshold can now be summarized automatically so they stay within a model's context window.\"" + "hermes-agent": "source read at v2026.9.24, not driven: agent/context_compressor.py:1-2 automatic compression summarises middle turns with an auxiliary model while head and tail stay; hermes_cli/commands.py:81 /compress with 'here [N]' and --preview", + "open-webui": "docs-only: competitor_features#38759 \"Automatic context compaction for long chats: Conversations that grow past a configurable token threshold can now be summarized automatically so they stay within a model's context window.\"", + "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/runtime/compaction.py:16-44 TieredCompaction clears old tool results then SummarizingCompaction keeps the last 20 messages and summarises older ones, wired in dify-agent/src/dify_agent/runtime/runner.py:365,402 Note: Agent v2 only; classic apps use a token window (api/core/memory/token_buffer_memory.py) without summarising" } }, { @@ -2197,11 +2332,15 @@ "feature": "knowledge-graph", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'record|relation|knowledge graph|graph traversal' in agent/ and tools/: agent/learning_graph.py:1-6 only draws a desktop graph of learned skills and memory chunks; plugins/memory/holographic/__init__.py:1-3 resolves entities in stored facts but offers no link-following over records Note: No record store, so nothing to follow links across.", + "dify": "source read at 1.17.1, not driven: searched 'knowledge.?graph|graph_rag|graphrag' in api/core/rag and web/i18n/en-US: no hits; retrieval is vector, full-text, hybrid and parent-child chunks (api/core/rag/retrieval). A neo4j query tool exists only as an official marketplace plugin (tools/neo4j)" + } }, { "id": "me-object-grounding", @@ -2221,11 +2360,15 @@ "feature": "agent-object-leaf", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; no record or object-on-screen concept in agent/prompt_builder.py context sources (agent/prompt_builder.py:1656-1661)", + "dify": "source read at 1.17.1, not driven: searched 'record|object context|linked records' in api/core/app and dify-agent/src: an answer is grounded only in knowledge retrieval and inputs the caller passes (web/public/embed.js:93 inputs); nothing resolves the record on screen or follows its links" + } }, { "id": "me-external-kb", @@ -2244,14 +2387,16 @@ "feature": "web-research-tool", "featureConfidence": "low", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "yes", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", - "open-webui": "docs-only: competitor_features#38762 \"External knowledge bases: Knowledge bases can now be backed by an external retrieval source through configurable external knowledge connections, so you can search an existing external system from chat instead of only Open WebUI's built-in store.\"" + "open-webui": "docs-only: competitor_features#38762 \"External knowledge bases: Knowledge bases can now be backed by an external retrieval source through configurable external knowledge connections, so you can search an existing external system from chat instead of only Open WebUI's built-in store.\"", + "hermes-agent": "source read at v2026.9.24, not driven: optional-mcps/atlassian/manifest.yaml:1-9 Nous-approved catalog entry for Confluence pages and Jira; optional-mcps/notion, microsoft-learn, deepwiki; skills/productivity/notion bundled skill; plugin-catalog/microsoft365.yaml:1-5 SharePoint and OneDrive via a community plugin Note: SharePoint only through a community catalog plugin; wikis such as Confluence and Notion through core catalog MCP entries.", + "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/external.py:153,339 connect an external knowledge API as a dataset; api/controllers/console/datasets/data_source.py:228,417 Notion import and sync in core; website crawl datasets/website.py:32; SharePoint and Confluence via official datasource plugins (langgenius/dify-official-plugins datasources/sharepoint_datasource, confluence_datasource) Note: SharePoint itself is a marketplace plugin; Notion wiki and the external-KB API are core" } }, { @@ -2273,11 +2418,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31135 \"Skills catalog (ClawHub/skills.sh): 166 skills across 26+ categories, shareable/searchable\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:38 `hermes skills browse` (paginated, filter by source) and :46 search across registries (tools/skills_hub_*.py: official, GitHub, skills.sh, ClawHub); web/src/i18n/en.ts skills.browseHub 'Browse skills hub' on web/src/pages/SkillsPage.tsx:140 hub view", + "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/skills/page.tsx workspace Skills library; api/controllers/console/workspace/skills.py:296 list with search by name or description and tags (web/i18n/en-US/skill.json skillManagement.searchPlaceholder, tags); agents add from it (agent-v-2.json skills.addMenu.workspace 'Add from library') Note: a workspace library, not a public catalogue" } }, { @@ -2299,11 +2445,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38289 \"Skills Hub browser rehaul: Browsing and installing skills from the trusted taps (OpenAI, Anthropic, HuggingFace, NVIDIA) is now a real...\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:54 `hermes skills install `; web/src/pages/SkillsPage.tsx:140 hub view with install; hermes_cli/commands.py:217 /skills install in chat; tools/skills_hub_install.py", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:811 /workspaces/current/agents//skills binds library skills to an agent; web/i18n/en-US/agent-v-2.json skills.addMenu.workspace 'Add from library' and skills.addMenu.upload 'Upload skill.zip' (embedded), limit of 20 library skills per agent (skills.workspaceSelector.limitReached)" } }, { @@ -2325,11 +2472,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31133 \"Autonomous skills system: agentskills.io standard; skills auto-created after 5+ tool calls, self-improving\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_tool.py:613 reads metadata.hermes.* (agentskills.io) tags and related_skills and :645 agentskills.io optional compatibility field; tools/skill_manager_tool.py:1-7 SKILL.md + references/ templates/ scripts/ assets/ layout; hermes_cli/subcommands/skills.py:148 publish to GitHub or ClawHub", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/skill.json emptyAction.importDescription 'Bring a .zip with SKILL.md, in the agentskills.io format', errors.missingSkillMd; api/controllers/console/workspace/skills.py:385 import and :494 export of the package; agent-v-2.json skills.upload.warning.specification 'must follow the Agent Skills specification'" } }, { @@ -2351,11 +2499,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31133 \"Autonomous skills system: agentskills.io standard; skills auto-created after 5+ tool calls, self-improving\"" + "hermes-agent": "source read at v2026.9.24, not driven: agent/background_review.py:1-6 after each turn a forked agent asks whether any skill should be updated and patches it via skill_manage; hermes_cli/commands.py:124 /refine reviews the conversation and saves lessons to skills; agent/curator.py:1-7 curator may patch skills", + "dify": "source read at 1.17.1, not driven: in Build mode the agent edits its own skills and files from the build conversation and holds them as a build draft to Apply (agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you'; api/controllers/console/agent/roster.py:876,941); the Skill Builder rewrites a skill on request (api/controllers/console/workspace/skills.py:516 assist/messages). Nothing proposes improvements from production runs Note: improves from the builder's build chat, not from what it learned in runs" } }, { @@ -2375,11 +2524,15 @@ "feature": "skill-self-improvement", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: tools/write_approval.py:1-9 skills.write_approval stages agent skill writes under pending/skills/.json with a difflib diff; hermes_cli/commands.py:217-221 /skills pending|diff|approve|reject|approval; hermes_cli/write_approval_commands.py:1 Note: Off by default; the operator switches the gate on.", + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/build-draft-changes-panel.tsx lists changed sections as Updated/Rewritten with Apply or Discard (build-draft-bar.tsx; roster.py:932 DELETE build-draft, :941 apply); skill drafts publish or restore (skills.py:678,703). Searched 'diff|compare' in web/i18n/en-US/skill.json and agent-v-2.json: no side-by-side difference Note: accept or reject yes, a visible diff no" + } }, { "id": "sk-auto-create", @@ -2400,11 +2553,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31133 \"Autonomous skills system: agentskills.io standard; skills auto-created after 5+ tool calls, self-improving\"" + "hermes-agent": "source read at v2026.9.24, not driven: agent/background_review.py:463 'CREATE A NEW CLASS-LEVEL UMBRELLA SKILL when no existing skill covers the class' in the post-turn review prompt; tools/skill_manager_tool.py:1-5 new skills land in ~/.hermes/skills/; hermes_cli/commands.py:232 /learn builds a skill on request", + "dify": "source read at 1.17.1, not driven: agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you': the agent writes skills while the builder chats in Build mode (roster.py:846 build-draft/checkout); searched 'auto.?create|learn|after solving' in dify-agent/src: no path where an agent writes a skill on its own after a production run Note: only inside a builder-driven Build session" } }, { @@ -2426,11 +2580,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31134 \"Skills curator: Autonomous curator reviews/consolidates/archives skills with per-run reports\"" + "hermes-agent": "source read at v2026.9.24, not driven: agent/curator.py:1-7 inactivity-triggered curator runs every interval_hours, archives stale skills (never deletes), consolidates duplicates into umbrella skills, honours pins; hermes_cli/curator.py:98-163 `hermes curator` status/run --consolidate; hermes_cli/commands.py:245 /curator pin|archive|list-archived Note: The LLM merge pass is opt-in (curator.consolidate); archiving runs by default.", + "dify": "source read at 1.17.1, not driven: searched 'curator|merge skill|duplicate skill|archive unused|stale' in api/services/skill_management_service.py, api/schedule and web/i18n/en-US/skill.json: only manual duplicate and delete (api/controllers/console/workspace/skills.py:474, skill.json deleteDialog); no scheduled merge or archive" } }, { @@ -2452,11 +2607,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38289 \"Skills Hub browser rehaul: full skill previews before you install, and a security scan on each skill.\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/skill_usage.py:1-6 per-skill use counts, provenance (bundled, hub, agent-created) and lifecycle active -> stale -> archived; web/src/i18n/en.ts analytics.topSkills with loads, edits, last used on AnalyticsPage; hermes_cli/subcommands/skills.py:28 trust/untrust and :85 audit (security scan verdicts) Note: Signals exist (usage, lifecycle, trust, scan) but no maturity or proven rating shown per skill before use.", + "dify": "source read at 1.17.1, not driven: searched 'maturity|proven|rating|success rate|eval' in web/i18n/en-US/skill.json and api/services/skill_management_service.py: a skill shows only draft/published state, version number and 'Used by N agents' (skill.json detail.referencedBy_one, referenceCount); no maturity or proof signal Note: usage count is the only trust hint" } }, { @@ -2476,12 +2632,16 @@ "feature": "skill-self-improvement", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" - }, + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:112 `skills diff` against the stock bundled version and :94 reset; agent/curator_backup.py:1-6 tar.gz snapshot of the whole skills tree before each curator pass with rollback; tools/write_approval.py:1-9 staged diffs for pending writes Note: No per-skill version history; rollback is whole-tree curator snapshots and compare is only against the bundled stock copy.", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:743,758 versions list and detail, :703 restore a version to draft; web/i18n/en-US/skill.json detail.versions, versionPublishNote, restoreVersion. Searched 'compare|diff' in skill.json: no comparison of two versions Note: history and rollback yes, compare no" + } + }, { "id": "sk-github", "area": "skills", @@ -2499,11 +2659,15 @@ "feature": "skills-marketplace", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:165-171 `skills tap add owner/repo` adds a GitHub repo as a skill source; tools/skills_hub_github.py search and install; hermes_cli/subcommands/skills.py:148-153 `skills publish --to github --repo`", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 import takes only an uploaded zip (request.files['file']); searched 'github|repository|publish to' in api/services/skill_management_service.py and skill.json: no GitHub discovery, install or publish" + } }, { "id": "sk-learnings", @@ -2522,13 +2686,14 @@ "feature": "skill-learnings", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "partial", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38268 \"Cheaper self-improvement - smarter background review: The post-turn self-improvement fork (the one that decides whether to save a memory or skill) now routes to an auxiliary model.\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:319-322 corrections for a kind of work belong in that task's skill via skill_manage; agent/background_review.py:1-6 post-turn review patches the skill with the lesson; hermes_cli/commands.py:124 /refine saves lessons to memory/skills Note: Old partial; the review loop writes lessons into skills.", + "dify": "source read at 1.17.1, not driven: searched 'lesson|learning|rule' in dify-agent/src, api/services/skill_management_service.py and web/i18n/en-US/skill.json: no mechanism that turns repeated run lessons into skill rules; the build note (agent-v-2.json files.buildNote) records build-session setup only" } }, { @@ -2548,11 +2713,15 @@ "feature": "skills-catalog", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/skills_hub.py:1260-1280 `skills snapshot export` writes only hub identifiers and taps to JSON; hermes_cli/subcommands/profile.py:115 profile export carries all skills; hermes_cli/subcommands/skills.py:148 publish to GitHub/ClawHub; skills are plain SKILL.md folders on disk Note: No single-skill export action; a skill is exported by copying its folder, publishing it, or exporting the whole profile.", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:494 /workspaces/current/skills//export returns the skill package; single files downloadable (web/i18n/en-US/skill.json detail.downloadFile)" + } }, { "id": "sk-install-source", @@ -2573,11 +2742,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38289 \"Skills Hub browser rehaul: Browsing and installing skills from the trusted taps (OpenAI, Anthropic, HuggingFace, NVIDIA) is now a real...\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:54-58 install takes a registry identifier or a direct HTTP(S) URL to a SKILL.md; :165-171 taps add any GitHub repo as a source; tools/skills_hub_sources.py", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 the only import path is a multipart zip upload; searched 'url|source address|remote' in the skill import payload and skill.json: no install from an outside address" } }, { @@ -2597,11 +2767,15 @@ "feature": "agent-evals", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'eval|with and without|baseline' in tools/skill*.py, hermes_cli/subcommands/skills.py and optional-skills/*/SKILL.md: no skill test-case runner; tools/skillevaluator_scan.py:1-7 is an advisory security scan on install; evals/ holds developer regression harnesses (evals/compaction, evals/tool_search ...) with no user surface", + "dify": "source read at 1.17.1, not driven: searched 'evaluation|eval_set|test case' in api/controllers and web/i18n/en-US: only tracing-provider blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix 'evaluation') and dataset hit testing; no run of a skill against cases with and without it" + } }, { "id": "mo-providers", @@ -2623,12 +2797,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "yes", + "dify": "partial", "n8n": "yes", "open-webui": "partial", "evidence": { - "hermes-agent": "docs-only: competitor_features#31140 \"LLM provider abstraction: ProviderTransport ABC: Nous/Anthropic/Bedrock/OpenRouter/local vLLM, switch with no code change\"", - "dify": "docs-only: competitor_features#30989 \"Model provider hub: Dozens of LLM providers incl. local.\"", + "hermes-agent": "source read at v2026.9.24, not driven: plugins/model-providers/ ships anthropic, azure-foundry, bedrock, gemini, vertex, deepseek, openrouter, xai, nvidia, huggingface and 30 more provider plugins; hermes_cli/subcommands/model.py `hermes model`; web/src/pages/ModelsPage.tsx and ProfilesPage.tsx:673 model picker Note: Mistral via OpenRouter or a custom endpoint; no dedicated Mistral plugin directory.", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/model_providers.py:148,200 provider list and credentials; web/i18n/en-US/common.json:378-379 'Please install a model provider first ... from the Marketplace': core ships no provider, OpenAI, Anthropic, Mistral etc. are official plugins (langgenius/dify-official-plugins models/openai, anthropic, mistralai, ...) Note: every provider is a marketplace plugin run by the plugin daemon; old yes rested on a feature line", "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"", "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"" } @@ -2652,13 +2826,13 @@ "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "yes", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31885 \"Local model backend: Runs against local LLM ExApp / Ollama-compatible backends\"", - "hermes-agent": "docs-only: competitor_features#31140 \"LLM provider abstraction: ProviderTransport ABC: Nous/Anthropic/Bedrock/OpenRouter/local vLLM, switch with no code change\"", - "dify": "docs-only: competitor_features#30989 \"Model provider hub: Dozens of LLM providers incl. local.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 Ollama native /api/tags probe and LM Studio /api/v1/models with load-on-demand; hermes_cli/web_routers/local_models.py dashboard routes", + "dify": "source read at 1.17.1, not driven: no local runtime in core (web/i18n/en-US/common.json:378 install a provider first); official plugins models/ollama, localai, xinference, openllm, triton_inference_server, huggingface_tei in langgenius/dify-official-plugins Note: marketplace plugin only", "open-webui": "docs-only: competitor_features#31810 \"Local model support via Ollama: Native Ollama integration for fully local inference\"" } }, @@ -2682,13 +2856,14 @@ "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31390 \"AppAPI ExApp + Task Processing backend: Python ExApp requiring AppAPI >=3.1 and a tool-calling text2text provider (llm2 or integration_openai).\"", - "hermes-agent": "docs-only: competitor_features#38366 \"OpenAI-compatible local proxy for OAuth providers: Run hermes proxy and you get a http://localhost:port endpoint that speaks the OpenAI API but is backed by whichever OAuth provider you're signed into.\"", - "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/model_setup_flows_custom.py:1-3 custom OpenAI-compatible endpoint wizard (custom_providers / providers.); plugins/model-providers/custom", + "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"", + "dify": "source read at 1.17.1, not driven: official plugin langgenius/dify-official-plugins models/openai_api_compatible adds any OpenAI-compatible endpoint; core only provides the provider framework (api/controllers/console/workspace/model_providers.py:148) Note: marketplace plugin only" } }, { @@ -2709,13 +2884,15 @@ "feature": "taskprocessing-consume-ui", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31880 \"Unified AI Task Processing GUI: Frontend for the Nextcloud Task Processing API\"" + "nextcloud-assistant": "docs-only: competitor_features#31880 \"Unified AI Task Processing GUI: Frontend for the Nextcloud Task Processing API\"", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud|taskprocessing' repo-wide (excluding website/): none outside one test; no provider plugin for Nextcloud's AI task processing in plugins/model-providers/", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|taskprocessing' in api/ and web/: no hits; models come only from Dify provider plugins" } }, { @@ -2736,13 +2913,15 @@ "feature": "taskprocessing-provide-text2text", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"" + "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions and /v1/responses serve the agent to any OpenAI client (per profile under /p//); searched 'nextcloud|taskprocessing' repo-wide: no Nextcloud provider registration Note: Another system can use Hermes as an OpenAI-compatible text model; there is no Nextcloud text-generation provider.", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|text2text provider' in api/ and web/: nothing registers Dify apps as a provider for another platform's AI task framework; apps are reachable only through Dify's own service API (api/controllers/service_api/app/completion.py) and MCP (api/controllers/mcp/mcp.py:44)" } }, { @@ -2768,8 +2947,8 @@ "n8n": "yes", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38308 \"Fuzzy model picker, everywhere: The model picker now does fuzzy search across the desktop app, web dashboard, TUI, and CLI.\"", - "dify": "docs-only: competitor_features#30989 \"Model provider hub: Dozens of LLM providers incl. local.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/profiles.py:942 PUT /api/profiles/{name}/model per profile (web/src/pages/ProfilesPage.tsx:673); hermes_cli/config_defaults.py:1332-1338 delegation block sets a separate subagent model; hermes_cli/commands.py:157 /model per session; cron jobs carry their own model (hermes_cli/subcommands/cron.py:23 create)", + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 each agent picks its own provider and model; each workflow LLM/Agent node and each classic app carries its own model config (api/controllers/console/app/model_config.py)", "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"" } }, @@ -2790,11 +2969,15 @@ "feature": "tenant-model-policy", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'allowed_models|model_allowlist|blocked_models' in *.py: only tools/mcp_tool_sampling.py:181 limits which models an MCP server's sampling requests may use; no organisation or tenant model in hermes_cli/profiles.py:538 ProfileInfo Note: No tenants and no model allowlist per group of agents.", + "dify": "source read at 1.17.1, not driven: providers and credentials are per workspace (api/controllers/console/workspace/model_providers.py:148,200); api/controllers/console/workspace/models.py:519-545 enable/disable individual models for the workspace so its apps cannot pick them Note: per workspace; per-role model rights (permission-keys.json plugin.model_config) need enterprise RBAC" + } }, { "id": "mo-per-feature", @@ -2814,11 +2997,15 @@ "feature": "a-provider-and-a-place-per-ai-feature", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:715-790 auxiliary. provider/model per feature: vision, compression, approval, title_generation, curator, kanban_decomposer, profile_describer, goal_judge, background_review, monitor, moa_aggregator and more", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/models.py:205 default-model per model type (system reasoning, embedding, rerank, speech2text, tts) and :633 models by type; every app, node, knowledge base and generator picks its own model, so summaries and triage can run on different providers" + } }, { "id": "mo-failover", @@ -2840,11 +3027,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31144 \"Credential pools + OAuth PKCE: Multiple credentials per provider with rotation/failover\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:24 fallback_providers chain; hermes_cli/subcommands/fallback.py:10-24 `hermes fallback add|list|remove|clear`; hermes_cli/fallback_config.py:1 effective chain; agent/fallback_cooldown.py cools a failing provider", + "dify": "source read at 1.17.1, not driven: api/core/model_manager.py:440-477,1003-1066 load balancing rotates credentials of the same model and cools down one on rate-limit or connection errors; off by default (api/configs/feature/__init__.py:813 MODEL_LB_ENABLED=False). A second provider only by wiring a fail branch to another LLM node (web/i18n/en-US/workflow.json nodes.common.errorHandle.failBranch) Note: same-model credential failover, not provider fallback" } }, { @@ -2865,11 +3053,15 @@ "feature": "tenant-model-policy", "featureConfidence": "low", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'sensitiv|classification|pii.*route|route.*pii' in agent/ and hermes_cli/: no data-class routing; hermes_cli/model_data_policy_guard.py:1-6 only warns at model selection when a tier trains on prompts; agent/redact.py redacts secrets from logs and output Note: No rule that keeps sensitive data away from particular models.", + "dify": "source read at 1.17.1, not driven: searched 'sensitiv|classification|pii|route.*model' in api/core/model_manager.py, api/core/moderation and dify-agent/src: no routing of data by sensitivity; only content moderation (api/core/moderation) that blocks or replaces text" + } }, { "id": "mo-cli-runner", @@ -2889,11 +3081,15 @@ "feature": "governed-cli-mcp-transport", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: plugin-catalog/claude-subscription-directsdk.yaml:1-5 official NousResearch catalog plugin runs Hermes turns through the logged-in claude CLI (Agent SDK path); skills/autonomous-ai-agents/claude-code/SKILL.md:1-3 bundled skill delegates coding to the Claude Code CLI; tools/environments/docker.py can host the terminal Note: The turn runner is a catalog plugin, not core, and nothing places the claude CLI in its own container by design.", + "dify": "source read at 1.17.1, not driven: searched 'claude code|claude cli|anthropic cli' in api/, dify-agent/src and dify-agent-runtime: model turns go through provider plugins (dify-agent/src/dify_agent/layers/dify_plugin/llm_layer.py); no runner that drives the claude command line tool" + } }, { "id": "mo-key-broker", @@ -2914,12 +3110,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38241 \"Plug your password manager into Hermes - Bitwarden & 1Password secret sources: A new pluggable SecretSource interface lets Hermes fetch secrets from Bitwarden and 1Password (op:// references) at load time.\"", - "dify": "docs-only: competitor_features#38714 \"Cleared stale provider credentials during plugin uninstall: to reduce residual credential risk.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/secrets.py:8-20 `hermes secrets bitwarden|onepassword` pull provider keys from Bitwarden Secrets Manager or 1Password (agent/secret_sources/bitwarden.py:1-5, onepassword.py) so they need not sit in .env; agent/credential_pool.py:1 shared credential pool per provider; agent/secret_scope.py:1-10 profile-scoped key resolution in the multiplexed gateway", + "dify": "source read at 1.17.1, not driven: model keys live once per workspace provider, encrypted, with named credentials and switching (api/controllers/console/workspace/model_providers.py:200,291; models.py:342,495); agents and apps reference the provider, never hold the key; api/models/credential_permission.py:1-35 limits which members may use a credential Note: per-member credential access needs enterprise RBAC (permission-keys.json credential.use)", "n8n": "docs-only: competitor_features#3040 \"Credential Management: Encrypted credential storage for all integrations\"" } }, @@ -2940,11 +3136,15 @@ "feature": "agent-credentials", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 routes a sender user_id to a profile, and each profile has its own .env/auth.json keys (agent/secret_scope.py:1-10); searched 'per.?user.{0,20}(key|credential)|byok' in *.py: only tool-provider BYOK rows (hermes_cli/tools_config_providers.py:760) Note: A person gets their own key only by being routed to their own profile; no per-user key field.", + "dify": "source read at 1.17.1, not driven: searched 'personal credential|per.?user credential|end.?user.*credential' in api/core/tools, api/services/tools and web/i18n/en-US: credentials are workspace-level (api/controllers/console/workspace/model_providers.py:200) and runs use the app's configured credential; api/models/credential_permission.py only restricts who may use a shared credential" + } }, { "id": "mo-eu", @@ -2971,9 +3171,9 @@ "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31886 \"On-premises / sovereign deployment: Fully self-hosted inside the customer's Nextcloud\"", - "hermes-agent": "docs-only: competitor_features#31139 \"Six execution backends: Local/SSH/Docker/Daytona/Singularity/Modal; 8 parallel workers\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 Ollama and LM Studio local servers; plugins/model-providers/custom any self-hosted OpenAI-compatible endpoint; tools/transcription_local.py and tools/tts_tool.py local Piper/NeuTTS keep voice on premise; Dockerfile self-hosting", "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", - "dify": "docs-only: competitor_features#30991 \"Self-hosting (Docker): Self-host community edition via Docker.\"", + "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml self-hosts the whole stack (api, worker, web, plugin daemon, sandbox, agent runtime, vector store); with a local model plugin (langgenius/dify-official-plugins models/ollama, localai, xinference) processing stays on premise Note: local model serving itself is a marketplace plugin", "n8n": "docs-only: competitor_features#31099 \"Self-hosting via Docker: Run community edition on own infra with Docker.\"", "open-webui": "docs-only: competitor_features#31819 \"Offline / air-gapped deployment: Runs fully self-hosted with no external calls required\"" } @@ -2995,13 +3195,15 @@ "feature": "talk-delivery", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31374 \"Talk tool: List conversations, send messages, create public conversations from the agent.\"" + "nextcloud-assistant": "docs-only: competitor_features#31374 \"Talk tool: List conversations, send messages, create public conversations from the agent.\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 delivers job output to origin, home or explicit chat targets on connected platforms (telegram, discord, slack, matrix, mattermost, teams and more under plugins/platforms/); web/src/i18n/en.ts cron.deliverTo; searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter Note: Delivery into a team chat room works; Nextcloud Talk is not a target.", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; no official plugin for Nextcloud Talk in langgenius/dify-official-plugins tools/ (only slack, teams, discord, dingtalk, wecom, telegraph)" } }, { @@ -3021,11 +3223,15 @@ "feature": "talk-chat-bridge", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: gateway/run_inbound.py handles group-room messages and replies in the same room on every platform adapter; gateway/platforms/access_policy_mixin.py:6-68 group allowlists per chat; searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter Note: Chat-room bridging exists for other chat systems, not for Nextcloud Talk.", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; chat-app bridges exist only as plugin endpoints for other messengers (api/controllers/console/workspace/endpoint.py), none for Nextcloud Talk" + } }, { "id": "dl-talk-grouping", @@ -3045,11 +3251,15 @@ "feature": "talk-room-grouping", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter; hermes_cli/commands.py:76 /branch opens a new thread on Discord/Telegram/Slack/Matrix, which separates sessions but does not group agent rooms apart from human rooms", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed|room' in api/ and web/: no Talk integration, so no agent-room grouping" + } }, { "id": "dl-webhook-out", @@ -3068,13 +3278,15 @@ "feature": "delivery-channels", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38765 \"New event system with webhooks: Open WebUI now emits events for a wide range of system activity - sign-ins, configuration changes, startup, and actions across chats, knowledge, files, and more. Administrators can send these as outbound webhooks.\"" + "open-webui": "docs-only: competitor_features#38765 \"New event system with webhooks: Open WebUI now emits events for a wide range of system activity - sign-ins, configuration changes, startup, and actions across chats, knowledge, files, and more. Administrators can send these as outbound webhooks.\"", + "hermes-agent": "source read at v2026.9.24, not driven: agent/outbound_webhooks.py:1-7 hooks.outbound entries POST lifecycle events (hermes_cli/plugins.py:108-118 post_llm_call, post_tool_call, on_stream_end ...) HMAC-SHA256 signed via X-Hermes-Signature-256; cron/scheduler_delivery.py:32 'webhook' is a cron delivery target", + "dify": "source read at 1.17.1, not driven: a workflow HTTP Request node posts an agent's output to any URL with API-Key, Basic, Bearer or custom header auth (web/i18n/en-US/workflow.json:510-518 nodes.http.authorization.*); searched 'hmac|signature|sign' in workflow.json and the http node: no payload signing Note: outbound webhook yes, signed no" } }, { @@ -3095,14 +3307,15 @@ "feature": "delivery-channels", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31375 \"Mail tool: Send emails, manage mail accounts and folders.\"", - "dify": "docs-only: competitor_features#38710 \"Hardened HITL email delivery: From v1.13.1 (2026-03-17)\"" + "dify": "source read at 1.17.1, not driven: core sends mail only for Human Input requests (api/tasks/mail_human_input_delivery_task.py; web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*) and account/comment mails (api/tasks/mail_*.py); sending an agent's output as an email needs the official email/gmail/outlook tool plugins Note: marketplace plugin for general delivery", + "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:32 'email' delivery target; plugins/platforms/email/plugin.yaml:5-8 IMAP/SMTP email adapter; web/src/i18n/en.ts cron.delivery.email on CronPage" } }, { @@ -3122,14 +3335,15 @@ "feature": "delivery-channels", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "yes", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { - "hermes-agent": "docs-only: competitor_features#38351 \"ntfy as the 23rd messaging platform - push notifications without an account: ntfy is the self-hostable push-notification service with no signup, no API key, just a topic URL. Hermes now adapts to it as a platform plugin.\"", - "open-webui": "docs-only: competitor_features#38867 \"Calendar reminders and alerts: Calendar events now support reminder options from no alert up to one hour before start time, with upcoming alerts delivered through in-app toasts, browser notifications, and optional webhooks while avoiding duplicate sends.\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/terminal_notify.py:1-5 OS notifications via OSC 9/777 from the CLI; apps/desktop/electron/notification-ipc.ts:53 native desktop notifications; cron/scheduler_delivery.py:43-47 run results and approval prompts land in the home channel on Telegram, Discord, Slack, Signal; searched 'nextcloud' repo-wide: none Note: Notifies through desktop and messaging channels, not Nextcloud notifications. Old yes rested on a docs line about notifications in general.", + "open-webui": "docs-only: competitor_features#38867 \"Calendar reminders and alerts: Calendar events now support reminder options from no alert up to one hour before start time, with upcoming alerts delivered through in-app toasts, browser notifications, and optional webhooks while avoiding duplicate sends.\"", + "dify": "source read at 1.17.1, not driven: when a run needs a person, the Human Input node emails workspace members or externals (api/tasks/mail_human_input_delivery_task.py; workflow.json humanInput.deliveryMethod.emailConfigure.allMembers); api/controllers/console/notification.py:43 is only product announcements. Searched 'run finished|run completed|notify' in api/tasks and web/i18n/en-US: no notice when a run finishes Note: email when input is needed, nothing on completion, no in-app notification" } }, { @@ -3149,11 +3363,15 @@ "feature": "talk-delivery", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:148 /sethome sets this chat as the home channel; cron/scheduler_delivery.py:43-47 _HOME_CHANNEL resolves the default target; web/src/i18n/en.ts cron.deliverTo with 'set a home channel first'", + "dify": "source read at 1.17.1, not driven: searched 'delivery target|default delivery|preferred channel' in api/ and web/i18n/en-US: delivery is wired per workflow node (HTTP, tool plugins, Human Input delivery methods); no per-person default delivery setting" + } }, { "id": "dl-messengers", @@ -3175,12 +3393,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "partial", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31137 \"Multi-platform gateway: Single daemon routes 22+ platforms (Telegram/Slack/Signal/Email/Matrix/Teams)\"", - "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"" + "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/ telegram, slack, teams, discord, whatsapp, matrix, mattermost, sms, line, feishu, dingtalk, wecom, google_chat and more; gateway/platforms/signal.py Signal adapter; hermes_cli/subcommands/gateway.py setup and web/src/pages/ChannelsPage.tsx", + "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/endpoint.py plugin endpoints host chat bots; official extensions slack_bot and wecom_bot, triggers slack_trigger and telegram_trigger (langgenius/dify-official-plugins extensions/, triggers/), community microsoft-teams (langgenius/dify-plugins); nothing for Signal found Note: marketplace plugin only" } }, { @@ -3201,13 +3420,15 @@ "feature": "agent-schedule", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38862 \"Scheduled chat automations: You can now schedule the AI to run tasks automatically on a recurring basis: daily digests, periodic reports, anything you'd otherwise need to remember to ask for.\"" + "open-webui": "docs-only: competitor_features#38862 \"Scheduled chat automations: You can now schedule the AI to run tasks automatically on a recurring basis: daily digests, periodic reports, anything you'd otherwise need to remember to ask for.\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 scheduled job output delivered to a chat target; web/src/i18n/en.ts cron.namePlaceholder 'e.g. Daily summary' with deliverTo; skills/productivity/google-workspace/SKILL.md:27 daily brief procedure; hermes_cli/web_routers/cron.py:393 blueprints for ready-made automations", + "dify": "source read at 1.17.1, not driven: a Schedule Trigger workflow (api/core/workflow/nodes/trigger_schedule/entities.py:10) can end in a chat-posting tool node, but the posting tools are marketplace plugins (official tools/slack/tools/send_message.yaml, teams send_channel_message.yaml) Note: schedule is core, the chat delivery is a plugin" } }, { @@ -3228,11 +3449,15 @@ "feature": "identical-reports-collapse-into-one", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 repeat failures with the same job and error signature resolve to one incident and repeat alerts are withheld for cron.failure_repeat_alert_hours; gateway/platforms/webhook_coalesce.py:1-8 debounces bursts of events on one entity into one run; searched 'repeat.?count|collapsed' in gateway/ and cron/: no 'N times' counter on delivered reports Note: Duplicates are suppressed or coalesced, but not collapsed into one report with a count.", + "dify": "source read at 1.17.1, not driven: searched 'dedup|collapse|identical|duplicate report' in api/core/workflow, api/services and web/i18n/en-US: no collapsing of repeated outputs into one with a count" + } }, { "id": "dl-dashboard-widget", @@ -3252,11 +3477,15 @@ "feature": "dashboard-org-widgets", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/productivity/live-dashboard/SKILL.md:1-3 optional skill builds self-updating dashboards; web/src/plugins/slots.ts:1-13 plugins can inject components into dashboard slots; searched 'nextcloud' repo-wide: none Note: No Nextcloud dashboard widget; agent output on a dashboard needs an optional skill or a dashboard plugin.", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|dashboard widget' in api/ and web/: no widget that shows agent output on another product's dashboard; the app Overview/Monitoring pages (web/i18n/en-US/app-overview.json, agent-v-2.json monitoring.*) show usage metrics, not output" + } }, { "id": "dl-transcribe", @@ -3279,13 +3508,14 @@ "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31382 \"Media transcription (STT): Speech-to-text transcription exposed as an agent tool.\"", - "hermes-agent": "docs-only: competitor_features#31138 \"Voice transcription: Voice-memo transcription across channels\"", - "open-webui": "docs-only: competitor_features#38876 \"STT preprocessing bypass option: Administrators can now enable AUDIOSTTSKIP_PREPROCESSING to send audio files directly to the speech-to-text backend.\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/transcription_tools.py with local (tools/transcription_local.py) and cloud (tools/transcription_cloud.py) speech-to-text; gateway/run_voice.py transcribes inbound voice messages on messaging platforms", + "open-webui": "docs-only: competitor_features#38876 \"STT preprocessing bypass option: Administrators can now enable AUDIOSTTSKIP_PREPROCESSING to send audio files directly to the speech-to-text backend.\"", + "dify": "source read at 1.17.1, not driven: api/core/tools/builtin_tool/providers/audio/tools/asr.py speech-to-text tool usable in workflows and agents; api/controllers/web/audio.py:62 audio-to-text for voice messages in chat Note: needs a speech2text model from a provider plugin" } }, { @@ -3305,13 +3535,15 @@ "feature": "case-assistant-surface", "featureConfidence": "low", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "yes", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"" + "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'embed.{0,20}(chat|widget)|chat.?widget|web.?chat' in plugin-catalog/, plugins/platforms/, gateway/platforms/, web/src: only the dashboard's own chat page; gateway/platforms/api_server.py:1178 cors_origins lets a site call the key-protected API but ships no embeddable widget or anonymous access", + "dify": "source read at 1.17.1, not driven: web/public/embed.js floating chat bubble script and iframe embed chosen in web/i18n/en-US/app-overview.json:50-52 'Choose the way to embed chat app to your website', with pre-filled hidden inputs; agents have 'Embed Into Site' on their Access page (agent-v-2.json access.webApp.actions.embedIntoSite)" } }, { @@ -3337,9 +3569,9 @@ "n8n": "yes", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38240 \"Smart approvals are now the default: When Hermes wants to run a flagged command, an LLM reviewer now assesses it independently instead of asking you to approve every single one.\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1-12 dangerous-command and tool approval gate with a human decision engine; hermes_cli/commands.py:96-99 /approve and /deny in chat and gateway; hermes_cli/commands.py:187 /approvals mode; gateway/platforms/base_exec_approval.py approval prompts on messaging platforms", "copilot-studio": "docs-only: competitor_features#31608 \"Human-in-the-loop approvals: Approval steps via Power Automate before actions execute.\"", - "dify": "docs-only: competitor_features#38648 \"Service API for HITL: programmatic support for human-in-the-loop flows alongside existing console behavior.\"", + "dify": "source read at 1.17.1, not driven: Human Input workflow node pauses a run until a person picks one of the defined user actions, with delivery by web app or email and a timeout (web/i18n/en-US/workflow.json:583-636 nodes.humanInput.*; api/controllers/web/human_input_form.py:141); in Agent v2 an ask_human deferred tool lets the agent stop for a person (dify-agent/src/dify_agent/layers/ask_human/layer.py:1-12,63) Note: the gate is a node the builder places; no automatic hold on tool calls", "n8n": "docs-only: competitor_features#31103 \"Wait/approval nodes: Pause workflow for manual approval or timed wait.\"" } }, @@ -3360,11 +3592,15 @@ "feature": "human-approval-gate", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:662-670 permissions_list_open lists pending approvals across conversations seen by the MCP bridge, :672 permissions_respond; hermes_cli/commands.py:223 /memory pending and :217 /skills pending list staged writes Note: Approvals surface in the conversation that raised them; the only cross-conversation list is through the MCP bridge, with no inbox page.", + "dify": "source read at 1.17.1, not driven: human input forms are reached one by one by token link (api/controllers/web/human_input_form.py:141, console/human_input_form.py:70 /form/human_input/); searched 'inbox|pending forms|awaiting' in web/i18n/en-US and api/controllers: no list of everything awaiting me" + } }, { "id": "ov-approval-context", @@ -3384,11 +3620,15 @@ "feature": "human-approval-gate", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/base_exec_approval.py:1-16 every approval card states what Hermes wants to run, why it was flagged (EA_REASON_LABEL_TEXT) and that silence means it does not run; tools/approval.py:1106-1109 tool approvals carry the tool name and reason; tools/approval_smart.py:1-8 guardian LLM risk assessment of the command", + "dify": "source read at 1.17.1, not driven: the Human Input form shows builder-written Form Content with inserted run variables (web/i18n/en-US/workflow.json:609-612 nodes.humanInput.formContent.*), and in Agent v2 the agent writes the question and fields itself (dify-agent/src/dify_agent/layers/ask_human/schema.py AskHumanToolArgs); nothing derives what the action touches automatically Note: context is what the builder or the model chooses to show" + } }, { "id": "ov-risk-threshold", @@ -3409,11 +3649,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38240 \"Smart approvals are now the default: an LLM reviewer now assesses it independently instead of asking you to approve every single one - and each verdict covers only that exact command, so a later command matching the same pattern gets its own review.\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/approval_detection.py:1-4 only commands matching dangerous patterns reach the gate; hermes_cli/config_defaults.py:1656 approvals.mode 'smart' lets an auxiliary guardian (tools/approval_smart.py) approve low-risk commands and escalate risky ones, with smart_policy rules (:1663) and a deny list (:1670)", + "dify": "source read at 1.17.1, not driven: no risk scoring; a builder can route only some cases to a Human Input node with an IF/ELSE or classifier node, and the Agent v2 ask_human tool is called at the model's discretion (dify-agent/src/dify_agent/layers/ask_human/layer.py:56-78 prompt hint). Searched 'risk|threshold' in dify-agent/src and api/core/workflow: none Note: hand-built branching, no risk threshold setting" } }, { @@ -3433,11 +3674,15 @@ "feature": "talk-approval-reactions", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/matrix/adapter.py:2419-2442 a reaction on the approval prompt resolves it (_handle_approval_reaction); plugins/platforms/telegram/adapter.py:4256-4280 inline Approve Once / Always Approve buttons; searched 'nextcloud|spreed' repo-wide: none Note: Approve by reaction works in Matrix, by buttons elsewhere; not in Nextcloud Talk.", + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|reaction' in api/ and web/: no Talk integration; approvals are answered only through the form link (api/controllers/web/human_input_form.py:141)" + } }, { "id": "ov-draft-hold", @@ -3457,13 +3702,14 @@ "feature": "human-approval-gate", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#30996 \"Human-in-loop review: Annotation/review of agent outputs.\"" + "dify": "source read at 1.17.1, not driven: a workflow can put a Human Input node between the LLM/Agent node and the reply so a person reviews, edits input fields and picks an action before the answer is sent (web/i18n/en-US/workflow.json nodes.humanInput.formContent.*, user actions; api/tasks/mail_human_input_delivery_task.py email delivery to staff) Note: built per workflow; chat apps with webapp delivery show the form to the end user instead", + "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1095-1110 request_tool_approval lets a plugin pre_tool_call hook hold any tool call, including send_message, for a human; searched 'draft.{0,30}(approv|review|hold)|confirm.{0,20}before.{0,10}send' in *.py: no built-in hold on agent-written replies Note: Holding outgoing messages needs a plugin hook; nothing ships that queues drafts for review." } }, { @@ -3483,11 +3729,15 @@ "feature": "human-approval-gate", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: agent/estop.py:1-8 and :36-39 `hermes pause` at the root home halts cron dispatch, kanban dispatch and new gateway turns for every profile; hermes_cli/commands.py:94 /pause; agent/estop.py:1-4 in-flight work is never killed Note: Stops new work everywhere at once; running turns finish. No organisations, so the scope is the whole install.", + "dify": "source read at 1.17.1, not driven: searched 'kill switch|disable all|pause all|emergency stop' in api/controllers/console and web/i18n/en-US: no workspace-wide stop; each app's web app and API are toggled separately (api/controllers/console/agent/roster.py:1013)" + } }, { "id": "ov-kill-agent", @@ -3507,11 +3757,15 @@ "feature": "human-approval-gate", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands.py:425-437 /stop interrupts a running agent and force-cleans a hung session; hermes_cli/commands.py:92 /stop kills background processes; agent/estop.py:31-33 `hermes -p pause` holds one profile; hermes_cli/subcommands/gateway.py stops a profile's gateway", + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/completion.py:327 /agent//chat-messages//stop and workflow.py:1188 stop one running task; roster.py:1013 and web-app-access-card.tsx:254 switch the agent's surfaces off. No single control that stops all of one agent's running work at once Note: stop per run plus switch off per surface" + } }, { "id": "ov-guardrail-input", @@ -3530,13 +3784,14 @@ "feature": "agent-guardrails", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "yes", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31142 \"PII & secret redaction: Automatic scrubbing of PII, API keys, tokens; regex masking\"" + "hermes-agent": "source read at v2026.9.24, not driven: agent/redact.py:871 redact_sensitive_text and :1157 redact_terminal_output mask API keys and tokens in terminal/tool output; gateway/session.py:193-203 and :382-385 privacy.redact_pii hashes user and chat ids in the model-visible session context; agent/redact.py:66 vault values redacted; searched 'pii|personal data' in agent/ tools/ gateway/: no content-level PII filter Note: Secrets are masked and identifiers can be hashed; personal data inside messages or files reaches the model unfiltered.", + "dify": "source read at 1.17.1, not driven: api/core/moderation/input_moderation.py with keywords, openai_moderation and api providers (api/core/moderation/{keywords,openai_moderation,api}); api/core/moderation/base.py:10-20 DIRECT_OUTPUT blocks with a preset reply, OVERRIDDEN lets a custom API extension return rewritten inputs. No built-in PII or secret detector Note: blocking is built in; redaction only through a self-built API extension" } }, { @@ -3556,14 +3811,16 @@ "feature": "agent-guardrails", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "partial", - "dify": "unknown", + "dify": "yes", "n8n": "partial", "open-webui": "unknown", "evidence": { "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", - "n8n": "docs-only: competitor_features#38146 \"AWS Bedrock Chat Model Node: Default guardrail version to working draft when not set: From n8n@2.32.0 (2026-07-21)\"" + "n8n": "docs-only: competitor_features#38146 \"AWS Bedrock Chat Model Node: Default guardrail version to working draft when not set: From n8n@2.32.0 (2026-07-21)\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:108-111 transform_llm_output hook lets a plugin replace or block a final answer; plugins/security-guidance/README.md:1-10 bundled plugin flags dangerous code the agent writes (warns, still writes); gateway/response_filters.py:1-5 only suppresses intentional no-reply markers Note: No shipped content-rule check on answers; it takes a custom plugin hook.", + "dify": "source read at 1.17.1, not driven: api/core/moderation/output_moderation.py moderates the streamed answer; web/i18n/en-US/app-debug.json:93-104 feature.moderation 'Moderate OUTPUT Content' with preset replies, keyword list, OpenAI moderation or API" } }, { @@ -3583,11 +3840,15 @@ "feature": "agent-guardrails", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: tools/approval_detection.py:51 hardline commands blocked unconditionally, other dangerous patterns routed to approval; tools/tirith_security.py:1-4 pre-exec scan with allow/block/warn verdicts; tools/approval.py:1095-1104 plugins can escalate any tool to the human gate; hermes_cli/config_defaults.py:1656-1670 smart mode, smart_policy and deny globs", + "dify": "source read at 1.17.1, not driven: searched 'risk|dangerous|destructive|sensitive tool' in api/core/tools, dify-agent/src and web/i18n/en-US/tools.json: tools carry no risk class and no extra checks per class" + } }, { "id": "ov-egress", @@ -3606,13 +3867,15 @@ "feature": "governed-cli-mcp-transport", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "partial", "evidence": { - "open-webui": "docs-only: competitor_features#38798 \"Redirect-based SSRF protection: All outbound HTTP requests now block 3xx redirects by default via a new AIOHTTPCLIENTALLOW_REDIRECTS environment variable, preventing redirect-based SSRF where a public URL silently redirects to internal addresses.\"" + "open-webui": "docs-only: competitor_features#38798 \"Redirect-based SSRF protection: All outbound HTTP requests now block 3xx redirects by default via a new AIOHTTPCLIENTALLOW_REDIRECTS environment variable, preventing redirect-based SSRF where a public URL silently redirects to internal addresses.\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/website_policy.py:1-5 security.website_blocklist enforced on URL-capable tools; hermes_cli/proxy_cli.py:234-254 iron-proxy allowed_hosts plus default-deny CIDRs for sandboxed terminals (tools/environments/docker_egress.py:1-5); hermes_cli/subcommands/egress.py:10-15 `hermes egress` Note: The host allowlist applies to the Docker sandbox through iron-proxy (off by default); the web tools use a blocklist.", + "dify": "source read at 1.17.1, not driven: docker/ssrf_proxy/squid-agent.conf.template routes the agent sandbox through Squid, denying private networks but 'External internet is allowed' (http_access allow all); docker/ssrf_proxy/squid.conf.template does the same for HTTP nodes and tools. No per-agent allowlist of web addresses in the UI Note: blocks internal addresses, not a public-web allowlist; an admin can hand-edit the Squid config" } }, { @@ -3633,11 +3896,15 @@ "feature": "woo-llm-anonymisation", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'anonymi' in *.py outside tests: only tools/browser_use_cli.py:155 disabling a telemetry flag; plugin-catalog/ has no anonymiser entry; agent/redact.py masks secrets, not personal data in documents", + "dify": "source read at 1.17.1, not driven: searched 'anonymi|presidio|redact|pii' in api/core and web/i18n/en-US: only redaction of the agent backend request in logs (api/core/app/apps/agent_app/runtime_request_builder.py:34); no document anonymisation before the model reads it, and none in the official tool list (langgenius/dify-official-plugins tools/)" + } }, { "id": "ov-ai-oversight", @@ -3656,13 +3923,14 @@ "feature": "observability", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#30996 \"Human-in-loop review: Annotation/review of agent outputs.\"" + "dify": "source read at 1.17.1, not driven: per-app and per-agent log pages to review past conversations and runs (api/controllers/console/agent/roster.py:1133,1172; web/i18n/en-US/app-log.json), with admin like/dislike and annotations (app-log.json filter.annotation.*, api/controllers/console/app/annotation.py) Note: per app log review, no cross-agent oversight page", + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx browses every past session with tool messages (web/src/i18n/en.ts sessions.roles.tool) and an Automation filter for cron runs; hermes_cli/subcommands/approvals.py:13-23 `approvals suggest` mines past approval decisions; searched 'oversight|audit page' in web/src: none Note: After-the-fact review means reading transcripts; no oversight page that lists AI decisions for review." } }, { @@ -3682,11 +3950,15 @@ "feature": "human-approval-gate", "featureConfidence": "low", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'automation.?bias|rubber.?stamp|approv\\w* everything|approval fatigue' in *.py and *.ts outside tests: only a code comment in gateway/authz_mixin.py:474; hermes_cli/subcommands/approvals.py:22-23 `approvals suggest` goes the other way, proposing allowlist entries from repeated approvals", + "dify": "source read at 1.17.1, not driven: searched 'automation bias|rubber.?stamp|approval rate|approve all' in api/ and web/i18n/en-US: no tracking of how reviewers answer Human Input forms" + } }, { "id": "ov-tool-oversight", @@ -3706,14 +3978,15 @@ "feature": "agent-tool-governance", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "yes", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "partial", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38242 \"Watch your subagents work: delegatetask dispatches now return live transcript files you can tail -f the moment the subagents launch: every tool call, result, and streamed reply, one human-readable log per child.\"", - "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"" + "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 tool and skill usage breakdowns behind /insights (hermes_cli/commands.py:287) and web/src/i18n/en.ts models.toolCalls on AnalyticsPage; agent/tool_guardrails.py:1-6 flags tool-call loops within a turn; hermes_cli/config_defaults.py:1666 denial breaker after repeated guardian denials Note: Tool usage is counted and loops are caught; no review queue that flags misuse for a person. Old yes rested on a docs line.", + "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", + "dify": "source read at 1.17.1, not driven: tool calls are visible per message and per run in the logs (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38, workflow run detail via api/controllers/console/app/workflow_run.py) and a reviewer can mark answers with admin feedback or annotations (api/controllers/console/app/annotation.py); searched 'misuse|flag tool' in api/: no tool-level flagging Note: review yes, flagging misuse per tool no" } }, { @@ -3734,11 +4007,15 @@ "feature": "run-audit-log", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_state_messages.py / state.db keep every message and tool call per session; cron/executions.py:1-6 durable per-attempt execution ledger with immutable terminal states; agent/curator_backup.py:37 append-only curator ledger; searched 'tamper|hash.?chain|audit trail' in *.py: no tamper-evident log, and sessions are deletable (hermes_cli/web_routers/sessions.py:696) Note: Runs and tool calls are recorded but can be deleted or pruned; nothing prevents change afterwards.", + "dify": "source read at 1.17.1, not driven: every run, node execution and agent thought is stored (api/models/workflow.py node executions, message agent thoughts) but rows are deletable by retention jobs (api/services/retention/conversation/messages_clean_service.py:566); audit events are emitted as log lines for the Enterprise OTel exporter only (api/controllers/openapi/_audit.py:1-6; api/enterprise/telemetry/README.md 'only available in ENTERPRISE') Note: records exist, not tamper-proof; audit stream is enterprise-licensed" + } }, { "id": "co-audit-export", @@ -3763,8 +4040,8 @@ "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38247 \"Your sessions, your data - export everything: hermes sessions export now writes Markdown, Quarto, HTML, prompt-only, and even Hugging Face-ready trace formats, with the full filter surface (age, workspace, platform), an opt-in --redact secret-scrubbing pass.\"", - "dify": "docs-only: competitor_features#38708 \"Added a new export-app-messages CLI command: to export application messages and related feedback to JSONL.GZ (local or cloud storage).\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/sessions.py:69-95 `sessions export --format jsonl|trace --redact` over filtered sessions; hermes_cli/subcommands/cron.py:168 `cron runs` execution history Note: Exports are transcripts, not an audit report; no dashboard export across sessions.", + "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI to JSONL.GZ per app (no tool calls); api/controllers/console/workflow_run_archive.py:93-130 run archive download is Cloud paid-plan only; Enterprise OTel exporter (api/enterprise/telemetry/exporter.py) ships audit logs Note: CLI message export in community; fuller audit export is cloud or enterprise" } }, { @@ -3785,11 +4062,15 @@ "feature": "agent-lifecycle-governance", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:2231-2245 sessions.auto_prune with retention_days (default 90) deletes ended sessions on startup sweeps; hermes_cli/subcommands/sessions.py:105 `sessions prune` by age, source or title; :123 archive", + "dify": "source read at 1.17.1, not driven: api/configs/feature/__init__.py:1425 ENABLE_CLEAN_MESSAGES and :1623-1624 WORKFLOW_LOG_CLEANUP_ENABLED / WORKFLOW_LOG_RETENTION_DAYS; api/schedule/clean_messages.py:17-23 'Self-hosted editions delete all messages within the configured time range'; api/schedule/clean_workflow_runlogs_precise.py Note: instance-wide environment settings, off by default, no per-workspace or per-agent setting in the UI" + } }, { "id": "co-ai-register", @@ -3809,11 +4090,15 @@ "feature": "ai-feature-governance", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/inventory.py:1-2 is a provider/model inventory for pickers, not an AI-feature register", + "dify": "source read at 1.17.1, not driven: searched 'register|risk class|ai act|inventory' in api/models, api/services and web/i18n/en-US: no register of AI features with a risk class" + } }, { "id": "co-risk-class", @@ -3833,11 +4118,15 @@ "feature": "ai-feature-governance", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no risk-level field", + "dify": "source read at 1.17.1, not driven: searched 'risk|ai act|high.?risk|classification' in api/models/agent.py, api/models/model.py and web/i18n/en-US: agents and apps carry no risk level field" + } }, { "id": "co-dpo-ack", @@ -3857,11 +4146,15 @@ "feature": "ai-feature-governance", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; no sign-off or go-live gate on profiles, skills or plugins beyond tools/write_approval.py staged writes", + "dify": "source read at 1.17.1, not driven: searched 'dpo|data protection officer|sign.?off|go.?live approval' in api/ and web/i18n/en-US: publishing an agent needs only edit/publish permission (api/controllers/console/agent/roster.py:815), no sign-off step" + } }, { "id": "co-control-packs", @@ -3882,11 +4175,15 @@ "featureConfidence": "high", "defectCandidate": "ComplianceDashboard.vue and its only two API calls (dashboard, export) are dead code per an explicit comment in src/customComponents.js; the backend routes still exist and work if called directly.", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/subcommands/security.py and `skills audit` scan code and skills for security patterns, not against a control framework", + "dify": "source read at 1.17.1, not driven: searched 'iso 42001|42001|control framework|ai act' in api/ and web/i18n/en-US: nothing checks the organisation against a framework; web/i18n/en-US/common.json:124-125 only lists Dify's own vendor certificates (GDPR DPA, ISO 27001)" + } }, { "id": "co-factsheet", @@ -3905,11 +4202,15 @@ "feature": "compliance-control-packs", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profile_cmd.py:384-395 `profile show` prints model and provider, gateway state, skill count, SOUL.md presence and distribution; hermes_cli/profile_cmd.py:564-570 `profile info` prints description, author, licence, requirements, source of a distribution Note: A profile summary exists; it does not describe data used or purpose in fact-sheet form or export one.", + "dify": "source read at 1.17.1, not driven: searched 'fact ?sheet|model card|system card' in api/ and web/i18n/en-US: no generated fact sheet of an agent's model, data and purpose; the closest is DSL export of its configuration (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52)" + } }, { "id": "co-compliance-export", @@ -3930,11 +4231,15 @@ "featureConfidence": "high", "defectCandidate": "customComponents.js:100-106 itself flags this as a product decision still open: re-home the export onto compliance-operations or retire the route.", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; the nearest exports are session transcripts (hermes_cli/subcommands/sessions.py:69) and `hermes debug` reports (hermes_cli/commands.py:303), neither a compliance report", + "dify": "source read at 1.17.1, not driven: api/controllers/console/billing/compliance.py:28-49 and api/services/compliance_download_service.py only hand out Dify's own vendor documents (GDPR DPA, ISO 27001, web/i18n/en-US/common.json:124-127) to paid Cloud plans; no compliance report about the organisation's own agents Note: the 'compliance' download is the vendor's certificate, not the customer's report" + } }, { "id": "co-incident", @@ -3953,11 +4258,15 @@ "feature": "agent-lifecycle-governance", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 records operational cron failure incidents (job id, error signature, ack) with no impact or remediation fields; searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none Note: Operational failure incidents only; no AI-incident record.", + "dify": "source read at 1.17.1, not driven: searched 'incident|impact|postmortem' in api/models, api/services and web/i18n/en-US: no AI incident record" + } }, { "id": "co-authority-notify", @@ -3977,11 +4286,15 @@ "feature": "agent-lifecycle-governance", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; cron/incidents.py:1-10 alerts only the operator's home channel", + "dify": "source read at 1.17.1, not driven: searched 'authority|regulator|serious incident|notify' in api/services and web/i18n/en-US: no incident record and no authority notification" + } }, { "id": "co-access-review", @@ -4000,11 +4313,15 @@ "feature": "agent-lifecycle-governance", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'owner|attest|review.{0,20}(access|owner)|recertif' in hermes_cli/profiles.py and hermes_cli/profile_cmd.py: no owner field and no periodic review; hermes_cli/profiles.py:538-575 ProfileInfo", + "dify": "source read at 1.17.1, not driven: searched 'access review|attest|recertif|periodic review' in api/ and web/i18n/en-US: no periodic owner or need review of agents" + } }, { "id": "co-transparency", @@ -4024,11 +4341,15 @@ "feature": "ai-feature-governance", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'transparency|explain.{0,20}agent|public.{0,20}(page|description)' in web/src and hermes_cli/web_routers: none; profile descriptions (hermes_cli/web_routers/profiles.py:928) feed the kanban router and are not published to anyone", + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/site.py:49-57 each web app can show a description, privacy policy link and custom disclaimer to its users; no generated plain-language register or explanation of the agents employees deal with Note: per-app description and disclaimer only" + } }, { "id": "co-residency", @@ -4047,11 +4368,15 @@ "feature": "a-provider-and-a-place-per-ai-feature", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/status.py:157 `hermes status` prints the effective provider; hermes_cli/config_defaults.py:715-790 auxiliary..provider per feature in config; hermes_cli/model_data_policy_guard.py:1-6 warns when a tier trains on prompts; searched 'region|residency|data location' in hermes_cli/: no per-feature residency view Note: You can read which provider each feature uses from config and status, but not where that provider processes the data.", + "dify": "source read at 1.17.1, not driven: searched 'residency|region|data location|processing location' in api/ and web/i18n/en-US: providers show no processing location per feature" + } }, { "id": "co-disable-dept", @@ -4071,11 +4396,15 @@ "feature": "human-approval-gate", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'department|group|org' scoping in hermes_cli/profiles.py and gateway/authz_mixin.py: no organisational units; agent/estop.py:31-39 pauses a whole profile or install and gateway/authz_mixin.py:32-37 allowlists individual user ids, with no proof-of-off report Note: Cutting a set of users off is possible by editing allowlists, not by department, and nothing proves it.", + "dify": "source read at 1.17.1, not driven: searched 'department|group.*disable|ai off' in api/ and web/i18n/en-US: community has no departments; enterprise RBAC per-agent access policies (web/features/agent-v2/permissions.ts:37, api/configs/enterprise/__init__.py:38) grant access but there is no switch that turns AI off for a group with proof" + } }, { "id": "ob-runs", @@ -4094,16 +4423,17 @@ "feature": "run-analytics", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", - "dify": "docs-only: competitor_features#30993 \"Observability & annotations: Log inspection, LLM annotation, monitoring.\"", + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:121 run list with status filter, created time and elapsed time (web/app/components/app/workflow-log/list.tsx); api/controllers/console/agent/roster.py:1133 agent logs with created/updated time, message count and user rate (web/i18n/en-US/agent-v-2.json logs.table.*)", "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", - "open-webui": "docs-only: competitor_features#38862 \"Scheduled chat automations: Create and manage automations from the Automations page or directly in chat, with full run history\"" + "open-webui": "docs-only: competitor_features#38862 \"Scheduled chat automations: Create and manage automations from the Automations page or directly in chat, with full run history\"", + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx with web/src/i18n/en.ts sessions.filterAutomation 'Automation' lists cron and other runs with time; hermes_cli/web_routers/cron.py:243 GET /api/cron/jobs/{id}/runs; hermes_cli/subcommands/cron.py:168 `cron runs` durable attempts with status (cron/executions.py:1-6)" } }, { @@ -4125,12 +4455,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "partial", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38242 \"Watch your subagents work: delegatetask dispatches now return live transcript files you can tail -f the moment the subagents launch: every tool call, result, and streamed reply, one human-readable log per child.\"", - "dify": "docs-only: competitor_features#30993 \"Observability & annotations: Log inspection, LLM annotation, monitoring.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:596 GET /api/sessions/{id}/messages and :651 /timeline behind web/src/pages/SessionsPage.tsx with user, assistant and tool roles in order (web/src/i18n/en.ts sessions.roles); plugins/observability/langfuse traces each step; hermes_cli/subcommands/sessions.py:76 `--format trace` export for the Agent Trace Viewer", + "dify": "source read at 1.17.1, not driven: workflow run detail with a TRACING tab listing each node in order with inputs, outputs, status, time and tokens (web/i18n/en-US/run-log.json tracing, meta.*; web/app/components/workflow/run/node.tsx:89); chat messages show each agent thought and tool call (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38); agent logs per conversation (api/controllers/console/agent/roster.py:1172)", "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"" } }, @@ -4151,13 +4481,15 @@ "feature": "run-replay-and-dry-run", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "yes", "open-webui": "unknown", "evidence": { - "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"" + "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:68 /retry resends the last message, :71 /undo backs up N turns and re-prompts, :76 /branch forks a session; hermes_cli/subcommands/cron.py:157 re-runs a job; agent/replay_cleanup.py:1-5 only sanitises resumed history; searched 'replay' for a run re-execution feature: none Note: You can re-run from a point in a live session, but not replay a stored past run to reproduce it.", + "dify": "source read at 1.17.1, not driven: in the draft canvas a node can be re-run with its Last Run values from the variable inspector (web/i18n/en-US/workflow.json:272 debug.lastRunTab; api/controllers/console/app/workflow_draft_variable.py); searched 'replay|rerun|run again' in web/i18n/en-US and api/controllers/console/app: no replay of a logged production run (only a Re-run in RAG pipelines, pipeline.json:12) Note: node re-run in the editor, not replay of a past run" } }, { @@ -4177,13 +4509,15 @@ "feature": "run-replay-and-dry-run", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "partial", "open-webui": "unknown", "evidence": { - "n8n": "docs-only: competitor_features#3919 \"core: Fix IDOR in test-runs endpoint by consolidating access checks: From n8n@2.14.0 (2026-03-24)\"" + "n8n": "docs-only: competitor_features#3919 \"core: Fix IDOR in test-runs endpoint by consolidating access checks: From n8n@2.14.0 (2026-03-24)\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:132 /plan writes a plan without executing anything; hermes_cli/commands.py:213 /tools disable to remove write-capable tools for a run; hermes_cli/commands.py:83 /rollback restores filesystem checkpoints (tools/checkpoint_manager.py); searched 'dry.?run' in hermes_cli/commands.py: only /worktree prune and /compress previews Note: No mode that runs an agent end to end while blocking every side effect.", + "dify": "source read at 1.17.1, not driven: searched 'dry.?run|mock|simulat' in web/i18n/en-US/workflow.json, agent-v-2.json and api/core/workflow: draft debug runs and Agent v2 Build mode execute tools and the sandbox for real (agent-v-2.json build.empty.communityEditionTip 'changes made to the file system happen in real time'); only webhook triggers can be simulated (workflow.json:291) Note: test runs are separate from the published version but still act" } }, { @@ -4204,15 +4538,16 @@ "feature": "run-analytics", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "yes", "dify": "partial", "n8n": "unknown", "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", - "dify": "docs-only: competitor_features#30993 \"Observability & annotations: Log inspection, LLM annotation, monitoring.\"", - "open-webui": "docs-only: competitor_features#31821 \"Usage tracking & model access control: Per-user model permissions and usage visibility\"" + "dify": "source read at 1.17.1, not driven: per app/agent charts for conversations, end users, token costs, session interactions, satisfaction rate, response time and tokens per second (api/controllers/console/app/statistic.py:151-340; workflow_statistic.py:97-184; agent-v-2.json monitoring.metrics.*). No dashboard across agents and no success-rate or tool-use chart Note: per app, no cross-agent view, no tool use", + "open-webui": "docs-only: competitor_features#31821 \"Usage tracking & model access control: Per-user model permissions and usage visibility\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/analytics.py:143 /api/analytics/usage and :305 /api/analytics/models behind web/src/pages/AnalyticsPage.tsx: tokens per day, sessions, API calls, estimated cost, tool calls, top skills (web/src/i18n/en.ts analytics, models); agent/insights.py:1-2 /insights Note: Cost, volume and tool use are charted; success rate and speed are not, and there is no per-agent breakdown across profiles on one dashboard." } }, { @@ -4233,13 +4568,15 @@ "feature": "run-analytics", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "partial", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"" + "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_state_usage.py:29-56 per-session estimated_cost_usd and actual_cost_usd with token counts; hermes_cli/commands.py:138 /status and :280 /usage show session tokens; gateway/runtime_footer.py:1-6 optional per-reply footer (model, context %, latency) Note: Tokens and cost are kept per session (run), not per step.", + "dify": "source read at 1.17.1, not driven: web/app/components/workflow/run/meta.tsx:91-97 total tokens per run and web/app/components/workflow/run/node.tsx:89 tokens per node; money cost appears only in aggregate token-cost charts (api/controllers/console/app/statistic.py:232, web/app/components/app/overview/app-chart.tsx) Note: tokens per run and step, cost only in totals" } }, { @@ -4259,11 +4596,15 @@ "feature": "cost-guardrails", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-63 agent.max_turns hard cap with budget_warning_ratio one-time warning and run_budget_seconds wall-clock budget with an 80% notice; hermes_state_maintenance.py:71 max_cost is only a session filter; searched 'max_cost|spend_limit|budget_usd|cost_cap' in *.py: no money budget Note: Warning plus hard stop exist for turns and time, not for spend.", + "dify": "source read at 1.17.1, not driven: searched 'budget|spend limit|spending|hard stop' in web/i18n/en-US and api/services: none for self-hosted; hosted-credit quotas (api/services/credit_pool_service.py, quota_service.py) apply to Dify Cloud's own trial credits, not a user-set budget with warning and stop" + } }, { "id": "ob-estimate", @@ -4282,13 +4623,14 @@ "feature": "cost-guardrails", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "yes", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38245 \"New providers and the newest frontier models: Fireworks AI and DeepInfra land as first-class providers (Fireworks with cost estimation and a #2 slot in the provider picker).\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/model_cost_guard.py:1-26 warns before selecting a model priced above the input/output cost thresholds; hermes_cli/subcommands/prompt_size.py:13 `hermes prompt-size` byte breakdown of system prompt and tool schemas; hermes_cli/commands.py:143 /context usage gauge; searched 'estimate.{0,20}cost|forecast' for a pre-run cost estimate: none Note: Warns about expensive models and shows prompt size; no cost forecast for a run before it starts. Old yes rested on a docs line.", + "dify": "source read at 1.17.1, not driven: searched 'estimate|expected cost|cost preview' in api/controllers/console/app and web/i18n/en-US: the only estimate is document indexing cost for knowledge bases (api/controllers/console/datasets/datasets_document.py:706 indexing-estimate), none for an agent or workflow run" } }, { @@ -4309,11 +4651,15 @@ "feature": "agent-schedule", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_failure_copy.py:1-6 plain-language failure notice delivered to the job's chat with the exact fix command; cron/incidents.py:1-10 alert state with repeat throttling; agent/monitoring/cron_health.py cron health events", + "dify": "source read at 1.17.1, not driven: searched 'alert|on failure notify|failed run email' in api/tasks, api/schedule and web/i18n/en-US: failures show only in logs and the editor toast (web/i18n/en-US/workflow.json:242 common.scheduleTriggerRunFailed); api/schedule/queue_monitor_task.py alerts admins about Celery queue length, not run failures Note: alerting only by wiring an external tracer or OTel collector" + } }, { "id": "ob-drift", @@ -4332,11 +4678,15 @@ "feature": "observability", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'drift' in agent/ cron/ gateway/ hermes_cli/ excluding clock, schema, config and terminal drift: only prompt-cache and table-padding comments; cron/monitor.py:1-8 detects changes in a monitored source, not drift in agent results", + "dify": "source read at 1.17.1, not driven: searched 'drift|regression|quality trend|anomal' in api/ and web/i18n/en-US: no drift detection; satisfaction rate chart (api/controllers/console/app/statistic.py:286) is the nearest signal" + } }, { "id": "ob-metrics", @@ -4356,13 +4706,15 @@ "feature": "observability", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "partial", "open-webui": "unknown", "evidence": { - "n8n": "docs-only: competitor_features#6928 \"core: Fix /healthz endpoint when using N8N_PATH: From n8n@2.15.0 (2026-03-30)\"" + "n8n": "docs-only: competitor_features#6928 \"core: Fix /healthz endpoint when using N8N_PATH: From n8n@2.15.0 (2026-03-30)\"", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1591-1592 GET /health and /health/detailed; hermes_cli/web_routers/status.py:115 /api/health and :555 /api/system/stats; agent/monitoring/otlp_exporter.py:1-6 exports health and diagnostic events to an OpenTelemetry collector; hermes_cli/subcommands/monitoring.py:19 Note: Metrics are pushed over OTLP; the pull endpoints are health checks, not a Prometheus scrape.", + "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads and /db-pool-stat endpoints; api/configs/observability/otel/otel_config.py:10-25 ENABLE_OTEL exports traces and metrics over OTLP to a monitoring system; api/celery_healthcheck.py for workers Note: OTel metrics off by default" } }, { @@ -4383,13 +4735,14 @@ "feature": "observability", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#38661 \"Langfuse - optional time-to-first-token (TTFT) reporting.: From v1.14.0 (2026-04-29)\"" + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/ops_trace.py per-app tracing config; api/core/ops/ops_trace_manager.py sends traces to Langfuse, LangSmith, Opik, Weave, Arize, Phoenix, MLflow, Databricks, Aliyun, Tencent (web/i18n/en-US/app.json:221-267 tracing.*.title)", + "hermes-agent": "source read at v2026.9.24, not driven: plugins/observability/langfuse/plugin.yaml:1-3 bundled Langfuse plugin traces conversations, LLM calls and tool usage (opt-in); agent/monitoring/otlp_exporter.py:1-6 OTLP export" } }, { @@ -4410,13 +4763,15 @@ "feature": "observability", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "partial", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"" + "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", + "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 usage insights (tokens, cost, tool/skill use, activity, model/platform breakdowns) on demand via /insights (hermes_cli/commands.py:287) and `hermes insights`; searched 'weekly report|periodic report|digest.{0,20}usage' in cron/ and agent/: no scheduled usage report Note: Reports are on demand; a periodic one would be a hand-built cron job.", + "dify": "source read at 1.17.1, not driven: searched 'report|weekly|monthly digest|usage report' in api/schedule, api/tasks and web/i18n/en-US: no periodic usage report; usage is only on the live Overview/Monitoring charts (api/controllers/console/app/statistic.py)" } }, { @@ -4437,14 +4792,15 @@ "feature": "observability", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "unknown", "open-webui": "yes", "evidence": { - "dify": "docs-only: competitor_features#38708 \"Added a new export-app-messages CLI command: to export application messages and related feedback to JSONL.GZ (local or cloud storage).\"", - "open-webui": "docs-only: competitor_features#38806 \"Feedback user attribution spoofing: corrupting Elo leaderboard rankings and admin feedback exports.\"" + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/statistic.py:286 user-satisfaction-rate per app; agent Monitoring 'User Satisfaction Rate: Percentage of agent replies that users rated with a like' (web/i18n/en-US/agent-v-2.json monitoring.metrics.userSatisfactionRate); logs show user and operator rating per conversation (agent-v-2.json logs.table.userRate, operationRate)", + "open-webui": "docs-only: competitor_features#38806 \"Feedback user attribution spoofing: corrupting Elo leaderboard rankings and admin feedback exports.\"", + "hermes-agent": "source read at v2026.9.24, not driven: no answer rating exists to aggregate: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-8 only detects affection for the pet animation" } }, { @@ -4465,15 +4821,16 @@ "feature": "flow-canvas", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", - "dify": "docs-only: competitor_features#30986 \"Visual LLM app builder: No-code chatflow/workflow app studio.\"", - "n8n": "docs-only: competitor_features#31093 \"Visual node-based editor: Drag-and-drop canvas to wire nodes into workflows.\"" + "dify": "source read at 1.17.1, not driven: web/app/components/workflow canvas editor for Workflow and Chatflow apps with the node set in web/i18n/en-US/workflow.json:2-35 blocks.*; api/controllers/console/app/workflow.py draft sync and publish", + "n8n": "docs-only: competitor_features#31093 \"Visual node-based editor: Drag-and-drop canvas to wire nodes into workflows.\"", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'canvas|flow editor|node editor|reactflow' in web/src and apps/desktop/src: no visual flow builder; plugins/kanban/dashboard/manifest.json:1-10 the Kanban tab is a drag-drop task board, not a step canvas" } }, { @@ -4493,14 +4850,15 @@ "feature": "flow-canvas", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#30987 \"Agent nodes + tool-calling: Agents with tool/function invocation.\"", - "n8n": "docs-only: competitor_features#31097 \"AI Agent node (LangChain): Built-in AI agent nodes with tool-calling over LangChain.\"" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:2-3 blocks.agent and blocks.agent-v2; api/core/workflow/nodes/agent_v2/agent_node.py runs a roster or inline agent inside a flow; api/controllers/console/agent/composer.py:54 agent composer on a workflow node Note: the classic Agent node runs strategies from agent-strategy plugins", + "n8n": "docs-only: competitor_features#31097 \"AI Agent node (LangChain): Built-in AI agent nodes with tool-calling over LangChain.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:249-257 /kanban create, assign, link: tasks assigned to profiles (agents) and linked as dependencies; hermes_cli/kanban_parser.py:314-321 'dependency' blocks auto-promote when parents finish; hermes_cli/kanban_db_graph.py:1 task graph persistence; plugins/kanban/dashboard/manifest.json board tab Note: Multi-agent work is a dependency graph of kanban cards, not a flow with agent steps." } }, { @@ -4521,14 +4879,15 @@ "feature": "flow-canvas", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#38648 \"Service API for HITL: programmatic support for human-in-the-loop flows alongside existing console behavior.\"", - "n8n": "docs-only: competitor_features#31103 \"Wait/approval nodes: Pause workflow for manual approval or timed wait.\"" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:12 blocks.human-input and :583-636 nodes.humanInput.* (form, user actions, delivery by web app or email, timeout); api/tasks/human_input_timeout_tasks.py; api/controllers/web/human_input_form.py:141", + "n8n": "docs-only: competitor_features#31103 \"Wait/approval nodes: Pause workflow for manual approval or timed wait.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:314-321 `kanban block --kind needs_input` parks a card for a human and dependants wait until it is unblocked; hermes_cli/kanban_parser.py:216-218 --initial-status blocked for cards that need human ops; hermes_cli/kanban_pr_acceptance.py:1 PR acceptance gate Note: A human gate is a blocked card in the task graph, not an approval step with approve/deny." } }, { @@ -4550,11 +4909,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31141 \"Sub-agent delegation: Isolated parallel sub-agent contexts for concurrent workstreams\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 delegate_task spawns child agents with their own context and returns a summary, single or batch; tools/async_delegation.py:1-6 background delegation; hermes_cli/commands.py:249 kanban hands tasks to other profiles", + "dify": "source read at 1.17.1, not driven: an agent can call a published workflow as a tool (web/i18n/en-US/agent-v-2.json tools.toolTabs.workflow; api/controllers/console/workspace/tool_providers.py:904) and that workflow can hold another Agent node; searched 'sub.?agent|handoff|delegat' in dify-agent/src: no direct agent-to-agent handoff Note: indirect, through workflow-as-tool" } }, { @@ -4577,12 +4937,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38346 \"Kanban grew into a real multi-agent platform - 104 PRs end to end: hermes kanban swarm creates a full Swarm v1 graph in one command - root, parallel workers, gated verifier, gated synthesizer, shared blackboard.\"", - "n8n": "docs-only: competitor_features#3046 \"Branching Logic: Conditional routing with if/switch/merge nodes\"" + "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/autonomous-ai-agents/dynamic-workflow/SKILL.md:1-16 optional skill codifies orchestration as a re-runnable script where conditions are ordinary code; tools/code_execution_tool.py:1-5 scripts call tools with normal control flow; searched 'condition|branch node|if.?node' in hermes_cli/kanban*.py: no conditional routing in the task graph Note: Branching is code the agent writes, not a flow construct; the plan-in-code skill is optional, not bundled.", + "n8n": "docs-only: competitor_features#3046 \"Branching Logic: Conditional routing with if/switch/merge nodes\"", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:13 blocks.if-else and :26 blocks.question-classifier branch a flow on conditions or on an LLM classification; fail branches on node errors (nodes.common.errorHandle.failBranch)" } }, { @@ -4603,14 +4964,15 @@ "feature": "flow-canvas", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "partial", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#30993 \"Observability & annotations: Log inspection, LLM annotation, monitoring.\"", - "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:240,245,254 common.runHistory / showRunHistory / viewRunHistory in the canvas editor, opening each run's tracing on the canvas; published-run logs per app (api/controllers/console/app/workflow_app_log.py:121)", + "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:416-418 `kanban log` and `kanban runs` per task; hermes_cli/subcommands/cron.py:168 `cron runs`; plugins/kanban/dashboard/manifest.json:4 board shows which profile is running what Note: Run history per task or job; no flow canvas to show it on." } }, { @@ -4632,12 +4994,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38286 \"Automation Blueprints: Pick an automation by name and Hermes asks you for what it needs - no cron syntax, no slot=value typing. One blueprint definition renders natively on every surface.\"", - "dify": "docs-only: competitor_features#38614 \"App creation and onboarding - tracked app creation source and template ID: initialized user timezone and language from the browser, and fixed WebApp icon and description display.\"" + "hermes-agent": "source read at v2026.9.24, not driven: cron/blueprint_catalog.py:1-5 and :104-523 sixteen shipped automation blueprints rendered as a dashboard form (hermes_cli/web_routers/cron.py:393-424 GET /api/cron/blueprints, POST instantiate) and a /blueprint slash command (hermes_cli/commands.py:243) Note: Blueprints are ready-made scheduled automations, not multi-step flows.", + "dify": "source read at 1.17.1, not driven: api/constants/recommended_apps.json ships 22 templates (workflow, chatflow, agent-chat, e.g. 'Text Summarization Workflow', 'Email Assistant Workflow'); api/controllers/console/explore/recommended_app.py:96,126 serve them; web/app/(commonLayout)/templates/[[...category]] create from template Note: default source is remote tmpl.dify.ai (api/configs/feature/hosted_service/__init__.py:444), builtin as fallback mode" } }, { @@ -4658,11 +5020,15 @@ "feature": "agent-webhook-trigger", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: optional-mcps/n8n-official/manifest.yaml:1-12 Nous-approved catalog entry connects the agent to an n8n instance's official MCP server with OAuth, so the agent can call n8n workflows as tools; hermes_cli/subcommands/mcp.py:27 `hermes mcp add`", + "dify": "source read at 1.17.1, not driven: searched 'n8n' in api/, web/app and web/i18n: no hits, and none in langgenius/dify-official-plugins tools/ or langgenius/dify-plugins; only a hand-built HTTP Request node or custom OpenAPI tool could call an n8n webhook" + } }, { "id": "fl-code-step", @@ -4682,15 +5048,16 @@ "feature": "flow-authoring", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { - "dify": "docs-only: competitor_features#38721 \"Command + Upload File to Sandbox make runtime operations practical and controllable.: From 1.14.0-rc1: New Agent x Skills for Production Workflows (2026-02-14)\"", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:6 blocks.code, Python or JavaScript run in the dify-sandbox service (docker/docker-compose.yaml sandbox); nodes.code.syncFunctionSignature", "n8n": "docs-only: competitor_features#3038 \"Code Nodes: JavaScript and Python code execution within workflows\"", - "open-webui": "docs-only: competitor_features#31817 \"Pipelines / custom function plugins: Python function pipelines and filters extend the chat flow\"" + "open-webui": "docs-only: competitor_features#31817 \"Pipelines / custom function plugins: Python function pipelines and filters extend the chat flow\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/job_definition.py:15 script and no_agent (script-only jobs) and monitor_script fields; web/src/i18n/en.ts cron.scriptRequired 'Script-only jobs need a script path'; hermes_cli/subcommands/webhook.py:43-46 --script transform on a webhook route; tools/code_execution_tool.py code in a run Note: Custom code runs as a job, pre-run gate or webhook transform; there is no flow to put a code step in." } }, { @@ -4711,13 +5078,15 @@ "feature": "flow-canvas", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { - "n8n": "docs-only: competitor_features#3042 \"Sub-workflows: Compose complex flows from reusable sub-workflows\"" + "n8n": "docs-only: competitor_features#3042 \"Sub-workflows: Compose complex flows from reusable sub-workflows\"", + "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_prompt.py:95-97 context_from injects the latest output of other jobs into a job's prompt (job chaining); hermes_cli/kanban_decompose.py:1-6 fans a task out into a graph of child tasks; hermes_cli/subcommands/webhook.py:47-51 a route can fire an existing job Note: Jobs and task graphs can be chained; there is no named flow to embed in another.", + "dify": "source read at 1.17.1, not driven: Snippets are reusable node groups inserted into workflows (api/controllers/console/snippets/snippet_workflow.py; web/i18n/en-US/snippet.json); a published workflow can be used as a tool in other apps (web/i18n/en-US/workflow.json:257-258 common.workflowAsTool)" } }, { @@ -4738,11 +5107,15 @@ "feature": "flow-canvas", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:193 `cron doctor` checks scheduled jobs for common health issues; hermes_cli/kanban_diagnostics.py:1-8 actionable diagnostics on task graphs shown as dashboard buttons; cron/lifecycle_guard.py:1-7 rejects self-destructive job specs at creation Note: Checks exist for jobs and task graphs; no pre-run wiring check of a flow.", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:997-1000 panel.checklist 'Resolve the following issues before publishing', :207 needConnectTip for unconnected steps, per-node checks such as :361 nodes.agent.checkList.strategyNotSelected; agent composer validate endpoint api/controllers/console/agent/composer.py:167" + } }, { "id": "re-store", @@ -4761,11 +5134,15 @@ "feature": "agent-template-gallery", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:129-137 `hermes profile install ` installs a ready-made profile distribution (hermes_cli/profile_distribution.py:1-5); web/src/pages/ProfilesPage.tsx:1117-1122 shows distribution name and version; searched 'distribution' with 'catalog|registry|hub' in hermes_cli/profile_distribution.py: no browsable store Note: One-command install from a known repo URL; no store to browse.", + "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/explore and templates/[[...category]] browse ready-made apps including agents (api/constants/recommended_apps.json 'Investment Analysis Report Copilot', 'SVG Logo Design' in agent-chat mode); api/controllers/console/explore/recommended_app.py:96,126; one click creates a copy in the workspace Note: templates are Dify-curated, fetched from tmpl.dify.ai by default" + } }, { "id": "re-template-from-agent", @@ -4786,11 +5163,15 @@ "feature": "agent-template-gallery", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` packs a profile into a shareable archive and :122 import; hermes_cli/profile_distribution.py:175 write_manifest is only called by the installer (:547); searched write_manifest callers: no command that turns a profile into a distribution template Note: Sharing is by archive; making a reusable distribution means hand-writing distribution.yaml in a repo.", + "dify": "source read at 1.17.1, not driven: an agent can be duplicated (api/controllers/console/agent/roster.py:961 copy), exported as DSL (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52), and an inline workflow agent saved to the shared roster (api/controllers/console/agent/composer.py:239 save-to-roster). Searched 'publish as template|insert-explore-apps' in api/controllers: no way to add it to the Explore template list Note: reuse by roster, copy and file; publishing a template for others goes through the Marketplace Creator Center, an outside service (web/i18n/en-US/plugin.json:230,305), not an in-product action" + } }, { "id": "re-template-github", @@ -4809,11 +5190,15 @@ "feature": "agent-template-github-store", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profile_distribution.py:235-249 github.com/user/repo sources for `profile install` and :594 `profile update` re-pulls; hermes_cli/subcommands/skills.py:148 publish exists for skills only; searched 'publish' in hermes_cli/profile*.py: no profile publish Note: Install from GitHub yes, finding and publishing agent templates no.", + "dify": "source read at 1.17.1, not driven: api/services/app_dsl_service.py:174 import accepts yaml_url (web/i18n/en-US/app.json:115-116 'From URL'), so a raw GitHub DSL link installs; searched 'github' in api/services/app_dsl_service.py and web/i18n/en-US/app.json: no discovery or publish to GitHub Note: install by URL only" + } }, { "id": "re-template-approve", @@ -4832,11 +5217,15 @@ "feature": "agent-template-github-store", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'approv' in hermes_cli/profile_distribution.py and hermes_cli/profiles.py: none; plugin-catalog/README.md curation is Nous review of plugins, not an organisation approving agent templates", + "dify": "source read at 1.17.1, not driven: searched 'approve template|template review|pending template' in api/ and web/i18n/en-US: no approval step for templates; Explore templates come from a remote or builtin catalogue (api/configs/feature/hosted_service/__init__.py:444)" + } }, { "id": "re-agent-versions", @@ -4855,13 +5244,15 @@ "feature": "agent-versioning", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "yes", "open-webui": "unknown", "evidence": { - "n8n": "docs-only: competitor_features#31102 \"Git version control (Enterprise): Environments + git-backed workflow versioning in EE.\"" + "n8n": "docs-only: competitor_features#31102 \"Git version control (Enterprise): Environments + git-backed workflow versioning in EE.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:85-87 /snapshot create|restore of Hermes config/state; hermes_cli/config_backups.py:1-8 point-in-time copies of config.yaml; hermes_cli/subcommands/profile.py:147-158 distribution update with version in ProfileInfo Note: Whole-state snapshots and config backups allow rollback; no per-agent version list or compare view.", + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1266,1282,1302 list versions, view one, restore it; api/models/agent.py:327,363 AgentConfigSnapshot and AgentConfigRevision; workflow version history with restore (web/i18n/en-US/workflow.json:1079-1081). Searched 'compare|diff' in agent-v-2.json and workflow.json: no version comparison (only the workflow generator's change summary, :1110) Note: versions and rollback yes, compare no; Community Edition does not version the agent's file system (agent-v-2.json build.empty.communityEditionTip)" } }, { @@ -4881,14 +5272,16 @@ "feature": "agent-evals", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "yes", "open-webui": "partial", "evidence": { "n8n": "docs-only: competitor_features#6941 \"editor: Correct navigation to evaluation tab: From n8n@2.15.0 (2026-03-30)\"", - "open-webui": "docs-only: competitor_features#38777 \"Arena evaluation models configurable via environment: Arena evaluation models can now be defined through an environment variable, which previously could not be set that way.\"" + "open-webui": "docs-only: competitor_features#38777 \"Arena evaluation models configurable via environment: Arena evaluation models can now be defined through an environment variable, which previously could not be set that way.\"", + "hermes-agent": "source read at v2026.9.24, not driven: batch_runner.py:1-6 runs the agent over a JSONL prompt dataset in parallel with trajectories and tool-usage statistics; evals/ developer harnesses; searched 'expected|assert.{0,20}answer|score' in batch_runner.py: no expected-answer scoring Note: A dataset runner exists as a repo script; it does not compare against expected answers.", + "dify": "source read at 1.17.1, not driven: searched 'evaluation|test case|expected answer|dataset eval' in api/controllers and web/i18n/en-US: no agent test sets; evaluation is delegated to external tracers (web/i18n/en-US/app.json:220-258) and dataset hit testing only checks retrieval (api/controllers/console/datasets/hit_testing.py)" } }, { @@ -4909,11 +5302,15 @@ "feature": "skill-self-improvement", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'baseline|a/b|compare.{0,20}prompt|prompt version' in hermes_cli/ and agent/: none for user prompts; evals/openrouter_pkce_ab and evals/toolperf_abeval are developer harnesses, not a user surface", + "dify": "source read at 1.17.1, not driven: searched 'compare|baseline|a/b|prompt version' in web/i18n/en-US/app-debug.json, agent-v-2.json and workflow.json: classic apps can debug several models side by side on one prompt (web/app/components/app/configuration/debug/debug-with-multiple-model), but no run of a new prompt version against the old one before publishing Note: multi-model debug compares models, not prompt versions" + } }, { "id": "re-community", @@ -4935,12 +5332,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31135 \"Skills catalog (ClawHub/skills.sh): 166 skills across 26+ categories, shareable/searchable\"", - "n8n": "docs-only: competitor_features#3045 \"Community Nodes: Community-contributed custom integration nodes\"" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:38-54 browse, search and install from registries (tools/skills_hub_skillssh.py skills.sh, tools/skills_hub_clawhub.py ClawHub, tools/skills_hub_github.py); plugin-catalog/README.md:1-5 curated plugin catalog with community-tier entries via `hermes plugins catalog`", + "n8n": "docs-only: competitor_features#3045 \"Community Nodes: Community-contributed custom integration nodes\"", + "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/marketplace in-product Dify Marketplace with community Plugins and Templates, creator profiles and trending by real usage (web/i18n/en-US/plugin.json:210-240 marketplace.home.templates, creatorProfile.*); skills and agent strategies ship through it too" } }, { @@ -4961,11 +5359,15 @@ "feature": "agent-template-github-store", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115-122 export/import a profile archive including its cron jobs; hermes_cli/profile_distribution.py:396-406 distributions ship and merge cron jobs into another install; hermes_cli/subcommands/profile.py:34 --clone-channels kept off by default Note: Automations move between installs by archive or distribution; there are no client organisations inside one instance.", + "dify": "source read at 1.17.1, not driven: an app or agent exports as DSL YAML (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52; api/services/app_dsl_service.py:723) and imports into another workspace or instance by file or URL (api/services/app_dsl_service.py:174; web/i18n/en-US/app.json:115); snippets export and import the same way (web/i18n/en-US/snippet.json importFromDSLUrl) Note: credentials and plugin dependencies must be set up again in the target (web/app/components/workflow/plugin-dependency)" + } }, { "id": "re-course-recs", @@ -4985,11 +5387,15 @@ "feature": "course-recommendations", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'course|learner|curriculum' in agent/ tools/ hermes_cli/ plugins/: none; outside the product's domain", + "dify": "source read at 1.17.1, not driven: searched 'course|learner|curriculum' in api/ and web/i18n/en-US: only Dify's own product onboarding lessons (api/controllers/console/explore/recommended_app.py:111 learn-dify; web/i18n/en-US/common.json stepByStepTour.*), no learner recommendations" + } }, { "id": "op-self-host", @@ -5015,9 +5421,9 @@ "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31886 \"On-premises / sovereign deployment: Fully self-hosted inside the customer's Nextcloud\"", - "hermes-agent": "docs-only: competitor_features#31139 \"Six execution backends: Local/SSH/Docker/Daytona/Singularity/Modal; 8 parallel workers\"", + "hermes-agent": "source read at v2026.9.24, not driven: Dockerfile and docker-compose.yml at the repo root; setup-hermes.sh installer; hermes_cli/subcommands/gateway.py installs the gateway as a systemd/launchd service (hermes_cli/gateway_service_unit.py); hermes_cli/subcommands/dashboard.py self-hosted web dashboard", "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", - "dify": "docs-only: competitor_features#30991 \"Self-hosting (Docker): Self-host community edition via Docker.\"", + "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml and docker/.env.example self-host the full stack (api, worker, beat, web, plugin_daemon, sandbox, agent runtime, ssrf_proxy, database, redis, vector store); DEPLOYMENT_EDITION defaults to COMMUNITY (api/enterprise/telemetry/README.md config table)", "n8n": "docs-only: competitor_features#31099 \"Self-hosting via Docker: Run community edition on own infra with Docker.\"", "open-webui": "docs-only: competitor_features#31819 \"Offline / air-gapped deployment: Runs fully self-hosted with no external calls required\"" } @@ -5040,14 +5446,16 @@ "feature": "web-research-tool", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "no", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", - "open-webui": "docs-only: competitor_features#31819 \"Offline / air-gapped deployment: Runs fully self-hosted with no external calls required\"" + "open-webui": "docs-only: competitor_features#31819 \"Offline / air-gapped deployment: Runs fully self-hosted with no external calls required\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 local Ollama/LM Studio models; hermes_cli/config_defaults.py:2297-2305 telemetry collection and sending both off by default; :1762-1765 allow_lazy_installs false for air-gapped installs; tools/environments/docker.py:765 docker_network false air-gaps the sandbox; searched 'HERMES_OFFLINE|offline.?mode|air.?gap' in *.py: no global offline switch Note: Offline operation is assembled from settings, not a supported mode; not driven, so network calls such as model catalog refreshes were not verified to stay off.", + "dify": "source read at 1.17.1, not driven: offline is possible but not default: MARKETPLACE_ENABLED can be false with plugins uploaded as local packages (docker/.env.example:251; api/controllers/console/workspace/plugin.py:746 upload/pkg), templates in builtin mode (api/configs/feature/hosted_service/__init__.py:444 default remote), CHECK_UPDATE_URL (docker/.env.example:37) and community telemetry (api/configs/feature/__init__.py:839-850, ext_celery.py:285) must be switched off Note: every model needs a local provider plugin loaded by hand" } }, { @@ -5074,9 +5482,9 @@ "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitors#1428 license \"AGPL-3.0\"", - "hermes-agent": "docs-only: competitors#1410 license \"MIT\"", + "hermes-agent": "source read at v2026.9.24, not driven: LICENSE:1-3 MIT License, Copyright (c) 2025 Nous Research; pyproject.toml project metadata; full source including web dashboard and desktop app in the public repo Note: MIT, not EUPL.", "copilot-studio": "docs-only: competitors#1450 license \"Proprietary\"", - "dify": "docs-only: competitors#1398 license \"Apache-2.0 (modified: multi-tenant + logo restrictions)\"", + "dify": "source read at 1.17.1, not driven: LICENSE:3-10 'modified version of the Apache License 2.0': no multi-tenant service and no removal of the logo or copyright in web/ without a commercial licence; LICENSE:2.a the producer may change the licence. Not an OSI or EUPL licence Note: source-available with restrictions", "n8n": "docs-only: competitors#206 license \"Sustainable Use License / Proprietary\"", "open-webui": "docs-only: competitors#1460 license \"Open WebUI License (BSD-3 with branding clause)\"" } @@ -5101,13 +5509,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "yes", - "dify": "yes", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38244 \"One gateway, many profiles - profile-based message routing: route specific guilds, channels, or threads to different profiles - each with fully isolated config, skills, memory, and secrets.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:10-11 profiles are 'multiple isolated Hermes instances' with their own config, keys, memory, sessions and skills; agent/secret_scope.py:1-10 fail-closed per-profile secret scope in the multiplexed gateway (hermes_cli/gateway_multiplex_mode.py:1-8); hermes_cli/kanban_parser.py:84 kanban --tenant namespace Note: Isolation is per profile under one operator; no organisation boundary with its own admins or data access control.", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", - "dify": "docs-only: competitor_features#38608 \"Tenant-scoped sensitive endpoints: strengthened tenant isolation for app trace-config endpoints and FilePreview text extraction.\"" + "dify": "source read at 1.17.1, not driven: workspaces keep apps, data, providers and members apart (api/controllers/console/workspace/workspace.py:229,289 list and switch; tenant_id on every model, e.g. api/models/agent.py:163); creating workspaces is off by default (api/configs/feature/__init__.py:1599 ALLOW_CREATE_WORKSPACE=False) and LICENSE:5-6 forbids running a multi-tenant service without a commercial licence Note: works technically, licence-gated for serving several organisations" } }, { @@ -5127,11 +5535,15 @@ "feature": "multi-tenant-ops", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'quota' in hermes_cli/profiles.py, hermes_cli/config_defaults.py and gateway/: only provider quota holds (cron/quota_hold.py:1-12) and gateway/platforms/api_server.py:1322 a global max_concurrent_runs; no per-organisation or per-profile quota", + "dify": "source read at 1.17.1, not driven: api/services/feature_service.py:24-31 per-workspace limits (members, apps, vector space, upload quota, api/services/entities/feature_entities.py:152-161) are filled only from the Cloud billing API; self-hosted community has no per-workspace quota setting Note: Dify Cloud plans only" + } }, { "id": "op-tenant-ops", @@ -5151,11 +5563,15 @@ "feature": "multi-tenant-ops", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'tenant|organisation|organization' in web/src/pages and hermes_cli/web_routers: only the kanban tenant filter (web/src/i18n/en.ts kanban.tenant); web/src/pages/ProfilesPage.tsx manages profiles one by one with no quota or retention per organisation", + "dify": "source read at 1.17.1, not driven: searched 'tenant management|all workspaces admin|operations page' in api/controllers/console and web/app: /all-workspaces (api/controllers/console/workspace/workspace.py:238) lists the caller's own workspaces; workspace-wide switches come from the separate Enterprise service (api/services/system_feature_service.py:106-112, 160-197), not a page in this repo" + } }, { "id": "op-sso", @@ -5175,15 +5591,16 @@ "feature": "app-runtime-requirements", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { - "dify": "docs-only: competitor_features#38654 \"Marketplace and OAuth - targeted fixes for marketplace flows and OAuth sign-in: including edge cases such as null email on GitHub OAuth.\"", + "dify": "source read at 1.17.1, not driven: SAML, OIDC and OAuth2 SSO for console and web apps is read from the Enterprise service (api/services/entities/feature_entities.py:103-106,183-184; api/services/system_feature_service.py:162-197); community offers only GitHub and Google OAuth login (api/configs/feature/__init__.py:1003,1013; api/controllers/console/auth/oauth.py). No group sync in community Note: enterprise-licensed", "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", - "open-webui": "docs-only: competitor_features#31820 \"SSO / OAuth / LDAP auth: Enterprise identity integration options\"" + "open-webui": "docs-only: competitor_features#31820 \"SSO / OAuth / LDAP auth: Enterprise identity integration options\"", + "hermes-agent": "source read at v2026.9.24, not driven: plugins/dashboard_auth/self_hosted/plugin.yaml:1-4 OIDC sign-in to the dashboard against Keycloak, Authentik, Zitadel, Okta and others; plugins/dashboard_auth/self_hosted/__init__.py:262-270 groups are folded into a free-form org_id string that no access check reads (hermes_cli/dashboard_auth/base.py:12-16); chat users are platform ids in allowlists (gateway/authz_mixin.py:32-37) Note: Sign-in with company accounts works for the dashboard; groups do not map to rights." } }, { @@ -5205,12 +5622,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "yes", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38241 \"Plug your password manager into Hermes - Bitwarden & 1Password secret sources: A new pluggable SecretSource interface lets Hermes fetch secrets from Bitwarden and 1Password (op:// references) at load time.\"", - "dify": "docs-only: competitor_features#38714 \"Cleared stale provider credentials during plugin uninstall: to reduce residual credential risk.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/secrets.py:8-20 Bitwarden Secrets Manager and 1Password sources (agent/secret_sources/); agent/vault_store.py:1-8 encrypted, model-blind local vault; hermes_cli/proxy_cli.py:352-365 iron-proxy injects real credentials at egress so sandboxes hold only proxy tokens; hermes_cli/subcommands/vault.py:8", + "dify": "source read at 1.17.1, not driven: tool, model, datasource and trigger credentials are stored encrypted per workspace (api/core/helper/encrypter.py, provider_encryption.py) and referenced by agents, not typed into agent settings (api/controllers/console/workspace/tool_providers.py, model_providers.py:200); api/models/credential_permission.py limits who may use each credential Note: an encrypted store in the Dify database, not an external vault such as HashiCorp", "n8n": "docs-only: competitor_features#31106 \"Credential vault: Encrypted credential store shared across workflows.\"" } }, @@ -5234,12 +5651,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "partial", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#38248 \"Security hardening round: Vertex credentials scoped away from subprocess env and through profile secret scopes.\"", - "n8n": "docs-only: competitor_features#38153 \"core: Bind dynamic credential tokens to a user ID: From n8n@2.32.0 (2026-07-21)\"" + "hermes-agent": "source read at v2026.9.24, not driven: agent/secret_scope.py:1-10 each profile's own .env keys resolve only inside that profile's turns (fail-closed under multiplexing); hermes_cli/subcommands/profile.py:31-34 cloned profiles drop bot tokens unless --clone-channels; tui_gateway/methods_profiles.py:372-378 share_auth off forks credentials per profile", + "n8n": "docs-only: competitor_features#38153 \"core: Bind dynamic credential tokens to a user ID: From n8n@2.32.0 (2026-07-21)\"", + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1032,1062 per-agent service API keys (create, list, revoke); per-agent secret environment variables injected only at runtime (web/i18n/en-US/agent-v-2.json advancedSettings.envEditor.scopeSecret, tools.cliDialog.securityTip); each tool on an agent picks which workspace credential it uses (agent-v-2.json tools.credential.authOne)" } }, { @@ -5259,16 +5677,16 @@ "feature": "admin-ui", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "yes", + "hermes-agent": "partial", "copilot-studio": "yes", - "dify": "yes", + "dify": "partial", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", - "hermes-agent": "docs-only: competitor_features#38303 \"The web dashboard is now a full admin panel: The dashboard grew from view your sessions into a complete administration surface.\"", + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ConfigPage.tsx:384-391 sectioned config editor for config.yaml plus EnvPage (Keys) and ModelsPage in the Hermes dashboard; hermes_cli/subcommands/setup.py:11 `hermes setup`; searched 'nextcloud' repo-wide: none Note: Set up from Hermes' own dashboard and CLI, not from Nextcloud admin settings.", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", - "dify": "docs-only: competitor_features#30994 \"Workspaces & RBAC: Team workspaces with member roles.\"", + "dify": "source read at 1.17.1, not driven: Dify is set up in its own workspace settings and Integrations page (members api/controllers/console/workspace/members.py, model providers, plugins, web/app/(commonLayout)/integrations) plus environment variables (docker/.env.example); searched 'nextcloud' in api/ and web/: no Nextcloud admin settings panel Note: own settings, not Nextcloud's", "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"" } }, @@ -5289,13 +5707,14 @@ "feature": "app-manifest", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "yes", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "dify": "docs-only: competitor_features#38588 \"Redesigned landing / onboarding for an easier first-run experience: (#37433, #37844, #37800)\"" + "dify": "source read at 1.17.1, not driven: api/controllers/console/setup.py:42,65 first-run admin account setup (web/app/install); api/controllers/console/onboarding.py:56 and web/app/components/step-by-step-tour a checklist tour pointing to Integrations, Knowledge, Studio and Learn Dify lessons (web/i18n/en-US/common.json:643-662); web/i18n/en-US/common.json:378 'Please install a model provider first'. No wizard that configures the first provider and agent end to end Note: a tour of pages, not a guided setup of provider plus agent", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/setup.py:11-26 `hermes setup` interactive wizard with sections; hermes_cli/gateway_setup_wizard.py:1 `hermes gateway setup` per-platform prompts; apps/desktop/e2e/core/onboarding-first-chat.spec.ts desktop onboarding to a first chat; web/src/pages/ProfileBuilderPage.tsx:32 profile builder" } }, { @@ -5316,13 +5735,15 @@ "feature": "agent-engine-port", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "partial", "open-webui": "unknown", "evidence": { - "n8n": "docs-only: competitor_features#6928 \"core: Fix /healthz endpoint when using N8N_PATH: From n8n@2.15.0 (2026-03-30)\"" + "n8n": "docs-only: competitor_features#6928 \"core: Fix /healthz endpoint when using N8N_PATH: From n8n@2.15.0 (2026-03-30)\"", + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SystemPage.tsx:106 doctor run with live log and :187 memory-provider status; web/src/i18n/en.ts status.* gateway running/failed, connected platforms, active sessions on the status overview; hermes_cli/web_routers/status.py:115 /api/health and gateway/platforms/api_server.py:1592 /health/detailed", + "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads, /db-pool-stat JSON endpoints and api/celery_healthcheck.py for machine checks; searched 'health|status page|system status' in web/app and web/i18n/en-US: no page showing chat and dependency health Note: endpoints only, no page" } }, { @@ -5343,15 +5764,16 @@ "feature": "app-manifest", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "partial", + "hermes-agent": "yes", "copilot-studio": "no", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "partial", "evidence": { - "hermes-agent": "docs-only: competitors#1410 pricing_model \"open-source (free forever)\"", + "hermes-agent": "source read at v2026.9.24, not driven: LICENSE:1-3 MIT, no seat or message licence in the code; agent/billing_view.py:1 and hermes_cli/nous_subscription.py cover an optional Nous portal plan; model spend is paid per token to whichever provider is configured Note: Software is free; model usage is billed by the provider, per token.", "copilot-studio": "docs-only: competitor_features#31612 \"Message-metered pricing: $0.01/message or $200/mo pack; cost spikes with generative/autonomous use.\"", - "open-webui": "docs-only: competitors#1460 pricing \"Free self-hosted; paid enterprise license/support\"" + "open-webui": "docs-only: competitors#1460 pricing \"Free self-hosted; paid enterprise license/support\"", + "dify": "source read at 1.17.1, not driven: the self-hosted Community Edition carries no seat or message fee in code (api/services/feature_service.py:24-31 billing limits only for CLOUD); enterprise licences carry a member limit (api/services/entities/feature_entities.py:161 workspace_members LicenseLimitationModel) and Cloud plans limit apps and members (:152-157) Note: community is free; paid editions are limited by members or plan, pricing itself not in code" } }, { @@ -5374,13 +5796,13 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "partial", + "dify": "yes", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31389 \"No scaling / single-instance: Docs state \"no scaling support currently\"; English-biased tool-calling models required.\"", - "hermes-agent": "docs-only: competitor_features#31139 \"Six execution backends: Local/SSH/Docker/Daytona/Singularity/Modal; 8 parallel workers\"", - "dify": "docs-only: competitor_features#38562 \"Workflow run archives can now be exported: active runs are properly aborted during Celery warm shutdown to prevent orphaned tasks.\"", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_swarm.py:1-8 parallel specialist workers on the kanban dispatcher (plugins/kanban/systemd/hermes-kanban-dispatcher.service); cron/jobs.py:2652-2653 at-most-once claims across N replicas; hermes_cli/gateway_multiplex_mode.py:1-8 one gateway serves many profiles; gateway/platforms/api_server.py:1322 concurrent API runs", + "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml:227,306,353,660 separate api, Celery worker, beat and agent_backend services; docker/.env.example:57,66-67 SERVER_WORKER_AMOUNT, CELERY_WORKER_AMOUNT, CELERY_AUTO_SCALE; dify-agent/src/dify_agent/runtime/run_scheduler.py schedules concurrent agent runs; schedules dispatched in parallel groups (api/schedule/workflow_schedule_task.py:108)", "n8n": "docs-only: competitor_features#6931 \"core: Fix race condition when stopping jobs in queue mode: From n8n@2.15.0 (2026-03-30)\"" } }, @@ -5402,11 +5824,14 @@ "feature": "agent-tool-governance", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", - "open-webui": "unknown" + "open-webui": "unknown", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:5-25 inbound A2A endpoint with Agent Card; plugins/platforms/a2a/security.py:1-4 peer identity from credentials (A2A_PEER_TOKENS token -> name), trusted-peer allow-list, JSONL audit, injection filtering; gateway/slash_access.py:1-10 command lists per user id Note: Outside agents can be registered and admitted by token; their tasks run in the agent's session with its full toolset, with no per-peer tool scope or run-as identity." + } }, { "id": "op-preferences", @@ -5426,13 +5851,14 @@ "feature": "talk-delivery", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"" + "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 USER.md holds the user's preferences and style and loads every session; hermes_cli/commands.py:163 /personality, :207 /busy, :176 /verbose, :170 /timestamps; web/src/pages/ConfigPage.tsx config editor Note: Preferences are per profile; separate people get separate preferences only through separate profiles or a user-modelling memory provider." } }, { @@ -5445,14 +5871,14 @@ "originNote": "Gemeente Zaanstad zaaksysteem (2025-01-17) requirement 17539; also UWV 415648 requirement 123258", "hermiq": "unknown", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: agent/chat_completion_helpers.py:445-453 provider_routing.data_collection ('deny') plus only/ignore provider lists sent to OpenRouter; hermes_cli/model_data_policy_guard.py:23-55 warns before selecting a tier that trains on prompts (Meta contributor only rule); hermes_cli/models_local.py:1-5 local models keep data in house Note: Controls exist per provider route and by choosing local models; nothing guarantees it across all configured providers.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", @@ -5469,14 +5895,14 @@ "originNote": "Tilburg University DMS (2025-11-26) requirement 57596; also Juridisch Loket 307676 requirement 102700 and Molenlanden 415259 requirement 71423", "hermiq": "unknown", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 tool progress shows each step taken; hermes_cli/commands.py:190-192 /reasoning show displays model reasoning summaries (agent/reasoning_summaries.py); agent/turn_explainers.py:1-4 explains why a turn ended without an answer; web/src/pages/SessionsPage.tsx full transcript Note: Steps and reasoning can be shown; there is no plain-language account of how an outcome came about for a reviewer who keeps the final say.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", @@ -5493,14 +5919,14 @@ "originNote": "Veiligheidsregio Utrecht klantcontactsysteem (2025-03-17) requirement 4339", "hermiq": "unknown", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'only answer from|answer only|grounded only|restrict.{0,20}sources' in agent/ tools/ hermes_cli/: none that constrains answers to a document set; tools/website_policy.py:1-5 blocklists sites and hermes_cli/web_routers/tools.py:280 toolset toggles can remove web tools, but nothing limits answers to validated documents Note: A profile can be narrowed by removing tools and by SOUL.md wording; nothing enforces it.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", @@ -5517,14 +5943,14 @@ "originNote": "Gemeente Molenlanden zaaksysteem 2026 (2026-03-11) requirement 71423", "hermiq": "unknown", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/tips.py:1-3 tips at CLI session start; tools/tour_tool.py:1-5 agent-led guided tours of the desktop UI; hermes_cli/journey.py:1 `hermes journey` timeline of what Hermes learned; web/src/pages/DocsPage.tsx:1 docs link in the dashboard Note: Help teaches how to use Hermes, not AI literacy (limits, risks, verification) as training modules.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", @@ -5541,14 +5967,14 @@ "originNote": "Gemeente Molenlanden zaaksysteem 2026 (2026-03-11) requirement 71423", "hermiq": "unknown", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched '\\bbias\\b|fairness' in agent/ tools/ hermes_cli/ evals/: only ranking bias in tools/session_search_tool.py:693 and a fairness comment in evals/; no bias test runner or stored results", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", @@ -5575,13 +6001,14 @@ "feature": "agent-identity", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { - "n8n": "docs-only: competitor_features#38153 \"core: Bind dynamic credential tokens to a user ID: From n8n@2.32.0 (2026-07-21)\"" + "n8n": "docs-only: competitor_features#38153 \"core: Bind dynamic credential tokens to a user ID: From n8n@2.32.0 (2026-07-21)\"", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 a requester's user id can route to their own profile, whose own keys and credentials then apply (agent/secret_scope.py:1-10); tools/environments/ssh.py runs the terminal as a configured remote account; searched 'run.?as|impersonat|service account|on behalf of' in agent/ and gateway/: no per-run identity choice Note: Tools act with the host or backend account and the profile's keys; choosing requester, owner or service identity per agent is not a setting." }, "pendingReason": "Whether actingUser is set anywhere outside seed/repair scripts on a live instance could not be settled without running the app." }, @@ -5603,14 +6030,15 @@ "feature": "talk-shared-sessions", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", "open-webui": "partial", "evidence": { "dify": "docs-only: competitor_features#38723 \"Collaboration Beta adds shared editing, comments, and @ mentions: From 1.14.0-rc1: New Agent x Skills for Production Workflows (2026-02-14)\"", - "open-webui": "docs-only: competitor_features#38758 \"Share folders with your team: share a folder and the chats inside it with specific users, groups, or everyone, with read or write access; people you share with see shared folders in their sidebar and open the chats in a read-only view when they are not the owner\"" + "open-webui": "docs-only: competitor_features#38758 \"Share folders with your team: share a folder and the chats inside it with specific users, groups, or everyone, with read or write access; people you share with see shared folders in their sidebar and open the chats in a read-only view when they are not the owner\"", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/config.py:574-596 thread_sessions_per_user false by default, so everyone in a thread shares one session with the agent (group_sessions_per_user can be switched off for whole groups); gateway/session.py:634-641 session key resolution; hermes_cli/commands.py:76 /branch opens a shared thread" }, "pendingReason": "Whether every talk-shared-sessions requirement is complete cannot be settled without running a live Talk room." }, @@ -5633,12 +6061,15 @@ "feature": "a-conversational-intake-that-files-for-the-citizen", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", - "pendingReason": "Whether another app relays anonymous citizens into this endpoint as an authenticated service account could not be settled from this repo alone." + "pendingReason": "Whether another app relays anonymous citizens into this endpoint as an authenticated service account could not be settled from this repo alone.", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:35 _ALLOW_ALL_USERS lets anyone message the bot on WhatsApp, SMS, Telegram and others without an account; gateway/run_inbound_unauthorized.py:1-9 strangers otherwise get a pairing code; searched 'intake|case|file.{0,10}request' in gateway/ and tools/: no intake flow that files a request Note: A public bot is possible; filing the request somewhere is left to whatever tools the agent has." + } }, { "id": "tl-connectors", @@ -5657,7 +6088,7 @@ "feature": "agent-webhook-trigger", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", "n8n": "yes", @@ -5665,7 +6096,8 @@ "evidence": { "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", "dify": "docs-only: competitor_features#30990 \"Tools/plugins marketplace: Plugin ecosystem of tools/connectors.\"", - "n8n": "docs-only: competitor_features#31095 \"400+ app connectors: Large library of prebuilt integration nodes.\"" + "n8n": "docs-only: competitor_features#31095 \"400+ app connectors: Large library of prebuilt integration nodes.\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/connectors/__init__.py:1-6 and tools/connectors/gateway/client.py:1-3 managed connector accounts through the Nous tool gateway; optional-mcps/ 65 Nous-approved MCP servers (asana, atlassian, notion, stripe, supabase, ...); plugin-catalog/ ~290 curated plugins Note: The managed connector set needs a Nous account; the MCP and plugin catalogs are self-configured." }, "pendingReason": "Hermiq documents the seam but ships no connector catalogue itself; whether integriq's own catalogue is reachable and how many connectors it exposes needs checking in the integriq repo, not done here." }, @@ -5686,7 +6118,7 @@ "feature": "vector-rag", "featureConfidence": "high", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "partial", "dify": "yes", "n8n": "unknown", @@ -5695,7 +6127,8 @@ "nextcloud-assistant": "docs-only: competitor_features#31881 \"Context Chat (RAG over Nextcloud data): RAG over Files, Collectives and Analytics\"", "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", "dify": "docs-only: competitor_features#30988 \"RAG pipeline & knowledge base: Built-in document ingestion + retrieval.\"", - "open-webui": "docs-only: competitor_features#31813 \"RAG document ingestion / knowledge base: Upload docs and chat over them with retrieval\"" + "open-webui": "docs-only: competitor_features#31813 \"RAG document ingestion / knowledge base: Upload docs and chat over them with retrieval\"", + "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file and search_files let the agent read and grep documents on the host on demand; gateway/platforms/base.py:1183-1231 attached documents are read into the turn; searched 'nextcloud' repo-wide: none, and no document index in core (RAG only via plugins/memory/retaindb, openviking) Note: Grounding in local files by reading them, not in Nextcloud Files and not through an index." }, "pendingReason": "Real semantic/vector grounding is unbuilt (vector-rag change open); today's grounding is keyword search over the agent's declared views/files." }, @@ -5717,13 +6150,14 @@ "feature": "vector-rag", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38816 \"File ownership in folder and knowledge attachments: Attaching files to folders or knowledge bases now verifies per-file read access, and folder file lists in chat middleware are filtered to entries the caller can read, preventing unauthorized file content from being injected into RAG context.\"" + "open-webui": "docs-only: competitor_features#38816 \"File ownership in folder and knowledge attachments: Attaching files to folders or knowledge bases now verifies per-file read access, and folder file lists in chat middleware are filtered to entries the caller can read, preventing unauthorized file content from being injected into RAG context.\"", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'acl|permission.{0,20}(user|requester)|allowed to see' in tools/file_tools*.py, tools/session_search_tool.py and agent/: file access follows the host account and tools/file_tools_write_guards.py protects Hermes' own files, not per-requester visibility; tools/session_search_tool.py:1-9 searches the whole profile's sessions Note: All users of one profile share what the agent can read; nothing filters by the asking person." }, "pendingReason": "Needs checking OpenRegister's ObjectService/ACL enforcement for the session identity the chat request actually runs under; out of scope for a hermiq-only read." }, @@ -5744,13 +6178,13 @@ "feature": "context-documents", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "partial", + "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31133 \"Autonomous skills system: agentskills.io standard; skills auto-created after 5+ tool calls, self-improving\"", + "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_builder.py:1656-1661 loads .hermes.md, AGENTS.md chain, CLAUDE.md and .cursorrules as instructions; hermes_cli/commands.py:234 /init generates AGENTS.md from a repo scan; SOUL.md per profile (web/src/pages/ProfilesPage.tsx:556); skills as SKILL.md documents Note: Old partial; document instructions are core.", "dify": "docs-only: competitor_features#38720 \"Skill Editor helps you build reusable SOP blocks: and call tools inline with @ (e.g., @send_email).\"" }, "pendingReason": "hermiq-context-documents change (assembler + editor) is open, not implemented -- the schema field exists but nothing reads or writes it yet." @@ -5772,12 +6206,15 @@ "feature": "skills-marketplace", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", - "pendingReason": "The spec's own e2e-exclude note says no committed Playwright fixture provisions a second organisation, and a live shared hub needs an OpenConnector connector not configured by default -- cross-org sharing works as a manual paste/GitHub install, not a live in-instance marketplace browse." + "pendingReason": "The spec's own e2e-exclude note says no committed Playwright fixture provisions a second organisation, and a live shared hub needs an OpenConnector connector not configured by default -- cross-org sharing works as a manual paste/GitHub install, not a live in-instance marketplace browse.", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_sync_client_org.py:1-7 org-shared skills under ~/.hermes/skills/_org// with pull and propose; tools/skills_sync_client.py:6-8 the sync is INERT unless the user is a Nous portal admin (pre-launch gate); hermes_cli/subcommands/profile.py:20-23 --clone copies skills to another profile Note: Org skill sharing exists in code but is switched off for ordinary users; profiles on one install share by cloning." + } }, { "id": "dl-api", @@ -5803,7 +6240,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "hermes-agent": "docs-only: competitor_features#31136 \"Cron scheduler: Natural-language scheduled tasks, /api/jobs REST, delivery to any channel\"", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions, /v1/responses, /v1/models plus /v1/runs, /api/sessions and /api/jobs with API_SERVER_KEY; gateway/platforms/api_server_runs.py run lifecycle; per-profile paths /p//", "dify": "docs-only: competitor_features#30995 \"API-first backend: Every app exposed as a backend API.\"", "n8n": "docs-only: competitor_features#3909 \"core: Add missing fields to public API workflow schema: From n8n@2.14.0 (2026-03-24)\"", "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"" @@ -5828,12 +6265,15 @@ "feature": "algoritmeregister-publication", "featureConfidence": "high", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", - "pendingReason": "Live publish success depends on OpenCatalogi being installed and reachable; could not verify a live 200 without running the app." + "pendingReason": "Live publish success depends on OpenCatalogi being installed and reachable; could not verify a live 200 without running the app.", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'algoritme|algorithm register' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none" + } }, { "id": "co-dpia", @@ -5853,12 +6293,15 @@ "feature": "algoritmeregister-publication", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", - "pendingReason": "Could not confirm without running the app whether the generic OpenRegister index-page edit form actually renders and saves the impactAssessments array-of-object field, or whether it is write-only through occ/API." + "pendingReason": "Could not confirm without running the app whether the generic OpenRegister index-page edit form actually renders and saves the impactAssessments array-of-object field, or whether it is write-only through occ/API.", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no link or document field for an assessment" + } }, { "id": "fl-parallel", @@ -5884,7 +6327,7 @@ "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "docs-only: competitor_features#31141 \"Sub-agent delegation: Isolated parallel sub-agent contexts for concurrent workstreams\"" + "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 batch (parallel) mode spawns several child agents at once; hermes_cli/config_defaults.py:1332-1338 delegation block; hermes_cli/kanban_swarm.py:1-8 parallel specialist workers with a verifier; optional-skills/autonomous-ai-agents/dynamic-workflow fan-outs" }, "pendingReason": "whether delegated sub-agent calls actually run concurrently needs a live run to confirm timing" }, @@ -5906,7 +6349,7 @@ "feature": "agent-tool-governance", "featureConfidence": "medium", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "partial", "dify": "yes", "n8n": "partial", @@ -5916,7 +6359,8 @@ "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "dify": "docs-only: competitor_features#30994 \"Workspaces & RBAC: Team workspaces with member roles.\"", "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", - "open-webui": "docs-only: competitor_features#31811 \"Role-Based Access Control (RBAC): Built-in RBAC with user groups and model access controls\"" + "open-webui": "docs-only: competitor_features#31811 \"Role-Based Access Control (RBAC): Built-in RBAC with user groups and model access controls\"", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_access.py:1-27 per platform allow_admin_from (all commands) vs user_allowed_commands for other allowed users; gateway/authz_mixin.py:32-37 allowlists decide who may chat; plugins/dashboard_auth/basic/__init__.py:1-8 the dashboard has one username and every signed-in user has full control (hermes_cli/dashboard_auth/base.py:12-16 no role field) Note: Two chat roles (admin, user) for slash commands; no builder role and no roles in the dashboard." }, "pendingReason": "Could not confirm which page lets an admin edit the action-to-group matrix (as opposed to the individual per-agent RBAC surfaces already covered elsewhere)." }, @@ -5938,12 +6382,15 @@ "feature": "nl-locale-completeness", "featureConfidence": "medium", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", - "pendingReason": "Did not verify nl.json has full key parity with en.json (that is the subject of the nl-locale-completeness spec itself)." + "pendingReason": "Did not verify nl.json has full key parity with en.json (that is the subject of the nl-locale-completeness spec itself).", + "evidence": { + "hermes-agent": "source read at v2026.9.24, not driven: web/src/i18n/ ships af, ar, de, en, es, fr, ga, hu, it, ja, ko, pt, ru, tr, uk, zh, zh-hant; locales/*.yaml the same set for CLI and gateway strings; apps/desktop/src/i18n adds no nl either; searched for nl locale files repo-wide: none Note: The model answers in Dutch when addressed in Dutch, but dashboard, CLI and desktop text have no Dutch translation." + } } ] } From b4efe0c97d633861eeb9e9ea426307d6bce989a4 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 16:01:22 +0200 Subject: [PATCH 03/12] chore(parity): hermes-agent sources object and ten rows mined from its changelog and feature requests --- openspec/parity/capabilities.json | 280 +++++++++++++++++++++++++++++- 1 file changed, 279 insertions(+), 1 deletion(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 3e062e983..1cac053a8 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -34,7 +34,55 @@ "columnAddedOn": "2026-09-26", "evidenceGrade": "docs-only", "readHow": "source read at v2026.9.24 (f97608f, shallow clone of github.com/NousResearch/hermes-agent), not driven: CLI subcommands, web dashboard pages and routers, gateway adapters, tools and skills registries, tests and i18n, every row rated with path:line evidence; no instance booted", - "unknownReason": "source read at v2026.9.24, not driven: the code reading could not settle this row" + "unknownReason": "source read at v2026.9.24, not driven: the code reading could not settle this row", + "sources": { + "docs": "https://hermes-agent.nousresearch.com/docs/", + "sourceRepo": "https://github.com/NousResearch/hermes-agent", + "featurePage": "https://hermes-agent.nousresearch.com/docs/user-guide/features/overview", + "featureRequests": "https://github.com/NousResearch/hermes-agent/issues?q=is%3Aissue%20state%3Aopen%20label%3Atype%2Ffeature", + "issueTracker": { + "url": "https://github.com/NousResearch/hermes-agent/issues", + "featureLabel": "type/feature" + }, + "roadmap": null, + "changelog": "https://github.com/NousResearch/hermes-agent/releases", + "apiReference": { + "apiServer": "https://hermes-agent.nousresearch.com/docs/user-guide/features/api-server", + "cli": "https://hermes-agent.nousresearch.com/docs/reference/cli-commands" + }, + "marketplace": { + "skillsHub": "https://hermes-agent.nousresearch.com/docs/skills", + "pluginCatalog": "https://hermes-agent.nousresearch.com/docs/user-guide/features/plugin-catalog" + }, + "pricing": null, + "accessibilityStatement": null, + "securityDocs": { + "policy": "https://github.com/NousResearch/hermes-agent/blob/main/SECURITY.md", + "guide": "https://hermes-agent.nousresearch.com/docs/user-guide/security" + }, + "demoInstance": null, + "community": { + "discord": "https://discord.gg/NousResearch", + "x": "https://x.com/NousResearch" + }, + "reviews": null, + "videos": "https://www.youtube.com/@NousResearch", + "caseStudies": "https://hermes-agent.nousresearch.com/docs/user-stories", + "partnerDirectory": null, + "trainingCurriculum": null, + "jobPostings": "https://nousresearch.com/careers", + "tenders": null, + "nullReasons": { + "roadmap": "no ROADMAP file in the repo at v2026.9.24 (find -iname '*roadmap*' hit only a skill asset), hermes-agent.nousresearch.com/roadmap and /docs/roadmap return 404, GitHub Discussions are disabled (has_discussions false, /discussions 404); GitHub Projects could not be listed (token lacks read:project).", + "pricing": "the agent is MIT-licensed and free; the only paid surface is the Nous Portal subscription, and portal.nousresearch.com/pricing returned HTTP 429 so it was not seen resolving (portal.nousresearch.com itself resolves, title 'Nous Portal').", + "accessibilityStatement": "no accessibility statement: hermes-agent.nousresearch.com/accessibility 404; grep -ril accessib in website/docs only hits install and desktop pages, none a statement.", + "demoInstance": "no hosted demo: the product is a self-installed CLI, desktop app and gateway; the homepage and README link install scripts, not a demo.", + "reviews": "no review-site listing found or linked from README or the docs site; none seen resolving.", + "partnerDirectory": "no partner or integrator directory linked from README, the docs site or nousresearch.com.", + "trainingCurriculum": "no training or certification curriculum; the docs have guides (e.g. /docs/guides/tips resolves) but no course.", + "tenders": "searched the intelligence database on 2026-09-26 (tenders name, description and keywords, and requirements text_nl/text_en, word-boundary match on 'hermes agent', 'nous research'): no tender names it" + } + } }, { "key": "copilot-studio", @@ -5980,6 +6028,236 @@ "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" } + }, + { + "id": "dm-task-board", + "area": "flows", + "name": "Put tasks on a shared board that several agents claim, hand off and close.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.5.7", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "yes", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:459 `hermes kanban` durable task board shared across profiles; hermes_cli/kanban_db.py:1249 create_task, :2263 claim_task, :2558 reclaim_task, :2723 complete_task; tools/kanban_tools.py:112 kanban_complete/kanban_block agent tools, :237 kanban_comment hand-off between tasks.", + "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + } + }, + { + "id": "dm-standing-goal", + "area": "agents", + "name": "Give an agent a standing goal it keeps working on across turns until a check says it is reached.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.5.7", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "yes", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:117 /goal 'Set a standing goal Hermes works on across turns until achieved'; gateway/slash_commands_goals.py:37 handler in every messaging channel; hermes_cli/goals.py:397 GoalState, :344 GoalGate shell checks, :860 goal_judge model call decides done.", + "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + } + }, + { + "id": "dm-model-ensemble", + "area": "models", + "name": "Answer one prompt with several models at once and merge their answers into one reply.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.7.1", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "yes", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:134 /moa runs a prompt through the Mixture of Agents preset; agent/moa_loop.py:1 reference models gathered before each iteration, aggregator answers; hermes_cli/subcommands/moa.py:10 `hermes moa configure`; hermes_cli/web_routers/models.py:204 GET /api/model/moa for the dashboard.", + "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + } + }, + { + "id": "dm-key-rotation", + "area": "models", + "name": "Spread calls over several API keys for one provider and rotate to the next key when one runs out.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.4.3", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "yes", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/auth.py:10 `hermes auth add` pooled credentials; agent/credential_pool.py:122 least_used strategy, :1941 select, :2221 mark_exhausted_and_rotate; agent/agent_runtime_helpers.py:895 the turn rotates to the next key on a quota or auth failure. Note: distinct from mo-failover (second provider) and mo-key-broker (central store): same provider, many keys.", + "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + } + }, + { + "id": "dm-backup-restore", + "area": "operations", + "name": "Back up all agent data automatically and restore it to an earlier point after a bad change.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/NousResearch/hermes-agent/issues/12238", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "partial", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/backup.py:10 `hermes backup` zips ~/.hermes, hermes_cli/backup.py:671 run_backup, :993 run_import; hermes_cli/cli_commands_mixin.py:805 /snapshot list|create|restore; hermes_cli/update_cmd_maint.py:692 automatic snapshot only before an update. No scheduled backup job and no version history (grep backup in cron/: only fallback-provider copy). Note: issue open; automatic backups are limited to the pre-update snapshot.", + "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + } + }, + { + "id": "dm-remote-agent", + "area": "flows", + "name": "Hand a task to an agent running on another server and get its answer back.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/NousResearch/hermes-agent/issues/689", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "yes", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:6 bundled A2A plugin, outbound a2a_discover/a2a_call/a2a_orchestrate; plugins/platforms/a2a/tools.py:173 a2a_call sends a task to a configured peer or URL and returns the reply, :255 a2a_orchestrate; :330 tools appear only once a2a_agents or the platform is configured. Note: issue #689 is still open but the A2A plugin shipped in core covers remote delegation; config-gated, off by default.", + "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + } + }, + { + "id": "dm-rate-cap", + "area": "models", + "name": "Cap how many requests per minute an agent sends to a model provider.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/NousResearch/hermes-agent/issues/31802", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "no", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'requests_per_minute|rpm|token_bucket|throttle|rate_limit_delay' in agent/, run_agent.py, hermes_cli/: agent/rate_limit_tracker.py:181 only displays provider RPM headers; rate_limit_delay is accepted in hermes_cli/config.py:993 and hermes_cli/config_providers.py:260 but nothing in agent/ reads it. No client-side limiter. Note: a config key nothing reads, so no. Same demand in #58061.", + "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + } + }, + { + "id": "dm-temperature", + "area": "models", + "name": "Set the temperature an agent's model answers with.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/NousResearch/hermes-agent/issues/17565", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "partial", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: no temperature key in hermes_cli/config*.py (grep temperature hermes_cli: none for the main agent); agent/chat_completion_helpers.py:1416 only fixed per-model temperatures; a custom provider's extra_body (hermes_cli/config.py:993, applied at agent/agent_runtime_helpers.py:1937) can pass one; MoA presets have reference/aggregator temperature (hermes_cli/web_models.py:152). Note: issue open; only indirect paths.", + "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + } + }, + { + "id": "dm-project-memory", + "area": "memory", + "name": "Keep a separate memory per project next to a shared memory.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/NousResearch/hermes-agent/issues/16833", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "partial", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:39 memory dir is per profile (HERMES_HOME/memories), so a profile per project gives separate memory but no shared layer; agent/prompt_builder.py:139 project .hermes.md/HERMES.md is read-only context; agent/skill_utils.py:437 project-local skills. Searched 'project.scoped|memory_scope' in agent, tools, plugins/memory: none. Note: issue open.", + "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + } + }, + { + "id": "dm-cross-channel", + "area": "chat", + "name": "Carry one conversation over from one channel to another, such as from a messenger to the desktop.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/NousResearch/hermes-agent/issues/4335", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "partial", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands_session.py:862 /resume, :323 a stored session is only resumable from the same platform and thread, :303 cross-origin resume only for an explicitly configured admin with --all; all sessions share one state.db so the local CLI can reopen them. Note: issue open; cross-channel is admin-only in the gateway.", + "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + } } ], "pending": [ From 210f0575da9d475fe37832eb9a56bac597692755 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 16:03:09 +0200 Subject: [PATCH 04/12] chore(parity): rate hermiq from its code on the ten hermes-mined rows --- openspec/parity/capabilities.json | 75 +++++++++++++++++++++++++------ 1 file changed, 62 insertions(+), 13 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 1cac053a8..1684f0f1a 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -6036,7 +6036,7 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.5.7", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", @@ -6050,6 +6050,11 @@ "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + }, + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'kanban|task.?board|claim' in lib/, src/ and exapp/llm-runner/src at development 5277c0d: no shared task board; agents hand work on only through delegation (lib/Service/DelegationService.php) and flows" } }, { @@ -6059,7 +6064,7 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.5.7", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", @@ -6073,6 +6078,11 @@ "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + }, + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'standing goal|goal' in lib/Service, lib/Controller, src/views and src/modals at 5277c0d: goal appears only in the course-recommendation feature (lib/Service/CourseRecommendationEngine.php); no goal an agent keeps working toward across turns" } }, { @@ -6082,7 +6092,7 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.7.1", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", @@ -6096,6 +6106,11 @@ "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + }, + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched whole-word 'moa|mixture|ensemble' in lib/, src/ and exapp/llm-runner/src at 5277c0d: none; one run calls one resolved provider (lib/Service/Engine/ResponseGenerationHandler.php:229)" } }, { @@ -6105,7 +6120,7 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.4.3", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", @@ -6119,6 +6134,11 @@ "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + }, + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'credential.?pool|key.?rotat|next key' in lib/, src/ and exapp/llm-runner/src at 5277c0d: none; provider keys sit in the broker, one credential per provider (lib/Service/Llm/BrokerHttpClient.php:9-12), and a provider 429 is surfaced as an error (lib/Service/Llm/ProviderFactory.php:2288), not rotated" } }, { @@ -6128,7 +6148,7 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/12238", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", @@ -6142,7 +6162,13 @@ "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" - } + }, + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/registry.js:41,134 mounts AgentVersionHistoryDialog on the agent detail page; src/api/agents.js:217 rollbackAgentVersion -> lib/Controller/AgentVersionController.php owner-only rollback; src/api/skills.js:387 rollbackSkill. Searched 'backup|snapshot' in lib/Controller, src/views, src/api: no whole-data backup" + }, + "reachedOn": "/agents/:id AgentDetail -> Version history (AgentVersionHistoryDialog) -> Roll back" }, { "id": "dm-remote-agent", @@ -6151,7 +6177,7 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/689", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", @@ -6165,6 +6191,11 @@ "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + }, + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'a2a|agent2agent|remote.?agent|peer' in lib/Service/DelegationService.php and lib/Mcp at 5277c0d: delegation targets only agents in the same organisation on this instance (DelegationService.php:6-12 same-organisation check); OutsideAgentController is inbound only" } }, { @@ -6174,7 +6205,7 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/31802", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", "hermes-agent": "no", "copilot-studio": "unknown", @@ -6188,6 +6219,11 @@ "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + }, + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'rate.?limit|throttl|per.?minute' in lib/Service/BudgetService.php and lib/Service/Llm at 5277c0d: only provider 429 handling (lib/Service/Llm/ProviderFactory.php:829,2288-2300); budgets cap tokens and euros per period, not requests per minute" } }, { @@ -6197,7 +6233,7 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/17565", - "hermiq": "unknown", + "hermiq": "yes", "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", @@ -6211,7 +6247,13 @@ "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" - } + }, + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/modals/AgentFormModal.vue:161-165 Temperature (0-2) field, mounted via src/customComponents.js:28,114 as the agents index form-dialog; lib/Service/Engine/ResponseGenerationHandler.php:237-239,286 reads agent.temperature and applies it to the provider call" + }, + "reachedOn": "/agents -> New or Edit agent (AgentFormModal, form-dialog slot) -> Temperature field" }, { "id": "dm-project-memory", @@ -6220,7 +6262,7 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/16833", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", @@ -6234,7 +6276,13 @@ "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" - } + }, + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Service/MemoryService.php:137 memory is one object per agent, tenant-scoped; a separate agent per project gives separate memory but there is no project scope and no shared layer beside it (lib/Settings/hermiq_register.json Memory schema has no project or scope property)" + }, + "reachedOn": "/agents/:id -> Memory widget (AgentMemory)" }, { "id": "dm-cross-channel", @@ -6257,7 +6305,8 @@ "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" - } + }, + "note": "not checked: lib/Settings/hermiq_register.json Session.talkRoomOrigin shows a Hermiq chat session can own or bind a Talk room, so one session spans the Chat page and Talk; whether a user can pick up in the Chat page a session begun in Talk was not traced to a page" } ], "pending": [ From b4127d6eeb2d2e87b595fdb629ef331bef7a639a Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 16:05:58 +0200 Subject: [PATCH 05/12] chore(parity): fold the dify source reading, its sources object and nine rows mined from its changelog and issues --- openspec/parity/capabilities.json | 384 +++++++++++++++++++++++++----- 1 file changed, 322 insertions(+), 62 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 1684f0f1a..8d3261d34 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -98,11 +98,45 @@ "key": "dify", "name": "Dify", "vendor": "LangGenius", - "readOn": "2026-07-23", + "readOn": "2026-09-26", "columnAddedOn": "2026-09-26", "evidenceGrade": "docs-only", - "readHow": "11 curated feature rows (competitor id 1398, captured 2026-07-03) plus 201 release-note rows (up to v1.16.0, captured 2026-07-23) in the intelligence database; nobody has driven Dify", - "unknownReason": "not covered by the 11 curated Dify feature rows or its 201 release-note rows in the intelligence database (captured 2026-07-03 and 2026-07-23); nobody has driven Dify for this row" + "readHow": "source read at 1.17.1 (8387590, shallow clone of github.com/langgenius/dify), not driven: api/, web/ (pages and i18n), dify-agent/ and the Agent v2 layer, tests; the official and community plugin repos (langgenius/dify-official-plugins, langgenius/dify-plugins) were read on main, not at a tag, and a capability that exists only as a marketplace plugin is rated partial; enterprise or Cloud plan gates (RBAC_ENABLED, MODEL_LB_ENABLED, billing flags) are named per cell; no instance booted", + "unknownReason": "source read at 1.17.1, not driven: the code reading could not settle this row", + "sources": { + "docs": "https://docs.dify.ai", + "sourceRepo": "https://github.com/langgenius/dify", + "featurePage": "https://docs.dify.ai/en/getting-started/readme/features-and-specifications", + "featureRequests": "https://github.com/langgenius/dify/issues?q=label%3A%22%F0%9F%92%AA+enhancement%22", + "issueTracker": { + "url": "https://github.com/langgenius/dify/issues", + "featureLabel": "💪 enhancement" + }, + "roadmap": "https://roadmap.dify.ai/roadmap", + "changelog": "https://github.com/langgenius/dify/releases", + "apiReference": "https://docs.dify.ai/en/api-reference", + "marketplace": "https://marketplace.dify.ai", + "pricing": "https://dify.ai/pricing", + "accessibilityStatement": null, + "securityDocs": "https://github.com/langgenius/dify/security/policy", + "demoInstance": "https://cloud.dify.ai", + "community": { + "discussions": "https://github.com/langgenius/dify/discussions", + "discord": "https://discord.gg/FngNHpbcY7" + }, + "reviews": "https://www.producthunt.com/products/dify-ai/reviews", + "videos": "https://www.youtube.com/@dify_ai/videos", + "caseStudies": "https://dify.ai/blog?category=case-study", + "partnerDirectory": "https://dify.ai/partner", + "trainingCurriculum": "https://docs.dify.ai/en/learn", + "jobPostings": "https://github.com/langgenius/dify/discussions/25843", + "tenders": null, + "nullReasons": { + "accessibilityStatement": "https://dify.ai/accessibility returns 404; release 1.15.0 notes accessibility polish but no statement page found in docs or site", + "tenders": "searched the intelligence database on 2026-09-26 (tenders name, description and keywords, and requirements text_nl/text_en, word-boundary match on 'dify'): no tender names it" + }, + "notes": "roadmap.dify.ai is a Featurebase board, its items did not render without sign-in; G2 (g2.com/products/dify-ai/reviews) returned 403 to fetch so Product Hunt is given; caseStudies is the blog case-study category (dify.ai/case-study 404s); partner page is the partner programme with a 'Find a Partner' section; trainingCurriculum is the docs Learn/Key Concepts section; jobPostings is the 'Careers of Dify' GitHub discussion (dify.ai/careers 404s)" + } }, { "key": "n8n", @@ -5874,11 +5908,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:5-25 inbound A2A endpoint with Agent Card; plugins/platforms/a2a/security.py:1-4 peer identity from credentials (A2A_PEER_TOKENS token -> name), trusted-peer allow-list, JSONL audit, injection filtering; gateway/slash_access.py:1-10 command lists per user id Note: Outside agents can be registered and admitted by token; their tasks run in the agent's session with its full toolset, with no per-peer tool scope or run-as identity." + "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:5-25 inbound A2A endpoint with Agent Card; plugins/platforms/a2a/security.py:1-4 peer identity from credentials (A2A_PEER_TOKENS token -> name), trusted-peer allow-list, JSONL audit, injection filtering; gateway/slash_access.py:1-10 command lists per user id Note: Outside agents can be registered and admitted by token; their tasks run in the agent's session with its full toolset, with no per-peer tool scope or run-as identity.", + "dify": "source read at 1.17.1, not driven: api/controllers/openapi/oauth_device.py:103-129 RFC 8628 device flow issues bearer tokens that act as the approving account, scoped by api/libs/oauth_bearer.py:60-65 (apps:run, apps:read, workspace:*); clients allowed only via env OPENAPI_KNOWN_CLIENT_IDS (api/configs/feature/__init__.py:639-646, default difyctl); per-app API keys (api/controllers/console/apikey.py:236) and MCP server per app (api/controllers/mcp/mcp.py:44) Note: no UI to register an outside agent; scope is per-app or coarse token scopes, not a per-tool allowlist" } }, { @@ -5901,12 +5936,13 @@ "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", - "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 USER.md holds the user's preferences and style and loads every session; hermes_cli/commands.py:163 /personality, :207 /busy, :176 /verbose, :170 /timestamps; web/src/pages/ConfigPage.tsx config editor Note: Preferences are per profile; separate people get separate preferences only through separate profiles or a user-modelling memory provider." + "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 USER.md holds the user's preferences and style and loads every session; hermes_cli/commands.py:163 /personality, :207 /busy, :176 /verbose, :170 /timestamps; web/src/pages/ConfigPage.tsx config editor Note: Preferences are per profile; separate people get separate preferences only through separate profiles or a user-modelling memory provider.", + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/account.py:376,394,412 account settings are only interface language, theme and timezone; searched 'custom instruction|personal instruction|about you|user preference' in web/i18n/en-US, api/controllers and dify-agent/src: only conversation variables that a builder defines per conversation (web/i18n/en-US/workflow.json:113) Note: no per-person settings for how agents behave" } }, { @@ -5921,14 +5957,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: agent/chat_completion_helpers.py:445-453 provider_routing.data_collection ('deny') plus only/ignore provider lists sent to OpenRouter; hermes_cli/model_data_policy_guard.py:23-55 warns before selecting a tier that trains on prompts (Meta contributor only rule); hermes_cli/models_local.py:1-5 local models keep data in house Note: Controls exist per provider route and by choosing local models; nothing guarantees it across all configured providers.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'fine.?tun|train on|zero data|data retention' in api/core, api/services and web/i18n/en-US: Dify itself trains nothing and self-hosting lets the organisation pick any provider, including local models via plugins; api/configs/feature/__init__.py:835-845 community telemetry is anonymous and can be disabled. No per-provider no-training guarantee or setting in the product Note: depends on the chosen model provider's terms, nothing in the product enforces or records it", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" } @@ -5945,14 +5981,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 tool progress shows each step taken; hermes_cli/commands.py:190-192 /reasoning show displays model reasoning summaries (agent/reasoning_summaries.py); agent/turn_explainers.py:1-4 explains why a turn ended without an answer; web/src/pages/SessionsPage.tsx full transcript Note: Steps and reasoning can be shown; there is no plain-language account of how an outcome came about for a reviewer who keeps the final say.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/reasoning-panel.tsx, workflow-process.tsx and tool-detail.tsx show the model's reasoning, each workflow step and tool call under an answer; citation popup names source documents (web/app/components/base/chat/chat/citation/popup.tsx:31); Human Input node lets a person confirm before the next step (web/i18n/en-US/workflow.json:46) Note: raw trace and sources, not a generated plain-language explanation of the outcome", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" } @@ -5969,14 +6005,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: searched 'only answer from|answer only|grounded only|restrict.{0,20}sources' in agent/ tools/ hermes_cli/: none that constrains answers to a document set; tools/website_policy.py:1-5 blocklists sites and hermes_cli/web_routers/tools.py:280 toolset toggles can remove web tools, but nothing limits answers to validated documents Note: A profile can be narrowed by removing tools and by SOUL.md wording; nothing enforces it.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: answers can be grounded in a curated knowledge base, but the limit is only a prompt: api/core/prompt/prompt_templates/advanced_prompt_templates.py:1 'Use the following context as your learned knowledge ... If you don't know, just say that you don't know'; annotation reply returns curated answers above a score threshold (api/controllers/console/app/annotation.py:170,199; web/i18n/en-US/app-debug.json:40-47) Note: no hard switch that blocks answers outside validated documents, and no validated flag on documents", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" } @@ -5993,14 +6029,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/tips.py:1-3 tips at CLI session start; tools/tour_tool.py:1-5 agent-led guided tours of the desktop UI; hermes_cli/journey.py:1 `hermes journey` timeline of what Hermes learned; web/src/pages/DocsPage.tsx:1 docs link in the dashboard Note: Help teaches how to use Hermes, not AI literacy (limits, risks, verification) as training modules.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:203 Help, Learn Dify and :620,643-647 step-by-step tour with hands-on lessons on workflows and agents (api/controllers/console/onboarding.py:56); searched 'ai literacy|limitations|hallucinat|responsible' in web/i18n/en-US: nothing explains AI risks or limits to end users Note: product lessons for builders only", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" } @@ -6017,14 +6053,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: searched '\\bbias\\b|fairness' in agent/ tools/ hermes_cli/ evals/: only ranking bias in tools/session_search_tool.py:693 and a fairness comment in evals/; no bias test runner or stored results", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'bias|fairness|evaluation|test case' in api/controllers, api/services and web/i18n/en-US: no hits beyond external tracer blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix); no scheduled test runs of agents and no stored bias result", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" } @@ -6040,14 +6076,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:459 `hermes kanban` durable task board shared across profiles; hermes_cli/kanban_db.py:1249 create_task, :2263 claim_task, :2558 reclaim_task, :2723 complete_task; tools/kanban_tools.py:112 kanban_complete/kanban_block agent tools, :237 kanban_comment hand-off between tasks.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'board|claim|kanban|task queue|hand.?off' in web/i18n/en-US/agent-v-2.json, workflow.json and dify-agent/src: no shared task board; agents meet only as nodes in a designed workflow (api/core/workflow/nodes/agent_v2) or as tools (fl-subagent)", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" }, @@ -6068,14 +6104,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:117 /goal 'Set a standing goal Hermes works on across turns until achieved'; gateway/slash_commands_goals.py:37 handler in every messaging channel; hermes_cli/goals.py:397 GoalState, :344 GoalGate shell checks, :860 goal_judge model call decides done.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:20 Loop node with :804 'Loop Termination Condition' and :815 maximum loop count, so a builder can wrap an Agent node in a loop that repeats until a check holds; searched 'goal|until|stop condition' in dify-agent/src: an agent itself has no standing goal across turns Note: only as a builder-designed loop inside one workflow run, not across conversation turns", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" }, @@ -6096,14 +6132,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:134 /moa runs a prompt through the Mixture of Agents preset; agent/moa_loop.py:1 reference models gathered before each iteration, aggregator answers; hermes_cli/subcommands/moa.py:10 `hermes moa configure`; hermes_cli/web_routers/models.py:204 GET /api/model/moa for the dashboard.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app-debug.json:31 'Debug as Multiple Models' shows several models side by side, for builder testing only; in a workflow a builder can run several LLM nodes on parallel branches (workflow.json:152 Add Parallel Node, :19 blocks.llm) and merge with a further LLM node or Variable Aggregator (:34) Note: no built-in ensemble setting; hand-built in a flow", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" }, @@ -6124,14 +6160,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/auth.py:10 `hermes auth add` pooled credentials; agent/credential_pool.py:122 least_used strategy, :1941 select, :2221 mark_exhausted_and_rotate; agent/agent_runtime_helpers.py:895 the turn rotates to the next key on a quota or auth failure. Note: distinct from mo-failover (second provider) and mo-key-broker (central store): same provider, many keys.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:387-390 model Load balancing: several credentials per model, round-robin, 1-minute cooldown when rate limited; api/core/model_manager.py:208,440-476 _round_robin_invoke and cooldown on InvokeRateLimitError; api/configs/feature/__init__.py:813-815 MODEL_LB_ENABLED (default False) read in api/services/feature_service.py:115 Note: self-hosted turns it on with an env flag; on Cloud it is plan-gated (common.json:442 'Upgrade your plan to enable Load Balancing')", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" }, @@ -6152,14 +6188,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/backup.py:10 `hermes backup` zips ~/.hermes, hermes_cli/backup.py:671 run_backup, :993 run_import; hermes_cli/cli_commands_mixin.py:805 /snapshot list|create|restore; hermes_cli/update_cmd_maint.py:692 automatic snapshot only before an update. No scheduled backup job and no version history (grep backup in cron/: only fallback-provider copy). Note: issue open; automatic backups are limited to the pre-update snapshot.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: per-object version restore only: agents (api/controllers/console/agent/roster.py:1302), workflows (billing.json:167-168, plan-gated on Cloud) and skills (skill.json:153-157); searched 'backup' in api/, web/i18n/en-US and docker/: only docker/dify-env-sync.sh backing up the .env file (docker/README.md:151-159); no automatic backup of all agent data Note: no platform backup; restore of single agent or workflow versions", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" }, @@ -6181,14 +6217,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:6 bundled A2A plugin, outbound a2a_discover/a2a_call/a2a_orchestrate; plugins/platforms/a2a/tools.py:173 a2a_call sends a task to a configured peer or URL and returns the reply, :255 a2a_orchestrate; :330 tools appear only once a2a_agents or the platform is configured. Note: issue #689 is still open but the A2A plugin shipped in core covers remote delegation; config-gated, off by default.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: a remote agent can be reached only as a tool: MCP servers added as tool providers (api/controllers/console/workspace/tool_providers.py:1373), custom OpenAPI tools (:685) or an HTTP Request node (web/i18n/en-US/workflow.json:11); searched 'a2a|remote agent|agent.?card' in api/core and web/i18n/en-US: no agent-to-agent protocol Note: works through MCP or HTTP wrappers, no native remote agent hand-off", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" }, @@ -6209,14 +6245,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: searched 'requests_per_minute|rpm|token_bucket|throttle|rate_limit_delay' in agent/, run_agent.py, hermes_cli/: agent/rate_limit_tracker.py:181 only displays provider RPM headers; rate_limit_delay is accepted in hermes_cli/config.py:993 and hermes_cli/config_providers.py:260 but nothing in agent/ reads it. No client-side limiter. Note: a config key nothing reads, so no. Same demand in #58061.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 max_active_requests caps concurrent requests per app, enforced in api/services/app_generate_service.py:153,384; provider rate limits are only handled reactively by load-balancing cooldown (api/core/model_manager.py:469-476); searched 'per.?minute|rpm' in api/configs and api/core/model_manager.py: per-minute limits exist only for the openapi token and forms (api/configs/feature/__init__.py:1063) Note: concurrency cap, not requests per minute to a provider", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" }, @@ -6237,14 +6273,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: no temperature key in hermes_cli/config*.py (grep temperature hermes_cli: none for the main agent); agent/chat_completion_helpers.py:1416 only fixed per-model temperatures; a custom provider's extra_body (hermes_cli/config.py:993, applied at agent/agent_runtime_helpers.py:1937) can pass one; MoA presets have reference/aggregator temperature (hermes_cli/web_models.py:152). Note: issue open; only indirect paths.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 ModelParameterModal per agent renders the provider's parameter rules including temperature (web/app/components/header/account-setting/model-provider-page/model-parameter-modal/__tests__/presets-parameter.spec.tsx); LLM nodes and classic apps use the same modal", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" }, @@ -6266,14 +6302,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:39 memory dir is per profile (HERMES_HOME/memories), so a profile per project gives separate memory but no shared layer; agent/prompt_builder.py:139 project .hermes.md/HERMES.md is read-only context; agent/skill_utils.py:437 project-local skills. Searched 'project.scoped|memory_scope' in agent, tools, plugins/memory: none. Note: issue open.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 agent working directories are owned per workflow run, conversation or build draft only; searched 'project' in web/i18n/en-US/agent-v-2.json and dify-agent/src: no project scope and no memory split into project and shared parts", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" }, @@ -6295,18 +6331,234 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands_session.py:862 /resume, :323 a stored session is only resumable from the same platform and thread, :303 cross-origin resume only for an explicitly configured admin with --all; all sessions share one state.db so the local CLI can reopen them. Note: issue open; cross-channel is admin-only in the gateway.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "dify": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:124-128 a caller resumes a conversation by passing conversation_id with the same user id, so two self-built channels on the Service API can share one thread; conversations are filtered by end user (api/services/conversation_service.py:56-57) and the web app session is a separate end user, so nothing carries over between the web app and a messenger plugin Note: only by a builder passing ids through the API", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" }, "note": "not checked: lib/Settings/hermiq_register.json Session.talkRoomOrigin shows a Hermiq chat session can own or bind a Talk room, so one session spans the Chat page and Talk; whether a user can pick up in the Chat page a session begun in Talk was not traced to a page" + }, + { + "id": "dm-build-snapshot", + "area": "agents", + "name": "Start every run of a published agent from the exact files and installed tools it had when it was built.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/langgenius/dify/releases/tag/1.17.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "yes", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/models/agent.py:218 AgentHomeSnapshot captured when a build is applied; release 1.17.0 'Build-time Home Snapshots' restores the sandbox home on each published run", + "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-install-cli-tool", + "area": "tools", + "name": "Let an agent install a command line tool from a package registry and use it in its runs.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/langgenius/dify/releases/tag/1.16.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "yes", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:237,251 'Add a CLI Tool', 'Install a CLI tool from any package registry. The agent gains shell access to the binary it provides'", + "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-sandbox-choice", + "area": "operations", + "name": "Choose whether an agent's shell and code run on the own server or in a hosted cloud sandbox.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/langgenius/dify/releases/tag/1.17.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "yes", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: docker/.env.example:271 DIFY_AGENT_RUNTIME_BACKEND=local, docker/docker-compose.e2b.yaml ships the E2B backend; web/i18n/en-US/agent-v-2.json:91 notes the limits of the community local sandbox", + "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-approval-api", + "area": "oversight", + "name": "Answer a waiting approval step from another program through the API.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/langgenius/dify/releases/tag/1.14.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "yes", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/human_input_form.py:78 /form/human_input/; api/controllers/openapi/human_input_form.py:63,83 read and submit a human input form", + "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-named-approvers", + "area": "oversight", + "name": "Name the people who must answer a human approval step, so nobody else can.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/langgenius/dify/issues/42496", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "partial", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:558-561 the approval form can be emailed to chosen workspace members or external recipients, but searched 'assignee|approver' in workflow.json and api/controllers/web/human_input_form.py: whoever holds the form link can answer", + "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-context-meter", + "area": "chat", + "name": "See how full the agent's context window is while chatting.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/langgenius/dify/issues/42309", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "no", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'context usage|context window|tokens used' in web/i18n/en-US/agent-v-2.json, share.json and app-debug.json: no indicator; compaction runs silently (dify-agent/src/dify_agent/runtime/compaction.py)", + "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-folders", + "area": "operations", + "name": "Sort agents and flows into folders.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/langgenius/dify/issues/42638", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "partial", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:667-669 apps can carry tags (permission-keys.json app.tag.manage) to filter the list; no folders", + "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-run-compare", + "area": "observability", + "name": "Compare two runs of a flow side by side to see what changed.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/langgenius/dify/issues/41864", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "no", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'compare' in web/i18n/en-US/workflow.json and run-log.json: run history opens one run's tracing at a time (workflow.json:240-254), no comparison view", + "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-claimed-tool-call", + "area": "oversight", + "name": "Flag an answer when the agent claims a result without calling the tool it needed.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/langgenius/dify/issues/40672", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "no", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: issue is open against the function-calling agent runner; searched 'fabricat|expected tool|zero tool call' in api/core/agent and dify-agent/src: no check", + "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" } ], "pending": [ @@ -6330,12 +6582,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "partial", "open-webui": "unknown", "evidence": { "n8n": "docs-only: competitor_features#38153 \"core: Bind dynamic credential tokens to a user ID: From n8n@2.32.0 (2026-07-21)\"", - "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 a requester's user id can route to their own profile, whose own keys and credentials then apply (agent/secret_scope.py:1-10); tools/environments/ssh.py runs the terminal as a configured remote account; searched 'run.?as|impersonat|service account|on behalf of' in agent/ and gateway/: no per-run identity choice Note: Tools act with the host or backend account and the profile's keys; choosing requester, owner or service identity per agent is not a setting." + "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 a requester's user id can route to their own profile, whose own keys and credentials then apply (agent/secret_scope.py:1-10); tools/environments/ssh.py runs the terminal as a configured remote account; searched 'run.?as|impersonat|service account|on behalf of' in agent/ and gateway/: no per-run identity choice Note: Tools act with the host or backend account and the profile's keys; choosing requester, owner or service identity per agent is not a setting.", + "dify": "source read at 1.17.1, not driven: api/core/agent/entities.py:19 each agent tool carries a credential_id the builder picks; api/models/tools.py:121 credential visibility, web/i18n/en-US/plugin.json:27 an OAuth credential is 'only for you or shared with all workspace members'. So a tool runs as the builder's or a shared workspace credential; searched 'on_behalf|end_user credential|user_credential' in api/core/tools and api/core/plugin: no run-as-the-asking-person Note: owner or shared credential only, no per-caller identity and no service-account concept" }, "pendingReason": "Whether actingUser is set anywhere outside seed/repair scripts on a live instance could not be settled without running the app." }, @@ -6359,11 +6612,11 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "yes", + "dify": "no", "n8n": "unknown", "open-webui": "partial", "evidence": { - "dify": "docs-only: competitor_features#38723 \"Collaboration Beta adds shared editing, comments, and @ mentions: From 1.14.0-rc1: New Agent x Skills for Production Workflows (2026-02-14)\"", + "dify": "source read at 1.17.1, not driven: api/services/conversation_service.py:56-57,179-180 every conversation is filtered to one from_end_user_id or from_account_id; api/controllers/web/conversation.py lists, renames, pins and deletes only the caller's own conversations; the Collaboration feature is live co-editing of the workflow canvas (api/controllers/console/socketio/workflow.py, web/i18n/en-US/workflow.json:118,986 collaborator cursors) Note: old yes rested on the Collaboration beta, which is shared canvas editing for builders, not a shared chat", "open-webui": "docs-only: competitor_features#38758 \"Share folders with your team: share a folder and the chats inside it with specific users, groups, or everyone, with read or write access; people you share with see shared folders in their sidebar and open the chats in a read-only view when they are not the owner\"", "hermes-agent": "source read at v2026.9.24, not driven: gateway/config.py:574-596 thread_sessions_per_user false by default, so everyone in a thread shares one session with the agent (group_sessions_per_user can be switched off for whole groups); gateway/session.py:634-641 session key resolution; hermes_cli/commands.py:76 /branch opens a shared thread" }, @@ -6390,12 +6643,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "pendingReason": "Whether another app relays anonymous citizens into this endpoint as an authenticated service account could not be settled from this repo alone.", "evidence": { - "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:35 _ALLOW_ALL_USERS lets anyone message the bot on WhatsApp, SMS, Telegram and others without an account; gateway/run_inbound_unauthorized.py:1-9 strangers otherwise get a pairing code; searched 'intake|case|file.{0,10}request' in gateway/ and tools/: no intake flow that files a request Note: A public bot is possible; filing the request somewhere is left to whatever tools the agent has." + "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:35 _ALLOW_ALL_USERS lets anyone message the bot on WhatsApp, SMS, Telegram and others without an account; gateway/run_inbound_unauthorized.py:1-9 strangers otherwise get a pairing code; searched 'intake|case|file.{0,10}request' in gateway/ and tools/: no intake flow that files a request Note: A public bot is possible; filing the request somewhere is left to whatever tools the agent has.", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app.json:2 web app access 'Anyone with the link'; api/controllers/web/passport.py:53-72 issues a token to an anonymous end-user session, so a resident chats without an account; filing the request needs a builder-built HTTP Request node or custom tool (web/i18n/en-US/workflow.json:11,45); no ready-made intake to a case or request system in core Note: anonymous chat is core; the filing target has to be wired by hand" } }, { @@ -6417,12 +6671,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "yes", - "dify": "yes", + "dify": "partial", "n8n": "yes", "open-webui": "unknown", "evidence": { "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", - "dify": "docs-only: competitor_features#30990 \"Tools/plugins marketplace: Plugin ecosystem of tools/connectors.\"", + "dify": "source read at 1.17.1, not driven: core ships only audio, code, time and webscraper tools (api/core/tools/builtin_tool/providers/); connectors come from the in-product Dify Marketplace: about 149 official tool plugins (langgenius/dify-official-plugins tools/, e.g. slack, jira, notion, gmail, salesforce, nextcloud) plus about 1,290 community packages (langgenius/dify-plugins), installed from web/app/(commonLayout)/integrations; MCP client too Note: rated partial only by the brief's plugin rule; the catalogue is well over a hundred ready-made connectors, one click from the core UI. The lane keeps partial under the plugin rule (ruling 2026-09-26).", "n8n": "docs-only: competitor_features#31095 \"400+ app connectors: Large library of prebuilt integration nodes.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/connectors/__init__.py:1-6 and tools/connectors/gateway/client.py:1-3 managed connector accounts through the Nous tool gateway; optional-mcps/ 65 Nous-approved MCP servers (asana, atlassian, notion, stripe, supabase, ...); plugin-catalog/ ~290 curated plugins Note: The managed connector set needs a Nous account; the MCP and plugin catalogs are self-configured." }, @@ -6447,13 +6701,13 @@ "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "partial", - "dify": "yes", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31881 \"Context Chat (RAG over Nextcloud data): RAG over Files, Collectives and Analytics\"", "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", - "dify": "docs-only: competitor_features#30988 \"RAG pipeline & knowledge base: Built-in document ingestion + retrieval.\"", + "dify": "source read at 1.17.1, not driven: knowledge bases from uploaded files (api/controllers/console/datasets/datasets_document.py:384) and datasource plugins; official datasources are S3, Azure, Box, Dropbox, Google Drive, OneDrive, SharePoint, Confluence, Notion, GitHub, GitLab and others, no Nextcloud (langgenius/dify-official-plugins datasources/); only the official nextcloud tool plugin can download_file at run time (tools/nextcloud/tools/download_file.yaml) Note: old yes rested on generic RAG; Nextcloud Files is not a knowledge source, only a plugin tool fetch", "open-webui": "docs-only: competitor_features#31813 \"RAG document ingestion / knowledge base: Upload docs and chat over them with retrieval\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file and search_files let the agent read and grep documents on the host on demand; gateway/platforms/base.py:1183-1231 attached documents are read into the turn; searched 'nextcloud' repo-wide: none, and no document index in core (RAG only via plugins/memory/retaindb, openviking) Note: Grounding in local files by reading them, not in Nextcloud Files and not through an index." }, @@ -6479,12 +6733,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "yes", "evidence": { "open-webui": "docs-only: competitor_features#38816 \"File ownership in folder and knowledge attachments: Attaching files to folders or knowledge bases now verifies per-file read access, and folder file lists in chat middleware are filtered to entries the caller can read, preventing unauthorized file content from being injected into RAG context.\"", - "hermes-agent": "source read at v2026.9.24, not driven: searched 'acl|permission.{0,20}(user|requester)|allowed to see' in tools/file_tools*.py, tools/session_search_tool.py and agent/: file access follows the host account and tools/file_tools_write_guards.py protects Hermes' own files, not per-requester visibility; tools/session_search_tool.py:1-9 searches the whole profile's sessions Note: All users of one profile share what the agent can read; nothing filters by the asking person." + "hermes-agent": "source read at v2026.9.24, not driven: searched 'acl|permission.{0,20}(user|requester)|allowed to see' in tools/file_tools*.py, tools/session_search_tool.py and agent/: file access follows the host account and tools/file_tools_write_guards.py protects Hermes' own files, not per-requester visibility; tools/session_search_tool.py:1-9 searches the whole profile's sessions Note: All users of one profile share what the agent can read; nothing filters by the asking person.", + "dify": "source read at 1.17.1, not driven: api/models/dataset.py:163,184-187 dataset permission (only_me, all_team, partial_members) governs which builders may attach a knowledge base, not what the end user may see; retrieval does not check the asking person. A builder can hand-build a manual metadata filter bound to a variable (api/core/workflow/nodes/knowledge_retrieval/entities.py:46-48, knowledge_retrieval_node.py:312-327 convert_template) Note: no document ACL trimming; only a hand-built metadata filter per flow" }, "pendingReason": "Needs checking OpenRegister's ObjectService/ACL enforcement for the session identity the chat request actually runs under; out of scope for a hermiq-only read." }, @@ -6512,7 +6767,7 @@ "open-webui": "unknown", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_builder.py:1656-1661 loads .hermes.md, AGENTS.md chain, CLAUDE.md and .cursorrules as instructions; hermes_cli/commands.py:234 /init generates AGENTS.md from a repo scan; SOUL.md per profile (web/src/pages/ProfilesPage.tsx:556); skills as SKILL.md documents Note: Old partial; document instructions are core.", - "dify": "docs-only: competitor_features#38720 \"Skill Editor helps you build reusable SOP blocks: and call tools inline with @ (e.g., @send_email).\"" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:106 agent Files 'for reference material too long to paste into the Prompt: specs, templates, guidelines', :274 persistent in every run; workspace Skills are versioned Markdown SKILL.md packages with files (api/models/skill.py:56-66; web/i18n/en-US/skill.json referenceFiles.livePlaceholder) attached per agent (api/controllers/console/workspace/skills.py:811)" }, "pendingReason": "hermiq-context-documents change (assembler + editor) is open, not implemented -- the schema field exists but nothing reads or writes it yet." }, @@ -6535,12 +6790,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "pendingReason": "The spec's own e2e-exclude note says no committed Playwright fixture provisions a second organisation, and a live shared hub needs an OpenConnector connector not configured by default -- cross-org sharing works as a manual paste/GitHub install, not a live in-instance marketplace browse.", "evidence": { - "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_sync_client_org.py:1-7 org-shared skills under ~/.hermes/skills/_org// with pull and propose; tools/skills_sync_client.py:6-8 the sync is INERT unless the user is a Nous portal admin (pre-launch gate); hermes_cli/subcommands/profile.py:20-23 --clone copies skills to another profile Note: Org skill sharing exists in code but is switched off for ordinary users; profiles on one install share by cloning." + "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_sync_client_org.py:1-7 org-shared skills under ~/.hermes/skills/_org// with pull and propose; tools/skills_sync_client.py:6-8 the sync is INERT unless the user is a Nous portal admin (pre-launch gate); hermes_cli/subcommands/profile.py:20-23 --clone copies skills to another profile Note: Org skill sharing exists in code but is switched off for ordinary users; profiles on one install share by cloning.", + "dify": "source read at 1.17.1, not driven: api/models/skill.py:62,66 skills are unique per tenant_id (workspace); api/controllers/console/workspace/skills.py:494 export and :385 import (web/i18n/en-US/skill.json:224 '.zip with SKILL.md, agentskills.io format') copy a skill into another workspace; searched 'share' in skill.json and skills.py: no live cross-workspace sharing Note: copy by export/import only, updates do not follow" } }, { @@ -6568,7 +6824,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions, /v1/responses, /v1/models plus /v1/runs, /api/sessions and /api/jobs with API_SERVER_KEY; gateway/platforms/api_server_runs.py run lifecycle; per-profile paths /p//", - "dify": "docs-only: competitor_features#30995 \"API-first backend: Every app exposed as a backend API.\"", + "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:324 POST /v1/chat-messages and :175 completion-messages with per-app API keys (api/controllers/console/apikey.py:236); web/i18n/en-US/agent-v-2.json agentDetail.access.serviceApi 'Backend Service API' with API Reference per agent; client SDKs in sdks/nodejs-client, sdks/php-client", "n8n": "docs-only: competitor_features#3909 \"core: Add missing fields to public API workflow schema: From n8n@2.14.0 (2026-03-24)\"", "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"" }, @@ -6594,12 +6850,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "pendingReason": "Live publish success depends on OpenCatalogi being installed and reachable; could not verify a live 200 without running the app.", "evidence": { - "hermes-agent": "source read at v2026.9.24, not driven: searched 'algoritme|algorithm register' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none" + "hermes-agent": "source read at v2026.9.24, not driven: searched 'algoritme|algorithm register' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none", + "dify": "source read at 1.17.1, not driven: searched 'algoritme|algorithm.?regist|register|ai act' in api/, web/app and web/i18n/en-US: no hits for an algorithm register or any export to one; apps and agents carry no register fields (api/models/agent.py, api/models/model.py)" } }, { @@ -6622,12 +6879,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "no", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "pendingReason": "Could not confirm without running the app whether the generic OpenRegister index-page edit form actually renders and saves the impactAssessments array-of-object field, or whether it is write-only through occ/API.", "evidence": { - "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no link or document field for an assessment" + "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no link or document field for an assessment", + "dify": "source read at 1.17.1, not driven: searched 'dpia|impact assessment|fundamental rights|privacy assessment' in api/, web/app and web/i18n/en-US: no hits; agents have name, description, role and icon only (api/controllers/console/agent/roster.py:706), no field or link for an assessment" } }, { @@ -6650,11 +6908,12 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { - "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 batch (parallel) mode spawns several child agents at once; hermes_cli/config_defaults.py:1332-1338 delegation block; hermes_cli/kanban_swarm.py:1-8 parallel specialist workers with a verifier; optional-skills/autonomous-ai-agents/dynamic-workflow fan-outs" + "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 batch (parallel) mode spawns several child agents at once; hermes_cli/config_defaults.py:1332-1338 delegation block; hermes_cli/kanban_swarm.py:1-8 parallel specialist workers with a verifier; optional-skills/autonomous-ai-agents/dynamic-workflow fan-outs", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:152,217 'Add Parallel Node' parallel branches on the canvas; :684-702 Iteration node Parallel Mode with maximum parallelism over list items; api/configs/feature/__init__.py:949 MAX_SUBMIT_COUNT thread pool for parallel node execution; Agent nodes (blocks.agent-v2, api/core/workflow/nodes/agent_v2) can sit on each branch or inside the iteration Note: fan-out is designed in the flow; an agent cannot spawn parallel sub-agents itself at run time (see fl-subagent)" }, "pendingReason": "whether delegated sub-agent calls actually run concurrently needs a live run to confirm timing" }, @@ -6684,7 +6943,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", - "dify": "docs-only: competitor_features#30994 \"Workspaces & RBAC: Team workspaces with member roles.\"", + "dify": "source read at 1.17.1, not driven: api/models/account.py:21-26 workspace roles owner, admin, editor, normal, dataset_operator; web/i18n/en-US/common.json:224 admin 'Can build apps & manage team settings', :234 editor 'Can build & edit apps', :267 normal 'Only can use apps'; api/controllers/console/workspace/members.py:368 change a member's role Note: enterprise-licensed RBAC (api/configs/enterprise/__init__.py:38 RBAC_ENABLED) adds custom roles and per-agent permission sets (web/i18n/en-US/permission-keys.json); the basic roles are in community", "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", "open-webui": "docs-only: competitor_features#31811 \"Role-Based Access Control (RBAC): Built-in RBAC with user groups and model access controls\"", "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_access.py:1-27 per platform allow_admin_from (all commands) vs user_allowed_commands for other allowed users; gateway/authz_mixin.py:32-37 allowlists decide who may chat; plugins/dashboard_auth/basic/__init__.py:1-8 the dashboard has one username and every signed-in user has full control (hermes_cli/dashboard_auth/base.py:12-16 no role field) Note: Two chat roles (admin, user) for slash commands; no builder role and no roles in the dashboard." @@ -6711,12 +6970,13 @@ "nextcloud-assistant": "unknown", "hermes-agent": "partial", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "pendingReason": "Did not verify nl.json has full key parity with en.json (that is the subject of the nl-locale-completeness spec itself).", "evidence": { - "hermes-agent": "source read at v2026.9.24, not driven: web/src/i18n/ ships af, ar, de, en, es, fr, ga, hu, it, ja, ko, pt, ru, tr, uk, zh, zh-hant; locales/*.yaml the same set for CLI and gateway strings; apps/desktop/src/i18n adds no nl either; searched for nl locale files repo-wide: none Note: The model answers in Dutch when addressed in Dutch, but dashboard, CLI and desktop text have no Dutch translation." + "hermes-agent": "source read at v2026.9.24, not driven: web/src/i18n/ ships af, ar, de, en, es, fr, ga, hu, it, ja, ko, pt, ru, tr, uk, zh, zh-hant; locales/*.yaml the same set for CLI and gateway strings; apps/desktop/src/i18n adds no nl either; searched for nl locale files repo-wide: none Note: The model answers in Dutch when addressed in Dutch, but dashboard, CLI and desktop text have no Dutch translation.", + "dify": "source read at 1.17.1, not driven: web/i18n-config/languages.ts:158-162 nl-NL 'Nederlands' marked supported; web/i18n/nl-NL has all 37 namespaces, but about 3,800 of 5,947 values are identical to en-US (e.g. workflow.json 921 of 1161, dataset-documents.json 258 of 260 untranslated), while agent-v-2, permission and skill are translated Note: Dutch is selectable, roughly two thirds of the UI still shows English" } } ] From c3b6b1cf1e1d9adc2506d677a73fb256c06026c5 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 16:32:13 +0200 Subject: [PATCH 06/12] chore(parity): fold the open-webui source reading, its sources object and nine rows mined from its discussions and releases; record the Nextcloud-phrased row rule --- openspec/parity/capabilities.json | 1301 +++++++++++++++++++---------- 1 file changed, 859 insertions(+), 442 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 8d3261d34..591b98d42 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -1,5 +1,5 @@ { - "_comment": "Hermiq capability matrix. Authored here; the cross-product index in market-intelligence is generated from it. Generated by a lane script on 2026-09-26 from authored rows, code-reading packs (two hops: route, API wrapper, calling component) and the intelligence database's competitor feature rows; see the PR body for the method, the row-source split and the column choice. Nobody has driven any competitor for this matrix.", + "_comment": "Hermiq capability matrix. Authored here; the cross-product index in market-intelligence is generated from it. Generated by a lane script on 2026-09-26 from authored rows, code-reading packs (two hops: route, API wrapper, calling component) and the intelligence database's competitor feature rows; see the PR body for the method, the row-source split and the column choice. Rule for Nextcloud-phrased rows, every competitor column (lane ruling 2026-09-26, wave 5): where a row names a Nextcloud surface (Talk, Files, Deck, admin settings, TaskProcessing), a competitor rates partial when the same kind of capability exists on its own surface, with the missing Nextcloud part named in the evidence, and no when nothing like it exists. Wave 5 re-read hermes-agent, dify, n8n, open-webui and nextcloud-assistant from their source code at a named tag (graded docs-only, 'source read at , not driven') and copilot-studio from its public documentation; rows with origin featureRequest, changelog or tender were mined from those systems' demand signals and the intelligence database. Nobody has driven any competitor for this matrix.", "comparedOn": "2026-09-26", "category": "A self-hosted platform for autonomous AI agents that lives inside Nextcloud. An organisation defines agents (instructions, model, tools, memory, skills), runs them in chat, on a schedule, from a webhook or from a flow, delivers their output into Nextcloud Talk, and governs every run: human approval, kill switches, guardrails, budgets, an audit trail on OpenRegister and an EU AI Act register. Its category is the agent platform: the ground Microsoft Copilot Studio holds for Microsoft 365 organisations, and that self-hosted builders (Dify, n8n's AI agents, Open WebUI with automations) and the Hermes agent it ports hold for teams that run their own. Inside Nextcloud the reference point a buyer already has is Nextcloud Assistant with its Context Agent, which is interactive only. It is NOT a model server (Ollama, LocalAI), an LLM observability tool (Langfuse, AgentOps), an AI governance suite (Credo AI, watsonx.governance) or a general workflow engine (Airflow, Temporal), although the intelligence database links it to all of those. If this paragraph is wrong, the columns and areas below are wrong with it: correct it here first.", "corpus": { @@ -152,11 +152,51 @@ "key": "open-webui", "name": "Open WebUI", "vendor": "Open WebUI Inc.", - "readOn": "2026-07-23", + "readOn": "2026-09-26", "columnAddedOn": "2026-09-26", "evidenceGrade": "docs-only", - "readHow": "14 curated feature rows (competitor id 1460, captured 2026-07-12) plus 150 release-note rows (v0.9.0 to v0.10.2, captured 2026-07-23) in the intelligence database; nobody has driven Open WebUI", - "unknownReason": "not covered by the 14 curated Open WebUI feature rows or its 150 release-note rows in the intelligence database (captured 2026-07-12 and 2026-07-23); nobody has driven Open WebUI for this row" + "readHow": "source read at v0.11.4 (8bd8b4f, shallow clone of github.com/open-webui/open-webui), not driven: backend routers, models, config and utils, the SvelteKit routes and components, en-US i18n, tools and functions; an agent is a workspace Model preset, with Automations, sub-agents and skills as separate objects; capabilities that sit in separate first-party repos (Open Terminal, oikb, Open WebUI Computer) or in community Functions are rated partial or no with the reason; the Open WebUI licence (branding clause) is noted on op-open-source and op-flat-cost; no instance booted", + "unknownReason": "source read at v0.11.4, not driven: the code reading could not settle this row", + "sources": { + "docs": "https://docs.openwebui.com/", + "sourceRepo": "https://github.com/open-webui/open-webui", + "featurePage": "https://docs.openwebui.com/features/", + "featureRequests": "https://github.com/open-webui/open-webui/discussions/categories/ideas", + "issueTracker": { + "url": "https://github.com/open-webui/open-webui/issues", + "featureLabel": "enhancement" + }, + "roadmap": "https://docs.openwebui.com/roadmap/", + "changelog": "https://github.com/open-webui/open-webui/blob/main/CHANGELOG.md", + "apiReference": "https://docs.openwebui.com/reference/api-endpoints", + "marketplace": "https://openwebui.com/models", + "pricing": "https://docs.openwebui.com/enterprise/", + "accessibilityStatement": null, + "securityDocs": [ + "https://docs.openwebui.com/security/", + "https://github.com/open-webui/open-webui/security", + "https://docs.openwebui.com/enterprise/security" + ], + "demoInstance": null, + "community": [ + "https://discord.com/invite/5rJgQTnV4s", + "https://www.reddit.com/r/OpenWebUI/", + "https://github.com/open-webui/open-webui/discussions" + ], + "reviews": "https://www.producthunt.com/products/open-webui", + "videos": "https://www.youtube.com/@openwebui", + "caseStudies": "https://docs.openwebui.com/enterprise/customers/", + "partnerDirectory": "https://docs.openwebui.com/enterprise/partners", + "trainingCurriculum": null, + "jobPostings": "https://careers.openwebui.com/", + "tenders": null, + "nullReasons": { + "accessibilityStatement": "docs.openwebui.com/accessibility returns 404 and the docs sitemap has no accessibility page; the repo has none either", + "demoInstance": "no public demo linked from README.md, docs.openwebui.com or openwebui.com; the product is self-hosted only", + "trainingCurriculum": "docs sitemap has how-to tutorials (docs.openwebui.com/tutorials) but no structured course or certification", + "tenders": "searched the intelligence database on 2026-09-26 (tenders name, description and keywords, and requirements text_nl/text_en, word-boundary match on 'open webui'): no tender names it" + } + } } ], "areas": [ @@ -305,11 +345,12 @@ "copilot-studio": "yes", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:18 `hermes profile create --description`; web/src/pages/ProfilesPage.tsx:442 New Profile form -> POST /api/profiles (hermes_cli/web_routers/profiles.py:704); ProfilesPage.tsx:556 edit SOUL.md (personality / system prompt) -> PUT /api/profiles/{name}/soul (profiles.py:906); web/src/pages/ProfileBuilderPage.tsx:32 builder wizard (identity, model, skills, MCPs) Note: An agent in Hermes is a profile: a name, a description and SOUL.md instructions. Old partial undersold it.", "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", - "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:706 POST /agent creates an agent with name, description, role and icon; web/features/agent-v2/roster/components/create-agent-dialog.tsx:61 and agent-form-fields.tsx:73 the create form; web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/index.tsx:1088 the Prompt (instructions) editor" + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:706 POST /agent creates an agent with name, description, role and icon; web/features/agent-v2/roster/components/create-agent-dialog.tsx:61 and agent-form-fields.tsx:73 the create form; web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/index.tsx:1088 the Prompt (instructions) editor", + "open-webui": "source read at v0.11.4, not driven: an agent is a workspace Model: src/lib/components/workspace/Models/ModelEditor.svelte:789 name, :962 description, :1055 system prompt, :856 base model; backend/open_webui/routers/models.py:285 POST /models/create; backend/open_webui/models/models.py:111 model table (id, user_id, base_model_id, params, meta)" } }, { @@ -334,10 +375,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:630 GET /agent lists every workspace agent with draft/published counts; web/features/agent-v2/roster/components/agent-roster-list.tsx:238 shows a Draft badge and :408 updated time, but no owner; only a 'Created by me' filter (roster-toolbar.tsx:90). The classic Studio list shows author (web/app/components/apps/app-card/index.tsx:175) but no status Note: list plus status, or list plus author, never both on one screen", - "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:1184-1217 profile list shows gateway running/stopped, model and skill count; hermes_cli/subcommands/profile.py:14 `hermes profile list`; hermes_cli/profiles.py:538 ProfileInfo has no owner field (name, model, provider, gateway_running, description, role only) Note: No owner column and no organisation: one operator's install lists its own profiles." + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:1184-1217 profile list shows gateway running/stopped, model and skill count; hermes_cli/subcommands/profile.py:14 `hermes profile list`; hermes_cli/profiles.py:538 ProfileInfo has no owner field (name, model, provider, gateway_running, description, role only) Note: No owner column and no organisation: one operator's install lists its own profiles.", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:808 owner name per row, :899 Enabled/Disabled switch; backend/open_webui/routers/models.py:162 GET /models/list (admins see all with BYPASS_ADMIN_ACCESS_CONTROL, :198), :245 GET /models/all admin; admin Settings > Models lists every model (src/lib/components/admin/Settings/Models.svelte)" } }, { @@ -361,10 +403,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:540-673 per-profile SOUL, description, model editing; schedules and runs sit on other pages scoped by the managing-profile selector (web/src/i18n/en.ts:103 managingProfileBanner; web/src/pages/CronPage.tsx, SessionsPage.tsx); hermes_cli/subcommands/profile.py:76 `profile show` Note: Configuration and skills per profile exist, but schedules, runs and skills are not on one agent page.", - "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/navigation.tsx:62-86 detail page with Configure (model, prompt, tools, skills, knowledge, files), Access Point, Logs, Monitoring; api/controllers/console/agent/roster.py:1133 logs. No schedules: agents have no scheduler of their own, schedules only exist as trigger nodes on workflow apps Note: schedules are missing from the agent page" + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/navigation.tsx:62-86 detail page with Configure (model, prompt, tools, skills, knowledge, files), Access Point, Logs, Monitoring; api/controllers/console/agent/roster.py:1133 logs. No schedules: agents have no scheduler of their own, schedules only exist as trigger nodes on workflow apps Note: schedules are missing from the agent page", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194-1275 config, knowledge, tools, skills, filters, capabilities on one page; schedules live apart in /automations (src/routes/(app)/automations/[id]/+page.svelte) keyed by model_id (backend/open_webui/models/automations.py:73) and per-model chats in admin analytics (routers/analytics.py:285, :343) Note: no single page joins an agent's config with its schedules and runs" } }, { @@ -388,11 +431,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/profiles.py:942 PUT /api/profiles/{name}/model called from web/src/pages/ProfilesPage.tsx:673 setProfileModel(provider, model); hermes_cli/commands.py:157 `/model` switch (session-scoped, --global persists)", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 Model field with ModelParameterModal picking provider and model per agent; classic agent apps pick the model in app config (api/controllers/console/app/model_config.py)", - "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"" + "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:856 'Base Model (From ...)' selector; backend/open_webui/models/models.py:118 base_model_id = upstream model; providers are the Ollama/OpenAI-compatible/Anthropic connections (routers/ollama.py, routers/openai.py, utils/anthropic.py)" } }, { @@ -417,11 +461,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", - "open-webui": "partial", + "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: web/features/agent-v2/permissions.ts:37 the per-agent Resource Access page is shown only when systemFeatures.rbac_enabled; api/configs/enterprise/__init__.py:38 RBAC_ENABLED default False (enterprise); community has workspace-wide roles only, every member sees every agent, and a published web app URL is open to anyone who has it Note: enterprise-licensed for per-agent me/group/org scoping", "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", - "open-webui": "docs-only: competitor_features#31811 \"Role-Based Access Control (RBAC): Built-in RBAC with user groups and model access controls\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/common/AccessControl.svelte:19 principal_type user|group|anyone; ModelEditor.svelte:600 AccessControlModal; backend/open_webui/routers/models.py:1035 POST /model/access/update; models/access_grants.py grants read/write per user or group; config.py sharing.public_models permission gates 'whole organisation' Note: old partial rested on a feature-row line; the code has private, per-user, per-group and public grants", "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:32-37 per-platform _ALLOWED_USERS / ALLOW_ALL_USERS allowlists read per profile home (authz_mixin.py:339 _authorization_home_for_source); gateway/slash_access.py:1-27 admin vs user command lists Note: Who may talk to a profile's bot is a per-platform user-id allowlist; no only-me / group / organisation visibility model and no org directory." } }, @@ -450,7 +494,7 @@ "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31612 \"Message-metered pricing: $0.01/message or $200/mo pack; cost spikes with generative/autonomous use.\"", - "open-webui": "docs-only: competitor_features#38864 \"Automation scheduling limits: Administrators can now set AUTOMATIONMAXCOUNT and AUTOMATIONMININTERVAL to limit how many automations each non-admin user can create\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:69 check_automation_limits: automations.max_count per user and automations.min_interval, admins bypass; model params max_tokens only caps one response; searched 'quota|budget|token limit|rate' in routers/models.py, models/models.py, utils/middleware.py: no per-agent run or token cap Note: limits are per user and only on scheduled runs, not per agent", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-63 agent.max_turns (turn cap) and agent.run_budget_seconds (wall-clock per run), per profile config.yaml; hermes_cli/config_defaults.py:1338 delegation.max_iterations per subagent; gateway/platforms/api_server.py:1322 api_server.max_concurrent_runs; searched 'max_cost|spend_limit|token_budget|cost_cap' in *.py: no token or run-count quota per agent Note: Caps iterations and wall clock per run, not tokens or number of runs.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 PUT /agent sets max_active_requests, enforced in api/services/app_generate_service.py:153,384 (concurrent requests per app); dify-agent/src/dify_agent/runtime/runner.py:94,403 a fixed 500-step and run-timeout limit per run. No per-agent run count or token budget Note: only a concurrency cap and a server-wide step limit, no token or run quota" } @@ -477,10 +521,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/pause.py:1-27 `hermes pause` / `hermes resume` write/remove the ESTOP sentinel; agent/estop.py:31-39 sentinel lives in the profile's $HERMES_HOME, so `hermes -p pause` holds that profile's cron, kanban and new gateway turns without deleting it; web/src/pages/ProfilesPage.tsx:1184 per-profile gateway running/stopped Note: CLI only; the dashboard shows gateway state but has no pause toggle (searched 'estop' in web/src and hermes_cli/web_routers: none).", - "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/access/components/web-app-access-card.tsx:254 and service-api-access-card.tsx:114 per-surface In service/Out of service toggles; api/controllers/console/agent/roster.py:1013 POST /agent//api-enable. No single off switch: workflows that bind the agent as a node keep running it (models/agent.py:407 WorkflowAgentNodeBinding) Note: off per access point, not per agent" + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/access/components/web-app-access-card.tsx:254 and service-api-access-card.tsx:114 per-surface In service/Out of service toggles; api/controllers/console/agent/roster.py:1013 POST /agent//api-enable. No single off switch: workflows that bind the agent as a node keep running it (models/agent.py:407 WorkflowAgentNodeBinding) Note: off per access point, not per agent", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:122 is_active soft-disable; routers/models.py:881 POST /model/toggle; src/lib/components/workspace/Models.svelte:899 Enabled/Disabled switch per model, :353 Enable All / Disable All" } }, { @@ -505,10 +550,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profiles.py:538-575 ProfileInfo fields (name, model, provider, description, display_name, role) carry no owner; searched 'owner' in hermes_cli/profiles.py and profile_identity.py: only file-permission and routing-index ownership Note: Single-operator install; no human owner per profile.", - "dify": "source read at 1.17.1, not driven: api/services/app_service.py:672 created_by is set to the creating account and api/services/app_service.py:282 filters on it ('Created by me'); no owner field that can be assigned, models/agent.py:212 only created_by/updated_by/archived_by Note: creator is recorded, not an accountable owner that can be named" + "dify": "source read at 1.17.1, not driven: api/services/app_service.py:672 created_by is set to the creating account and api/services/app_service.py:282 filters on it ('Created by me'); no owner field that can be assigned, models/agent.py:212 only created_by/updated_by/archived_by Note: creator is recorded, not an accountable owner that can be named", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:117 user_id owner; src/lib/components/workspace/Models.svelte:802-808 owner name and email shown per model, 'Deleted User' when the owner is gone; routers/models.py:948 only owner, write grantee or admin may update Note: owner is always the creator; there is no field to name a different accountable person" } }, { @@ -532,10 +578,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'owner|transfer|hand over|reassign' in hermes_cli/profiles.py and profile_cmd.py: none; hermes_cli/subcommands/profile.py:86 `profile rename` and :115 export/import move a profile, not an owner Note: No owner concept to hand over.", - "dify": "source read at 1.17.1, not driven: searched 'transfer|owner|created_by =' in api/controllers/console and api/services/app_service.py: only workspace ownership transfer exists (api/controllers/console/workspace/members.py:418 send-owner-transfer-confirm-email); no endpoint or UI reassigns an agent or app to another member" + "dify": "source read at 1.17.1, not driven: searched 'transfer|owner|created_by =' in api/controllers/console and api/services/app_service.py: only workspace ownership transfer exists (api/controllers/console/workspace/members.py:418 send-owner-transfer-confirm-email); no endpoint or UI reassigns an agent or app to another member", + "open-webui": "source read at v0.11.4, not driven: searched 'transfer|reassign|owner' in backend/open_webui/routers and models: no ownership transfer; models/users.py:847 delete_user_by_id leaves models orphaned (Models.svelte:808 'Deleted User'); workaround: routers/models.py:1035 write grant to another user or group so they can keep maintaining it" } }, { @@ -559,11 +606,12 @@ "copilot-studio": "yes", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:846 build-draft/checkout and :941 build-draft/apply; web/i18n/en-US/agent-v-2.json 'Build your agent by chatting ... it fills in the form on the left'; web/features/agent-v2/agent-detail/configure/page.tsx:49 Build mode is on in Community Edition (only Preview is cloud/enterprise)", - "hermes-agent": "source read at v2026.9.24, not driven: skills/autonomous-ai-agents/hermes-agent/SKILL.md:26 bundled skill teaches the agent Hermes' own profiles so it can run `hermes profile create` through its terminal tool; hermes_cli/profile_describer.py:1-25 auto-generates a description from an existing profile (the reverse); searched 'create.*bot.*from.*descri' and profile-creating tool names in *.py: no dedicated plain-language agent builder Note: The agent can build a profile only by driving the CLI itself; the dashboard builder is a form wizard." + "hermes-agent": "source read at v2026.9.24, not driven: skills/autonomous-ai-agents/hermes-agent/SKILL.md:26 bundled skill teaches the agent Hermes' own profiles so it can run `hermes profile create` through its terminal tool; hermes_cli/profile_describer.py:1-25 auto-generates a description from an existing profile (the reverse); searched 'create.*bot.*from.*descri' and profile-creating tool names in *.py: no dedicated plain-language agent builder Note: The agent can build a profile only by driving the CLI itself; the dashboard builder is a form wizard.", + "open-webui": "source read at v0.11.4, not driven: searched 'generate|describe|builder|magic' in src/lib/components/workspace/Models/ModelEditor.svelte and backend/open_webui/routers/models.py: model presets are built by hand; the only natural-language builder is /skills:create for skills (backend/open_webui/utils/skills.py:81), not agents" } }, { @@ -588,10 +636,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 under gateway.multiplex_profiles each profile is served at /p//v1/...; api_server.py:1336-1345 /v1/models advertises the profile name as the model id; gateway/profile_routing.py:1-11 routes senders/chats to profiles Note: A caller addresses an agent by profile name in the URL; no registry that ties an agent to a consuming application.", - "dify": "source read at 1.17.1, not driven: api/models/agent.py:407 WorkflowAgentNodeBinding ties a roster agent to a workflow app node; api/controllers/console/agent/composer.py:54 agent-composer on a workflow node, :125 copy-from-roster; roster.py:474 published references listed on the agent's Access page ('Workflow access')" + "dify": "source read at 1.17.1, not driven: api/models/agent.py:407 WorkflowAgentNodeBinding ties a roster agent to a workflow app node; api/controllers/console/agent/composer.py:54 agent-composer on a workflow node, :125 copy-from-roster; roster.py:474 published references listed on the agent's Access page ('Workflow access')", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:836 stable Model ID that other programs pass as 'model' to the OpenAI-compatible /api/chat/completions (backend/open_webui/main.py:1118 model_id lookup); no binding of an agent to a consuming app and no per-app discovery Note: an app can call an agent by its id, but nothing ties the agent to that app" } }, { @@ -616,10 +665,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SkillsPage.tsx:140 skills / toolsets / hub views scoped by profile (SkillsPage.tsx:169 getToolsets(selectedProfile)); hermes_cli/web_routers/tools.py:230 GET /api/tools/toolsets; web/src/pages/ProfileBuilderPage.tsx:753 review step lists model, skills and MCPs Note: Skills and toolsets per profile are on one page (tabbed); MCP servers sit on McpPage; data access is not modelled (tools reach the whole host). Old yes rested on a docs line; the data part of the sentence has no screen.", - "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/ has model-config, prompt-editor, tools, skills, knowledge and files sections on the one Configure page; web/i18n/en-US/agent-v-2.json agentDetail.configure.tools/skills/knowledgeRetrieval/files" + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/ has model-config, prompt-editor, tools, skills, knowledge and files sections on the one Configure page; web/i18n/en-US/agent-v-2.json agentDetail.configure.tools/skills/knowledgeRetrieval/files", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194 Knowledge, :1198 ToolsSelector, :1202 SkillsSelector, :1206 filters/actions, :1245 Capabilities, :1262 BuiltinTools, :1268 TerminalSelector, all on the model edit page" } }, { @@ -645,10 +695,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:52 `hermes profile delete`; hermes_cli/profiles.py:1682 delete_profile removes the profile home (jobs live under it); web/src/pages/ProfilesPage.tsx:725 deleteProfile -> DELETE /api/profiles/{name} (hermes_cli/web_routers/profiles.py:869); web/src/i18n/en.ts profiles.confirmDeleteMessage 'deletes profile ... config, keys, memories, sessions, skills, cron jobs'", - "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:780 DELETE /agent/; api/services/app_service.py:1078 delete_app archives the backing agent and unbinds it; api/tasks/remove_app_and_related_data_task.py:90,632,681 deletes the app's triggers and WorkflowSchedulePlan rows so schedules stop; web/i18n/en-US/agent-v-2.json roster.deleteDialog 'web app, API access, and workflows that use it stop working'" + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:780 DELETE /agent/; api/services/app_service.py:1078 delete_app archives the backing agent and unbinds it; api/tasks/remove_app_and_related_data_task.py:90,632,681 deletes the app's triggers and WorkflowSchedulePlan rows so schedules stop; web/i18n/en-US/agent-v-2.json roster.deleteDialog 'web app, API access, and workflows that use it stop working'", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:1111 POST /model/delete removes the model only; automations store model_id (backend/open_webui/models/automations.py:73) and routers/models.py has no Automations call, so a schedule keeps firing and fails with 'Model not found' at main.py:1128 Note: schedules are not stopped with the agent" } }, { @@ -673,10 +724,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/sidebar-actions.tsx:33,52 Export (app DSL YAML); web/features/agent-v2/roster/components/roster-create-menu.tsx:29 import dialog; api/services/app_dsl_service.py:561,723,789 AGENT mode handled on import and export Note: imports into another Dify instance, not a Nextcloud; imported agents start with web app and API off (app_dsl_service.py:605)", - "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` to .tar.gz and :122 `profile import`; hermes_cli/web_routers/profiles.py:988 POST /api/profiles/{name}/export and :1006 POST /api/profiles/import; hermes_cli/commands.py:88-90 /export and /import slash commands Note: Moves between Hermes installs; there is no Nextcloud target." + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` to .tar.gz and :122 `profile import`; hermes_cli/web_routers/profiles.py:988 POST /api/profiles/{name}/export and :1006 POST /api/profiles/import; hermes_cli/commands.py:88-90 /export and /import slash commands Note: Moves between Hermes installs; there is no Nextcloud target.", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:381 GET /models/export, :441 POST /models/import (ownership check :515); src/lib/components/workspace/Models.svelte:109 Import JSON, :115 Export JSON; permissions workspace.models_import/models_export in config.py DEFAULT_USER_PERMISSIONS Note: JSON file moves an agent to another Open WebUI instance" } }, { @@ -706,7 +758,7 @@ "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ChatPage.tsx:1-16 dashboard Chat page embeds the full `hermes --tui` over WebSocket /api/pty (hermes_cli/web_routers/chat_ws.py:432); hermes_cli/main.py CLI/TUI chat; gateway adapters under plugins/platforms/ carry the same conversation", "dify": "source read at 1.17.1, not driven: web/app/(shareLayout)/agent/[token]/page.tsx full-page ChatWithHistoryWrap for an agent; web/app/(shareLayout)/chat/[token] for chat apps; web/app/(commonLayout)/installed/[appId] in-console Explore chat; api/controllers/web/completion.py chat-messages", "n8n": "docs-only: competitor_features#3912 \"core: Allow expressions in tool default values on chat hub tools: From n8n@2.14.0 (2026-03-24)\"", - "open-webui": "docs-only: competitor_features#31813 \"RAG document ingestion / knowledge base: Upload docs and chat over them with retrieval\"" + "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/c/[id]/+page.svelte and src/lib/components/chat/Chat.svelte full-page chat with a selected model (ModelSelector.svelte); backend/open_webui/main.py:1118 chat completion entry" } }, { @@ -732,7 +784,7 @@ "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38737 \"Streamed reasoning display: Models that emit thinking or reasoning now show that content as it streams, and it renders correctly in the chat overview and in exported conversations.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/middleware.py:6304 StreamingResponse handling of streamed deltas pushed over socket.io to src/lib/components/chat/Chat.svelte; per-model stream_response param src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte:20", "hermes-agent": "source read at v2026.9.24, not driven: gateway/stream_consumer.py:1-5 on_delta() queues model deltas and progressively edits one platform message; hermes_cli/cli_stream_mixin.py streams tokens in the CLI; hermes_cli/web_routers/chat_ws.py:432 PTY stream to the dashboard chat", "dify": "source read at 1.17.1, not driven: api/controllers/web/completion.py:45-63 response_mode streaming (agent apps are streaming-only, :50); service API the same (api/controllers/service_api/app/completion.py); web chat renders SSE chunks (web/app/components/base/chat/chat-with-history/chat-wrapper.tsx)" } @@ -758,10 +810,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:150-152 /resume and /sessions; hermes_cli/subcommands/sessions.py:22 `hermes sessions list` and :285 browse; hermes_cli/web_routers/sessions.py:167 GET /api/sessions; web/src/pages/SessionsPage.tsx:534-540 Resume in Chat", - "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:48 GET /conversations, :129 rename, :179 pin/unpin; web/app/components/base/chat/chat-with-history/sidebar lists past conversations to reopen" + "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:48 GET /conversations, :129 rename, :179 pin/unpin; web/app/components/base/chat/chat-with-history/sidebar lists past conversations to reopen", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:249 GET /chats/list, :774 POST /chats/new, :1325 GET /chats/{id}; sidebar chat list src/lib/components/layout/Sidebar.svelte reopens earlier chats at /c/[id]" } }, { @@ -785,10 +838,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:696 DELETE /api/sessions/{id} and :414 bulk-delete (web/src/i18n/en.ts sessions.confirmDeleteMessage 'permanently removes ... cannot be undone'); hermes_cli/subcommands/sessions.py:123 `sessions archive` soft-hides, sessions.py:750 PATCH archived flag; searched 'trash|undelete|recycle|soft.?delete' in hermes_state_sessions.py and hermes_cli/sessions*.py: no bin Note: Delete is permanent and archive is a soft hide; there is no bin to restore a deleted conversation from.", - "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:116 DELETE /conversations/; api/services/conversation_service.py:232 soft-delete flag then api/tasks/delete_conversation_task.py:105 purges related data. Searched 'restore|trash|bin|undelete' in api/services/conversation_service.py and api/controllers/web: no restore from a bin Note: delete only, no bin or restore" + "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:116 DELETE /conversations/; api/services/conversation_service.py:232 soft-delete flag then api/tasks/delete_conversation_task.py:105 purges related data. Searched 'restore|trash|bin|undelete' in api/services/conversation_service.py and api/controllers/web: no restore from a bin Note: delete only, no bin or restore", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1568 DELETE /chats/{id} permanent, :1909 POST /{id}/archive toggles archive, :1061 GET /archived; src/lib/components/chat/Settings/ArchivedChats.svelte restores; searched 'trash|recycle|restore|bin' in en-US translation.json: no bin Note: archive is the only undo; a deleted chat cannot be restored" } }, { @@ -813,10 +867,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 display.tool_progress 'all' with tool_progress_grouping (one bubble or one message per tool) in chat platforms; hermes_cli/commands.py:176 /verbose cycles tool progress off/new/all/verbose in the CLI; web/src/i18n/en.ts sessions.roles.tool shows tool messages in session history", - "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/agent-content.tsx:15-38 renders each agent_thought with its tool call; answer/tool-detail.tsx tool input/output; agent v2 'Ran commands' activity in web/features/agent-v2/agent-detail/configure/components/preview/chat-conversation.tsx and answer/agent-roster-response-content.tsx" + "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/agent-content.tsx:15-38 renders each agent_thought with its tool call; answer/tool-detail.tsx tool input/output; agent v2 'Ran commands' activity in web/features/agent-v2/agent-detail/configure/components/preview/chat-conversation.tsx and answer/agent-roster-response-content.tsx", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116 renders each tool call with src/lib/components/common/ToolCallDisplay.svelte:233-246 ('Executing {{NAME}}', 'View Result from {{NAME}}', 'Denied {{NAME}}'), expandable arguments and result" } }, { @@ -842,10 +897,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/base.py:1183-1231 SUPPORTED_DOCUMENT_TYPES (.pdf, .docx, .md, .csv ...) accepted as chat file attachments from messaging platforms; hermes_cli/web_routers/files.py:501 POST /api/files/upload and :330 /api/chat/image-upload; hermes_cli/commands.py:297 /image; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: Attaching a file and asking about it works; there is no Nextcloud Files source.", - "dify": "source read at 1.17.1, not driven: api/controllers/web/files.py:23 POST /files/upload and api/controllers/web/remote_files.py:102 upload by URL, enabled per app by web/app/components/base/features/new-feature-panel/file-upload; files go into the chat message. No picker for a document store such as Nextcloud Files: upload from the local device or a URL only Note: attach by upload or URL, not from Nextcloud" + "dify": "source read at 1.17.1, not driven: api/controllers/web/files.py:23 POST /files/upload and api/controllers/web/remote_files.py:102 upload by URL, enabled per app by web/app/components/base/features/new-feature-panel/file-upload; files go into the chat message. No picker for a document store such as Nextcloud Files: upload from the local device or a URL only Note: attach by upload or URL, not from Nextcloud", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:209 Upload Files, :322 Attach Notes, :353 Attach Knowledge, :399 Google Drive, :692 OneDrive/SharePoint; backend/open_webui/routers/files.py upload then RAG; searched 'nextcloud|webdav' in backend/open_webui and src/lib: no Nextcloud Files source Note: attaching files works, but not from Nextcloud" } }, { @@ -871,7 +927,7 @@ "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38806 \"Feedback user attribution spoofing: Submitting evaluation feedback can no longer forge the user_id field through mass-assignment, preventing authenticated users from attributing ratings to other users and corrupting Elo leaderboard rankings and admin feedback exports.\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:1255 'Good Response', :1293 'Bad Response' buttons; backend/open_webui/routers/evaluations.py:425 POST /evaluations/feedback stores the rating", "hermes-agent": "source read at v2026.9.24, not driven: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-15 only detects affection ('good bot', hearts) to animate the pet, it records no rating", "dify": "source read at 1.17.1, not driven: api/controllers/web/message.py:107 POST /messages//feedbacks; web/app/components/base/chat/chat/answer/operation.tsx:123-144 like/dislike buttons on each answer" } @@ -897,10 +953,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: apps/desktop/electron/quick-entry.ts:1-19 Quick Entry, a global-hotkey (Cmd/Ctrl+Shift+Space) mini composer over any desktop app; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: Reachable from anywhere on the desktop via the Electron app, not from inside Nextcloud pages.", - "dify": "source read at 1.17.1, not driven: web/public/embed.js (461 lines) injects a floating chat bubble into any web page that includes the script; web/i18n/en-US/app-overview.json:47 points to a separate 'Dify Chatbot Chrome Extension' (not in this repo); nothing embeds the assistant across the Dify console itself or inside Nextcloud Note: a site owner can place the bubble on their pages; no Nextcloud integration" + "dify": "source read at 1.17.1, not driven: web/public/embed.js (461 lines) injects a floating chat bubble into any web page that includes the script; web/i18n/en-US/app-overview.json:47 points to a separate 'Dify Chatbot Chrome Extension' (not in this repo); nothing embeds the assistant across the Dify console itself or inside Nextcloud Note: a site owner can place the bubble on their pages; no Nextcloud integration", + "open-webui": "source read at v0.11.4, not driven: searched 'companion|floating|spotlight|nextcloud' in src/lib/components and src/routes: the chat is its own web app; the Spotlight-style chat bar is a separate desktop app repo (README.md:100 open-webui/desktop), not core, and nothing embeds into Nextcloud pages" } }, { @@ -924,10 +981,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:264 /browser connects the agent to the user's live Chromium browser via CDP so it can read the page being viewed (tools/browser_cdp_tool.py); tools/computer_use_tool.py screen access; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: The agent can read whatever page is open, but no app hands it the current record as context.", - "dify": "source read at 1.17.1, not driven: web/public/embed.js:93-96 the host page passes config.inputs (e.g. a record id) into the embedded chat as app input variables; the agent only sees what the host page chooses to pass, no connector reads the record or its links from another app Note: a host page can hand context in, nothing looks the record up" + "dify": "source read at 1.17.1, not driven: web/public/embed.js:93-96 the host page passes config.inputs (e.g. a record id) into the embedded chat as app input variables; the agent only sees what the host page chooses to pass, no connector reads the record or its links from another app Note: a host page can hand context in, nothing looks the record up", + "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|record|object context' in backend/open_webui/utils/middleware.py and src/lib/components/chat: no integration that passes the record open in another app; closest is the iframe postMessage 'input:prompt' handler at src/lib/components/chat/Chat.svelte:1470 which only pre-fills text" } }, { @@ -952,10 +1010,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/skill_commands.py:1 every installed skill is a /skill-name slash command in CLI and gateway; hermes_cli/commands.py:226 /bundles; plugin-catalog/prompt-snippets.yaml:1-5 community desktop prompt-snippet library (catalog plugin, not core); searched 'record type' concepts: none Note: Ready-made prompts exist as skills and snippets, but none is scoped to a record type or set centrally for an organisation.", - "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx:48,87 builder sets an opening statement and fixed suggested questions per app; web/app/components/base/chat/chat/answer/suggested-questions.tsx. No prompt library keyed to a record type Note: per-app starter questions only" + "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx:48,87 builder sets an opening statement and fixed suggested questions per app; web/app/components/base/chat/chat/answer/suggested-questions.tsx. No prompt library keyed to a record type Note: per-app starter questions only", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/prompts.py:71 prompt list with access grants (:441), :384 versioning; src/lib/components/chat/MessageInput/Commands/Prompts.svelte '/' picker; per-model suggestion prompts ModelEditor.svelte:1183; no binding of prompts to a record type Note: org prompt library exists; not scoped to record types" } }, { @@ -984,7 +1043,7 @@ "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31386 \"Voice input: Hands-free natural-language invocation of agent commands.\"", - "open-webui": "docs-only: competitor_features#38876 \"STT preprocessing bypass option: Administrators can now enable AUDIOSTTSKIP_PREPROCESSING to send audio files directly to the speech-to-text backend, reducing memory and CPU consumption during large uploads for better transcription performance\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/VoiceRecording.svelte dictation and CallOverlay.svelte voice mode; backend/open_webui/routers/audio.py:1251 POST /audio/transcriptions (local Whisper, OpenAI, Deepgram, Azure, per README.md:54)", "hermes-agent": "source read at v2026.9.24, not driven: tools/voice_mode.py:1-5 push-to-talk capture with STT via tools/transcription_tools.py; hermes_cli/commands.py:202-205 /voice and /wake ('Hey Hermes' wake word); gateway/run_voice.py transcribes inbound voice messages on messaging platforms", "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:62 POST /audio-to-text; web/app/components/base/features/new-feature-panel/speech-to-text.tsx per-app switch; needs a speech2text model from a provider plugin" } @@ -1015,7 +1074,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/tts_tool.py:1-6 text-to-speech tool with Edge, ElevenLabs, OpenAI, local Piper/NeuTTS and more, Opus voice bubbles on messaging platforms; gateway/streaming_tts_consumer.py speaks streamed replies; hermes_cli/commands.py:202 /voice", - "open-webui": "docs-only: competitor_features#38875 \"Mistral TTS support: Mistral can now be used as a text-to-speech provider, with admin settings for the API key, base URL, voices, and model selection.\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:1122 'Read Aloud'; backend/open_webui/routers/audio.py:601 POST /audio/speech; per-model TTS voice ModelEditor.svelte:1280", "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:119 POST /text-to-audio; web/app/components/base/features/new-feature-panel/text-to-speech (voice, autoplay) per app; needs a TTS model from a provider plugin" } }, @@ -1041,11 +1100,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31889 \"Smart Picker in-app invocation: Invoke AI from any Nextcloud text field\"", "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; searched 'insert into|smart picker|text field' in apps/desktop/electron and web/src: the desktop Quick Entry (apps/desktop/electron/quick-entry.ts:2) opens a composer, it does not insert results into other apps' text fields", - "dify": "source read at 1.17.1, not driven: searched 'smart picker|reference provider|text field|browser extension' in web/ and api/: Dify is a standalone app, AI help inside text fields exists only for its own prompt editors (api/controllers/console/app/generator.py:327 instruction-generate); nothing inserts AI output into other applications' text fields" + "dify": "source read at 1.17.1, not driven: searched 'smart picker|reference provider|text field|browser extension' in web/ and api/: Dify is a standalone app, AI help inside text fields exists only for its own prompt editors (api/controllers/console/app/generator.py:327 instruction-generate); nothing inserts AI output into other applications' text fields", + "open-webui": "source read at v0.11.4, not driven: searched 'smart picker|reference provider|nextcloud' in backend/open_webui and src/lib: Open WebUI is standalone and offers no picker inside other apps' text fields; in-app only via note AI menu (src/lib/components/notes/AIMenu.svelte:42)" } }, { @@ -1069,11 +1129,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31383 \"Text tasks (summarize/headline/reformulate/formalize/context-write): core:text2text task-type family via Task Processing providers.\"", "hermes-agent": "source read at v2026.9.24, not driven: searched '\"summarize\"|\"translate\"|\"rephrase\"|\"reformulate\"' as command or action names in *.py and *.ts outside tests: no one-click text action; summarising or translating happens only by asking in chat Note: The chat can do it when asked; no one-click action on a selected text.", - "dify": "source read at 1.17.1, not driven: a builder can make a Completion (text generator) app that summarises or translates (web/app/(shareLayout)/completion/[token]); no built-in one-click summarise/reformulate/translate action on arbitrary text Note: possible by building an app, not a ready one-click action" + "dify": "source read at 1.17.1, not driven: a builder can make a Completion (text generator) app that summarises or translates (web/app/(shareLayout)/completion/[token]); no built-in one-click summarise/reformulate/translate action on arbitrary text Note: possible by building an app, not a ready one-click action", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/notes/AIMenu.svelte:42 one-click 'Enhance' on a note; NoteEditor.svelte:154-157 suggested 'Summarize this note.', 'Rewrite the selected text.'; src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:26 Ask, :33 Explain on selected text; searched 'translate' in those components: no one-click translate Note: only inside notes and chat selections, no one-click translate" } }, { @@ -1101,7 +1162,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31381 \"Document & image generation: Generate spreadsheets, slides, PDFs and images from chat instructions.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/image_generation_tool.py:1-5 image generation tool (FAL models chosen in `hermes tools`); agent/image_gen_registry.py pluggable providers with plugins/image_gen/; the model calls it from any chat surface", - "open-webui": "docs-only: competitor_features#31818 \"Image generation integration: DALL-E, Gemini, ComfyUI, AUTOMATIC1111 image backends\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/images.py:562 POST /images/generations, :858 /images/edit (OpenAI, Gemini, ComfyUI, Automatic1111); built-in tool backend/open_webui/tools/builtin.py:370 generate_image; src/routes/(app)/playground/images/+page.svelte", "dify": "source read at 1.17.1, not driven: core builtin tools are only audio, code, time, webscraper (api/core/tools/builtin_tool/providers/); searched 'text2img|image_generation|generate image' in api/core and web/i18n/en-US: none in core. Image generation comes only from marketplace tool plugins Note: marketplace plugin only" } }, @@ -1127,10 +1188,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:268 GET /api/sessions/search behind web/src/i18n/en.ts sessions.searchPlaceholder 'Search message content'; tools/session_search_tool.py:1-9 FTS5 recall over the session DB for the agent; hermes_state_fts.py full-text index", - "dify": "source read at 1.17.1, not driven: api/controllers/console/app/conversation.py:55,119-126 builders search one app's logs by keyword over queries and answers; the end-user chat sidebar (web/app/components/base/chat/chat-with-history/sidebar) has no search and api/controllers/web/conversation.py:48 lists without a keyword Note: admin log search per app, no search for the person across their own conversations" + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/conversation.py:55,119-126 builders search one app's logs by keyword over queries and answers; the end-user chat sidebar (web/app/components/base/chat/chat-with-history/sidebar) has no search and api/controllers/web/conversation.py:48 lists without a keyword Note: admin log search per app, no search for the person across their own conversations", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:865 GET /chats/search over title and message content with snippet (:178 chat_search_snippet); src/lib/components/layout/SearchModal.svelte 'Search Chats'; agent-side tool tools/builtin.py:1512 search_chats" } }, { @@ -1156,7 +1218,7 @@ "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38872 \"Responses citation visibility: Responses API flows now emit citation sources more consistently, making linked references easier to preserve and display in chat output.\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:910 Citations component with source list and CitationModal (Messages/Citations/CitationModal.svelte) linking to the document or URL; model capability 'citations' (translation key settings.admin.models.capabilities.citations)", "hermes-agent": "source read at v2026.9.24, not driven: agent/anthropic_message_convert.py:52-56 carries provider citation blocks through the transcript; tools/web_tools.py web_search/web_extract return result URLs that the model quotes in its text; searched 'citation' in *.py: no source panel or structured citation rendering in gateway, CLI or dashboard Note: Sources appear only as links the model writes into the answer.", "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/citation.tsx:44 per-app Citations switch; web/app/components/base/chat/chat/citation/popup.tsx:31,109 shows each source document and segment with a link to /datasets//documents/ (link shown to console users)" } @@ -1185,7 +1247,7 @@ "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38831 \"Public chat sharing permission control: Administrators can now control whether users are allowed to create publicly shareable chats through a dedicated permission setting.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1945 POST /chats/{id}/share, :1208 GET /chats/share/{share_id}, :2029 access grants on the shared chat; src/lib/components/chat/ShareChatModal.svelte:30 shareChatById and 'Copy Share Link'; src/routes/s/[id]/+page.svelte viewer", "hermes-agent": "source read at v2026.9.24, not driven: searched 'share.*(link|url)|public.*session|shared_session' in hermes_cli/web_routers/sessions.py and gateway/platforms/api_server.py: none; hermes_cli/web_routers/sessions.py:787 GET /api/sessions/{id}/export and hermes_cli/commands.py:66 /save export to a file; hermes_cli/shared_session_attach.py:1-4 attaches local runtimes, not colleagues Note: Export to a file exists; no share link.", "dify": "source read at 1.17.1, not driven: searched 'share conversation|shareConversation|conversation.*share' in web/i18n/en-US and api/controllers/web/conversation.py (list, delete, rename, pin only): the web app URL and QR code share the app (web/i18n/en-US/agent-v-2.json access.webApp.qrCode), no link to one conversation" } @@ -1211,13 +1273,13 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "yes", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:794-799 5-6 field cron expressions via croniter; hermes_cli/subcommands/cron.py:23 `hermes cron create`; web/src/i18n/en.ts cron.schedule 'Schedule (cron expression)' on web/src/pages/CronPage.tsx -> POST /api/cron/jobs (hermes_cli/web_routers/cron.py:248)", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:10-19 Schedule Trigger start node with mode cron and cron_expression; api/schedule/workflow_schedule_task.py:18 poller (ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK default true, api/configs/feature/__init__.py:1461); an agent runs on it as an Agent node in that workflow Note: the schedule belongs to a workflow app that holds the agent node, not to the agent itself", "n8n": "docs-only: competitor_features#31094 \"Cron & interval scheduling: Schedule Trigger node runs workflows on cron expressions.\"", - "open-webui": "docs-only: competitor_features#31816 \"Scheduled prompt Automations: Recurring prompts via RRULE/cron in a background worker loop\"" + "open-webui": "source read at v0.11.4, not driven: schedules are iCalendar RRULE, not cron: backend/open_webui/models/automations.py:76 rrule; utils/recurrence.py:37 _parse_rule (dateutil rrulestr); src/lib/components/automations/ScheduleDropdown.svelte:33 'Custom' free-text field with placeholder RRULE:FREQ=DAILY;BYHOUR=9 (:223); searched 'cron' in backend/open_webui/utils and routers/automations.py: none Note: same power as cron via RRULE, but no cron syntax" } }, { @@ -1246,7 +1308,7 @@ "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:17,34-55 visual mode with hourly/daily/weekly/monthly frequency, on_minute, time, weekdays; api/services/trigger/schedule_service.py:257 visual_to_cron; web/i18n/en-US/workflow.json nodes.triggerSchedule.useVisualPicker Note: hourly is the finest visual step; 'every 15 minutes' needs cron", "n8n": "docs-only: competitor_features#31094 \"Cron & interval scheduling: Schedule Trigger node runs workflows on cron expressions.\"", - "open-webui": "docs-only: competitor_features#31816 \"Scheduled prompt Automations: Recurring prompts via RRULE/cron in a background worker loop\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/automations/ScheduleDropdown.svelte:27-33 Hourly/Daily/Weekly/Monthly presets building FREQ+INTERVAL (:92); backend/open_webui/utils/recurrence.py:62 MINUTELY/HOURLY steps aligned to the clock; builtin tool docstring tools/builtin.py:3726 'Every 30 minutes'", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:791-792 'every 30m' / '30m' become recurring interval schedules; web/src/i18n/en.ts cron.scheduleModes.interval 'Every interval' with minutes/hours/days units on CronPage" } }, @@ -1271,11 +1333,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:801-812 ISO timestamp parses to a one-shot job in the configured timezone; web/src/i18n/en.ts cron.scheduleModes.once 'Once' / onceAt 'Run at'", - "dify": "source read at 1.17.1, not driven: searched 'once|run_at|one-time|date' in api/core/workflow/nodes/trigger_schedule/entities.py and api/services/trigger/schedule_service.py: only recurring frequencies and a 5-field cron (api/libs/schedule_utils.py:33-39), which repeats yearly; no fire-once date" + "dify": "source read at 1.17.1, not driven: searched 'once|run_at|one-time|date' in api/core/workflow/nodes/trigger_schedule/entities.py and api/services/trigger/schedule_service.py: only recurring frequencies and a 5-field cron (api/libs/schedule_utils.py:33-39), which repeats yearly; no fire-once date", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/automations/ScheduleDropdown.svelte:28 'Once' builds DTSTART + RRULE:FREQ=DAILY;COUNT=1 (:69, detection :110); backend/open_webui/utils/recurrence.py:106 validate_rrule requires DTSTART with COUNT" } }, { @@ -1299,11 +1362,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:780-790 natural phrases ('every monday 9am', 'weekdays at 9am') convert to cron via _natural_every_to_cron; tools/cronjob_tools.py:1 cronjob_manage tool lets the agent create jobs from a chat request; hermes_cli/commands.py:236 /cron", - "dify": "source read at 1.17.1, not driven: searched 'natural language|describe|generate cron|text to cron' in web/i18n/en-US/workflow.json and api/services/trigger: the schedule node takes a visual picker or a cron string only (web/i18n/en-US/workflow.json nodes.triggerSchedule.*) Note: the workflow generator does not know the schedule node either: searched 'trigger-schedule|trigger_schedule|cron' in api/core/workflow/generator/, no hits" + "dify": "source read at 1.17.1, not driven: searched 'natural language|describe|generate cron|text to cron' in web/i18n/en-US/workflow.json and api/services/trigger: the schedule node takes a visual picker or a cron string only (web/i18n/en-US/workflow.json nodes.triggerSchedule.*) Note: the workflow generator does not know the schedule node either: searched 'trigger-schedule|trigger_schedule|cron' in api/core/workflow/generator/, no hits", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3709 create_automation built-in tool: the chat model turns 'every weekday at eight' into an RRULE (docstring examples :3723-3728), plus :3817 update_automation and :3921 list_automations, gated by features.automations permission" } }, { @@ -1327,11 +1391,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_time.py:1-5 tz-aware now() in the configured IANA timezone (HERMES_TIMEZONE or config timezone); cron/jobs.py:1195-1216 next fire computed on local wall clock with both DST folds tried so 09:00 local stays 09:00 across fall-back; cron/jobs.py:832 intervals measure elapsed time across DST Note: Old partial; the scheduler handles DST explicitly.", - "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:19 timezone per schedule; api/libs/schedule_utils.py:41-50 croniter evaluated in the pytz zone and converted to UTC, so fires follow local wall time across DST; web/i18n/en-US/workflow.json nodes.triggerSchedule.invalidTimezone" + "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:19 timezone per schedule; api/libs/schedule_utils.py:41-50 croniter evaluated in the pytz zone and converted to UTC, so fires follow local wall time across DST; web/i18n/en-US/workflow.json nodes.triggerSchedule.invalidTimezone", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/automations.py:319-330 claim_due fetches each owner's User.timezone and reschedules with it; utils/recurrence.py:128 next_run_ns evaluates the rule on local wall-clock time then attaches ZoneInfo (:137), so 08:00 stays 08:00 across DST" } }, { @@ -1355,11 +1420,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:157 `hermes cron run` (next scheduler tick); hermes_cli/web_routers/cron.py:292 POST /api/cron/jobs/{id}/trigger behind web/src/i18n/en.ts cron.triggerNow 'Trigger now' on CronPage", - "dify": "source read at 1.17.1, not driven: api/core/trigger/debug/event_selectors.py:140-200 a schedule test run waits for the next computed slot, it does not fire at once; the same workflow can be run now only through a second User Input start node ('Choose the start node to run', web/i18n/en-US/workflow.json common.chooseStartNodeToRun) or the workflow run API Note: no 'run now' on the schedule itself" + "dify": "source read at 1.17.1, not driven: api/core/trigger/debug/event_selectors.py:140-200 a schedule test run waits for the next computed slot, it does not fire at once; the same workflow can be run now only through a second User Input start node ('Choose the start node to run', web/i18n/en-US/workflow.json common.chooseStartNodeToRun) or the workflow run API Note: no 'run now' on the schedule itself", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:334 POST /automations/{id}/run; src/lib/components/automations/AutomationItemHeaderActions.svelte:33 'Run now', AutomationMenu.svelte:96 'Run Now'; src/routes/(app)/automations/+page.svelte:196 runAutomationById" } }, { @@ -1386,7 +1452,7 @@ "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "open-webui": "docs-only: competitor_features#38863 \"Automation tools in chat: Built-in chat tools can now create, update, list, pause, and delete scheduled automations directly in conversation when automation access is enabled.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:306 POST /{id}/toggle flips is_active (models/automations.py:28); claim_due only picks is_active rows (:301); src/routes/(app)/automations/+page.svelte:166 toggle, :186 bulk toggle; tool tools/builtin.py:3993 toggle_automation", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:149-152 `cron pause` / `cron resume`; hermes_cli/web_routers/cron.py:282-287 POST /api/cron/jobs/{id}/pause|resume behind CronPage Pause/Resume (web/src/i18n/en.ts cron.pause)", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:167,197 POST /apps//trigger-enable sets AppTriggerStatus ENABLED/DISABLED; api/schedule/workflow_schedule_task.py:55-78 the poller only picks ENABLED triggers" } @@ -1412,12 +1478,13 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-10 HMAC-validated inbound POST routes render the payload into an agent prompt or fire an existing cron job; hermes_cli/subcommands/webhook.py:16-50 `hermes webhook subscribe --prompt --events --skills --deliver --cron-job`; web/src/pages/WebhooksPage.tsx:207 create subscription", "n8n": "docs-only: competitor_features#31096 \"Webhook triggers: Inbound HTTP webhooks start workflows.\"", - "dify": "source read at 1.17.1, not driven: api/controllers/trigger/webhook.py:59 /triggers/webhook/ any method starts the workflow; web/i18n/en-US/workflow.json blocks.trigger-webhook 'receives HTTP pushes from third-party systems'; configurable params, headers and response (nodes.triggerWebhook.*); the agent runs as a node in that workflow" + "dify": "source read at 1.17.1, not driven: api/controllers/trigger/webhook.py:59 /triggers/webhook/ any method starts the workflow; web/i18n/en-US/workflow.json blocks.trigger-webhook 'receives HTTP pushes from third-party systems'; configurable params, headers and response (nodes.triggerWebhook.*); the agent runs as a node in that workflow", + "open-webui": "source read at v0.11.4, not driven: inbound channel webhooks only post a message: backend/open_webui/routers/channels.py:2005 POST /channels/webhooks/{id}/{token} does not call model_response_handler (:976, only invoked at :1244 for user posts); another system can start a model turn only by calling the OpenAI-compatible API with an API key (routers/auths.py:1529, main.py:1118) Note: no webhook trigger bound to an agent; API call is the only machine start" } }, { @@ -1441,10 +1508,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/webhook.py:136 re-running `webhook subscribe --secret ` replaces the route secret (else keeps it); hermes_cli/subcommands/webhook.py:58 `webhook remove` revokes the route; web/src/pages/WebhooksPage.tsx:335-355 secret shown once at creation; hermes_cli/subcommands/hooks.py:34 revoke is for hooks, not webhook secrets Note: Rotation is a re-subscribe with a new secret on the CLI; no rotate or revoke-secret action in the dashboard.", - "dify": "source read at 1.17.1, not driven: api/services/trigger/webhook_service.py:966,994-1001 the random webhook_id in the URL is the only secret, generated once at node sync; no regenerate endpoint (api/controllers/console/app/workflow_trigger.py:94 is GET only); revoke by disabling the trigger (:167) or deleting the node. No HMAC/signature check Note: revoke yes, rotate no" + "dify": "source read at 1.17.1, not driven: api/services/trigger/webhook_service.py:966,994-1001 the random webhook_id in the URL is the only secret, generated once at node sync; no regenerate endpoint (api/controllers/console/app/workflow_trigger.py:94 is GET only); revoke by disabling the trigger (:167) or deleting the node. No HMAC/signature check Note: revoke yes, rotate no", + "open-webui": "source read at v0.11.4, not driven: channel webhook token is minted once (backend/open_webui/models/channels.py:937 secrets.token_urlsafe) with no regenerate endpoint; revoke only by deleting the webhook (routers/channels.py:1963); the API key used for machine starts can be regenerated or deleted (routers/auths.py:1529 POST, :1554 DELETE /api_key) Note: no agent webhook; nearest secrets can be revoked, only the API key rotated" } }, { @@ -1469,13 +1537,14 @@ "copilot-studio": "yes", "dify": "partial", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "copilot-studio": "docs-only: competitor_features#31603 \"Autonomous agents: Agents that trigger on events and act without a human prompt (5 messages/action).\"", "n8n": "docs-only: competitor_features#31096 \"Webhook triggers: Inbound HTTP webhooks start workflows.\"", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-5 routes accept events from outside systems with header event filters (GitHub, GitLab, Linear, generic); gateway/hooks.py:1-9 lifecycle hooks (session, agent, command events) run handlers; cron/scheduler_script.py pre-run script gates a job; searched 'nextcloud' repo-wide: none Note: Agents start on outside-system events via webhooks, not on Nextcloud file or record events.", - "dify": "source read at 1.17.1, not driven: api/controllers/trigger/trigger.py:17 /triggers/plugin/ receives events from trigger plugins with subscriptions (api/controllers/console/workspace/trigger_providers.py:191); the event sources (GitHub, Slack, etc.) come from marketplace trigger plugins. No internal event bus for Dify's own events, no Nextcloud source Note: marketplace plugin only" + "dify": "source read at 1.17.1, not driven: api/controllers/trigger/trigger.py:17 /triggers/plugin/ receives events from trigger plugins with subscriptions (api/controllers/console/workspace/trigger_providers.py:191); the event sources (GitHub, Slack, etc.) come from marketplace trigger plugins. No internal event bus for Dify's own events, no Nextcloud source Note: marketplace plugin only", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/events.py:1103 dispatch_event_functions runs admin-installed 'event' Functions on every published event (file.uploaded, knowledge.file.added, chat.created, ...; catalog class EventDefinitions events.py:42); an agent start must be hand-coded inside such a Function, searched 'trigger' in routers/automations.py and models/automations.py: automations are time-only (:73) Note: event hook exists for plugin code, no no-code event trigger for an agent" } }, { @@ -1500,10 +1569,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/webhook.py:47-51 a webhook route can fire an existing cron job (--cron-job); the same job keeps its schedule (cron/jobs.py:772 parse_schedule) and can be run by hand (hermes_cli/web_routers/cron.py:292 trigger); cron/jobs.py:2650-2657 manual run-now without consuming the next slot Note: Triggers are chosen per job or route rather than per profile.", - "dify": "source read at 1.17.1, not driven: a workflow chooses its start node(s): User Input, Schedule Trigger, Webhook Trigger or a plugin trigger (web/i18n/en-US/workflow.json blocks.trigger-schedule, blocks.trigger-webhook, onboarding.triggerDescription; common.chooseStartNodeToRun); api/controllers/console/app/workflow_trigger.py:128 lists an app's triggers Note: chosen per workflow app that wraps the agent" + "dify": "source read at 1.17.1, not driven: a workflow chooses its start node(s): User Input, Schedule Trigger, Webhook Trigger or a plugin trigger (web/i18n/en-US/workflow.json blocks.trigger-schedule, blocks.trigger-webhook, onboarding.triggerDescription; common.chooseStartNodeToRun); api/controllers/console/app/workflow_trigger.py:128 lists an app's triggers Note: chosen per workflow app that wraps the agent", + "open-webui": "source read at v0.11.4, not driven: an automation runs on its RRULE (backend/open_webui/models/automations.py:76) and can be run by hand (routers/automations.py:334 /run); a model is also started by hand in chat; there is no event option per agent (searched 'trigger|event' in models/automations.py and src/lib/components/automations: none) Note: schedule or manual, no event trigger to choose" } }, { @@ -1527,12 +1597,13 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json nodes.common.retry.* per-node retry on failure with max retries and a fixed retry interval in ms (api/core/workflow/generator/prompts/builder_prompts.py:111 retry_config); fail branch / default value error handling (nodes.common.errorHandle.*). Searched 'backoff|exponential' in api/core/workflow: no growing waits, no whole-run retry Note: fixed interval, node level only", "n8n": "docs-only: competitor_features#3039 \"Error Handling: Built-in error handling with retry and fallback paths\"", - "hermes-agent": "source read at v2026.9.24, not driven: cron/unreachable_retry.py:1-17 and :31 RETRY_DELAYS_SECONDS (300, 900, 1800): growing waits, stops after three, but only for fires that never reached the model (transient network error, zero API calls); cron/quota_hold.py:1-12 parks a job until a provider quota window reopens Note: Generic run failures are not retried; the bounded ladder covers unreachable-model failures only." + "hermes-agent": "source read at v2026.9.24, not driven: cron/unreachable_retry.py:1-17 and :31 RETRY_DELAYS_SECONDS (300, 900, 1800): growing waits, stops after three, but only for fires that never reached the model (transient network error, zero API calls); cron/quota_hold.py:1-12 parks a job until a provider quota window reopens Note: Generic run failures are not retried; the bounded ladder covers unreachable-model failures only.", + "open-webui": "source read at v0.11.4, not driven: searched 'retry|backoff|attempt' in backend/open_webui/utils/automations.py, models/automations.py, routers/automations.py: execute_automation (utils/automations.py:345) catches the error, records status 'error' (:617 _record_run) and waits for the next RRULE slot; no automatic retry" } }, { @@ -1556,11 +1627,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 durable failure incidents grouped by job and error signature (detected, alerted, closed); hermes_cli/subcommands/cron.py:174-181 `hermes cron incidents list|ack`; cron/jobs.py:2254 dead-pin auto-pause Note: Failing jobs land in an incident list someone can acknowledge; the failed runs are not parked for replay and there is no dashboard view of incidents.", - "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:27,121,150 run logs filter by status (failed) and web/app/components/app/workflow-log/filter.tsx; searched 'dead letter|dead_letter|quarantine|parked' in api/: no list that parks repeatedly failing runs Note: a failed-status filter per app, not a dead-letter list" + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:27,121,150 run logs filter by status (failed) and web/app/components/app/workflow-log/filter.tsx; searched 'dead letter|dead_letter|quarantine|parked' in api/: no list that parks repeatedly failing runs Note: a failed-status filter per app, not a dead-letter list", + "open-webui": "source read at v0.11.4, not driven: failed runs are kept per automation in automation_run with status and error (backend/open_webui/models/automations.py:43-50), listed in src/lib/components/automations/AutomationEditor.svelte:212 getAutomationRuns; automation.run_failed event can go to a webhook (events.py AUTOMATION_RUN_FAILED); no cross-automation list of failing runs Note: per-automation run history, no parked-failures list" } }, { @@ -1585,12 +1657,13 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "n8n": "docs-only: competitor_features#38156 \"core: Close the durable scheduler's record-then-dispatch effect boundary: From n8n@2.32.0 (2026-07-21)\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:2648-2670 claim_job_for_fire refuses a new fire while a fresh fire_claim exists (cleared by mark_job_run on completion, TTL for crashes); cron/jobs.py:3050 still-in-flight runs are skipped", - "dify": "source read at 1.17.1, not driven: api/schedule/workflow_schedule_task.py:94-114 _process_schedules advances next_run_at and dispatches every due schedule without checking for a running execution; searched 'overlap|already running|skip_if_running|concurrency' in api/schedule and api/services/trigger: nothing" + "dify": "source read at 1.17.1, not driven: api/schedule/workflow_schedule_task.py:94-114 _process_schedules advances next_run_at and dispatches every due schedule without checking for a running execution; searched 'overlap|already running|skip_if_running|concurrency' in api/schedule and api/services/trigger: nothing", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/automations.py:289 claim_due only prevents double claiming of one slot (next_run_at advanced, SKIP LOCKED); utils/automations.py:112 asyncio.create_task(execute_automation) with no check that the previous run finished; searched 'running|in_progress|overlap|lock' in utils/automations.py: none" } }, { @@ -1618,7 +1691,7 @@ "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "open-webui": "docs-only: competitor_features#38862 \"Scheduled chat automations: Create and manage automations from the Automations page or directly in chat, with full run history\"", + "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/automations/+page.svelte:509 list with Active/Paused filter, :100 last run time; AutomationEditor.svelte:331 next run, :361 run history with status; backend/open_webui/routers/automations.py:147 enrich_automation adds last_run and next_runs", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/CronPage.tsx with web/src/i18n/en.ts cron.last 'Last', cron.next 'Next', overdueSince; hermes_cli/web_routers/cron.py:233 GET /api/cron/jobs and :243 /runs; hermes_cli/subcommands/cron.py:20 `cron list` and :168 `cron runs`", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:45-65,128 GET /apps//triggers lists one app's triggers with status, no next run or last result; next 5 run times only in the node panel (web/i18n/en-US/workflow.json nodes.triggerSchedule.nextExecutionTimes). No workspace-wide schedule list Note: per app, no next run or last result in the list" } @@ -1644,10 +1717,10 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "yes", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31376 \"Files tool: Read, create, move, copy, delete files and create public share links.\"", - "open-webui": "docs-only: competitor_features#38760 \"Open WebUI Computer agent support: Open WebUI can now connect to Open WebUI Computer through its OpenAI-compatible gateway, letting chats run full agent sessions on your own machine with file, terminal, git, and web access.\"", + "open-webui": "source read at v0.11.4, not driven: agents read uploaded and knowledge files via built-in tools backend/open_webui/tools/builtin.py:2750 view_file, :2413 list_chat_files, :2453 grep_chat_files; create and move files only inside an attached Open Terminal filesystem (utils/middleware.py:1286 write_file / run_command); searched 'nextcloud|webdav' in backend/open_webui: no Nextcloud Files Note: file work happens in the Open Terminal sandbox, not in Nextcloud Files", "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file, write_file, patch, search_files tools and :1371 registration in the file toolset, plus terminal tool for moves; searched 'nextcloud' repo-wide (excluding website/): none outside one test Note: Works on the host or sandbox filesystem; no Nextcloud Files connection.", "dify": "source read at 1.17.1, not driven: core has no file-store tool (searched 'nextcloud|webdav' in api/, web/app, web/i18n: no hits; builtin tools are audio, code, time, webscraper in api/core/tools/builtin_tool/providers/). Official marketplace plugin langgenius/dify-official-plugins tools/nextcloud/tools/ has list_files, search_files, upload_file, download_file, create_folder, delete_file: no move Note: marketplace plugin only (official 'nextcloud' plugin, read on main not at a tag), and it cannot move files" } @@ -1676,7 +1749,7 @@ "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31373 \"Calendar tool: List calendars, schedule events, find free time slots via natural-language chat.\"", - "open-webui": "docs-only: competitor_features#38866 \"Calendar workspace and event management: Open WebUI now has a full Calendar workspace. Create and manage events, set up recurring schedules, get reminders via in-app toasts or browser notifications, and see your scheduled automations alongside your calendar.\"", + "open-webui": "source read at v0.11.4, not driven: built-in calendar tools backend/open_webui/tools/builtin.py:4151 search_calendar_events, :4240 create_calendar_event, :4367 update, :4488 delete, registered at utils/tools.py:754 when calendar is enabled; data in models/calendar.py, UI src/routes/(app)/calendar/+page.svelte Note: Open WebUI's own calendar; no CalDAV or Nextcloud Calendar", "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:1-27 bundled skill reads Google Calendar, checks conflicts and creates events through a gws CLI or bundled Python client (needs Google OAuth); optional-mcps/calendly; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Calendar only; no CalDAV, so a Nextcloud calendar is out of reach.", "dify": "source read at 1.17.1, not driven: no calendar tool in core (api/core/tools/builtin_tool/providers/ has audio, code, time, webscraper). Marketplace: official langgenius/dify-official-plugins tools/google_calendar/tools/{list_events,create_event}.yaml, feishu/lark calendars, and a community CalDAV plugin langgenius/dify-plugins shaba/caldav that could point at a Nextcloud calendar Note: marketplace plugin only" } @@ -1702,11 +1775,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31379 \"Contacts tool: Look up contact and user information to feed other tools.\"", "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:15-22 Contacts via the Google People API in the bundled google-workspace skill; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Contacts only; no CardDAV or Nextcloud Contacts.", - "dify": "source read at 1.17.1, not driven: no contacts tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_contacts/tools/{search_contacts,get_contact}.yaml; community langgenius/dify-plugins shaba/carddav Note: marketplace plugin only" + "dify": "source read at 1.17.1, not driven: no contacts tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_contacts/tools/{search_contacts,get_contact}.yaml; community langgenius/dify-plugins shaba/carddav Note: marketplace plugin only", + "open-webui": "source read at v0.11.4, not driven: searched 'contacts|carddav|address book' in backend/open_webui and src/lib/components: no contacts store or tool; only the user directory used for sharing" } }, { @@ -1731,11 +1805,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31377 \"Deck tool: Manage Deck board cards, labels and assignments.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/kanban_tools_schemas.py:89-371 kanban_create, kanban_comment, kanban_complete tools on Hermes' own multi-profile kanban board (hermes_cli/kanban.py); optional-mcps/ has asana, linear, monday, clickup MCP entries; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Cards on Hermes' own board or third-party boards; no Nextcloud Deck.", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|deck' in api/ and web/i18n: nothing in core. Marketplace kanban tools only for other products: official tools/trello/tools/{create_new_card_on_board,update_card}.yaml, monday, linear, jira Note: cards on Trello-like boards via plugins, not Nextcloud Deck" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|deck' in api/ and web/i18n: nothing in core. Marketplace kanban tools only for other products: official tools/trello/tools/{create_new_card_on_board,update_card}.yaml, monday, linear, jira Note: cards on Trello-like boards via plugins, not Nextcloud Deck", + "open-webui": "source read at v0.11.4, not driven: searched 'deck|kanban|board' in backend/open_webui (py): no board tool or integration" } }, { @@ -1759,11 +1834,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31375 \"Mail tool: Send emails, manage mail accounts and folders.\"", "hermes-agent": "source read at v2026.9.24, not driven: skills/email/himalaya/SKILL.md:1-3 bundled IMAP/SMTP skill; plugins/platforms/email/plugin.yaml:5-8 email gateway polls IMAP and replies over SMTP; tools/send_message_tool.py:35 send_message delivers to the email target; skills/productivity/google-workspace Gmail", - "dify": "source read at 1.17.1, not driven: core email is only the Human Input node's delivery method (web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*, api/services/feature_service.py:81 on for self-hosted). A generic send-email tool comes from the official tools/email/tools/send_mail.yaml plugin or gmail/outlook plugins Note: agent-callable email is marketplace plugin only" + "dify": "source read at 1.17.1, not driven: core email is only the Human Input node's delivery method (web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*, api/services/feature_service.py:81 on for self-hosted). A generic send-email tool comes from the official tools/email/tools/send_mail.yaml plugin or gmail/outlook plugins Note: agent-callable email is marketplace plugin only", + "open-webui": "source read at v0.11.4, not driven: searched 'smtp|send_email|sendmail|mail' in backend/open_webui: no mail sending anywhere in core; outbound messages go only to webhooks (utils/webhook.py:30) Note: only possible through a community Tool" } }, { @@ -1787,11 +1863,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31374 \"Talk tool: List conversations, send messages, create public conversations from the agent.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/send_message_tool.py:1-2 and :35 send_message posts to any connected chat platform (plugins/platforms/: telegram, discord, slack, matrix, mattermost, teams, signal and more); plugin-catalog/hermes-talk.yaml:1-5 is realtime voice, not Nextcloud Talk; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Posting into a team chat works; there is no Nextcloud Talk adapter.", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/i18n: nothing in core. Marketplace chat tools for other products: official tools/slack/tools/send_message.yaml, tools/teams/tools/send_channel_message.yaml, discord, dingtalk, wecom Note: posts to Slack/Teams via plugins, not Nextcloud Talk" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/i18n: nothing in core. Marketplace chat tools for other products: official tools/slack/tools/send_message.yaml, tools/teams/tools/send_channel_message.yaml, discord, dingtalk, wecom Note: posts to Slack/Teams via plugins, not Nextcloud Talk", + "open-webui": "source read at v0.11.4, not driven: an automation can target an Open WebUI channel (backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation) and models answer @mentions in channels (routers/channels.py:976); channel built-in tools are read-only (tools/builtin.py:1763-1957); no Nextcloud Talk Note: posting is to Open WebUI's own channels, only via automation target or mention reply" } }, { @@ -1816,11 +1893,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31378 \"Tasks tool: Create, list, complete, update and delete tasks.\"", "hermes-agent": "source read at v2026.9.24, not driven: skills/apple/apple-reminders/SKILL.md:1-3 'add, list, complete' reminders (macOS); tools/kanban_tools_schemas.py:89 kanban_complete and :371 kanban_create; optional-mcps/todoist; tools/todo_tool.py in-session todo list Note: No CalDAV tasks; Nextcloud Tasks is not reachable.", - "dify": "source read at 1.17.1, not driven: no task tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_tasks/tools/{create_task,update_task}.yaml, microsoft_todo, todoist, feishu_task Note: marketplace plugin only" + "dify": "source read at 1.17.1, not driven: no task tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_tasks/tools/{create_task,update_task}.yaml, microsoft_todo, todoist, feishu_task Note: marketplace plugin only", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3593 create_tasks and :3643 update_task keep a checklist inside the chat message (status pending|in_progress|completed); searched 'todo|caldav|vtodo' in backend/open_webui: no task app to create or complete tasks in Note: in-chat progress checklist only" } }, { @@ -1844,11 +1922,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31384 \"Unified search tool: Access all Nextcloud search providers from the agent.\"", "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; tools/session_search_tool.py searches only Hermes' own conversations and tools/file_tools.py:1270 search_files only the host filesystem Note: No Nextcloud unified search provider or equivalent cross-app search.", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|unified search|unified_search' in api/ and web/: nothing. The official marketplace nextcloud plugin (langgenius/dify-official-plugins tools/nextcloud/tools/search_files.yaml) searches files only, not everything Nextcloud search reaches" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|unified search|unified_search' in api/ and web/: nothing. The official marketplace nextcloud plugin (langgenius/dify-official-plugins tools/nextcloud/tools/search_files.yaml) searches files only, not everything Nextcloud search reaches", + "open-webui": "source read at v0.11.4, not driven: separate built-in search tools over Open WebUI's own stores: backend/open_webui/tools/builtin.py:1512 search_chats, :1127 search_notes, :865 search_memories, :1763 search_channels, :2104 search_knowledge_bases, :4151 search_calendar_events; no single cross-app search tool and no Nextcloud unified search Note: agent can search each store, not one unified index" } }, { @@ -1875,7 +1954,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/web_tools.py:1-9 web_search and web_extract over pluggable backends in plugins/web/ (brave_free, ddgs, exa, firecrawl, searxng, tavily, perplexity ...); tools/browser_tool.py full browser for reading pages", - "open-webui": "docs-only: competitor_features#31814 \"Web search integration: Pluggable web search providers for grounded answers\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:294 search_web and :333 fetch_url, registered at utils/tools.py:677 when web_search is enabled; ~20 providers in backend/open_webui/retrieval/web/ (SearXNG, Brave, Tavily, ...)", "dify": "source read at 1.17.1, not driven: core ships only a page reader (api/core/tools/builtin_tool/providers/webscraper); web search engines are marketplace plugins (official tools/duckduckgo, tavily, searxng, google, bing, brave, perplexity in langgenius/dify-official-plugins); web/i18n/en-US/agent-v-2.json tools.addMenu.tool 'like web search or integrations' Note: reading pages is core, searching needs a plugin" } }, @@ -1900,10 +1979,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'openregister|register' as a record store in *.py and optional-mcps/: none; searched 'nextcloud' repo-wide (excluding website/): none outside one test", - "dify": "source read at 1.17.1, not driven: searched 'openregister' in api/ and web/app: no hits; no OpenRegister connector in core or in the official plugin list (langgenius/dify-official-plugins tools/). Only reachable by a hand-built custom OpenAPI tool or HTTP node" + "dify": "source read at 1.17.1, not driven: searched 'openregister' in api/ and web/app: no hits; no OpenRegister connector in core or in the official plugin list (langgenius/dify-official-plugins tools/). Only reachable by a hand-built custom OpenAPI tool or HTTP node", + "open-webui": "source read at v0.11.4, not driven: searched 'openregister|register' in backend/open_webui/tools and utils/tools.py: no OpenRegister or record-store tool; reachable only through a custom OpenAPI or MCP tool server" } }, { @@ -1934,7 +2014,7 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/mcp_tool.py MCP client (stdio, HTTP, OAuth in tools/mcp_oauth.py); hermes_cli/subcommands/mcp.py:27 `hermes mcp add` and :52 configure tool selection; hermes_cli/web_routers/mcp.py:110 POST /api/mcp/servers behind web/src/pages/McpPage.tsx; optional-mcps/ catalog of 65 servers", "copilot-studio": "docs-only: competitor_features#31607 \"MCP support: Copilot Studio can consume MCP tool servers.\"", "n8n": "docs-only: competitor_features#3906 \"AI Agent Node: Extract tool name correctly for MCP tool calls: From n8n@2.14.0 (2026-03-24)\"", - "open-webui": "docs-only: competitor_features#31815 \"Model Context Protocol (MCP) tools: MCP tool/server support for external tools\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/AddToolServerModal.svelte:43 type 'openapi' | 'mcp', :313 OAuth 2.1; backend/open_webui/utils/mcp/client.py:67 streamablehttp_client; utils/middleware.py:2340 connect_mcp_server with access check :2361 and function_name_filter_list :2380", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/tool_providers.py:1373 add an MCP server as a tool provider, :1501 MCP OAuth, :1577 list its tools; api/core/mcp/types.py:26 client negotiates protocol 2025-06-18; web/i18n/en-US/agent-v-2.json tools.toolTabs.mcp so agents pick MCP tools" } }, @@ -1959,11 +2039,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/app/mcp_server.py:79 enable an app's MCP server, :181 refresh its URL; api/controllers/mcp/mcp.py:44 /mcp/server//mcp endpoint serving the app as an MCP tool to outside agents Note: each app is exposed as a tool, not the workspace's whole tool catalogue", "n8n": "docs-only: competitor_features#38148 \"core: Acquire expression isolate for MCP Trigger tool calls in queue mode: From n8n@2.32.0 (2026-07-21)\"", - "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:1-7 `hermes mcp serve` stdio MCP server exposing a channel bridge: mcp_serve.py:468 conversations_list, :600 messages_send, :626 channels_list, :662-672 approvals; plugins/platforms/a2a lets outside agents message Hermes Note: Outside agents reach conversations, messaging and approvals, not Hermes' own tool set (files, terminal, web, skills)." + "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:1-7 `hermes mcp serve` stdio MCP server exposing a channel bridge: mcp_serve.py:468 conversations_list, :600 messages_send, :626 channels_list, :662-672 approvals; plugins/platforms/a2a lets outside agents message Hermes Note: Outside agents reach conversations, messaging and approvals, not Hermes' own tool set (files, terminal, web, skills).", + "open-webui": "source read at v0.11.4, not driven: searched 'FastMCP|mcp.server|/mcp' in backend/open_webui (py): the only MCP code is the client (utils/mcp/client.py); Open WebUI exposes an OpenAI-compatible REST API, not an MCP server" } }, { @@ -1987,12 +2068,13 @@ "copilot-studio": "yes", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:213-215 /tools list and /toolsets; hermes_cli/web_routers/tools.py:230 GET /api/tools/toolsets behind web/src/pages/SkillsPage.tsx:140 toolsets view with descriptions; tools/tool_search.py lets the agent search the tool catalog", "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/tool-provider-list.tsx list every installed tool provider (plugins, custom, workflow-as-tool, MCP) with each tool's description; api/controllers/console/workspace/tool_providers.py lists them", - "n8n": "docs-only: competitor_features#31095 \"400+ app connectors: Large library of prebuilt integration nodes.\"" + "n8n": "docs-only: competitor_features#31095 \"400+ app connectors: Large library of prebuilt integration nodes.\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Tools.svelte lists custom tools with descriptions (routers/tools.py); src/lib/components/workspace/Models/BuiltinTools.svelte:14-51 each built-in tool category with label and description; tool servers listed in chat/ToolServersModal.svelte" } }, { @@ -2019,7 +2101,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/tools.py:280-285 PUT /api/tools/toolsets/{name}?profile= enables/disables a toolset per profile and per platform (platform_toolsets.), behind web/src/pages/SkillsPage.tsx toolsets view; hermes_cli/commands.py:213 /tools disable|enable ; agent/subagent_lifecycle.py:415 subagents only get a subset of the parent's toolsets", - "open-webui": "docs-only: competitor_features#38785 \"Access preview for users and groups: Administrators can now preview exactly which models, knowledge bases, and tools a given user or group can access, making it easier to audit and verify permission setups.\"", + "open-webui": "source read at v0.11.4, not driven: per-agent allow-list: src/lib/components/workspace/Models/ModelEditor.svelte:1198 ToolsSelector, :1262 BuiltinTools category toggles (BuiltinTools.svelte:14-51), :1245 Capabilities; backend/open_webui/utils/tools.py:520 get_builtin_tools only returns categories the model allows; tool access grants routers/tools.py:588", "dify": "source read at 1.17.1, not driven: tools are picked per agent (web/i18n/en-US/agent-v-2.json agentDetail.configure.tools.*; classic agent apps list tools in model config). But every Agent v2 run also gets a shell tool (dify-agent/src/dify_agent/layers/shell/layer.py:259,303 run) and 'Tools the agent installs in its sandbox won't appear here but stay available to it' (agent-v-2.json tools.tip) Note: explicit list for classic agents; Agent v2 always has a shell, so not 'nothing else'" } }, @@ -2046,10 +2128,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'request.{0,20}(tool|toolset).{0,20}(access|enable)|ask.{0,20}(user|owner).{0,20}enable' in *.py: none; hermes_cli/tool_availability_notices.py:1-6 only prints startup notices for toolsets missing requirements; tools/tool_search.py:1-7 discloses deferred tools that are already granted Note: The agent cannot ask its owner for a new tool through any built-in flow.", - "dify": "source read at 1.17.1, not driven: searched 'request access|requestAccess|ask.*owner|tool request' in web/i18n/en-US and dify-agent/src: only static 'contact your Workspace Owner' tour text (web/i18n/en-US/common.json:624); no flow where an agent asks for a missing tool" + "dify": "source read at 1.17.1, not driven: searched 'request access|requestAccess|ask.*owner|tool request' in web/i18n/en-US and dify-agent/src: only static 'contact your Workspace Owner' tour text (web/i18n/en-US/common.json:624); no flow where an agent asks for a missing tool", + "open-webui": "source read at v0.11.4, not driven: searched 'request access|request_access|missing tool' in backend/open_webui and src/lib/components: no flow for an agent to ask its owner for a tool; the ask_user tool (tools/builtin.py:518) asks the chat user a question, not for a grant" } }, { @@ -2079,7 +2162,7 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/code_execution_tool.py:1-9 code execution through a session kernel; tools/environments/ docker.py, modal.py, daytona.py, singularity.py, vercel_sandbox.py, ssh.py isolated terminal backends (tools/terminal_tool_backends.py:1-3); hermes_cli/web_routers/tools.py:661 PUT /api/tools/terminal/backend", "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/layers/shell/layer.py:303 agent runs scripts in a per-agent Linux sandbox (dify-agent-runtime/docker/Dockerfile); workflow Code node (web/i18n/en-US/workflow.json blocks.code) runs in dify-sandbox; builtin code tool api/core/tools/builtin_tool/providers/code Note: agent-v-2.json communityEditionIsolationTip: in Community Edition the sandbox is only Landlock-protected and shares a PID namespace, not strongly isolated", "n8n": "docs-only: competitor_features#3038 \"Code Nodes: JavaScript and Python code execution within workflows\"", - "open-webui": "docs-only: competitor_features#38760 \"Open WebUI Computer agent support: Open WebUI can now connect to Open WebUI Computer through its OpenAI-compatible gateway, letting chats run full agent sessions on your own machine with file, terminal, git, and web access.\"" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:633 execute_code; src/lib/components/admin/Settings/CodeExecution.svelte:20 engines pyodide (browser WASM sandbox, src/lib/pyodide/pyodideSandboxHost.ts) and jupyter; plus Open Terminal containers (README.md:36)" } }, { @@ -2104,10 +2187,10 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "yes", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool.py runs git in the working tree; hermes_cli/subcommands/worktree.py:8-26 isolated git worktrees and tools/subagent_worktree.py per-subagent worktrees; hermes_cli/commands.py:173 /diff and :83 /rollback checkpoints (tools/checkpoint_manager.py); skills/software-development/ bundled coding skills", - "open-webui": "docs-only: competitor_features#38760 \"Open WebUI Computer agent support: letting chats run full agent sessions on your own machine with file, terminal, git, and web access.\"", + "open-webui": "source read at v0.11.4, not driven: no git tool in core (searched 'git' in backend/open_webui/tools and utils/tools.py); an agent can run git only through an attached Open Terminal via run_command (utils/tools.py:1439, utils/middleware.py:1287), which is a separate first-party server (README.md:96 open-webui/open-terminal) Note: old yes; git works only with the separate Open Terminal server", "dify": "source read at 1.17.1, not driven: dify-agent-runtime/docker/Dockerfile:31-37 installs git and openssh-client in the agent sandbox; dify-agent/src/dify_agent/layers/shell/layer.py:303 the agent runs shell scripts there, secrets via the env editor (agent-v-2.json advancedSettings.envEditor); official github/gitlab plugins add PR and commit tools Note: through the generic shell, no dedicated git UI" } }, @@ -2137,7 +2220,7 @@ "nextcloud-assistant": "docs-only: competitor_features#31883 \"Model Context Protocol (MCP) tools: Admins add custom services to Context Agent via MCP\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/tool_providers.py:685 add a custom tool from an OpenAPI schema (web/i18n/en-US/tools.json createTool.schema), :904 publish a workflow as a tool, :1373 add an MCP server; agent-v-2.json tools.cliDialog installs a CLI tool into the agent sandbox", "n8n": "docs-only: competitor_features#3045 \"Community Nodes: Community-contributed custom integration nodes\"", - "open-webui": "docs-only: competitor_features#31817 \"Pipelines / custom function plugins: Python function pipelines and filters extend the chat flow\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/tools.py:346 POST /tools/create with Python code (src/routes/(app)/workspace/tools/create/+page.svelte, ToolkitEditor.svelte), :264 /tools/load/url; OpenAPI and MCP tool servers added in settings (src/lib/components/AddToolServerModal.svelte:43)", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:456 register_tool in the plugin context; hermes_cli/subcommands/plugins.py:18 `hermes plugins install` from a git URL, into ~/.hermes/plugins; web/src/i18n/en.ts pluginsPage.installHeading 'Install from GitHub / Git URL'; hermes_cli/subcommands/mcp.py:27 add any MCP server" } }, @@ -2162,10 +2245,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/sessions.py:69-78 `hermes sessions export --format jsonl|trace` writes full transcripts including every tool call and argument, filterable by age and source; hermes_cli/web_routers/sessions.py:787 GET /api/sessions/{id}/export (one session) Note: Tool calls export inside whole transcripts; there is no tool-call-only list or dashboard export across sessions.", - "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI writes query, answer, inputs, sources and feedback (api/services/retention/conversation/message_export_service.py:53-62), no tool calls; api/controllers/console/workflow_run_archive.py:93-130 run-archive download is Cloud paid-plan only; tool spans reach Langfuse and other tracers (api/core/ops) Note: no community export of the tool-call list; old partial rested on the message export, which leaves tool calls out" + "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI writes query, answer, inputs, sources and feedback (api/services/retention/conversation/message_export_service.py:53-62), no tool calls; api/controllers/console/workflow_run_archive.py:93-130 run-archive download is Cloud paid-plan only; tool spans reach Langfuse and other tracers (api/core/ops) Note: no community export of the tool-call list; old partial rested on the message export, which leaves tool calls out", + "open-webui": "source read at v0.11.4, not driven: tool calls live inside each message's output items (utils/tool_approval.py:43 function_call entries) and leave only through chat JSON export (src/lib/components/chat/Settings/DataControls.svelte:93 exportChats, admin routers/chats.py:1049 /all/db) or chat stats export (:609); no dedicated tool-invocation log or export" } }, { @@ -2189,10 +2273,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ChannelsPage.tsx:42-51 live connected/disconnected/fatal state per messaging platform; web/src/pages/SystemPage.tsx:106 runs `doctor` with a live log and :187 memory-provider status, :210 credential pool; hermes_cli/web_routers/mcp.py:195 POST /api/mcp/servers/{name}/test; hermes_cli/doctor_connectivity.py:1-4 provider API probes Note: Spread over Channels, MCP and System pages rather than one list. Old partial.", - "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/routes.ts:2-11 one page for model providers, builtin tools, MCP, custom tools, workflow tools, data sources, endpoints, triggers, agent strategies, extensions, each showing Authorized/Unauthorized (web/i18n/en-US/tools.json auth.authorized, auth.unauthorized) Note: shows whether a connection is authorised, not a live health check" + "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/routes.ts:2-11 one page for model providers, builtin tools, MCP, custom tools, workflow tools, data sources, endpoints, triggers, agent strategies, extensions, each showing Authorized/Unauthorized (web/i18n/en-US/tools.json auth.authorized, auth.unauthorized) Note: shows whether a connection is authorised, not a live health check", + "open-webui": "source read at v0.11.4, not driven: admin Settings tabs Connections, Integrations (tool servers), Code Execution, External Knowledge (src/lib/components/admin/Settings/*.svelte) list outside connections, each with a verify or test action at add time (AddToolServerModal.svelte:206 verifyToolServerConnection, AddTerminalServerModal.svelte:246, ExternalKnowledge.svelte:295); no standing status view showing whether each still works" } }, { @@ -2220,7 +2305,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:1-5 persistent MEMORY.md (agent notes) and USER.md (user profile) injected into every session; agent/background_review.py:1-6 after each turn a forked agent decides what to save; plugins/memory/ bundled providers (honcho, mem0, supermemory, openviking, retaindb, holographic, byterover)", - "open-webui": "docs-only: competitor_features#38763 \"Reworked memory system: Memory has been overhauled with distinct memory types - long-lived personal memories and per-conversation context - managed through a structured add, update, and delete flow.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/memories.py:15 per-user memory table (type user|context, path); utils/memory.py:290 add_memory_context injects memories into each chat; tools/builtin.py:923 add_memory, :865 search_memories let the agent save and recall across chats and automation runs", "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 Agent v2 working directories are owned per conversation, workflow run or build draft, so end-user runs do not carry facts into the next conversation; only builder-applied persistent files and the build note (agent-v-2.json workingDirectory.persistentFilesTooltip) carry over. Learned memory comes from marketplace plugins (official bailian_memory; community mem0, zep in langgenius/dify-plugins) Note: marketplace plugin for learned memory; plugins not read" } }, @@ -2245,11 +2330,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "partial", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 target 'user' = who the user is (name, role, preferences, style) in USER.md; plugins/memory/honcho/__init__.py:1-5 per-peer user modeling with peer cards; mem0 user_id canonical across gateways (plugins/memory/mem0/__init__.py:1-7) Note: USER.md is per profile, not per person; per-person modelling needs the honcho or mem0 provider.", - "open-webui": "docs-only: competitor_features#38763 \"Reworked memory system: long-lived personal memories and per-conversation context - managed through a structured add, update, and delete flow, giving models a more reliable way to remember and apply what they've learned about you.\"", + "open-webui": "source read at v0.11.4, not driven: memory is kept per person: backend/open_webui/models/memories.py:22 user_id, :23 type 'user' for durable facts about the user; utils/memory.py:528 background review writes 'user' facts; src/lib/components/chat/Settings/Personalization/MemoryModal.svelte:97 'Add a preference, fact, or instruction about you' Note: old partial; memory is per user across all models, not per agent", "dify": "source read at 1.17.1, not driven: searched 'user profile|user_memory|remember' in dify-agent/src and api/core/memory (token_buffer_memory.py only): no per-person memory in core; conversation variables are per conversation (api/controllers/console/app/conversation_variables.py:88). Per-user memory only via marketplace memory plugins (community mem0, zep) Note: marketplace plugin only, plugin behaviour not read" } }, @@ -2279,7 +2364,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", "hermes-agent": "source read at v2026.9.24, not driven: memories are plain files $HERMES_HOME/memories/MEMORY.md and USER.md (hermes_cli/web_routers/ops.py:481-492); web/src/pages/SystemPage.tsx:1234-1243 shows their sizes and Reset buttons only; hermes_cli/commands.py:223 /memory pending|approve|reject reviews staged writes; tools/memory_tool.py:311 agent can replace/remove entries on request Note: No viewer or editor in dashboard or CLI; correcting means editing the file by hand or asking the agent.", - "open-webui": "docs-only: competitor_features#38763 \"Reworked memory system: managed through a structured add, update, and delete flow\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/Personalization.svelte:53 lists memories, :61 delete, MemoryModal.svelte:59 Edit Memory; backend/open_webui/routers/memories.py:548 update, :610 delete, :516 delete all", "dify": "source read at 1.17.1, not driven: builders see and edit the agent's persistent files and generated build note (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, files.buildNote, workingDirectory.*) and conversation variables per conversation (api/controllers/console/app/conversation_variables.py:88); there is no learned-memory store to inspect Note: the agent's files are editable, but there is no memory of learned facts to review" } }, @@ -2304,11 +2389,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:56 hard char budgets (memory 2200, user 1375) and :323-324 'IF FULL ... reissue as ONE batch that removes or shortens enough stale entries'; agent/background_review.py:1-6 background review updates existing memory; plugins/memory/holographic/__init__.py:1-5 trust scoring and temporal decay", - "dify": "source read at 1.17.1, not driven: searched 'consolidat|dedupe memory|stale|forget' in dify-agent/src and api/core: dify-agent/src/dify_agent/runtime/compaction.py only compacts the current run's context; nothing merges or prunes stored memory" + "dify": "source read at 1.17.1, not driven: searched 'consolidat|dedupe memory|stale|forget' in dify-agent/src and api/core: dify-agent/src/dify_agent/runtime/compaction.py only compacts the current run's context; nothing merges or prunes stored memory", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/memory.py:410 review_memory_after_turn every N turns (memories.review_interval_turns) asks the model for add/replace/move/remove operations and tells it to prefer replace/remove over duplicates (:528 prompt), applied via routers/memories.py:234 update_memories Note: off by default: ENABLE_MEMORY_BACKGROUND_REVIEW (config.py:428)" } }, { @@ -2337,7 +2423,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31881 \"Context Chat (RAG over Nextcloud data): RAG over Files, Collectives and Analytics\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/datasets.py:446 create a knowledge base, datasets_document.py:384 upload documents, web/app/(commonLayout)/datasets/create; agents search it via Knowledge Retrieval (web/i18n/en-US/agent-v-2.json knowledgeRetrieval.*; dify-agent/src/dify_agent/layers/knowledge/layer.py)", - "open-webui": "docs-only: competitor_features#31813 \"RAG document ingestion / knowledge base: Upload docs and chat over them with retrieval\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/knowledge.py:318 POST /knowledge/create, file add and directories; src/routes/(app)/workspace/knowledge/[id]/+page.svelte, KnowledgeBase/AddContentMenu.svelte; attached to an agent at ModelEditor.svelte:1194; searched by tools/builtin.py:3151 query_knowledge_files", "hermes-agent": "source read at v2026.9.24, not driven: plugins/memory/retaindb/__init__.py:515-564 retaindb_upload_file, retaindb_ingest_file, retaindb_list_files with semantic search (RetainDB cloud API); plugins/memory/openviking/__init__.py:1-6 OpenViking tiered knowledge with semantic search; searched 'knowledge base|vector|embedding' for a built-in document store: none Note: Only through a bundled memory-provider plugin backed by an outside service, driven by agent tools; no upload UI or built-in knowledge base." } }, @@ -2363,10 +2449,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_builder.py:1656-1668 every run loads the working directory's .hermes.md, AGENTS.md chain, CLAUDE.md and .cursorrules plus the profile SOUL.md; agent/context_references.py:1 @file:, @folder:, @git:, @url: references per message; agent/context_file_sources.py:1-6 /context lists what was loaded Note: Context follows the working directory and per-message references; there is no named, reusable bundle of files and records attached to an agent.", - "dify": "source read at 1.17.1, not driven: an agent's Files are kept in its persistent working directory and available in every run (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, workingDirectory.persistentFilesTooltip; api/models/agent.py:218 AgentHomeSnapshot); knowledge retrievals attach per agent. No named bundle of files and records that can be reused across agents Note: per-agent files, not a named reusable context bundle" + "dify": "source read at 1.17.1, not driven: an agent's Files are kept in its persistent working directory and available in every run (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, workingDirectory.persistentFilesTooltip; api/models/agent.py:218 AgentHomeSnapshot); knowledge retrievals attach per agent. No named bundle of files and records that can be reused across agents Note: per-agent files, not a named reusable context bundle", + "open-webui": "source read at v0.11.4, not driven: per-agent bundle: ModelEditor.svelte:1194 Knowledge (knowledge bases, files, notes) stored in ModelMeta.knowledge (backend/open_webui/models/models.py:81) and injected every chat; per-project bundle: folders carry system_prompt and files applied to every chat in them (backend/open_webui/utils/middleware.py:2591-2602)" } }, { @@ -2393,7 +2480,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/context_compressor.py:1-2 automatic compression summarises middle turns with an auxiliary model while head and tail stay; hermes_cli/commands.py:81 /compress with 'here [N]' and --preview", - "open-webui": "docs-only: competitor_features#38759 \"Automatic context compaction for long chats: Conversations that grow past a configurable token threshold can now be summarized automatically so they stay within a model's context window.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/context_compaction.py:42 compact_messages_for_request summarises older turns past a token threshold (DEFAULT_CONTEXT_COMPACTION_PROMPT), retention % in config.py:2203; routers/chats.py:1271 POST /chats/{id}/compact manual; event chat.compacted", "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/runtime/compaction.py:16-44 TieredCompaction clears old tool results then SummarizingCompaction keeps the last 20 messages and summarises older ones, wired in dify-agent/src/dify_agent/runtime/runner.py:365,402 Note: Agent v2 only; classic apps use a token window (api/core/memory/token_buffer_memory.py) without summarising" } }, @@ -2418,10 +2505,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'record|relation|knowledge graph|graph traversal' in agent/ and tools/: agent/learning_graph.py:1-6 only draws a desktop graph of learned skills and memory chunks; plugins/memory/holographic/__init__.py:1-3 resolves entities in stored facts but offers no link-following over records Note: No record store, so nothing to follow links across.", - "dify": "source read at 1.17.1, not driven: searched 'knowledge.?graph|graph_rag|graphrag' in api/core/rag and web/i18n/en-US: no hits; retrieval is vector, full-text, hybrid and parent-child chunks (api/core/rag/retrieval). A neo4j query tool exists only as an official marketplace plugin (tools/neo4j)" + "dify": "source read at 1.17.1, not driven: searched 'knowledge.?graph|graph_rag|graphrag' in api/core/rag and web/i18n/en-US: no hits; retrieval is vector, full-text, hybrid and parent-child chunks (api/core/rag/retrieval). A neo4j query tool exists only as an official marketplace plugin (tools/neo4j)", + "open-webui": "source read at v0.11.4, not driven: searched 'graph|relation|link' in backend/open_webui/retrieval and tools/builtin.py: retrieval is vector plus BM25 hybrid search over chunks; no entity or record relationship graph an agent can walk" } }, { @@ -2446,10 +2534,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; no record or object-on-screen concept in agent/prompt_builder.py context sources (agent/prompt_builder.py:1656-1661)", - "dify": "source read at 1.17.1, not driven: searched 'record|object context|linked records' in api/core/app and dify-agent/src: an answer is grounded only in knowledge retrieval and inputs the caller passes (web/public/embed.js:93 inputs); nothing resolves the record on screen or follows its links" + "dify": "source read at 1.17.1, not driven: searched 'record|object context|linked records' in api/core/app and dify-agent/src: an answer is grounded only in knowledge retrieval and inputs the caller passes (web/public/embed.js:93 inputs); nothing resolves the record on screen or follows its links", + "open-webui": "source read at v0.11.4, not driven: searched 'record|object|linked' in backend/open_webui/utils/middleware.py and tools/builtin.py: there is no record model or 'record on screen' context; grounding is only on attached files, knowledge and notes" } }, { @@ -2473,10 +2562,10 @@ "copilot-studio": "yes", "dify": "yes", "n8n": "unknown", - "open-webui": "yes", + "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", - "open-webui": "docs-only: competitor_features#38762 \"External knowledge bases: Knowledge bases can now be backed by an external retrieval source through configurable external knowledge connections, so you can search an existing external system from chat instead of only Open WebUI's built-in store.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/knowledge.py:697 external knowledge connections to existing Qdrant, Milvus or pgvector collections (src/lib/components/admin/Settings/ExternalKnowledge.svelte:469-471); OneDrive/SharePoint and Google Drive only as one-time file pickers (chat/MessageInput/InputMenu.svelte:399, :707); live SharePoint/wiki sync is the separate oikb project (README.md:98) Note: no live SharePoint or wiki connector in core", "hermes-agent": "source read at v2026.9.24, not driven: optional-mcps/atlassian/manifest.yaml:1-9 Nous-approved catalog entry for Confluence pages and Jira; optional-mcps/notion, microsoft-learn, deepwiki; skills/productivity/notion bundled skill; plugin-catalog/microsoft365.yaml:1-5 SharePoint and OneDrive via a community plugin Note: SharePoint only through a community catalog plugin; wikis such as Confluence and Notion through core catalog MCP entries.", "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/external.py:153,339 connect an external knowledge API as a dataset; api/controllers/console/datasets/data_source.py:228,417 Notion import and sync in core; website crawl datasets/website.py:32; SharePoint and Confluence via official datasource plugins (langgenius/dify-official-plugins datasources/sharepoint_datasource, confluence_datasource) Note: SharePoint itself is a marketplace plugin; Notion wiki and the external-KB API are core" } @@ -2502,10 +2591,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:38 `hermes skills browse` (paginated, filter by source) and :46 search across registries (tools/skills_hub_*.py: official, GitHub, skills.sh, ClawHub); web/src/i18n/en.ts skills.browseHub 'Browse skills hub' on web/src/pages/SkillsPage.tsx:140 hub view", - "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/skills/page.tsx workspace Skills library; api/controllers/console/workspace/skills.py:296 list with search by name or description and tags (web/i18n/en-US/skill.json skillManagement.searchPlaceholder, tags); agents add from it (agent-v-2.json skills.addMenu.workspace 'Add from library') Note: a workspace library, not a public catalogue" + "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/skills/page.tsx workspace Skills library; api/controllers/console/workspace/skills.py:296 list with search by name or description and tags (web/i18n/en-US/skill.json skillManagement.searchPlaceholder, tags); agents add from it (agent-v-2.json skills.addMenu.workspace 'Add from library') Note: a workspace library, not a public catalogue", + "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/workspace/skills/+page.svelte and src/lib/components/workspace/Skills.svelte list every skill the user can read, with search, enable state and owner; backend/open_webui/routers/skills.py:63 GET /skills/list with access grants Note: org-internal catalogue; no public skill store link like the one for models and tools" } }, { @@ -2529,10 +2619,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:54 `hermes skills install `; web/src/pages/SkillsPage.tsx:140 hub view with install; hermes_cli/commands.py:217 /skills install in chat; tools/skills_hub_install.py", - "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:811 /workspaces/current/agents//skills binds library skills to an agent; web/i18n/en-US/agent-v-2.json skills.addMenu.workspace 'Add from library' and skills.addMenu.upload 'Upload skill.zip' (embedded), limit of 20 library skills per agent (skills.workspaceSelector.limitReached)" + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:811 /workspaces/current/agents//skills binds library skills to an agent; web/i18n/en-US/agent-v-2.json skills.addMenu.workspace 'Add from library' and skills.addMenu.upload 'Upload skill.zip' (embedded), limit of 20 library skills per agent (skills.workspaceSelector.limitReached)", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1202 SkillsSelector attaches a skill to an agent in one pick; users can also pull a skill into one chat with the '$' mention (src/lib/components/chat/MessageInput/Commands/Skills.svelte, backend/open_webui/utils/skills.py:23 extract_skill_ids_from_messages)" } }, { @@ -2556,10 +2647,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_tool.py:613 reads metadata.hermes.* (agentskills.io) tags and related_skills and :645 agentskills.io optional compatibility field; tools/skill_manager_tool.py:1-7 SKILL.md + references/ templates/ scripts/ assets/ layout; hermes_cli/subcommands/skills.py:148 publish to GitHub or ClawHub", - "dify": "source read at 1.17.1, not driven: web/i18n/en-US/skill.json emptyAction.importDescription 'Bring a .zip with SKILL.md, in the agentskills.io format', errors.missingSkillMd; api/controllers/console/workspace/skills.py:385 import and :494 export of the package; agent-v-2.json skills.upload.warning.specification 'must follow the Agent Skills specification'" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/skill.json emptyAction.importDescription 'Bring a .zip with SKILL.md, in the agentskills.io format', errors.missingSkillMd; api/controllers/console/workspace/skills.py:385 import and :494 export of the package; agent-v-2.json skills.upload.warning.specification 'must follow the Agent Skills specification'", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Skills.svelte:272 import accepts .md, :306-312 parses SKILL.md frontmatter; backend/open_webui/utils/terminals.py:247 get_terminal_skill reads .agents/skills//SKILL.md directories with resources (:276); utils/skills.py:37 authoring standards (name, description frontmatter, scripts/ references/ assets/) Note: DB skills are single-file; full skill folders only through Open Terminal" } }, { @@ -2583,10 +2675,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/background_review.py:1-6 after each turn a forked agent asks whether any skill should be updated and patches it via skill_manage; hermes_cli/commands.py:124 /refine reviews the conversation and saves lessons to skills; agent/curator.py:1-7 curator may patch skills", - "dify": "source read at 1.17.1, not driven: in Build mode the agent edits its own skills and files from the build conversation and holds them as a build draft to Apply (agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you'; api/controllers/console/agent/roster.py:876,941); the Skill Builder rewrites a skill on request (api/controllers/console/workspace/skills.py:516 assist/messages). Nothing proposes improvements from production runs Note: improves from the builder's build chat, not from what it learned in runs" + "dify": "source read at 1.17.1, not driven: in Build mode the agent edits its own skills and files from the build conversation and holds them as a build draft to Apply (agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you'; api/controllers/console/agent/roster.py:876,941); the Skill Builder rewrites a skill on request (api/controllers/console/workspace/skills.py:516 assist/messages). Nothing proposes improvements from production runs Note: improves from the builder's build chat, not from what it learned in runs", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:35 SKILLS_CREATE_RE '/skills:create' makes the model distill the current chat into a SKILL.md and save it (:81-115), which can rewrite an existing skill; it runs only when a user types the command and needs an Open Terminal (:133); searched 'improve|propose|revision' in utils/skills.py and routers/skills.py: no agent-initiated proposals" } }, { @@ -2610,10 +2703,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/write_approval.py:1-9 skills.write_approval stages agent skill writes under pending/skills/.json with a difflib diff; hermes_cli/commands.py:217-221 /skills pending|diff|approve|reject|approval; hermes_cli/write_approval_commands.py:1 Note: Off by default; the operator switches the gate on.", - "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/build-draft-changes-panel.tsx lists changed sections as Updated/Rewritten with Apply or Discard (build-draft-bar.tsx; roster.py:932 DELETE build-draft, :941 apply); skill drafts publish or restore (skills.py:678,703). Searched 'diff|compare' in web/i18n/en-US/skill.json and agent-v-2.json: no side-by-side difference Note: accept or reject yes, a visible diff no" + "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/build-draft-changes-panel.tsx lists changed sections as Updated/Rewritten with Apply or Discard (build-draft-bar.tsx; roster.py:932 DELETE build-draft, :941 apply); skill drafts publish or restore (skills.py:678,703). Searched 'diff|compare' in web/i18n/en-US/skill.json and agent-v-2.json: no side-by-side difference Note: accept or reject yes, a visible diff no", + "open-webui": "source read at v0.11.4, not driven: searched 'draft|diff|review|version|history' in backend/open_webui/routers/skills.py and models/skills.py: skills are edited in place (routers/skills.py:274 update); no proposed-change queue, diff or accept/reject (prompts have versions at routers/prompts.py:384, skills do not)" } }, { @@ -2637,10 +2731,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/background_review.py:463 'CREATE A NEW CLASS-LEVEL UMBRELLA SKILL when no existing skill covers the class' in the post-turn review prompt; tools/skill_manager_tool.py:1-5 new skills land in ~/.hermes/skills/; hermes_cli/commands.py:232 /learn builds a skill on request", - "dify": "source read at 1.17.1, not driven: agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you': the agent writes skills while the builder chats in Build mode (roster.py:846 build-draft/checkout); searched 'auto.?create|learn|after solving' in dify-agent/src: no path where an agent writes a skill on its own after a production run Note: only inside a builder-driven Build session" + "dify": "source read at 1.17.1, not driven: agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you': the agent writes skills while the builder chats in Build mode (roster.py:846 build-draft/checkout); searched 'auto.?create|learn|after solving' in dify-agent/src: no path where an agent writes a skill on its own after a production run Note: only inside a builder-driven Build session", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:81 _build_skill_create_prompt, default request 'the workflow we just went through in this conversation ... distill them into a reusable skill' (:84-86); triggered only by the user's /skills:create command and saved to the Open Terminal (:108), not on the agent's own initiative" } }, { @@ -2664,10 +2759,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/curator.py:1-7 inactivity-triggered curator runs every interval_hours, archives stale skills (never deletes), consolidates duplicates into umbrella skills, honours pins; hermes_cli/curator.py:98-163 `hermes curator` status/run --consolidate; hermes_cli/commands.py:245 /curator pin|archive|list-archived Note: The LLM merge pass is opt-in (curator.consolidate); archiving runs by default.", - "dify": "source read at 1.17.1, not driven: searched 'curator|merge skill|duplicate skill|archive unused|stale' in api/services/skill_management_service.py, api/schedule and web/i18n/en-US/skill.json: only manual duplicate and delete (api/controllers/console/workspace/skills.py:474, skill.json deleteDialog); no scheduled merge or archive" + "dify": "source read at 1.17.1, not driven: searched 'curator|merge skill|duplicate skill|archive unused|stale' in api/services/skill_management_service.py, api/schedule and web/i18n/en-US/skill.json: only manual duplicate and delete (api/controllers/console/workspace/skills.py:474, skill.json deleteDialog); no scheduled merge or archive", + "open-webui": "source read at v0.11.4, not driven: searched 'curator|merge|archive|dedupe|unused' in backend/open_webui/routers/skills.py, models/skills.py, utils/skills.py and utils/automations.py: no scheduled job that merges or archives skills" } }, { @@ -2691,10 +2787,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/skill_usage.py:1-6 per-skill use counts, provenance (bundled, hub, agent-created) and lifecycle active -> stale -> archived; web/src/i18n/en.ts analytics.topSkills with loads, edits, last used on AnalyticsPage; hermes_cli/subcommands/skills.py:28 trust/untrust and :85 audit (security scan verdicts) Note: Signals exist (usage, lifecycle, trust, scan) but no maturity or proven rating shown per skill before use.", - "dify": "source read at 1.17.1, not driven: searched 'maturity|proven|rating|success rate|eval' in web/i18n/en-US/skill.json and api/services/skill_management_service.py: a skill shows only draft/published state, version number and 'Used by N agents' (skill.json detail.referencedBy_one, referenceCount); no maturity or proof signal Note: usage count is the only trust hint" + "dify": "source read at 1.17.1, not driven: searched 'maturity|proven|rating|success rate|eval' in web/i18n/en-US/skill.json and api/services/skill_management_service.py: a skill shows only draft/published state, version number and 'Used by N agents' (skill.json detail.referencedBy_one, referenceCount); no maturity or proof signal Note: usage count is the only trust hint", + "open-webui": "source read at v0.11.4, not driven: searched 'maturity|usage count|rating|verified|stable' in backend/open_webui/models/skills.py, routers/skills.py and src/lib/components/workspace/Skills*: a skill has name, description, content, meta, is_active (models/skills.py:20-32), no maturity or proof signal" } }, { @@ -2718,10 +2815,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:112 `skills diff` against the stock bundled version and :94 reset; agent/curator_backup.py:1-6 tar.gz snapshot of the whole skills tree before each curator pass with rollback; tools/write_approval.py:1-9 staged diffs for pending writes Note: No per-skill version history; rollback is whole-tree curator snapshots and compare is only against the bundled stock copy.", - "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:743,758 versions list and detail, :703 restore a version to draft; web/i18n/en-US/skill.json detail.versions, versionPublishNote, restoreVersion. Searched 'compare|diff' in skill.json: no comparison of two versions Note: history and rollback yes, compare no" + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:743,758 versions list and detail, :703 restore a version to draft; web/i18n/en-US/skill.json detail.versions, versionPublishNote, restoreVersion. Searched 'compare|diff' in skill.json: no comparison of two versions Note: history and rollback yes, compare no", + "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/skills.py and routers/skills.py: updates overwrite content (routers/skills.py:274); version history exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)" } }, { @@ -2745,10 +2843,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:165-171 `skills tap add owner/repo` adds a GitHub repo as a skill source; tools/skills_hub_github.py search and install; hermes_cli/subcommands/skills.py:148-153 `skills publish --to github --repo`", - "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 import takes only an uploaded zip (request.files['file']); searched 'github|repository|publish to' in api/services/skill_management_service.py and skill.json: no GitHub discovery, install or publish" + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 import takes only an uploaded zip (request.files['file']); searched 'github|repository|publish to' in api/services/skill_management_service.py and skill.json: no GitHub discovery, install or publish", + "open-webui": "source read at v0.11.4, not driven: searched 'github|url' in backend/open_webui/routers/skills.py: no URL or GitHub install and no publish; GitHub raw loading exists only for tools and functions (routers/tools.py:247 github_url_to_raw_url, :264 /tools/load/url)" } }, { @@ -2772,10 +2871,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:319-322 corrections for a kind of work belong in that task's skill via skill_manage; agent/background_review.py:1-6 post-turn review patches the skill with the lesson; hermes_cli/commands.py:124 /refine saves lessons to memory/skills Note: Old partial; the review loop writes lessons into skills.", - "dify": "source read at 1.17.1, not driven: searched 'lesson|learning|rule' in dify-agent/src, api/services/skill_management_service.py and web/i18n/en-US/skill.json: no mechanism that turns repeated run lessons into skill rules; the build note (agent-v-2.json files.buildNote) records build-session setup only" + "dify": "source read at 1.17.1, not driven: searched 'lesson|learning|rule' in dify-agent/src, api/services/skill_management_service.py and web/i18n/en-US/skill.json: no mechanism that turns repeated run lessons into skill rules; the build note (agent-v-2.json files.buildNote) records build-session setup only", + "open-webui": "source read at v0.11.4, not driven: searched 'learning|lesson|rule' in backend/open_webui/utils/skills.py, utils/memory.py and routers/skills.py: run lessons go to per-user memory (utils/memory.py:410), never into a skill's rules" } }, { @@ -2799,10 +2899,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/skills_hub.py:1260-1280 `skills snapshot export` writes only hub identifiers and taps to JSON; hermes_cli/subcommands/profile.py:115 profile export carries all skills; hermes_cli/subcommands/skills.py:148 publish to GitHub/ClawHub; skills are plain SKILL.md folders on disk Note: No single-skill export action; a skill is exported by copying its folder, publishing it, or exporting the whole profile.", - "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:494 /workspaces/current/skills//export returns the skill package; single files downloadable (web/i18n/en-US/skill.json detail.downloadFile)" + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:494 /workspaces/current/skills//export returns the skill package; single files downloadable (web/i18n/en-US/skill.json detail.downloadFile)", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/skills.py:123 GET /skills/export; src/lib/components/workspace/Skills/SkillMenu.svelte:16 per-skill Export, Skills.svelte:91 Export JSON (permission workspace.skills_export) Note: exports JSON, not SKILL.md" } }, { @@ -2826,10 +2927,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:54-58 install takes a registry identifier or a direct HTTP(S) URL to a SKILL.md; :165-171 taps add any GitHub repo as a source; tools/skills_hub_sources.py", - "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 the only import path is a multipart zip upload; searched 'url|source address|remote' in the skill import payload and skill.json: no install from an outside address" + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 the only import path is a multipart zip upload; searched 'url|source address|remote' in the skill import payload and skill.json: no install from an outside address", + "open-webui": "source read at v0.11.4, not driven: skills import from a local .md or .json file (src/lib/components/workspace/Skills.svelte:272) and are read live from an attached Open Terminal's .agents/skills folder (backend/open_webui/utils/terminals.py:263 GET {terminal}/skills/{name}); searched 'url|load' in routers/skills.py: no install from an outside address" } }, { @@ -2853,10 +2955,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'eval|with and without|baseline' in tools/skill*.py, hermes_cli/subcommands/skills.py and optional-skills/*/SKILL.md: no skill test-case runner; tools/skillevaluator_scan.py:1-7 is an advisory security scan on install; evals/ holds developer regression harnesses (evals/compaction, evals/tool_search ...) with no user surface", - "dify": "source read at 1.17.1, not driven: searched 'evaluation|eval_set|test case' in api/controllers and web/i18n/en-US: only tracing-provider blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix 'evaluation') and dataset hit testing; no run of a skill against cases with and without it" + "dify": "source read at 1.17.1, not driven: searched 'evaluation|eval_set|test case' in api/controllers and web/i18n/en-US: only tracing-provider blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix 'evaluation') and dataset hit testing; no run of a skill against cases with and without it", + "open-webui": "source read at v0.11.4, not driven: searched 'eval|test case|benchmark' in backend/open_webui/routers/skills.py, utils/skills.py and routers/evaluations.py: evaluations compare models by user feedback and arena ELO (routers/evaluations.py:222 leaderboard), nothing runs a skill against test cases with and without it" } }, { @@ -2881,12 +2984,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "yes", - "open-webui": "partial", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugins/model-providers/ ships anthropic, azure-foundry, bedrock, gemini, vertex, deepseek, openrouter, xai, nvidia, huggingface and 30 more provider plugins; hermes_cli/subcommands/model.py `hermes model`; web/src/pages/ModelsPage.tsx and ProfilesPage.tsx:673 model picker Note: Mistral via OpenRouter or a custom endpoint; no dedicated Mistral plugin directory.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/model_providers.py:148,200 provider list and credentials; web/i18n/en-US/common.json:378-379 'Please install a model provider first ... from the Marketplace': core ships no provider, OpenAI, Anthropic, Mistral etc. are official plugins (langgenius/dify-official-plugins models/openai, anthropic, mistralai, ...) Note: every provider is a marketplace plugin run by the plugin daemon; old yes rested on a feature line", "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"", - "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:129 native Anthropic model listing and :485 anthropic-version headers (utils/anthropic.py), :208 Azure AD auth, :890 Azure; any OpenAI-compatible provider such as OpenAI, Mistral, Groq, OpenRouter (README.md:28); admin UI src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte Note: old partial rested on a feature row; the code connects OpenAI, Anthropic natively and Mistral through the compatible API" } }, { @@ -2915,7 +3018,7 @@ "nextcloud-assistant": "docs-only: competitor_features#31885 \"Local model backend: Runs against local LLM ExApp / Ollama-compatible backends\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 Ollama native /api/tags probe and LM Studio /api/v1/models with load-on-demand; hermes_cli/web_routers/local_models.py dashboard routes", "dify": "source read at 1.17.1, not driven: no local runtime in core (web/i18n/en-US/common.json:378 install a provider first); official plugins models/ollama, localai, xinference, openllm, triton_inference_server, huggingface_tei in langgenius/dify-official-plugins Note: marketplace plugin only", - "open-webui": "docs-only: competitor_features#31810 \"Local model support via Ollama: Native Ollama integration for fully local inference\"" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/ollama.py full Ollama proxy with pull/manage (src/lib/components/admin/Settings/Connections/ManageOllamaModal.svelte), load balancing across URLs (:863 random.choice); openai.py:276 LM Studio provider; bundled :ollama image (README.md:26)" } }, { @@ -2944,7 +3047,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31390 \"AppAPI ExApp + Task Processing backend: Python ExApp requiring AppAPI >=3.1 and a tool-calling text2text provider (llm2 or integration_openai).\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/model_setup_flows_custom.py:1-3 custom OpenAI-compatible endpoint wizard (custom_providers / providers.); plugins/model-providers/custom", - "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:865 GET /openai/models/{url_idx} over any configured base URL + key; src/lib/components/AddConnectionModal.svelte and admin/Settings/Connections/OpenAIConnection.svelte add arbitrary OpenAI-compatible endpoints", "dify": "source read at 1.17.1, not driven: official plugin langgenius/dify-official-plugins models/openai_api_compatible adds any OpenAI-compatible endpoint; core only provides the provider framework (api/controllers/console/workspace/model_providers.py:148) Note: marketplace plugin only" } }, @@ -2970,11 +3073,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31880 \"Unified AI Task Processing GUI: Frontend for the Nextcloud Task Processing API\"", "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud|taskprocessing' repo-wide (excluding website/): none outside one test; no provider plugin for Nextcloud's AI task processing in plugins/model-providers/", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|taskprocessing' in api/ and web/: no hits; models come only from Dify provider plugins" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|taskprocessing' in api/ and web/: no hits; models come only from Dify provider plugins", + "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|taskprocessing|task_processing' in backend/open_webui: no connection to Nextcloud AI task processing" } }, { @@ -2999,9 +3103,9 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "yes", + "open-webui": "partial", "evidence": { - "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:898 GET /api/v1/models and :1109 POST /api/v1/chat/completions (OpenAI-compatible), :2003 /api/v1/messages (Anthropic-compatible) expose every agent, custom models included, to outside clients with an API key; no Nextcloud TaskProcessing provider Note: old yes; any OpenAI-compatible client can use the agents, but nothing registers them inside Nextcloud", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions and /v1/responses serve the agent to any OpenAI client (per profile under /p//); searched 'nextcloud|taskprocessing' repo-wide: no Nextcloud provider registration Note: Another system can use Hermes as an OpenAI-compatible text model; there is no Nextcloud text-generation provider.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|text2text provider' in api/ and web/: nothing registers Dify apps as a provider for another platform's AI task framework; apps are reachable only through Dify's own service API (api/controllers/service_api/app/completion.py) and MCP (api/controllers/mcp/mcp.py:44)" } @@ -3027,11 +3131,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/profiles.py:942 PUT /api/profiles/{name}/model per profile (web/src/pages/ProfilesPage.tsx:673); hermes_cli/config_defaults.py:1332-1338 delegation block sets a separate subagent model; hermes_cli/commands.py:157 /model per session; cron jobs carry their own model (hermes_cli/subcommands/cron.py:23 create)", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 each agent picks its own provider and model; each workflow LLM/Agent node and each classic app carries its own model config (api/controllers/console/app/model_config.py)", - "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"" + "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"", + "open-webui": "source read at v0.11.4, not driven: each workspace model has its own base_model_id and params (backend/open_webui/models/models.py:118-120; ModelEditor.svelte:856); automations pick a model per task (models/automations.py:75 model_id, src/lib/components/automations/ModelDropdown.svelte)" } }, { @@ -3055,10 +3160,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'allowed_models|model_allowlist|blocked_models' in *.py: only tools/mcp_tool_sampling.py:181 limits which models an MCP server's sampling requests may use; no organisation or tenant model in hermes_cli/profiles.py:538 ProfileInfo Note: No tenants and no model allowlist per group of agents.", - "dify": "source read at 1.17.1, not driven: providers and credentials are per workspace (api/controllers/console/workspace/model_providers.py:148,200); api/controllers/console/workspace/models.py:519-545 enable/disable individual models for the workspace so its apps cannot pick them Note: per workspace; per-role model rights (permission-keys.json plugin.model_config) need enterprise RBAC" + "dify": "source read at 1.17.1, not driven: providers and credentials are per workspace (api/controllers/console/workspace/model_providers.py:148,200); api/controllers/console/workspace/models.py:519-545 enable/disable individual models for the workspace so its apps cannot pick them Note: per workspace; per-role model rights (permission-keys.json plugin.model_config) need enterprise RBAC", + "open-webui": "source read at v0.11.4, not driven: model access is per user or group through access grants (backend/open_webui/utils/models.py:465 check_model_access, main.py:1151; admin/Settings/Models access control); searched 'tenant|organization' in backend/open_webui/routers and models: no tenant scope Note: group-level model allow-lists only; no organisation or tenant concept" } }, { @@ -3083,10 +3189,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:715-790 auxiliary. provider/model per feature: vision, compression, approval, title_generation, curator, kanban_decomposer, profile_describer, goal_judge, background_review, monitor, moa_aggregator and more", - "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/models.py:205 default-model per model type (system reasoning, embedding, rerank, speech2text, tts) and :633 models by type; every app, node, knowledge base and generator picks its own model, so summaries and triage can run on different providers" + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/models.py:205 default-model per model type (system reasoning, embedding, rerank, speech2text, tts) and :633 models by type; every app, node, knowledge base and generator picks its own model, so summaries and triage can run on different providers", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/config.py:2180 TASK_MODEL and :2182 TASK_MODEL_EXTERNAL for titles, tags, queries and autocomplete, set in src/lib/components/admin/Settings/Interface.svelte:180; separate engines per feature in admin Settings Audio, Images, Documents (embedding, reranker), WebSearch" } }, { @@ -3111,10 +3218,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:24 fallback_providers chain; hermes_cli/subcommands/fallback.py:10-24 `hermes fallback add|list|remove|clear`; hermes_cli/fallback_config.py:1 effective chain; agent/fallback_cooldown.py cools a failing provider", - "dify": "source read at 1.17.1, not driven: api/core/model_manager.py:440-477,1003-1066 load balancing rotates credentials of the same model and cools down one on rate-limit or connection errors; off by default (api/configs/feature/__init__.py:813 MODEL_LB_ENABLED=False). A second provider only by wiring a fail branch to another LLM node (web/i18n/en-US/workflow.json nodes.common.errorHandle.failBranch) Note: same-model credential failover, not provider fallback" + "dify": "source read at 1.17.1, not driven: api/core/model_manager.py:440-477,1003-1066 load balancing rotates credentials of the same model and cools down one on rate-limit or connection errors; off by default (api/configs/feature/__init__.py:813 MODEL_LB_ENABLED=False). A second provider only by wiring a fail branch to another LLM node (web/i18n/en-US/workflow.json nodes.common.errorHandle.failBranch) Note: same-model credential failover, not provider fallback", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1137-1147 ENABLE_CUSTOM_MODEL_FALLBACK (env.py:1035, off by default) swaps to the first default model only when a custom model's base model is missing; Ollama spreads requests over URLs (routers/ollama.py:863 random.choice) but does not retry another provider on an error; searched 'failover|retry' in routers/openai.py: none Note: no runtime failover when a provider call fails" } }, { @@ -3139,10 +3247,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'sensitiv|classification|pii.*route|route.*pii' in agent/ and hermes_cli/: no data-class routing; hermes_cli/model_data_policy_guard.py:1-6 only warns at model selection when a tier trains on prompts; agent/redact.py redacts secrets from logs and output Note: No rule that keeps sensitive data away from particular models.", - "dify": "source read at 1.17.1, not driven: searched 'sensitiv|classification|pii|route.*model' in api/core/model_manager.py, api/core/moderation and dify-agent/src: no routing of data by sensitivity; only content moderation (api/core/moderation) that blocks or replaces text" + "dify": "source read at 1.17.1, not driven: searched 'sensitiv|classification|pii|route.*model' in api/core/model_manager.py, api/core/moderation and dify-agent/src: no routing of data by sensitivity; only content moderation (api/core/moderation) that blocks or replaces text", + "open-webui": "source read at v0.11.4, not driven: searched 'sensitiv|classification|pii|confidential' in backend/open_webui/utils/middleware.py, utils/models.py and main.py: routing follows the chosen model only; no data-classification based model selection" } }, { @@ -3167,10 +3276,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugin-catalog/claude-subscription-directsdk.yaml:1-5 official NousResearch catalog plugin runs Hermes turns through the logged-in claude CLI (Agent SDK path); skills/autonomous-ai-agents/claude-code/SKILL.md:1-3 bundled skill delegates coding to the Claude Code CLI; tools/environments/docker.py can host the terminal Note: The turn runner is a catalog plugin, not core, and nothing places the claude CLI in its own container by design.", - "dify": "source read at 1.17.1, not driven: searched 'claude code|claude cli|anthropic cli' in api/, dify-agent/src and dify-agent-runtime: model turns go through provider plugins (dify-agent/src/dify_agent/layers/dify_plugin/llm_layer.py); no runner that drives the claude command line tool" + "dify": "source read at 1.17.1, not driven: searched 'claude code|claude cli|anthropic cli' in api/, dify-agent/src and dify-agent-runtime: model turns go through provider plugins (dify-agent/src/dify_agent/layers/dify_plugin/llm_layer.py); no runner that drives the claude command line tool", + "open-webui": "source read at v0.11.4, not driven: searched 'claude|subprocess|cli' in backend/open_webui/utils and routers: Anthropic is called over HTTP (utils/anthropic.py:15 ANTHROPIC_VERSION); no runner that shells out to the claude CLI in a container" } }, { @@ -3194,11 +3304,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/secrets.py:8-20 `hermes secrets bitwarden|onepassword` pull provider keys from Bitwarden Secrets Manager or 1Password (agent/secret_sources/bitwarden.py:1-5, onepassword.py) so they need not sit in .env; agent/credential_pool.py:1 shared credential pool per provider; agent/secret_scope.py:1-10 profile-scoped key resolution in the multiplexed gateway", "dify": "source read at 1.17.1, not driven: model keys live once per workspace provider, encrypted, with named credentials and switching (api/controllers/console/workspace/model_providers.py:200,291; models.py:342,495); agents and apps reference the provider, never hold the key; api/models/credential_permission.py:1-35 limits which members may use a credential Note: per-member credential access needs enterprise RBAC (permission-keys.json credential.use)", - "n8n": "docs-only: competitor_features#3040 \"Credential Management: Encrypted credential storage for all integrations\"" + "n8n": "docs-only: competitor_features#3040 \"Credential Management: Encrypted credential storage for all integrations\"", + "open-webui": "source read at v0.11.4, not driven: provider keys live once in admin connection config (backend/open_webui/routers/openai.py:360 get_openai_connection by url_idx, config.py:2829 openai.api_keys), set in src/lib/components/admin/Settings/Connections.svelte; agents reference a base model id, never a key (models/models.py:118); tool-server OAuth tokens Fernet-encrypted (utils/oauth.py:269) Note: central config store, not an external vault" } }, { @@ -3222,10 +3333,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 routes a sender user_id to a profile, and each profile has its own .env/auth.json keys (agent/secret_scope.py:1-10); searched 'per.?user.{0,20}(key|credential)|byok' in *.py: only tool-provider BYOK rows (hermes_cli/tools_config_providers.py:760) Note: A person gets their own key only by being routed to their own profile; no per-user key field.", - "dify": "source read at 1.17.1, not driven: searched 'personal credential|per.?user credential|end.?user.*credential' in api/core/tools, api/services/tools and web/i18n/en-US: credentials are workspace-level (api/controllers/console/workspace/model_providers.py:200) and runs use the app's configured credential; api/models/credential_permission.py only restricts who may use a shared credential" + "dify": "source read at 1.17.1, not driven: searched 'personal credential|per.?user credential|end.?user.*credential' in api/core/tools, api/services/tools and web/i18n/en-US: credentials are workspace-level (api/controllers/console/workspace/model_providers.py:200) and runs use the app's configured credential; api/models/credential_permission.py only restricts who may use a shared credential", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/Connections.svelte:66 per-user Direct Connections (own endpoint and key), enabled by admin 'direct.enable' (backend/open_webui/config.py:230 ENABLE_DIRECT_CONNECTIONS); main.py:1164 _set_direct_model routes the user's runs through it Note: direct connections run from the browser session and are refused for sub-agents (utils/subagents.py:334)" } }, { @@ -3257,7 +3369,7 @@ "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml self-hosts the whole stack (api, worker, web, plugin daemon, sandbox, agent runtime, vector store); with a local model plugin (langgenius/dify-official-plugins models/ollama, localai, xinference) processing stays on premise Note: local model serving itself is a marketplace plugin", "n8n": "docs-only: competitor_features#31099 \"Self-hosting via Docker: Run community edition on own infra with Docker.\"", - "open-webui": "docs-only: competitor_features#31819 \"Offline / air-gapped deployment: Runs fully self-hosted with no external calls required\"" + "open-webui": "source read at v0.11.4, not driven: self-hosted server (README.md:26 pip, Docker, Kubernetes) with local inference via Ollama (backend/open_webui/routers/ollama.py) and local embeddings, Whisper STT and local TTS engines; nothing forces an outside call" } }, { @@ -3281,11 +3393,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31374 \"Talk tool: List conversations, send messages, create public conversations from the agent.\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 delivers job output to origin, home or explicit chat targets on connected platforms (telegram, discord, slack, matrix, mattermost, teams and more under plugins/platforms/); web/src/i18n/en.ts cron.deliverTo; searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter Note: Delivery into a team chat room works; Nextcloud Talk is not a target.", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; no official plugin for Nextcloud Talk in langgenius/dify-official-plugins tools/ (only slack, teams, discord, dingtalk, wecom, telegraph)" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; no official plugin for Nextcloud Talk in langgenius/dify-official-plugins tools/ (only slack, teams, discord, dingtalk, wecom, telegraph)", + "open-webui": "source read at v0.11.4, not driven: automation output can go to an Open WebUI channel: backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation, src/lib/components/automations/DestinationDropdown.svelte; searched 'talk|spreed|nextcloud' in backend/open_webui: no Nextcloud Talk Note: delivers to its own channels, not Talk" } }, { @@ -3309,10 +3422,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/run_inbound.py handles group-room messages and replies in the same room on every platform adapter; gateway/platforms/access_policy_mixin.py:6-68 group allowlists per chat; searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter Note: Chat-room bridging exists for other chat systems, not for Nextcloud Talk.", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; chat-app bridges exist only as plugin endpoints for other messengers (api/controllers/console/workspace/endpoint.py), none for Nextcloud Talk" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; chat-app bridges exist only as plugin endpoints for other messengers (api/controllers/console/workspace/endpoint.py), none for Nextcloud Talk", + "open-webui": "source read at v0.11.4, not driven: in Open WebUI channels a member @mentions a model and the reply lands in the room or thread: backend/open_webui/routers/channels.py:976 model_response_handler, :1244; src/lib/components/channel/MessageInput/MentionList.svelte; no Nextcloud Talk bridge Note: own channels only" } }, { @@ -3337,10 +3451,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter; hermes_cli/commands.py:76 /branch opens a new thread on Discord/Telegram/Slack/Matrix, which separates sessions but does not group agent rooms apart from human rooms", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed|room' in api/ and web/: no Talk integration, so no agent-room grouping" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed|room' in api/ and web/: no Talk integration, so no agent-room grouping", + "open-webui": "source read at v0.11.4, not driven: searched 'agent room|bot room|category' in backend/open_webui/models/channels.py and src/lib/components/channel: channels have types group/dm/standard, no marking or grouping of agent rooms apart from human ones" } }, { @@ -3364,9 +3479,9 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "yes", + "open-webui": "partial", "evidence": { - "open-webui": "docs-only: competitor_features#38765 \"New event system with webhooks: Open WebUI now emits events for a wide range of system activity - sign-ins, configuration changes, startup, and actions across chats, knowledge, files, and more. Administrators can send these as outbound webhooks.\"", + "open-webui": "source read at v0.11.4, not driven: admin event webhooks (backend/open_webui/events.py:1034 dispatch_webhook_event, filters :707) and per-user notification webhooks (utils/notifications.py:264 chat.finished payload with the answer text and link) post output to another system; utils/webhook.py:30 post_webhook sends plain JSON; searched 'hmac|signature' in utils/webhook.py, events.py, utils/notifications.py: unsigned Note: old yes; webhooks exist but carry no signature", "hermes-agent": "source read at v2026.9.24, not driven: agent/outbound_webhooks.py:1-7 hooks.outbound entries POST lifecycle events (hermes_cli/plugins.py:108-118 post_llm_call, post_tool_call, on_stream_end ...) HMAC-SHA256 signed via X-Hermes-Signature-256; cron/scheduler_delivery.py:32 'webhook' is a cron delivery target", "dify": "source read at 1.17.1, not driven: a workflow HTTP Request node posts an agent's output to any URL with API-Key, Basic, Bearer or custom header auth (web/i18n/en-US/workflow.json:510-518 nodes.http.authorization.*); searched 'hmac|signature|sign' in workflow.json and the http node: no payload signing Note: outbound webhook yes, signed no" } @@ -3393,11 +3508,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31375 \"Mail tool: Send emails, manage mail accounts and folders.\"", "dify": "source read at 1.17.1, not driven: core sends mail only for Human Input requests (api/tasks/mail_human_input_delivery_task.py; web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*) and account/comment mails (api/tasks/mail_*.py); sending an agent's output as an email needs the official email/gmail/outlook tool plugins Note: marketplace plugin for general delivery", - "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:32 'email' delivery target; plugins/platforms/email/plugin.yaml:5-8 IMAP/SMTP email adapter; web/src/i18n/en.ts cron.delivery.email on CronPage" + "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:32 'email' delivery target; plugins/platforms/email/plugin.yaml:5-8 IMAP/SMTP email adapter; web/src/i18n/en.ts cron.delivery.email on CronPage", + "open-webui": "source read at v0.11.4, not driven: searched 'smtp|email|sendmail' in backend/open_webui/utils/notifications.py, utils/webhook.py, events.py and routers: notification targets accept type 'webhook' only (utils/notifications.py:34)" } }, { @@ -3424,7 +3540,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/terminal_notify.py:1-5 OS notifications via OSC 9/777 from the CLI; apps/desktop/electron/notification-ipc.ts:53 native desktop notifications; cron/scheduler_delivery.py:43-47 run results and approval prompts land in the home channel on Telegram, Discord, Slack, Signal; searched 'nextcloud' repo-wide: none Note: Notifies through desktop and messaging channels, not Nextcloud notifications. Old yes rested on a docs line about notifications in general.", - "open-webui": "docs-only: competitor_features#38867 \"Calendar reminders and alerts: Calendar events now support reminder options from no alert up to one hour before start time, with upcoming alerts delivered through in-app toasts, browser notifications, and optional webhooks while avoiding duplicate sends.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/events.py:669 NOTIFICATION_EVENTS chat.finished, chat.failed, channel.message, calendar.alert; src/routes/+layout.svelte:622 browser Notification, utils/automations.py:500 'automation:result' socket toast; src/lib/components/chat/Settings/Notifications.svelte:32-38 per-event choice Note: 'needs me' for a waiting approval surfaces only inside the open chat", "dify": "source read at 1.17.1, not driven: when a run needs a person, the Human Input node emails workspace members or externals (api/tasks/mail_human_input_delivery_task.py; workflow.json humanInput.deliveryMethod.emailConfigure.allMembers); api/controllers/console/notification.py:43 is only product announcements. Searched 'run finished|run completed|notify' in api/tasks and web/i18n/en-US: no notice when a run finishes Note: email when input is needed, nothing on completion, no in-app notification" } }, @@ -3449,10 +3565,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:148 /sethome sets this chat as the home channel; cron/scheduler_delivery.py:43-47 _HOME_CHANNEL resolves the default target; web/src/i18n/en.ts cron.deliverTo with 'set a home channel first'", - "dify": "source read at 1.17.1, not driven: searched 'delivery target|default delivery|preferred channel' in api/ and web/i18n/en-US: delivery is wired per workflow node (HTTP, tool plugins, Human Input delivery methods); no per-person default delivery setting" + "dify": "source read at 1.17.1, not driven: searched 'delivery target|default delivery|preferred channel' in api/ and web/i18n/en-US: delivery is wired per workflow node (HTTP, tool plugins, Human Input delivery methods); no per-person default delivery setting", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/notifications.py:56 add target, :84 PUT /targets/{id}/default; utils/notifications.py:213 set_default_target; per-user settings in src/lib/components/chat/Settings/Notifications.svelte" } }, { @@ -3477,11 +3594,12 @@ "copilot-studio": "partial", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/ telegram, slack, teams, discord, whatsapp, matrix, mattermost, sms, line, feishu, dingtalk, wecom, google_chat and more; gateway/platforms/signal.py Signal adapter; hermes_cli/subcommands/gateway.py setup and web/src/pages/ChannelsPage.tsx", "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"", - "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/endpoint.py plugin endpoints host chat bots; official extensions slack_bot and wecom_bot, triggers slack_trigger and telegram_trigger (langgenius/dify-official-plugins extensions/, triggers/), community microsoft-teams (langgenius/dify-plugins); nothing for Signal found Note: marketplace plugin only" + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/endpoint.py plugin endpoints host chat bots; official extensions slack_bot and wecom_bot, triggers slack_trigger and telegram_trigger (langgenius/dify-official-plugins extensions/, triggers/), community microsoft-teams (langgenius/dify-plugins); nothing for Signal found Note: marketplace plugin only", + "open-webui": "source read at v0.11.4, not driven: outbound only: utils/webhook.py:44-55 formats Slack, Google Chat, Discord and Microsoft Teams webhooks; searched 'telegram|signal|whatsapp|slack bot|bot token' in backend/open_webui: no inbound messenger adapter; chatting from Telegram or WhatsApp is the separate Open WebUI Computer project (README.md:94) Note: can post to Teams or Slack, cannot be reached from them" } }, { @@ -3508,7 +3626,7 @@ "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38862 \"Scheduled chat automations: You can now schedule the AI to run tasks automatically on a recurring basis: daily digests, periodic reports, anything you'd otherwise need to remember to ask for.\"", + "open-webui": "source read at v0.11.4, not driven: a scheduled automation with target channel posts its result into a team channel: backend/open_webui/models/automations.py:68-77 AutomationTarget 'channel', utils/automations.py:250 _execute_channel_automation, routers/automations.py:109 channel write check; src/lib/components/automations/DestinationDropdown.svelte", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 scheduled job output delivered to a chat target; web/src/i18n/en.ts cron.namePlaceholder 'e.g. Daily summary' with deliverTo; skills/productivity/google-workspace/SKILL.md:27 daily brief procedure; hermes_cli/web_routers/cron.py:393 blueprints for ready-made automations", "dify": "source read at 1.17.1, not driven: a Schedule Trigger workflow (api/core/workflow/nodes/trigger_schedule/entities.py:10) can end in a chat-posting tool node, but the posting tools are marketplace plugins (official tools/slack/tools/send_message.yaml, teams send_channel_message.yaml) Note: schedule is core, the chat delivery is a plugin" } @@ -3535,10 +3653,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 repeat failures with the same job and error signature resolve to one incident and repeat alerts are withheld for cron.failure_repeat_alert_hours; gateway/platforms/webhook_coalesce.py:1-8 debounces bursts of events on one entity into one run; searched 'repeat.?count|collapsed' in gateway/ and cron/: no 'N times' counter on delivered reports Note: Duplicates are suppressed or coalesced, but not collapsed into one report with a count.", - "dify": "source read at 1.17.1, not driven: searched 'dedup|collapse|identical|duplicate report' in api/core/workflow, api/services and web/i18n/en-US: no collapsing of repeated outputs into one with a count" + "dify": "source read at 1.17.1, not driven: searched 'dedup|collapse|identical|duplicate report' in api/core/workflow, api/services and web/i18n/en-US: no collapsing of repeated outputs into one with a count", + "open-webui": "source read at v0.11.4, not driven: searched 'dedup|duplicate|collapse|count' in backend/open_webui/utils/notifications.py, events.py and utils/automations.py: each run and event is delivered separately; no collapsing of identical reports" } }, { @@ -3563,10 +3682,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/productivity/live-dashboard/SKILL.md:1-3 optional skill builds self-updating dashboards; web/src/plugins/slots.ts:1-13 plugins can inject components into dashboard slots; searched 'nextcloud' repo-wide: none Note: No Nextcloud dashboard widget; agent output on a dashboard needs an optional skill or a dashboard plugin.", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|dashboard widget' in api/ and web/: no widget that shows agent output on another product's dashboard; the app Overview/Monitoring pages (web/i18n/en-US/app-overview.json, agent-v-2.json monitoring.*) show usage metrics, not output" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|dashboard widget' in api/ and web/: no widget that shows agent output on another product's dashboard; the app Overview/Monitoring pages (web/i18n/en-US/app-overview.json, agent-v-2.json monitoring.*) show usage metrics, not output", + "open-webui": "source read at v0.11.4, not driven: searched 'dashboard|widget' in src/lib/components and src/routes: src/routes/(app)/home/+page.svelte is an empty shell, admin Analytics is usage stats; no widget showing agent output and no Nextcloud dashboard integration" } }, { @@ -3596,7 +3716,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31382 \"Media transcription (STT): Speech-to-text transcription exposed as an agent tool.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/transcription_tools.py with local (tools/transcription_local.py) and cloud (tools/transcription_cloud.py) speech-to-text; gateway/run_voice.py transcribes inbound voice messages on messaging platforms", - "open-webui": "docs-only: competitor_features#38876 \"STT preprocessing bypass option: Administrators can now enable AUDIOSTTSKIP_PREPROCESSING to send audio files directly to the speech-to-text backend.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/audio.py:1251 POST /audio/transcriptions (local Whisper, OpenAI, Deepgram, Azure, Voxtral); routers/files.py:153-155 uploaded audio files are transcribed then indexed; chat/MessageInput/VoiceRecording.svelte", "dify": "source read at 1.17.1, not driven: api/core/tools/builtin_tool/providers/audio/tools/asr.py speech-to-text tool usable in workflows and agents; api/controllers/web/audio.py:62 audio-to-text for voice messages in chat Note: needs a speech2text model from a provider plugin" } }, @@ -3621,11 +3741,12 @@ "copilot-studio": "yes", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"", "hermes-agent": "source read at v2026.9.24, not driven: searched 'embed.{0,20}(chat|widget)|chat.?widget|web.?chat' in plugin-catalog/, plugins/platforms/, gateway/platforms/, web/src: only the dashboard's own chat page; gateway/platforms/api_server.py:1178 cors_origins lets a site call the key-protected API but ships no embeddable widget or anonymous access", - "dify": "source read at 1.17.1, not driven: web/public/embed.js floating chat bubble script and iframe embed chosen in web/i18n/en-US/app-overview.json:50-52 'Choose the way to embed chat app to your website', with pre-filled hidden inputs; agents have 'Embed Into Site' on their Access page (agent-v-2.json access.webApp.actions.embedIntoSite)" + "dify": "source read at 1.17.1, not driven: web/public/embed.js floating chat bubble script and iframe embed chosen in web/i18n/en-US/app-overview.json:50-52 'Choose the way to embed chat app to your website', with pre-filled hidden inputs; agents have 'Embed Into Site' on their Access page (agent-v-2.json access.webApp.actions.embedIntoSite)", + "open-webui": "source read at v0.11.4, not driven: searched 'embed|widget|anonymous|guest|public chat' in src/lib/components and backend/open_webui/routers/auths.py: every chat needs a signed-in user; the only embedding hook is an iframe postMessage handler for a logged-in session (src/lib/components/chat/Chat.svelte:1457 'Confirm Prompt from Embed') Note: no anonymous chat window for public websites" } }, { @@ -3649,12 +3770,13 @@ "copilot-studio": "yes", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1-12 dangerous-command and tool approval gate with a human decision engine; hermes_cli/commands.py:96-99 /approve and /deny in chat and gateway; hermes_cli/commands.py:187 /approvals mode; gateway/platforms/base_exec_approval.py approval prompts on messaging platforms", "copilot-studio": "docs-only: competitor_features#31608 \"Human-in-the-loop approvals: Approval steps via Power Automate before actions execute.\"", "dify": "source read at 1.17.1, not driven: Human Input workflow node pauses a run until a person picks one of the defined user actions, with delivery by web app or email and a timeout (web/i18n/en-US/workflow.json:583-636 nodes.humanInput.*; api/controllers/web/human_input_form.py:141); in Agent v2 an ask_human deferred tool lets the agent stop for a person (dify-agent/src/dify_agent/layers/ask_human/layer.py:1-12,63) Note: the gate is a node the builder places; no automatic hold on tool calls", - "n8n": "docs-only: competitor_features#31103 \"Wait/approval nodes: Pause workflow for manual approval or timed wait.\"" + "n8n": "docs-only: competitor_features#31103 \"Wait/approval nodes: Pause workflow for manual approval or timed wait.\"", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:62 'Ask for approval': 'Stop before each tool call until you allow or deny it.'; backend/open_webui/utils/middleware.py:3613 pause_for_tool_approval holds the call; src/lib/components/common/ToolCallDisplay.svelte:250-271 Allow/Deny; utils/tool_approval.py:20 resolve_tool_call_output resumes or rejects" } }, { @@ -3678,10 +3800,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:662-670 permissions_list_open lists pending approvals across conversations seen by the MCP bridge, :672 permissions_respond; hermes_cli/commands.py:223 /memory pending and :217 /skills pending list staged writes Note: Approvals surface in the conversation that raised them; the only cross-conversation list is through the MCP bridge, with no inbox page.", - "dify": "source read at 1.17.1, not driven: human input forms are reached one by one by token link (api/controllers/web/human_input_form.py:141, console/human_input_form.py:70 /form/human_input/); searched 'inbox|pending forms|awaiting' in web/i18n/en-US and api/controllers: no list of everything awaiting me" + "dify": "source read at 1.17.1, not driven: human input forms are reached one by one by token link (api/controllers/web/human_input_form.py:141, console/human_input_form.py:70 /form/human_input/); searched 'inbox|pending forms|awaiting' in web/i18n/en-US and api/controllers: no list of everything awaiting me", + "open-webui": "source read at v0.11.4, not driven: searched 'requires_approval|pending approval|needsApproval' in src/routes and src/lib/components/layout: pending calls are shown only inside the chat message that raised them (common/ToolCallDisplay.svelte:244); no cross-chat approval inbox" } }, { @@ -3706,10 +3829,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/base_exec_approval.py:1-16 every approval card states what Hermes wants to run, why it was flagged (EA_REASON_LABEL_TEXT) and that silence means it does not run; tools/approval.py:1106-1109 tool approvals carry the tool name and reason; tools/approval_smart.py:1-8 guardian LLM risk assessment of the command", - "dify": "source read at 1.17.1, not driven: the Human Input form shows builder-written Form Content with inserted run variables (web/i18n/en-US/workflow.json:609-612 nodes.humanInput.formContent.*), and in Agent v2 the agent writes the question and fields itself (dify-agent/src/dify_agent/layers/ask_human/schema.py AskHumanToolArgs); nothing derives what the action touches automatically Note: context is what the builder or the model chooses to show" + "dify": "source read at 1.17.1, not driven: the Human Input form shows builder-written Form Content with inserted run variables (web/i18n/en-US/workflow.json:609-612 nodes.humanInput.formContent.*), and in Agent v2 the agent writes the question and fields itself (dify-agent/src/dify_agent/layers/ask_human/schema.py AskHumanToolArgs); nothing derives what the action touches automatically Note: context is what the builder or the model chooses to show", + "open-webui": "source read at v0.11.4, not driven: the pending call shows tool name and its decoded arguments (src/lib/components/common/ToolCallDisplay.svelte:147 arguments, :246 'Allow {{NAME}}?'); the reasoning is whatever the model wrote before the call; searched 'reason|impact|touches' in utils/tool_approval.py and ToolCallDisplay.svelte: no statement of what the action touches or why Note: what and with which arguments, not why or blast radius" } }, { @@ -3733,10 +3857,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/approval_detection.py:1-4 only commands matching dangerous patterns reach the gate; hermes_cli/config_defaults.py:1656 approvals.mode 'smart' lets an auxiliary guardian (tools/approval_smart.py) approve low-risk commands and escalate risky ones, with smart_policy rules (:1663) and a deny list (:1670)", - "dify": "source read at 1.17.1, not driven: no risk scoring; a builder can route only some cases to a Human Input node with an IF/ELSE or classifier node, and the Agent v2 ask_human tool is called at the model's discretion (dify-agent/src/dify_agent/layers/ask_human/layer.py:56-78 prompt hint). Searched 'risk|threshold' in dify-agent/src and api/core/workflow: none Note: hand-built branching, no risk threshold setting" + "dify": "source read at 1.17.1, not driven: no risk scoring; a builder can route only some cases to a Human Input node with an IF/ELSE or classifier node, and the Agent v2 ask_human tool is called at the model's discretion (dify-agent/src/dify_agent/layers/ask_human/layer.py:56-78 prompt hint). Searched 'risk|threshold' in dify-agent/src and api/core/workflow: none Note: hand-built branching, no risk threshold setting", + "open-webui": "source read at v0.11.4, not driven: tool_approval_mode is 'full' or 'ask' for all tool calls in a chat (src/lib/components/chat/MessageInput/InputMenu.svelte:54-64; backend/open_webui/utils/middleware.py:5934); searched 'approv|risk' in utils/tools.py and routers/tools.py: no per-tool or risk-based approval rule" } }, { @@ -3760,10 +3885,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/matrix/adapter.py:2419-2442 a reaction on the approval prompt resolves it (_handle_approval_reaction); plugins/platforms/telegram/adapter.py:4256-4280 inline Approve Once / Always Approve buttons; searched 'nextcloud|spreed' repo-wide: none Note: Approve by reaction works in Matrix, by buttons elsewhere; not in Nextcloud Talk.", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|reaction' in api/ and web/: no Talk integration; approvals are answered only through the form link (api/controllers/web/human_input_form.py:141)" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|reaction' in api/ and web/: no Talk integration; approvals are answered only through the form link (api/controllers/web/human_input_form.py:141)", + "open-webui": "source read at v0.11.4, not driven: searched 'reaction' with 'approv' in backend/open_webui/routers/channels.py and utils/tool_approval.py: channel reactions (events message.reaction_added) do not resolve tool calls; approval is only via the Allow/Deny buttons or POST /api/v1/chats/{id}/messages/{mid}/resolve (main.py:1893)" } }, { @@ -3788,10 +3914,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: a workflow can put a Human Input node between the LLM/Agent node and the reply so a person reviews, edits input fields and picks an action before the answer is sent (web/i18n/en-US/workflow.json nodes.humanInput.formContent.*, user actions; api/tasks/mail_human_input_delivery_task.py email delivery to staff) Note: built per workflow; chat apps with webapp delivery show the form to the end user instead", - "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1095-1110 request_tool_approval lets a plugin pre_tool_call hook hold any tool call, including send_message, for a human; searched 'draft.{0,30}(approv|review|hold)|confirm.{0,20}before.{0,10}send' in *.py: no built-in hold on agent-written replies Note: Holding outgoing messages needs a plugin hook; nothing ships that queues drafts for review." + "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1095-1110 request_tool_approval lets a plugin pre_tool_call hook hold any tool call, including send_message, for a human; searched 'draft.{0,30}(approv|review|hold)|confirm.{0,20}before.{0,10}send' in *.py: no built-in hold on agent-written replies Note: Holding outgoing messages needs a plugin hook; nothing ships that queues drafts for review.", + "open-webui": "source read at v0.11.4, not driven: searched 'draft|hold|review before' in backend/open_webui/utils/automations.py, routers/channels.py and utils/middleware.py: answers are written straight to the chat or channel (utils/automations.py:250 channel post); only tool calls can be held (utils/middleware.py:3613)" } }, { @@ -3815,10 +3942,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/estop.py:1-8 and :36-39 `hermes pause` at the root home halts cron dispatch, kanban dispatch and new gateway turns for every profile; hermes_cli/commands.py:94 /pause; agent/estop.py:1-4 in-flight work is never killed Note: Stops new work everywhere at once; running turns finish. No organisations, so the scope is the whole install.", - "dify": "source read at 1.17.1, not driven: searched 'kill switch|disable all|pause all|emergency stop' in api/controllers/console and web/i18n/en-US: no workspace-wide stop; each app's web app and API are toggled separately (api/controllers/console/agent/roster.py:1013)" + "dify": "source read at 1.17.1, not driven: searched 'kill switch|disable all|pause all|emergency stop' in api/controllers/console and web/i18n/en-US: no workspace-wide stop; each app's web app and API are toggled separately (api/controllers/console/agent/roster.py:1013)", + "open-webui": "source read at v0.11.4, not driven: admin 'Disable All' models (src/lib/components/workspace/Models.svelte:365, routers/models.py:881 toggle each) and the global automations switch (src/lib/components/admin/Settings/General.svelte:377 ENABLE_AUTOMATIONS, checked at utils/automations.py:105) stop new runs; running tasks are stopped one by one (main.py:2128 /api/tasks/stop/{id}, admin) Note: no single action that also halts in-flight runs" } }, { @@ -3843,10 +3971,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands.py:425-437 /stop interrupts a running agent and force-cleans a hung session; hermes_cli/commands.py:92 /stop kills background processes; agent/estop.py:31-33 `hermes -p pause` holds one profile; hermes_cli/subcommands/gateway.py stops a profile's gateway", - "dify": "source read at 1.17.1, not driven: api/controllers/console/app/completion.py:327 /agent//chat-messages//stop and workflow.py:1188 stop one running task; roster.py:1013 and web-app-access-card.tsx:254 switch the agent's surfaces off. No single control that stops all of one agent's running work at once Note: stop per run plus switch off per surface" + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/completion.py:327 /agent//chat-messages//stop and workflow.py:1188 stop one running task; roster.py:1013 and web-app-access-card.tsx:254 switch the agent's surfaces off. No single control that stops all of one agent's running work at once Note: stop per run plus switch off per surface", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:881 POST /model/toggle sets is_active false and utils/models.py:210 drops inactive custom models from the served list; in-flight turns stop via main.py:2160 POST /api/tasks/chat/{chat_id}/stop and admin main.py:2128 /api/tasks/stop/{task_id}; automations pause at routers/automations.py:306" } }, { @@ -3870,10 +3999,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/redact.py:871 redact_sensitive_text and :1157 redact_terminal_output mask API keys and tokens in terminal/tool output; gateway/session.py:193-203 and :382-385 privacy.redact_pii hashes user and chat ids in the model-visible session context; agent/redact.py:66 vault values redacted; searched 'pii|personal data' in agent/ tools/ gateway/: no content-level PII filter Note: Secrets are masked and identifiers can be hashed; personal data inside messages or files reaches the model unfiltered.", - "dify": "source read at 1.17.1, not driven: api/core/moderation/input_moderation.py with keywords, openai_moderation and api providers (api/core/moderation/{keywords,openai_moderation,api}); api/core/moderation/base.py:10-20 DIRECT_OUTPUT blocks with a preset reply, OVERRIDDEN lets a custom API extension return rewritten inputs. No built-in PII or secret detector Note: blocking is built in; redaction only through a self-built API extension" + "dify": "source read at 1.17.1, not driven: api/core/moderation/input_moderation.py with keywords, openai_moderation and api providers (api/core/moderation/{keywords,openai_moderation,api}); api/core/moderation/base.py:10-20 DIRECT_OUTPUT blocks with a preset reply, OVERRIDDEN lets a custom API extension return rewritten inputs. No built-in PII or secret detector Note: blocking is built in; redaction only through a self-built API extension", + "open-webui": "source read at v0.11.4, not driven: mechanism only: Filter functions run an inlet() on every request (backend/open_webui/utils/filter.py:212 process_filter_functions, global or per model via ModelEditor.svelte:1210 FiltersSelector); searched 'pii|presidio|redact|secret' in backend/open_webui: no shipped PII or secret filter, those are community Functions from openwebui.com Note: community Function, not core" } }, { @@ -3897,12 +4027,13 @@ "copilot-studio": "partial", "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "n8n": "docs-only: competitor_features#38146 \"AWS Bedrock Chat Model Node: Default guardrail version to working draft when not set: From n8n@2.32.0 (2026-07-21)\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:108-111 transform_llm_output hook lets a plugin replace or block a final answer; plugins/security-guidance/README.md:1-10 bundled plugin flags dangerous code the agent writes (warns, still writes); gateway/response_filters.py:1-5 only suppresses intentional no-reply markers Note: No shipped content-rule check on answers; it takes a custom plugin hook.", - "dify": "source read at 1.17.1, not driven: api/core/moderation/output_moderation.py moderates the streamed answer; web/i18n/en-US/app-debug.json:93-104 feature.moderation 'Moderate OUTPUT Content' with preset replies, keyword list, OpenAI moderation or API" + "dify": "source read at 1.17.1, not driven: api/core/moderation/output_moderation.py moderates the streamed answer; web/i18n/en-US/app-debug.json:93-104 feature.moderation 'Moderate OUTPUT Content' with preset replies, keyword list, OpenAI moderation or API", + "open-webui": "source read at v0.11.4, not driven: Filter functions also run outlet() and stream hooks on answers (backend/open_webui/utils/filter.py:212, filter_type 'outlet'); searched 'moderation|guardrail|content rule' in backend/open_webui: none shipped, blocking rules must be written as or installed from community Functions Note: community Function, not core" } }, { @@ -3926,10 +4057,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/approval_detection.py:51 hardline commands blocked unconditionally, other dangerous patterns routed to approval; tools/tirith_security.py:1-4 pre-exec scan with allow/block/warn verdicts; tools/approval.py:1095-1104 plugins can escalate any tool to the human gate; hermes_cli/config_defaults.py:1656-1670 smart mode, smart_policy and deny globs", - "dify": "source read at 1.17.1, not driven: searched 'risk|dangerous|destructive|sensitive tool' in api/core/tools, dify-agent/src and web/i18n/en-US/tools.json: tools carry no risk class and no extra checks per class" + "dify": "source read at 1.17.1, not driven: searched 'risk|dangerous|destructive|sensitive tool' in api/core/tools, dify-agent/src and web/i18n/en-US/tools.json: tools carry no risk class and no extra checks per class", + "open-webui": "source read at v0.11.4, not driven: searched 'risk|danger|sensitive' in backend/open_webui/models/tools.py, routers/tools.py, utils/tools.py and utils/tool_approval.py: tools carry no risk class; approval mode is uniform per chat (utils/middleware.py:5934)" } }, { @@ -3955,7 +4087,7 @@ "n8n": "unknown", "open-webui": "partial", "evidence": { - "open-webui": "docs-only: competitor_features#38798 \"Redirect-based SSRF protection: All outbound HTTP requests now block 3xx redirects by default via a new AIOHTTPCLIENTALLOW_REDIRECTS environment variable, preventing redirect-based SSRF where a public URL silently redirects to internal addresses.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/config.py:1122-1149 WEB_FETCH_FILTER_LIST block/allow entries enforced in retrieval/web/utils.py:153 _assert_host_allowed for fetch_url and webhooks, plus WEB_SEARCH_DOMAIN_FILTER_LIST (:1183); env-level only, and it does not cover code run in Jupyter or an Open Terminal (per-user network rules are the enterprise Terminals product, README.md:96)", "hermes-agent": "source read at v2026.9.24, not driven: tools/website_policy.py:1-5 security.website_blocklist enforced on URL-capable tools; hermes_cli/proxy_cli.py:234-254 iron-proxy allowed_hosts plus default-deny CIDRs for sandboxed terminals (tools/environments/docker_egress.py:1-5); hermes_cli/subcommands/egress.py:10-15 `hermes egress` Note: The host allowlist applies to the Docker sandbox through iron-proxy (off by default); the web tools use a blocklist.", "dify": "source read at 1.17.1, not driven: docker/ssrf_proxy/squid-agent.conf.template routes the agent sandbox through Squid, denying private networks but 'External internet is allowed' (http_access allow all); docker/ssrf_proxy/squid.conf.template does the same for HTTP nodes and tools. No per-agent allowlist of web addresses in the UI Note: blocks internal addresses, not a public-web allowlist; an admin can hand-edit the Squid config" } @@ -3982,10 +4114,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'anonymi' in *.py outside tests: only tools/browser_use_cli.py:155 disabling a telemetry flag; plugin-catalog/ has no anonymiser entry; agent/redact.py masks secrets, not personal data in documents", - "dify": "source read at 1.17.1, not driven: searched 'anonymi|presidio|redact|pii' in api/core and web/i18n/en-US: only redaction of the agent backend request in logs (api/core/app/apps/agent_app/runtime_request_builder.py:34); no document anonymisation before the model reads it, and none in the official tool list (langgenius/dify-official-plugins tools/)" + "dify": "source read at 1.17.1, not driven: searched 'anonymi|presidio|redact|pii' in api/core and web/i18n/en-US: only redaction of the agent backend request in logs (api/core/app/apps/agent_app/runtime_request_builder.py:34); no document anonymisation before the model reads it, and none in the official tool list (langgenius/dify-official-plugins tools/)", + "open-webui": "source read at v0.11.4, not driven: searched 'anonymi|pseudonym|redact|presidio|pii' in backend/open_webui (routers, utils, retrieval): documents are extracted and embedded as-is (routers/retrieval.py); anonymising needs a community Filter function" } }, { @@ -4009,10 +4142,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "dify": "source read at 1.17.1, not driven: per-app and per-agent log pages to review past conversations and runs (api/controllers/console/agent/roster.py:1133,1172; web/i18n/en-US/app-log.json), with admin like/dislike and annotations (app-log.json filter.annotation.*, api/controllers/console/app/annotation.py) Note: per app log review, no cross-agent oversight page", - "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx browses every past session with tool messages (web/src/i18n/en.ts sessions.roles.tool) and an Automation filter for cron runs; hermes_cli/subcommands/approvals.py:13-23 `approvals suggest` mines past approval decisions; searched 'oversight|audit page' in web/src: none Note: After-the-fact review means reading transcripts; no oversight page that lists AI decisions for review." + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx browses every past session with tool messages (web/src/i18n/en.ts sessions.roles.tool) and an Automation filter for cron runs; hermes_cli/subcommands/approvals.py:13-23 `approvals suggest` mines past approval decisions; searched 'oversight|audit page' in web/src: none Note: After-the-fact review means reading transcripts; no oversight page that lists AI decisions for review.", + "open-webui": "source read at v0.11.4, not driven: admins browse any model's conversations and messages: backend/open_webui/routers/analytics.py:285 /models/{id}/chats, :125 /messages, src/lib/components/admin/Analytics/AnalyticsModelModal.svelte; user feedback review in admin Evaluations (Feedbacks.svelte); no decision log with review status or sign-off Note: transcript browsing, not a structured oversight workflow" } }, { @@ -4036,10 +4170,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'automation.?bias|rubber.?stamp|approv\\w* everything|approval fatigue' in *.py and *.ts outside tests: only a code comment in gateway/authz_mixin.py:474; hermes_cli/subcommands/approvals.py:22-23 `approvals suggest` goes the other way, proposing allowlist entries from repeated approvals", - "dify": "source read at 1.17.1, not driven: searched 'automation bias|rubber.?stamp|approval rate|approve all' in api/ and web/i18n/en-US: no tracking of how reviewers answer Human Input forms" + "dify": "source read at 1.17.1, not driven: searched 'automation bias|rubber.?stamp|approval rate|approve all' in api/ and web/i18n/en-US: no tracking of how reviewers answer Human Input forms", + "open-webui": "source read at v0.11.4, not driven: searched 'bias|rubber|approve all|approval rate' in backend/open_webui/utils/tool_approval.py, utils/middleware.py and src/lib/components/common/ToolCallDisplay.svelte: approvals are not counted or analysed per reviewer" } }, { @@ -4064,11 +4199,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 tool and skill usage breakdowns behind /insights (hermes_cli/commands.py:287) and web/src/i18n/en.ts models.toolCalls on AnalyticsPage; agent/tool_guardrails.py:1-6 flags tool-call loops within a turn; hermes_cli/config_defaults.py:1666 denial breaker after repeated guardian denials Note: Tool usage is counted and loops are caught; no review queue that flags misuse for a person. Old yes rested on a docs line.", "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", - "dify": "source read at 1.17.1, not driven: tool calls are visible per message and per run in the logs (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38, workflow run detail via api/controllers/console/app/workflow_run.py) and a reviewer can mark answers with admin feedback or annotations (api/controllers/console/app/annotation.py); searched 'misuse|flag tool' in api/: no tool-level flagging Note: review yes, flagging misuse per tool no" + "dify": "source read at 1.17.1, not driven: tool calls are visible per message and per run in the logs (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38, workflow run detail via api/controllers/console/app/workflow_run.py) and a reviewer can mark answers with admin feedback or annotations (api/controllers/console/app/annotation.py); searched 'misuse|flag tool' in api/: no tool-level flagging Note: review yes, flagging misuse per tool no", + "open-webui": "source read at v0.11.4, not driven: per-user 'Most used tools' in src/lib/components/chat/Settings/Usage.svelte:472 (routers/chats.py:307 /stats/usage); admins read tool calls inside any conversation (routers/analytics.py:125 /messages, :285 model chats); searched 'flag|misuse|report' in routers/analytics.py and routers/tools.py: no flagging Note: tool use is visible, misuse cannot be flagged" } }, { @@ -4093,10 +4229,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_state_messages.py / state.db keep every message and tool call per session; cron/executions.py:1-6 durable per-attempt execution ledger with immutable terminal states; agent/curator_backup.py:37 append-only curator ledger; searched 'tamper|hash.?chain|audit trail' in *.py: no tamper-evident log, and sessions are deletable (hermes_cli/web_routers/sessions.py:696) Note: Runs and tool calls are recorded but can be deleted or pruned; nothing prevents change afterwards.", - "dify": "source read at 1.17.1, not driven: every run, node execution and agent thought is stored (api/models/workflow.py node executions, message agent thoughts) but rows are deletable by retention jobs (api/services/retention/conversation/messages_clean_service.py:566); audit events are emitted as log lines for the Enterprise OTel exporter only (api/controllers/openapi/_audit.py:1-6; api/enterprise/telemetry/README.md 'only available in ENTERPRISE') Note: records exist, not tamper-proof; audit stream is enterprise-licensed" + "dify": "source read at 1.17.1, not driven: every run, node execution and agent thought is stored (api/models/workflow.py node executions, message agent thoughts) but rows are deletable by retention jobs (api/services/retention/conversation/messages_clean_service.py:566); audit events are emitted as log lines for the Enterprise OTel exporter only (api/controllers/openapi/_audit.py:1-6; api/enterprise/telemetry/README.md 'only available in ENTERPRISE') Note: records exist, not tamper-proof; audit stream is enterprise-licensed", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/audit.py:36 AuditLogEntry middleware writes HTTP requests (with user, path, body up to MAX_BODY_LOG_SIZE) to DATA_DIR/audit.log via utils/logger.py:200 with rotation; off by default (env.py:1236 AUDIT_LOG_LEVEL 'NONE'); plain rotating file, not tamper-evident, and tool calls are only inside chat records Note: request-level audit, not immutable, off by default" } }, { @@ -4120,10 +4257,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/sessions.py:69-95 `sessions export --format jsonl|trace --redact` over filtered sessions; hermes_cli/subcommands/cron.py:168 `cron runs` execution history Note: Exports are transcripts, not an audit report; no dashboard export across sessions.", - "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI to JSONL.GZ per app (no tool calls); api/controllers/console/workflow_run_archive.py:93-130 run archive download is Cloud paid-plan only; Enterprise OTel exporter (api/enterprise/telemetry/exporter.py) ships audit logs Note: CLI message export in community; fuller audit export is cloud or enterprise" + "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI to JSONL.GZ per app (no tool calls); api/controllers/console/workflow_run_archive.py:93-130 run archive download is Cloud paid-plan only; Enterprise OTel exporter (api/enterprise/telemetry/exporter.py) ships audit logs Note: CLI message export in community; fuller audit export is cloud or enterprise", + "open-webui": "source read at v0.11.4, not driven: the audit trail is the file at env.py:1226 AUDIT_LOGS_FILE_PATH (utils/logger.py:200) that an operator can copy; searched 'audit' in backend/open_webui/routers and src/lib/components/admin: no export endpoint or UI; chat data export exists (routers/chats.py:1049 /all/db admin)" } }, { @@ -4148,10 +4286,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:2231-2245 sessions.auto_prune with retention_days (default 90) deletes ended sessions on startup sweeps; hermes_cli/subcommands/sessions.py:105 `sessions prune` by age, source or title; :123 archive", - "dify": "source read at 1.17.1, not driven: api/configs/feature/__init__.py:1425 ENABLE_CLEAN_MESSAGES and :1623-1624 WORKFLOW_LOG_CLEANUP_ENABLED / WORKFLOW_LOG_RETENTION_DAYS; api/schedule/clean_messages.py:17-23 'Self-hosted editions delete all messages within the configured time range'; api/schedule/clean_workflow_runlogs_precise.py Note: instance-wide environment settings, off by default, no per-workspace or per-agent setting in the UI" + "dify": "source read at 1.17.1, not driven: api/configs/feature/__init__.py:1425 ENABLE_CLEAN_MESSAGES and :1623-1624 WORKFLOW_LOG_CLEANUP_ENABLED / WORKFLOW_LOG_RETENTION_DAYS; api/schedule/clean_messages.py:17-23 'Self-hosted editions delete all messages within the configured time range'; api/schedule/clean_workflow_runlogs_precise.py Note: instance-wide environment settings, off by default, no per-workspace or per-agent setting in the UI", + "open-webui": "source read at v0.11.4, not driven: searched 'retention|older_than|prune|expire|ttl' in backend/open_webui/routers, models/chats.py and config.py: no chat or run retention period; ENABLE_KNOWLEDGE_FILE_RETENTION (config.py:985) only keeps files when removed from a knowledge base; temporary chats that are never stored can be enforced per user ('temporary_enforced' permission)" } }, { @@ -4176,10 +4315,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/inventory.py:1-2 is a provider/model inventory for pickers, not an AI-feature register", - "dify": "source read at 1.17.1, not driven: searched 'register|risk class|ai act|inventory' in api/models, api/services and web/i18n/en-US: no register of AI features with a risk class" + "dify": "source read at 1.17.1, not driven: searched 'register|risk class|ai act|inventory' in api/models, api/services and web/i18n/en-US: no register of AI features with a risk class", + "open-webui": "source read at v0.11.4, not driven: searched 'register|risk class|ai act|inventory' in backend/open_webui/models and src/lib/components/admin: no register of AI features with a risk class" } }, { @@ -4204,10 +4344,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no risk-level field", - "dify": "source read at 1.17.1, not driven: searched 'risk|ai act|high.?risk|classification' in api/models/agent.py, api/models/model.py and web/i18n/en-US: agents and apps carry no risk level field" + "dify": "source read at 1.17.1, not driven: searched 'risk|ai act|high.?risk|classification' in api/models/agent.py, api/models/model.py and web/i18n/en-US: agents and apps carry no risk level field", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models carry no risk-level field (backend/open_webui/models/models.py:74 ModelMeta)" } }, { @@ -4232,10 +4373,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; no sign-off or go-live gate on profiles, skills or plugins beyond tools/write_approval.py staged writes", - "dify": "source read at 1.17.1, not driven: searched 'dpo|data protection officer|sign.?off|go.?live approval' in api/ and web/i18n/en-US: publishing an agent needs only edit/publish permission (api/controllers/console/agent/roster.py:815), no sign-off step" + "dify": "source read at 1.17.1, not driven: searched 'dpo|data protection officer|sign.?off|go.?live approval' in api/ and web/i18n/en-US: publishing an agent needs only edit/publish permission (api/controllers/console/agent/roster.py:815), no sign-off step", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; publishing a model is immediate on save (routers/models.py:285), no sign-off step" } }, { @@ -4261,10 +4403,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/subcommands/security.py and `skills audit` scan code and skills for security patterns, not against a control framework", - "dify": "source read at 1.17.1, not driven: searched 'iso 42001|42001|control framework|ai act' in api/ and web/i18n/en-US: nothing checks the organisation against a framework; web/i18n/en-US/common.json:124-125 only lists Dify's own vendor certificates (GDPR DPA, ISO 27001)" + "dify": "source read at 1.17.1, not driven: searched 'iso 42001|42001|control framework|ai act' in api/ and web/i18n/en-US: nothing checks the organisation against a framework; web/i18n/en-US/common.json:124-125 only lists Dify's own vendor certificates (GDPR DPA, ISO 27001)", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no control framework checks anywhere in admin settings" } }, { @@ -4288,10 +4431,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profile_cmd.py:384-395 `profile show` prints model and provider, gateway state, skill count, SOUL.md presence and distribution; hermes_cli/profile_cmd.py:564-570 `profile info` prints description, author, licence, requirements, source of a distribution Note: A profile summary exists; it does not describe data used or purpose in fact-sheet form or export one.", - "dify": "source read at 1.17.1, not driven: searched 'fact ?sheet|model card|system card' in api/ and web/i18n/en-US: no generated fact sheet of an agent's model, data and purpose; the closest is DSL export of its configuration (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52)" + "dify": "source read at 1.17.1, not driven: searched 'fact ?sheet|model card|system card' in api/ and web/i18n/en-US: no generated fact sheet of an agent's model, data and purpose; the closest is DSL export of its configuration (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52)", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the nearest artefact is the model JSON export (routers/models.py:381) and the description field (ModelEditor.svelte:962), not a generated fact sheet" } }, { @@ -4317,10 +4461,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; the nearest exports are session transcripts (hermes_cli/subcommands/sessions.py:69) and `hermes debug` reports (hermes_cli/commands.py:303), neither a compliance report", - "dify": "source read at 1.17.1, not driven: api/controllers/console/billing/compliance.py:28-49 and api/services/compliance_download_service.py only hand out Dify's own vendor documents (GDPR DPA, ISO 27001, web/i18n/en-US/common.json:124-127) to paid Cloud plans; no compliance report about the organisation's own agents Note: the 'compliance' download is the vendor's certificate, not the customer's report" + "dify": "source read at 1.17.1, not driven: api/controllers/console/billing/compliance.py:28-49 and api/services/compliance_download_service.py only hand out Dify's own vendor documents (GDPR DPA, ISO 27001, web/i18n/en-US/common.json:124-127) to paid Cloud plans; no compliance report about the organisation's own agents Note: the 'compliance' download is the vendor's certificate, not the customer's report", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; exports cover models, chats, feedback and config (routers/models.py:381, routers/evaluations.py:354, routers/configs.py:118), none is a compliance report" } }, { @@ -4344,10 +4489,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 records operational cron failure incidents (job id, error signature, ack) with no impact or remediation fields; searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none Note: Operational failure incidents only; no AI-incident record.", - "dify": "source read at 1.17.1, not driven: searched 'incident|impact|postmortem' in api/models, api/services and web/i18n/en-US: no AI incident record" + "dify": "source read at 1.17.1, not driven: searched 'incident|impact|postmortem' in api/models, api/services and web/i18n/en-US: no AI incident record", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the event catalogue (events.py:42) has no incident type" } }, { @@ -4372,10 +4518,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; cron/incidents.py:1-10 alerts only the operator's home channel", - "dify": "source read at 1.17.1, not driven: searched 'authority|regulator|serious incident|notify' in api/services and web/i18n/en-US: no incident record and no authority notification" + "dify": "source read at 1.17.1, not driven: searched 'authority|regulator|serious incident|notify' in api/services and web/i18n/en-US: no incident record and no authority notification", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no incident record to notify from" } }, { @@ -4399,10 +4546,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'owner|attest|review.{0,20}(access|owner)|recertif' in hermes_cli/profiles.py and hermes_cli/profile_cmd.py: no owner field and no periodic review; hermes_cli/profiles.py:538-575 ProfileInfo", - "dify": "source read at 1.17.1, not driven: searched 'access review|attest|recertif|periodic review' in api/ and web/i18n/en-US: no periodic owner or need review of agents" + "dify": "source read at 1.17.1, not driven: searched 'access review|attest|recertif|periodic review' in api/ and web/i18n/en-US: no periodic owner or need review of agents", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models keep their creator as owner forever (backend/open_webui/models/models.py:117) with no review date or re-attestation" } }, { @@ -4427,10 +4575,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'transparency|explain.{0,20}agent|public.{0,20}(page|description)' in web/src and hermes_cli/web_routers: none; profile descriptions (hermes_cli/web_routers/profiles.py:928) feed the kanban router and are not published to anyone", - "dify": "source read at 1.17.1, not driven: api/controllers/console/app/site.py:49-57 each web app can show a description, privacy policy link and custom disclaimer to its users; no generated plain-language register or explanation of the agents employees deal with Note: per-app description and disclaimer only" + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/site.py:49-57 each web app can show a description, privacy policy link and custom disclaimer to its users; no generated plain-language register or explanation of the agents employees deal with Note: per-app description and disclaimer only", + "open-webui": "source read at v0.11.4, not driven: each agent has a user-facing, localisable description (backend/open_webui/models/models.py:78 'User-facing description of the model.', ModelEditor.svelte:962) shown in the model selector, and admins can post banners (src/lib/components/admin/Settings/Interface/Banners.svelte); no published page explaining the agents employees deal with Note: short per-agent descriptions only" } }, { @@ -4454,10 +4603,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/status.py:157 `hermes status` prints the effective provider; hermes_cli/config_defaults.py:715-790 auxiliary..provider per feature in config; hermes_cli/model_data_policy_guard.py:1-6 warns when a tier trains on prompts; searched 'region|residency|data location' in hermes_cli/: no per-feature residency view Note: You can read which provider each feature uses from config and status, but not where that provider processes the data.", - "dify": "source read at 1.17.1, not driven: searched 'residency|region|data location|processing location' in api/ and web/i18n/en-US: providers show no processing location per feature" + "dify": "source read at 1.17.1, not driven: searched 'residency|region|data location|processing location' in api/ and web/i18n/en-US: providers show no processing location per feature", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; connections record a URL but no location, and no view maps AI features to where they process data (src/lib/components/admin/Settings/Connections.svelte)" } }, { @@ -4482,10 +4632,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'department|group|org' scoping in hermes_cli/profiles.py and gateway/authz_mixin.py: no organisational units; agent/estop.py:31-39 pauses a whole profile or install and gateway/authz_mixin.py:32-37 allowlists individual user ids, with no proof-of-off report Note: Cutting a set of users off is possible by editing allowlists, not by department, and nothing proves it.", - "dify": "source read at 1.17.1, not driven: searched 'department|group.*disable|ai off' in api/ and web/i18n/en-US: community has no departments; enterprise RBAC per-agent access policies (web/features/agent-v2/permissions.ts:37, api/configs/enterprise/__init__.py:38) grant access but there is no switch that turns AI off for a group with proof" + "dify": "source read at 1.17.1, not driven: searched 'department|group.*disable|ai off' in api/ and web/i18n/en-US: community has no departments; enterprise RBAC per-agent access policies (web/features/agent-v2/permissions.ts:37, api/configs/enterprise/__init__.py:38) grant access but there is no switch that turns AI off for a group with proof", + "open-webui": "source read at v0.11.4, not driven: group permissions switch features and model access per group (src/lib/components/admin/Users/Groups/Permissions.svelte:44-51, backend/open_webui/routers/groups.py:401); permissions are additive and a default user permission 'will remain enabled' (Permissions.svelte:78), and there is no proof view that AI is off for a group Note: can narrow a group only when defaults are off; no evidence it is off" } }, { @@ -4509,12 +4660,12 @@ "copilot-studio": "yes", "dify": "yes", "n8n": "yes", - "open-webui": "yes", + "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:121 run list with status filter, created time and elapsed time (web/app/components/app/workflow-log/list.tsx); api/controllers/console/agent/roster.py:1133 agent logs with created/updated time, message count and user rate (web/i18n/en-US/agent-v-2.json logs.table.*)", "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", - "open-webui": "docs-only: competitor_features#38862 \"Scheduled chat automations: Create and manage automations from the Automations page or directly in chat, with full run history\"", + "open-webui": "source read at v0.11.4, not driven: scheduled runs: backend/open_webui/routers/automations.py:388 GET /{id}/runs with status, time and error (models/automations.py:43-50), shown in src/lib/components/automations/AutomationEditor.svelte:355-400; interactive turns are chats with no status list; no list across all agents Note: old yes; run history exists only per automation", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx with web/src/i18n/en.ts sessions.filterAutomation 'Automation' lists cron and other runs with time; hermes_cli/web_routers/cron.py:243 GET /api/cron/jobs/{id}/runs; hermes_cli/subcommands/cron.py:168 `cron runs` durable attempts with status (cron/executions.py:1-6)" } }, @@ -4539,11 +4690,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:596 GET /api/sessions/{id}/messages and :651 /timeline behind web/src/pages/SessionsPage.tsx with user, assistant and tool roles in order (web/src/i18n/en.ts sessions.roles); plugins/observability/langfuse traces each step; hermes_cli/subcommands/sessions.py:76 `--format trace` export for the Agent Trace Viewer", "dify": "source read at 1.17.1, not driven: workflow run detail with a TRACING tab listing each node in order with inputs, outputs, status, time and tokens (web/i18n/en-US/run-log.json tracing, meta.*; web/app/components/workflow/run/node.tsx:89); chat messages show each agent thought and tool call (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38); agent logs per conversation (api/controllers/console/agent/roster.py:1172)", - "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"" + "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", + "open-webui": "source read at v0.11.4, not driven: each run is a chat whose assistant message keeps ordered output items (function_call, function_call_output, reasoning, text; backend/open_webui/utils/tool_approval.py:43, utils/middleware.py:5925); src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116-176 renders them in order; automation runs link to their chat (models/automations.py:46 chat_id)" } }, { @@ -4567,11 +4719,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:68 /retry resends the last message, :71 /undo backs up N turns and re-prompts, :76 /branch forks a session; hermes_cli/subcommands/cron.py:157 re-runs a job; agent/replay_cleanup.py:1-5 only sanitises resumed history; searched 'replay' for a run re-execution feature: none Note: You can re-run from a point in a live session, but not replay a stored past run to reproduce it.", - "dify": "source read at 1.17.1, not driven: in the draft canvas a node can be re-run with its Last Run values from the variable inspector (web/i18n/en-US/workflow.json:272 debug.lastRunTab; api/controllers/console/app/workflow_draft_variable.py); searched 'replay|rerun|run again' in web/i18n/en-US and api/controllers/console/app: no replay of a logged production run (only a Re-run in RAG pipelines, pipeline.json:12) Note: node re-run in the editor, not replay of a past run" + "dify": "source read at 1.17.1, not driven: in the draft canvas a node can be re-run with its Last Run values from the variable inspector (web/i18n/en-US/workflow.json:272 debug.lastRunTab; api/controllers/console/app/workflow_draft_variable.py); searched 'replay|rerun|run again' in web/i18n/en-US and api/controllers/console/app: no replay of a logged production run (only a Re-run in RAG pipelines, pipeline.json:12) Note: node re-run in the editor, not replay of a past run", + "open-webui": "source read at v0.11.4, not driven: a past turn can be re-run with 'Regenerate' (src/lib/components/chat/Messages/ResponseMessage.svelte, permission chat.regenerate_response) and a chat cloned or forked (backend/open_webui/routers/chats.py:1775 /clone, :1672 /fork); tool results are not recorded for deterministic replay, so it is a fresh run" } }, { @@ -4595,11 +4748,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "n8n": "docs-only: competitor_features#3919 \"core: Fix IDOR in test-runs endpoint by consolidating access checks: From n8n@2.14.0 (2026-03-24)\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:132 /plan writes a plan without executing anything; hermes_cli/commands.py:213 /tools disable to remove write-capable tools for a run; hermes_cli/commands.py:83 /rollback restores filesystem checkpoints (tools/checkpoint_manager.py); searched 'dry.?run' in hermes_cli/commands.py: only /worktree prune and /compress previews Note: No mode that runs an agent end to end while blocking every side effect.", - "dify": "source read at 1.17.1, not driven: searched 'dry.?run|mock|simulat' in web/i18n/en-US/workflow.json, agent-v-2.json and api/core/workflow: draft debug runs and Agent v2 Build mode execute tools and the sandbox for real (agent-v-2.json build.empty.communityEditionTip 'changes made to the file system happen in real time'); only webhook triggers can be simulated (workflow.json:291) Note: test runs are separate from the published version but still act" + "dify": "source read at 1.17.1, not driven: searched 'dry.?run|mock|simulat' in web/i18n/en-US/workflow.json, agent-v-2.json and api/core/workflow: draft debug runs and Agent v2 Build mode execute tools and the sandbox for real (agent-v-2.json build.empty.communityEditionTip 'changes made to the file system happen in real time'); only webhook triggers can be simulated (workflow.json:291) Note: test runs are separate from the published version but still act", + "open-webui": "source read at v0.11.4, not driven: searched 'dry run|dry_run|simulate|sandbox mode' in backend/open_webui/utils/middleware.py, utils/tools.py and routers: no mode that lets an agent run while blocking side effects; the closest is per-chat 'Ask for approval' (utils/middleware.py:5934)" } }, { @@ -4628,7 +4782,7 @@ "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", "dify": "source read at 1.17.1, not driven: per app/agent charts for conversations, end users, token costs, session interactions, satisfaction rate, response time and tokens per second (api/controllers/console/app/statistic.py:151-340; workflow_statistic.py:97-184; agent-v-2.json monitoring.metrics.*). No dashboard across agents and no success-rate or tool-use chart Note: per app, no cross-agent view, no tool use", - "open-webui": "docs-only: competitor_features#31821 \"Usage tracking & model access control: Per-user model permissions and usage visibility\"", + "open-webui": "source read at v0.11.4, not driven: admin Analytics (src/lib/components/admin/Analytics/Dashboard.svelte) with backend/open_webui/routers/analytics.py:58 per-model counts, :85 users, :199 daily, :235 token usage by model, feedback activity; no success rate, speed, cost or tool use per agent Note: README.md:68 says cost, the code tracks tokens only", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/analytics.py:143 /api/analytics/usage and :305 /api/analytics/models behind web/src/pages/AnalyticsPage.tsx: tokens per day, sessions, API calls, estimated cost, tool calls, top skills (web/src/i18n/en.ts analytics, models); agent/insights.py:1-2 /insights Note: Cost, volume and tool use are charted; success rate and speed are not, and there is no per-agent breakdown across profiles on one dashboard." } }, @@ -4654,11 +4808,12 @@ "copilot-studio": "partial", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_state_usage.py:29-56 per-session estimated_cost_usd and actual_cost_usd with token counts; hermes_cli/commands.py:138 /status and :280 /usage show session tokens; gateway/runtime_footer.py:1-6 optional per-reply footer (model, context %, latency) Note: Tokens and cost are kept per session (run), not per step.", - "dify": "source read at 1.17.1, not driven: web/app/components/workflow/run/meta.tsx:91-97 total tokens per run and web/app/components/workflow/run/node.tsx:89 tokens per node; money cost appears only in aggregate token-cost charts (api/controllers/console/app/statistic.py:232, web/app/components/app/overview/app-chart.tsx) Note: tokens per run and step, cost only in totals" + "dify": "source read at 1.17.1, not driven: web/app/components/workflow/run/meta.tsx:91-97 total tokens per run and web/app/components/workflow/run/node.tsx:89 tokens per node; money cost appears only in aggregate token-cost charts (api/controllers/console/app/statistic.py:232, web/app/components/app/overview/app-chart.tsx) Note: tokens per run and step, cost only in totals", + "open-webui": "source read at v0.11.4, not driven: per-message token usage stored (backend/open_webui/utils/middleware.py:3737 merge_usage) and shown in src/lib/components/chat/Messages/ResponseMessage.svelte:1209-1213; searched 'cost|price' in routers/analytics.py and utils/middleware.py: no cost, and no per-step split" } }, { @@ -4682,10 +4837,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-63 agent.max_turns hard cap with budget_warning_ratio one-time warning and run_budget_seconds wall-clock budget with an 80% notice; hermes_state_maintenance.py:71 max_cost is only a session filter; searched 'max_cost|spend_limit|budget_usd|cost_cap' in *.py: no money budget Note: Warning plus hard stop exist for turns and time, not for spend.", - "dify": "source read at 1.17.1, not driven: searched 'budget|spend limit|spending|hard stop' in web/i18n/en-US and api/services: none for self-hosted; hosted-credit quotas (api/services/credit_pool_service.py, quota_service.py) apply to Dify Cloud's own trial credits, not a user-set budget with warning and stop" + "dify": "source read at 1.17.1, not driven: searched 'budget|spend limit|spending|hard stop' in web/i18n/en-US and api/services: none for self-hosted; hosted-credit quotas (api/services/credit_pool_service.py, quota_service.py) apply to Dify Cloud's own trial credits, not a user-set budget with warning and stop", + "open-webui": "source read at v0.11.4, not driven: searched 'budget|spend|limit|price' in backend/open_webui/routers/analytics.py, utils/middleware.py, routers/openai.py and config.py: no spending budget, warning level or hard stop" } }, { @@ -4709,10 +4865,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/model_cost_guard.py:1-26 warns before selecting a model priced above the input/output cost thresholds; hermes_cli/subcommands/prompt_size.py:13 `hermes prompt-size` byte breakdown of system prompt and tool schemas; hermes_cli/commands.py:143 /context usage gauge; searched 'estimate.{0,20}cost|forecast' for a pre-run cost estimate: none Note: Warns about expensive models and shows prompt size; no cost forecast for a run before it starts. Old yes rested on a docs line.", - "dify": "source read at 1.17.1, not driven: searched 'estimate|expected cost|cost preview' in api/controllers/console/app and web/i18n/en-US: the only estimate is document indexing cost for knowledge bases (api/controllers/console/datasets/datasets_document.py:706 indexing-estimate), none for an agent or workflow run" + "dify": "source read at 1.17.1, not driven: searched 'estimate|expected cost|cost preview' in api/controllers/console/app and web/i18n/en-US: the only estimate is document indexing cost for knowledge bases (api/controllers/console/datasets/datasets_document.py:706 indexing-estimate), none for an agent or workflow run", + "open-webui": "source read at v0.11.4, not driven: searched 'estimate|cost|price' in backend/open_webui/main.py, routers/analytics.py and src/lib/components/chat/MessageInput.svelte: main.py:1933 /api/v1/messages/count_tokens counts input tokens for Anthropic-style clients and MessageInput.svelte:1837 shows context usage, but nothing predicts a run's cost" } }, { @@ -4737,10 +4894,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_failure_copy.py:1-6 plain-language failure notice delivered to the job's chat with the exact fix command; cron/incidents.py:1-10 alert state with repeat throttling; agent/monitoring/cron_health.py cron health events", - "dify": "source read at 1.17.1, not driven: searched 'alert|on failure notify|failed run email' in api/tasks, api/schedule and web/i18n/en-US: failures show only in logs and the editor toast (web/i18n/en-US/workflow.json:242 common.scheduleTriggerRunFailed); api/schedule/queue_monitor_task.py alerts admins about Celery queue length, not run failures Note: alerting only by wiring an external tracer or OTel collector" + "dify": "source read at 1.17.1, not driven: searched 'alert|on failure notify|failed run email' in api/tasks, api/schedule and web/i18n/en-US: failures show only in logs and the editor toast (web/i18n/en-US/workflow.json:242 common.scheduleTriggerRunFailed); api/schedule/queue_monitor_task.py alerts admins about Celery queue length, not run failures Note: alerting only by wiring an external tracer or OTel collector", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:526 publish_event AUTOMATION_RUN_FAILED routed to admin event webhooks (events.py:1034); chat.failed is a user notification event (events.py:669, utils/notifications.py:287) with browser and webhook delivery (src/lib/components/chat/Settings/Notifications.svelte:37 'Chat failed')" } }, { @@ -4764,10 +4922,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'drift' in agent/ cron/ gateway/ hermes_cli/ excluding clock, schema, config and terminal drift: only prompt-cache and table-padding comments; cron/monitor.py:1-8 detects changes in a monitored source, not drift in agent results", - "dify": "source read at 1.17.1, not driven: searched 'drift|regression|quality trend|anomal' in api/ and web/i18n/en-US: no drift detection; satisfaction rate chart (api/controllers/console/app/statistic.py:286) is the nearest signal" + "dify": "source read at 1.17.1, not driven: searched 'drift|regression|quality trend|anomal' in api/ and web/i18n/en-US: no drift detection; satisfaction rate chart (api/controllers/console/app/statistic.py:286) is the nearest signal", + "open-webui": "source read at v0.11.4, not driven: searched 'drift|anomaly|regression|baseline' in backend/open_webui/routers/analytics.py, routers/evaluations.py and utils: no monitoring of result quality over time beyond the feedback leaderboard history (routers/evaluations.py:268)" } }, { @@ -4792,11 +4951,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "n8n": "docs-only: competitor_features#6928 \"core: Fix /healthz endpoint when using N8N_PATH: From n8n@2.15.0 (2026-03-30)\"", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1591-1592 GET /health and /health/detailed; hermes_cli/web_routers/status.py:115 /api/health and :555 /api/system/stats; agent/monitoring/otlp_exporter.py:1-6 exports health and diagnostic events to an OpenTelemetry collector; hermes_cli/subcommands/monitoring.py:19 Note: Metrics are pushed over OTLP; the pull endpoints are health checks, not a Prometheus scrape.", - "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads and /db-pool-stat endpoints; api/configs/observability/otel/otel_config.py:10-25 ENABLE_OTEL exports traces and metrics over OTLP to a monitoring system; api/celery_healthcheck.py for workers Note: OTel metrics off by default" + "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads and /db-pool-stat endpoints; api/configs/observability/otel/otel_config.py:10-25 ENABLE_OTEL exports traces and metrics over OTLP to a monitoring system; api/celery_healthcheck.py for workers Note: OTel metrics off by default", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health, :3009 /health/db for probes; utils/telemetry/metrics.py:151 setup_metrics with request counter, duration histogram and user gauges exported over OTLP (env.py:1267 ENABLE_OTEL_METRICS, :1271 endpoint) Note: metrics are pushed over OTLP, not a Prometheus scrape endpoint" } }, { @@ -4821,10 +4981,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/app/ops_trace.py per-app tracing config; api/core/ops/ops_trace_manager.py sends traces to Langfuse, LangSmith, Opik, Weave, Arize, Phoenix, MLflow, Databricks, Aliyun, Tencent (web/i18n/en-US/app.json:221-267 tracing.*.title)", - "hermes-agent": "source read at v2026.9.24, not driven: plugins/observability/langfuse/plugin.yaml:1-3 bundled Langfuse plugin traces conversations, LLM calls and tool usage (opt-in); agent/monitoring/otlp_exporter.py:1-6 OTLP export" + "hermes-agent": "source read at v2026.9.24, not driven: plugins/observability/langfuse/plugin.yaml:1-3 bundled Langfuse plugin traces conversations, LLM calls and tool usage (opt-in); agent/monitoring/otlp_exporter.py:1-6 OTLP export", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1266 ENABLE_OTEL_TRACES, :1270 OTEL_EXPORTER_OTLP_ENDPOINT, utils/telemetry/setup.py and instrumentors.py send traces to any OTLP collector (Langfuse accepts OTLP); direct Langfuse hooks exist only as community pipeline filters Note: OTLP in core; native Langfuse only via community pipelines" } }, { @@ -4849,11 +5010,12 @@ "copilot-studio": "partial", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 usage insights (tokens, cost, tool/skill use, activity, model/platform breakdowns) on demand via /insights (hermes_cli/commands.py:287) and `hermes insights`; searched 'weekly report|periodic report|digest.{0,20}usage' in cron/ and agent/: no scheduled usage report Note: Reports are on demand; a periodic one would be a hand-built cron job.", - "dify": "source read at 1.17.1, not driven: searched 'report|weekly|monthly digest|usage report' in api/schedule, api/tasks and web/i18n/en-US: no periodic usage report; usage is only on the live Overview/Monitoring charts (api/controllers/console/app/statistic.py)" + "dify": "source read at 1.17.1, not driven: searched 'report|weekly|monthly digest|usage report' in api/schedule, api/tasks and web/i18n/en-US: no periodic usage report; usage is only on the live Overview/Monitoring charts (api/controllers/console/app/statistic.py)", + "open-webui": "source read at v0.11.4, not driven: searched 'report|digest|weekly' in backend/open_webui/routers/analytics.py, utils/automations.py and events.py: analytics are on-demand dashboards (src/lib/components/admin/Analytics/Dashboard.svelte); no periodic usage report" } }, { @@ -4881,7 +5043,7 @@ "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/app/statistic.py:286 user-satisfaction-rate per app; agent Monitoring 'User Satisfaction Rate: Percentage of agent replies that users rated with a like' (web/i18n/en-US/agent-v-2.json monitoring.metrics.userSatisfactionRate); logs show user and operator rating per conversation (agent-v-2.json logs.table.userRate, operationRate)", - "open-webui": "docs-only: competitor_features#38806 \"Feedback user attribution spoofing: corrupting Elo leaderboard rankings and admin feedback exports.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/evaluations.py:222 GET /leaderboard (ELO per model from thumbs ratings), :268 per-model history, :399 feedback list; src/lib/components/admin/Evaluations/Leaderboard.svelte, Feedbacks.svelte; analytics feedback activity (admin/Analytics/Dashboard.svelte)", "hermes-agent": "source read at v2026.9.24, not driven: no answer rating exists to aggregate: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-8 only detects affection for the pet animation" } }, @@ -4907,12 +5069,13 @@ "copilot-studio": "yes", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", "dify": "source read at 1.17.1, not driven: web/app/components/workflow canvas editor for Workflow and Chatflow apps with the node set in web/i18n/en-US/workflow.json:2-35 blocks.*; api/controllers/console/app/workflow.py draft sync and publish", "n8n": "docs-only: competitor_features#31093 \"Visual node-based editor: Drag-and-drop canvas to wire nodes into workflows.\"", - "hermes-agent": "source read at v2026.9.24, not driven: searched 'canvas|flow editor|node editor|reactflow' in web/src and apps/desktop/src: no visual flow builder; plugins/kanban/dashboard/manifest.json:1-10 the Kanban tab is a drag-drop task board, not a step canvas" + "hermes-agent": "source read at v2026.9.24, not driven: searched 'canvas|flow editor|node editor|reactflow' in web/src and apps/desktop/src: no visual flow builder; plugins/kanban/dashboard/manifest.json:1-10 the Kanban tab is a drag-drop task board, not a step canvas", + "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py)" } }, { @@ -4936,11 +5099,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:2-3 blocks.agent and blocks.agent-v2; api/core/workflow/nodes/agent_v2/agent_node.py runs a roster or inline agent inside a flow; api/controllers/console/agent/composer.py:54 agent composer on a workflow node Note: the classic Agent node runs strategies from agent-strategy plugins", "n8n": "docs-only: competitor_features#31097 \"AI Agent node (LangChain): Built-in AI agent nodes with tool-calling over LangChain.\"", - "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:249-257 /kanban create, assign, link: tasks assigned to profiles (agents) and linked as dependencies; hermes_cli/kanban_parser.py:314-321 'dependency' blocks auto-promote when parents finish; hermes_cli/kanban_db_graph.py:1 task graph persistence; plugins/kanban/dashboard/manifest.json board tab Note: Multi-agent work is a dependency graph of kanban cards, not a flow with agent steps." + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:249-257 /kanban create, assign, link: tasks assigned to profiles (agents) and linked as dependencies; hermes_cli/kanban_parser.py:314-321 'dependency' blocks auto-promote when parents finish; hermes_cli/kanban_db_graph.py:1 task graph persistence; plugins/kanban/dashboard/manifest.json board tab Note: Multi-agent work is a dependency graph of kanban cards, not a flow with agent steps.", + "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); no flow to put an agent step in" } }, { @@ -4965,11 +5129,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:12 blocks.human-input and :583-636 nodes.humanInput.* (form, user actions, delivery by web app or email, timeout); api/tasks/human_input_timeout_tasks.py; api/controllers/web/human_input_form.py:141", "n8n": "docs-only: competitor_features#31103 \"Wait/approval nodes: Pause workflow for manual approval or timed wait.\"", - "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:314-321 `kanban block --kind needs_input` parks a card for a human and dependants wait until it is unblocked; hermes_cli/kanban_parser.py:216-218 --initial-status blocked for cards that need human ops; hermes_cli/kanban_pr_acceptance.py:1 PR acceptance gate Note: A human gate is a blocked card in the task graph, not an approval step with approve/deny." + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:314-321 `kanban block --kind needs_input` parks a card for a human and dependants wait until it is unblocked; hermes_cli/kanban_parser.py:216-218 --initial-status blocked for cards that need human ops; hermes_cli/kanban_pr_acceptance.py:1 PR acceptance gate Note: A human gate is a blocked card in the task graph, not an approval step with approve/deny.", + "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); approval exists only for tool calls in a chat (utils/middleware.py:3613)" } }, { @@ -4993,10 +5158,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 delegate_task spawns child agents with their own context and returns a summary, single or batch; tools/async_delegation.py:1-6 background delegation; hermes_cli/commands.py:249 kanban hands tasks to other profiles", - "dify": "source read at 1.17.1, not driven: an agent can call a published workflow as a tool (web/i18n/en-US/agent-v-2.json tools.toolTabs.workflow; api/controllers/console/workspace/tool_providers.py:904) and that workflow can hold another Agent node; searched 'sub.?agent|handoff|delegat' in dify-agent/src: no direct agent-to-agent handoff Note: indirect, through workflow-as-tool" + "dify": "source read at 1.17.1, not driven: an agent can call a published workflow as a tool (web/i18n/en-US/agent-v-2.json tools.toolTabs.workflow; api/controllers/console/workspace/tool_providers.py:904) and that workflow can hold another Agent node; searched 'sub.?agent|handoff|delegat' in dify-agent/src: no direct agent-to-agent handoff Note: indirect, through workflow-as-tool", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task hands a focused task to a sub-agent and returns its summary (utils/subagents.py:270 delegate, max_iterations and max_output :298-301), admin toggle src/lib/components/admin/Settings/Subagents.svelte; the sub-agent is a copy of the current model and tools (subagents.py:317 'model_id': current), it cannot pick another configured agent Note: delegates to a clone of itself, not to a different agent" } }, { @@ -5021,11 +5187,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/autonomous-ai-agents/dynamic-workflow/SKILL.md:1-16 optional skill codifies orchestration as a re-runnable script where conditions are ordinary code; tools/code_execution_tool.py:1-5 scripts call tools with normal control flow; searched 'condition|branch node|if.?node' in hermes_cli/kanban*.py: no conditional routing in the task graph Note: Branching is code the agent writes, not a flow construct; the plan-in-code skill is optional, not bundled.", "n8n": "docs-only: competitor_features#3046 \"Branching Logic: Conditional routing with if/switch/merge nodes\"", - "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:13 blocks.if-else and :26 blocks.question-classifier branch a flow on conditions or on an LLM classification; fail branches on node errors (nodes.common.errorHandle.failBranch)" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:13 blocks.if-else and :26 blocks.question-classifier branch a flow on conditions or on an LLM classification; fail branches on node errors (nodes.common.errorHandle.failBranch)", + "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); conditions can only be coded inside a Pipe or Filter function" } }, { @@ -5050,11 +5217,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:240,245,254 common.runHistory / showRunHistory / viewRunHistory in the canvas editor, opening each run's tracing on the canvas; published-run logs per app (api/controllers/console/app/workflow_app_log.py:121)", "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", - "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:416-418 `kanban log` and `kanban runs` per task; hermes_cli/subcommands/cron.py:168 `cron runs`; plugins/kanban/dashboard/manifest.json:4 board shows which profile is running what Note: Run history per task or job; no flow canvas to show it on." + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:416-418 `kanban log` and `kanban runs` per task; hermes_cli/subcommands/cron.py:168 `cron runs`; plugins/kanban/dashboard/manifest.json:4 board shows which profile is running what Note: Run history per task or job; no flow canvas to show it on.", + "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)" } }, { @@ -5078,10 +5246,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: cron/blueprint_catalog.py:1-5 and :104-523 sixteen shipped automation blueprints rendered as a dashboard form (hermes_cli/web_routers/cron.py:393-424 GET /api/cron/blueprints, POST instantiate) and a /blueprint slash command (hermes_cli/commands.py:243) Note: Blueprints are ready-made scheduled automations, not multi-step flows.", - "dify": "source read at 1.17.1, not driven: api/constants/recommended_apps.json ships 22 templates (workflow, chatflow, agent-chat, e.g. 'Text Summarization Workflow', 'Email Assistant Workflow'); api/controllers/console/explore/recommended_app.py:96,126 serve them; web/app/(commonLayout)/templates/[[...category]] create from template Note: default source is remote tmpl.dify.ai (api/configs/feature/hosted_service/__init__.py:444), builtin as fallback mode" + "dify": "source read at 1.17.1, not driven: api/constants/recommended_apps.json ships 22 templates (workflow, chatflow, agent-chat, e.g. 'Text Summarization Workflow', 'Email Assistant Workflow'); api/controllers/console/explore/recommended_app.py:96,126 serve them; web/app/(commonLayout)/templates/[[...category]] create from template Note: default source is remote tmpl.dify.ai (api/configs/feature/hosted_service/__init__.py:444), builtin as fallback mode", + "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the app ships no example flows or agents, community presets live on openwebui.com (src/lib/components/workspace/Models.svelte:947)" } }, { @@ -5106,10 +5275,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: optional-mcps/n8n-official/manifest.yaml:1-12 Nous-approved catalog entry connects the agent to an n8n instance's official MCP server with OAuth, so the agent can call n8n workflows as tools; hermes_cli/subcommands/mcp.py:27 `hermes mcp add`", - "dify": "source read at 1.17.1, not driven: searched 'n8n' in api/, web/app and web/i18n: no hits, and none in langgenius/dify-official-plugins tools/ or langgenius/dify-plugins; only a hand-built HTTP Request node or custom OpenAPI tool could call an n8n webhook" + "dify": "source read at 1.17.1, not driven: searched 'n8n' in api/, web/app and web/i18n: no hits, and none in langgenius/dify-official-plugins tools/ or langgenius/dify-plugins; only a hand-built HTTP Request node or custom OpenAPI tool could call an n8n webhook", + "open-webui": "source read at v0.11.4, not driven: searched 'n8n' in backend/open_webui and src: no n8n integration in core; an n8n workflow can only be called through a custom Tool, OpenAPI or MCP server or a community Pipe" } }, { @@ -5134,11 +5304,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "yes", + "open-webui": "partial", "evidence": { "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:6 blocks.code, Python or JavaScript run in the dify-sandbox service (docker/docker-compose.yaml sandbox); nodes.code.syncFunctionSignature", "n8n": "docs-only: competitor_features#3038 \"Code Nodes: JavaScript and Python code execution within workflows\"", - "open-webui": "docs-only: competitor_features#31817 \"Pipelines / custom function plugins: Python function pipelines and filters extend the chat flow\"", + "open-webui": "source read at v0.11.4, not driven: custom Python runs in the request pipeline as Filter (inlet/outlet) or Pipe functions (backend/open_webui/routers/functions.py:48, src/routes/(app)/admin/functions/create/+page.svelte, utils/filter.py:212) and on the external Pipelines server (routers/pipelines.py); searched 'canvas|workflow|flow' in src/lib/components: no flow to place the step in Note: old yes; code steps exist in the chat pipeline, not in a flow", "hermes-agent": "source read at v2026.9.24, not driven: cron/job_definition.py:15 script and no_agent (script-only jobs) and monitor_script fields; web/src/i18n/en.ts cron.scriptRequired 'Script-only jobs need a script path'; hermes_cli/subcommands/webhook.py:43-46 --script transform on a webhook route; tools/code_execution_tool.py code in a run Note: Custom code runs as a job, pre-run gate or webhook transform; there is no flow to put a code step in." } }, @@ -5164,11 +5334,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "n8n": "docs-only: competitor_features#3042 \"Sub-workflows: Compose complex flows from reusable sub-workflows\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_prompt.py:95-97 context_from injects the latest output of other jobs into a job's prompt (job chaining); hermes_cli/kanban_decompose.py:1-6 fans a task out into a graph of child tasks; hermes_cli/subcommands/webhook.py:47-51 a route can fire an existing job Note: Jobs and task graphs can be chained; there is no named flow to embed in another.", - "dify": "source read at 1.17.1, not driven: Snippets are reusable node groups inserted into workflows (api/controllers/console/snippets/snippet_workflow.py; web/i18n/en-US/snippet.json); a published workflow can be used as a tool in other apps (web/i18n/en-US/workflow.json:257-258 common.workflowAsTool)" + "dify": "source read at 1.17.1, not driven: Snippets are reusable node groups inserted into workflows (api/controllers/console/snippets/snippet_workflow.py; web/i18n/en-US/snippet.json); a published workflow can be used as a tool in other apps (web/i18n/en-US/workflow.json:257-258 common.workflowAsTool)", + "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)" } }, { @@ -5193,10 +5364,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:193 `cron doctor` checks scheduled jobs for common health issues; hermes_cli/kanban_diagnostics.py:1-8 actionable diagnostics on task graphs shown as dashboard buttons; cron/lifecycle_guard.py:1-7 rejects self-destructive job specs at creation Note: Checks exist for jobs and task graphs; no pre-run wiring check of a flow.", - "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:997-1000 panel.checklist 'Resolve the following issues before publishing', :207 needConnectTip for unconnected steps, per-node checks such as :361 nodes.agent.checkList.strategyNotSelected; agent composer validate endpoint api/controllers/console/agent/composer.py:167" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:997-1000 panel.checklist 'Resolve the following issues before publishing', :207 needConnectTip for unconnected steps, per-node checks such as :361 nodes.agent.checkList.strategyNotSelected; agent composer validate endpoint api/controllers/console/agent/composer.py:167", + "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the only pre-run check is RRULE validation for schedules (backend/open_webui/utils/recurrence.py:106 validate_rrule)" } }, { @@ -5220,10 +5392,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:129-137 `hermes profile install ` installs a ready-made profile distribution (hermes_cli/profile_distribution.py:1-5); web/src/pages/ProfilesPage.tsx:1117-1122 shows distribution name and version; searched 'distribution' with 'catalog|registry|hub' in hermes_cli/profile_distribution.py: no browsable store Note: One-command install from a known repo URL; no store to browse.", - "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/explore and templates/[[...category]] browse ready-made apps including agents (api/constants/recommended_apps.json 'Investment Analysis Report Copilot', 'SVG Logo Design' in agent-chat mode); api/controllers/console/explore/recommended_app.py:96,126; one click creates a copy in the workspace Note: templates are Dify-curated, fetched from tmpl.dify.ai by default" + "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/explore and templates/[[...category]] browse ready-made apps including agents (api/constants/recommended_apps.json 'Investment Analysis Report Copilot', 'SVG Logo Design' in agent-chat mode); api/controllers/console/explore/recommended_app.py:96,126; one click creates a copy in the workspace Note: templates are Dify-curated, fetched from tmpl.dify.ai by default", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:945-950 'Discover a model' links to openwebui.com/models when enable_community_sharing is on; the community page posts the preset back into src/routes/(app)/workspace/models/create/+page.svelte:77 (COMMUNITY_ORIGINS check) to prefill a new model Note: the store is an outside website, not an in-app catalogue" } }, { @@ -5249,10 +5422,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` packs a profile into a shareable archive and :122 import; hermes_cli/profile_distribution.py:175 write_manifest is only called by the installer (:547); searched write_manifest callers: no command that turns a profile into a distribution template Note: Sharing is by archive; making a reusable distribution means hand-writing distribution.yaml in a repo.", - "dify": "source read at 1.17.1, not driven: an agent can be duplicated (api/controllers/console/agent/roster.py:961 copy), exported as DSL (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52), and an inline workflow agent saved to the shared roster (api/controllers/console/agent/composer.py:239 save-to-roster). Searched 'publish as template|insert-explore-apps' in api/controllers: no way to add it to the Explore template list Note: reuse by roster, copy and file; publishing a template for others goes through the Marketplace Creator Center, an outside service (web/i18n/en-US/plugin.json:230,305), not an in-product action" + "dify": "source read at 1.17.1, not driven: an agent can be duplicated (api/controllers/console/agent/roster.py:961 copy), exported as DSL (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52), and an inline workflow agent saved to the shared roster (api/controllers/console/agent/composer.py:239 save-to-roster). Searched 'publish as template|insert-explore-apps' in api/controllers: no way to add it to the Explore template list Note: reuse by roster, copy and file; publishing a template for others goes through the Marketplace Creator Center, an outside service (web/i18n/en-US/plugin.json:230,305), not an in-product action", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:221 shareModelHandler posts the full model to openwebui.com, :214 Clone, per-model Export JSON (routers/models.py:381); public read grant makes it usable org-wide (common/AccessControl.svelte:19 'anyone')" } }, { @@ -5276,10 +5450,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profile_distribution.py:235-249 github.com/user/repo sources for `profile install` and :594 `profile update` re-pulls; hermes_cli/subcommands/skills.py:148 publish exists for skills only; searched 'publish' in hermes_cli/profile*.py: no profile publish Note: Install from GitHub yes, finding and publishing agent templates no.", - "dify": "source read at 1.17.1, not driven: api/services/app_dsl_service.py:174 import accepts yaml_url (web/i18n/en-US/app.json:115-116 'From URL'), so a raw GitHub DSL link installs; searched 'github' in api/services/app_dsl_service.py and web/i18n/en-US/app.json: no discovery or publish to GitHub Note: install by URL only" + "dify": "source read at 1.17.1, not driven: api/services/app_dsl_service.py:174 import accepts yaml_url (web/i18n/en-US/app.json:115-116 'From URL'), so a raw GitHub DSL link installs; searched 'github' in api/services/app_dsl_service.py and web/i18n/en-US/app.json: no discovery or publish to GitHub Note: install by URL only", + "open-webui": "source read at v0.11.4, not driven: searched 'github|load/url' in backend/open_webui/routers/models.py: model presets import only from a JSON file or openwebui.com; GitHub URL loading exists for tools and functions only (routers/tools.py:247, routers/functions.py:107)" } }, { @@ -5303,10 +5478,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'approv' in hermes_cli/profile_distribution.py and hermes_cli/profiles.py: none; plugin-catalog/README.md curation is Nous review of plugins, not an organisation approving agent templates", - "dify": "source read at 1.17.1, not driven: searched 'approve template|template review|pending template' in api/ and web/i18n/en-US: no approval step for templates; Explore templates come from a remote or builtin catalogue (api/configs/feature/hosted_service/__init__.py:444)" + "dify": "source read at 1.17.1, not driven: searched 'approve template|template review|pending template' in api/ and web/i18n/en-US: no approval step for templates; Explore templates come from a remote or builtin catalogue (api/configs/feature/hosted_service/__init__.py:444)", + "open-webui": "source read at v0.11.4, not driven: searched 'approve|review|publish' in backend/open_webui/routers/models.py and src/lib/components/workspace/Models*: a model is shared the moment its access grants are saved (routers/models.py:1035); no approval gate" } }, { @@ -5330,11 +5506,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "n8n": "docs-only: competitor_features#31102 \"Git version control (Enterprise): Environments + git-backed workflow versioning in EE.\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:85-87 /snapshot create|restore of Hermes config/state; hermes_cli/config_backups.py:1-8 point-in-time copies of config.yaml; hermes_cli/subcommands/profile.py:147-158 distribution update with version in ProfileInfo Note: Whole-state snapshots and config backups allow rollback; no per-agent version list or compare view.", - "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1266,1282,1302 list versions, view one, restore it; api/models/agent.py:327,363 AgentConfigSnapshot and AgentConfigRevision; workflow version history with restore (web/i18n/en-US/workflow.json:1079-1081). Searched 'compare|diff' in agent-v-2.json and workflow.json: no version comparison (only the workflow generator's change summary, :1110) Note: versions and rollback yes, compare no; Community Edition does not version the agent's file system (agent-v-2.json build.empty.communityEditionTip)" + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1266,1282,1302 list versions, view one, restore it; api/models/agent.py:327,363 AgentConfigSnapshot and AgentConfigRevision; workflow version history with restore (web/i18n/en-US/workflow.json:1079-1081). Searched 'compare|diff' in agent-v-2.json and workflow.json: no version comparison (only the workflow generator's change summary, :1110) Note: versions and rollback yes, compare no; Community Edition does not version the agent's file system (agent-v-2.json build.empty.communityEditionTip)", + "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/models.py and routers/models.py: updates overwrite the row (routers/models.py:932); versioning with history menu exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)" } }, { @@ -5358,10 +5535,10 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "yes", - "open-webui": "partial", + "open-webui": "no", "evidence": { "n8n": "docs-only: competitor_features#6941 \"editor: Correct navigation to evaluation tab: From n8n@2.15.0 (2026-03-30)\"", - "open-webui": "docs-only: competitor_features#38777 \"Arena evaluation models configurable via environment: Arena evaluation models can now be defined through an environment variable, which previously could not be set that way.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/evaluations.py:222 leaderboard and arena models (admin/Settings/Evaluations/ArenaModelModal.svelte) rank models from blind user votes; searched 'expected|test case|dataset|golden' in routers/evaluations.py: no case sets with expected answers Note: old partial; arena voting is not a test set", "hermes-agent": "source read at v2026.9.24, not driven: batch_runner.py:1-6 runs the agent over a JSONL prompt dataset in parallel with trajectories and tool-usage statistics; evals/ developer harnesses; searched 'expected|assert.{0,20}answer|score' in batch_runner.py: no expected-answer scoring Note: A dataset runner exists as a repo script; it does not compare against expected answers.", "dify": "source read at 1.17.1, not driven: searched 'evaluation|test case|expected answer|dataset eval' in api/controllers and web/i18n/en-US: no agent test sets; evaluation is delegated to external tracers (web/i18n/en-US/app.json:220-258) and dataset hit testing only checks retrieval (api/controllers/console/datasets/hit_testing.py)" } @@ -5388,10 +5565,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'baseline|a/b|compare.{0,20}prompt|prompt version' in hermes_cli/ and agent/: none for user prompts; evals/openrouter_pkce_ab and evals/toolperf_abeval are developer harnesses, not a user surface", - "dify": "source read at 1.17.1, not driven: searched 'compare|baseline|a/b|prompt version' in web/i18n/en-US/app-debug.json, agent-v-2.json and workflow.json: classic apps can debug several models side by side on one prompt (web/app/components/app/configuration/debug/debug-with-multiple-model), but no run of a new prompt version against the old one before publishing Note: multi-model debug compares models, not prompt versions" + "dify": "source read at 1.17.1, not driven: searched 'compare|baseline|a/b|prompt version' in web/i18n/en-US/app-debug.json, agent-v-2.json and workflow.json: classic apps can debug several models side by side on one prompt (web/app/components/app/configuration/debug/debug-with-multiple-model), but no run of a new prompt version against the old one before publishing Note: multi-model debug compares models, not prompt versions", + "open-webui": "source read at v0.11.4, not driven: searched 'baseline|compare|promote|a/b' in backend/open_webui/routers/prompts.py, routers/models.py and routers/evaluations.py: prompt versions can be set live (routers/prompts.py:384) but no side-by-side run of old versus new before promotion; arena compares models, not prompt versions" } }, { @@ -5416,11 +5594,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:38-54 browse, search and install from registries (tools/skills_hub_skillssh.py skills.sh, tools/skills_hub_clawhub.py ClawHub, tools/skills_hub_github.py); plugin-catalog/README.md:1-5 curated plugin catalog with community-tier entries via `hermes plugins catalog`", "n8n": "docs-only: competitor_features#3045 \"Community Nodes: Community-contributed custom integration nodes\"", - "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/marketplace in-product Dify Marketplace with community Plugins and Templates, creator profiles and trending by real usage (web/i18n/en-US/plugin.json:210-240 marketplace.home.templates, creatorProfile.*); skills and agent strategies ship through it too" + "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/marketplace in-product Dify Marketplace with community Plugins and Templates, creator profiles and trending by real usage (web/i18n/en-US/plugin.json:210-240 marketplace.home.templates, creatorProfile.*); skills and agent strategies ship through it too", + "open-webui": "source read at v0.11.4, not driven: openwebui.com community library of model presets, tools, functions and prompts reached from src/lib/components/workspace/Models.svelte:947, Tools.svelte:639 and admin/Functions.svelte (common/CommunityDiscover.svelte 'Made by Open WebUI Community'); import back via postMessage (routes/(app)/workspace/tools/create/+page.svelte:58) Note: no community channel for skills" } }, { @@ -5445,10 +5624,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115-122 export/import a profile archive including its cron jobs; hermes_cli/profile_distribution.py:396-406 distributions ship and merge cron jobs into another install; hermes_cli/subcommands/profile.py:34 --clone-channels kept off by default Note: Automations move between installs by archive or distribution; there are no client organisations inside one instance.", - "dify": "source read at 1.17.1, not driven: an app or agent exports as DSL YAML (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52; api/services/app_dsl_service.py:723) and imports into another workspace or instance by file or URL (api/services/app_dsl_service.py:174; web/i18n/en-US/app.json:115); snippets export and import the same way (web/i18n/en-US/snippet.json importFromDSLUrl) Note: credentials and plugin dependencies must be set up again in the target (web/app/components/workflow/plugin-dependency)" + "dify": "source read at 1.17.1, not driven: an app or agent exports as DSL YAML (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52; api/services/app_dsl_service.py:723) and imports into another workspace or instance by file or URL (api/services/app_dsl_service.py:174; web/i18n/en-US/app.json:115); snippets export and import the same way (web/i18n/en-US/snippet.json importFromDSLUrl) Note: credentials and plugin dependencies must be set up again in the target (web/app/components/workflow/plugin-dependency)", + "open-webui": "source read at v0.11.4, not driven: automations export and import as JSON (src/routes/(app)/automations/+page.svelte:91-96 Import/Export JSON, :438) and models likewise (routers/models.py:381, :441), so an automation can be moved to another instance; searched 'tenant|organization' in backend/open_webui/models: no client-organisation concept to move between" } }, { @@ -5473,10 +5653,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'course|learner|curriculum' in agent/ tools/ hermes_cli/ plugins/: none; outside the product's domain", - "dify": "source read at 1.17.1, not driven: searched 'course|learner|curriculum' in api/ and web/i18n/en-US: only Dify's own product onboarding lessons (api/controllers/console/explore/recommended_app.py:111 learn-dify; web/i18n/en-US/common.json stepByStepTour.*), no learner recommendations" + "dify": "source read at 1.17.1, not driven: searched 'course|learner|curriculum' in api/ and web/i18n/en-US: only Dify's own product onboarding lessons (api/controllers/console/explore/recommended_app.py:111 learn-dify; web/i18n/en-US/common.json stepByStepTour.*), no learner recommendations", + "open-webui": "source read at v0.11.4, not driven: searched 'course|learner|lesson|curriculum' in backend/open_webui and src/lib/components: no learning domain" } }, { @@ -5507,7 +5688,7 @@ "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml and docker/.env.example self-host the full stack (api, worker, beat, web, plugin_daemon, sandbox, agent runtime, ssrf_proxy, database, redis, vector store); DEPLOYMENT_EDITION defaults to COMMUNITY (api/enterprise/telemetry/README.md config table)", "n8n": "docs-only: competitor_features#31099 \"Self-hosting via Docker: Run community edition on own infra with Docker.\"", - "open-webui": "docs-only: competitor_features#31819 \"Offline / air-gapped deployment: Runs fully self-hosted with no external calls required\"" + "open-webui": "source read at v0.11.4, not driven: README.md:26 pip, uv, Docker, Kubernetes; Dockerfile and docker-compose.yaml in repo root; SQLite or PostgreSQL and local or S3/GCS/Azure storage (backend/open_webui/storage/provider.py)" } }, { @@ -5535,7 +5716,7 @@ "open-webui": "yes", "evidence": { "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", - "open-webui": "docs-only: competitor_features#31819 \"Offline / air-gapped deployment: Runs fully self-hosted with no external calls required\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1203 OFFLINE_MODE sets HF_HUB_OFFLINE and turns off the version update check (:1205-1207); local inference through Ollama (routers/ollama.py), local embeddings and Whisper; community and update links are optional", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 local Ollama/LM Studio models; hermes_cli/config_defaults.py:2297-2305 telemetry collection and sending both off by default; :1762-1765 allow_lazy_installs false for air-gapped installs; tools/environments/docker.py:765 docker_network false air-gaps the sandbox; searched 'HERMES_OFFLINE|offline.?mode|air.?gap' in *.py: no global offline switch Note: Offline operation is assembled from settings, not a supported mode; not driven, so network calls such as model catalog refreshes were not verified to stay off.", "dify": "source read at 1.17.1, not driven: offline is possible but not default: MARKETPLACE_ENABLED can be false with plugins uploaded as local packages (docker/.env.example:251; api/controllers/console/workspace/plugin.py:746 upload/pkg), templates in builtin mode (api/configs/feature/hosted_service/__init__.py:444 default remote), CHECK_UPDATE_URL (docker/.env.example:37) and community telemetry (api/configs/feature/__init__.py:839-850, ext_celery.py:285) must be switched off Note: every model needs a local provider plugin loaded by hand" } @@ -5568,7 +5749,7 @@ "copilot-studio": "docs-only: competitors#1450 license \"Proprietary\"", "dify": "source read at 1.17.1, not driven: LICENSE:3-10 'modified version of the Apache License 2.0': no multi-tenant service and no removal of the logo or copyright in web/ without a commercial licence; LICENSE:2.a the producer may change the licence. Not an OSI or EUPL licence Note: source-available with restrictions", "n8n": "docs-only: competitors#206 license \"Sustainable Use License / Proprietary\"", - "open-webui": "docs-only: competitors#1460 license \"Open WebUI License (BSD-3 with branding clause)\"" + "open-webui": "source read at v0.11.4, not driven: LICENSE: 'Open WebUI License', BSD-3 style plus a branding clause (LICENSE:23-33) that forbids altering Open WebUI branding for deployments above fifty end users (:27-28) without an enterprise licence; code before commit 60d84a3 is plain BSD-3 (LICENSE_HISTORY) Note: source-available, not OSI open source and not EUPL" } }, { @@ -5593,11 +5774,12 @@ "copilot-studio": "yes", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:10-11 profiles are 'multiple isolated Hermes instances' with their own config, keys, memory, sessions and skills; agent/secret_scope.py:1-10 fail-closed per-profile secret scope in the multiplexed gateway (hermes_cli/gateway_multiplex_mode.py:1-8); hermes_cli/kanban_parser.py:84 kanban --tenant namespace Note: Isolation is per profile under one operator; no organisation boundary with its own admins or data access control.", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", - "dify": "source read at 1.17.1, not driven: workspaces keep apps, data, providers and members apart (api/controllers/console/workspace/workspace.py:229,289 list and switch; tenant_id on every model, e.g. api/models/agent.py:163); creating workspaces is off by default (api/configs/feature/__init__.py:1599 ALLOW_CREATE_WORKSPACE=False) and LICENSE:5-6 forbids running a multi-tenant service without a commercial licence Note: works technically, licence-gated for serving several organisations" + "dify": "source read at 1.17.1, not driven: workspaces keep apps, data, providers and members apart (api/controllers/console/workspace/workspace.py:229,289 list and switch; tenant_id on every model, e.g. api/models/agent.py:163); creating workspaces is off by default (api/configs/feature/__init__.py:1599 ALLOW_CREATE_WORKSPACE=False) and LICENSE:5-6 forbids running a multi-tenant service without a commercial licence Note: works technically, licence-gated for serving several organisations", + "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide" } }, { @@ -5621,10 +5803,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'quota' in hermes_cli/profiles.py, hermes_cli/config_defaults.py and gateway/: only provider quota holds (cron/quota_hold.py:1-12) and gateway/platforms/api_server.py:1322 a global max_concurrent_runs; no per-organisation or per-profile quota", - "dify": "source read at 1.17.1, not driven: api/services/feature_service.py:24-31 per-workspace limits (members, apps, vector space, upload quota, api/services/entities/feature_entities.py:152-161) are filled only from the Cloud billing API; self-hosted community has no per-workspace quota setting Note: Dify Cloud plans only" + "dify": "source read at 1.17.1, not driven: api/services/feature_service.py:24-31 per-workspace limits (members, apps, vector space, upload quota, api/services/entities/feature_entities.py:152-161) are filled only from the Cloud billing API; self-hosted community has no per-workspace quota setting Note: Dify Cloud plans only", + "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; only per-user automation limits (routers/automations.py:69)" } }, { @@ -5649,10 +5832,11 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'tenant|organisation|organization' in web/src/pages and hermes_cli/web_routers: only the kanban tenant filter (web/src/i18n/en.ts kanban.tenant); web/src/pages/ProfilesPage.tsx manages profiles one by one with no quota or retention per organisation", - "dify": "source read at 1.17.1, not driven: searched 'tenant management|all workspaces admin|operations page' in api/controllers/console and web/app: /all-workspaces (api/controllers/console/workspace/workspace.py:238) lists the caller's own workspaces; workspace-wide switches come from the separate Enterprise service (api/services/system_feature_service.py:106-112, 160-197), not a page in this repo" + "dify": "source read at 1.17.1, not driven: searched 'tenant management|all workspaces admin|operations page' in api/controllers/console and web/app: /all-workspaces (api/controllers/console/workspace/workspace.py:238) lists the caller's own workspaces; workspace-wide switches come from the separate Enterprise service (api/services/system_feature_service.py:106-112, 160-197), not a page in this repo", + "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; admin settings are one instance-wide panel (src/lib/components/admin/Settings)" } }, { @@ -5677,11 +5861,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", - "open-webui": "partial", + "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: SAML, OIDC and OAuth2 SSO for console and web apps is read from the Enterprise service (api/services/entities/feature_entities.py:103-106,183-184; api/services/system_feature_service.py:162-197); community offers only GitHub and Google OAuth login (api/configs/feature/__init__.py:1003,1013; api/controllers/console/auth/oauth.py). No group sync in community Note: enterprise-licensed", "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", - "open-webui": "docs-only: competitor_features#31820 \"SSO / OAuth / LDAP auth: Enterprise identity integration options\"", + "open-webui": "source read at v0.11.4, not driven: OAuth/OIDC with group mapping (backend/open_webui/utils/oauth.py, config.py:2582 ENABLE_OAUTH_GROUP_MANAGEMENT), LDAP/AD (config.py:2788), trusted header SSO (env.py:802), SCIM 2.0 provisioning (routers/scim.py, env.py:907) Note: old partial rested on a feature row; code covers OIDC, LDAP, SCIM and group sync", "hermes-agent": "source read at v2026.9.24, not driven: plugins/dashboard_auth/self_hosted/plugin.yaml:1-4 OIDC sign-in to the dashboard against Keycloak, Authentik, Zitadel, Okta and others; plugins/dashboard_auth/self_hosted/__init__.py:262-270 groups are folded into a free-form org_id string that no access check reads (hermes_cli/dashboard_auth/base.py:12-16); chat users are platform ids in allowlists (gateway/authz_mixin.py:32-37) Note: Sign-in with company accounts works for the dashboard; groups do not map to rights." } }, @@ -5706,11 +5890,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/secrets.py:8-20 Bitwarden Secrets Manager and 1Password sources (agent/secret_sources/); agent/vault_store.py:1-8 encrypted, model-blind local vault; hermes_cli/proxy_cli.py:352-365 iron-proxy injects real credentials at egress so sandboxes hold only proxy tokens; hermes_cli/subcommands/vault.py:8", "dify": "source read at 1.17.1, not driven: tool, model, datasource and trigger credentials are stored encrypted per workspace (api/core/helper/encrypter.py, provider_encryption.py) and referenced by agents, not typed into agent settings (api/controllers/console/workspace/tool_providers.py, model_providers.py:200); api/models/credential_permission.py limits who may use each credential Note: an encrypted store in the Dify database, not an external vault such as HashiCorp", - "n8n": "docs-only: competitor_features#31106 \"Credential vault: Encrypted credential store shared across workflows.\"" + "n8n": "docs-only: competitor_features#31106 \"Credential vault: Encrypted credential store shared across workflows.\"", + "open-webui": "source read at v0.11.4, not driven: outside keys are kept centrally in the config table (admin Connections, tool servers) and plugin valves are Fernet-encrypted (backend/open_webui/utils/valves.py:21 encrypt_valves), OAuth tool tokens encrypted (utils/oauth.py:269); searched 'vault|keyring|secret manager' in backend/open_webui: no external vault integration" } }, { @@ -5735,11 +5920,12 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/secret_scope.py:1-10 each profile's own .env keys resolve only inside that profile's turns (fail-closed under multiplexing); hermes_cli/subcommands/profile.py:31-34 cloned profiles drop bot tokens unless --clone-channels; tui_gateway/methods_profiles.py:372-378 share_auth off forks credentials per profile", "n8n": "docs-only: competitor_features#38153 \"core: Bind dynamic credential tokens to a user ID: From n8n@2.32.0 (2026-07-21)\"", - "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1032,1062 per-agent service API keys (create, list, revoke); per-agent secret environment variables injected only at runtime (web/i18n/en-US/agent-v-2.json advancedSettings.envEditor.scopeSecret, tools.cliDialog.securityTip); each tool on an agent picks which workspace credential it uses (agent-v-2.json tools.credential.authOne)" + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1032,1062 per-agent service API keys (create, list, revoke); per-agent secret environment variables injected only at runtime (web/i18n/en-US/agent-v-2.json advancedSettings.envEditor.scopeSecret, tools.cliDialog.securityTip); each tool on an agent picks which workspace credential it uses (agent-v-2.json tools.credential.authOne)", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:389 an automation run gets a short-lived token for its owner ({'id': user.id, 'typ': 'automation'}), so it acts with the owner's full rights; tool-server auth is set per connection or per user OAuth (src/lib/components/AddToolServerModal.svelte:313); searched 'agent credential|service account|scoped token' in backend/open_webui: no credential per agent" } }, { @@ -5763,13 +5949,14 @@ "copilot-studio": "yes", "dify": "partial", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ConfigPage.tsx:384-391 sectioned config editor for config.yaml plus EnvPage (Keys) and ModelsPage in the Hermes dashboard; hermes_cli/subcommands/setup.py:11 `hermes setup`; searched 'nextcloud' repo-wide: none Note: Set up from Hermes' own dashboard and CLI, not from Nextcloud admin settings.", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "dify": "source read at 1.17.1, not driven: Dify is set up in its own workspace settings and Integrations page (members api/controllers/console/workspace/members.py, model providers, plugins, web/app/(commonLayout)/integrations) plus environment variables (docker/.env.example); searched 'nextcloud' in api/ and web/: no Nextcloud admin settings panel Note: own settings, not Nextcloud's", - "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"" + "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", + "open-webui": "source read at v0.11.4, not driven: full setup in Open WebUI's own admin panel (src/routes/(app)/admin/settings/[tab]/+page.svelte: General, Connections, Models, Documents, WebSearch, CodeExecution, Integrations, Audio, Images, Subagents, Events); not inside Nextcloud admin settings Note: own admin UI, no Nextcloud integration" } }, { @@ -5793,10 +5980,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/setup.py:42,65 first-run admin account setup (web/app/install); api/controllers/console/onboarding.py:56 and web/app/components/step-by-step-tour a checklist tour pointing to Integrations, Knowledge, Studio and Learn Dify lessons (web/i18n/en-US/common.json:643-662); web/i18n/en-US/common.json:378 'Please install a model provider first'. No wizard that configures the first provider and agent end to end Note: a tour of pages, not a guided setup of provider plus agent", - "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/setup.py:11-26 `hermes setup` interactive wizard with sections; hermes_cli/gateway_setup_wizard.py:1 `hermes gateway setup` per-platform prompts; apps/desktop/e2e/core/onboarding-first-chat.spec.ts desktop onboarding to a first chat; web/src/pages/ProfileBuilderPage.tsx:32 profile builder" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/setup.py:11-26 `hermes setup` interactive wizard with sections; hermes_cli/gateway_setup_wizard.py:1 `hermes gateway setup` per-platform prompts; apps/desktop/e2e/core/onboarding-first-chat.spec.ts desktop onboarding to a first chat; web/src/pages/ProfileBuilderPage.tsx:32 profile builder", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/OnBoarding.svelte:82-118 is a welcome screen ('Welcome to your AI home.', 'Get started', 'Read the docs') before the first admin signs up (src/routes/auth/+page.svelte:216); searched 'wizard|setup step|first provider' in src/lib/components: no guided provider or agent setup" } }, { @@ -5821,11 +6009,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "n8n": "docs-only: competitor_features#6928 \"core: Fix /healthz endpoint when using N8N_PATH: From n8n@2.15.0 (2026-03-30)\"", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SystemPage.tsx:106 doctor run with live log and :187 memory-provider status; web/src/i18n/en.ts status.* gateway running/failed, connected platforms, active sessions on the status overview; hermes_cli/web_routers/status.py:115 /api/health and gateway/platforms/api_server.py:1592 /health/detailed", - "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads, /db-pool-stat JSON endpoints and api/celery_healthcheck.py for machine checks; searched 'health|status page|system status' in web/app and web/i18n/en-US: no page showing chat and dependency health Note: endpoints only, no page" + "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads, /db-pool-stat JSON endpoints and api/celery_healthcheck.py for machine checks; searched 'health|status page|system status' in web/app and web/i18n/en-US: no page showing chat and dependency health Note: endpoints only, no page", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health and :3009 GET /health/db return JSON for probes; admin connection verify buttons only at edit time (AddToolServerModal.svelte:206); searched 'health|status page' in src/lib/components/admin: no page showing chat and dependency health" } }, { @@ -5854,7 +6043,7 @@ "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: LICENSE:1-3 MIT, no seat or message licence in the code; agent/billing_view.py:1 and hermes_cli/nous_subscription.py cover an optional Nous portal plan; model spend is paid per token to whichever provider is configured Note: Software is free; model usage is billed by the provider, per token.", "copilot-studio": "docs-only: competitor_features#31612 \"Message-metered pricing: $0.01/message or $200/mo pack; cost spikes with generative/autonomous use.\"", - "open-webui": "docs-only: competitors#1460 pricing \"Free self-hosted; paid enterprise license/support\"", + "open-webui": "source read at v0.11.4, not driven: no usage metering or seat licensing in the code (searched 'license key|seat|billing' in backend/open_webui), so self-hosting is free; LICENSE:23-33 requires an enterprise licence to rebrand above fifty end users, and the admin notice for more than 50 users points to enterprise licences (translation key 'You have more than 50 users...'); enterprise pricing itself is not in the code", "dify": "source read at 1.17.1, not driven: the self-hosted Community Edition carries no seat or message fee in code (api/services/feature_service.py:24-31 billing limits only for CLOUD); enterprise licences carry a member limit (api/services/entities/feature_entities.py:161 workspace_members LicenseLimitationModel) and Cloud plans limit apps and members (:152-157) Note: community is free; paid editions are limited by members or plan, pricing itself not in code" } }, @@ -5880,12 +6069,13 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31389 \"No scaling / single-instance: Docs state \"no scaling support currently\"; English-biased tool-calling models required.\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_swarm.py:1-8 parallel specialist workers on the kanban dispatcher (plugins/kanban/systemd/hermes-kanban-dispatcher.service); cron/jobs.py:2652-2653 at-most-once claims across N replicas; hermes_cli/gateway_multiplex_mode.py:1-8 one gateway serves many profiles; gateway/platforms/api_server.py:1322 concurrent API runs", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml:227,306,353,660 separate api, Celery worker, beat and agent_backend services; docker/.env.example:57,66-67 SERVER_WORKER_AMOUNT, CELERY_WORKER_AMOUNT, CELERY_AUTO_SCALE; dify-agent/src/dify_agent/runtime/run_scheduler.py schedules concurrent agent runs; schedules dispatched in parallel groups (api/schedule/workflow_schedule_task.py:108)", - "n8n": "docs-only: competitor_features#6931 \"core: Fix race condition when stopping jobs in queue mode: From n8n@2.15.0 (2026-03-30)\"" + "n8n": "docs-only: competitor_features#6931 \"core: Fix race condition when stopping jobs in queue mode: From n8n@2.15.0 (2026-03-30)\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:381 REDIS_URL and :382 REDIS_CLUSTER for multi-worker socket and task state; models/automations.py:308 FOR UPDATE SKIP LOCKED so several instances share scheduled runs; utils/subagents.py:298 max_concurrent sub-agents; README.md:80 horizontal scalability" } }, { @@ -5910,10 +6100,11 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:5-25 inbound A2A endpoint with Agent Card; plugins/platforms/a2a/security.py:1-4 peer identity from credentials (A2A_PEER_TOKENS token -> name), trusted-peer allow-list, JSONL audit, injection filtering; gateway/slash_access.py:1-10 command lists per user id Note: Outside agents can be registered and admitted by token; their tasks run in the agent's session with its full toolset, with no per-peer tool scope or run-as identity.", - "dify": "source read at 1.17.1, not driven: api/controllers/openapi/oauth_device.py:103-129 RFC 8628 device flow issues bearer tokens that act as the approving account, scoped by api/libs/oauth_bearer.py:60-65 (apps:run, apps:read, workspace:*); clients allowed only via env OPENAPI_KNOWN_CLIENT_IDS (api/configs/feature/__init__.py:639-646, default difyctl); per-app API keys (api/controllers/console/apikey.py:236) and MCP server per app (api/controllers/mcp/mcp.py:44) Note: no UI to register an outside agent; scope is per-app or coarse token scopes, not a per-tool allowlist" + "dify": "source read at 1.17.1, not driven: api/controllers/openapi/oauth_device.py:103-129 RFC 8628 device flow issues bearer tokens that act as the approving account, scoped by api/libs/oauth_bearer.py:60-65 (apps:run, apps:read, workspace:*); clients allowed only via env OPENAPI_KNOWN_CLIENT_IDS (api/configs/feature/__init__.py:639-646, default difyctl); per-app API keys (api/controllers/console/apikey.py:236) and MCP server per app (api/controllers/mcp/mcp.py:44) Note: no UI to register an outside agent; scope is per-app or coarse token scopes, not a per-tool allowlist", + "open-webui": "source read at v0.11.4, not driven: an outside agent can use a user's API key (backend/open_webui/routers/auths.py:1529) limited to listed endpoints by auth.api_key.endpoint_restrictions and allowed_endpoints (utils/auth.py:522-543), acting as that user; searched 'client registration|agent registry|service account' in backend/open_webui: no registry of outside agents or per-agent identity Note: restriction is instance-wide per key type, identity is always a human user" } }, { @@ -5938,11 +6129,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 USER.md holds the user's preferences and style and loads every session; hermes_cli/commands.py:163 /personality, :207 /busy, :176 /verbose, :170 /timestamps; web/src/pages/ConfigPage.tsx config editor Note: Preferences are per profile; separate people get separate preferences only through separate profiles or a user-modelling memory provider.", - "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/account.py:376,394,412 account settings are only interface language, theme and timezone; searched 'custom instruction|personal instruction|about you|user preference' in web/i18n/en-US, api/controllers and dify-agent/src: only conversation variables that a builder defines per conversation (web/i18n/en-US/workflow.json:113) Note: no per-person settings for how agents behave" + "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/account.py:376,394,412 account settings are only interface language, theme and timezone; searched 'custom instruction|personal instruction|about you|user preference' in web/i18n/en-US, api/controllers and dify-agent/src: only conversation variables that a builder defines per conversation (web/i18n/en-US/workflow.json:113) Note: no per-person settings for how agents behave", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/General.svelte:29 personal system prompt, :80 saved to user settings, model parameters (settings.personal.general.modelParameters), language; Personalization.svelte memory on/off; Notifications.svelte delivery; InputMenu.svelte:54 default tool-approval mode" } }, { @@ -5959,14 +6151,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: agent/chat_completion_helpers.py:445-453 provider_routing.data_collection ('deny') plus only/ignore provider lists sent to OpenRouter; hermes_cli/model_data_policy_guard.py:23-55 warns before selecting a tier that trains on prompts (Meta contributor only rule); hermes_cli/models_local.py:1-5 local models keep data in house Note: Controls exist per provider route and by choosing local models; nothing guarantees it across all configured providers.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'fine.?tun|train on|zero data|data retention' in api/core, api/services and web/i18n/en-US: Dify itself trains nothing and self-hosting lets the organisation pick any provider, including local models via plugins; api/configs/feature/__init__.py:835-845 community telemetry is anonymous and can be disabled. No per-provider no-training guarantee or setting in the product Note: depends on the chosen model provider's terms, nothing in the product enforces or records it", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: self-hosted with local models (routers/ollama.py) keeps data in-house, and the only outward stats sync is opt-in without message content (src/lib/components/chat/Settings/SyncStatsModal.svelte:367); for remote providers nothing in the code sets or enforces a no-training term (searched 'training|opt.?out|zero retention' in routers/openai.py and utils/anthropic.py) Note: a guarantee only holds for local models" } }, { @@ -5983,14 +6175,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 tool progress shows each step taken; hermes_cli/commands.py:190-192 /reasoning show displays model reasoning summaries (agent/reasoning_summaries.py); agent/turn_explainers.py:1-4 explains why a turn ended without an answer; web/src/pages/SessionsPage.tsx full transcript Note: Steps and reasoning can be shown; there is no plain-language account of how an outcome came about for a reviewer who keeps the final say.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/reasoning-panel.tsx, workflow-process.tsx and tool-detail.tsx show the model's reasoning, each workflow step and tool call under an answer; citation popup names source documents (web/app/components/base/chat/chat/citation/popup.tsx:31); Human Input node lets a person confirm before the next step (web/i18n/en-US/workflow.json:46) Note: raw trace and sources, not a generated plain-language explanation of the outcome", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: answers show sources (Messages/Citations.svelte, ResponseMessage.svelte:910), reasoning and tool steps (Messages/Markdown/MarkdownTokens.svelte:63 groupable 'tool_calls', 'reasoning', 'code_interpreter'); searched 'explain|explanation' in backend/open_webui/utils: no generated plain-language account of how an outcome came about" } }, { @@ -6007,14 +6199,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: searched 'only answer from|answer only|grounded only|restrict.{0,20}sources' in agent/ tools/ hermes_cli/: none that constrains answers to a document set; tools/website_policy.py:1-5 blocklists sites and hermes_cli/web_routers/tools.py:280 toolset toggles can remove web tools, but nothing limits answers to validated documents Note: A profile can be narrowed by removing tools and by SOUL.md wording; nothing enforces it.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: answers can be grounded in a curated knowledge base, but the limit is only a prompt: api/core/prompt/prompt_templates/advanced_prompt_templates.py:1 'Use the following context as your learned knowledge ... If you don't know, just say that you don't know'; annotation reply returns curated answers above a score threshold (api/controllers/console/app/annotation.py:170,199; web/i18n/en-US/app-debug.json:40-47) Note: no hard switch that blocks answers outside validated documents, and no validated flag on documents", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: an agent can be tied to curated knowledge bases (ModelEditor.svelte:1194) and the admin-editable RAG_TEMPLATE (backend/open_webui/config.py:1096) can forbid outside knowledge, but the default template tells the model to answer from its own knowledge when context lacks it (:1078); searched 'strict|only from|grounded only' in config.py and utils/middleware.py: no enforced sources-only mode Note: possible by prompt configuration, not enforced" } }, { @@ -6031,14 +6223,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/tips.py:1-3 tips at CLI session start; tools/tour_tool.py:1-5 agent-led guided tours of the desktop UI; hermes_cli/journey.py:1 `hermes journey` timeline of what Hermes learned; web/src/pages/DocsPage.tsx:1 docs link in the dashboard Note: Help teaches how to use Hermes, not AI literacy (limits, risks, verification) as training modules.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:203 Help, Learn Dify and :620,643-647 step-by-step tour with hands-on lessons on workflows and agents (api/controllers/console/onboarding.py:56); searched 'ai literacy|limitations|hallucinat|responsible' in web/i18n/en-US: nothing explains AI risks or limits to end users Note: product lessons for builders only", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: searched 'literacy|training module|tutorial|course|learn' in src/lib/components and src/routes: only onboarding welcome (OnBoarding.svelte:82) and a docs link; no in-product AI literacy modules" } }, { @@ -6055,14 +6247,14 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: searched '\\bbias\\b|fairness' in agent/ tools/ hermes_cli/ evals/: only ranking bias in tools/session_search_tool.py:693 and a fairness comment in evals/; no bias test runner or stored results", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'bias|fairness|evaluation|test case' in api/controllers, api/services and web/i18n/en-US: no hits beyond external tracer blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix); no scheduled test runs of agents and no stored bias result", "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: searched 'bias|fairness' in backend/open_webui and src/lib/components: no bias tests; evaluations are user-vote leaderboards (routers/evaluations.py:222)" } }, { @@ -6078,14 +6270,14 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:459 `hermes kanban` durable task board shared across profiles; hermes_cli/kanban_db.py:1249 create_task, :2263 claim_task, :2558 reclaim_task, :2723 complete_task; tools/kanban_tools.py:112 kanban_complete/kanban_block agent tools, :237 kanban_comment hand-off between tasks.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'board|claim|kanban|task queue|hand.?off' in web/i18n/en-US/agent-v-2.json, workflow.json and dify-agent/src: no shared task board; agents meet only as nodes in a designed workflow (api/core/workflow/nodes/agent_v2) or as tools (fl-subagent)", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: searched 'board|claim|assign|handoff' in backend/open_webui/tools/builtin.py and utils/subagents.py: create_tasks/update_task (tools/builtin.py:3593, :3643) keep a checklist inside one chat message; sub-agents return a summary to the lead (utils/subagents.py:511), no shared board agents claim from" }, "built": { "state": "none", @@ -6106,14 +6298,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:117 /goal 'Set a standing goal Hermes works on across turns until achieved'; gateway/slash_commands_goals.py:37 handler in every messaging channel; hermes_cli/goals.py:397 GoalState, :344 GoalGate shell checks, :860 goal_judge model call decides done.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:20 Loop node with :804 'Loop Termination Condition' and :815 maximum loop count, so a builder can wrap an Agent node in a loop that repeats until a check holds; searched 'goal|until|stop condition' in dify-agent/src: an agent itself has no standing goal across turns Note: only as a builder-designed loop inside one workflow run, not across conversation turns", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1721 timer lets the agent schedule a follow-up prompt back into the same chat (utils/timers.py create_timer, fired by the scheduler at utils/automations.py:90), so it can keep working across turns; searched 'goal|until|success check' in utils/timers.py and utils/middleware.py: no goal object or completion check Note: self-scheduled follow-ups, no goal with a stop condition" }, "built": { "state": "none", @@ -6134,14 +6326,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:134 /moa runs a prompt through the Mixture of Agents preset; agent/moa_loop.py:1 reference models gathered before each iteration, aggregator answers; hermes_cli/subcommands/moa.py:10 `hermes moa configure`; hermes_cli/web_routers/models.py:204 GET /api/model/moa for the dashboard.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app-debug.json:31 'Debug as Multiple Models' shows several models side by side, for builder testing only; in a workflow a builder can run several LLM nodes on parallel branches (workflow.json:152 Add Parallel Node, :19 blocks.llm) and merge with a further LLM node or Variable Aggregator (:34) Note: no built-in ensemble setting; hand-built in a flow", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: several models answer one prompt side by side (permission chat.multiple_models; src/lib/components/chat/Messages/MultiResponseMessages.svelte) and 'Merge Responses' (:439) calls backend/open_webui/routers/tasks.py:610 POST /tasks/moa/completions to fuse them with moa_response_generation_template (:630)" }, "built": { "state": "none", @@ -6162,14 +6354,14 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/auth.py:10 `hermes auth add` pooled credentials; agent/credential_pool.py:122 least_used strategy, :1941 select, :2221 mark_exhausted_and_rotate; agent/agent_runtime_helpers.py:895 the turn rotates to the next key on a quota or auth failure. Note: distinct from mo-failover (second provider) and mo-key-broker (central store): same provider, many keys.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:387-390 model Load balancing: several credentials per model, round-robin, 1-minute cooldown when rate limited; api/core/model_manager.py:208,440-476 _round_robin_invoke and cooldown on InvokeRateLimitError; api/configs/feature/__init__.py:813-815 MODEL_LB_ENABLED (default False) read in api/services/feature_service.py:115 Note: self-hosted turns it on with an env flag; on Cloud it is plan-gated (common.json:442 'Upgrade your plan to enable Load Balancing')", "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:328 normalize_openai_api_keys pairs exactly one key with each base URL; Ollama spreads a model over several URLs at random (routers/ollama.py:863) without keys; searched 'rotate|429|quota|next key' in routers/openai.py and routers/ollama.py: no key pool or rotation on exhaustion" }, "built": { "state": "none", @@ -6190,14 +6382,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/backup.py:10 `hermes backup` zips ~/.hermes, hermes_cli/backup.py:671 run_backup, :993 run_import; hermes_cli/cli_commands_mixin.py:805 /snapshot list|create|restore; hermes_cli/update_cmd_maint.py:692 automatic snapshot only before an update. No scheduled backup job and no version history (grep backup in cron/: only fallback-provider copy). Note: issue open; automatic backups are limited to the pre-update snapshot.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: per-object version restore only: agents (api/controllers/console/agent/roster.py:1302), workflows (billing.json:167-168, plan-gated on Cloud) and skills (skill.json:153-157); searched 'backup' in api/, web/i18n/en-US and docker/: only docker/dify-env-sync.sh backing up the .env file (docker/README.md:151-159); no automatic backup of all agent data Note: no platform backup; restore of single agent or workflow versions", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: manual only: backend/open_webui/routers/utils.py:74 GET /utils/db/download returns the raw SQLite file (admin, ENABLE_ADMIN_EXPORT config.py:2082, not for PostgreSQL), routers/configs.py:118 export and :100 import config, chat export and import (routers/chats.py:807); searched 'backup|snapshot|restore' in backend/open_webui/routers and utils: no automatic backup or point-in-time restore" }, "built": { "state": "built", @@ -6219,14 +6411,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:6 bundled A2A plugin, outbound a2a_discover/a2a_call/a2a_orchestrate; plugins/platforms/a2a/tools.py:173 a2a_call sends a task to a configured peer or URL and returns the reply, :255 a2a_orchestrate; :330 tools appear only once a2a_agents or the platform is configured. Note: issue #689 is still open but the A2A plugin shipped in core covers remote delegation; config-gated, off by default.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: a remote agent can be reached only as a tool: MCP servers added as tool providers (api/controllers/console/workspace/tool_providers.py:1373), custom OpenAPI tools (:685) or an HTTP Request node (web/i18n/en-US/workflow.json:11); searched 'a2a|remote agent|agent.?card' in api/core and web/i18n/en-US: no agent-to-agent protocol Note: works through MCP or HTTP wrappers, no native remote agent hand-off", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: a remote agent server can be added as a model connection (OpenAI-compatible, routers/openai.py:865; README.md:94 Open WebUI Computer 'Connect it into Open WebUI as a model') or reached as an MCP/OpenAPI tool server (utils/middleware.py:2340); searched 'a2a|agent2agent|remote agent' in backend/open_webui: no agent-to-agent protocol, and delegate_task only spawns local clones (utils/subagents.py:317)" }, "built": { "state": "none", @@ -6247,14 +6439,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: searched 'requests_per_minute|rpm|token_bucket|throttle|rate_limit_delay' in agent/, run_agent.py, hermes_cli/: agent/rate_limit_tracker.py:181 only displays provider RPM headers; rate_limit_delay is accepted in hermes_cli/config.py:993 and hermes_cli/config_providers.py:260 but nothing in agent/ reads it. No client-side limiter. Note: a config key nothing reads, so no. Same demand in #58061.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 max_active_requests caps concurrent requests per app, enforced in api/services/app_generate_service.py:153,384; provider rate limits are only handled reactively by load-balancing cooldown (api/core/model_manager.py:469-476); searched 'per.?minute|rpm' in api/configs and api/core/model_manager.py: per-minute limits exist only for the openapi token and forms (api/configs/feature/__init__.py:1063) Note: concurrency cap, not requests per minute to a provider", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: searched 'rate_limit|rpm|requests per minute|throttle' in backend/open_webui/routers/openai.py, routers/ollama.py, config.py and utils/middleware.py: the only RateLimiter use is sign-in (routers/auths.py:91); no per-agent cap on provider requests" }, "built": { "state": "none", @@ -6275,14 +6467,14 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: no temperature key in hermes_cli/config*.py (grep temperature hermes_cli: none for the main agent); agent/chat_completion_helpers.py:1416 only fixed per-model temperatures; a custom provider's extra_body (hermes_cli/config.py:993, applied at agent/agent_runtime_helpers.py:1937) can pass one; MoA presets have reference/aggregator temperature (hermes_cli/web_models.py:152). Note: issue open; only indirect paths.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 ModelParameterModal per agent renders the provider's parameter rules including temperature (web/app/components/header/account-setting/model-provider-page/model-parameter-modal/__tests__/presets-parameter.spec.tsx); LLM nodes and classic apps use the same modal", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: per agent in ModelEditor 'Advanced Params' (ModelEditor.svelte:1127) using src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte:27 temperature, :434 label; per user and per chat in the same component; stored in Model.params (backend/open_webui/models/models.py:119)" }, "built": { "state": "built", @@ -6304,14 +6496,14 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:39 memory dir is per profile (HERMES_HOME/memories), so a profile per project gives separate memory but no shared layer; agent/prompt_builder.py:139 project .hermes.md/HERMES.md is read-only context; agent/skill_utils.py:437 project-local skills. Searched 'project.scoped|memory_scope' in agent, tools, plugins/memory: none. Note: issue open.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 agent working directories are owned per workflow run, conversation or build draft only; searched 'project' in web/i18n/en-US/agent-v-2.json and dify-agent/src: no project scope and no memory split into project and shared parts", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: memories are per user with an optional path hierarchy (backend/open_webui/models/memories.py:24 path; tools/builtin.py:800 list_memory_paths, :831 read_memory_path), so a project path can hold its own facts; folders (projects) carry files and a system prompt (utils/middleware.py:2591) but searched 'folder' in utils/memory.py and routers/memories.py: no memory scoped to a project" }, "built": { "state": "built", @@ -6333,14 +6525,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands_session.py:862 /resume, :323 a stored session is only resumable from the same platform and thread, :303 cross-origin resume only for an explicitly configured admin with --all; all sessions share one state.db so the local CLI can reopen them. Note: issue open; cross-channel is admin-only in the gateway.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:124-128 a caller resumes a conversation by passing conversation_id with the same user id, so two self-built channels on the Service API can share one thread; conversations are filtered by end user (api/services/conversation_service.py:56-57) and the web app session is a separate end user, so nothing carries over between the web app and a messenger plugin Note: only by a builder passing ids through the API", "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: chats are stored server-side so the same chat opens on any browser or the PWA (backend/open_webui/routers/chats.py:1325), but searched 'telegram|slack|messenger|move to channel' in backend/open_webui/routers and utils: there are no messenger channels and no way to carry a chat into a channel or back" }, "note": "not checked: lib/Settings/hermiq_register.json Session.talkRoomOrigin shows a Hermiq chat session can own or bind a Talk room, so one session spans the Chat page and Talk; whether a user can pick up in the Chat page a session begun in Talk was not traced to a page" }, @@ -6357,14 +6549,14 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/models/agent.py:218 AgentHomeSnapshot captured when a build is applied; release 1.17.0 'Build-time Home Snapshots' restores the sandbox home on each published run", "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: searched 'snapshot|pin|lock|build' in backend/open_webui/models/models.py, routers/models.py and utils/terminals.py: runs use the model's current config and the terminal's live filesystem; no frozen build of files and tools per published agent" }, "note": "hermiq not checked: back-fill pending" }, @@ -6381,14 +6573,14 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:237,251 'Add a CLI Tool', 'Install a CLI tool from any package registry. The agent gains shell access to the binary it provides'", "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: in an attached Open Terminal the agent can install packages through run_command (backend/open_webui/utils/tools.py:1439; separate first-party server, README.md:96); the browser Pyodide sandbox installs Python wheels with micropip (src/lib/workers/pyodide.worker.ts:72-73); core has no install tool of its own Note: needs Open Terminal for real CLI tools" }, "note": "hermiq not checked: back-fill pending" }, @@ -6405,14 +6597,14 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: docker/.env.example:271 DIFY_AGENT_RUNTIME_BACKEND=local, docker/docker-compose.e2b.yaml ships the E2B backend; web/i18n/en-US/agent-v-2.json:91 notes the limits of the community local sandbox", "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: admin chooses the code engine: src/lib/components/admin/Settings/CodeExecution.svelte:20 'pyodide' (in the browser) or 'jupyter' (own server), and per agent an Open Terminal server (ModelEditor.svelte:1268 TerminalSelector, AddTerminalServerModal.svelte); searched 'e2b|daytona|modal|cloud sandbox' in backend/open_webui: no hosted cloud sandbox option Note: choice between self-hosted engines only" }, "note": "hermiq not checked: back-fill pending" }, @@ -6429,14 +6621,14 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/human_input_form.py:78 /form/human_input/; api/controllers/openapi/human_input_form.py:63,83 read and submit a human input form", "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1893 POST /api/v1/chats/{id}/messages/{message_id}/resolve with ResolveToolCallForm action approve|reject|answer (utils/tool_approval.py:13), then resumes the run (main.py:1903 build_tool_approval_resume_payload); usable with an API key" }, "note": "hermiq not checked: back-fill pending" }, @@ -6453,14 +6645,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:558-561 the approval form can be emailed to chosen workspace members or external recipients, but searched 'assignee|approver' in workflow.json and api/controllers/web/human_input_form.py: whoever holds the form link can answer", "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/tool_approval.py:28 only the chat owner or an admin may resolve a pending call; searched 'approver|assignee' in utils/tool_approval.py and utils/middleware.py: no named approvers" }, "note": "hermiq not checked: back-fill pending" }, @@ -6477,14 +6669,14 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'context usage|context window|tokens used' in web/i18n/en-US/agent-v-2.json, share.json and app-debug.json: no indicator; compaction runs silently (dify-agent/src/dify_agent/runtime/compaction.py)", "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput.svelte:1837 'Context usage' readout fed by :535 statusContextUsage; backend/open_webui/utils/context_compaction.py:254 get_chat_context_usage against the compaction threshold (:290 _build_context_usage), returned with chats at routers/chats.py:1308, :1344" }, "note": "hermiq not checked: back-fill pending" }, @@ -6501,14 +6693,14 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:667-669 apps can carry tags (permission-keys.json app.tag.manage) to filter the list; no folders", "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: agents are grouped by tags, not folders (src/lib/components/workspace/Models.svelte:67 TagSelector, backend/open_webui/routers/models.py:270 /models/tags); folders exist for chats (routers/folders.py) and an automation's folder_id only files its generated chats (models/automations.py:25); there are no flows to sort" }, "note": "hermiq not checked: back-fill pending" }, @@ -6525,14 +6717,14 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'compare' in web/i18n/en-US/workflow.json and run-log.json: run history opens one run's tracing at a time (workflow.json:240-254), no comparison view", "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: searched 'compare|diff' in src/lib/components/automations and backend/open_webui/routers/automations.py: runs are listed one by one (AutomationEditor.svelte:355-400); side-by-side view exists only for different models answering one prompt (chat/Messages/MultiResponseMessages.svelte), not for two runs" }, "note": "hermiq not checked: back-fill pending" }, @@ -6549,14 +6741,230 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: issue is open against the function-calling agent runner; searched 'fabricat|expected tool|zero tool call' in api/core/agent and dify-agent/src: no check", "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: searched 'hallucinat|claimed|without calling|verify tool' in backend/open_webui/utils/middleware.py and utils/tools.py: no check that flags an answer claiming a result the agent never fetched with a tool" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-deep-research", + "area": "tools", + "name": "Run a deep research task where the agent searches many sources and writes a cited report on its own.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/open-webui/open-webui/discussions/9321", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "partial", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "open-webui": "source read at v0.11.4, not driven: no research mode (searched 'deep.?research' in backend/open_webui and src/lib/components: hits only in stale locale files); pieces exist: tools/builtin.py:294 search_web, :333 fetch_url, :1680 delegate_task parallel sub-agents, citations in chat/Messages/Citations.svelte" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-second-factor", + "area": "operations", + "name": "Require a second factor such as an authenticator code when signing in.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/open-webui/open-webui/discussions/9594", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "no", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "open-webui": "source read at v0.11.4, not driven: searched 'totp|two.?factor|2fa|mfa|webauthn|passkey' in backend/open_webui and src/lib/components: no second factor; MFA only through an outside OIDC provider (utils/oauth.py)" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-user-key-encryption", + "area": "compliance", + "name": "Encrypt my conversations with a key only I hold, so even the administrator cannot read them.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/open-webui/open-webui/discussions/9826", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "partial", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/internal/db.py:289 whole-database encryption with sqlite+sqlcipher and DATABASE_PASSWORD, instance-wide; searched 'encrypt' in models/chats.py: chats stored readable to the server and admins, no per-user key" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-mcp-user-auth", + "area": "tools", + "name": "Connect an MCP tool server with each person's own login, so tool calls run with that person's rights.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/open-webui/open-webui/discussions/14121", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "yes", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/tools.py:137-158 tool server auth types bearer, session, system_oauth, oauth_2.1 and oauth_2.1_static; src/lib/components/AddToolServerModal.svelte:143 registers an OAuth client for MCP; per-user tokens encrypted in utils/oauth.py:269 Note: discussion still open, but the code has per-user OAuth 2.1 for MCP" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-responses-api", + "area": "models", + "name": "Connect a model through the provider's Responses API instead of chat completions.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/open-webui/open-webui/discussions/11874", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "yes", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/AddConnectionModal.svelte:51 apiType '' or 'responses'; backend/open_webui/routers/openai.py:1589 is_responses, :1618-1634 posts to {url}/responses with convert_to_responses_payload Note: discussion still open; the code ships it" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-prompt-cache", + "area": "models", + "name": "Cache repeated prompt parts at the model provider automatically to cut cost and wait time.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/open-webui/open-webui/discussions/7873", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "partial", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/anthropic.py:111 _copy_cache_control passes cache_control through when the caller sets it; searched 'cache_control|prompt.?cach' in utils/payload.py and routers/openai.py: nothing adds cache breakpoints automatically" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-ask-mid-run", + "area": "oversight", + "name": "Let the agent pause mid-run and ask me a question with suggested answers before it continues.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/open-webui/open-webui/releases/tag/v0.11.1", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "yes", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:518 ask_user (1-3 questions with options and free text), resolved via utils/tool_approval.py:13 action 'answer'; src/lib/components/chat/AskUserCard.svelte mounted at chat/MessageInput.svelte:1776; survives reload (CHANGELOG.md:331)" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-agent-form-fields", + "area": "agents", + "name": "Fill in form fields an agent declares, such as a dropdown or text box, before the conversation starts.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/open-webui/open-webui/releases/tag/v0.11.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "yes", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/chat_variables.py:127 get_chat_variables_schema parses fields from the system prompt; routers/models.py:60 add_chat_variables_schema; ModelEditor.svelte:1084 'Chat Variables' (CHANGELOG.md:655)" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-fork-chat", + "area": "chat", + "name": "Fork a conversation at any answer to try another path without changing the original.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/open-webui/open-webui/releases/tag/v0.11.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "yes", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1672 POST /chats/{id}/fork copies the chat up to a message and records the branch (utils/chat_fork.py:4 build_fork_history); fork button per response src/lib/components/chat/Messages/ResponseMessage.svelte:1528 (CHANGELOG.md:665)" }, "note": "hermiq not checked: back-fill pending" } @@ -6584,11 +6992,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "n8n": "docs-only: competitor_features#38153 \"core: Bind dynamic credential tokens to a user ID: From n8n@2.32.0 (2026-07-21)\"", "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 a requester's user id can route to their own profile, whose own keys and credentials then apply (agent/secret_scope.py:1-10); tools/environments/ssh.py runs the terminal as a configured remote account; searched 'run.?as|impersonat|service account|on behalf of' in agent/ and gateway/: no per-run identity choice Note: Tools act with the host or backend account and the profile's keys; choosing requester, owner or service identity per agent is not a setting.", - "dify": "source read at 1.17.1, not driven: api/core/agent/entities.py:19 each agent tool carries a credential_id the builder picks; api/models/tools.py:121 credential visibility, web/i18n/en-US/plugin.json:27 an OAuth credential is 'only for you or shared with all workspace members'. So a tool runs as the builder's or a shared workspace credential; searched 'on_behalf|end_user credential|user_credential' in api/core/tools and api/core/plugin: no run-as-the-asking-person Note: owner or shared credential only, no per-caller identity and no service-account concept" + "dify": "source read at 1.17.1, not driven: api/core/agent/entities.py:19 each agent tool carries a credential_id the builder picks; api/models/tools.py:121 credential visibility, web/i18n/en-US/plugin.json:27 an OAuth credential is 'only for you or shared with all workspace members'. So a tool runs as the builder's or a shared workspace credential; searched 'on_behalf|end_user credential|user_credential' in api/core/tools and api/core/plugin: no run-as-the-asking-person Note: owner or shared credential only, no per-caller identity and no service-account concept", + "open-webui": "source read at v0.11.4, not driven: interactive runs act as the asking user (main.py:1118 with user from the session); automation runs act as the owner with a minted token (backend/open_webui/utils/automations.py:389 'typ': 'automation', re-gated at :366); searched 'service account|run as|impersonat' in backend/open_webui: the rights holder cannot be chosen Note: fixed by trigger type, no service-account option" }, "pendingReason": "Whether actingUser is set anywhere outside seed/repair scripts on a live instance could not be settled without running the app." }, @@ -6614,10 +7023,10 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "partial", + "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: api/services/conversation_service.py:56-57,179-180 every conversation is filtered to one from_end_user_id or from_account_id; api/controllers/web/conversation.py lists, renames, pins and deletes only the caller's own conversations; the Collaboration feature is live co-editing of the workflow canvas (api/controllers/console/socketio/workflow.py, web/i18n/en-US/workflow.json:118,986 collaborator cursors) Note: old yes rested on the Collaboration beta, which is shared canvas editing for builders, not a shared chat", - "open-webui": "docs-only: competitor_features#38758 \"Share folders with your team: share a folder and the chats inside it with specific users, groups, or everyone, with read or write access; people you share with see shared folders in their sidebar and open the chats in a read-only view when they are not the owner\"", + "open-webui": "source read at v0.11.4, not driven: Channels put colleagues and models in one timeline: backend/open_webui/routers/channels.py:976 model_response_handler answers @mentioned models (:1244) in rooms and threads; src/lib/components/channel/Channel.svelte, Thread.svelte, MessageInput/MentionList.svelte; group and member channel types (translation 'A collaboration channel where people join as members') Note: old partial; shared agent conversations happen in channels", "hermes-agent": "source read at v2026.9.24, not driven: gateway/config.py:574-596 thread_sessions_per_user false by default, so everyone in a thread shares one session with the agent (group_sessions_per_user can be switched off for whole groups); gateway/session.py:634-641 session key resolution; hermes_cli/commands.py:76 /branch opens a shared thread" }, "pendingReason": "Whether every talk-shared-sessions requirement is complete cannot be settled without running a live Talk room." @@ -6645,11 +7054,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "pendingReason": "Whether another app relays anonymous citizens into this endpoint as an authenticated service account could not be settled from this repo alone.", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:35 _ALLOW_ALL_USERS lets anyone message the bot on WhatsApp, SMS, Telegram and others without an account; gateway/run_inbound_unauthorized.py:1-9 strangers otherwise get a pairing code; searched 'intake|case|file.{0,10}request' in gateway/ and tools/: no intake flow that files a request Note: A public bot is possible; filing the request somewhere is left to whatever tools the agent has.", - "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app.json:2 web app access 'Anyone with the link'; api/controllers/web/passport.py:53-72 issues a token to an anonymous end-user session, so a resident chats without an account; filing the request needs a builder-built HTTP Request node or custom tool (web/i18n/en-US/workflow.json:11,45); no ready-made intake to a case or request system in core Note: anonymous chat is core; the filing target has to be wired by hand" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app.json:2 web app access 'Anyone with the link'; api/controllers/web/passport.py:53-72 issues a token to an anonymous end-user session, so a resident chats without an account; filing the request needs a builder-built HTTP Request node or custom tool (web/i18n/en-US/workflow.json:11,45); no ready-made intake to a case or request system in core Note: anonymous chat is core; the filing target has to be wired by hand", + "open-webui": "source read at v0.11.4, not driven: searched 'anonymous|guest|public chat|intake' in backend/open_webui/routers/auths.py, routers/chats.py and src/routes: every chat requires an account (utils/auth.py get_verified_user); no anonymous assistant that files a request" } }, { @@ -6673,12 +7083,13 @@ "copilot-studio": "yes", "dify": "partial", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", "dify": "source read at 1.17.1, not driven: core ships only audio, code, time and webscraper tools (api/core/tools/builtin_tool/providers/); connectors come from the in-product Dify Marketplace: about 149 official tool plugins (langgenius/dify-official-plugins tools/, e.g. slack, jira, notion, gmail, salesforce, nextcloud) plus about 1,290 community packages (langgenius/dify-plugins), installed from web/app/(commonLayout)/integrations; MCP client too Note: rated partial only by the brief's plugin rule; the catalogue is well over a hundred ready-made connectors, one click from the core UI. The lane keeps partial under the plugin rule (ruling 2026-09-26).", "n8n": "docs-only: competitor_features#31095 \"400+ app connectors: Large library of prebuilt integration nodes.\"", - "hermes-agent": "source read at v2026.9.24, not driven: tools/connectors/__init__.py:1-6 and tools/connectors/gateway/client.py:1-3 managed connector accounts through the Nous tool gateway; optional-mcps/ 65 Nous-approved MCP servers (asana, atlassian, notion, stripe, supabase, ...); plugin-catalog/ ~290 curated plugins Note: The managed connector set needs a Nous account; the MCP and plugin catalogs are self-configured." + "hermes-agent": "source read at v2026.9.24, not driven: tools/connectors/__init__.py:1-6 and tools/connectors/gateway/client.py:1-3 managed connector accounts through the Nous tool gateway; optional-mcps/ 65 Nous-approved MCP servers (asana, atlassian, notion, stripe, supabase, ...); plugin-catalog/ ~290 curated plugins Note: The managed connector set needs a Nous account; the MCP and plugin catalogs are self-configured.", + "open-webui": "source read at v0.11.4, not driven: outside services connect through generic MCP and OpenAPI tool servers (src/lib/components/AddToolServerModal.svelte:43, utils/mcp/client.py) and community Tools from openwebui.com (workspace/Tools.svelte:639); searched 'connector' in backend/open_webui: no shipped catalogue of ready-made connectors Note: ready-made connectors are community Tools, not core" }, "pendingReason": "Hermiq documents the seam but ships no connector catalogue itself; whether integriq's own catalogue is reachable and how many connectors it exposes needs checking in the integriq repo, not done here." }, @@ -6703,12 +7114,12 @@ "copilot-studio": "partial", "dify": "partial", "n8n": "unknown", - "open-webui": "yes", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31881 \"Context Chat (RAG over Nextcloud data): RAG over Files, Collectives and Analytics\"", "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", "dify": "source read at 1.17.1, not driven: knowledge bases from uploaded files (api/controllers/console/datasets/datasets_document.py:384) and datasource plugins; official datasources are S3, Azure, Box, Dropbox, Google Drive, OneDrive, SharePoint, Confluence, Notion, GitHub, GitLab and others, no Nextcloud (langgenius/dify-official-plugins datasources/); only the official nextcloud tool plugin can download_file at run time (tools/nextcloud/tools/download_file.yaml) Note: old yes rested on generic RAG; Nextcloud Files is not a knowledge source, only a plugin tool fetch", - "open-webui": "docs-only: competitor_features#31813 \"RAG document ingestion / knowledge base: Upload docs and chat over them with retrieval\"", + "open-webui": "source read at v0.11.4, not driven: RAG over uploaded files and knowledge bases: backend/open_webui/routers/retrieval.py (hybrid BM25 + vector, reranking), tools/builtin.py:3151 query_knowledge_files, :2509 query_chat_files; sources are uploads, Google Drive and OneDrive pickers (chat/MessageInput/InputMenu.svelte:399, :692); searched 'nextcloud|webdav' in backend/open_webui: no Nextcloud Files source Note: old yes; grounding works but not on Nextcloud Files", "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file and search_files let the agent read and grep documents on the host on demand; gateway/platforms/base.py:1183-1231 attached documents are read into the turn; searched 'nextcloud' repo-wide: none, and no document index in core (RAG only via plugins/memory/retaindb, openviking) Note: Grounding in local files by reading them, not in Nextcloud Files and not through an index." }, "pendingReason": "Real semantic/vector grounding is unbuilt (vector-rag change open); today's grounding is keyword search over the agent's declared views/files." @@ -6737,7 +7148,7 @@ "n8n": "unknown", "open-webui": "yes", "evidence": { - "open-webui": "docs-only: competitor_features#38816 \"File ownership in folder and knowledge attachments: Attaching files to folders or knowledge bases now verifies per-file read access, and folder file lists in chat middleware are filtered to entries the caller can read, preventing unauthorized file content from being injected into RAG context.\"", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/knowledge_fs.py:307 _get_accessible_kb_ids checks owner or AccessGrants per asking user even for a model's attached knowledge (:343 _has_access); routers/knowledge.py:172 lists only readable bases Note: in legacy function-calling mode model knowledge is injected without that check (utils/middleware.py:2607)", "hermes-agent": "source read at v2026.9.24, not driven: searched 'acl|permission.{0,20}(user|requester)|allowed to see' in tools/file_tools*.py, tools/session_search_tool.py and agent/: file access follows the host account and tools/file_tools_write_guards.py protects Hermes' own files, not per-requester visibility; tools/session_search_tool.py:1-9 searches the whole profile's sessions Note: All users of one profile share what the agent can read; nothing filters by the asking person.", "dify": "source read at 1.17.1, not driven: api/models/dataset.py:163,184-187 dataset permission (only_me, all_team, partial_members) governs which builders may attach a knowledge base, not what the end user may see; retrieval does not check the asking person. A builder can hand-build a manual metadata filter bound to a variable (api/core/workflow/nodes/knowledge_retrieval/entities.py:46-48, knowledge_retrieval_node.py:312-327 convert_template) Note: no document ACL trimming; only a hand-built metadata filter per flow" }, @@ -6764,10 +7175,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_builder.py:1656-1661 loads .hermes.md, AGENTS.md chain, CLAUDE.md and .cursorrules as instructions; hermes_cli/commands.py:234 /init generates AGENTS.md from a repo scan; SOUL.md per profile (web/src/pages/ProfilesPage.tsx:556); skills as SKILL.md documents Note: Old partial; document instructions are core.", - "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:106 agent Files 'for reference material too long to paste into the Prompt: specs, templates, guidelines', :274 persistent in every run; workspace Skills are versioned Markdown SKILL.md packages with files (api/models/skill.py:56-66; web/i18n/en-US/skill.json referenceFiles.livePlaceholder) attached per agent (api/controllers/console/workspace/skills.py:811)" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:106 agent Files 'for reference material too long to paste into the Prompt: specs, templates, guidelines', :274 persistent in every run; workspace Skills are versioned Markdown SKILL.md packages with files (api/models/skill.py:56-66; web/i18n/en-US/skill.json referenceFiles.livePlaceholder) attached per agent (api/controllers/console/workspace/skills.py:811)", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/terminals.py:189 get_terminal_agents_md loads AGENTS.md from the attached Open Terminal and :239 add_terminal_agents_md injects it; notes can be attached as documents (chat/MessageInput/InputMenu.svelte:322 Attach Notes); folder system prompt and files (utils/middleware.py:2591)" }, "pendingReason": "hermiq-context-documents change (assembler + editor) is open, not implemented -- the schema field exists but nothing reads or writes it yet." }, @@ -6792,11 +7204,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "pendingReason": "The spec's own e2e-exclude note says no committed Playwright fixture provisions a second organisation, and a live shared hub needs an OpenConnector connector not configured by default -- cross-org sharing works as a manual paste/GitHub install, not a live in-instance marketplace browse.", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_sync_client_org.py:1-7 org-shared skills under ~/.hermes/skills/_org// with pull and propose; tools/skills_sync_client.py:6-8 the sync is INERT unless the user is a Nous portal admin (pre-launch gate); hermes_cli/subcommands/profile.py:20-23 --clone copies skills to another profile Note: Org skill sharing exists in code but is switched off for ordinary users; profiles on one install share by cloning.", - "dify": "source read at 1.17.1, not driven: api/models/skill.py:62,66 skills are unique per tenant_id (workspace); api/controllers/console/workspace/skills.py:494 export and :385 import (web/i18n/en-US/skill.json:224 '.zip with SKILL.md, agentskills.io format') copy a skill into another workspace; searched 'share' in skill.json and skills.py: no live cross-workspace sharing Note: copy by export/import only, updates do not follow" + "dify": "source read at 1.17.1, not driven: api/models/skill.py:62,66 skills are unique per tenant_id (workspace); api/controllers/console/workspace/skills.py:494 export and :385 import (web/i18n/en-US/skill.json:224 '.zip with SKILL.md, agentskills.io format') copy a skill into another workspace; searched 'share' in skill.json and skills.py: no live cross-workspace sharing Note: copy by export/import only, updates do not follow", + "open-webui": "source read at v0.11.4, not driven: skills are shared by access grants to users, groups or everyone on one instance (backend/open_webui/routers/skills.py:357 access update); searched 'tenant|organization' in backend/open_webui/models: no organisations to share across" } }, { @@ -6826,7 +7239,7 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions, /v1/responses, /v1/models plus /v1/runs, /api/sessions and /api/jobs with API_SERVER_KEY; gateway/platforms/api_server_runs.py run lifecycle; per-profile paths /p//", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:324 POST /v1/chat-messages and :175 completion-messages with per-app API keys (api/controllers/console/apikey.py:236); web/i18n/en-US/agent-v-2.json agentDetail.access.serviceApi 'Backend Service API' with API Reference per agent; client SDKs in sdks/nodejs-client, sdks/php-client", "n8n": "docs-only: competitor_features#3909 \"core: Add missing fields to public API workflow schema: From n8n@2.14.0 (2026-03-24)\"", - "open-webui": "docs-only: competitor_features#31809 \"OpenAI-compatible API support: Connects to any OpenAI-compatible endpoint and exposes one itself\"" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1109 POST /api/v1/chat/completions and :898 /api/v1/models (OpenAI-compatible), :2003 /api/v1/messages (Anthropic-compatible) with user API keys (routers/auths.py:1529); OpenAPI docs at main.py:508 /docs (served when ENV is dev)" }, "pendingReason": "whether third-party integrators are actually told about this API anywhere outside the code cannot be settled by reading the repo alone" }, @@ -6852,11 +7265,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "pendingReason": "Live publish success depends on OpenCatalogi being installed and reachable; could not verify a live 200 without running the app.", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'algoritme|algorithm register' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none", - "dify": "source read at 1.17.1, not driven: searched 'algoritme|algorithm.?regist|register|ai act' in api/, web/app and web/i18n/en-US: no hits for an algorithm register or any export to one; apps and agents carry no register fields (api/models/agent.py, api/models/model.py)" + "dify": "source read at 1.17.1, not driven: searched 'algoritme|algorithm.?regist|register|ai act' in api/, web/app and web/i18n/en-US: no hits for an algorithm register or any export to one; apps and agents carry no register fields (api/models/agent.py, api/models/model.py)", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'algoritmeregister|algorithm register|register' in backend/open_webui/routers and src/lib/components/admin: no publication to the Dutch Algoritmeregister" } }, { @@ -6881,11 +7295,12 @@ "copilot-studio": "unknown", "dify": "no", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "no", "pendingReason": "Could not confirm without running the app whether the generic OpenRegister index-page edit form actually renders and saves the impactAssessments array-of-object field, or whether it is write-only through occ/API.", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no link or document field for an assessment", - "dify": "source read at 1.17.1, not driven: searched 'dpia|impact assessment|fundamental rights|privacy assessment' in api/, web/app and web/i18n/en-US: no hits; agents have name, description, role and icon only (api/controllers/console/agent/roster.py:706), no field or link for an assessment" + "dify": "source read at 1.17.1, not driven: searched 'dpia|impact assessment|fundamental rights|privacy assessment' in api/, web/app and web/i18n/en-US: no hits; agents have name, description, role and icon only (api/controllers/console/agent/roster.py:706), no field or link for an assessment", + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpia|impact assessment|fundamental rights' in backend/open_webui and src/lib/components: models have no field or link for an assessment (backend/open_webui/models/models.py:74 ModelMeta)" } }, { @@ -6910,10 +7325,11 @@ "copilot-studio": "unknown", "dify": "yes", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 batch (parallel) mode spawns several child agents at once; hermes_cli/config_defaults.py:1332-1338 delegation block; hermes_cli/kanban_swarm.py:1-8 parallel specialist workers with a verifier; optional-skills/autonomous-ai-agents/dynamic-workflow fan-outs", - "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:152,217 'Add Parallel Node' parallel branches on the canvas; :684-702 Iteration node Parallel Mode with maximum parallelism over list items; api/configs/feature/__init__.py:949 MAX_SUBMIT_COUNT thread pool for parallel node execution; Agent nodes (blocks.agent-v2, api/core/workflow/nodes/agent_v2) can sit on each branch or inside the iteration Note: fan-out is designed in the flow; an agent cannot spawn parallel sub-agents itself at run time (see fl-subagent)" + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:152,217 'Add Parallel Node' parallel branches on the canvas; :684-702 Iteration node Parallel Mode with maximum parallelism over list items; api/configs/feature/__init__.py:949 MAX_SUBMIT_COUNT thread pool for parallel node execution; Agent nodes (blocks.agent-v2, api/core/workflow/nodes/agent_v2) can sit on each branch or inside the iteration Note: fan-out is designed in the flow; an agent cannot spawn parallel sub-agents itself at run time (see fl-subagent)", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task 'Delegate focused work to a parallel sub-agent', foreground bounded by a semaphore (utils/subagents.py:370 max_concurrent, default 20) and background runs (:364 max_async); admin limits in src/lib/components/admin/Settings/Subagents.svelte" }, "pendingReason": "whether delegated sub-agent calls actually run concurrently needs a live run to confirm timing" }, @@ -6945,7 +7361,7 @@ "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "dify": "source read at 1.17.1, not driven: api/models/account.py:21-26 workspace roles owner, admin, editor, normal, dataset_operator; web/i18n/en-US/common.json:224 admin 'Can build apps & manage team settings', :234 editor 'Can build & edit apps', :267 normal 'Only can use apps'; api/controllers/console/workspace/members.py:368 change a member's role Note: enterprise-licensed RBAC (api/configs/enterprise/__init__.py:38 RBAC_ENABLED) adds custom roles and per-agent permission sets (web/i18n/en-US/permission-keys.json); the basic roles are in community", "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", - "open-webui": "docs-only: competitor_features#31811 \"Role-Based Access Control (RBAC): Built-in RBAC with user groups and model access controls\"", + "open-webui": "source read at v0.11.4, not driven: roles admin, user, pending (backend/open_webui/utils/auth.py get_admin_user / get_verified_user); per-group permissions for workspace models, knowledge, tools, skills (builder rights) and chat features (src/lib/components/admin/Users/Groups/Permissions.svelte:44-71, config.py DEFAULT_USER_PERMISSIONS)", "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_access.py:1-27 per platform allow_admin_from (all commands) vs user_allowed_commands for other allowed users; gateway/authz_mixin.py:32-37 allowlists decide who may chat; plugins/dashboard_auth/basic/__init__.py:1-8 the dashboard has one username and every signed-in user has full control (hermes_cli/dashboard_auth/base.py:12-16 no role field) Note: Two chat roles (admin, user) for slash commands; no builder role and no roles in the dashboard." }, "pendingReason": "Could not confirm which page lets an admin edit the action-to-group matrix (as opposed to the individual per-agent RBAC surfaces already covered elsewhere)." @@ -6972,11 +7388,12 @@ "copilot-studio": "unknown", "dify": "partial", "n8n": "unknown", - "open-webui": "unknown", + "open-webui": "yes", "pendingReason": "Did not verify nl.json has full key parity with en.json (that is the subject of the nl-locale-completeness spec itself).", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: web/src/i18n/ ships af, ar, de, en, es, fr, ga, hu, it, ja, ko, pt, ru, tr, uk, zh, zh-hant; locales/*.yaml the same set for CLI and gateway strings; apps/desktop/src/i18n adds no nl either; searched for nl locale files repo-wide: none Note: The model answers in Dutch when addressed in Dutch, but dashboard, CLI and desktop text have no Dutch translation.", - "dify": "source read at 1.17.1, not driven: web/i18n-config/languages.ts:158-162 nl-NL 'Nederlands' marked supported; web/i18n/nl-NL has all 37 namespaces, but about 3,800 of 5,947 values are identical to en-US (e.g. workflow.json 921 of 1161, dataset-documents.json 258 of 260 untranslated), while agent-v-2, permission and skill are translated Note: Dutch is selectable, roughly two thirds of the UI still shows English" + "dify": "source read at 1.17.1, not driven: web/i18n-config/languages.ts:158-162 nl-NL 'Nederlands' marked supported; web/i18n/nl-NL has all 37 namespaces, but about 3,800 of 5,947 values are identical to en-US (e.g. workflow.json 921 of 1161, dataset-documents.json 258 of 260 untranslated), while agent-v-2, permission and skill are translated Note: Dutch is selectable, roughly two thirds of the UI still shows English", + "open-webui": "source read at v0.11.4, not driven: src/lib/i18n/locales/nl-NL/translation.json: 3432 of 3518 keys translated; language picker in src/lib/components/chat/Settings/General.svelte (settings.personal.general.language); 60+ locales in src/lib/i18n/locales" } } ] From 9028b58e06f8340e9df72fbf9eea05c156b5fd47 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 16:38:36 +0200 Subject: [PATCH 07/12] chore(parity): fold the n8n source reading, its sources object and ten rows mined from its releases and forum --- openspec/parity/capabilities.json | 1388 +++++++++++++++++++---------- 1 file changed, 927 insertions(+), 461 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 591b98d42..852af9e45 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -142,11 +142,71 @@ "key": "n8n", "name": "n8n", "vendor": "n8n GmbH", - "readOn": "2026-07-23", + "readOn": "2026-09-26", "columnAddedOn": "2026-09-26", "evidenceGrade": "docs-only", - "readHow": "14 curated feature rows (competitor id 206) plus 117 release-note rows (n8n 2.14 to 2.32, captured 2026-03-28 to 2026-07-23) in the intelligence database; nobody has driven n8n for this matrix", - "unknownReason": "not covered by the 14 curated n8n feature rows or its 117 release-note rows in the intelligence database; nobody has driven n8n for this row" + "readHow": "source read at n8n@2.40.7 (09b3ce6, shallow clone of github.com/n8n-io/n8n), not driven: the LangChain AI Agent nodes, the editor UI and its i18n, the CLI REST and public API, licence checks in .ee. files; cells resting on the opt-in Agents module (N8N_ENABLED_MODULES=agents) are rated yes with an opt-in note, because enabling a shipped module is configuration; licence-gated features are partial and marked enterprise-licensed; a capability a user must hand-build from generic nodes is partial unless a shipped node or screen satisfies the row; no instance booted", + "unknownReason": "source read at n8n@2.40.7, not driven: the code reading could not settle this row", + "sources": { + "docs": "https://docs.n8n.io/", + "sourceRepo": "https://github.com/n8n-io/n8n", + "featurePage": { + "features": "https://n8n.io/features/", + "aiAgents": "https://n8n.io/ai-agents/" + }, + "featureRequests": "https://community.n8n.io/c/feature-requests/5", + "issueTracker": { + "url": "https://github.com/n8n-io/n8n/issues", + "featureLabel": null + }, + "roadmap": null, + "changelog": { + "releaseNotes": "https://docs.n8n.io/release-notes/", + "githubReleases": "https://github.com/n8n-io/n8n/releases" + }, + "apiReference": { + "publicApi": "https://docs.n8n.io/api/api-reference/", + "apiOverview": "https://docs.n8n.io/api/" + }, + "marketplace": { + "integrations": "https://n8n.io/integrations/", + "workflowTemplates": "https://n8n.io/workflows/", + "communityNodes": "https://docs.n8n.io/integrations/community-nodes/" + }, + "pricing": "https://n8n.io/pricing/", + "accessibilityStatement": null, + "securityDocs": { + "trust": "https://n8n.io/security/", + "policy": "https://github.com/n8n-io/n8n/blob/master/SECURITY.md", + "hardening": "https://docs.n8n.io/hosting/securing/overview/", + "privacy": "https://docs.n8n.io/privacy-security/" + }, + "demoInstance": { + "cloudTrial": "https://app.n8n.cloud/register" + }, + "community": { + "forum": "https://community.n8n.io/", + "announcements": "https://community.n8n.io/c/announcements/7" + }, + "reviews": { + "productHunt": "https://www.producthunt.com/products/n8n-io" + }, + "videos": "https://www.youtube.com/@n8n-io", + "caseStudies": "https://n8n.io/case-studies/", + "partnerDirectory": { + "partners": "https://n8n.io/partners/", + "experts": "https://experts.n8n.io/" + }, + "trainingCurriculum": "https://docs.n8n.io/courses/", + "jobPostings": "https://n8n.io/careers/", + "tenders": null, + "nullReasons": { + "issueTracker.featureLabel": "GitHub issues take bugs only: .github/ISSUE_TEMPLATE/config.yml at n8n@2.40.7 sends 'Feature request' to community.n8n.io, and the repo label 'closed:enhancement/feature' marks issues closed for being feature requests; there is no open-feature label to filter on.", + "roadmap": "no public roadmap: n8n.io/roadmap/ and n8n.io/product-roadmap/ return 404, community.n8n.io/c/roadmap 404, GitHub Discussions and Projects are disabled (gh repo view: hasDiscussionsEnabled false, hasProjectsEnabled false); the only forum topic titled roadmap is from 2022 (community.n8n.io/t/13545).", + "accessibilityStatement": "n8n.io/accessibility/ and docs.n8n.io/accessibility/ return 404; no 'accessib' link on n8n.io, n8n.io/legal/ or docs.n8n.io home pages.", + "tenders": "searched the intelligence database on 2026-09-26 (tenders name, description and keywords, and requirements text_nl/text_en, word-boundary match on 'n8n'): no tender names it" + } + } }, { "key": "open-webui", @@ -344,13 +404,14 @@ "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:18 `hermes profile create --description`; web/src/pages/ProfilesPage.tsx:442 New Profile form -> POST /api/profiles (hermes_cli/web_routers/profiles.py:704); ProfilesPage.tsx:556 edit SOUL.md (personality / system prompt) -> PUT /api/profiles/{name}/soul (profiles.py:906); web/src/pages/ProfileBuilderPage.tsx:32 builder wizard (identity, model, skills, MCPs) Note: An agent in Hermes is a profile: a name, a description and SOUL.md instructions. Old partial undersold it.", "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:706 POST /agent creates an agent with name, description, role and icon; web/features/agent-v2/roster/components/create-agent-dialog.tsx:61 and agent-form-fields.tsx:73 the create form; web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/index.tsx:1088 the Prompt (instructions) editor", - "open-webui": "source read at v0.11.4, not driven: an agent is a workspace Model: src/lib/components/workspace/Models/ModelEditor.svelte:789 name, :962 description, :1055 system prompt, :856 base model; backend/open_webui/routers/models.py:285 POST /models/create; backend/open_webui/models/models.py:111 model table (id, user_id, base_model_id, params, meta)" + "open-webui": "source read at v0.11.4, not driven: an agent is a workspace Model: src/lib/components/workspace/Models/ModelEditor.svelte:789 name, :962 description, :1055 system prompt, :856 base model; backend/open_webui/routers/models.py:285 POST /models/create; backend/open_webui/models/models.py:111 model table (id, user_id, base_model_id, params, meta)", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:45,51,69 personal agent has name, description, systemPrompt; chat-hub.controller.ts:451 POST /chat/agents; packages/frontend/@n8n/i18n/src/locales/en.json:492 'Instructions' field in the Chat agent editor; the opt-in Agents module adds packages/cli/src/modules/agents/agents.controller.ts:29 POST with en.json:7867,7878 Name and Instructions Note: Chat hub is a default module, so creating a named agent with instructions works out of the box." } }, { @@ -374,12 +435,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:630 GET /agent lists every workspace agent with draft/published counts; web/features/agent-v2/roster/components/agent-roster-list.tsx:238 shows a Draft badge and :408 updated time, but no owner; only a 'Created by me' filter (roster-toolbar.tsx:90). The classic Studio list shows author (web/app/components/apps/app-card/index.tsx:175) but no status Note: list plus status, or list plus author, never both on one screen", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:1184-1217 profile list shows gateway running/stopped, model and skill count; hermes_cli/subcommands/profile.py:14 `hermes profile list`; hermes_cli/profiles.py:538 ProfileInfo has no owner field (name, model, provider, gateway_running, description, role only) Note: No owner column and no organisation: one operator's install lists its own profiles.", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:808 owner name per row, :899 Enabled/Disabled switch; backend/open_webui/routers/models.py:162 GET /models/list (admins see all with BYPASS_ADMIN_ACCESS_CONTROL, :198), :245 GET /models/all admin; admin Settings > Models lists every model (src/lib/components/admin/Settings/Models.svelte)" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:808 owner name per row, :899 Enabled/Disabled switch; backend/open_webui/routers/models.py:162 GET /models/list (admins see all with BYPASS_ADMIN_ACCESS_CONTROL, :198), :245 GET /models/all admin; admin Settings > Models lists every model (src/lib/components/admin/Settings/Models.svelte)", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agents-list.controller.ts:17 GET /agents/v2 across projects; agents.service.ts:358-364 scoped to projects the user is a member of, so an admin does not see every agent; packages/frontend/editor-ui/src/features/agents/components/AgentCard.vue:203-220 card shows name, updated, created and a Published badge, no owner Note: No organisation-wide list and no owner column. Agents module is shipped but off by default: packages/@n8n/backend-common/src/modules/module-registry.ts:44 defaultModules omits 'agents' (enable with N8N_ENABLED_MODULES=agents)." } }, { @@ -402,12 +464,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:540-673 per-profile SOUL, description, model editing; schedules and runs sit on other pages scoped by the managing-profile selector (web/src/i18n/en.ts:103 managingProfileBanner; web/src/pages/CronPage.tsx, SessionsPage.tsx); hermes_cli/subcommands/profile.py:76 `profile show` Note: Configuration and skills per profile exist, but schedules, runs and skills are not on one agent page.", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/navigation.tsx:62-86 detail page with Configure (model, prompt, tools, skills, knowledge, files), Access Point, Logs, Monitoring; api/controllers/console/agent/roster.py:1133 logs. No schedules: agents have no scheduler of their own, schedules only exist as trigger nodes on workflow apps Note: schedules are missing from the agent page", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194-1275 config, knowledge, tools, skills, filters, capabilities on one page; schedules live apart in /automations (src/routes/(app)/automations/[id]/+page.svelte) keyed by model_id (backend/open_webui/models/automations.py:73) and per-model chats in admin analytics (routers/analytics.py:285, :343) Note: no single page joins an agent's config with its schedules and runs" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194-1275 config, knowledge, tools, skills, filters, capabilities on one page; schedules live apart in /automations (src/routes/(app)/automations/[id]/+page.svelte) keyed by model_id (backend/open_webui/models/automations.py:73) and per-model chats in admin analytics (routers/analytics.py:285, :343) Note: no single page joins an agent's config with its schedules and runs", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/module.descriptor.ts:60-91 agent page with builder, preview, sessions and session-detail children; en.json:8172-8178 tabs Build, Knowledge, Sessions, Settings, Memory, Evals; en.json:8112 Schedules and 8044 Skills sections in the builder Note: Configuration, schedules and skills sit on the Build tab, runs on the Sessions tab of the same agent page. Agents module is shipped but off by default: packages/@n8n/backend-common/src/modules/module-registry.ts:44 defaultModules omits 'agents' (enable with N8N_ENABLED_MODULES=agents)." } }, { @@ -430,12 +493,12 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "partial", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/profiles.py:942 PUT /api/profiles/{name}/model called from web/src/pages/ProfilesPage.tsx:673 setProfileModel(provider, model); hermes_cli/commands.py:157 `/model` switch (session-scoped, --global persists)", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 Model field with ModelParameterModal picking provider and model per agent; classic agent apps pick the model in app config (api/controllers/console/app/model_config.py)", - "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:46 AI Agent node requires a chat model sub-node (26 provider nodes under nodes/llms/); packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:107 model per chat agent; packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:446 provider/model string per agent; en.json:7870 Model field Note: Old partial rested on a credential-test release line; the code picks a model per agent everywhere.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:856 'Base Model (From ...)' selector; backend/open_webui/models/models.py:118 base_model_id = upstream model; providers are the Ollama/OpenAI-compatible/Anthropic connections (routers/ollama.py, routers/openai.py, utils/anthropic.py)" } }, @@ -464,7 +527,7 @@ "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: web/features/agent-v2/permissions.ts:37 the per-agent Resource Access page is shown only when systemFeatures.rbac_enabled; api/configs/enterprise/__init__.py:38 RBAC_ENABLED default False (enterprise); community has workspace-wide roles only, every member sees every agent, and a published web app URL is open to anyone who has it Note: enterprise-licensed for per-agent me/group/org scoping", - "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", + "n8n": "source read at n8n@2.40.7, not driven: agents and workflows belong to a project: packages/cli/src/modules/agents/entities/agent.entity.ts:13-18 projectId; project roles in packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts:10-17 agent scopes; team projects count against packages/@n8n/constants/src/index.ts:67 quota:maxTeamProjects; chat agents are owner-only, packages/cli/src/modules/chat-hub/chat-hub-agent.repository.ts:39 where ownerId Note: Only me (personal project) or a group (team project, enterprise-licensed quota); no 'whole organisation' option.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/common/AccessControl.svelte:19 principal_type user|group|anyone; ModelEditor.svelte:600 AccessControlModal; backend/open_webui/routers/models.py:1035 POST /model/access/update; models/access_grants.py grants read/write per user or group; config.py sharing.public_models permission gates 'whole organisation' Note: old partial rested on a feature-row line; the code has private, per-user, per-group and public grants", "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:32-37 per-platform _ALLOWED_USERS / ALLOW_ALL_USERS allowlists read per profile home (authz_mixin.py:339 _authorization_home_for_source); gateway/slash_access.py:1-27 admin vs user command lists Note: Who may talk to a profile's bot is a per-platform user-id allowlist; no only-me / group / organisation visibility model and no org directory." } @@ -490,13 +553,14 @@ "hermes-agent": "partial", "copilot-studio": "partial", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31612 \"Message-metered pricing: $0.01/message or $200/mo pack; cost spikes with generative/autonomous use.\"", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:69 check_automation_limits: automations.max_count per user and automations.min_interval, admins bypass; model params max_tokens only caps one response; searched 'quota|budget|token limit|rate' in routers/models.py, models/models.py, utils/middleware.py: no per-agent run or token cap Note: limits are per user and only on scheduled runs, not per agent", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-63 agent.max_turns (turn cap) and agent.run_budget_seconds (wall-clock per run), per profile config.yaml; hermes_cli/config_defaults.py:1338 delegation.max_iterations per subagent; gateway/platforms/api_server.py:1322 api_server.max_concurrent_runs; searched 'max_cost|spend_limit|token_budget|cost_cap' in *.py: no token or run-count quota per agent Note: Caps iterations and wall clock per run, not tokens or number of runs.", - "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 PUT /agent sets max_active_requests, enforced in api/services/app_generate_service.py:153,384 (concurrent requests per app); dify-agent/src/dify_agent/runtime/runner.py:94,403 a fixed 500-step and run-timeout limit per run. No per-agent run count or token budget Note: only a concurrency cap and a server-wide step limit, no token or run quota" + "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 PUT /agent sets max_active_requests, enforced in api/services/app_generate_service.py:153,384 (concurrent requests per app); dify-agent/src/dify_agent/runtime/runner.py:94,403 a fixed 500-step and run-timeout limit per run. No per-agent run count or token budget Note: only a concurrency cap and a server-wide step limit, no token or run quota", + "n8n": "source read at n8n@2.40.7, not driven: per-run caps only: packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:518 maxIterations 1-200 per run, packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ConversationalAgent/execute.ts:58 maxIterations default 10, packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:401 maxTokens per call; searched 'budget|quota' in packages/cli/src/modules/agents: no per-agent run or token budget Note: Caps one run, not an agent's total runs or tokens." } }, { @@ -520,12 +584,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/pause.py:1-27 `hermes pause` / `hermes resume` write/remove the ESTOP sentinel; agent/estop.py:31-39 sentinel lives in the profile's $HERMES_HOME, so `hermes -p pause` holds that profile's cron, kanban and new gateway turns without deleting it; web/src/pages/ProfilesPage.tsx:1184 per-profile gateway running/stopped Note: CLI only; the dashboard shows gateway state but has no pause toggle (searched 'estop' in web/src and hermes_cli/web_routers: none).", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/access/components/web-app-access-card.tsx:254 and service-api-access-card.tsx:114 per-surface In service/Out of service toggles; api/controllers/console/agent/roster.py:1013 POST /agent//api-enable. No single off switch: workflows that bind the agent as a node keep running it (models/agent.py:407 WorkflowAgentNodeBinding) Note: off per access point, not per agent", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:122 is_active soft-disable; routers/models.py:881 POST /model/toggle; src/lib/components/workspace/Models.svelte:899 Enabled/Disabled switch per model, :353 Enable All / Disable All" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:122 is_active soft-disable; routers/models.py:881 POST /model/toggle; src/lib/components/workspace/Models.svelte:899 Enabled/Disabled switch per model, :353 Enable All / Disable All", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/workflows/workflows.controller.ts:475 POST /:workflowId/deactivate turns off an agent workflow's triggers without deleting it, en.json:4567 'Deactivate workflow'; packages/cli/src/modules/agents/agent-publish.controller.ts:45 unpublish, en.json:7775 unpublish stops production executions until republished" } }, { @@ -549,12 +614,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profiles.py:538-575 ProfileInfo fields (name, model, provider, description, display_name, role) carry no owner; searched 'owner' in hermes_cli/profiles.py and profile_identity.py: only file-permission and routing-index ownership Note: Single-operator install; no human owner per profile.", "dify": "source read at 1.17.1, not driven: api/services/app_service.py:672 created_by is set to the creating account and api/services/app_service.py:282 filters on it ('Created by me'); no owner field that can be assigned, models/agent.py:212 only created_by/updated_by/archived_by Note: creator is recorded, not an accountable owner that can be named", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:117 user_id owner; src/lib/components/workspace/Models.svelte:802-808 owner name and email shown per model, 'Deleted User' when the owner is gone; routers/models.py:948 only owner, write grantee or admin may update Note: owner is always the creator; there is no field to name a different accountable person" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:117 user_id owner; src/lib/components/workspace/Models.svelte:802-808 owner name and email shown per model, 'Deleted User' when the owner is gone; routers/models.py:948 only owner, write grantee or admin may update Note: owner is always the creator; there is no field to name a different accountable person", + "n8n": "source read at n8n@2.40.7, not driven: ownership sits with a project, not a person: packages/cli/src/services/user.service.ts:616 shared workflow role 'workflow:owner' held by a project; packages/cli/src/modules/agents/entities/agent.entity.ts:13-18 agent belongs to projectId; only chat agents carry a person, packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:74 ownerId Note: A personal project maps to one person; a team project has no named accountable human per agent." } }, { @@ -577,12 +643,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'owner|transfer|hand over|reassign' in hermes_cli/profiles.py and profile_cmd.py: none; hermes_cli/subcommands/profile.py:86 `profile rename` and :115 export/import move a profile, not an owner Note: No owner concept to hand over.", "dify": "source read at 1.17.1, not driven: searched 'transfer|owner|created_by =' in api/controllers/console and api/services/app_service.py: only workspace ownership transfer exists (api/controllers/console/workspace/members.py:418 send-owner-transfer-confirm-email); no endpoint or UI reassigns an agent or app to another member", - "open-webui": "source read at v0.11.4, not driven: searched 'transfer|reassign|owner' in backend/open_webui/routers and models: no ownership transfer; models/users.py:847 delete_user_by_id leaves models orphaned (Models.svelte:808 'Deleted User'); workaround: routers/models.py:1035 write grant to another user or group so they can keep maintaining it" + "open-webui": "source read at v0.11.4, not driven: searched 'transfer|reassign|owner' in backend/open_webui/routers and models: no ownership transfer; models/users.py:847 delete_user_by_id leaves models orphaned (Models.svelte:808 'Deleted User'); workaround: routers/models.py:1035 write grant to another user or group so they can keep maintaining it", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/services/user.service.ts:593-610 deleting a user can transfer their personal project's resources to another user or project (en.json:3856 'Transfer their workflows, credentials and data tables'); workflow move at packages/cli/src/workflows/workflows.controller.ts:646 PUT /:workflowId/transfer; but packages/cli/src/services/ownership-transfer/ownership-transfer.manifest.json:59-60 says agents are dropped via FK cascade on transfer Note: Workflow-based agents move to a new owner; Agents-module agents are lost when their owner is deleted (the code's own manifest says so)." } }, { @@ -605,13 +672,14 @@ "hermes-agent": "partial", "copilot-studio": "yes", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:846 build-draft/checkout and :941 build-draft/apply; web/i18n/en-US/agent-v-2.json 'Build your agent by chatting ... it fills in the form on the left'; web/features/agent-v2/agent-detail/configure/page.tsx:49 Build mode is on in Community Edition (only Preview is cloud/enterprise)", "hermes-agent": "source read at v2026.9.24, not driven: skills/autonomous-ai-agents/hermes-agent/SKILL.md:26 bundled skill teaches the agent Hermes' own profiles so it can run `hermes profile create` through its terminal tool; hermes_cli/profile_describer.py:1-25 auto-generates a description from an existing profile (the reverse); searched 'create.*bot.*from.*descri' and profile-creating tool names in *.py: no dedicated plain-language agent builder Note: The agent can build a profile only by driving the CLI itself; the dashboard builder is a form wizard.", - "open-webui": "source read at v0.11.4, not driven: searched 'generate|describe|builder|magic' in src/lib/components/workspace/Models/ModelEditor.svelte and backend/open_webui/routers/models.py: model presets are built by hand; the only natural-language builder is /skills:create for skills (backend/open_webui/utils/skills.py:81), not agents" + "open-webui": "source read at v0.11.4, not driven: searched 'generate|describe|builder|magic' in src/lib/components/workspace/Models/ModelEditor.svelte and backend/open_webui/routers/models.py: model presets are built by hand; the only natural-language builder is /skills:create for skills (backend/open_webui/utils/skills.py:81), not agents", + "n8n": "source read at n8n@2.40.7, not driven: Instance AI ('n8n Agent') is a default module (packages/@n8n/backend-common/src/modules/module-registry.ts:79) enabled by default (packages/cli/src/modules/instance-ai/instance-ai-settings.service.ts:287-288) and builds workflows from chat (packages/@n8n/instance-ai/src/workflow-builder/); packages/frontend/editor-ui/src/features/agents/views/NewAgentView.vue:58-83 a new agent opens in an Instance AI thread that builds it Note: Needs a model set up in Instance AI first (useInstanceAiReady)." } }, { @@ -635,12 +703,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 under gateway.multiplex_profiles each profile is served at /p//v1/...; api_server.py:1336-1345 /v1/models advertises the profile name as the model id; gateway/profile_routing.py:1-11 routes senders/chats to profiles Note: A caller addresses an agent by profile name in the URL; no registry that ties an agent to a consuming application.", "dify": "source read at 1.17.1, not driven: api/models/agent.py:407 WorkflowAgentNodeBinding ties a roster agent to a workflow app node; api/controllers/console/agent/composer.py:54 agent-composer on a workflow node, :125 copy-from-roster; roster.py:474 published references listed on the agent's Access page ('Workflow access')", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:836 stable Model ID that other programs pass as 'model' to the OpenAI-compatible /api/chat/completions (backend/open_webui/main.py:1118 model_id lookup); no binding of an agent to a consuming app and no per-app discovery Note: an app can call an agent by its id, but nothing ties the agent to that app" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:836 stable Model ID that other programs pass as 'model' to the OpenAI-compatible /api/chat/completions (backend/open_webui/main.py:1118 model_id lookup); no binding of an agent to a consuming app and no per-app discovery Note: an app can call an agent by its id, but nothing ties the agent to that app", + "n8n": "source read at n8n@2.40.7, not driven: an agent is addressable by id, not bound to a consuming app: packages/cli/src/modules/agents/entities/agent.entity.ts:39-40 availableInMCP flag, packages/cli/src/modules/agents/agent-mcp-access.controller.ts:26 toggle; workflow agents are called by webhook path (packages/nodes-base/nodes/Webhook) or Execute Workflow; searched 'appId|consumer app|slug' in packages/cli/src/modules/agents: no app binding Note: An app can call an agent by id, URL or MCP; there is no registry tying an agent to the app it serves." } }, { @@ -664,12 +733,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SkillsPage.tsx:140 skills / toolsets / hub views scoped by profile (SkillsPage.tsx:169 getToolsets(selectedProfile)); hermes_cli/web_routers/tools.py:230 GET /api/tools/toolsets; web/src/pages/ProfileBuilderPage.tsx:753 review step lists model, skills and MCPs Note: Skills and toolsets per profile are on one page (tabbed); MCP servers sit on McpPage; data access is not modelled (tools reach the whole host). Old yes rested on a docs line; the data part of the sentence has no screen.", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/ has model-config, prompt-editor, tools, skills, knowledge and files sections on the one Configure page; web/i18n/en-US/agent-v-2.json agentDetail.configure.tools/skills/knowledgeRetrieval/files", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194 Knowledge, :1198 ToolsSelector, :1202 SkillsSelector, :1206 filters/actions, :1245 Capabilities, :1262 BuiltinTools, :1268 TerminalSelector, all on the model edit page" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194 Knowledge, :1198 ToolsSelector, :1202 SkillsSelector, :1206 filters/actions, :1245 Capabilities, :1262 BuiltinTools, :1268 TerminalSelector, all on the model edit page", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentCapabilitiesSection.vue:534-695 one Capabilities section with rows for tools, workflows, skills and sub-agents (en.json:8340 'Capabilities: What this agent can do'); knowledge files and vector stores on the Knowledge tab (en.json:7923,7956) Note: Data sources sit on the neighbouring Knowledge tab. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -694,12 +764,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:52 `hermes profile delete`; hermes_cli/profiles.py:1682 delete_profile removes the profile home (jobs live under it); web/src/pages/ProfilesPage.tsx:725 deleteProfile -> DELETE /api/profiles/{name} (hermes_cli/web_routers/profiles.py:869); web/src/i18n/en.ts profiles.confirmDeleteMessage 'deletes profile ... config, keys, memories, sessions, skills, cron jobs'", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:780 DELETE /agent/; api/services/app_service.py:1078 delete_app archives the backing agent and unbinds it; api/tasks/remove_app_and_related_data_task.py:90,632,681 deletes the app's triggers and WorkflowSchedulePlan rows so schedules stop; web/i18n/en-US/agent-v-2.json roster.deleteDialog 'web app, API access, and workflows that use it stop working'", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:1111 POST /model/delete removes the model only; automations store model_id (backend/open_webui/models/automations.py:73) and routers/models.py has no Automations call, so a schedule keeps firing and fails with 'Model not found' at main.py:1128 Note: schedules are not stopped with the agent" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:1111 POST /model/delete removes the model only; automations store model_id (backend/open_webui/models/automations.py:73) and routers/models.py has no Automations call, so a schedule keeps firing and fails with 'Model not found' at main.py:1128 Note: schedules are not stopped with the agent", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agents.service.ts:386-432 delete removes the agent, disconnects its channels and calls AgentTaskService.requestReconcile to stop its schedules; entities/agent-task.entity.ts:33 tasks cascade on agent delete; en.json:8128 'This schedule will stop running'; for workflow agents, archiving/deleting a workflow deactivates its Schedule Trigger (packages/cli/src/workflows/workflows.controller.ts:475)" } }, { @@ -723,12 +794,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/sidebar-actions.tsx:33,52 Export (app DSL YAML); web/features/agent-v2/roster/components/roster-create-menu.tsx:29 import dialog; api/services/app_dsl_service.py:561,723,789 AGENT mode handled on import and export Note: imports into another Dify instance, not a Nextcloud; imported agents start with web app and API off (app_dsl_service.py:605)", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` to .tar.gz and :122 `profile import`; hermes_cli/web_routers/profiles.py:988 POST /api/profiles/{name}/export and :1006 POST /api/profiles/import; hermes_cli/commands.py:88-90 /export and /import slash commands Note: Moves between Hermes installs; there is no Nextcloud target.", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:381 GET /models/export, :441 POST /models/import (ownership check :515); src/lib/components/workspace/Models.svelte:109 Import JSON, :115 Export JSON; permissions workspace.models_import/models_export in config.py DEFAULT_USER_PERMISSIONS Note: JSON file moves an agent to another Open WebUI instance" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:381 GET /models/export, :441 POST /models/import (ownership check :515); src/lib/components/workspace/Models.svelte:109 Import JSON, :115 Export JSON; permissions workspace.models_import/models_export in config.py DEFAULT_USER_PERMISSIONS Note: JSON file moves an agent to another Open WebUI instance", + "n8n": "source read at n8n@2.40.7, not driven: en.json:7613-7619 agent builder 'Export JSON' and 'Import agent JSON' modal (packages/frontend/editor-ui/src/features/agents/components/AgentJsonImportModal.vue); workflows export/import as JSON in the editor (en.json:1933 'From file') and by CLI packages/cli/src/commands/export/workflow.ts and packages/cli/src/commands/import/workflow.ts Note: Moves to another n8n instance (no Nextcloud target). Workflow JSON is complete; the Agents-module export (packages/frontend/editor-ui/src/features/agents/views/AgentBuilderView.vue:1466-1475) writes the config, where skills are only {type, id} references (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:189-198)." } }, { @@ -751,13 +823,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "partial", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31372 \"AI Chat with tools (agentic mode): Chat-with-AI can call virtual integrations (tools) to perform actions; backed by the Context Agent ExApp. Chains multiple tools to complete a task.\"", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ChatPage.tsx:1-16 dashboard Chat page embeds the full `hermes --tui` over WebSocket /api/pty (hermes_cli/web_routers/chat_ws.py:432); hermes_cli/main.py CLI/TUI chat; gateway adapters under plugins/platforms/ carry the same conversation", "dify": "source read at 1.17.1, not driven: web/app/(shareLayout)/agent/[token]/page.tsx full-page ChatWithHistoryWrap for an agent; web/app/(shareLayout)/chat/[token] for chat apps; web/app/(commonLayout)/installed/[appId] in-console Explore chat; api/controllers/web/completion.py chat-messages", - "n8n": "docs-only: competitor_features#3912 \"core: Allow expressions in tool default values on chat hub tools: From n8n@2.14.0 (2026-03-24)\"", + "n8n": "source read at n8n@2.40.7, not driven: Chat hub is a default module (packages/@n8n/backend-common/src/modules/module-registry.ts:60); packages/frontend/editor-ui/src/features/ai/chatHub/module.descriptor.ts:108-113 route /home/chat with a full-page 'chat' layout for models, personal agents and workflow agents; packages/cli/src/modules/chat-hub/chat-hub.controller.ts:168 POST /chat/conversations/send Note: Old partial rested on a release line about chat hub tools; the chat hub is a default full-page chat.", "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/c/[id]/+page.svelte and src/lib/components/chat/Chat.svelte full-page chat with a selected model (ModelSelector.svelte); backend/open_webui/main.py:1118 chat completion entry" } }, @@ -781,12 +853,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/middleware.py:6304 StreamingResponse handling of streamed deltas pushed over socket.io to src/lib/components/chat/Chat.svelte; per-model stream_response param src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte:20", "hermes-agent": "source read at v2026.9.24, not driven: gateway/stream_consumer.py:1-5 on_delta() queues model deltas and progressively edits one platform message; hermes_cli/cli_stream_mixin.py streams tokens in the CLI; hermes_cli/web_routers/chat_ws.py:432 PTY stream to the dashboard chat", - "dify": "source read at 1.17.1, not driven: api/controllers/web/completion.py:45-63 response_mode streaming (agent apps are streaming-only, :50); service API the same (api/controllers/service_api/app/completion.py); web chat renders SSE chunks (web/app/components/base/chat/chat-with-history/chat-wrapper.tsx)" + "dify": "source read at 1.17.1, not driven: api/controllers/web/completion.py:45-63 response_mode streaming (agent apps are streaming-only, :50); service API the same (api/controllers/service_api/app/completion.py); web chat renders SSE chunks (web/app/components/base/chat/chat-with-history/chat-wrapper.tsx)", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-stream.service.ts:160-191 sendChunk pushes content chunks to the user with reconnection replay; packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:129-131 'streaming' response mode, AI Agent node enableStreaming (nodes/agents/Agent/V3/AgentV3.node.ts:141-145); Agents module SSE in packages/cli/src/modules/agents/agent-sse-stream.ts" } }, { @@ -809,12 +882,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:150-152 /resume and /sessions; hermes_cli/subcommands/sessions.py:22 `hermes sessions list` and :285 browse; hermes_cli/web_routers/sessions.py:167 GET /api/sessions; web/src/pages/SessionsPage.tsx:534-540 Resume in Chat", "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:48 GET /conversations, :129 rename, :179 pin/unpin; web/app/components/base/chat/chat-with-history/sidebar lists past conversations to reopen", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:249 GET /chats/list, :774 POST /chats/new, :1325 GET /chats/{id}; sidebar chat list src/lib/components/layout/Sidebar.svelte reopens earlier chats at /c/[id]" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:249 GET /chats/list, :774 POST /chats/new, :1325 GET /chats/{id}; sidebar chat list src/lib/components/layout/Sidebar.svelte reopens earlier chats at /c/[id]", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:95 GET /chat/conversations and :110 GET one conversation; en.json:694-697 sidebar 'New chat' and 'Load more' sessions (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatSidebar.vue); agent memory keyed by session in memory nodes (nodes/memory/MemoryBufferWindow)" } }, { @@ -837,12 +911,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:696 DELETE /api/sessions/{id} and :414 bulk-delete (web/src/i18n/en.ts sessions.confirmDeleteMessage 'permanently removes ... cannot be undone'); hermes_cli/subcommands/sessions.py:123 `sessions archive` soft-hides, sessions.py:750 PATCH archived flag; searched 'trash|undelete|recycle|soft.?delete' in hermes_state_sessions.py and hermes_cli/sessions*.py: no bin Note: Delete is permanent and archive is a soft hide; there is no bin to restore a deleted conversation from.", "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:116 DELETE /conversations/; api/services/conversation_service.py:232 soft-delete flag then api/tasks/delete_conversation_task.py:105 purges related data. Searched 'restore|trash|bin|undelete' in api/services/conversation_service.py and api/controllers/web: no restore from a bin Note: delete only, no bin or restore", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1568 DELETE /chats/{id} permanent, :1909 POST /{id}/archive toggles archive, :1061 GET /archived; src/lib/components/chat/Settings/ArchivedChats.svelte restores; searched 'trash|recycle|restore|bin' in en-US translation.json: no bin Note: archive is the only undo; a deleted chat cannot be restored" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1568 DELETE /chats/{id} permanent, :1909 POST /{id}/archive toggles archive, :1061 GET /archived; src/lib/components/chat/Settings/ArchivedChats.svelte restores; searched 'trash|recycle|restore|bin' in en-US translation.json: no bin Note: archive is the only undo; a deleted chat cannot be restored", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:388-397 DELETE /chat/conversations/:sessionId returns 204; en.json:686-690 'Are you sure you want to delete this conversation?'; searched 'archiv|restore|deletedAt|trash' in packages/cli/src/modules/chat-hub: no conversation bin or restore (hits are archived helper workflows and memory restore) Note: Delete is permanent; no bin and no restore." } }, { @@ -866,12 +941,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 display.tool_progress 'all' with tool_progress_grouping (one bubble or one message per tool) in chat platforms; hermes_cli/commands.py:176 /verbose cycles tool progress off/new/all/verbose in the CLI; web/src/i18n/en.ts sessions.roles.tool shows tool messages in session history", "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/agent-content.tsx:15-38 renders each agent_thought with its tool call; answer/tool-detail.tsx tool input/output; agent v2 'Ran commands' activity in web/features/agent-v2/agent-detail/configure/components/preview/chat-conversation.tsx and answer/agent-roster-response-content.tsx", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116 renders each tool call with src/lib/components/common/ToolCallDisplay.svelte:233-246 ('Executing {{NAME}}', 'View Result from {{NAME}}', 'Denied {{NAME}}'), expandable arguments and result" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116 renders each tool call with src/lib/components/common/ToolCallDisplay.svelte:233-246 ('Executing {{NAME}}', 'View Result from {{NAME}}', 'Denied {{NAME}}'), expandable arguments and result", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentChatToolSteps.vue:33-51 renders each tool call in the agent chat (en.json:7671-7675 tool names); in workflows the chat Logs panel lists the AI Agent's tool sub-node runs with inputs, outputs and tokens (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue, ChatMessagesPanel.vue, LogsViewConsumedTokenCountText.vue)" } }, { @@ -896,12 +972,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/base.py:1183-1231 SUPPORTED_DOCUMENT_TYPES (.pdf, .docx, .md, .csv ...) accepted as chat file attachments from messaging platforms; hermes_cli/web_routers/files.py:501 POST /api/files/upload and :330 /api/chat/image-upload; hermes_cli/commands.py:297 /image; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: Attaching a file and asking about it works; there is no Nextcloud Files source.", "dify": "source read at 1.17.1, not driven: api/controllers/web/files.py:23 POST /files/upload and api/controllers/web/remote_files.py:102 upload by URL, enabled per app by web/app/components/base/features/new-feature-panel/file-upload; files go into the chat message. No picker for a document store such as Nextcloud Files: upload from the local device or a URL only Note: attach by upload or URL, not from Nextcloud", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:209 Upload Files, :322 Attach Notes, :353 Attach Knowledge, :399 Google Drive, :692 OneDrive/SharePoint; backend/open_webui/routers/files.py upload then RAG; searched 'nextcloud|webdav' in backend/open_webui and src/lib: no Nextcloud Files source Note: attaching files works, but not from Nextcloud" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:209 Upload Files, :322 Attach Notes, :353 Attach Knowledge, :399 Google Drive, :692 OneDrive/SharePoint; backend/open_webui/routers/files.py upload then RAG; searched 'nextcloud|webdav' in backend/open_webui and src/lib: no Nextcloud Files source Note: attaching files works, but not from Nextcloud", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:120 message attachments; en.json:594 'Attach' and 565 'Drop files here to attach' upload from the local device; searched 'nextcloud|webdav' in packages/frontend/editor-ui/src/features/ai/chatHub: no picker for files held in Nextcloud (a Nextcloud node exists only as a workflow step) Note: Uploads a local file; cannot pick a file from Nextcloud in chat." } }, { @@ -924,12 +1001,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:1255 'Good Response', :1293 'Bad Response' buttons; backend/open_webui/routers/evaluations.py:425 POST /evaluations/feedback stores the rating", "hermes-agent": "source read at v2026.9.24, not driven: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-15 only detects affection ('good bot', hearts) to animate the pet, it records no rating", - "dify": "source read at 1.17.1, not driven: api/controllers/web/message.py:107 POST /messages//feedbacks; web/app/components/base/chat/chat/answer/operation.tsx:123-144 like/dislike buttons on each answer" + "dify": "source read at 1.17.1, not driven: api/controllers/web/message.py:107 POST /messages//feedbacks; web/app/components/base/chat/chat/answer/operation.tsx:123-144 like/dislike buttons on each answer", + "n8n": "source read at n8n@2.40.7, not driven: rating exists only in two narrower places: n8n's own builder assistant (packages/frontend/editor-ui/src/features/ai/instanceAi/useResponseFeedback.ts, instanceAi.api.ts:73-86 POST /instance-ai/feedback) and eval review rows (en.json:8317-8318 thumbs up/down); searched 'thumb|feedback|rating' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents chat components: no rating on a user agent's live answer Note: No thumbs on answers from agents people build." } }, { @@ -952,12 +1030,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: apps/desktop/electron/quick-entry.ts:1-19 Quick Entry, a global-hotkey (Cmd/Ctrl+Shift+Space) mini composer over any desktop app; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: Reachable from anywhere on the desktop via the Electron app, not from inside Nextcloud pages.", "dify": "source read at 1.17.1, not driven: web/public/embed.js (461 lines) injects a floating chat bubble into any web page that includes the script; web/i18n/en-US/app-overview.json:47 points to a separate 'Dify Chatbot Chrome Extension' (not in this repo); nothing embeds the assistant across the Dify console itself or inside Nextcloud Note: a site owner can place the bubble on their pages; no Nextcloud integration", - "open-webui": "source read at v0.11.4, not driven: searched 'companion|floating|spotlight|nextcloud' in src/lib/components and src/routes: the chat is its own web app; the Spotlight-style chat bar is a separate desktop app repo (README.md:100 open-webui/desktop), not core, and nothing embeds into Nextcloud pages" + "open-webui": "source read at v0.11.4, not driven: searched 'companion|floating|spotlight|nextcloud' in src/lib/components and src/routes: the chat is its own web app; the Spotlight-style chat bar is a separate desktop app repo (README.md:100 open-webui/desktop), not core, and nothing embeds into Nextcloud pages", + "n8n": "source read at n8n@2.40.7, not driven: an assistant side panel follows the user across the n8n editor (packages/frontend/editor-ui/src/features/ai/assistant/chatPanel.store.ts, components/AssistantsHub.vue) and the canvas chat panel (features/ai/chatHub/components/CanvasChatHubPanel.vue); searched 'nextcloud' in packages/frontend: no integration into Nextcloud pages Note: Available on every n8n page, not inside Nextcloud or other apps." } }, { @@ -980,12 +1059,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:264 /browser connects the agent to the user's live Chromium browser via CDP so it can read the page being viewed (tools/browser_cdp_tool.py); tools/computer_use_tool.py screen access; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: The agent can read whatever page is open, but no app hands it the current record as context.", "dify": "source read at 1.17.1, not driven: web/public/embed.js:93-96 the host page passes config.inputs (e.g. a record id) into the embedded chat as app input variables; the agent only sees what the host page chooses to pass, no connector reads the record or its links from another app Note: a host page can hand context in, nothing looks the record up", - "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|record|object context' in backend/open_webui/utils/middleware.py and src/lib/components/chat: no integration that passes the record open in another app; closest is the iframe postMessage 'input:prompt' handler at src/lib/components/chat/Chat.svelte:1470 which only pre-fills text" + "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|record|object context' in backend/open_webui/utils/middleware.py and src/lib/components/chat: no integration that passes the record open in another app; closest is the iframe postMessage 'input:prompt' handler at src/lib/components/chat/Chat.svelte:1470 which only pre-fills text", + "n8n": "source read at n8n@2.40.7, not driven: no host-app record context for user agents (searched 'record context|objectId|current page' in packages/cli/src/modules/agents and chat-hub: none); only n8n's own assistant can read the user's open browser tab through the AI Browser Bridge extension (packages/@n8n/mcp-browser/README.md:3-6, packages/@n8n/computer-use/README.md Browser tools) Note: Only n8n's builder assistant, through a local browser bridge; agents people build cannot see the record on screen." } }, { @@ -1009,12 +1089,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/skill_commands.py:1 every installed skill is a /skill-name slash command in CLI and gateway; hermes_cli/commands.py:226 /bundles; plugin-catalog/prompt-snippets.yaml:1-5 community desktop prompt-snippet library (catalog plugin, not core); searched 'record type' concepts: none Note: Ready-made prompts exist as skills and snippets, but none is scoped to a record type or set centrally for an organisation.", "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx:48,87 builder sets an opening statement and fixed suggested questions per app; web/app/components/base/chat/chat/answer/suggested-questions.tsx. No prompt library keyed to a record type Note: per-app starter questions only", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/prompts.py:71 prompt list with access grants (:441), :384 versioning; src/lib/components/chat/MessageInput/Commands/Prompts.svelte '/' picker; per-model suggestion prompts ModelEditor.svelte:1183; no binding of prompts to a record type Note: org prompt library exists; not scoped to record types" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/prompts.py:71 prompt list with access grants (:441), :384 versioning; src/lib/components/chat/MessageInput/Commands/Prompts.svelte '/' picker; per-model suggestion prompts ModelEditor.svelte:1183; no binding of prompts to a record type Note: org prompt library exists; not scoped to record types", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:62-63 suggestedPrompts per chat agent, en.json:527 'Suggestions' in the agent editor (packages/frontend/editor-ui/src/features/ai/chatHub/components/SuggestedPromptsEditor.vue, ChatSuggestedPrompts.vue); searched 'record type|prompt library' in packages/cli/src/modules/chat-hub: no organisation prompt library bound to a record type Note: Ready-made prompts are per agent and set by its owner, not per record type." } }, { @@ -1039,13 +1120,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31386 \"Voice input: Hands-free natural-language invocation of agent commands.\"", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/VoiceRecording.svelte dictation and CallOverlay.svelte voice mode; backend/open_webui/routers/audio.py:1251 POST /audio/transcriptions (local Whisper, OpenAI, Deepgram, Azure, per README.md:54)", "hermes-agent": "source read at v2026.9.24, not driven: tools/voice_mode.py:1-5 push-to-talk capture with STT via tools/transcription_tools.py; hermes_cli/commands.py:202-205 /voice and /wake ('Hey Hermes' wake word); gateway/run_voice.py transcribes inbound voice messages on messaging platforms", - "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:62 POST /audio-to-text; web/app/components/base/features/new-feature-panel/speech-to-text.tsx per-app switch; needs a speech2text model from a provider plugin" + "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:62 POST /audio-to-text; web/app/components/base/features/new-feature-panel/speech-to-text.tsx per-app switch; needs a speech2text model from a provider plugin", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatPrompt.vue:4,53 useSpeechRecognition turns speech into the prompt; en.json:599 'Voice input' and 571-573 microphone prompts; audio transcription also shipped as a node, packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/transcribe.operation.ts Note: Browser speech recognition, so it depends on the browser supporting it." } }, { @@ -1070,12 +1152,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/tts_tool.py:1-6 text-to-speech tool with Edge, ElevenLabs, OpenAI, local Piper/NeuTTS and more, Opus voice bubbles on messaging platforms; gateway/streaming_tts_consumer.py speaks streamed replies; hermes_cli/commands.py:202 /voice", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:1122 'Read Aloud'; backend/open_webui/routers/audio.py:601 POST /audio/speech; per-model TTS voice ModelEditor.svelte:1280", - "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:119 POST /text-to-audio; web/app/components/base/features/new-feature-panel/text-to-speech (voice, autoplay) per app; needs a TTS model from a provider plugin" + "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:119 POST /text-to-audio; web/app/components/base/features/new-feature-panel/text-to-speech (voice, autoplay) per app; needs a TTS model from a provider plugin", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatMessageActions.vue:17-19,64,72 'Read aloud' action on AI messages via browser speech synthesis (en.json:650); speech generation node packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/generate.operation.ts" } }, { @@ -1099,13 +1182,14 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31889 \"Smart Picker in-app invocation: Invoke AI from any Nextcloud text field\"", "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; searched 'insert into|smart picker|text field' in apps/desktop/electron and web/src: the desktop Quick Entry (apps/desktop/electron/quick-entry.ts:2) opens a composer, it does not insert results into other apps' text fields", "dify": "source read at 1.17.1, not driven: searched 'smart picker|reference provider|text field|browser extension' in web/ and api/: Dify is a standalone app, AI help inside text fields exists only for its own prompt editors (api/controllers/console/app/generator.py:327 instruction-generate); nothing inserts AI output into other applications' text fields", - "open-webui": "source read at v0.11.4, not driven: searched 'smart picker|reference provider|nextcloud' in backend/open_webui and src/lib: Open WebUI is standalone and offers no picker inside other apps' text fields; in-app only via note AI menu (src/lib/components/notes/AIMenu.svelte:42)" + "open-webui": "source read at v0.11.4, not driven: searched 'smart picker|reference provider|nextcloud' in backend/open_webui and src/lib: Open WebUI is standalone and offers no picker inside other apps' text fields; in-app only via note AI menu (src/lib/components/notes/AIMenu.svelte:42)", + "n8n": "source read at n8n@2.40.7, not driven: the same kind of thing exists only on n8n's own surface: 'Ask AI' writes code into the Code node's field (packages/@n8n/constants/src/index.ts:39 feat:askAi, licence-gated) and the builder assistant fills node parameters; searched 'smart picker|nextcloud' in packages/frontend and packages/cli/src: no way to call it from a Nextcloud text field Note: Missing Nextcloud part: any text field in Nextcloud. Rewritten under the lane ruling of 2026-09-26 (was no)." } }, { @@ -1128,13 +1212,14 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31383 \"Text tasks (summarize/headline/reformulate/formalize/context-write): core:text2text task-type family via Task Processing providers.\"", "hermes-agent": "source read at v2026.9.24, not driven: searched '\"summarize\"|\"translate\"|\"rephrase\"|\"reformulate\"' as command or action names in *.py and *.ts outside tests: no one-click text action; summarising or translating happens only by asking in chat Note: The chat can do it when asked; no one-click action on a selected text.", "dify": "source read at 1.17.1, not driven: a builder can make a Completion (text generator) app that summarises or translates (web/app/(shareLayout)/completion/[token]); no built-in one-click summarise/reformulate/translate action on arbitrary text Note: possible by building an app, not a ready one-click action", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/notes/AIMenu.svelte:42 one-click 'Enhance' on a note; NoteEditor.svelte:154-157 suggested 'Summarize this note.', 'Rewrite the selected text.'; src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:26 Ask, :33 Explain on selected text; searched 'translate' in those components: no one-click translate Note: only inside notes and chat selections, no one-click translate" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/notes/AIMenu.svelte:42 one-click 'Enhance' on a note; NoteEditor.svelte:154-157 suggested 'Summarize this note.', 'Rewrite the selected text.'; src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:26 Ask, :33 Explain on selected text; searched 'translate' in those components: no one-click translate Note: only inside notes and chat selections, no one-click translate", + "n8n": "source read at n8n@2.40.7, not driven: text tasks ship as workflow nodes, not one-click actions: packages/@n8n/nodes-langchain/nodes/chains/ChainSummarization (summarise), nodes/vendors/OpenAi/v2/actions/audio/translate.operation.ts, nodes-base DeepL node (packages/nodes-base/nodes/DeepL); searched 'summarize|translate|rephrase' in packages/frontend/editor-ui/src/features/ai/chatHub: no one-click text actions Note: Needs a workflow built around a node or a typed chat request." } }, { @@ -1157,13 +1242,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31381 \"Document & image generation: Generate spreadsheets, slides, PDFs and images from chat instructions.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/image_generation_tool.py:1-5 image generation tool (FAL models chosen in `hermes tools`); agent/image_gen_registry.py pluggable providers with plugins/image_gen/; the model calls it from any chat surface", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/images.py:562 POST /images/generations, :858 /images/edit (OpenAI, Gemini, ComfyUI, Automatic1111); built-in tool backend/open_webui/tools/builtin.py:370 generate_image; src/routes/(app)/playground/images/+page.svelte", - "dify": "source read at 1.17.1, not driven: core builtin tools are only audio, code, time, webscraper (api/core/tools/builtin_tool/providers/); searched 'text2img|image_generation|generate image' in api/core and web/i18n/en-US: none in core. Image generation comes only from marketplace tool plugins Note: marketplace plugin only" + "dify": "source read at 1.17.1, not driven: core builtin tools are only audio, code, time, webscraper (api/core/tools/builtin_tool/providers/); searched 'text2img|image_generation|generate image' in api/core and web/i18n/en-US: none in core. Image generation comes only from marketplace tool plugins Note: marketplace plugin only", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/image/generate.operation.ts image generation operation; Google Gemini vendor node image actions (nodes/vendors/GoogleGemini); both usable in a workflow or as an agent tool" } }, { @@ -1187,12 +1273,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "no", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:268 GET /api/sessions/search behind web/src/i18n/en.ts sessions.searchPlaceholder 'Search message content'; tools/session_search_tool.py:1-9 FTS5 recall over the session DB for the agent; hermes_state_fts.py full-text index", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/conversation.py:55,119-126 builders search one app's logs by keyword over queries and answers; the end-user chat sidebar (web/app/components/base/chat/chat-with-history/sidebar) has no search and api/controllers/web/conversation.py:48 lists without a keyword Note: admin log search per app, no search for the person across their own conversations", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:865 GET /chats/search over title and message content with snippet (:178 chat_search_snippet); src/lib/components/layout/SearchModal.svelte 'Search Chats'; agent-side tool tools/builtin.py:1512 search_chats" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:865 GET /chats/search over title and message content with snippet (:178 chat_search_snippet); src/lib/components/layout/SearchModal.svelte 'Search Chats'; agent-side tool tools/builtin.py:1512 search_chats", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:95-107 GET /chat/conversations takes only limit, cursor, type (packages/@n8n/api-types/src/chat-hub.ts:491-495), no query; searched 'search' among chatHub i18n keys (en.json:539-677): only agent, tool and model search; agent sessions list has status/origin filters only (packages/frontend/editor-ui/src/features/agents/components/AgentSessionsFilter.vue:25-34)" } }, { @@ -1215,12 +1302,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:910 Citations component with source list and CitationModal (Messages/Citations/CitationModal.svelte) linking to the document or URL; model capability 'citations' (translation key settings.admin.models.capabilities.citations)", "hermes-agent": "source read at v2026.9.24, not driven: agent/anthropic_message_convert.py:52-56 carries provider citation blocks through the transcript; tools/web_tools.py web_search/web_extract return result URLs that the model quotes in its text; searched 'citation' in *.py: no source panel or structured citation rendering in gateway, CLI or dashboard Note: Sources appear only as links the model writes into the answer.", - "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/citation.tsx:44 per-app Citations switch; web/app/components/base/chat/chat/citation/popup.tsx:31,109 shows each source document and segment with a link to /datasets//documents/ (link shown to console users)" + "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/citation.tsx:44 per-app Citations switch; web/app/components/base/chat/chat/citation/popup.tsx:31,109 shows each source document and segment with a link to /datasets//documents/ (link shown to console users)", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-knowledge-retrieval.ts:199,276 knowledge search returns file and line citations to the model (tools/knowledge/search-knowledge.tool.ts:215) and the chat shows 'Read file'/'Search text' tool steps (en.json:7672-7674); searched 'citation|sources' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents: no linked source list under an answer Note: The model gets citations, the answer UI shows no source links. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -1244,12 +1332,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1945 POST /chats/{id}/share, :1208 GET /chats/share/{share_id}, :2029 access grants on the shared chat; src/lib/components/chat/ShareChatModal.svelte:30 shareChatById and 'Copy Share Link'; src/routes/s/[id]/+page.svelte viewer", "hermes-agent": "source read at v2026.9.24, not driven: searched 'share.*(link|url)|public.*session|shared_session' in hermes_cli/web_routers/sessions.py and gateway/platforms/api_server.py: none; hermes_cli/web_routers/sessions.py:787 GET /api/sessions/{id}/export and hermes_cli/commands.py:66 /save export to a file; hermes_cli/shared_session_attach.py:1-4 attaches local runtimes, not colleagues Note: Export to a file exists; no share link.", - "dify": "source read at 1.17.1, not driven: searched 'share conversation|shareConversation|conversation.*share' in web/i18n/en-US and api/controllers/web/conversation.py (list, delete, rename, pin only): the web app URL and QR code share the app (web/i18n/en-US/agent-v-2.json access.webApp.qrCode), no link to one conversation" + "dify": "source read at 1.17.1, not driven: searched 'share conversation|shareConversation|conversation.*share' in web/i18n/en-US and api/controllers/web/conversation.py (list, delete, rename, pin only): the web app URL and QR code share the app (web/i18n/en-US/agent-v-2.json access.webApp.qrCode), no link to one conversation", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentPreviewMoreMenu.vue:159-172 'Copy link' copies the session route (en.json:8223), which opens only for users with agent:read in the project; chat hub conversations are private to their user (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:110 getConversation by req.user.id); searched 'share' in chat-hub.controller.ts: no share endpoint Note: A link works for project colleagues on agent sessions; no public or chat-hub share link. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -1278,7 +1367,7 @@ "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:794-799 5-6 field cron expressions via croniter; hermes_cli/subcommands/cron.py:23 `hermes cron create`; web/src/i18n/en.ts cron.schedule 'Schedule (cron expression)' on web/src/pages/CronPage.tsx -> POST /api/cron/jobs (hermes_cli/web_routers/cron.py:248)", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:10-19 Schedule Trigger start node with mode cron and cron_expression; api/schedule/workflow_schedule_task.py:18 poller (ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK default true, api/configs/feature/__init__.py:1461); an agent runs on it as an Agent node in that workflow Note: the schedule belongs to a workflow app that holds the agent node, not to the agent itself", - "n8n": "docs-only: competitor_features#31094 \"Cron & interval scheduling: Schedule Trigger node runs workflows on cron expressions.\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:105-106 'Custom (Cron)' rule, cronExpression field; agent schedules also take a cron, en.json:8143 'Custom (cron)' in the agent task editor and packages/cli/src/modules/agents/scheduling/agent-task-job-registrar.ts", "open-webui": "source read at v0.11.4, not driven: schedules are iCalendar RRULE, not cron: backend/open_webui/models/automations.py:76 rrule; utils/recurrence.py:37 _parse_rule (dateutil rrulestr); src/lib/components/automations/ScheduleDropdown.svelte:33 'Custom' free-text field with placeholder RRULE:FREQ=DAILY;BYHOUR=9 (:223); searched 'cron' in backend/open_webui/utils and routers/automations.py: none Note: same power as cron via RRULE, but no cron syntax" } }, @@ -1307,7 +1396,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:17,34-55 visual mode with hourly/daily/weekly/monthly frequency, on_minute, time, weekdays; api/services/trigger/schedule_service.py:257 visual_to_cron; web/i18n/en-US/workflow.json nodes.triggerSchedule.useVisualPicker Note: hourly is the finest visual step; 'every 15 minutes' needs cron", - "n8n": "docs-only: competitor_features#31094 \"Cron & interval scheduling: Schedule Trigger node runs workflows on cron expressions.\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:81-101 interval rules Seconds, Minutes, Hours, Days, Weeks, Months without cron; agent task editor en.json:8139-8142 Hourly, Daily, Weekly, Monthly", "open-webui": "source read at v0.11.4, not driven: src/lib/components/automations/ScheduleDropdown.svelte:27-33 Hourly/Daily/Weekly/Monthly presets building FREQ+INTERVAL (:92); backend/open_webui/utils/recurrence.py:62 MINUTELY/HOURLY steps aligned to the clock; builtin tool docstring tools/builtin.py:3726 'Every 30 minutes'", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:791-792 'every 30m' / '30m' become recurring interval schedules; web/src/i18n/en.ts cron.scheduleModes.interval 'Every interval' with minutes/hours/days units on CronPage" } @@ -1332,13 +1421,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:801-812 ISO timestamp parses to a one-shot job in the configured timezone; web/src/i18n/en.ts cron.scheduleModes.once 'Once' / onceAt 'Run at'", "dify": "source read at 1.17.1, not driven: searched 'once|run_at|one-time|date' in api/core/workflow/nodes/trigger_schedule/entities.py and api/services/trigger/schedule_service.py: only recurring frequencies and a 5-field cron (api/libs/schedule_utils.py:33-39), which repeats yearly; no fire-once date", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/automations/ScheduleDropdown.svelte:28 'Once' builds DTSTART + RRULE:FREQ=DAILY;COUNT=1 (:69, detection :110); backend/open_webui/utils/recurrence.py:106 validate_rrule requires DTSTART with COUNT" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/automations/ScheduleDropdown.svelte:28 'Once' builds DTSTART + RRULE:FREQ=DAILY;COUNT=1 (:69, detection :110); backend/open_webui/utils/recurrence.py:106 validate_rrule requires DTSTART with COUNT", + "n8n": "source read at n8n@2.40.7, not driven: no one-shot trigger: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:81-106 only recurring rules; inside a running workflow the Wait node can hold until a date (packages/nodes-base/nodes/Wait/Wait.node.ts:329 resume 'specificTime'); agent schedules are recurring only (packages/cli/src/modules/agents/builder/skills/target-tasks.skill.ts:10 'Not for one-off requests') Note: A one-off run needs a workflow that starts then waits until the date." } }, { @@ -1361,13 +1451,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:780-790 natural phrases ('every monday 9am', 'weekdays at 9am') convert to cron via _natural_every_to_cron; tools/cronjob_tools.py:1 cronjob_manage tool lets the agent create jobs from a chat request; hermes_cli/commands.py:236 /cron", "dify": "source read at 1.17.1, not driven: searched 'natural language|describe|generate cron|text to cron' in web/i18n/en-US/workflow.json and api/services/trigger: the schedule node takes a visual picker or a cron string only (web/i18n/en-US/workflow.json nodes.triggerSchedule.*) Note: the workflow generator does not know the schedule node either: searched 'trigger-schedule|trigger_schedule|cron' in api/core/workflow/generator/, no hits", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3709 create_automation built-in tool: the chat model turns 'every weekday at eight' into an RRULE (docstring examples :3723-3728), plus :3817 update_automation and :3921 list_automations, gated by features.automations permission" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3709 create_automation built-in tool: the chat model turns 'every weekday at eight' into an RRULE (docstring examples :3723-3728), plus :3817 update_automation and :3921 list_automations, gated by features.automations permission", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/builder/skills/target-tasks.skill.ts:5-20 the agent builder assistant turns a request for a recurring schedule into create_tasks/update_task calls; Instance AI (default module) builds Schedule Trigger workflows from plain prompts, e.g. en.json:1271 'Every morning, scan Gmail ...' suggestion Note: Through the AI builder, which needs a model configured." } }, { @@ -1390,13 +1481,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_time.py:1-5 tz-aware now() in the configured IANA timezone (HERMES_TIMEZONE or config timezone); cron/jobs.py:1195-1216 next fire computed on local wall clock with both DST folds tried so 09:00 local stays 09:00 across fall-back; cron/jobs.py:832 intervals measure elapsed time across DST Note: Old partial; the scheduler handles DST explicitly.", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:19 timezone per schedule; api/libs/schedule_utils.py:41-50 croniter evaluated in the pytz zone and converted to UTC, so fires follow local wall time across DST; web/i18n/en-US/workflow.json nodes.triggerSchedule.invalidTimezone", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/automations.py:319-330 claim_due fetches each owner's User.timezone and reschedules with it; utils/recurrence.py:128 next_run_ns evaluates the rule on local wall-clock time then attaches ZoneInfo (:137), so 08:00 stays 08:00 across DST" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/automations.py:319-330 claim_due fetches each owner's User.timezone and reschedules with it; utils/recurrence.py:128 next_run_ns evaluates the rule on local wall-clock time then attaches ZoneInfo (:137), so 08:00 stays 08:00 across DST", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:501-532 rules evaluated in the workflow/instance IANA timezone with moment-timezone; agent schedules carry their own zone, packages/cli/src/modules/agents/scheduling/task-timezone.ts:10-18 and agent-task-job-registrar.ts:190-195 cron planned in that zone" } }, { @@ -1419,13 +1511,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:157 `hermes cron run` (next scheduler tick); hermes_cli/web_routers/cron.py:292 POST /api/cron/jobs/{id}/trigger behind web/src/i18n/en.ts cron.triggerNow 'Trigger now' on CronPage", "dify": "source read at 1.17.1, not driven: api/core/trigger/debug/event_selectors.py:140-200 a schedule test run waits for the next computed slot, it does not fire at once; the same workflow can be run now only through a second User Input start node ('Choose the start node to run', web/i18n/en-US/workflow.json common.chooseStartNodeToRun) or the workflow run API Note: no 'run now' on the schedule itself", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:334 POST /automations/{id}/run; src/lib/components/automations/AutomationItemHeaderActions.svelte:33 'Run now', AutomationMenu.svelte:96 'Run Now'; src/routes/(app)/automations/+page.svelte:196 runAutomationById" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:334 POST /automations/{id}/run; src/lib/components/automations/AutomationItemHeaderActions.svelte:33 'Run now', AutomationMenu.svelte:96 'Run Now'; src/routes/(app)/automations/+page.svelte:196 runAutomationById", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-tasks.controller.ts:98-99 POST /:agentId/tasks/:taskId/run, en.json:8155 'Run schedule'; workflows with a Schedule Trigger run on demand from the editor's execute button (packages/cli/src/workflows/workflows.controller.ts manual run)" } }, { @@ -1448,13 +1541,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:306 POST /{id}/toggle flips is_active (models/automations.py:28); claim_due only picks is_active rows (:301); src/routes/(app)/automations/+page.svelte:166 toggle, :186 bulk toggle; tool tools/builtin.py:3993 toggle_automation", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:149-152 `cron pause` / `cron resume`; hermes_cli/web_routers/cron.py:282-287 POST /api/cron/jobs/{id}/pause|resume behind CronPage Pause/Resume (web/src/i18n/en.ts cron.pause)", - "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:167,197 POST /apps//trigger-enable sets AppTriggerStatus ENABLED/DISABLED; api/schedule/workflow_schedule_task.py:55-78 the poller only picks ENABLED triggers" + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:167,197 POST /apps//trigger-enable sets AppTriggerStatus ENABLED/DISABLED; api/schedule/workflow_schedule_task.py:55-78 the poller only picks ENABLED triggers", + "n8n": "source read at n8n@2.40.7, not driven: en.json:8122 per-schedule 'Enabled' switch in the agent task editor, packages/api-types agent-json-config.schema.ts:200-210 task enabled flag; whole workflows pause and resume with packages/cli/src/workflows/workflows.controller.ts:441 activate and :475 deactivate" } }, { @@ -1482,7 +1576,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-10 HMAC-validated inbound POST routes render the payload into an agent prompt or fire an existing cron job; hermes_cli/subcommands/webhook.py:16-50 `hermes webhook subscribe --prompt --events --skills --deliver --cron-job`; web/src/pages/WebhooksPage.tsx:207 create subscription", - "n8n": "docs-only: competitor_features#31096 \"Webhook triggers: Inbound HTTP webhooks start workflows.\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Webhook (Webhook trigger node) starts a workflow, including one with an AI Agent node, from an inbound HTTP call; Chat Trigger adds a chat webhook (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts); Agents module exposes packages/cli/src/modules/agents/agent-integrations.controller.ts:109 POST /:agentId/webhooks/:platform for chat platforms", "dify": "source read at 1.17.1, not driven: api/controllers/trigger/webhook.py:59 /triggers/webhook/ any method starts the workflow; web/i18n/en-US/workflow.json blocks.trigger-webhook 'receives HTTP pushes from third-party systems'; configurable params, headers and response (nodes.triggerWebhook.*); the agent runs as a node in that workflow", "open-webui": "source read at v0.11.4, not driven: inbound channel webhooks only post a message: backend/open_webui/routers/channels.py:2005 POST /channels/webhooks/{id}/{token} does not call model_response_handler (:976, only invoked at :1244 for user posts); another system can start a model turn only by calling the OpenAI-compatible API with an API key (routers/auths.py:1529, main.py:1118) Note: no webhook trigger bound to an agent; API call is the only machine start" } @@ -1507,12 +1601,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/webhook.py:136 re-running `webhook subscribe --secret ` replaces the route secret (else keeps it); hermes_cli/subcommands/webhook.py:58 `webhook remove` revokes the route; web/src/pages/WebhooksPage.tsx:335-355 secret shown once at creation; hermes_cli/subcommands/hooks.py:34 revoke is for hooks, not webhook secrets Note: Rotation is a re-subscribe with a new secret on the CLI; no rotate or revoke-secret action in the dashboard.", "dify": "source read at 1.17.1, not driven: api/services/trigger/webhook_service.py:966,994-1001 the random webhook_id in the URL is the only secret, generated once at node sync; no regenerate endpoint (api/controllers/console/app/workflow_trigger.py:94 is GET only); revoke by disabling the trigger (:167) or deleting the node. No HMAC/signature check Note: revoke yes, rotate no", - "open-webui": "source read at v0.11.4, not driven: channel webhook token is minted once (backend/open_webui/models/channels.py:937 secrets.token_urlsafe) with no regenerate endpoint; revoke only by deleting the webhook (routers/channels.py:1963); the API key used for machine starts can be regenerated or deleted (routers/auths.py:1529 POST, :1554 DELETE /api_key) Note: no agent webhook; nearest secrets can be revoked, only the API key rotated" + "open-webui": "source read at v0.11.4, not driven: channel webhook token is minted once (backend/open_webui/models/channels.py:937 secrets.token_urlsafe) with no regenerate endpoint; revoke only by deleting the webhook (routers/channels.py:1963); the API key used for machine starts can be regenerated or deleted (routers/auths.py:1529 POST, :1554 DELETE /api_key) Note: no agent webhook; nearest secrets can be revoked, only the API key rotated", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Webhook/description.ts:91-95 basic, header and JWT auth on the webhook, each backed by a stored credential; the secret is rotated or revoked by editing or deleting that credential (packages/cli/src/credentials/credentials.controller.ts:243 PATCH, :450 DELETE) Note: No dedicated rotate button; rotation is a credential edit." } }, { @@ -1536,12 +1631,12 @@ "hermes-agent": "partial", "copilot-studio": "yes", "dify": "partial", - "n8n": "yes", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "copilot-studio": "docs-only: competitor_features#31603 \"Autonomous agents: Agents that trigger on events and act without a human prompt (5 messages/action).\"", - "n8n": "docs-only: competitor_features#31096 \"Webhook triggers: Inbound HTTP webhooks start workflows.\"", + "n8n": "source read at n8n@2.40.7, not driven: 103 trigger nodes in packages/nodes-base/nodes (*Trigger.node.ts), e.g. file-upload triggers for Google Drive and Dropbox; searched '*nextcloud*trigger*' in packages/nodes-base/nodes: none, so a Nextcloud event reaches n8n only as a call to a generic Webhook node (packages/nodes-base/nodes/Webhook) Note: Event triggers are rich for other apps; nothing listens to Nextcloud directly. Old yes rested on the generic webhook line.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-5 routes accept events from outside systems with header event filters (GitHub, GitLab, Linear, generic); gateway/hooks.py:1-9 lifecycle hooks (session, agent, command events) run handlers; cron/scheduler_script.py pre-run script gates a job; searched 'nextcloud' repo-wide: none Note: Agents start on outside-system events via webhooks, not on Nextcloud file or record events.", "dify": "source read at 1.17.1, not driven: api/controllers/trigger/trigger.py:17 /triggers/plugin/ receives events from trigger plugins with subscriptions (api/controllers/console/workspace/trigger_providers.py:191); the event sources (GitHub, Slack, etc.) come from marketplace trigger plugins. No internal event bus for Dify's own events, no Nextcloud source Note: marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/events.py:1103 dispatch_event_functions runs admin-installed 'event' Functions on every published event (file.uploaded, knowledge.file.added, chat.created, ...; catalog class EventDefinitions events.py:42); an agent start must be hand-coded inside such a Function, searched 'trigger' in routers/automations.py and models/automations.py: automations are time-only (:73) Note: event hook exists for plugin code, no no-code event trigger for an agent" @@ -1568,12 +1663,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/webhook.py:47-51 a webhook route can fire an existing cron job (--cron-job); the same job keeps its schedule (cron/jobs.py:772 parse_schedule) and can be run by hand (hermes_cli/web_routers/cron.py:292 trigger); cron/jobs.py:2650-2657 manual run-now without consuming the next slot Note: Triggers are chosen per job or route rather than per profile.", "dify": "source read at 1.17.1, not driven: a workflow chooses its start node(s): User Input, Schedule Trigger, Webhook Trigger or a plugin trigger (web/i18n/en-US/workflow.json blocks.trigger-schedule, blocks.trigger-webhook, onboarding.triggerDescription; common.chooseStartNodeToRun); api/controllers/console/app/workflow_trigger.py:128 lists an app's triggers Note: chosen per workflow app that wraps the agent", - "open-webui": "source read at v0.11.4, not driven: an automation runs on its RRULE (backend/open_webui/models/automations.py:76) and can be run by hand (routers/automations.py:334 /run); a model is also started by hand in chat; there is no event option per agent (searched 'trigger|event' in models/automations.py and src/lib/components/automations: none) Note: schedule or manual, no event trigger to choose" + "open-webui": "source read at v0.11.4, not driven: an automation runs on its RRULE (backend/open_webui/models/automations.py:76) and can be run by hand (routers/automations.py:334 /run); a model is also started by hand in chat; there is no event option per agent (searched 'trigger|event' in models/automations.py and src/lib/components/automations: none) Note: schedule or manual, no event trigger to choose", + "n8n": "source read at n8n@2.40.7, not driven: each workflow picks its start: Manual Trigger, Schedule Trigger, Webhook or one of 103 app trigger nodes (packages/nodes-base/nodes/*Trigger.node.ts); Agents module agents combine chat, channel triggers and schedules per agent, en.json:8342-8343 'Triggers: Where and when this agent runs'" } }, { @@ -1596,12 +1692,12 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "yes", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json nodes.common.retry.* per-node retry on failure with max retries and a fixed retry interval in ms (api/core/workflow/generator/prompts/builder_prompts.py:111 retry_config); fail branch / default value error handling (nodes.common.errorHandle.*). Searched 'backoff|exponential' in api/core/workflow: no growing waits, no whole-run retry Note: fixed interval, node level only", - "n8n": "docs-only: competitor_features#3039 \"Error Handling: Built-in error handling with retry and fallback paths\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/core/src/execution-engine/workflow-execute.ts:1799-1814 node 'Retry On Fail' clamps maxTries to 2-5 and waitBetweenTries to at most 5000 ms, :2346-2347 same wait every attempt (en.json:2378-2408); failed executions can be retried by hand (en.json:1577 'Retry execution') Note: Retries stop after a limit, but the wait is fixed, not growing. Old yes rested on a generic error-handling line.", "hermes-agent": "source read at v2026.9.24, not driven: cron/unreachable_retry.py:1-17 and :31 RETRY_DELAYS_SECONDS (300, 900, 1800): growing waits, stops after three, but only for fires that never reached the model (transient network error, zero API calls); cron/quota_hold.py:1-12 parks a job until a provider quota window reopens Note: Generic run failures are not retried; the bounded ladder covers unreachable-model failures only.", "open-webui": "source read at v0.11.4, not driven: searched 'retry|backoff|attempt' in backend/open_webui/utils/automations.py, models/automations.py, routers/automations.py: execute_automation (utils/automations.py:345) catches the error, records status 'error' (:617 _record_run) and waits for the next RRULE slot; no automatic retry" } @@ -1626,13 +1722,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 durable failure incidents grouped by job and error signature (detected, alerted, closed); hermes_cli/subcommands/cron.py:174-181 `hermes cron incidents list|ack`; cron/jobs.py:2254 dead-pin auto-pause Note: Failing jobs land in an incident list someone can acknowledge; the failed runs are not parked for replay and there is no dashboard view of incidents.", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:27,121,150 run logs filter by status (failed) and web/app/components/app/workflow-log/filter.tsx; searched 'dead letter|dead_letter|quarantine|parked' in api/: no list that parks repeatedly failing runs Note: a failed-status filter per app, not a dead-letter list", - "open-webui": "source read at v0.11.4, not driven: failed runs are kept per automation in automation_run with status and error (backend/open_webui/models/automations.py:43-50), listed in src/lib/components/automations/AutomationEditor.svelte:212 getAutomationRuns; automation.run_failed event can go to a webhook (events.py AUTOMATION_RUN_FAILED); no cross-automation list of failing runs Note: per-automation run history, no parked-failures list" + "open-webui": "source read at v0.11.4, not driven: failed runs are kept per automation in automation_run with status and error (backend/open_webui/models/automations.py:43-50), listed in src/lib/components/automations/AutomationEditor.svelte:212 getAutomationRuns; automation.run_failed event can go to a webhook (events.py AUTOMATION_RUN_FAILED); no cross-automation list of failing runs Note: per-automation run history, no parked-failures list", + "n8n": "source read at n8n@2.40.7, not driven: the executions list filters failed runs (en.json:1429 'Error' status) with manual 'Retry execution' (en.json:1577-1579), and an Error Workflow can route failures elsewhere (workflow settings errorWorkflow); searched 'dead letter|deadLetter|parked' in packages/cli/src: no dedicated queue for runs that keep failing Note: Failed runs are findable by status, not parked in their own list." } }, { @@ -1656,11 +1753,11 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "partial", + "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", - "n8n": "docs-only: competitor_features#38156 \"core: Close the durable scheduler's record-then-dispatch effect boundary: From n8n@2.32.0 (2026-07-21)\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-task.service.ts:529-558 takes a per-task run lock (entities/agent-task-run-lock.entity.ts:6-35) and returns 'skipped-active' when the previous run still holds it; scheduling/agent-task-task-handler.ts:59-60 skips that tick Note: Agent schedules only (opt-in Agents module); workflow Schedule Triggers can overlap and have only the instance-wide N8N_CONCURRENCY_PRODUCTION_LIMIT (packages/@n8n/config/src/configs/executions.config.ts:25).", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:2648-2670 claim_job_for_fire refuses a new fire while a fresh fire_claim exists (cleared by mark_job_run on completion, TTL for crashes); cron/jobs.py:3050 still-in-flight runs are skipped", "dify": "source read at 1.17.1, not driven: api/schedule/workflow_schedule_task.py:94-114 _process_schedules advances next_run_at and dispatches every due schedule without checking for a running execution; searched 'overlap|already running|skip_if_running|concurrency' in api/schedule and api/services/trigger: nothing", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/automations.py:289 claim_due only prevents double claiming of one slot (next_run_at advanced, SKIP LOCKED); utils/automations.py:112 asyncio.create_task(execute_automation) with no check that the previous run finished; searched 'running|in_progress|overlap|lock' in utils/automations.py: none" @@ -1687,13 +1784,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/automations/+page.svelte:509 list with Active/Paused filter, :100 last run time; AutomationEditor.svelte:331 next run, :361 run history with status; backend/open_webui/routers/automations.py:147 enrich_automation adds last_run and next_runs", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/CronPage.tsx with web/src/i18n/en.ts cron.last 'Last', cron.next 'Next', overdueSince; hermes_cli/web_routers/cron.py:233 GET /api/cron/jobs and :243 /runs; hermes_cli/subcommands/cron.py:20 `cron list` and :168 `cron runs`", - "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:45-65,128 GET /apps//triggers lists one app's triggers with status, no next run or last result; next 5 run times only in the node panel (web/i18n/en-US/workflow.json nodes.triggerSchedule.nextExecutionTimes). No workspace-wide schedule list Note: per app, no next run or last result in the list" + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:45-65,128 GET /apps//triggers lists one app's triggers with status, no next run or last result; next 5 run times only in the node panel (web/i18n/en-US/workflow.json nodes.triggerSchedule.nextExecutionTimes). No workspace-wide schedule list Note: per app, no next run or last result in the list", + "n8n": "source read at n8n@2.40.7, not driven: per agent only: en.json:8119-8123 'Next run', 'Last run', 'Schedule status' in the agent's Schedules section (packages/frontend/editor-ui/src/features/agents/components/AgentSchedulesRow.vue); searched 'schedule' list views in packages/frontend/editor-ui/src/features: no instance-wide schedule overview for workflows or agents Note: No single list of every schedule." } }, { @@ -1716,13 +1814,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31376 \"Files tool: Read, create, move, copy, delete files and create public share links.\"", "open-webui": "source read at v0.11.4, not driven: agents read uploaded and knowledge files via built-in tools backend/open_webui/tools/builtin.py:2750 view_file, :2413 list_chat_files, :2453 grep_chat_files; create and move files only inside an attached Open Terminal filesystem (utils/middleware.py:1286 write_file / run_command); searched 'nextcloud|webdav' in backend/open_webui: no Nextcloud Files Note: file work happens in the Open Terminal sandbox, not in Nextcloud Files", "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file, write_file, patch, search_files tools and :1371 registration in the file toolset, plus terminal tool for moves; searched 'nextcloud' repo-wide (excluding website/): none outside one test Note: Works on the host or sandbox filesystem; no Nextcloud Files connection.", - "dify": "source read at 1.17.1, not driven: core has no file-store tool (searched 'nextcloud|webdav' in api/, web/app, web/i18n: no hits; builtin tools are audio, code, time, webscraper in api/core/tools/builtin_tool/providers/). Official marketplace plugin langgenius/dify-official-plugins tools/nextcloud/tools/ has list_files, search_files, upload_file, download_file, create_folder, delete_file: no move Note: marketplace plugin only (official 'nextcloud' plugin, read on main not at a tag), and it cannot move files" + "dify": "source read at 1.17.1, not driven: core has no file-store tool (searched 'nextcloud|webdav' in api/, web/app, web/i18n: no hits; builtin tools are audio, code, time, webscraper in api/core/tools/builtin_tool/providers/). Official marketplace plugin langgenius/dify-official-plugins tools/nextcloud/tools/ has list_files, search_files, upload_file, download_file, create_folder, delete_file: no move Note: marketplace plugin only (official 'nextcloud' plugin, read on main not at a tag), and it cannot move files", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/NextCloud/NextCloud.node.ts:35 usableAsTool, so an AI Agent can call it; :82-143 file resource with copy, delete, download, move, share, upload and :163-188 folder create, list, move; authenticated by Nextcloud access token or OAuth2 (:40-70) Note: Needs a workflow with an AI Agent node and the Nextcloud tool attached." } }, { @@ -1745,13 +1844,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31373 \"Calendar tool: List calendars, schedule events, find free time slots via natural-language chat.\"", "open-webui": "source read at v0.11.4, not driven: built-in calendar tools backend/open_webui/tools/builtin.py:4151 search_calendar_events, :4240 create_calendar_event, :4367 update, :4488 delete, registered at utils/tools.py:754 when calendar is enabled; data in models/calendar.py, UI src/routes/(app)/calendar/+page.svelte Note: Open WebUI's own calendar; no CalDAV or Nextcloud Calendar", "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:1-27 bundled skill reads Google Calendar, checks conflicts and creates events through a gws CLI or bundled Python client (needs Google OAuth); optional-mcps/calendly; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Calendar only; no CalDAV, so a Nextcloud calendar is out of reach.", - "dify": "source read at 1.17.1, not driven: no calendar tool in core (api/core/tools/builtin_tool/providers/ has audio, code, time, webscraper). Marketplace: official langgenius/dify-official-plugins tools/google_calendar/tools/{list_events,create_event}.yaml, feishu/lark calendars, and a community CalDAV plugin langgenius/dify-plugins shaba/caldav that could point at a Nextcloud calendar Note: marketplace plugin only" + "dify": "source read at 1.17.1, not driven: no calendar tool in core (api/core/tools/builtin_tool/providers/ has audio, code, time, webscraper). Marketplace: official langgenius/dify-official-plugins tools/google_calendar/tools/{list_events,create_event}.yaml, feishu/lark calendars, and a community CalDAV plugin langgenius/dify-plugins shaba/caldav that could point at a Nextcloud calendar Note: marketplace plugin only", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Google/Calendar/GoogleCalendar.node.ts:57 usableAsTool, event get/getAll/create as an AI Agent tool; Microsoft Outlook node has calendar events (packages/nodes-base/nodes/Microsoft/Outlook/v2); searched 'caldav' in packages/nodes-base/nodes: none, so a Nextcloud calendar needs a hand-built HTTP Request tool Note: Google and Microsoft calendars; no CalDAV or Nextcloud Calendar node." } }, { @@ -1774,13 +1874,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31379 \"Contacts tool: Look up contact and user information to feed other tools.\"", "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:15-22 Contacts via the Google People API in the bundled google-workspace skill; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Contacts only; no CardDAV or Nextcloud Contacts.", "dify": "source read at 1.17.1, not driven: no contacts tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_contacts/tools/{search_contacts,get_contact}.yaml; community langgenius/dify-plugins shaba/carddav Note: marketplace plugin only", - "open-webui": "source read at v0.11.4, not driven: searched 'contacts|carddav|address book' in backend/open_webui and src/lib/components: no contacts store or tool; only the user directory used for sharing" + "open-webui": "source read at v0.11.4, not driven: searched 'contacts|carddav|address book' in backend/open_webui and src/lib/components: no contacts store or tool; only the user directory used for sharing", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Google/Contacts/GoogleContacts.node.ts:35 usableAsTool with contact get/getAll; searched 'carddav' in packages/nodes-base/nodes: none, so Nextcloud Contacts is only reachable by a hand-built HTTP Request tool Note: Google Contacts; no CardDAV or Nextcloud Contacts node." } }, { @@ -1804,13 +1905,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31377 \"Deck tool: Manage Deck board cards, labels and assignments.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/kanban_tools_schemas.py:89-371 kanban_create, kanban_comment, kanban_complete tools on Hermes' own multi-profile kanban board (hermes_cli/kanban.py); optional-mcps/ has asana, linear, monday, clickup MCP entries; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Cards on Hermes' own board or third-party boards; no Nextcloud Deck.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|deck' in api/ and web/i18n: nothing in core. Marketplace kanban tools only for other products: official tools/trello/tools/{create_new_card_on_board,update_card}.yaml, monday, linear, jira Note: cards on Trello-like boards via plugins, not Nextcloud Deck", - "open-webui": "source read at v0.11.4, not driven: searched 'deck|kanban|board' in backend/open_webui (py): no board tool or integration" + "open-webui": "source read at v0.11.4, not driven: searched 'deck|kanban|board' in backend/open_webui (py): no board tool or integration", + "n8n": "source read at n8n@2.40.7, not driven: card boards of other products as agent tools: packages/nodes-base/nodes/Trello/Trello.node.ts:42 usableAsTool (card create/update), Asana and Jira nodes; searched 'deck' in packages/nodes-base/nodes/NextCloud: the Nextcloud node has only file, folder and user resources (NextCloud.node.ts:82-91) Note: Cards on Trello-like boards, not Nextcloud Deck." } }, { @@ -1833,13 +1935,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31375 \"Mail tool: Send emails, manage mail accounts and folders.\"", "hermes-agent": "source read at v2026.9.24, not driven: skills/email/himalaya/SKILL.md:1-3 bundled IMAP/SMTP skill; plugins/platforms/email/plugin.yaml:5-8 email gateway polls IMAP and replies over SMTP; tools/send_message_tool.py:35 send_message delivers to the email target; skills/productivity/google-workspace Gmail", "dify": "source read at 1.17.1, not driven: core email is only the Human Input node's delivery method (web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*, api/services/feature_service.py:81 on for self-hosted). A generic send-email tool comes from the official tools/email/tools/send_mail.yaml plugin or gmail/outlook plugins Note: agent-callable email is marketplace plugin only", - "open-webui": "source read at v0.11.4, not driven: searched 'smtp|send_email|sendmail|mail' in backend/open_webui: no mail sending anywhere in core; outbound messages go only to webhooks (utils/webhook.py:30) Note: only possible through a community Tool" + "open-webui": "source read at v0.11.4, not driven: searched 'smtp|send_email|sendmail|mail' in backend/open_webui: no mail sending anywhere in core; outbound messages go only to webhooks (utils/webhook.py:30) Note: only possible through a community Tool", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/EmailSend/v2/EmailSendV2.node.ts:32 usableAsTool sends SMTP mail; packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts:54 usableAsTool with send" } }, { @@ -1862,13 +1965,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31374 \"Talk tool: List conversations, send messages, create public conversations from the agent.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/send_message_tool.py:1-2 and :35 send_message posts to any connected chat platform (plugins/platforms/: telegram, discord, slack, matrix, mattermost, teams, signal and more); plugin-catalog/hermes-talk.yaml:1-5 is realtime voice, not Nextcloud Talk; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Posting into a team chat works; there is no Nextcloud Talk adapter.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/i18n: nothing in core. Marketplace chat tools for other products: official tools/slack/tools/send_message.yaml, tools/teams/tools/send_channel_message.yaml, discord, dingtalk, wecom Note: posts to Slack/Teams via plugins, not Nextcloud Talk", - "open-webui": "source read at v0.11.4, not driven: an automation can target an Open WebUI channel (backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation) and models answer @mentions in channels (routers/channels.py:976); channel built-in tools are read-only (tools/builtin.py:1763-1957); no Nextcloud Talk Note: posting is to Open WebUI's own channels, only via automation target or mention reply" + "open-webui": "source read at v0.11.4, not driven: an automation can target an Open WebUI channel (backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation) and models answer @mentions in channels (routers/channels.py:976); channel built-in tools are read-only (tools/builtin.py:1763-1957); no Nextcloud Talk Note: posting is to Open WebUI's own channels, only via automation target or mention reply", + "n8n": "source read at n8n@2.40.7, not driven: team chat tools for other products: packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts:75, Mattermost/v1/MattermostV1.node.ts:19, Microsoft/Teams/v2/MicrosoftTeamsV2.node.ts:21 all usableAsTool; searched 'talk|spreed' in packages/nodes-base/nodes: no Nextcloud Talk node Note: Posts to Slack, Mattermost or Teams, not Nextcloud Talk." } }, { @@ -1892,13 +1996,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31378 \"Tasks tool: Create, list, complete, update and delete tasks.\"", "hermes-agent": "source read at v2026.9.24, not driven: skills/apple/apple-reminders/SKILL.md:1-3 'add, list, complete' reminders (macOS); tools/kanban_tools_schemas.py:89 kanban_complete and :371 kanban_create; optional-mcps/todoist; tools/todo_tool.py in-session todo list Note: No CalDAV tasks; Nextcloud Tasks is not reachable.", "dify": "source read at 1.17.1, not driven: no task tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_tasks/tools/{create_task,update_task}.yaml, microsoft_todo, todoist, feishu_task Note: marketplace plugin only", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3593 create_tasks and :3643 update_task keep a checklist inside the chat message (status pending|in_progress|completed); searched 'todo|caldav|vtodo' in backend/open_webui: no task app to create or complete tasks in Note: in-chat progress checklist only" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3593 create_tasks and :3643 update_task keep a checklist inside the chat message (status pending|in_progress|completed); searched 'todo|caldav|vtodo' in backend/open_webui: no task app to create or complete tasks in Note: in-chat progress checklist only", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Google/Task/GoogleTasks.node.ts:29, Microsoft/ToDo/MicrosoftToDo.node.ts:33 and Todoist/v2/TodoistV2.node.ts:61 are usableAsTool with create and update (complete) task operations Note: No Nextcloud Tasks (CalDAV) node." } }, { @@ -1921,13 +2026,14 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31384 \"Unified search tool: Access all Nextcloud search providers from the agent.\"", "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; tools/session_search_tool.py searches only Hermes' own conversations and tools/file_tools.py:1270 search_files only the host filesystem Note: No Nextcloud unified search provider or equivalent cross-app search.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|unified search|unified_search' in api/ and web/: nothing. The official marketplace nextcloud plugin (langgenius/dify-official-plugins tools/nextcloud/tools/search_files.yaml) searches files only, not everything Nextcloud search reaches", - "open-webui": "source read at v0.11.4, not driven: separate built-in search tools over Open WebUI's own stores: backend/open_webui/tools/builtin.py:1512 search_chats, :1127 search_notes, :865 search_memories, :1763 search_channels, :2104 search_knowledge_bases, :4151 search_calendar_events; no single cross-app search tool and no Nextcloud unified search Note: agent can search each store, not one unified index" + "open-webui": "source read at v0.11.4, not driven: separate built-in search tools over Open WebUI's own stores: backend/open_webui/tools/builtin.py:1512 search_chats, :1127 search_notes, :865 search_memories, :1763 search_channels, :2104 search_knowledge_bases, :4151 search_calendar_events; no single cross-app search tool and no Nextcloud unified search Note: agent can search each store, not one unified index", + "n8n": "source read at n8n@2.40.7, not driven: searched 'unified search|unifiedsearch|nextcloud search' in packages/nodes-base/nodes, packages/@n8n/nodes-langchain/nodes and packages/cli/src/modules/agents: no tool that searches across a Nextcloud instance; the Nextcloud node covers files, folders and users only (packages/nodes-base/nodes/NextCloud/NextCloud.node.ts:82-91)" } }, { @@ -1950,12 +2056,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/web_tools.py:1-9 web_search and web_extract over pluggable backends in plugins/web/ (brave_free, ddgs, exa, firecrawl, searxng, tavily, perplexity ...); tools/browser_tool.py full browser for reading pages", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:294 search_web and :333 fetch_url, registered at utils/tools.py:677 when web_search is enabled; ~20 providers in backend/open_webui/retrieval/web/ (SearXNG, Brave, Tavily, ...)", - "dify": "source read at 1.17.1, not driven: core ships only a page reader (api/core/tools/builtin_tool/providers/webscraper); web search engines are marketplace plugins (official tools/duckduckgo, tavily, searxng, google, bing, brave, perplexity in langgenius/dify-official-plugins); web/i18n/en-US/agent-v-2.json tools.addMenu.tool 'like web search or integrations' Note: reading pages is core, searching needs a plugin" + "dify": "source read at 1.17.1, not driven: core ships only a page reader (api/core/tools/builtin_tool/providers/webscraper); web search engines are marketplace plugins (official tools/duckduckgo, tavily, searxng, google, bing, brave, perplexity in langgenius/dify-official-plugins); web/i18n/en-US/agent-v-2.json tools.addMenu.tool 'like web search or integrations' Note: reading pages is core, searching needs a plugin", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/tools/ToolSerpApi/ToolSerpApi.node.ts:25 'SerpApi (Google Search)' and nodes/tools/ToolSearXng agent tools; Agents module web search setting with native, Brave or SearXNG providers (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:80-84, en.json:7884-7895); pages read with the HTTP Request tool (nodes/tools/ToolHttpRequest)" } }, { @@ -1978,12 +2085,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'openregister|register' as a record store in *.py and optional-mcps/: none; searched 'nextcloud' repo-wide (excluding website/): none outside one test", "dify": "source read at 1.17.1, not driven: searched 'openregister' in api/ and web/app: no hits; no OpenRegister connector in core or in the official plugin list (langgenius/dify-official-plugins tools/). Only reachable by a hand-built custom OpenAPI tool or HTTP node", - "open-webui": "source read at v0.11.4, not driven: searched 'openregister|register' in backend/open_webui/tools and utils/tools.py: no OpenRegister or record-store tool; reachable only through a custom OpenAPI or MCP tool server" + "open-webui": "source read at v0.11.4, not driven: searched 'openregister|register' in backend/open_webui/tools and utils/tools.py: no OpenRegister or record-store tool; reachable only through a custom OpenAPI or MCP tool server", + "n8n": "source read at n8n@2.40.7, not driven: searched 'openregister' in packages/nodes-base/nodes, packages/@n8n/nodes-langchain/nodes and packages/cli/src: no hits; only reachable by a hand-built HTTP Request tool against its API" } }, { @@ -2013,7 +2121,7 @@ "nextcloud-assistant": "docs-only: competitor_features#31385 \"Remote MCP client: Consume external MCP servers, but streamable_http only and cannot use per-user access tokens.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/mcp_tool.py MCP client (stdio, HTTP, OAuth in tools/mcp_oauth.py); hermes_cli/subcommands/mcp.py:27 `hermes mcp add` and :52 configure tool selection; hermes_cli/web_routers/mcp.py:110 POST /api/mcp/servers behind web/src/pages/McpPage.tsx; optional-mcps/ catalog of 65 servers", "copilot-studio": "docs-only: competitor_features#31607 \"MCP support: Copilot Studio can consume MCP tool servers.\"", - "n8n": "docs-only: competitor_features#3906 \"AI Agent Node: Extract tool name correctly for MCP tool calls: From n8n@2.14.0 (2026-03-24)\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/mcp/McpClientTool/McpClientTool.node.ts attaches an outside MCP server's tools to the AI Agent node; Agents module per-agent mcpServers with auth, tool allow/exclude filter and approval (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:228-303, max 20 at :495-500)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/AddToolServerModal.svelte:43 type 'openapi' | 'mcp', :313 OAuth 2.1; backend/open_webui/utils/mcp/client.py:67 streamablehttp_client; utils/middleware.py:2340 connect_mcp_server with access check :2361 and function_name_filter_list :2380", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/tool_providers.py:1373 add an MCP server as a tool provider, :1501 MCP OAuth, :1577 list its tools; api/core/mcp/types.py:26 client negotiates protocol 2025-06-18; web/i18n/en-US/agent-v-2.json tools.toolTabs.mcp so agents pick MCP tools" } @@ -2042,7 +2150,7 @@ "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/app/mcp_server.py:79 enable an app's MCP server, :181 refresh its URL; api/controllers/mcp/mcp.py:44 /mcp/server//mcp endpoint serving the app as an MCP tool to outside agents Note: each app is exposed as a tool, not the workspace's whole tool catalogue", - "n8n": "docs-only: competitor_features#38148 \"core: Acquire expression isolate for MCP Trigger tool calls in queue mode: From n8n@2.32.0 (2026-07-21)\"", + "n8n": "source read at n8n@2.40.7, not driven: instance MCP server is a default module: packages/cli/src/modules/mcp/mcp.controller.ts:37,117 POST /mcp-server/http, tools such as search_workflows and execute_workflow (packages/cli/src/modules/mcp/tools/, mcp-scopes.ts:15,44); per-workflow MCP Server Trigger node packages/@n8n/nodes-langchain/nodes/mcp/McpTrigger/McpServer.ts", "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:1-7 `hermes mcp serve` stdio MCP server exposing a channel bridge: mcp_serve.py:468 conversations_list, :600 messages_send, :626 channels_list, :662-672 approvals; plugins/platforms/a2a lets outside agents message Hermes Note: Outside agents reach conversations, messaging and approvals, not Hermes' own tool set (files, terminal, web, skills).", "open-webui": "source read at v0.11.4, not driven: searched 'FastMCP|mcp.server|/mcp' in backend/open_webui (py): the only MCP code is the client (utils/mcp/client.py); Open WebUI exposes an OpenAI-compatible REST API, not an MCP server" } @@ -2073,7 +2181,7 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:213-215 /tools list and /toolsets; hermes_cli/web_routers/tools.py:230 GET /api/tools/toolsets behind web/src/pages/SkillsPage.tsx:140 toolsets view with descriptions; tools/tool_search.py lets the agent search the tool catalog", "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/tool-provider-list.tsx list every installed tool provider (plugins, custom, workflow-as-tool, MCP) with each tool's description; api/controllers/console/workspace/tool_providers.py lists them", - "n8n": "docs-only: competitor_features#31095 \"400+ app connectors: Large library of prebuilt integration nodes.\"", + "n8n": "source read at n8n@2.40.7, not driven: the node creator lists every tool node with its description (packages/frontend/editor-ui/src/features/shared/nodeCreator/components/ItemTypes/NodeItem.vue:59-75); 272 nodes in packages/nodes-base/nodes declare usableAsTool: true; Agents module tool catalog with descriptions (packages/frontend/editor-ui/src/features/agents/composables/useAgentToolCatalog.ts:79-145)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Tools.svelte lists custom tools with descriptions (routers/tools.py); src/lib/components/workspace/Models/BuiltinTools.svelte:14-51 each built-in tool category with label and description; tool servers listed in chat/ToolServersModal.svelte" } }, @@ -2097,12 +2205,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/tools.py:280-285 PUT /api/tools/toolsets/{name}?profile= enables/disables a toolset per profile and per platform (platform_toolsets.), behind web/src/pages/SkillsPage.tsx toolsets view; hermes_cli/commands.py:213 /tools disable|enable ; agent/subagent_lifecycle.py:415 subagents only get a subset of the parent's toolsets", "open-webui": "source read at v0.11.4, not driven: per-agent allow-list: src/lib/components/workspace/Models/ModelEditor.svelte:1198 ToolsSelector, :1262 BuiltinTools category toggles (BuiltinTools.svelte:14-51), :1245 Capabilities; backend/open_webui/utils/tools.py:520 get_builtin_tools only returns categories the model allows; tool access grants routers/tools.py:588", - "dify": "source read at 1.17.1, not driven: tools are picked per agent (web/i18n/en-US/agent-v-2.json agentDetail.configure.tools.*; classic agent apps list tools in model config). But every Agent v2 run also gets a shell tool (dify-agent/src/dify_agent/layers/shell/layer.py:259,303 run) and 'Tools the agent installs in its sandbox won't appear here but stay available to it' (agent-v-2.json tools.tip) Note: explicit list for classic agents; Agent v2 always has a shell, so not 'nothing else'" + "dify": "source read at 1.17.1, not driven: tools are picked per agent (web/i18n/en-US/agent-v-2.json agentDetail.configure.tools.*; classic agent apps list tools in model config). But every Agent v2 run also gets a shell tool (dify-agent/src/dify_agent/layers/shell/layer.py:259,303 run) and 'Tools the agent installs in its sandbox won't appear here but stay available to it' (agent-v-2.json tools.tip) Note: explicit list for classic agents; Agent v2 always has a shell, so not 'nothing else'", + "n8n": "source read at n8n@2.40.7, not driven: an AI Agent node can call only the tool sub-nodes wired to it (packages/@n8n/nodes-langchain/nodes/agents/Agent/utils.ts:31-59 typed inputs incl. ai_tool); Agents module lists tools per agent and filters MCP tools with allow/exclude (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:266-282, :461); skills narrow further with allowedTools (en.json:8053)" } }, { @@ -2127,12 +2236,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'request.{0,20}(tool|toolset).{0,20}(access|enable)|ask.{0,20}(user|owner).{0,20}enable' in *.py: none; hermes_cli/tool_availability_notices.py:1-6 only prints startup notices for toolsets missing requirements; tools/tool_search.py:1-7 discloses deferred tools that are already granted Note: The agent cannot ask its owner for a new tool through any built-in flow.", "dify": "source read at 1.17.1, not driven: searched 'request access|requestAccess|ask.*owner|tool request' in web/i18n/en-US and dify-agent/src: only static 'contact your Workspace Owner' tour text (web/i18n/en-US/common.json:624); no flow where an agent asks for a missing tool", - "open-webui": "source read at v0.11.4, not driven: searched 'request access|request_access|missing tool' in backend/open_webui and src/lib/components: no flow for an agent to ask its owner for a tool; the ask_user tool (tools/builtin.py:518) asks the chat user a question, not for a grant" + "open-webui": "source read at v0.11.4, not driven: searched 'request access|request_access|missing tool' in backend/open_webui and src/lib/components: no flow for an agent to ask its owner for a tool; the ask_user tool (tools/builtin.py:518) asks the chat user a question, not for a grant", + "n8n": "source read at n8n@2.40.7, not driven: searched 'request access|request_tool|requestTool' in packages/cli/src/modules/agents and packages/@n8n/agents/src: a running agent cannot ask its owner for a missing tool; ask_credential exists only for the builder assistant while editing an agent (packages/cli/src/modules/agents/builder/prompts/config-mutation.prompt.ts:31,103), and 'Suggest a tool' (en.json:7800-7801) is feedback from the builder to n8n Note: The builder asks the human for credentials while building; the agent at runtime cannot." } }, { @@ -2156,12 +2266,12 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "partial", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/code_execution_tool.py:1-9 code execution through a session kernel; tools/environments/ docker.py, modal.py, daytona.py, singularity.py, vercel_sandbox.py, ssh.py isolated terminal backends (tools/terminal_tool_backends.py:1-3); hermes_cli/web_routers/tools.py:661 PUT /api/tools/terminal/backend", "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/layers/shell/layer.py:303 agent runs scripts in a per-agent Linux sandbox (dify-agent-runtime/docker/Dockerfile); workflow Code node (web/i18n/en-US/workflow.json blocks.code) runs in dify-sandbox; builtin code tool api/core/tools/builtin_tool/providers/code Note: agent-v-2.json communityEditionIsolationTip: in Community Edition the sandbox is only Landlock-protected and shares a PID namespace, not strongly isolated", - "n8n": "docs-only: competitor_features#3038 \"Code Nodes: JavaScript and Python code execution within workflows\"", + "n8n": "source read at n8n@2.40.7, not driven: Code node and Custom Code Tool (packages/@n8n/nodes-langchain/nodes/tools/ToolCode/ToolCode.node.ts) run JS or Python in task runners, Python in a sandbox (packages/@n8n/task-runner-python/src/_sandbox_callables.py; runner mode config packages/@n8n/config/src/configs/runners.config.ts:16-17); Agents module custom tools run in V8 isolates (packages/cli/src/modules/agents/runtime/agent-secure-runtime.ts:5,23) Note: Default runner mode is 'internal' (a child process); the external runner container gives stronger isolation.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:633 execute_code; src/lib/components/admin/Settings/CodeExecution.svelte:20 engines pyodide (browser WASM sandbox, src/lib/pyodide/pyodideSandboxHost.ts) and jupyter; plus Open Terminal containers (README.md:36)" } }, @@ -2186,12 +2296,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool.py runs git in the working tree; hermes_cli/subcommands/worktree.py:8-26 isolated git worktrees and tools/subagent_worktree.py per-subagent worktrees; hermes_cli/commands.py:173 /diff and :83 /rollback checkpoints (tools/checkpoint_manager.py); skills/software-development/ bundled coding skills", "open-webui": "source read at v0.11.4, not driven: no git tool in core (searched 'git' in backend/open_webui/tools and utils/tools.py); an agent can run git only through an attached Open Terminal via run_command (utils/tools.py:1439, utils/middleware.py:1287), which is a separate first-party server (README.md:96 open-webui/open-terminal) Note: old yes; git works only with the separate Open Terminal server", - "dify": "source read at 1.17.1, not driven: dify-agent-runtime/docker/Dockerfile:31-37 installs git and openssh-client in the agent sandbox; dify-agent/src/dify_agent/layers/shell/layer.py:303 the agent runs shell scripts there, secrets via the env editor (agent-v-2.json advancedSettings.envEditor); official github/gitlab plugins add PR and commit tools Note: through the generic shell, no dedicated git UI" + "dify": "source read at 1.17.1, not driven: dify-agent-runtime/docker/Dockerfile:31-37 installs git and openssh-client in the agent sandbox; dify-agent/src/dify_agent/layers/shell/layer.py:303 the agent runs shell scripts there, secrets via the env editor (agent-v-2.json advancedSettings.envEditor); official github/gitlab plugins add PR and commit tools Note: through the generic shell, no dedicated git UI", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Git/Git.node.ts:90 usableAsTool with operations add, clone, commit, pull, push (:136-184); GitHub and GitLab nodes for remote repositories (packages/nodes-base/nodes/Github, Gitlab) Note: Git node works on the n8n host's filesystem; needs a workflow with an AI Agent node." } }, { @@ -2219,7 +2330,7 @@ "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31883 \"Model Context Protocol (MCP) tools: Admins add custom services to Context Agent via MCP\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/tool_providers.py:685 add a custom tool from an OpenAPI schema (web/i18n/en-US/tools.json createTool.schema), :904 publish a workflow as a tool, :1373 add an MCP server; agent-v-2.json tools.cliDialog installs a CLI tool into the agent sandbox", - "n8n": "docs-only: competitor_features#3045 \"Community Nodes: Community-contributed custom integration nodes\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/tools/ToolCode (custom code tool), ToolHttpRequest (any API) and ToolWorkflow (a workflow as a tool) are added on the canvas without code changes; Agents module custom tools and workflow tools (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:373-420, en.json:8040-8041); community nodes can be installed too", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/tools.py:346 POST /tools/create with Python code (src/routes/(app)/workspace/tools/create/+page.svelte, ToolkitEditor.svelte), :264 /tools/load/url; OpenAPI and MCP tool servers added in settings (src/lib/components/AddToolServerModal.svelte:43)", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:456 register_tool in the plugin context; hermes_cli/subcommands/plugins.py:18 `hermes plugins install` from a git URL, into ~/.hermes/plugins; web/src/i18n/en.ts pluginsPage.installHeading 'Install from GitHub / Git URL'; hermes_cli/subcommands/mcp.py:27 add any MCP server" } @@ -2244,12 +2355,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/sessions.py:69-78 `hermes sessions export --format jsonl|trace` writes full transcripts including every tool call and argument, filterable by age and source; hermes_cli/web_routers/sessions.py:787 GET /api/sessions/{id}/export (one session) Note: Tool calls export inside whole transcripts; there is no tool-call-only list or dashboard export across sessions.", "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI writes query, answer, inputs, sources and feedback (api/services/retention/conversation/message_export_service.py:53-62), no tool calls; api/controllers/console/workflow_run_archive.py:93-130 run-archive download is Cloud paid-plan only; tool spans reach Langfuse and other tracers (api/core/ops) Note: no community export of the tool-call list; old partial rested on the message export, which leaves tool calls out", - "open-webui": "source read at v0.11.4, not driven: tool calls live inside each message's output items (utils/tool_approval.py:43 function_call entries) and leave only through chat JSON export (src/lib/components/chat/Settings/DataControls.svelte:93 exportChats, admin routers/chats.py:1049 /all/db) or chat stats export (:609); no dedicated tool-invocation log or export" + "open-webui": "source read at v0.11.4, not driven: tool calls live inside each message's output items (utils/tool_approval.py:43 function_call entries) and leave only through chat JSON export (src/lib/components/chat/Settings/DataControls.svelte:93 exportChats, admin routers/chats.py:1049 /all/db) or chat stats export (:609); no dedicated tool-invocation log or export", + "n8n": "source read at n8n@2.40.7, not driven: tool calls sit inside execution data, exportable per run through the public API packages/cli/src/public-api/v1/handlers/executions/spec/paths/getExecutions.generated.yml:18 includeData; one agent session exports to LangSmith (packages/cli/src/modules/agents/agent-threads.controller.ts:53-65); searched 'export' in packages/frontend/editor-ui/src/features/agents and execution logs: no export of an agent's tool-call list Note: No single export of every tool call; assemble from execution data or per session." } }, { @@ -2272,12 +2384,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ChannelsPage.tsx:42-51 live connected/disconnected/fatal state per messaging platform; web/src/pages/SystemPage.tsx:106 runs `doctor` with a live log and :187 memory-provider status, :210 credential pool; hermes_cli/web_routers/mcp.py:195 POST /api/mcp/servers/{name}/test; hermes_cli/doctor_connectivity.py:1-4 provider API probes Note: Spread over Channels, MCP and System pages rather than one list. Old partial.", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/routes.ts:2-11 one page for model providers, builtin tools, MCP, custom tools, workflow tools, data sources, endpoints, triggers, agent strategies, extensions, each showing Authorized/Unauthorized (web/i18n/en-US/tools.json auth.authorized, auth.unauthorized) Note: shows whether a connection is authorised, not a live health check", - "open-webui": "source read at v0.11.4, not driven: admin Settings tabs Connections, Integrations (tool servers), Code Execution, External Knowledge (src/lib/components/admin/Settings/*.svelte) list outside connections, each with a verify or test action at add time (AddToolServerModal.svelte:206 verifyToolServerConnection, AddTerminalServerModal.svelte:246, ExternalKnowledge.svelte:295); no standing status view showing whether each still works" + "open-webui": "source read at v0.11.4, not driven: admin Settings tabs Connections, Integrations (tool servers), Code Execution, External Knowledge (src/lib/components/admin/Settings/*.svelte) list outside connections, each with a verify or test action at add time (AddToolServerModal.svelte:206 verifyToolServerConnection, AddTerminalServerModal.svelte:246, ExternalKnowledge.svelte:295); no standing status view showing whether each still works", + "n8n": "source read at n8n@2.40.7, not driven: the Credentials page lists every outside connection (en.json:1178-1182) and a credential is tested when saved (packages/cli/src/credentials/credentials.controller.ts:147 POST /test), but the list shows no live health; per agent, packages/cli/src/modules/agents/agent-integrations.controller.ts:89-104 channel status report and en.json:8554 'Not running' badge Note: No single page with live status of every dependency." } }, { @@ -2300,13 +2413,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:1-5 persistent MEMORY.md (agent notes) and USER.md (user profile) injected into every session; agent/background_review.py:1-6 after each turn a forked agent decides what to save; plugins/memory/ bundled providers (honcho, mem0, supermemory, openviking, retaindb, holographic, byterover)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/memories.py:15 per-user memory table (type user|context, path); utils/memory.py:290 add_memory_context injects memories into each chat; tools/builtin.py:923 add_memory, :865 search_memories let the agent save and recall across chats and automation runs", - "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 Agent v2 working directories are owned per conversation, workflow run or build draft, so end-user runs do not carry facts into the next conversation; only builder-applied persistent files and the build note (agent-v-2.json workingDirectory.persistentFilesTooltip) carry over. Learned memory comes from marketplace plugins (official bailian_memory; community mem0, zep in langgenius/dify-plugins) Note: marketplace plugin for learned memory; plugins not read" + "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 Agent v2 working directories are owned per conversation, workflow run or build draft, so end-user runs do not carry facts into the next conversation; only builder-applied persistent files and the build note (agent-v-2.json workingDirectory.persistentFilesTooltip) carry over. Learned memory comes from marketplace plugins (official bailian_memory; community mem0, zep in langgenius/dify-plugins) Note: marketplace plugin for learned memory; plugins not read", + "n8n": "source read at n8n@2.40.7, not driven: Agents module episodic memory stores source-backed facts across conversations (packages/@n8n/agents/src/runtime/memory/episodic-memory.ts, packages/cli/src/modules/agents/entities/agent-memory-entry.entity.ts, en.json:7918-7919); workflows keep chat history across runs in persistent memory nodes keyed by session (packages/@n8n/nodes-langchain/nodes/memory/MemoryPostgresChat, MemoryRedisChat, MemoryZep) Note: Fact memory needs the opt-in Agents module; workflow memory nodes keep conversation history, not distilled facts." } }, { @@ -2329,13 +2443,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 target 'user' = who the user is (name, role, preferences, style) in USER.md; plugins/memory/honcho/__init__.py:1-5 per-peer user modeling with peer cards; mem0 user_id canonical across gateways (plugins/memory/mem0/__init__.py:1-7) Note: USER.md is per profile, not per person; per-person modelling needs the honcho or mem0 provider.", "open-webui": "source read at v0.11.4, not driven: memory is kept per person: backend/open_webui/models/memories.py:22 user_id, :23 type 'user' for durable facts about the user; utils/memory.py:528 background review writes 'user' facts; src/lib/components/chat/Settings/Personalization/MemoryModal.svelte:97 'Add a preference, fact, or instruction about you' Note: old partial; memory is per user across all models, not per agent", - "dify": "source read at 1.17.1, not driven: searched 'user profile|user_memory|remember' in dify-agent/src and api/core/memory (token_buffer_memory.py only): no per-person memory in core; conversation variables are per conversation (api/controllers/console/app/conversation_variables.py:88). Per-user memory only via marketplace memory plugins (community mem0, zep) Note: marketplace plugin only, plugin behaviour not read" + "dify": "source read at 1.17.1, not driven: searched 'user profile|user_memory|remember' in dify-agent/src and api/core/memory (token_buffer_memory.py only): no per-person memory in core; conversation variables are per conversation (api/controllers/console/app/conversation_variables.py:88). Per-user memory only via marketplace memory plugins (community mem0, zep) Note: marketplace plugin only, plugin behaviour not read", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/utils/agent-memory-scope.ts:1-60 memory is scoped per resource: per n8n user (draft-chat:), per chat-platform user (integration::) and per task; memory entries indexed by agentId and resourceId (entities/agent-memory-entry.entity.ts:8-17) Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -2359,13 +2474,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", "hermes-agent": "source read at v2026.9.24, not driven: memories are plain files $HERMES_HOME/memories/MEMORY.md and USER.md (hermes_cli/web_routers/ops.py:481-492); web/src/pages/SystemPage.tsx:1234-1243 shows their sizes and Reset buttons only; hermes_cli/commands.py:223 /memory pending|approve|reject reviews staged writes; tools/memory_tool.py:311 agent can replace/remove entries on request Note: No viewer or editor in dashboard or CLI; correcting means editing the file by hand or asking the agent.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/Personalization.svelte:53 lists memories, :61 delete, MemoryModal.svelte:59 Edit Memory; backend/open_webui/routers/memories.py:548 update, :610 delete, :516 delete all", - "dify": "source read at 1.17.1, not driven: builders see and edit the agent's persistent files and generated build note (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, files.buildNote, workingDirectory.*) and conversation variables per conversation (api/controllers/console/app/conversation_variables.py:88); there is no learned-memory store to inspect Note: the agent's files are editable, but there is no memory of learned facts to review" + "dify": "source read at 1.17.1, not driven: builders see and edit the agent's persistent files and generated build note (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, files.buildNote, workingDirectory.*) and conversation variables per conversation (api/controllers/console/app/conversation_variables.py:88); there is no learned-memory store to inspect Note: the agent's files are editable, but there is no memory of learned facts to review", + "n8n": "source read at n8n@2.40.7, not driven: workflow chat memory can be read, overwritten or deleted with the Chat Memory Manager node (packages/@n8n/nodes-langchain/nodes/memory/MemoryManager/MemoryManager.node.ts:127-183 load, insert, override, delete); the Agents module Memory tab only configures memory (packages/frontend/editor-ui/src/features/agents/components/AgentMemoryPanel.vue:225-316) and searched 'memory' in packages/cli/src/modules/agents/*.controller.ts: no endpoint to list or edit remembered facts Note: Facts an agent remembers cannot be seen or corrected in the UI." } }, { @@ -2388,13 +2504,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:56 hard char budgets (memory 2200, user 1375) and :323-324 'IF FULL ... reissue as ONE batch that removes or shortens enough stale entries'; agent/background_review.py:1-6 background review updates existing memory; plugins/memory/holographic/__init__.py:1-5 trust scoring and temporal decay", "dify": "source read at 1.17.1, not driven: searched 'consolidat|dedupe memory|stale|forget' in dify-agent/src and api/core: dify-agent/src/dify_agent/runtime/compaction.py only compacts the current run's context; nothing merges or prunes stored memory", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/memory.py:410 review_memory_after_turn every N turns (memories.review_interval_turns) asks the model for add/replace/move/remove operations and tells it to prefer replace/remove over duplicates (:528 prompt), applied via routers/memories.py:234 update_memories Note: off by default: ENABLE_MEMORY_BACKGROUND_REVIEW (config.py:428)" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/memory.py:410 review_memory_after_turn every N turns (memories.review_interval_turns) asks the model for add/replace/move/remove operations and tells it to prefer replace/remove over duplicates (:528 prompt), applied via routers/memories.py:234 update_memories Note: off by default: ENABLE_MEMORY_BACKGROUND_REVIEW (config.py:428)", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/runtime/memory/observation-log-reflector.ts:76,123-160 a reflector model merges observations and marks superseded ones; memory-lifecycle.ts:1-12 active, superseded, dropped states; reflector model chosen in en.json:8034-8035 'Memory model' Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -2418,13 +2535,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31881 \"Context Chat (RAG over Nextcloud data): RAG over Files, Collectives and Analytics\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/datasets.py:446 create a knowledge base, datasets_document.py:384 upload documents, web/app/(commonLayout)/datasets/create; agents search it via Knowledge Retrieval (web/i18n/en-US/agent-v-2.json knowledgeRetrieval.*; dify-agent/src/dify_agent/layers/knowledge/layer.py)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/knowledge.py:318 POST /knowledge/create, file add and directories; src/routes/(app)/workspace/knowledge/[id]/+page.svelte, KnowledgeBase/AddContentMenu.svelte; attached to an agent at ModelEditor.svelte:1194; searched by tools/builtin.py:3151 query_knowledge_files", - "hermes-agent": "source read at v2026.9.24, not driven: plugins/memory/retaindb/__init__.py:515-564 retaindb_upload_file, retaindb_ingest_file, retaindb_list_files with semantic search (RetainDB cloud API); plugins/memory/openviking/__init__.py:1-6 OpenViking tiered knowledge with semantic search; searched 'knowledge base|vector|embedding' for a built-in document store: none Note: Only through a bundled memory-provider plugin backed by an outside service, driven by agent tools; no upload UI or built-in knowledge base." + "hermes-agent": "source read at v2026.9.24, not driven: plugins/memory/retaindb/__init__.py:515-564 retaindb_upload_file, retaindb_ingest_file, retaindb_list_files with semantic search (RetainDB cloud API); plugins/memory/openviking/__init__.py:1-6 OpenViking tiered knowledge with semantic search; searched 'knowledge base|vector|embedding' for a built-in document store: none Note: Only through a bundled memory-provider plugin backed by an outside service, driven by agent tools; no upload UI or built-in knowledge base.", + "n8n": "source read at n8n@2.40.7, not driven: Chat hub agents take knowledge files with semantic search (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:484 POST /chat/agents/:agentId/files, en.json:515); Agents module knowledge base for CSV, PDF, Markdown, TXT (packages/cli/src/modules/agents/agent-knowledge.controller.ts:48, en.json:7925); workflows load documents into vector stores (packages/@n8n/nodes-langchain/nodes/vector_store/) Note: Chat hub PDF upload needs semantic search configured by the owner." } }, { @@ -2448,12 +2566,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_builder.py:1656-1668 every run loads the working directory's .hermes.md, AGENTS.md chain, CLAUDE.md and .cursorrules plus the profile SOUL.md; agent/context_references.py:1 @file:, @folder:, @git:, @url: references per message; agent/context_file_sources.py:1-6 /context lists what was loaded Note: Context follows the working directory and per-message references; there is no named, reusable bundle of files and records attached to an agent.", "dify": "source read at 1.17.1, not driven: an agent's Files are kept in its persistent working directory and available in every run (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, workingDirectory.persistentFilesTooltip; api/models/agent.py:218 AgentHomeSnapshot); knowledge retrievals attach per agent. No named bundle of files and records that can be reused across agents Note: per-agent files, not a named reusable context bundle", - "open-webui": "source read at v0.11.4, not driven: per-agent bundle: ModelEditor.svelte:1194 Knowledge (knowledge bases, files, notes) stored in ModelMeta.knowledge (backend/open_webui/models/models.py:81) and injected every chat; per-project bundle: folders carry system_prompt and files applied to every chat in them (backend/open_webui/utils/middleware.py:2591-2602)" + "open-webui": "source read at v0.11.4, not driven: per-agent bundle: ModelEditor.svelte:1194 Knowledge (knowledge bases, files, notes) stored in ModelMeta.knowledge (backend/open_webui/models/models.py:81) and injected every chat; per-project bundle: folders carry system_prompt and files applied to every chat in them (backend/open_webui/utils/middleware.py:2591-2602)", + "n8n": "source read at n8n@2.40.7, not driven: per-agent knowledge files and instructions travel with the agent (packages/cli/src/modules/agents/agent-knowledge.controller.ts:36-48, en.json:7925); the instance-wide Context settings page ships only Preferences, with 'Sources' and 'Skills' marked 'Coming soon' (packages/frontend/editor-ui/src/features/settings/context/views/SettingsContextView.vue:68-77, en.json:3229-3233) Note: No named, reusable bundle of files and records to attach to several agents." } }, { @@ -2476,12 +2595,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/context_compressor.py:1-2 automatic compression summarises middle turns with an auxiliary model while head and tail stay; hermes_cli/commands.py:81 /compress with 'here [N]' and --preview", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/context_compaction.py:42 compact_messages_for_request summarises older turns past a token threshold (DEFAULT_CONTEXT_COMPACTION_PROMPT), retention % in config.py:2203; routers/chats.py:1271 POST /chats/{id}/compact manual; event chat.compacted", - "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/runtime/compaction.py:16-44 TieredCompaction clears old tool results then SummarizingCompaction keeps the last 20 messages and summarises older ones, wired in dify-agent/src/dify_agent/runtime/runner.py:365,402 Note: Agent v2 only; classic apps use a token window (api/core/memory/token_buffer_memory.py) without summarising" + "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/runtime/compaction.py:16-44 TieredCompaction clears old tool results then SummarizingCompaction keeps the last 20 messages and summarises older ones, wired in dify-agent/src/dify_agent/runtime/runner.py:365,402 Note: Agent v2 only; classic apps use a token window (api/core/memory/token_buffer_memory.py) without summarising", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/runtime/memory/memory-orchestrator.ts:615-650 observations stand in for older messages once an observer model has summarised them (observation-log-observer.ts:166 runObservationLogObserver, thresholds in packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:42-51); workflows only window history (packages/@n8n/nodes-langchain/nodes/memory/MemoryBufferWindow) Note: Summarising needs the opt-in Agents module; workflow memory nodes truncate instead." } }, { @@ -2504,12 +2624,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'record|relation|knowledge graph|graph traversal' in agent/ and tools/: agent/learning_graph.py:1-6 only draws a desktop graph of learned skills and memory chunks; plugins/memory/holographic/__init__.py:1-3 resolves entities in stored facts but offers no link-following over records Note: No record store, so nothing to follow links across.", "dify": "source read at 1.17.1, not driven: searched 'knowledge.?graph|graph_rag|graphrag' in api/core/rag and web/i18n/en-US: no hits; retrieval is vector, full-text, hybrid and parent-child chunks (api/core/rag/retrieval). A neo4j query tool exists only as an official marketplace plugin (tools/neo4j)", - "open-webui": "source read at v0.11.4, not driven: searched 'graph|relation|link' in backend/open_webui/retrieval and tools/builtin.py: retrieval is vector plus BM25 hybrid search over chunks; no entity or record relationship graph an agent can walk" + "open-webui": "source read at v0.11.4, not driven: searched 'graph|relation|link' in backend/open_webui/retrieval and tools/builtin.py: retrieval is vector plus BM25 hybrid search over chunks; no entity or record relationship graph an agent can walk", + "n8n": "source read at n8n@2.40.7, not driven: searched 'knowledge graph|graph|relation' in packages/cli/src/modules/agents, packages/@n8n/agents/src and packages/@n8n/nodes-langchain/nodes: no graph of related records for agents to follow (agent-dependency-index.service.ts tracks config dependencies, not data); no Neo4j or graph store node in packages/nodes-base/nodes" } }, { @@ -2533,12 +2654,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; no record or object-on-screen concept in agent/prompt_builder.py context sources (agent/prompt_builder.py:1656-1661)", "dify": "source read at 1.17.1, not driven: searched 'record|object context|linked records' in api/core/app and dify-agent/src: an answer is grounded only in knowledge retrieval and inputs the caller passes (web/public/embed.js:93 inputs); nothing resolves the record on screen or follows its links", - "open-webui": "source read at v0.11.4, not driven: searched 'record|object|linked' in backend/open_webui/utils/middleware.py and tools/builtin.py: there is no record model or 'record on screen' context; grounding is only on attached files, knowledge and notes" + "open-webui": "source read at v0.11.4, not driven: searched 'record|object|linked' in backend/open_webui/utils/middleware.py and tools/builtin.py: there is no record model or 'record on screen' context; grounding is only on attached files, knowledge and notes", + "n8n": "source read at n8n@2.40.7, not driven: searched 'record context|objectId|current record|on screen' in packages/cli/src/modules/agents, chat-hub and packages/frontend/editor-ui/src/features/ai: agents get no host-app record or its linked records; grounding is only in uploaded knowledge files or vector stores" } }, { @@ -2561,13 +2683,14 @@ "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/knowledge.py:697 external knowledge connections to existing Qdrant, Milvus or pgvector collections (src/lib/components/admin/Settings/ExternalKnowledge.svelte:469-471); OneDrive/SharePoint and Google Drive only as one-time file pickers (chat/MessageInput/InputMenu.svelte:399, :707); live SharePoint/wiki sync is the separate oikb project (README.md:98) Note: no live SharePoint or wiki connector in core", "hermes-agent": "source read at v2026.9.24, not driven: optional-mcps/atlassian/manifest.yaml:1-9 Nous-approved catalog entry for Confluence pages and Jira; optional-mcps/notion, microsoft-learn, deepwiki; skills/productivity/notion bundled skill; plugin-catalog/microsoft365.yaml:1-5 SharePoint and OneDrive via a community plugin Note: SharePoint only through a community catalog plugin; wikis such as Confluence and Notion through core catalog MCP entries.", - "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/external.py:153,339 connect an external knowledge API as a dataset; api/controllers/console/datasets/data_source.py:228,417 Notion import and sync in core; website crawl datasets/website.py:32; SharePoint and Confluence via official datasource plugins (langgenius/dify-official-plugins datasources/sharepoint_datasource, confluence_datasource) Note: SharePoint itself is a marketplace plugin; Notion wiki and the external-KB API are core" + "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/external.py:153,339 connect an external knowledge API as a dataset; api/controllers/console/datasets/data_source.py:228,417 Notion import and sync in core; website crawl datasets/website.py:32; SharePoint and Confluence via official datasource plugins (langgenius/dify-official-plugins datasources/sharepoint_datasource, confluence_datasource) Note: SharePoint itself is a marketplace plugin; Notion wiki and the external-KB API are core", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Microsoft/SharePoint/v2/actions/versionDescription.ts:26 and packages/nodes-base/nodes/Notion/v2/VersionDescription.ts:26 usableAsTool, Confluence node (packages/nodes-base/nodes/Confluence); Agents module connects outside vector stores Pinecone, Qdrant, Supabase, Postgres (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:305-371, en.json:7956-7958)" } }, { @@ -2590,12 +2713,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "no", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:38 `hermes skills browse` (paginated, filter by source) and :46 search across registries (tools/skills_hub_*.py: official, GitHub, skills.sh, ClawHub); web/src/i18n/en.ts skills.browseHub 'Browse skills hub' on web/src/pages/SkillsPage.tsx:140 hub view", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/skills/page.tsx workspace Skills library; api/controllers/console/workspace/skills.py:296 list with search by name or description and tags (web/i18n/en-US/skill.json skillManagement.searchPlaceholder, tags); agents add from it (agent-v-2.json skills.addMenu.workspace 'Add from library') Note: a workspace library, not a public catalogue", - "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/workspace/skills/+page.svelte and src/lib/components/workspace/Skills.svelte list every skill the user can read, with search, enable state and owner; backend/open_webui/routers/skills.py:63 GET /skills/list with access grants Note: org-internal catalogue; no public skill store link like the one for models and tools" + "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/workspace/skills/+page.svelte and src/lib/components/workspace/Skills.svelte list every skill the user can read, with search, enable state and owner; backend/open_webui/routers/skills.py:63 GET /skills/list with access grants Note: org-internal catalogue; no public skill store link like the one for models and tools", + "n8n": "source read at n8n@2.40.7, not driven: skills exist per agent only (packages/cli/src/modules/agents/agents-skills.controller.ts:21-82 CRUD under one agent); the shared place for skills is a placeholder, packages/frontend/editor-ui/src/features/settings/context/views/SettingsContextView.vue:68-71 'Skills' row with 'Coming soon' (en.json:3231-3232); searched 'catalog|marketplace|registry' in agents-skills.controller.ts and agent-skills.service.ts: none Note: Skills can be written or imported per agent, but there is nothing to browse." } }, { @@ -2618,12 +2742,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:54 `hermes skills install `; web/src/pages/SkillsPage.tsx:140 hub view with install; hermes_cli/commands.py:217 /skills install in chat; tools/skills_hub_install.py", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:811 /workspaces/current/agents//skills binds library skills to an agent; web/i18n/en-US/agent-v-2.json skills.addMenu.workspace 'Add from library' and skills.addMenu.upload 'Upload skill.zip' (embedded), limit of 20 library skills per agent (skills.workspaceSelector.limitReached)", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1202 SkillsSelector attaches a skill to an agent in one pick; users can also pull a skill into one chat with the '$' mention (src/lib/components/chat/MessageInput/Commands/Skills.svelte, backend/open_webui/utils/skills.py:23 extract_skill_ids_from_messages)" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1202 SkillsSelector attaches a skill to an agent in one pick; users can also pull a skill into one chat with the '$' mention (src/lib/components/chat/MessageInput/Commands/Skills.svelte, backend/open_webui/utils/skills.py:23 extract_skill_ids_from_messages)", + "n8n": "source read at n8n@2.40.7, not driven: en.json:8062-8063 'Upload SKILL.md' and 'Upload folder' in the agent's Skills section (packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts), saved by packages/cli/src/modules/agents/agents-skills.controller.ts:40 POST /:agentId/skills Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -2646,12 +2771,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_tool.py:613 reads metadata.hermes.* (agentskills.io) tags and related_skills and :645 agentskills.io optional compatibility field; tools/skill_manager_tool.py:1-7 SKILL.md + references/ templates/ scripts/ assets/ layout; hermes_cli/subcommands/skills.py:148 publish to GitHub or ClawHub", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/skill.json emptyAction.importDescription 'Bring a .zip with SKILL.md, in the agentskills.io format', errors.missingSkillMd; api/controllers/console/workspace/skills.py:385 import and :494 export of the package; agent-v-2.json skills.upload.warning.specification 'must follow the Agent Skills specification'", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Skills.svelte:272 import accepts .md, :306-312 parses SKILL.md frontmatter; backend/open_webui/utils/terminals.py:247 get_terminal_skill reads .agents/skills//SKILL.md directories with resources (:276); utils/skills.py:37 authoring standards (name, description frontmatter, scripts/ references/ assets/) Note: DB skills are single-file; full skill folders only through Open Terminal" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Skills.svelte:272 import accepts .md, :306-312 parses SKILL.md frontmatter; backend/open_webui/utils/terminals.py:247 get_terminal_skill reads .agents/skills//SKILL.md directories with resources (:276); utils/skills.py:37 authoring standards (name, description frontmatter, scripts/ references/ assets/) Note: DB skills are single-file; full skill folders only through Open Terminal", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts reads SKILL.md with YAML frontmatter name and description plus markdown references (en.json:8064-8080), but :56-57 rejects a scripts/ folder, en.json:8070 'Scripts aren't supported for skills yet' Note: Imports agentskills.io-style SKILL.md without scripts. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -2674,12 +2800,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/background_review.py:1-6 after each turn a forked agent asks whether any skill should be updated and patches it via skill_manage; hermes_cli/commands.py:124 /refine reviews the conversation and saves lessons to skills; agent/curator.py:1-7 curator may patch skills", "dify": "source read at 1.17.1, not driven: in Build mode the agent edits its own skills and files from the build conversation and holds them as a build draft to Apply (agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you'; api/controllers/console/agent/roster.py:876,941); the Skill Builder rewrites a skill on request (api/controllers/console/workspace/skills.py:516 assist/messages). Nothing proposes improvements from production runs Note: improves from the builder's build chat, not from what it learned in runs", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:35 SKILLS_CREATE_RE '/skills:create' makes the model distill the current chat into a SKILL.md and save it (:81-115), which can rewrite an existing skill; it runs only when a user types the command and needs an Open Terminal (:133); searched 'improve|propose|revision' in utils/skills.py and routers/skills.py: no agent-initiated proposals" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:35 SKILLS_CREATE_RE '/skills:create' makes the model distill the current chat into a SKILL.md and save it (:81-115), which can rewrite an existing skill; it runs only when a user types the command and needs an Open Terminal (:133); searched 'improve|propose|revision' in utils/skills.py and routers/skills.py: no agent-initiated proposals", + "n8n": "source read at n8n@2.40.7, not driven: improvement runs through the builder assistant on request: en.json:653,657 'Fix with Assistant' sends failed tool calls from a preview to the builder, and eval reviews 'Send feedback to assistant' (en.json:8313); searched 'improve|propose' in packages/cli/src/modules/agents and packages/@n8n/agents/src/runtime/skills: no agent proposing skill revisions from its own runs Note: A person triggers the fix; the agent does not propose skill updates itself. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -2702,12 +2829,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/write_approval.py:1-9 skills.write_approval stages agent skill writes under pending/skills/.json with a difflib diff; hermes_cli/commands.py:217-221 /skills pending|diff|approve|reject|approval; hermes_cli/write_approval_commands.py:1 Note: Off by default; the operator switches the gate on.", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/build-draft-changes-panel.tsx lists changed sections as Updated/Rewritten with Apply or Discard (build-draft-bar.tsx; roster.py:932 DELETE build-draft, :941 apply); skill drafts publish or restore (skills.py:678,703). Searched 'diff|compare' in web/i18n/en-US/skill.json and agent-v-2.json: no side-by-side difference Note: accept or reject yes, a visible diff no", - "open-webui": "source read at v0.11.4, not driven: searched 'draft|diff|review|version|history' in backend/open_webui/routers/skills.py and models/skills.py: skills are edited in place (routers/skills.py:274 update); no proposed-change queue, diff or accept/reject (prompts have versions at routers/prompts.py:384, skills do not)" + "open-webui": "source read at v0.11.4, not driven: searched 'draft|diff|review|version|history' in backend/open_webui/routers/skills.py and models/skills.py: skills are edited in place (routers/skills.py:274 update); no proposed-change queue, diff or accept/reject (prompts have versions at routers/prompts.py:384, skills do not)", + "n8n": "source read at n8n@2.40.7, not driven: builder edits land in a draft; the owner can preview, publish or 'Revert changes' to the published version (en.json:7765, packages/cli/src/modules/agents/agent-publish.controller.ts:21-111 publish, revert, versions); searched 'diff' in packages/frontend/editor-ui/src/features/agents: no side-by-side diff of a skill change Note: Accept or reject happens at agent level by publishing or reverting, without a diff. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -2730,12 +2858,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "no", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/background_review.py:463 'CREATE A NEW CLASS-LEVEL UMBRELLA SKILL when no existing skill covers the class' in the post-turn review prompt; tools/skill_manager_tool.py:1-5 new skills land in ~/.hermes/skills/; hermes_cli/commands.py:232 /learn builds a skill on request", "dify": "source read at 1.17.1, not driven: agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you': the agent writes skills while the builder chats in Build mode (roster.py:846 build-draft/checkout); searched 'auto.?create|learn|after solving' in dify-agent/src: no path where an agent writes a skill on its own after a production run Note: only inside a builder-driven Build session", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:81 _build_skill_create_prompt, default request 'the workflow we just went through in this conversation ... distill them into a reusable skill' (:84-86); triggered only by the user's /skills:create command and saved to the Open Terminal (:108), not on the agent's own initiative" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:81 _build_skill_create_prompt, default request 'the workflow we just went through in this conversation ... distill them into a reusable skill' (:84-86); triggered only by the user's /skills:create command and saved to the Open Terminal (:108), not on the agent's own initiative", + "n8n": "source read at n8n@2.40.7, not driven: skills are created by the builder assistant only when a person asks (packages/cli/src/modules/agents/builder/skills/target-skills.skill.ts:9-19 create_skills; builder/agents-builder-prompts.ts:215); searched 'create_skills|write_skill' in packages/@n8n/agents/src: no runtime tool letting an agent write its own skill after a task" } }, { @@ -2758,12 +2887,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/curator.py:1-7 inactivity-triggered curator runs every interval_hours, archives stale skills (never deletes), consolidates duplicates into umbrella skills, honours pins; hermes_cli/curator.py:98-163 `hermes curator` status/run --consolidate; hermes_cli/commands.py:245 /curator pin|archive|list-archived Note: The LLM merge pass is opt-in (curator.consolidate); archiving runs by default.", "dify": "source read at 1.17.1, not driven: searched 'curator|merge skill|duplicate skill|archive unused|stale' in api/services/skill_management_service.py, api/schedule and web/i18n/en-US/skill.json: only manual duplicate and delete (api/controllers/console/workspace/skills.py:474, skill.json deleteDialog); no scheduled merge or archive", - "open-webui": "source read at v0.11.4, not driven: searched 'curator|merge|archive|dedupe|unused' in backend/open_webui/routers/skills.py, models/skills.py, utils/skills.py and utils/automations.py: no scheduled job that merges or archives skills" + "open-webui": "source read at v0.11.4, not driven: searched 'curator|merge|archive|dedupe|unused' in backend/open_webui/routers/skills.py, models/skills.py, utils/skills.py and utils/automations.py: no scheduled job that merges or archives skills", + "n8n": "source read at n8n@2.40.7, not driven: searched 'curator|archive|merge|unused' in packages/cli/src/modules/agents/agent-skills.service.ts, agents-skills.controller.ts and packages/@n8n/agents/src/runtime/skills: no scheduled merging of duplicate skills or archiving of unused ones" } }, { @@ -2786,12 +2916,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/skill_usage.py:1-6 per-skill use counts, provenance (bundled, hub, agent-created) and lifecycle active -> stale -> archived; web/src/i18n/en.ts analytics.topSkills with loads, edits, last used on AnalyticsPage; hermes_cli/subcommands/skills.py:28 trust/untrust and :85 audit (security scan verdicts) Note: Signals exist (usage, lifecycle, trust, scan) but no maturity or proven rating shown per skill before use.", "dify": "source read at 1.17.1, not driven: searched 'maturity|proven|rating|success rate|eval' in web/i18n/en-US/skill.json and api/services/skill_management_service.py: a skill shows only draft/published state, version number and 'Used by N agents' (skill.json detail.referencedBy_one, referenceCount); no maturity or proof signal Note: usage count is the only trust hint", - "open-webui": "source read at v0.11.4, not driven: searched 'maturity|usage count|rating|verified|stable' in backend/open_webui/models/skills.py, routers/skills.py and src/lib/components/workspace/Skills*: a skill has name, description, content, meta, is_active (models/skills.py:20-32), no maturity or proof signal" + "open-webui": "source read at v0.11.4, not driven: searched 'maturity|usage count|rating|verified|stable' in backend/open_webui/models/skills.py, routers/skills.py and src/lib/components/workspace/Skills*: a skill has name, description, content, meta, is_active (models/skills.py:20-32), no maturity or proof signal", + "n8n": "source read at n8n@2.40.7, not driven: searched 'maturity|proven|usage count|success rate' in packages/cli/src/modules/agents/agent-skills.service.ts, agents-skills.controller.ts and packages/frontend/editor-ui/src/features/agents/components/AgentSkill*.vue: a skill has name, description, instructions, allowed tools and references only" } }, { @@ -2814,12 +2945,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:112 `skills diff` against the stock bundled version and :94 reset; agent/curator_backup.py:1-6 tar.gz snapshot of the whole skills tree before each curator pass with rollback; tools/write_approval.py:1-9 staged diffs for pending writes Note: No per-skill version history; rollback is whole-tree curator snapshots and compare is only against the bundled stock copy.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:743,758 versions list and detail, :703 restore a version to draft; web/i18n/en-US/skill.json detail.versions, versionPublishNote, restoreVersion. Searched 'compare|diff' in skill.json: no comparison of two versions Note: history and rollback yes, compare no", - "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/skills.py and routers/skills.py: updates overwrite content (routers/skills.py:274); version history exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)" + "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/skills.py and routers/skills.py: updates overwrite content (routers/skills.py:274); version history exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)", + "n8n": "source read at n8n@2.40.7, not driven: skills live inside the agent config, so they ride the agent's publish history: packages/cli/src/modules/agents/agent-publish.controller.ts:87-111 revert-to-version and GET versions, en.json:7780-7797 'Publish history', 'Revert to this version'; searched 'diff|compare' in packages/frontend/editor-ui/src/features/agents: no comparison of two versions and no per-skill history Note: Roll back yes, compare no, and only at agent level. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -2842,12 +2974,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:165-171 `skills tap add owner/repo` adds a GitHub repo as a skill source; tools/skills_hub_github.py search and install; hermes_cli/subcommands/skills.py:148-153 `skills publish --to github --repo`", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 import takes only an uploaded zip (request.files['file']); searched 'github|repository|publish to' in api/services/skill_management_service.py and skill.json: no GitHub discovery, install or publish", - "open-webui": "source read at v0.11.4, not driven: searched 'github|url' in backend/open_webui/routers/skills.py: no URL or GitHub install and no publish; GitHub raw loading exists only for tools and functions (routers/tools.py:247 github_url_to_raw_url, :264 /tools/load/url)" + "open-webui": "source read at v0.11.4, not driven: searched 'github|url' in backend/open_webui/routers/skills.py: no URL or GitHub install and no publish; GitHub raw loading exists only for tools and functions (routers/tools.py:247 github_url_to_raw_url, :264 /tools/load/url)", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts imports a local SKILL.md file or folder only (en.json:8062-8063); searched 'github' in that file and in packages/cli/src/modules/agents/agents-skills.controller.ts: no GitHub search, install or publish" } }, { @@ -2870,12 +3003,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:319-322 corrections for a kind of work belong in that task's skill via skill_manage; agent/background_review.py:1-6 post-turn review patches the skill with the lesson; hermes_cli/commands.py:124 /refine saves lessons to memory/skills Note: Old partial; the review loop writes lessons into skills.", "dify": "source read at 1.17.1, not driven: searched 'lesson|learning|rule' in dify-agent/src, api/services/skill_management_service.py and web/i18n/en-US/skill.json: no mechanism that turns repeated run lessons into skill rules; the build note (agent-v-2.json files.buildNote) records build-session setup only", - "open-webui": "source read at v0.11.4, not driven: searched 'learning|lesson|rule' in backend/open_webui/utils/skills.py, utils/memory.py and routers/skills.py: run lessons go to per-user memory (utils/memory.py:410), never into a skill's rules" + "open-webui": "source read at v0.11.4, not driven: searched 'learning|lesson|rule' in backend/open_webui/utils/skills.py, utils/memory.py and routers/skills.py: run lessons go to per-user memory (utils/memory.py:410), never into a skill's rules", + "n8n": "source read at n8n@2.40.7, not driven: lessons from runs go into episodic memory, not into skill rules (packages/@n8n/agents/src/runtime/memory/episodic-memory.ts, observation-log-reflector.ts); searched 'learning|lesson|rule' in packages/cli/src/modules/agents/agent-skills.service.ts and packages/@n8n/agents/src/runtime/skills/active-skills.ts: nothing writes back to a skill" } }, { @@ -2898,12 +3032,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "no", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/skills_hub.py:1260-1280 `skills snapshot export` writes only hub identifiers and taps to JSON; hermes_cli/subcommands/profile.py:115 profile export carries all skills; hermes_cli/subcommands/skills.py:148 publish to GitHub/ClawHub; skills are plain SKILL.md folders on disk Note: No single-skill export action; a skill is exported by copying its folder, publishing it, or exporting the whole profile.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:494 /workspaces/current/skills//export returns the skill package; single files downloadable (web/i18n/en-US/skill.json detail.downloadFile)", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/skills.py:123 GET /skills/export; src/lib/components/workspace/Skills/SkillMenu.svelte:16 per-skill Export, Skills.svelte:91 Export JSON (permission workspace.skills_export) Note: exports JSON, not SKILL.md" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/skills.py:123 GET /skills/export; src/lib/components/workspace/Skills/SkillMenu.svelte:16 per-skill Export, Skills.svelte:91 Export JSON (permission workspace.skills_export) Note: exports JSON, not SKILL.md", + "n8n": "source read at n8n@2.40.7, not driven: the agent's 'Export JSON' (packages/frontend/editor-ui/src/features/agents/views/AgentBuilderView.vue:1413,1466-1475) writes the agent config, in which a skill is only a {type:'skill', id} reference (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:189-198); searched 'export|download' in AgentSkillViewer.vue and AgentSkillModal.vue: no skill file export" } }, { @@ -2926,12 +3061,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:54-58 install takes a registry identifier or a direct HTTP(S) URL to a SKILL.md; :165-171 taps add any GitHub repo as a source; tools/skills_hub_sources.py", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 the only import path is a multipart zip upload; searched 'url|source address|remote' in the skill import payload and skill.json: no install from an outside address", - "open-webui": "source read at v0.11.4, not driven: skills import from a local .md or .json file (src/lib/components/workspace/Skills.svelte:272) and are read live from an attached Open Terminal's .agents/skills folder (backend/open_webui/utils/terminals.py:263 GET {terminal}/skills/{name}); searched 'url|load' in routers/skills.py: no install from an outside address" + "open-webui": "source read at v0.11.4, not driven: skills import from a local .md or .json file (src/lib/components/workspace/Skills.svelte:272) and are read live from an attached Open Terminal's .agents/skills folder (backend/open_webui/utils/terminals.py:263 GET {terminal}/skills/{name}); searched 'url|load' in routers/skills.py: no install from an outside address", + "n8n": "source read at n8n@2.40.7, not driven: skill import reads files the user selects (packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts, en.json:8062-8065); searched 'url|fetch(' in that file and 'source' in packages/cli/src/modules/agents/agents-skills.controller.ts: no install from an outside address" } }, { @@ -2954,12 +3090,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'eval|with and without|baseline' in tools/skill*.py, hermes_cli/subcommands/skills.py and optional-skills/*/SKILL.md: no skill test-case runner; tools/skillevaluator_scan.py:1-7 is an advisory security scan on install; evals/ holds developer regression harnesses (evals/compaction, evals/tool_search ...) with no user surface", "dify": "source read at 1.17.1, not driven: searched 'evaluation|eval_set|test case' in api/controllers and web/i18n/en-US: only tracing-provider blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix 'evaluation') and dataset hit testing; no run of a skill against cases with and without it", - "open-webui": "source read at v0.11.4, not driven: searched 'eval|test case|benchmark' in backend/open_webui/routers/skills.py, utils/skills.py and routers/evaluations.py: evaluations compare models by user feedback and arena ELO (routers/evaluations.py:222 leaderboard), nothing runs a skill against test cases with and without it" + "open-webui": "source read at v0.11.4, not driven: searched 'eval|test case|benchmark' in backend/open_webui/routers/skills.py, utils/skills.py and routers/evaluations.py: evaluations compare models by user feedback and arena ELO (routers/evaluations.py:222 leaderboard), nothing runs a skill against test cases with and without it", + "n8n": "source read at n8n@2.40.7, not driven: test-case runs exist for workflows (packages/cli/src/evaluation.ee/test-runs.controller.ee.ts, Evaluation nodes in packages/nodes-base/nodes/Evaluation) and for Agents-module agents (packages/cli/src/modules/agent-evals/agent-evals.controller.ts, gated per user by PostHog flag in agent-evals-flag-gate.ts:17-24); searched 'with and without|baseline|skill' in packages/cli/src/modules/agent-evals: no with/without-skill comparison Note: Workflow evaluations count against the licence quota quota:evaluations:maxWorkflows (packages/@n8n/constants/src/index.ts:73); agent evals are an opt-in module behind a rollout flag." } }, { @@ -2988,7 +3125,7 @@ "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugins/model-providers/ ships anthropic, azure-foundry, bedrock, gemini, vertex, deepseek, openrouter, xai, nvidia, huggingface and 30 more provider plugins; hermes_cli/subcommands/model.py `hermes model`; web/src/pages/ModelsPage.tsx and ProfilesPage.tsx:673 model picker Note: Mistral via OpenRouter or a custom endpoint; no dedicated Mistral plugin directory.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/model_providers.py:148,200 provider list and credentials; web/i18n/en-US/common.json:378-379 'Please install a model provider first ... from the Marketplace': core ships no provider, OpenAI, Anthropic, Mistral etc. are official plugins (langgenius/dify-official-plugins models/openai, anthropic, mistralai, ...) Note: every provider is a marketplace plugin run by the plugin daemon; old yes rested on a feature line", - "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/ ships chat model nodes for OpenAI (LMChatOpenAi), Anthropic (LMChatAnthropic), Mistral (LmChatMistralCloud), Google Gemini/Vertex, AWS Bedrock, Azure OpenAI, Cohere, DeepSeek, Groq, xAI, OpenRouter and more (26 directories)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:129 native Anthropic model listing and :485 anthropic-version headers (utils/anthropic.py), :208 Azure AD auth, :890 Azure; any OpenAI-compatible provider such as OpenAI, Mistral, Groq, OpenRouter (README.md:28); admin UI src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte Note: old partial rested on a feature row; the code connects OpenAI, Anthropic natively and Mistral through the compatible API" } }, @@ -3012,13 +3149,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31885 \"Local model backend: Runs against local LLM ExApp / Ollama-compatible backends\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 Ollama native /api/tags probe and LM Studio /api/v1/models with load-on-demand; hermes_cli/web_routers/local_models.py dashboard routes", "dify": "source read at 1.17.1, not driven: no local runtime in core (web/i18n/en-US/common.json:378 install a provider first); official plugins models/ollama, localai, xinference, openllm, triton_inference_server, huggingface_tei in langgenius/dify-official-plugins Note: marketplace plugin only", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/ollama.py full Ollama proxy with pull/manage (src/lib/components/admin/Settings/Connections/ManageOllamaModal.svelte), load balancing across URLs (:863 random.choice); openai.py:276 LM Studio provider; bundled :ollama image (README.md:26)" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/ollama.py full Ollama proxy with pull/manage (src/lib/components/admin/Settings/Connections/ManageOllamaModal.svelte), load balancing across URLs (:863 random.choice); openai.py:276 LM Studio provider; bundled :ollama image (README.md:26)", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatOllama and LMChatLemonade chat model nodes, EmbeddingsOllama for local embeddings; Ollama vendor node packages/@n8n/nodes-langchain/nodes/vendors/Ollama" } }, { @@ -3042,13 +3180,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31390 \"AppAPI ExApp + Task Processing backend: Python ExApp requiring AppAPI >=3.1 and a tool-calling text2text provider (llm2 or integration_openai).\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/model_setup_flows_custom.py:1-3 custom OpenAI-compatible endpoint wizard (custom_providers / providers.); plugins/model-providers/custom", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:865 GET /openai/models/{url_idx} over any configured base URL + key; src/lib/components/AddConnectionModal.svelte and admin/Settings/Connections/OpenAIConnection.svelte add arbitrary OpenAI-compatible endpoints", - "dify": "source read at 1.17.1, not driven: official plugin langgenius/dify-official-plugins models/openai_api_compatible adds any OpenAI-compatible endpoint; core only provides the provider framework (api/controllers/console/workspace/model_providers.py:148) Note: marketplace plugin only" + "dify": "source read at 1.17.1, not driven: official plugin langgenius/dify-official-plugins models/openai_api_compatible adds any OpenAI-compatible endpoint; core only provides the provider framework (api/controllers/console/workspace/model_providers.py:148) Note: marketplace plugin only", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/credentials/OpenAiApi.credentials.ts:35-36 'Base URL' field, :80 baseURL taken from it, so the OpenAI chat model node talks to any OpenAI-compatible server; OpenRouter and Vercel AI Gateway nodes too (nodes/llms/LmChatOpenRouter, LmChatVercelAiGateway)" } }, { @@ -3072,13 +3211,14 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31880 \"Unified AI Task Processing GUI: Frontend for the Nextcloud Task Processing API\"", "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud|taskprocessing' repo-wide (excluding website/): none outside one test; no provider plugin for Nextcloud's AI task processing in plugins/model-providers/", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|taskprocessing' in api/ and web/: no hits; models come only from Dify provider plugins", - "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|taskprocessing|task_processing' in backend/open_webui: no connection to Nextcloud AI task processing" + "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|taskprocessing|task_processing' in backend/open_webui: no connection to Nextcloud AI task processing", + "n8n": "source read at n8n@2.40.7, not driven: n8n's own centrally set-up models can be reused: chat hub providers configured once by an admin (packages/@n8n/api-types/src/chat-hub.ts:574-585, packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:59) and 'Included in n8n' credit models (en.json:5450); searched 'nextcloud|taskprocessing' in packages/@n8n/nodes-langchain/nodes and packages/cli/src/modules: no provider backed by Nextcloud AI task processing Note: Missing Nextcloud part: TaskProcessing as a model source. Rewritten under the lane ruling of 2026-09-26 (was no)." } }, { @@ -3102,12 +3242,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:898 GET /api/v1/models and :1109 POST /api/v1/chat/completions (OpenAI-compatible), :2003 /api/v1/messages (Anthropic-compatible) expose every agent, custom models included, to outside clients with an API key; no Nextcloud TaskProcessing provider Note: old yes; any OpenAI-compatible client can use the agents, but nothing registers them inside Nextcloud", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions and /v1/responses serve the agent to any OpenAI client (per profile under /p//); searched 'nextcloud|taskprocessing' repo-wide: no Nextcloud provider registration Note: Another system can use Hermes as an OpenAI-compatible text model; there is no Nextcloud text-generation provider.", - "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|text2text provider' in api/ and web/: nothing registers Dify apps as a provider for another platform's AI task framework; apps are reachable only through Dify's own service API (api/controllers/service_api/app/completion.py) and MCP (api/controllers/mcp/mcp.py:44)" + "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|text2text provider' in api/ and web/: nothing registers Dify apps as a provider for another platform's AI task framework; apps are reachable only through Dify's own service API (api/controllers/service_api/app/completion.py) and MCP (api/controllers/mcp/mcp.py:44)", + "n8n": "source read at n8n@2.40.7, not driven: agents are offered to the rest of n8n: workflows call Agents-module agents (session origin 'Workflow', en.json agentSessions.origin.workflow) and outside tools reach them through the MCP call_agent tool (packages/cli/src/modules/mcp/mcp-scopes.ts:73); searched 'chat/completions' as a served route in packages/cli/src: none, so nothing registers with Nextcloud task processing Note: Missing Nextcloud part: registering as a TaskProcessing text provider. Rewritten under the lane ruling of 2026-09-26 (was no)." } }, { @@ -3135,7 +3276,7 @@ "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/profiles.py:942 PUT /api/profiles/{name}/model per profile (web/src/pages/ProfilesPage.tsx:673); hermes_cli/config_defaults.py:1332-1338 delegation block sets a separate subagent model; hermes_cli/commands.py:157 /model per session; cron jobs carry their own model (hermes_cli/subcommands/cron.py:23 create)", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 each agent picks its own provider and model; each workflow LLM/Agent node and each classic app carries its own model config (api/controllers/console/app/model_config.py)", - "n8n": "docs-only: competitor_features#3907 \"Anthropic Node: Update credential test to use available model: From n8n@2.14.0 (2026-03-24)\"", + "n8n": "source read at n8n@2.40.7, not driven: each AI Agent node takes its own chat model sub-node (packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:46 ai_languageModel required); Agents-module agents store their own provider/model (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:446) and sub-agents can route by difficulty (:161-171); chat agents keep a model each (packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:107)", "open-webui": "source read at v0.11.4, not driven: each workspace model has its own base_model_id and params (backend/open_webui/models/models.py:118-120; ModelEditor.svelte:856); automations pick a model per task (models/automations.py:75 model_id, src/lib/components/automations/ModelDropdown.svelte)" } }, @@ -3159,12 +3300,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'allowed_models|model_allowlist|blocked_models' in *.py: only tools/mcp_tool_sampling.py:181 limits which models an MCP server's sampling requests may use; no organisation or tenant model in hermes_cli/profiles.py:538 ProfileInfo Note: No tenants and no model allowlist per group of agents.", "dify": "source read at 1.17.1, not driven: providers and credentials are per workspace (api/controllers/console/workspace/model_providers.py:148,200); api/controllers/console/workspace/models.py:519-545 enable/disable individual models for the workspace so its apps cannot pick them Note: per workspace; per-role model rights (permission-keys.json plugin.model_config) need enterprise RBAC", - "open-webui": "source read at v0.11.4, not driven: model access is per user or group through access grants (backend/open_webui/utils/models.py:465 check_model_access, main.py:1151; admin/Settings/Models access control); searched 'tenant|organization' in backend/open_webui/routers and models: no tenant scope Note: group-level model allow-lists only; no organisation or tenant concept" + "open-webui": "source read at v0.11.4, not driven: model access is per user or group through access grants (backend/open_webui/utils/models.py:465 check_model_access, main.py:1151; admin/Settings/Models access control); searched 'tenant|organization' in backend/open_webui/routers and models: no tenant scope Note: group-level model allow-lists only; no organisation or tenant concept", + "n8n": "source read at n8n@2.40.7, not driven: Chat hub admin settings restrict providers and models instance-wide (packages/@n8n/api-types/src/chat-hub.ts:574-584 enabled and allowedModels per provider, packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:59 GlobalScope chatHub:manage); per-project node type policies can block model nodes (packages/cli/src/modules/type-availability-policies/type-availability-policy-project.controller.ts:19-24, @Licensed NODE_TYPE_POLICIES) Note: Instance-wide for chat; per-project blocking is enterprise-licensed and in a module not loaded by default; no organisation tenancy." } }, { @@ -3188,12 +3330,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:715-790 auxiliary. provider/model per feature: vision, compression, approval, title_generation, curator, kanban_decomposer, profile_describer, goal_judge, background_review, monitor, moa_aggregator and more", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/models.py:205 default-model per model type (system reasoning, embedding, rerank, speech2text, tts) and :633 models by type; every app, node, knowledge base and generator picks its own model, so summaries and triage can run on different providers", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/config.py:2180 TASK_MODEL and :2182 TASK_MODEL_EXTERNAL for titles, tags, queries and autocomplete, set in src/lib/components/admin/Settings/Interface.svelte:180; separate engines per feature in admin Settings Audio, Images, Documents (embedding, reranker), WebSearch" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/config.py:2180 TASK_MODEL and :2182 TASK_MODEL_EXTERNAL for titles, tags, queries and autocomplete, set in src/lib/components/admin/Settings/Interface.svelte:180; separate engines per feature in admin Settings Audio, Images, Documents (embedding, reranker), WebSearch", + "n8n": "source read at n8n@2.40.7, not driven: every AI node chooses its own model: Summarization Chain, Text Classifier, Information Extractor and AI Agent each take a separate chat model sub-node (packages/@n8n/nodes-langchain/nodes/chains/ChainSummarization, chains/TextClassifier, agents/Agent/utils.ts:46-59); Instance AI has its own model setting (packages/cli/src/modules/instance-ai/instance-ai-model.service.ts)" } }, { @@ -3217,12 +3360,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:24 fallback_providers chain; hermes_cli/subcommands/fallback.py:10-24 `hermes fallback add|list|remove|clear`; hermes_cli/fallback_config.py:1 effective chain; agent/fallback_cooldown.py cools a failing provider", "dify": "source read at 1.17.1, not driven: api/core/model_manager.py:440-477,1003-1066 load balancing rotates credentials of the same model and cools down one on rate-limit or connection errors; off by default (api/configs/feature/__init__.py:813 MODEL_LB_ENABLED=False). A second provider only by wiring a fail branch to another LLM node (web/i18n/en-US/workflow.json nodes.common.errorHandle.failBranch) Note: same-model credential failover, not provider fallback", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1137-1147 ENABLE_CUSTOM_MODEL_FALLBACK (env.py:1035, off by default) swaps to the first default model only when a custom model's base model is missing; Ollama spreads requests over URLs (routers/ollama.py:863 random.choice) but does not retry another provider on an error; searched 'failover|retry' in routers/openai.py: none Note: no runtime failover when a provider call fails" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1137-1147 ENABLE_CUSTOM_MODEL_FALLBACK (env.py:1035, off by default) swaps to the first default model only when a custom model's base model is missing; Ollama spreads requests over URLs (routers/ollama.py:863 random.choice) but does not retry another provider on an error; searched 'failover|retry' in routers/openai.py: none Note: no runtime failover when a provider call fails", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:37-40,118-119 'Enable Fallback Model' adds a second model input used when the primary fails" } }, { @@ -3246,12 +3390,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'sensitiv|classification|pii.*route|route.*pii' in agent/ and hermes_cli/: no data-class routing; hermes_cli/model_data_policy_guard.py:1-6 only warns at model selection when a tier trains on prompts; agent/redact.py redacts secrets from logs and output Note: No rule that keeps sensitive data away from particular models.", "dify": "source read at 1.17.1, not driven: searched 'sensitiv|classification|pii|route.*model' in api/core/model_manager.py, api/core/moderation and dify-agent/src: no routing of data by sensitivity; only content moderation (api/core/moderation) that blocks or replaces text", - "open-webui": "source read at v0.11.4, not driven: searched 'sensitiv|classification|pii|confidential' in backend/open_webui/utils/middleware.py, utils/models.py and main.py: routing follows the chosen model only; no data-classification based model selection" + "open-webui": "source read at v0.11.4, not driven: searched 'sensitiv|classification|pii|confidential' in backend/open_webui/utils/middleware.py, utils/models.py and main.py: routing follows the chosen model only; no data-classification based model selection", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/ModelSelector/ModelSelector.node.ts:73-124 routes to a model by rules on workflow data, and the Guardrails node detects PII (packages/@n8n/nodes-langchain/nodes/Guardrails); searched 'sensitiv|classification' in packages/cli/src/modules/agents: no built-in data-class-to-model policy Note: Must be hand-built from a Guardrails check plus Model Selector rules." } }, { @@ -3275,12 +3420,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugin-catalog/claude-subscription-directsdk.yaml:1-5 official NousResearch catalog plugin runs Hermes turns through the logged-in claude CLI (Agent SDK path); skills/autonomous-ai-agents/claude-code/SKILL.md:1-3 bundled skill delegates coding to the Claude Code CLI; tools/environments/docker.py can host the terminal Note: The turn runner is a catalog plugin, not core, and nothing places the claude CLI in its own container by design.", "dify": "source read at 1.17.1, not driven: searched 'claude code|claude cli|anthropic cli' in api/, dify-agent/src and dify-agent-runtime: model turns go through provider plugins (dify-agent/src/dify_agent/layers/dify_plugin/llm_layer.py); no runner that drives the claude command line tool", - "open-webui": "source read at v0.11.4, not driven: searched 'claude|subprocess|cli' in backend/open_webui/utils and routers: Anthropic is called over HTTP (utils/anthropic.py:15 ANTHROPIC_VERSION); no runner that shells out to the claude CLI in a container" + "open-webui": "source read at v0.11.4, not driven: searched 'claude|subprocess|cli' in backend/open_webui/utils and routers: Anthropic is called over HTTP (utils/anthropic.py:15 ANTHROPIC_VERSION); no runner that shells out to the claude CLI in a container", + "n8n": "source read at n8n@2.40.7, not driven: searched 'claude-code|claude code|claude-agent-sdk' in packages/cli/src, packages/@n8n/nodes-langchain/nodes, packages/@n8n/agents/src and packages/@n8n/instance-ai/src: none; Anthropic is reached only through its API (packages/@n8n/nodes-langchain/nodes/llms/LMChatAnthropic)" } }, { @@ -3308,7 +3454,7 @@ "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/secrets.py:8-20 `hermes secrets bitwarden|onepassword` pull provider keys from Bitwarden Secrets Manager or 1Password (agent/secret_sources/bitwarden.py:1-5, onepassword.py) so they need not sit in .env; agent/credential_pool.py:1 shared credential pool per provider; agent/secret_scope.py:1-10 profile-scoped key resolution in the multiplexed gateway", "dify": "source read at 1.17.1, not driven: model keys live once per workspace provider, encrypted, with named credentials and switching (api/controllers/console/workspace/model_providers.py:200,291; models.py:342,495); agents and apps reference the provider, never hold the key; api/models/credential_permission.py:1-35 limits which members may use a credential Note: per-member credential access needs enterprise RBAC (permission-keys.json credential.use)", - "n8n": "docs-only: competitor_features#3040 \"Credential Management: Encrypted credential storage for all integrations\"", + "n8n": "source read at n8n@2.40.7, not driven: model keys are stored once as encrypted credentials (packages/core/src/encryption/cipher.ts:9-10 AES-256) and referenced by id from model nodes and agents (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:447 credential); external vaults via packages/cli/src/modules/external-secrets.ee (feat:externalSecrets, packages/@n8n/constants/src/index.ts:25) Note: The outside-vault option is enterprise-licensed; the built-in credential store is not.", "open-webui": "source read at v0.11.4, not driven: provider keys live once in admin connection config (backend/open_webui/routers/openai.py:360 get_openai_connection by url_idx, config.py:2829 openai.api_keys), set in src/lib/components/admin/Settings/Connections.svelte; agents reference a base model id, never a key (models/models.py:118); tool-server OAuth tokens Fernet-encrypted (utils/oauth.py:269) Note: central config store, not an external vault" } }, @@ -3332,12 +3478,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 routes a sender user_id to a profile, and each profile has its own .env/auth.json keys (agent/secret_scope.py:1-10); searched 'per.?user.{0,20}(key|credential)|byok' in *.py: only tool-provider BYOK rows (hermes_cli/tools_config_providers.py:760) Note: A person gets their own key only by being routed to their own profile; no per-user key field.", "dify": "source read at 1.17.1, not driven: searched 'personal credential|per.?user credential|end.?user.*credential' in api/core/tools, api/services/tools and web/i18n/en-US: credentials are workspace-level (api/controllers/console/workspace/model_providers.py:200) and runs use the app's configured credential; api/models/credential_permission.py only restricts who may use a shared credential", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/Connections.svelte:66 per-user Direct Connections (own endpoint and key), enabled by admin 'direct.enable' (backend/open_webui/config.py:230 ENABLE_DIRECT_CONNECTIONS); main.py:1164 _set_direct_model routes the user's runs through it Note: direct connections run from the browser session and are refused for sub-agents (utils/subagents.py:334)" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/Connections.svelte:66 per-user Direct Connections (own endpoint and key), enabled by admin 'direct.enable' (backend/open_webui/config.py:230 ENABLE_DIRECT_CONNECTIONS); main.py:1164 _set_direct_model routes the user's runs through it Note: direct connections run from the browser session and are refused for sub-agents (utils/subagents.py:334)", + "n8n": "source read at n8n@2.40.7, not driven: Chat hub lets each user pick a provider credential they own, checked per user (packages/cli/src/modules/chat-hub/chat-hub-credentials.service.ts:25-31 findCredentialForUser; packages/frontend/editor-ui/src/features/ai/chatHub/components/DynamicCredentialsDrawer.vue); workflows can resolve a credential per executing user with dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee, feat:dynamicCredentials) Note: Per-user resolution in workflows is enterprise-licensed." } }, { @@ -3368,7 +3515,7 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 Ollama and LM Studio local servers; plugins/model-providers/custom any self-hosted OpenAI-compatible endpoint; tools/transcription_local.py and tools/tts_tool.py local Piper/NeuTTS keep voice on premise; Dockerfile self-hosting", "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml self-hosts the whole stack (api, worker, web, plugin daemon, sandbox, agent runtime, vector store); with a local model plugin (langgenius/dify-official-plugins models/ollama, localai, xinference) processing stays on premise Note: local model serving itself is a marketplace plugin", - "n8n": "docs-only: competitor_features#31099 \"Self-hosting via Docker: Run community edition on own infra with Docker.\"", + "n8n": "source read at n8n@2.40.7, not driven: self-hosted by design (docker/ images, packages/cli/src/commands/start.ts) with local models through LMChatOllama and LMChatLemonade (packages/@n8n/nodes-langchain/nodes/llms/), so all processing can stay on premise", "open-webui": "source read at v0.11.4, not driven: self-hosted server (README.md:26 pip, Docker, Kubernetes) with local inference via Ollama (backend/open_webui/routers/ollama.py) and local embeddings, Whisper STT and local TTS engines; nothing forces an outside call" } }, @@ -3392,13 +3539,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31374 \"Talk tool: List conversations, send messages, create public conversations from the agent.\"", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 delivers job output to origin, home or explicit chat targets on connected platforms (telegram, discord, slack, matrix, mattermost, teams and more under plugins/platforms/); web/src/i18n/en.ts cron.deliverTo; searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter Note: Delivery into a team chat room works; Nextcloud Talk is not a target.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; no official plugin for Nextcloud Talk in langgenius/dify-official-plugins tools/ (only slack, teams, discord, dingtalk, wecom, telegraph)", - "open-webui": "source read at v0.11.4, not driven: automation output can go to an Open WebUI channel: backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation, src/lib/components/automations/DestinationDropdown.svelte; searched 'talk|spreed|nextcloud' in backend/open_webui: no Nextcloud Talk Note: delivers to its own channels, not Talk" + "open-webui": "source read at v0.11.4, not driven: automation output can go to an Open WebUI channel: backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation, src/lib/components/automations/DestinationDropdown.svelte; searched 'talk|spreed|nextcloud' in backend/open_webui: no Nextcloud Talk Note: delivers to its own channels, not Talk", + "n8n": "source read at n8n@2.40.7, not driven: output goes to team chats of other products through Slack, Mattermost and Teams nodes (packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts, Mattermost/v1, Microsoft/Teams/v2); searched 'talk|spreed' in packages/nodes-base/nodes and packages/cli/src/modules/agents/integrations: no Nextcloud Talk target Note: Delivery into a team chat works; Nextcloud Talk is not a target." } }, { @@ -3421,12 +3569,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/run_inbound.py handles group-room messages and replies in the same room on every platform adapter; gateway/platforms/access_policy_mixin.py:6-68 group allowlists per chat; searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter Note: Chat-room bridging exists for other chat systems, not for Nextcloud Talk.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; chat-app bridges exist only as plugin endpoints for other messengers (api/controllers/console/workspace/endpoint.py), none for Nextcloud Talk", - "open-webui": "source read at v0.11.4, not driven: in Open WebUI channels a member @mentions a model and the reply lands in the room or thread: backend/open_webui/routers/channels.py:976 model_response_handler, :1244; src/lib/components/channel/MessageInput/MentionList.svelte; no Nextcloud Talk bridge Note: own channels only" + "open-webui": "source read at v0.11.4, not driven: in Open WebUI channels a member @mentions a model and the reply lands in the room or thread: backend/open_webui/routers/channels.py:976 model_response_handler, :1244; src/lib/components/channel/MessageInput/MentionList.svelte; no Nextcloud Talk bridge Note: own channels only", + "n8n": "source read at n8n@2.40.7, not driven: Agents module chat channels let people chat with an agent from Slack, Telegram, Discord and Linear with replies in place (packages/cli/src/modules/agents/agents.module.ts:81-96 registry; integrations/platforms/); workflows do the same with Slack or Telegram triggers; searched 'talk|spreed|nextcloud' in integrations/: no Talk adapter Note: Works in other chat apps (opt-in Agents module or hand-built workflows), not in Nextcloud Talk." } }, { @@ -3450,12 +3599,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter; hermes_cli/commands.py:76 /branch opens a new thread on Discord/Telegram/Slack/Matrix, which separates sessions but does not group agent rooms apart from human rooms", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed|room' in api/ and web/: no Talk integration, so no agent-room grouping", - "open-webui": "source read at v0.11.4, not driven: searched 'agent room|bot room|category' in backend/open_webui/models/channels.py and src/lib/components/channel: channels have types group/dm/standard, no marking or grouping of agent rooms apart from human ones" + "open-webui": "source read at v0.11.4, not driven: searched 'agent room|bot room|category' in backend/open_webui/models/channels.py and src/lib/components/channel: channels have types group/dm/standard, no marking or grouping of agent rooms apart from human ones", + "n8n": "source read at n8n@2.40.7, not driven: on its own chat surfaces an agent gets its own space: in Slack each agent is its own app with its own direct messages (packages/cli/src/modules/agents/agent-slack-integrations.controller.ts:26-150 app creation and install; en.json:8408 'Agent name' shown in Slack), and n8n's chat lists agents under their own sidebar links (en.json:695-696); searched 'talk|spreed|nextcloud' in packages/cli/src/modules/agents/integrations: no Nextcloud Talk Note: Missing Nextcloud part: Talk rooms. Rewritten under the lane ruling of 2026-09-26 (was no)." } }, { @@ -3478,12 +3628,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "open-webui": "source read at v0.11.4, not driven: admin event webhooks (backend/open_webui/events.py:1034 dispatch_webhook_event, filters :707) and per-user notification webhooks (utils/notifications.py:264 chat.finished payload with the answer text and link) post output to another system; utils/webhook.py:30 post_webhook sends plain JSON; searched 'hmac|signature' in utils/webhook.py, events.py, utils/notifications.py: unsigned Note: old yes; webhooks exist but carry no signature", "hermes-agent": "source read at v2026.9.24, not driven: agent/outbound_webhooks.py:1-7 hooks.outbound entries POST lifecycle events (hermes_cli/plugins.py:108-118 post_llm_call, post_tool_call, on_stream_end ...) HMAC-SHA256 signed via X-Hermes-Signature-256; cron/scheduler_delivery.py:32 'webhook' is a cron delivery target", - "dify": "source read at 1.17.1, not driven: a workflow HTTP Request node posts an agent's output to any URL with API-Key, Basic, Bearer or custom header auth (web/i18n/en-US/workflow.json:510-518 nodes.http.authorization.*); searched 'hmac|signature|sign' in workflow.json and the http node: no payload signing Note: outbound webhook yes, signed no" + "dify": "source read at 1.17.1, not driven: a workflow HTTP Request node posts an agent's output to any URL with API-Key, Basic, Bearer or custom header auth (web/i18n/en-US/workflow.json:510-518 nodes.http.authorization.*); searched 'hmac|signature|sign' in workflow.json and the http node: no payload signing Note: outbound webhook yes, signed no", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/HttpRequest sends a run's output to any URL (also as the Respond to Webhook node); signing is hand-built with the Crypto node's HMAC (packages/nodes-base/nodes/Crypto); searched 'signature|hmac' in packages/nodes-base/nodes/HttpRequest: no built-in request signing Note: Outbound webhook yes; the signature must be wired by hand." } }, { @@ -3507,13 +3658,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31375 \"Mail tool: Send emails, manage mail accounts and folders.\"", "dify": "source read at 1.17.1, not driven: core sends mail only for Human Input requests (api/tasks/mail_human_input_delivery_task.py; web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*) and account/comment mails (api/tasks/mail_*.py); sending an agent's output as an email needs the official email/gmail/outlook tool plugins Note: marketplace plugin for general delivery", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:32 'email' delivery target; plugins/platforms/email/plugin.yaml:5-8 IMAP/SMTP email adapter; web/src/i18n/en.ts cron.delivery.email on CronPage", - "open-webui": "source read at v0.11.4, not driven: searched 'smtp|email|sendmail' in backend/open_webui/utils/notifications.py, utils/webhook.py, events.py and routers: notification targets accept type 'webhook' only (utils/notifications.py:34)" + "open-webui": "source read at v0.11.4, not driven: searched 'smtp|email|sendmail' in backend/open_webui/utils/notifications.py, utils/webhook.py, events.py and routers: notification targets accept type 'webhook' only (utils/notifications.py:34)", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/EmailSend/v2/EmailSendV2.node.ts SMTP send and Gmail/Outlook send operations (packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts) deliver an agent's output by email" } }, { @@ -3536,12 +3688,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/terminal_notify.py:1-5 OS notifications via OSC 9/777 from the CLI; apps/desktop/electron/notification-ipc.ts:53 native desktop notifications; cron/scheduler_delivery.py:43-47 run results and approval prompts land in the home channel on Telegram, Discord, Slack, Signal; searched 'nextcloud' repo-wide: none Note: Notifies through desktop and messaging channels, not Nextcloud notifications. Old yes rested on a docs line about notifications in general.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/events.py:669 NOTIFICATION_EVENTS chat.finished, chat.failed, channel.message, calendar.alert; src/routes/+layout.svelte:622 browser Notification, utils/automations.py:500 'automation:result' socket toast; src/lib/components/chat/Settings/Notifications.svelte:32-38 per-event choice Note: 'needs me' for a waiting approval surfaces only inside the open chat", - "dify": "source read at 1.17.1, not driven: when a run needs a person, the Human Input node emails workspace members or externals (api/tasks/mail_human_input_delivery_task.py; workflow.json humanInput.deliveryMethod.emailConfigure.allMembers); api/controllers/console/notification.py:43 is only product announcements. Searched 'run finished|run completed|notify' in api/tasks and web/i18n/en-US: no notice when a run finishes Note: email when input is needed, nothing on completion, no in-app notification" + "dify": "source read at 1.17.1, not driven: when a run needs a person, the Human Input node emails workspace members or externals (api/tasks/mail_human_input_delivery_task.py; workflow.json humanInput.deliveryMethod.emailConfigure.allMembers); api/controllers/console/notification.py:43 is only product announcements. Searched 'run finished|run completed|notify' in api/tasks and web/i18n/en-US: no notice when a run finishes Note: email when input is needed, nothing on completion, no in-app notification", + "n8n": "source read at n8n@2.40.7, not driven: run alerts are hand-built: packages/nodes-base/nodes/ErrorTrigger starts a workflow when another fails, which can mail or post to chat; the push channel only refreshes open editors (packages/cli/src/modules/agents/agent-execution-update-broadcaster.ts:43); searched 'notification' in packages/nodes-base/nodes/NextCloud: none, the node has no notifications resource Note: No Nextcloud notification and no in-app inbox; an alert needs a workflow built for it." } }, { @@ -3564,12 +3717,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:148 /sethome sets this chat as the home channel; cron/scheduler_delivery.py:43-47 _HOME_CHANNEL resolves the default target; web/src/i18n/en.ts cron.deliverTo with 'set a home channel first'", "dify": "source read at 1.17.1, not driven: searched 'delivery target|default delivery|preferred channel' in api/ and web/i18n/en-US: delivery is wired per workflow node (HTTP, tool plugins, Human Input delivery methods); no per-person default delivery setting", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/notifications.py:56 add target, :84 PUT /targets/{id}/default; utils/notifications.py:213 set_default_target; per-user settings in src/lib/components/chat/Settings/Notifications.svelte" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/notifications.py:56 add target, :84 PUT /targets/{id}/default; utils/notifications.py:213 set_default_target; per-user settings in src/lib/components/chat/Settings/Notifications.svelte", + "n8n": "source read at n8n@2.40.7, not driven: searched 'default delivery|deliveryTarget|preferred channel' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/api-types/src/agents: no per-user default delivery target; each workflow or agent names its own destination node or channel" } }, { @@ -3593,13 +3747,14 @@ "hermes-agent": "yes", "copilot-studio": "partial", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/ telegram, slack, teams, discord, whatsapp, matrix, mattermost, sms, line, feishu, dingtalk, wecom, google_chat and more; gateway/platforms/signal.py Signal adapter; hermes_cli/subcommands/gateway.py setup and web/src/pages/ChannelsPage.tsx", "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/endpoint.py plugin endpoints host chat bots; official extensions slack_bot and wecom_bot, triggers slack_trigger and telegram_trigger (langgenius/dify-official-plugins extensions/, triggers/), community microsoft-teams (langgenius/dify-plugins); nothing for Signal found Note: marketplace plugin only", - "open-webui": "source read at v0.11.4, not driven: outbound only: utils/webhook.py:44-55 formats Slack, Google Chat, Discord and Microsoft Teams webhooks; searched 'telegram|signal|whatsapp|slack bot|bot token' in backend/open_webui: no inbound messenger adapter; chatting from Telegram or WhatsApp is the separate Open WebUI Computer project (README.md:94) Note: can post to Teams or Slack, cannot be reached from them" + "open-webui": "source read at v0.11.4, not driven: outbound only: utils/webhook.py:44-55 formats Slack, Google Chat, Discord and Microsoft Teams webhooks; searched 'telegram|signal|whatsapp|slack bot|bot token' in backend/open_webui: no inbound messenger adapter; chatting from Telegram or WhatsApp is the separate Open WebUI Computer project (README.md:94) Note: can post to Teams or Slack, cannot be reached from them", + "n8n": "source read at n8n@2.40.7, not driven: Agents module channels for Slack, Telegram, Discord and Linear (packages/cli/src/modules/agents/agents.module.ts:81-96, en.json:8476-8477 Slack/Telegram help texts); workflows also start from Telegram, WhatsApp, Discord, Slack and Teams trigger nodes (packages/nodes-base/nodes/Telegram, WhatsApp, Discord, Slack, Microsoft/Teams) Note: Teams and Signal are not Agents-module channels; Teams works through workflow trigger nodes, Signal not at all." } }, { @@ -3623,12 +3778,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "open-webui": "source read at v0.11.4, not driven: a scheduled automation with target channel posts its result into a team channel: backend/open_webui/models/automations.py:68-77 AutomationTarget 'channel', utils/automations.py:250 _execute_channel_automation, routers/automations.py:109 channel write check; src/lib/components/automations/DestinationDropdown.svelte", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 scheduled job output delivered to a chat target; web/src/i18n/en.ts cron.namePlaceholder 'e.g. Daily summary' with deliverTo; skills/productivity/google-workspace/SKILL.md:27 daily brief procedure; hermes_cli/web_routers/cron.py:393 blueprints for ready-made automations", - "dify": "source read at 1.17.1, not driven: a Schedule Trigger workflow (api/core/workflow/nodes/trigger_schedule/entities.py:10) can end in a chat-posting tool node, but the posting tools are marketplace plugins (official tools/slack/tools/send_message.yaml, teams send_channel_message.yaml) Note: schedule is core, the chat delivery is a plugin" + "dify": "source read at 1.17.1, not driven: a Schedule Trigger workflow (api/core/workflow/nodes/trigger_schedule/entities.py:10) can end in a chat-posting tool node, but the posting tools are marketplace plugins (official tools/slack/tools/send_message.yaml, teams send_channel_message.yaml) Note: schedule is core, the chat delivery is a plugin", + "n8n": "source read at n8n@2.40.7, not driven: an Agents-module schedule runs an objective on cron (en.json:8112-8113 'Objectives the agent runs on a schedule') and a connected Slack or Discord channel gives the agent a send_channel_message action (packages/cli/src/modules/agents/integrations/integration-tool-definitions.ts:278); workflows do the same with Schedule Trigger plus Slack node Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." } }, { @@ -3652,12 +3808,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 repeat failures with the same job and error signature resolve to one incident and repeat alerts are withheld for cron.failure_repeat_alert_hours; gateway/platforms/webhook_coalesce.py:1-8 debounces bursts of events on one entity into one run; searched 'repeat.?count|collapsed' in gateway/ and cron/: no 'N times' counter on delivered reports Note: Duplicates are suppressed or coalesced, but not collapsed into one report with a count.", "dify": "source read at 1.17.1, not driven: searched 'dedup|collapse|identical|duplicate report' in api/core/workflow, api/services and web/i18n/en-US: no collapsing of repeated outputs into one with a count", - "open-webui": "source read at v0.11.4, not driven: searched 'dedup|duplicate|collapse|count' in backend/open_webui/utils/notifications.py, events.py and utils/automations.py: each run and event is delivered separately; no collapsing of identical reports" + "open-webui": "source read at v0.11.4, not driven: searched 'dedup|duplicate|collapse|count' in backend/open_webui/utils/notifications.py, events.py and utils/automations.py: each run and event is delivered separately; no collapsing of identical reports", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Transform/RemoveDuplicates/v2/RemoveDuplicatesV2.description.ts:11-13 'Remove items processed in previous executions' drops repeats across runs, and the Summarize node counts groups (packages/nodes-base/nodes/Transform/Summarize); searched 'dedupe|collapse' in packages/cli/src/modules/agents: no built-in collapse of identical reports into one with a count Note: Must be wired by hand in a workflow." } }, { @@ -3681,12 +3838,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/productivity/live-dashboard/SKILL.md:1-3 optional skill builds self-updating dashboards; web/src/plugins/slots.ts:1-13 plugins can inject components into dashboard slots; searched 'nextcloud' repo-wide: none Note: No Nextcloud dashboard widget; agent output on a dashboard needs an optional skill or a dashboard plugin.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|dashboard widget' in api/ and web/: no widget that shows agent output on another product's dashboard; the app Overview/Monitoring pages (web/i18n/en-US/app-overview.json, agent-v-2.json monitoring.*) show usage metrics, not output", - "open-webui": "source read at v0.11.4, not driven: searched 'dashboard|widget' in src/lib/components and src/routes: src/routes/(app)/home/+page.svelte is an empty shell, admin Analytics is usage stats; no widget showing agent output and no Nextcloud dashboard integration" + "open-webui": "source read at v0.11.4, not driven: searched 'dashboard|widget' in src/lib/components and src/routes: src/routes/(app)/home/+page.svelte is an empty shell, admin Analytics is usage stats; no widget showing agent output and no Nextcloud dashboard integration", + "n8n": "source read at n8n@2.40.7, not driven: searched 'dashboard widget|nextcloud dashboard' in packages/nodes-base/nodes/NextCloud and packages/cli/src: no Nextcloud Dashboard widget; n8n's own Insights dashboard (packages/cli/src/modules/insights) shows execution counts, not agent output" } }, { @@ -3711,13 +3869,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31382 \"Media transcription (STT): Speech-to-text transcription exposed as an agent tool.\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/transcription_tools.py with local (tools/transcription_local.py) and cloud (tools/transcription_cloud.py) speech-to-text; gateway/run_voice.py transcribes inbound voice messages on messaging platforms", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/audio.py:1251 POST /audio/transcriptions (local Whisper, OpenAI, Deepgram, Azure, Voxtral); routers/files.py:153-155 uploaded audio files are transcribed then indexed; chat/MessageInput/VoiceRecording.svelte", - "dify": "source read at 1.17.1, not driven: api/core/tools/builtin_tool/providers/audio/tools/asr.py speech-to-text tool usable in workflows and agents; api/controllers/web/audio.py:62 audio-to-text for voice messages in chat Note: needs a speech2text model from a provider plugin" + "dify": "source read at 1.17.1, not driven: api/core/tools/builtin_tool/providers/audio/tools/asr.py speech-to-text tool usable in workflows and agents; api/controllers/web/audio.py:62 audio-to-text for voice messages in chat Note: needs a speech2text model from a provider plugin", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/transcribe.operation.ts transcribes audio files to text; chat hub voice input turns speech into text (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatPrompt.vue:53)" } }, { @@ -3740,13 +3899,14 @@ "hermes-agent": "no", "copilot-studio": "yes", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"", "hermes-agent": "source read at v2026.9.24, not driven: searched 'embed.{0,20}(chat|widget)|chat.?widget|web.?chat' in plugin-catalog/, plugins/platforms/, gateway/platforms/, web/src: only the dashboard's own chat page; gateway/platforms/api_server.py:1178 cors_origins lets a site call the key-protected API but ships no embeddable widget or anonymous access", "dify": "source read at 1.17.1, not driven: web/public/embed.js floating chat bubble script and iframe embed chosen in web/i18n/en-US/app-overview.json:50-52 'Choose the way to embed chat app to your website', with pre-filled hidden inputs; agents have 'Embed Into Site' on their Access page (agent-v-2.json access.webApp.actions.embedIntoSite)", - "open-webui": "source read at v0.11.4, not driven: searched 'embed|widget|anonymous|guest|public chat' in src/lib/components and backend/open_webui/routers/auths.py: every chat needs a signed-in user; the only embedding hook is an iframe postMessage handler for a logged-in session (src/lib/components/chat/Chat.svelte:1457 'Confirm Prompt from Embed') Note: no anonymous chat window for public websites" + "open-webui": "source read at v0.11.4, not driven: searched 'embed|widget|anonymous|guest|public chat' in src/lib/components and backend/open_webui/routers/auths.py: every chat needs a signed-in user; the only embedding hook is an iframe postMessage handler for a logged-in session (src/lib/components/chat/Chat.svelte:1457 'Confirm Prompt from Embed') Note: no anonymous chat window for public websites", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:408-452 'public' chat with an embeddable widget or hosted chat page; packages/frontend/@n8n/chat/README.md:1-3 embeddable chat window with CORS allowed origins" } }, { @@ -3775,7 +3935,7 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1-12 dangerous-command and tool approval gate with a human decision engine; hermes_cli/commands.py:96-99 /approve and /deny in chat and gateway; hermes_cli/commands.py:187 /approvals mode; gateway/platforms/base_exec_approval.py approval prompts on messaging platforms", "copilot-studio": "docs-only: competitor_features#31608 \"Human-in-the-loop approvals: Approval steps via Power Automate before actions execute.\"", "dify": "source read at 1.17.1, not driven: Human Input workflow node pauses a run until a person picks one of the defined user actions, with delivery by web app or email and a timeout (web/i18n/en-US/workflow.json:583-636 nodes.humanInput.*; api/controllers/web/human_input_form.py:141); in Agent v2 an ask_human deferred tool lets the agent stop for a person (dify-agent/src/dify_agent/layers/ask_human/layer.py:1-12,63) Note: the gate is a node the builder places; no automatic hold on tool calls", - "n8n": "docs-only: competitor_features#31103 \"Wait/approval nodes: Pause workflow for manual approval or timed wait.\"", + "n8n": "source read at n8n@2.40.7, not driven: AI Agent tools can be gated behind a human-in-the-loop node: packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts:64-77 createHitlToolkit routes a gated tool through the HITL node until approved, packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/executeBatch.ts:57-61; Agents module per-tool 'Require approval' (en.json:7840-7841) with Approve/Reject cards (en.json:7676-7681)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:62 'Ask for approval': 'Stop before each tool call until you allow or deny it.'; backend/open_webui/utils/middleware.py:3613 pause_for_tool_approval holds the call; src/lib/components/common/ToolCallDisplay.svelte:250-271 Allow/Deny; utils/tool_approval.py:20 resolve_tool_call_output resumes or rejects" } }, @@ -3799,12 +3959,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:662-670 permissions_list_open lists pending approvals across conversations seen by the MCP bridge, :672 permissions_respond; hermes_cli/commands.py:223 /memory pending and :217 /skills pending list staged writes Note: Approvals surface in the conversation that raised them; the only cross-conversation list is through the MCP bridge, with no inbox page.", "dify": "source read at 1.17.1, not driven: human input forms are reached one by one by token link (api/controllers/web/human_input_form.py:141, console/human_input_form.py:70 /form/human_input/); searched 'inbox|pending forms|awaiting' in web/i18n/en-US and api/controllers: no list of everything awaiting me", - "open-webui": "source read at v0.11.4, not driven: searched 'requires_approval|pending approval|needsApproval' in src/routes and src/lib/components/layout: pending calls are shown only inside the chat message that raised them (common/ToolCallDisplay.svelte:244); no cross-chat approval inbox" + "open-webui": "source read at v0.11.4, not driven: searched 'requires_approval|pending approval|needsApproval' in src/routes and src/lib/components/layout: pending calls are shown only inside the chat message that raised them (common/ToolCallDisplay.svelte:244); no cross-chat approval inbox", + "n8n": "source read at n8n@2.40.7, not driven: waiting runs are findable with the executions list 'Waiting' status (en.json:1621); Agents-module approvals appear as cards inside each conversation (en.json:7676-7684); searched 'inbox|pending approvals' in packages/frontend/editor-ui/src/features: no single inbox of actions awaiting my approval Note: Approvals are scattered across chats, channels and waiting executions." } }, { @@ -3828,12 +3989,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/base_exec_approval.py:1-16 every approval card states what Hermes wants to run, why it was flagged (EA_REASON_LABEL_TEXT) and that silence means it does not run; tools/approval.py:1106-1109 tool approvals carry the tool name and reason; tools/approval_smart.py:1-8 guardian LLM risk assessment of the command", "dify": "source read at 1.17.1, not driven: the Human Input form shows builder-written Form Content with inserted run variables (web/i18n/en-US/workflow.json:609-612 nodes.humanInput.formContent.*), and in Agent v2 the agent writes the question and fields itself (dify-agent/src/dify_agent/layers/ask_human/schema.py AskHumanToolArgs); nothing derives what the action touches automatically Note: context is what the builder or the model chooses to show", - "open-webui": "source read at v0.11.4, not driven: the pending call shows tool name and its decoded arguments (src/lib/components/common/ToolCallDisplay.svelte:147 arguments, :246 'Allow {{NAME}}?'); the reasoning is whatever the model wrote before the call; searched 'reason|impact|touches' in utils/tool_approval.py and ToolCallDisplay.svelte: no statement of what the action touches or why Note: what and with which arguments, not why or blast radius" + "open-webui": "source read at v0.11.4, not driven: the pending call shows tool name and its decoded arguments (src/lib/components/common/ToolCallDisplay.svelte:147 arguments, :246 'Allow {{NAME}}?'); the reasoning is whatever the model wrote before the call; searched 'reason|impact|touches' in utils/tool_approval.py and ToolCallDisplay.svelte: no statement of what the action touches or why Note: what and with which arguments, not why or blast radius", + "n8n": "source read at n8n@2.40.7, not driven: the approval card names the tool and opens its arguments (en.json:7677 'The agent wants to run the {toolName} tool', 7682 'View tool details'); send-and-wait approval messages carry whatever the builder writes into them (packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:4-47); searched 'reason|impact|affects' in packages/frontend/editor-ui/src/features/agents/components/RichInteractionCard.vue and AgentConfirmationModal.vue: no stated reason or affected objects Note: Shows what will run and with which inputs, not why or what it touches." } }, { @@ -3856,12 +4018,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/approval_detection.py:1-4 only commands matching dangerous patterns reach the gate; hermes_cli/config_defaults.py:1656 approvals.mode 'smart' lets an auxiliary guardian (tools/approval_smart.py) approve low-risk commands and escalate risky ones, with smart_policy rules (:1663) and a deny list (:1670)", "dify": "source read at 1.17.1, not driven: no risk scoring; a builder can route only some cases to a Human Input node with an IF/ELSE or classifier node, and the Agent v2 ask_human tool is called at the model's discretion (dify-agent/src/dify_agent/layers/ask_human/layer.py:56-78 prompt hint). Searched 'risk|threshold' in dify-agent/src and api/core/workflow: none Note: hand-built branching, no risk threshold setting", - "open-webui": "source read at v0.11.4, not driven: tool_approval_mode is 'full' or 'ask' for all tool calls in a chat (src/lib/components/chat/MessageInput/InputMenu.svelte:54-64; backend/open_webui/utils/middleware.py:5934); searched 'approv|risk' in utils/tools.py and routers/tools.py: no per-tool or risk-based approval rule" + "open-webui": "source read at v0.11.4, not driven: tool_approval_mode is 'full' or 'ask' for all tool calls in a chat (src/lib/components/chat/MessageInput/InputMenu.svelte:54-64; backend/open_webui/utils/middleware.py:5934); searched 'approv|risk' in utils/tools.py and routers/tools.py: no per-tool or risk-based approval rule", + "n8n": "source read at n8n@2.40.7, not driven: approval is chosen per tool: packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:382,408,429 requireApproval on custom, workflow and node tools and :283-293 MCP approval 'selected' tools (en.json:7846 'Ask selected'); in workflows only tools wired through a human-in-the-loop node are gated (packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts:64-77) Note: Static per-tool choice, no risk scoring." } }, { @@ -3884,12 +4047,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/matrix/adapter.py:2419-2442 a reaction on the approval prompt resolves it (_handle_approval_reaction); plugins/platforms/telegram/adapter.py:4256-4280 inline Approve Once / Always Approve buttons; searched 'nextcloud|spreed' repo-wide: none Note: Approve by reaction works in Matrix, by buttons elsewhere; not in Nextcloud Talk.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|reaction' in api/ and web/: no Talk integration; approvals are answered only through the form link (api/controllers/web/human_input_form.py:141)", - "open-webui": "source read at v0.11.4, not driven: searched 'reaction' with 'approv' in backend/open_webui/routers/channels.py and utils/tool_approval.py: channel reactions (events message.reaction_added) do not resolve tool calls; approval is only via the Allow/Deny buttons or POST /api/v1/chats/{id}/messages/{mid}/resolve (main.py:1893)" + "open-webui": "source read at v0.11.4, not driven: searched 'reaction' with 'approv' in backend/open_webui/routers/channels.py and utils/tool_approval.py: channel reactions (events message.reaction_added) do not resolve tool calls; approval is only via the Allow/Deny buttons or POST /api/v1/chats/{id}/messages/{mid}/resolve (main.py:1893)", + "n8n": "source read at n8n@2.40.7, not driven: one-tap approval inside chat apps other than Talk: packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:4,31 approval buttons in Telegram, packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts Slack approvals; searched 'talk|spreed' in packages/nodes-base/nodes: no Nextcloud Talk Note: Approve from Slack or Telegram, not from Talk." } }, { @@ -3913,12 +4077,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: a workflow can put a Human Input node between the LLM/Agent node and the reply so a person reviews, edits input fields and picks an action before the answer is sent (web/i18n/en-US/workflow.json nodes.humanInput.formContent.*, user actions; api/tasks/mail_human_input_delivery_task.py email delivery to staff) Note: built per workflow; chat apps with webapp delivery show the form to the end user instead", "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1095-1110 request_tool_approval lets a plugin pre_tool_call hook hold any tool call, including send_message, for a human; searched 'draft.{0,30}(approv|review|hold)|confirm.{0,20}before.{0,10}send' in *.py: no built-in hold on agent-written replies Note: Holding outgoing messages needs a plugin hook; nothing ships that queues drafts for review.", - "open-webui": "source read at v0.11.4, not driven: searched 'draft|hold|review before' in backend/open_webui/utils/automations.py, routers/channels.py and utils/middleware.py: answers are written straight to the chat or channel (utils/automations.py:250 channel post); only tool calls can be held (utils/middleware.py:3613)" + "open-webui": "source read at v0.11.4, not driven: searched 'draft|hold|review before' in backend/open_webui/utils/automations.py, routers/channels.py and utils/middleware.py: answers are written straight to the chat or channel (utils/automations.py:250 channel post); only tool calls can be held (utils/middleware.py:3613)", + "n8n": "source read at n8n@2.40.7, not driven: a sending tool can require approval before it runs (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:429 requireApproval on node tools such as Gmail or Send Email), and workflow agents can route replies through a Send and Wait approval node before the send step (packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts, packages/nodes-base/nodes/Telegram/hitl/) Note: Configured per tool or wired per workflow." } }, { @@ -3941,12 +4106,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/estop.py:1-8 and :36-39 `hermes pause` at the root home halts cron dispatch, kanban dispatch and new gateway turns for every profile; hermes_cli/commands.py:94 /pause; agent/estop.py:1-4 in-flight work is never killed Note: Stops new work everywhere at once; running turns finish. No organisations, so the scope is the whole install.", "dify": "source read at 1.17.1, not driven: searched 'kill switch|disable all|pause all|emergency stop' in api/controllers/console and web/i18n/en-US: no workspace-wide stop; each app's web app and API are toggled separately (api/controllers/console/agent/roster.py:1013)", - "open-webui": "source read at v0.11.4, not driven: admin 'Disable All' models (src/lib/components/workspace/Models.svelte:365, routers/models.py:881 toggle each) and the global automations switch (src/lib/components/admin/Settings/General.svelte:377 ENABLE_AUTOMATIONS, checked at utils/automations.py:105) stop new runs; running tasks are stopped one by one (main.py:2128 /api/tasks/stop/{id}, admin) Note: no single action that also halts in-flight runs" + "open-webui": "source read at v0.11.4, not driven: admin 'Disable All' models (src/lib/components/workspace/Models.svelte:365, routers/models.py:881 toggle each) and the global automations switch (src/lib/components/admin/Settings/General.svelte:377 ENABLE_AUTOMATIONS, checked at utils/automations.py:105) stop new runs; running tasks are stopped one by one (main.py:2128 /api/tasks/stop/{id}, admin) Note: no single action that also halts in-flight runs", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/unpublish/workflow.ts:8-29 'n8n unpublish:workflow --all' deactivates every workflow from the server shell; packages/cli/src/executions/executions.controller.ts:118 POST /stopMany stops running executions; the chat hub and Instance AI have admin on/off switches (packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:73 PUT /enabled) Note: No single UI switch that stops every agent, and Agents-module agents are not covered by the CLI command." } }, { @@ -3970,12 +4136,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands.py:425-437 /stop interrupts a running agent and force-cleans a hung session; hermes_cli/commands.py:92 /stop kills background processes; agent/estop.py:31-33 `hermes -p pause` holds one profile; hermes_cli/subcommands/gateway.py stops a profile's gateway", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/completion.py:327 /agent//chat-messages//stop and workflow.py:1188 stop one running task; roster.py:1013 and web-app-access-card.tsx:254 switch the agent's surfaces off. No single control that stops all of one agent's running work at once Note: stop per run plus switch off per surface", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:881 POST /model/toggle sets is_active false and utils/models.py:210 drops inactive custom models from the served list; in-flight turns stop via main.py:2160 POST /api/tasks/chat/{chat_id}/stop and admin main.py:2128 /api/tasks/stop/{task_id}; automations pause at routers/automations.py:306" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:881 POST /model/toggle sets is_active false and utils/models.py:210 drops inactive custom models from the served list; in-flight turns stop via main.py:2160 POST /api/tasks/chat/{chat_id}/stop and admin main.py:2128 /api/tasks/stop/{task_id}; automations pause at routers/automations.py:306", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/executions/executions.controller.ts:102-110 POST /:id/stop halts a running execution and :475 of packages/cli/src/workflows/workflows.controller.ts deactivates the workflow; Agents module: packages/cli/src/modules/agents/agent-chat.controller.ts:248 DELETE /:agentId/chat/runs/:runId stops a run and agent-publish.controller.ts:45 unpublishes" } }, { @@ -3998,12 +4165,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/redact.py:871 redact_sensitive_text and :1157 redact_terminal_output mask API keys and tokens in terminal/tool output; gateway/session.py:193-203 and :382-385 privacy.redact_pii hashes user and chat ids in the model-visible session context; agent/redact.py:66 vault values redacted; searched 'pii|personal data' in agent/ tools/ gateway/: no content-level PII filter Note: Secrets are masked and identifiers can be hashed; personal data inside messages or files reaches the model unfiltered.", "dify": "source read at 1.17.1, not driven: api/core/moderation/input_moderation.py with keywords, openai_moderation and api providers (api/core/moderation/{keywords,openai_moderation,api}); api/core/moderation/base.py:10-20 DIRECT_OUTPUT blocks with a preset reply, OVERRIDDEN lets a custom API extension return rewritten inputs. No built-in PII or secret detector Note: blocking is built in; redaction only through a self-built API extension", - "open-webui": "source read at v0.11.4, not driven: mechanism only: Filter functions run an inlet() on every request (backend/open_webui/utils/filter.py:212 process_filter_functions, global or per model via ModelEditor.svelte:1210 FiltersSelector); searched 'pii|presidio|redact|secret' in backend/open_webui: no shipped PII or secret filter, those are community Functions from openwebui.com Note: community Function, not core" + "open-webui": "source read at v0.11.4, not driven: mechanism only: Filter functions run an inlet() on every request (backend/open_webui/utils/filter.py:212 process_filter_functions, global or per model via ModelEditor.svelte:1210 FiltersSelector); searched 'pii|presidio|redact|secret' in backend/open_webui: no shipped PII or secret filter, those are community Functions from openwebui.com Note: community Function, not core", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:71-72 'Sanitize Text' operation with PII (:138-156, all or selected entities) and secret-key detection (:174-200, strict/balanced/permissive), actions/checks/pii.ts and secretKeys.ts; placed before the AI Agent node in a workflow Note: A shipped node, placed by the builder in front of the agent." } }, { @@ -4026,11 +4194,11 @@ "hermes-agent": "partial", "copilot-studio": "partial", "dify": "yes", - "n8n": "partial", + "n8n": "yes", "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", - "n8n": "docs-only: competitor_features#38146 \"AWS Bedrock Chat Model Node: Default guardrail version to working draft when not set: From n8n@2.32.0 (2026-07-21)\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:65-66 'Check Text for Violations' with keywords, jailbreak, NSFW, PII, topical alignment and URL checks (:99-273; actions/checks/*.ts), routing passing and failing text to separate outputs Note: Old partial rested on a Bedrock guardrail-version line; the Guardrails node checks output directly.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:108-111 transform_llm_output hook lets a plugin replace or block a final answer; plugins/security-guidance/README.md:1-10 bundled plugin flags dangerous code the agent writes (warns, still writes); gateway/response_filters.py:1-5 only suppresses intentional no-reply markers Note: No shipped content-rule check on answers; it takes a custom plugin hook.", "dify": "source read at 1.17.1, not driven: api/core/moderation/output_moderation.py moderates the streamed answer; web/i18n/en-US/app-debug.json:93-104 feature.moderation 'Moderate OUTPUT Content' with preset replies, keyword list, OpenAI moderation or API", "open-webui": "source read at v0.11.4, not driven: Filter functions also run outlet() and stream hooks on answers (backend/open_webui/utils/filter.py:212, filter_type 'outlet'); searched 'moderation|guardrail|content rule' in backend/open_webui: none shipped, blocking rules must be written as or installed from community Functions Note: community Function, not core" @@ -4056,12 +4224,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/approval_detection.py:51 hardline commands blocked unconditionally, other dangerous patterns routed to approval; tools/tirith_security.py:1-4 pre-exec scan with allow/block/warn verdicts; tools/approval.py:1095-1104 plugins can escalate any tool to the human gate; hermes_cli/config_defaults.py:1656-1670 smart mode, smart_policy and deny globs", "dify": "source read at 1.17.1, not driven: searched 'risk|dangerous|destructive|sensitive tool' in api/core/tools, dify-agent/src and web/i18n/en-US/tools.json: tools carry no risk class and no extra checks per class", - "open-webui": "source read at v0.11.4, not driven: searched 'risk|danger|sensitive' in backend/open_webui/models/tools.py, routers/tools.py, utils/tools.py and utils/tool_approval.py: tools carry no risk class; approval mode is uniform per chat (utils/middleware.py:5934)" + "open-webui": "source read at v0.11.4, not driven: searched 'risk|danger|sensitive' in backend/open_webui/models/tools.py, routers/tools.py, utils/tools.py and utils/tool_approval.py: tools carry no risk class; approval mode is uniform per chat (utils/middleware.py:5934)", + "n8n": "source read at n8n@2.40.7, not driven: tools can be marked 'Require approval' one by one (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:382,408,429; en.json:7840-7841); searched 'risk|riskLevel|dangerous' in packages/cli/src/modules/agents and packages/@n8n/api-types/src/agents: no risk classes for tools and no stronger checks tied to a class Note: Per-tool approval, no risk classification." } }, { @@ -4084,12 +4253,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "open-webui": "source read at v0.11.4, not driven: backend/open_webui/config.py:1122-1149 WEB_FETCH_FILTER_LIST block/allow entries enforced in retrieval/web/utils.py:153 _assert_host_allowed for fetch_url and webhooks, plus WEB_SEARCH_DOMAIN_FILTER_LIST (:1183); env-level only, and it does not cover code run in Jupyter or an Open Terminal (per-user network rules are the enterprise Terminals product, README.md:96)", "hermes-agent": "source read at v2026.9.24, not driven: tools/website_policy.py:1-5 security.website_blocklist enforced on URL-capable tools; hermes_cli/proxy_cli.py:234-254 iron-proxy allowed_hosts plus default-deny CIDRs for sandboxed terminals (tools/environments/docker_egress.py:1-5); hermes_cli/subcommands/egress.py:10-15 `hermes egress` Note: The host allowlist applies to the Docker sandbox through iron-proxy (off by default); the web tools use a blocklist.", - "dify": "source read at 1.17.1, not driven: docker/ssrf_proxy/squid-agent.conf.template routes the agent sandbox through Squid, denying private networks but 'External internet is allowed' (http_access allow all); docker/ssrf_proxy/squid.conf.template does the same for HTTP nodes and tools. No per-agent allowlist of web addresses in the UI Note: blocks internal addresses, not a public-web allowlist; an admin can hand-edit the Squid config" + "dify": "source read at 1.17.1, not driven: docker/ssrf_proxy/squid-agent.conf.template routes the agent sandbox through Squid, denying private networks but 'External internet is allowed' (http_access allow all); docker/ssrf_proxy/squid.conf.template does the same for HTTP nodes and tools. No per-agent allowlist of web addresses in the UI Note: blocks internal addresses, not a public-web allowlist; an admin can hand-edit the Squid config", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/ssrf-protection.config.ts:91-146 SSRF protection (off by default) blocks private IP ranges and N8N_SSRF_BLOCKED_HOSTNAMES instance-wide; credentials can restrict HTTP Request domains (packages/workflow/src/credential-domain-restrictions.ts:10-20 allowedHttpRequestDomains); searched 'allowlist|egress' in packages/cli/src/modules/agents: no per-agent list of allowed web addresses Note: Instance-wide blocking and per-credential domains; nothing per agent." } }, { @@ -4113,12 +4283,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'anonymi' in *.py outside tests: only tools/browser_use_cli.py:155 disabling a telemetry flag; plugin-catalog/ has no anonymiser entry; agent/redact.py masks secrets, not personal data in documents", "dify": "source read at 1.17.1, not driven: searched 'anonymi|presidio|redact|pii' in api/core and web/i18n/en-US: only redaction of the agent backend request in logs (api/core/app/apps/agent_app/runtime_request_builder.py:34); no document anonymisation before the model reads it, and none in the official tool list (langgenius/dify-official-plugins tools/)", - "open-webui": "source read at v0.11.4, not driven: searched 'anonymi|pseudonym|redact|presidio|pii' in backend/open_webui (routers, utils, retrieval): documents are extracted and embedded as-is (routers/retrieval.py); anonymising needs a community Filter function" + "open-webui": "source read at v0.11.4, not driven: searched 'anonymi|pseudonym|redact|presidio|pii' in backend/open_webui (routers, utils, retrieval): documents are extracted and embedded as-is (routers/retrieval.py); anonymising needs a community Filter function", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:71-72,138-156 'Sanitize Text' replaces detected PII in text before it reaches a model; document text comes from the Extract From File node (packages/nodes-base/nodes/Files/ExtractFromFile) Note: Works on extracted text; wired in the workflow before the model step." } }, { @@ -4141,12 +4312,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "dify": "source read at 1.17.1, not driven: per-app and per-agent log pages to review past conversations and runs (api/controllers/console/agent/roster.py:1133,1172; web/i18n/en-US/app-log.json), with admin like/dislike and annotations (app-log.json filter.annotation.*, api/controllers/console/app/annotation.py) Note: per app log review, no cross-agent oversight page", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx browses every past session with tool messages (web/src/i18n/en.ts sessions.roles.tool) and an Automation filter for cron runs; hermes_cli/subcommands/approvals.py:13-23 `approvals suggest` mines past approval decisions; searched 'oversight|audit page' in web/src: none Note: After-the-fact review means reading transcripts; no oversight page that lists AI decisions for review.", - "open-webui": "source read at v0.11.4, not driven: admins browse any model's conversations and messages: backend/open_webui/routers/analytics.py:285 /models/{id}/chats, :125 /messages, src/lib/components/admin/Analytics/AnalyticsModelModal.svelte; user feedback review in admin Evaluations (Feedbacks.svelte); no decision log with review status or sign-off Note: transcript browsing, not a structured oversight workflow" + "open-webui": "source read at v0.11.4, not driven: admins browse any model's conversations and messages: backend/open_webui/routers/analytics.py:285 /models/{id}/chats, :125 /messages, src/lib/components/admin/Analytics/AnalyticsModelModal.svelte; user feedback review in admin Evaluations (Feedbacks.svelte); no decision log with review status or sign-off Note: transcript browsing, not a structured oversight workflow", + "n8n": "source read at n8n@2.40.7, not driven: past runs can be reviewed in the executions list and per-run logs (packages/frontend/editor-ui/src/features/execution/executions, logs/components/LogsPanel.vue) and in Agents-module session timelines (packages/frontend/editor-ui/src/features/agents/views/AgentSessionTimelineView.vue); searched 'oversight|review decision' in packages/frontend/editor-ui/src/features: no page that gathers AI decisions for review Note: Run history exists; there is no oversight page for AI decisions." } }, { @@ -4169,12 +4341,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'automation.?bias|rubber.?stamp|approv\\w* everything|approval fatigue' in *.py and *.ts outside tests: only a code comment in gateway/authz_mixin.py:474; hermes_cli/subcommands/approvals.py:22-23 `approvals suggest` goes the other way, proposing allowlist entries from repeated approvals", "dify": "source read at 1.17.1, not driven: searched 'automation bias|rubber.?stamp|approval rate|approve all' in api/ and web/i18n/en-US: no tracking of how reviewers answer Human Input forms", - "open-webui": "source read at v0.11.4, not driven: searched 'bias|rubber|approve all|approval rate' in backend/open_webui/utils/tool_approval.py, utils/middleware.py and src/lib/components/common/ToolCallDisplay.svelte: approvals are not counted or analysed per reviewer" + "open-webui": "source read at v0.11.4, not driven: searched 'bias|rubber|approve all|approval rate' in backend/open_webui/utils/tool_approval.py, utils/middleware.py and src/lib/components/common/ToolCallDisplay.svelte: approvals are not counted or analysed per reviewer", + "n8n": "source read at n8n@2.40.7, not driven: searched 'automation bias|rubber|approval rate|approve all' in packages/cli/src/modules/agents, packages/frontend/editor-ui/src/features/agents and packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts: approvals are recorded per call only, with no warning about approving without looking" } }, { @@ -4202,7 +4375,7 @@ "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 tool and skill usage breakdowns behind /insights (hermes_cli/commands.py:287) and web/src/i18n/en.ts models.toolCalls on AnalyticsPage; agent/tool_guardrails.py:1-6 flags tool-call loops within a turn; hermes_cli/config_defaults.py:1666 denial breaker after repeated guardian denials Note: Tool usage is counted and loops are caught; no review queue that flags misuse for a person. Old yes rested on a docs line.", - "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", + "n8n": "source read at n8n@2.40.7, not driven: tool calls are reviewable per run: session timelines with tool rows and a tool filter (packages/frontend/editor-ui/src/features/agents/components/SessionTimelineTable.vue, SessionEventFilter.vue) and workflow logs (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue); every AI tool call is an event 'n8n.ai.tool.called' (packages/cli/src/eventbus/event-message-classes/index.ts:35); searched 'flag|misuse' in features/agents: no way to flag a tool call Note: Review yes, flagging misuse no.", "dify": "source read at 1.17.1, not driven: tool calls are visible per message and per run in the logs (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38, workflow run detail via api/controllers/console/app/workflow_run.py) and a reviewer can mark answers with admin feedback or annotations (api/controllers/console/app/annotation.py); searched 'misuse|flag tool' in api/: no tool-level flagging Note: review yes, flagging misuse per tool no", "open-webui": "source read at v0.11.4, not driven: per-user 'Most used tools' in src/lib/components/chat/Settings/Usage.svelte:472 (routers/chats.py:307 /stats/usage); admins read tool calls inside any conversation (routers/analytics.py:125 /messages, :285 model chats); searched 'flag|misuse|report' in routers/analytics.py and routers/tools.py: no flagging Note: tool use is visible, misuse cannot be flagged" } @@ -4228,12 +4401,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_state_messages.py / state.db keep every message and tool call per session; cron/executions.py:1-6 durable per-attempt execution ledger with immutable terminal states; agent/curator_backup.py:37 append-only curator ledger; searched 'tamper|hash.?chain|audit trail' in *.py: no tamper-evident log, and sessions are deletable (hermes_cli/web_routers/sessions.py:696) Note: Runs and tool calls are recorded but can be deleted or pruned; nothing prevents change afterwards.", "dify": "source read at 1.17.1, not driven: every run, node execution and agent thought is stored (api/models/workflow.py node executions, message agent thoughts) but rows are deletable by retention jobs (api/services/retention/conversation/messages_clean_service.py:566); audit events are emitted as log lines for the Enterprise OTel exporter only (api/controllers/openapi/_audit.py:1-6; api/enterprise/telemetry/README.md 'only available in ENTERPRISE') Note: records exist, not tamper-proof; audit stream is enterprise-licensed", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/audit.py:36 AuditLogEntry middleware writes HTTP requests (with user, path, body up to MAX_BODY_LOG_SIZE) to DATA_DIR/audit.log via utils/logger.py:200 with rotation; off by default (env.py:1236 AUDIT_LOG_LEVEL 'NONE'); plain rotating file, not tamper-evident, and tool calls are only inside chat records Note: request-level audit, not immutable, off by default" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/audit.py:36 AuditLogEntry middleware writes HTTP requests (with user, path, body up to MAX_BODY_LOG_SIZE) to DATA_DIR/audit.log via utils/logger.py:200 with rotation; off by default (env.py:1236 AUDIT_LOG_LEVEL 'NONE'); plain rotating file, not tamper-evident, and tool calls are only inside chat records Note: request-level audit, not immutable, off by default", + "n8n": "source read at n8n@2.40.7, not driven: runs are stored as executions and AI tool calls emit 'n8n.ai.tool.called' events (packages/cli/src/eventbus/event-message-classes/index.ts:16,35); the append-only copy lives outside n8n only when log streaming is on, packages/cli/src/modules/log-streaming.ee/log-streaming.controller.ts:46 @Licensed('feat:logStreaming'); executions are prunable and deletable (packages/@n8n/config/src/configs/executions.config.ts:106-111) Note: Local history can be deleted or pruned; a tamper-evident trail needs the enterprise-licensed log streaming to an outside store." } }, { @@ -4256,12 +4430,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/sessions.py:69-95 `sessions export --format jsonl|trace --redact` over filtered sessions; hermes_cli/subcommands/cron.py:168 `cron runs` execution history Note: Exports are transcripts, not an audit report; no dashboard export across sessions.", "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI to JSONL.GZ per app (no tool calls); api/controllers/console/workflow_run_archive.py:93-130 run archive download is Cloud paid-plan only; Enterprise OTel exporter (api/enterprise/telemetry/exporter.py) ships audit logs Note: CLI message export in community; fuller audit export is cloud or enterprise", - "open-webui": "source read at v0.11.4, not driven: the audit trail is the file at env.py:1226 AUDIT_LOGS_FILE_PATH (utils/logger.py:200) that an operator can copy; searched 'audit' in backend/open_webui/routers and src/lib/components/admin: no export endpoint or UI; chat data export exists (routers/chats.py:1049 /all/db admin)" + "open-webui": "source read at v0.11.4, not driven: the audit trail is the file at env.py:1226 AUDIT_LOGS_FILE_PATH (utils/logger.py:200) that an operator can copy; searched 'audit' in backend/open_webui/routers and src/lib/components/admin: no export endpoint or UI; chat data export exists (routers/chats.py:1049 /all/db admin)", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/log-streaming.ee/destinations/ streams audit and AI events to syslog, webhook or Sentry, licence-gated at log-streaming.controller.ts:46,57 @Licensed('feat:logStreaming'); executions can be exported per run through the public API (packages/cli/src/public-api/v1/handlers/executions/spec/paths/getExecutions.generated.yml:18) Note: Enterprise-licensed; no one-file audit export for an auditor." } }, { @@ -4285,12 +4460,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:2231-2245 sessions.auto_prune with retention_days (default 90) deletes ended sessions on startup sweeps; hermes_cli/subcommands/sessions.py:105 `sessions prune` by age, source or title; :123 archive", "dify": "source read at 1.17.1, not driven: api/configs/feature/__init__.py:1425 ENABLE_CLEAN_MESSAGES and :1623-1624 WORKFLOW_LOG_CLEANUP_ENABLED / WORKFLOW_LOG_RETENTION_DAYS; api/schedule/clean_messages.py:17-23 'Self-hosted editions delete all messages within the configured time range'; api/schedule/clean_workflow_runlogs_precise.py Note: instance-wide environment settings, off by default, no per-workspace or per-agent setting in the UI", - "open-webui": "source read at v0.11.4, not driven: searched 'retention|older_than|prune|expire|ttl' in backend/open_webui/routers, models/chats.py and config.py: no chat or run retention period; ENABLE_KNOWLEDGE_FILE_RETENTION (config.py:985) only keeps files when removed from a knowledge base; temporary chats that are never stored can be enforced per user ('temporary_enforced' permission)" + "open-webui": "source read at v0.11.4, not driven: searched 'retention|older_than|prune|expire|ttl' in backend/open_webui/routers, models/chats.py and config.py: no chat or run retention period; ENABLE_KNOWLEDGE_FILE_RETENTION (config.py:985) only keeps files when removed from a knowledge base; temporary chats that are never stored can be enforced per user ('temporary_enforced' permission)", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/executions.config.ts:106-126 EXECUTIONS_DATA_PRUNE (on by default), EXECUTIONS_DATA_MAX_AGE 336 hours and max count 10,000 with a hard-delete buffer; agent checkpoints expire after N8N_AGENTS_CHECKPOINT_TTL (packages/@n8n/config/src/configs/agents.config.ts:38-39) Note: Set by the operator in environment variables, not in the UI." } }, { @@ -4314,12 +4490,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/inventory.py:1-2 is a provider/model inventory for pickers, not an AI-feature register", "dify": "source read at 1.17.1, not driven: searched 'register|risk class|ai act|inventory' in api/models, api/services and web/i18n/en-US: no register of AI features with a risk class", - "open-webui": "source read at v0.11.4, not driven: searched 'register|risk class|ai act|inventory' in backend/open_webui/models and src/lib/components/admin: no register of AI features with a risk class" + "open-webui": "source read at v0.11.4, not driven: searched 'register|risk class|ai act|inventory' in backend/open_webui/models and src/lib/components/admin: no register of AI features with a risk class", + "n8n": "source read at n8n@2.40.7, not driven: searched 'ai register|risk class|AI Act|inventory' in packages/cli/src and packages/frontend/editor-ui/src: no register of AI features with a risk class" } }, { @@ -4343,12 +4520,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no risk-level field", "dify": "source read at 1.17.1, not driven: searched 'risk|ai act|high.?risk|classification' in api/models/agent.py, api/models/model.py and web/i18n/en-US: agents and apps carry no risk level field", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models carry no risk-level field (backend/open_webui/models/models.py:74 ModelMeta)" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models carry no risk-level field (backend/open_webui/models/models.py:74 ModelMeta)", + "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no EU AI Act risk classification of agents" } }, { @@ -4372,12 +4550,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; no sign-off or go-live gate on profiles, skills or plugins beyond tools/write_approval.py staged writes", "dify": "source read at 1.17.1, not driven: searched 'dpo|data protection officer|sign.?off|go.?live approval' in api/ and web/i18n/en-US: publishing an agent needs only edit/publish permission (api/controllers/console/agent/roster.py:815), no sign-off step", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; publishing a model is immediate on save (routers/models.py:285), no sign-off step" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; publishing a model is immediate on save (routers/models.py:285), no sign-off step", + "n8n": "source read at n8n@2.40.7, not driven: workflow reviews let an author request named reviewers (packages/@n8n/db/src/entities/workflow-review-request-reviewer.ee.ts) and block publishing while a review is open or changes are requested (packages/cli/src/modules/workflow-reviews.ee/workflow-review-publish-guard.service.ts:8-22), licence-gated by feat:workflowReviews (packages/@n8n/constants/src/index.ts:58); searched 'data protection officer|DPIA|high-risk' in packages/cli/src: no DPO role or risk trigger Note: A DPO can be named as reviewer by hand; nothing ties sign-off to high-risk features. Enterprise-licensed." } }, { @@ -4402,12 +4581,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/subcommands/security.py and `skills audit` scan code and skills for security patterns, not against a control framework", "dify": "source read at 1.17.1, not driven: searched 'iso 42001|42001|control framework|ai act' in api/ and web/i18n/en-US: nothing checks the organisation against a framework; web/i18n/en-US/common.json:124-125 only lists Dify's own vendor certificates (GDPR DPA, ISO 27001)", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no control framework checks anywhere in admin settings" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no control framework checks anywhere in admin settings", + "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768); the security audit checks instance hygiene (packages/cli/src/security-audit/risk-reporters/ credentials, database, filesystem, instance, nodes), not a control framework" } }, { @@ -4430,12 +4610,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profile_cmd.py:384-395 `profile show` prints model and provider, gateway state, skill count, SOUL.md presence and distribution; hermes_cli/profile_cmd.py:564-570 `profile info` prints description, author, licence, requirements, source of a distribution Note: A profile summary exists; it does not describe data used or purpose in fact-sheet form or export one.", "dify": "source read at 1.17.1, not driven: searched 'fact ?sheet|model card|system card' in api/ and web/i18n/en-US: no generated fact sheet of an agent's model, data and purpose; the closest is DSL export of its configuration (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52)", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the nearest artefact is the model JSON export (routers/models.py:381) and the description field (ModelEditor.svelte:962), not a generated fact sheet" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the nearest artefact is the model JSON export (routers/models.py:381) and the description field (ModelEditor.svelte:962), not a generated fact sheet", + "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no generated fact sheet for an agent's model, data and purpose" } }, { @@ -4460,12 +4641,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; the nearest exports are session transcripts (hermes_cli/subcommands/sessions.py:69) and `hermes debug` reports (hermes_cli/commands.py:303), neither a compliance report", "dify": "source read at 1.17.1, not driven: api/controllers/console/billing/compliance.py:28-49 and api/services/compliance_download_service.py only hand out Dify's own vendor documents (GDPR DPA, ISO 27001, web/i18n/en-US/common.json:124-127) to paid Cloud plans; no compliance report about the organisation's own agents Note: the 'compliance' download is the vendor's certificate, not the customer's report", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; exports cover models, chats, feedback and config (routers/models.py:381, routers/evaluations.py:354, routers/configs.py:118), none is a compliance report" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; exports cover models, chats, feedback and config (routers/models.py:381, routers/evaluations.py:354, routers/configs.py:118), none is a compliance report", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/audit.ts:27 'Generate a security audit report for this n8n instance' and public API packages/cli/src/public-api/v1/handlers/audit/audit.handler.ts return one risk report (packages/cli/src/security-audit/risk-reporters/: credentials, database, filesystem, instance, nodes); searched 'AI Act|42001|compliance report' in packages/cli/src: no AI compliance report Note: A one-shot security risk report, not an AI compliance report." } }, { @@ -4488,12 +4670,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 records operational cron failure incidents (job id, error signature, ack) with no impact or remediation fields; searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none Note: Operational failure incidents only; no AI-incident record.", "dify": "source read at 1.17.1, not driven: searched 'incident|impact|postmortem' in api/models, api/services and web/i18n/en-US: no AI incident record", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the event catalogue (events.py:42) has no incident type" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the event catalogue (events.py:42) has no incident type", + "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no record of AI incidents, impact or follow-up" } }, { @@ -4517,12 +4700,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; cron/incidents.py:1-10 alerts only the operator's home channel", "dify": "source read at 1.17.1, not driven: searched 'authority|regulator|serious incident|notify' in api/services and web/i18n/en-US: no incident record and no authority notification", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no incident record to notify from" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no incident record to notify from", + "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no incident register and no notification to an authority" } }, { @@ -4545,12 +4729,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'owner|attest|review.{0,20}(access|owner)|recertif' in hermes_cli/profiles.py and hermes_cli/profile_cmd.py: no owner field and no periodic review; hermes_cli/profiles.py:538-575 ProfileInfo", "dify": "source read at 1.17.1, not driven: searched 'access review|attest|recertif|periodic review' in api/ and web/i18n/en-US: no periodic owner or need review of agents", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models keep their creator as owner forever (backend/open_webui/models/models.py:117) with no review date or re-attestation" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models keep their creator as owner forever (backend/open_webui/models/models.py:117) with no review date or re-attestation", + "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no periodic review in which owners attest that an agent is still needed; user and project membership pages exist but carry no review cycle" } }, { @@ -4574,12 +4759,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "no", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'transparency|explain.{0,20}agent|public.{0,20}(page|description)' in web/src and hermes_cli/web_routers: none; profile descriptions (hermes_cli/web_routers/profiles.py:928) feed the kanban router and are not published to anyone", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/site.py:49-57 each web app can show a description, privacy policy link and custom disclaimer to its users; no generated plain-language register or explanation of the agents employees deal with Note: per-app description and disclaimer only", - "open-webui": "source read at v0.11.4, not driven: each agent has a user-facing, localisable description (backend/open_webui/models/models.py:78 'User-facing description of the model.', ModelEditor.svelte:962) shown in the model selector, and admins can post banners (src/lib/components/admin/Settings/Interface/Banners.svelte); no published page explaining the agents employees deal with Note: short per-agent descriptions only" + "open-webui": "source read at v0.11.4, not driven: each agent has a user-facing, localisable description (backend/open_webui/models/models.py:78 'User-facing description of the model.', ModelEditor.svelte:962) shown in the model selector, and admins can post banners (src/lib/components/admin/Settings/Interface/Banners.svelte); no published page explaining the agents employees deal with Note: short per-agent descriptions only", + "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no published plain-language explanation of agents for employees" } }, { @@ -4602,12 +4788,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/status.py:157 `hermes status` prints the effective provider; hermes_cli/config_defaults.py:715-790 auxiliary..provider per feature in config; hermes_cli/model_data_policy_guard.py:1-6 warns when a tier trains on prompts; searched 'region|residency|data location' in hermes_cli/: no per-feature residency view Note: You can read which provider each feature uses from config and status, but not where that provider processes the data.", "dify": "source read at 1.17.1, not driven: searched 'residency|region|data location|processing location' in api/ and web/i18n/en-US: providers show no processing location per feature", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; connections record a URL but no location, and no view maps AI features to where they process data (src/lib/components/admin/Settings/Connections.svelte)" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; connections record a URL but no location, and no view maps AI features to where they process data (src/lib/components/admin/Settings/Connections.svelte)", + "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no view of where each AI feature processes data; a model credential only holds its endpoint (packages/nodes-base/credentials/OpenAiApi.credentials.ts:35-36 Base URL)" } }, { @@ -4631,12 +4818,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'department|group|org' scoping in hermes_cli/profiles.py and gateway/authz_mixin.py: no organisational units; agent/estop.py:31-39 pauses a whole profile or install and gateway/authz_mixin.py:32-37 allowlists individual user ids, with no proof-of-off report Note: Cutting a set of users off is possible by editing allowlists, not by department, and nothing proves it.", "dify": "source read at 1.17.1, not driven: searched 'department|group.*disable|ai off' in api/ and web/i18n/en-US: community has no departments; enterprise RBAC per-agent access policies (web/features/agent-v2/permissions.ts:37, api/configs/enterprise/__init__.py:38) grant access but there is no switch that turns AI off for a group with proof", - "open-webui": "source read at v0.11.4, not driven: group permissions switch features and model access per group (src/lib/components/admin/Users/Groups/Permissions.svelte:44-51, backend/open_webui/routers/groups.py:401); permissions are additive and a default user permission 'will remain enabled' (Permissions.svelte:78), and there is no proof view that AI is off for a group Note: can narrow a group only when defaults are off; no evidence it is off" + "open-webui": "source read at v0.11.4, not driven: group permissions switch features and model access per group (src/lib/components/admin/Users/Groups/Permissions.svelte:44-51, backend/open_webui/routers/groups.py:401); permissions are additive and a default user permission 'will remain enabled' (Permissions.svelte:78), and there is no proof view that AI is off for a group Note: can narrow a group only when defaults are off; no evidence it is off", + "n8n": "source read at n8n@2.40.7, not driven: a project's node type policy can block AI node types for that project (packages/cli/src/modules/type-availability-policies/type-availability-policy-project.controller.ts:19-24), licence-gated in type-availability-policies.module.ts:10-12 licenseFlag NODE_TYPE_POLICIES and not in the default module list; the chat hub has only an instance-wide switch (packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:73) Note: Per project (as a department) with an enterprise licence and an opt-in module; proof is the policy itself, no report." } }, { @@ -4664,7 +4852,7 @@ "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:121 run list with status filter, created time and elapsed time (web/app/components/app/workflow-log/list.tsx); api/controllers/console/agent/roster.py:1133 agent logs with created/updated time, message count and user rate (web/i18n/en-US/agent-v-2.json logs.table.*)", - "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/execution/executions/views/ExecutionsView.vue lists executions with status, start time and duration (en.json:1429 'Error', 1621 'Waiting' statuses); Agents module sessions list per agent (packages/frontend/editor-ui/src/features/agents/views/AgentSessionsListView.vue, AgentSessionsFilter.vue:25-34 status filter)", "open-webui": "source read at v0.11.4, not driven: scheduled runs: backend/open_webui/routers/automations.py:388 GET /{id}/runs with status, time and error (models/automations.py:43-50), shown in src/lib/components/automations/AutomationEditor.svelte:355-400; interactive turns are chats with no status list; no list across all agents Note: old yes; run history exists only per automation", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx with web/src/i18n/en.ts sessions.filterAutomation 'Automation' lists cron and other runs with time; hermes_cli/web_routers/cron.py:243 GET /api/cron/jobs/{id}/runs; hermes_cli/subcommands/cron.py:168 `cron runs` durable attempts with status (cron/executions.py:1-6)" } @@ -4689,12 +4877,12 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "partial", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:596 GET /api/sessions/{id}/messages and :651 /timeline behind web/src/pages/SessionsPage.tsx with user, assistant and tool roles in order (web/src/i18n/en.ts sessions.roles); plugins/observability/langfuse traces each step; hermes_cli/subcommands/sessions.py:76 `--format trace` export for the Agent Trace Viewer", "dify": "source read at 1.17.1, not driven: workflow run detail with a TRACING tab listing each node in order with inputs, outputs, status, time and tokens (web/i18n/en-US/run-log.json tracing, meta.*; web/app/components/workflow/run/node.tsx:89); chat messages show each agent thought and tool call (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38); agent logs per conversation (api/controllers/console/agent/roster.py:1172)", - "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", + "n8n": "source read at n8n@2.40.7, not driven: the Logs panel shows each node, model call and tool call of a run in order with inputs and outputs (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue, LogDetailsPanel.vue, LogsViewRunData.vue); Agents-module session timeline with tool calls and token use per message (packages/frontend/editor-ui/src/features/agents/views/AgentSessionTimelineView.vue, en.json:1435 'Token Usage') Note: Old partial rested on a generic execution-history line; logs show every step in order.", "open-webui": "source read at v0.11.4, not driven: each run is a chat whose assistant message keeps ordered output items (function_call, function_call_output, reasoning, text; backend/open_webui/utils/tool_approval.py:43, utils/middleware.py:5925); src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116-176 renders them in order; automation runs link to their chat (models/automations.py:46 chat_id)" } }, @@ -4721,7 +4909,7 @@ "n8n": "yes", "open-webui": "partial", "evidence": { - "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/executions/executions.controller.ts:129 POST /:id/retry re-runs a past execution (en.json:1577 'Retry execution', 1579 'Retry with currently saved workflow'); 'Debug in editor' loads a past run's data into the canvas (en.json:1631), paywalled per en.json:1632 (feat:debugInEditor) Note: Retry is free; loading the run into the editor is enterprise-licensed.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:68 /retry resends the last message, :71 /undo backs up N turns and re-prompts, :76 /branch forks a session; hermes_cli/subcommands/cron.py:157 re-runs a job; agent/replay_cleanup.py:1-5 only sanitises resumed history; searched 'replay' for a run re-execution feature: none Note: You can re-run from a point in a live session, but not replay a stored past run to reproduce it.", "dify": "source read at 1.17.1, not driven: in the draft canvas a node can be re-run with its Last Run values from the variable inspector (web/i18n/en-US/workflow.json:272 debug.lastRunTab; api/controllers/console/app/workflow_draft_variable.py); searched 'replay|rerun|run again' in web/i18n/en-US and api/controllers/console/app: no replay of a logged production run (only a Re-run in RAG pipelines, pipeline.json:12) Note: node re-run in the editor, not replay of a past run", "open-webui": "source read at v0.11.4, not driven: a past turn can be re-run with 'Regenerate' (src/lib/components/chat/Messages/ResponseMessage.svelte, permission chat.regenerate_response) and a chat cloned or forked (backend/open_webui/routers/chats.py:1775 /clone, :1672 /fork); tool results are not recorded for deterministic replay, so it is a fresh run" @@ -4750,7 +4938,7 @@ "n8n": "partial", "open-webui": "no", "evidence": { - "n8n": "docs-only: competitor_features#3919 \"core: Fix IDOR in test-runs endpoint by consolidating access checks: From n8n@2.14.0 (2026-03-24)\"", + "n8n": "source read at n8n@2.40.7, not driven: pinned node data lets a run reuse fixed outputs instead of calling a service (MCP tool packages/cli/src/modules/mcp/tools/prepare-workflow-pin-data.tool.ts, instance-ai-run-pin-data.ts); the agent preview 'only tests the agent' but still runs its tools (en.json:654); searched 'dry run|dryRun|sandbox mode' in packages/cli/src/modules/agents: no mode that blocks side effects Note: No switch that keeps an agent from changing anything; pinning must be set per node.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:132 /plan writes a plan without executing anything; hermes_cli/commands.py:213 /tools disable to remove write-capable tools for a run; hermes_cli/commands.py:83 /rollback restores filesystem checkpoints (tools/checkpoint_manager.py); searched 'dry.?run' in hermes_cli/commands.py: only /worktree prune and /compress previews Note: No mode that runs an agent end to end while blocking every side effect.", "dify": "source read at 1.17.1, not driven: searched 'dry.?run|mock|simulat' in web/i18n/en-US/workflow.json, agent-v-2.json and api/core/workflow: draft debug runs and Agent v2 Build mode execute tools and the sandbox for real (agent-v-2.json build.empty.communityEditionTip 'changes made to the file system happen in real time'); only webhook triggers can be simulated (workflow.json:291) Note: test runs are separate from the published version but still act", "open-webui": "source read at v0.11.4, not driven: searched 'dry run|dry_run|simulate|sandbox mode' in backend/open_webui/utils/middleware.py, utils/tools.py and routers: no mode that lets an agent run while blocking side effects; the closest is per-chat 'Ask for approval' (utils/middleware.py:5934)" @@ -4777,13 +4965,14 @@ "hermes-agent": "partial", "copilot-studio": "yes", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", "dify": "source read at 1.17.1, not driven: per app/agent charts for conversations, end users, token costs, session interactions, satisfaction rate, response time and tokens per second (api/controllers/console/app/statistic.py:151-340; workflow_statistic.py:97-184; agent-v-2.json monitoring.metrics.*). No dashboard across agents and no success-rate or tool-use chart Note: per app, no cross-agent view, no tool use", "open-webui": "source read at v0.11.4, not driven: admin Analytics (src/lib/components/admin/Analytics/Dashboard.svelte) with backend/open_webui/routers/analytics.py:58 per-model counts, :85 users, :199 daily, :235 token usage by model, feedback activity; no success rate, speed, cost or tool use per agent Note: README.md:68 says cost, the code tracks tokens only", - "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/analytics.py:143 /api/analytics/usage and :305 /api/analytics/models behind web/src/pages/AnalyticsPage.tsx: tokens per day, sessions, API calls, estimated cost, tool calls, top skills (web/src/i18n/en.ts analytics, models); agent/insights.py:1-2 /insights Note: Cost, volume and tool use are charted; success rate and speed are not, and there is no per-agent breakdown across profiles on one dashboard." + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/analytics.py:143 /api/analytics/usage and :305 /api/analytics/models behind web/src/pages/AnalyticsPage.tsx: tokens per day, sessions, API calls, estimated cost, tool calls, top skills (web/src/i18n/en.ts analytics, models); agent/insights.py:1-2 /insights Note: Cost, volume and tool use are charted; success rate and speed are not, and there is no per-agent breakdown across profiles on one dashboard.", + "n8n": "source read at n8n@2.40.7, not driven: Insights shows production executions, failure rate, time saved and average run time (en.json:6750-6755; packages/cli/src/modules/insights), the full dashboard behind feat:insights:viewDashboard (packages/@n8n/constants/src/index.ts:46); searched 'cost|tool use' in packages/cli/src/modules/insights: no cost or tool-use metrics across agents Note: Success and speed per workflow; no cost or tool use; dashboard is enterprise-licensed." } }, { @@ -4807,13 +4996,14 @@ "hermes-agent": "partial", "copilot-studio": "partial", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_state_usage.py:29-56 per-session estimated_cost_usd and actual_cost_usd with token counts; hermes_cli/commands.py:138 /status and :280 /usage show session tokens; gateway/runtime_footer.py:1-6 optional per-reply footer (model, context %, latency) Note: Tokens and cost are kept per session (run), not per step.", "dify": "source read at 1.17.1, not driven: web/app/components/workflow/run/meta.tsx:91-97 total tokens per run and web/app/components/workflow/run/node.tsx:89 tokens per node; money cost appears only in aggregate token-cost charts (api/controllers/console/app/statistic.py:232, web/app/components/app/overview/app-chart.tsx) Note: tokens per run and step, cost only in totals", - "open-webui": "source read at v0.11.4, not driven: per-message token usage stored (backend/open_webui/utils/middleware.py:3737 merge_usage) and shown in src/lib/components/chat/Messages/ResponseMessage.svelte:1209-1213; searched 'cost|price' in routers/analytics.py and utils/middleware.py: no cost, and no per-step split" + "open-webui": "source read at v0.11.4, not driven: per-message token usage stored (backend/open_webui/utils/middleware.py:3737 merge_usage) and shown in src/lib/components/chat/Messages/ResponseMessage.svelte:1209-1213; searched 'cost|price' in routers/analytics.py and utils/middleware.py: no cost, and no per-step split", + "n8n": "source read at n8n@2.40.7, not driven: Agents-module sessions show token usage and cost per message (en.json:1435 'Token Usage', 1492 'Cost'; cost from the model catalog, packages/@n8n/agents/src/sdk/catalog.ts:215-217 and runtime/loop/agent-runtime.ts:1234, recorded in packages/cli/src/modules/agents/execution-recorder.ts:472); workflow Logs panel shows tokens per model call (packages/frontend/editor-ui/src/features/execution/logs/components/LogsViewConsumedTokenCountText.vue) Note: Cost only in the opt-in Agents module; workflow runs show tokens, not cost." } }, { @@ -4836,12 +5026,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-63 agent.max_turns hard cap with budget_warning_ratio one-time warning and run_budget_seconds wall-clock budget with an 80% notice; hermes_state_maintenance.py:71 max_cost is only a session filter; searched 'max_cost|spend_limit|budget_usd|cost_cap' in *.py: no money budget Note: Warning plus hard stop exist for turns and time, not for spend.", "dify": "source read at 1.17.1, not driven: searched 'budget|spend limit|spending|hard stop' in web/i18n/en-US and api/services: none for self-hosted; hosted-credit quotas (api/services/credit_pool_service.py, quota_service.py) apply to Dify Cloud's own trial credits, not a user-set budget with warning and stop", - "open-webui": "source read at v0.11.4, not driven: searched 'budget|spend|limit|price' in backend/open_webui/routers/analytics.py, utils/middleware.py, routers/openai.py and config.py: no spending budget, warning level or hard stop" + "open-webui": "source read at v0.11.4, not driven: searched 'budget|spend|limit|price' in backend/open_webui/routers/analytics.py, utils/middleware.py, routers/openai.py and config.py: no spending budget, warning level or hard stop", + "n8n": "source read at n8n@2.40.7, not driven: searched 'budget|spend limit|hard stop' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/agents/src: no user-set spending budget; the only budget is n8n's own AI gateway credit quota from the licence (packages/cli/src/services/frontend.service.ts:600 quota:aiGatewayBudget)" } }, { @@ -4864,12 +5055,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/model_cost_guard.py:1-26 warns before selecting a model priced above the input/output cost thresholds; hermes_cli/subcommands/prompt_size.py:13 `hermes prompt-size` byte breakdown of system prompt and tool schemas; hermes_cli/commands.py:143 /context usage gauge; searched 'estimate.{0,20}cost|forecast' for a pre-run cost estimate: none Note: Warns about expensive models and shows prompt size; no cost forecast for a run before it starts. Old yes rested on a docs line.", "dify": "source read at 1.17.1, not driven: searched 'estimate|expected cost|cost preview' in api/controllers/console/app and web/i18n/en-US: the only estimate is document indexing cost for knowledge bases (api/controllers/console/datasets/datasets_document.py:706 indexing-estimate), none for an agent or workflow run", - "open-webui": "source read at v0.11.4, not driven: searched 'estimate|cost|price' in backend/open_webui/main.py, routers/analytics.py and src/lib/components/chat/MessageInput.svelte: main.py:1933 /api/v1/messages/count_tokens counts input tokens for Anthropic-style clients and MessageInput.svelte:1837 shows context usage, but nothing predicts a run's cost" + "open-webui": "source read at v0.11.4, not driven: searched 'estimate|cost|price' in backend/open_webui/main.py, routers/analytics.py and src/lib/components/chat/MessageInput.svelte: main.py:1933 /api/v1/messages/count_tokens counts input tokens for Anthropic-style clients and MessageInput.svelte:1837 shows context usage, but nothing predicts a run's cost", + "n8n": "source read at n8n@2.40.7, not driven: searched 'estimate|estimated cost|forecast' in packages/cli/src/modules/agents, packages/@n8n/agents/src and packages/frontend/editor-ui/src/features/agents: cost is recorded after a run (packages/cli/src/modules/agents/execution-recorder.ts:472), never predicted before it starts; Insights 'time saved' estimates (en.json:6745) concern time, not cost" } }, { @@ -4893,12 +5085,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_failure_copy.py:1-6 plain-language failure notice delivered to the job's chat with the exact fix command; cron/incidents.py:1-10 alert state with repeat throttling; agent/monitoring/cron_health.py cron health events", "dify": "source read at 1.17.1, not driven: searched 'alert|on failure notify|failed run email' in api/tasks, api/schedule and web/i18n/en-US: failures show only in logs and the editor toast (web/i18n/en-US/workflow.json:242 common.scheduleTriggerRunFailed); api/schedule/queue_monitor_task.py alerts admins about Celery queue length, not run failures Note: alerting only by wiring an external tracer or OTel collector", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:526 publish_event AUTOMATION_RUN_FAILED routed to admin event webhooks (events.py:1034); chat.failed is a user notification event (events.py:669, utils/notifications.py:287) with browser and webhook delivery (src/lib/components/chat/Settings/Notifications.svelte:37 'Chat failed')" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:526 publish_event AUTOMATION_RUN_FAILED routed to admin event webhooks (events.py:1034); chat.failed is a user notification event (events.py:669, utils/notifications.py:287) with browser and webhook delivery (src/lib/components/chat/Settings/Notifications.svelte:37 'Chat failed')", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/ErrorTrigger starts a chosen error workflow whenever a workflow fails (set per workflow in its settings as errorWorkflow), which then mails or posts the alert with any node; Agents-module channel failures show as 'Not running' (en.json:8554) Note: The alert channel is whatever the error workflow sends to." } }, { @@ -4921,12 +5114,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'drift' in agent/ cron/ gateway/ hermes_cli/ excluding clock, schema, config and terminal drift: only prompt-cache and table-padding comments; cron/monitor.py:1-8 detects changes in a monitored source, not drift in agent results", "dify": "source read at 1.17.1, not driven: searched 'drift|regression|quality trend|anomal' in api/ and web/i18n/en-US: no drift detection; satisfaction rate chart (api/controllers/console/app/statistic.py:286) is the nearest signal", - "open-webui": "source read at v0.11.4, not driven: searched 'drift|anomaly|regression|baseline' in backend/open_webui/routers/analytics.py, routers/evaluations.py and utils: no monitoring of result quality over time beyond the feedback leaderboard history (routers/evaluations.py:268)" + "open-webui": "source read at v0.11.4, not driven: searched 'drift|anomaly|regression|baseline' in backend/open_webui/routers/analytics.py, routers/evaluations.py and utils: no monitoring of result quality over time beyond the feedback leaderboard history (routers/evaluations.py:268)", + "n8n": "source read at n8n@2.40.7, not driven: searched 'drift|regression|anomal' in packages/cli/src/modules/agents, agent-evals, insights and packages/@n8n/agents/src: no watch on result quality over time; evaluations run only when started" } }, { @@ -4950,10 +5144,10 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "partial", + "n8n": "yes", "open-webui": "yes", "evidence": { - "n8n": "docs-only: competitor_features#6928 \"core: Fix /healthz endpoint when using N8N_PATH: From n8n@2.15.0 (2026-03-30)\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/endpoints.config.ts:8 N8N_METRICS enables a Prometheus /metrics endpoint (packages/cli/src/metrics/prometheus/, event-bus-metrics.service.ts) and /healthz health checks for monitoring Note: Old partial rested on a /healthz bug fix; Prometheus metrics and health endpoints ship.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1591-1592 GET /health and /health/detailed; hermes_cli/web_routers/status.py:115 /api/health and :555 /api/system/stats; agent/monitoring/otlp_exporter.py:1-6 exports health and diagnostic events to an OpenTelemetry collector; hermes_cli/subcommands/monitoring.py:19 Note: Metrics are pushed over OTLP; the pull endpoints are health checks, not a Prometheus scrape.", "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads and /db-pool-stat endpoints; api/configs/observability/otel/otel_config.py:10-25 ENABLE_OTEL exports traces and metrics over OTLP to a monitoring system; api/celery_healthcheck.py for workers Note: OTel metrics off by default", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health, :3009 /health/db for probes; utils/telemetry/metrics.py:151 setup_metrics with request counter, duration histogram and user gauges exported over OTLP (env.py:1267 ENABLE_OTEL_METRICS, :1271 endpoint) Note: metrics are pushed over OTLP, not a Prometheus scrape endpoint" @@ -4980,12 +5174,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/app/ops_trace.py per-app tracing config; api/core/ops/ops_trace_manager.py sends traces to Langfuse, LangSmith, Opik, Weave, Arize, Phoenix, MLflow, Databricks, Aliyun, Tencent (web/i18n/en-US/app.json:221-267 tracing.*.title)", "hermes-agent": "source read at v2026.9.24, not driven: plugins/observability/langfuse/plugin.yaml:1-3 bundled Langfuse plugin traces conversations, LLM calls and tool usage (opt-in); agent/monitoring/otlp_exporter.py:1-6 OTLP export", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1266 ENABLE_OTEL_TRACES, :1270 OTEL_EXPORTER_OTLP_ENDPOINT, utils/telemetry/setup.py and instrumentors.py send traces to any OTLP collector (Langfuse accepts OTLP); direct Langfuse hooks exist only as community pipeline filters Note: OTLP in core; native Langfuse only via community pipelines" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1266 ENABLE_OTEL_TRACES, :1270 OTEL_EXPORTER_OTLP_ENDPOINT, utils/telemetry/setup.py and instrumentors.py send traces to any OTLP collector (Langfuse accepts OTLP); direct Langfuse hooks exist only as community pipeline filters Note: OTLP in core; native Langfuse only via community pipelines", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/otel (default module, packages/@n8n/backend-common/src/modules/module-registry.ts:70) exports workflow and agent spans over OTLP (otel.config.ts:9-21 endpoint, protocol, headers), agent spans toggled by N8N_AGENTS_TRACING_ENABLED (packages/@n8n/config/src/configs/agents.config.ts:49-50); LangChain nodes honour LANGCHAIN_TRACING_V2 and agent sessions export to LangSmith (packages/cli/src/modules/agents/agent-session-langsmith-export.service.ts:29) Note: Langfuse is reached through its OTLP endpoint, not a named integration." } }, { @@ -5009,13 +5204,14 @@ "hermes-agent": "partial", "copilot-studio": "partial", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 usage insights (tokens, cost, tool/skill use, activity, model/platform breakdowns) on demand via /insights (hermes_cli/commands.py:287) and `hermes insights`; searched 'weekly report|periodic report|digest.{0,20}usage' in cron/ and agent/: no scheduled usage report Note: Reports are on demand; a periodic one would be a hand-built cron job.", "dify": "source read at 1.17.1, not driven: searched 'report|weekly|monthly digest|usage report' in api/schedule, api/tasks and web/i18n/en-US: no periodic usage report; usage is only on the live Overview/Monitoring charts (api/controllers/console/app/statistic.py)", - "open-webui": "source read at v0.11.4, not driven: searched 'report|digest|weekly' in backend/open_webui/routers/analytics.py, utils/automations.py and events.py: analytics are on-demand dashboards (src/lib/components/admin/Analytics/Dashboard.svelte); no periodic usage report" + "open-webui": "source read at v0.11.4, not driven: searched 'report|digest|weekly' in backend/open_webui/routers/analytics.py, utils/automations.py and events.py: analytics are on-demand dashboards (src/lib/components/admin/Analytics/Dashboard.svelte); no periodic usage report", + "n8n": "source read at n8n@2.40.7, not driven: searched 'report|digest|weekly' in packages/cli/src/modules/insights and agents: no periodic usage report for people; packages/cli/src/modules/instance-reporting.ee/instance-reporting.module.ts sends daily billable execution numbers to a monitoring receiver, opt-in and not a report about agent use" } }, { @@ -5039,12 +5235,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/app/statistic.py:286 user-satisfaction-rate per app; agent Monitoring 'User Satisfaction Rate: Percentage of agent replies that users rated with a like' (web/i18n/en-US/agent-v-2.json monitoring.metrics.userSatisfactionRate); logs show user and operator rating per conversation (agent-v-2.json logs.table.userRate, operationRate)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/evaluations.py:222 GET /leaderboard (ELO per model from thumbs ratings), :268 per-model history, :399 feedback list; src/lib/components/admin/Evaluations/Leaderboard.svelte, Feedbacks.svelte; analytics feedback activity (admin/Analytics/Dashboard.svelte)", - "hermes-agent": "source read at v2026.9.24, not driven: no answer rating exists to aggregate: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-8 only detects affection for the pet animation" + "hermes-agent": "source read at v2026.9.24, not driven: no answer rating exists to aggregate: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-8 only detects affection for the pet animation", + "n8n": "source read at n8n@2.40.7, not driven: ratings exist only on evaluation runs: en.json:8317-8318 thumbs up/down per case and en.json:8301 '{reviewed} of {total} reviewed' in the agent's Evals tab (packages/cli/src/modules/agent-evals/agent-eval-rating.service.ts); searched 'feedback|rating' in packages/cli/src/modules/chat-hub and insights: no per-agent statistics of how people rated live answers Note: Only test-case reviews in an opt-in, flag-gated module." } }, { @@ -5073,7 +5270,7 @@ "evidence": { "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", "dify": "source read at 1.17.1, not driven: web/app/components/workflow canvas editor for Workflow and Chatflow apps with the node set in web/i18n/en-US/workflow.json:2-35 blocks.*; api/controllers/console/app/workflow.py draft sync and publish", - "n8n": "docs-only: competitor_features#31093 \"Visual node-based editor: Drag-and-drop canvas to wire nodes into workflows.\"", + "n8n": "source read at n8n@2.40.7, not driven: the n8n editor is a node canvas (packages/frontend/editor-ui/src/features/workflows/canvas/, canvas.utils.ts) where workflows are wired step by step; core product surface", "hermes-agent": "source read at v2026.9.24, not driven: searched 'canvas|flow editor|node editor|reactflow' in web/src and apps/desktop/src: no visual flow builder; plugins/kanban/dashboard/manifest.json:1-10 the Kanban tab is a drag-drop task board, not a step canvas", "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py)" } @@ -5102,7 +5299,7 @@ "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:2-3 blocks.agent and blocks.agent-v2; api/core/workflow/nodes/agent_v2/agent_node.py runs a roster or inline agent inside a flow; api/controllers/console/agent/composer.py:54 agent composer on a workflow node Note: the classic Agent node runs strategies from agent-strategy plugins", - "n8n": "docs-only: competitor_features#31097 \"AI Agent node (LangChain): Built-in AI agent nodes with tool-calling over LangChain.\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts AI Agent node with model, memory, tools and output parser inputs (nodes/agents/Agent/utils.ts:31-59); a workflow can also call an Agents-module agent (en.json agentSessions.origin.workflow 'Workflow')", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:249-257 /kanban create, assign, link: tasks assigned to profiles (agents) and linked as dependencies; hermes_cli/kanban_parser.py:314-321 'dependency' blocks auto-promote when parents finish; hermes_cli/kanban_db_graph.py:1 task graph persistence; plugins/kanban/dashboard/manifest.json board tab Note: Multi-agent work is a dependency graph of kanban cards, not a flow with agent steps.", "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); no flow to put an agent step in" } @@ -5132,7 +5329,7 @@ "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:12 blocks.human-input and :583-636 nodes.humanInput.* (form, user actions, delivery by web app or email, timeout); api/tasks/human_input_timeout_tasks.py; api/controllers/web/human_input_form.py:141", - "n8n": "docs-only: competitor_features#31103 \"Wait/approval nodes: Pause workflow for manual approval or timed wait.\"", + "n8n": "source read at n8n@2.40.7, not driven: send-and-wait approval operations pause a workflow until a person answers, e.g. packages/nodes-base/nodes/Microsoft/Outlook/v2/actions/message/sendAndWait.operation.ts, Slack, Gmail, Teams, Telegram (packages/nodes-base/utils/sendAndWait/utils.ts); Wait node and Form node for manual steps (packages/nodes-base/nodes/Wait, Form)", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:314-321 `kanban block --kind needs_input` parks a card for a human and dependants wait until it is unblocked; hermes_cli/kanban_parser.py:216-218 --initial-status blocked for cards that need human ops; hermes_cli/kanban_pr_acceptance.py:1 PR acceptance gate Note: A human gate is a blocked card in the task graph, not an approval step with approve/deny.", "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); approval exists only for tool calls in a chat (utils/middleware.py:3613)" } @@ -5157,12 +5354,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 delegate_task spawns child agents with their own context and returns a summary, single or batch; tools/async_delegation.py:1-6 background delegation; hermes_cli/commands.py:249 kanban hands tasks to other profiles", "dify": "source read at 1.17.1, not driven: an agent can call a published workflow as a tool (web/i18n/en-US/agent-v-2.json tools.toolTabs.workflow; api/controllers/console/workspace/tool_providers.py:904) and that workflow can hold another Agent node; searched 'sub.?agent|handoff|delegat' in dify-agent/src: no direct agent-to-agent handoff Note: indirect, through workflow-as-tool", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task hands a focused task to a sub-agent and returns its summary (utils/subagents.py:270 delegate, max_iterations and max_output :298-301), admin toggle src/lib/components/admin/Settings/Subagents.svelte; the sub-agent is a copy of the current model and tools (subagents.py:317 'model_id': current), it cannot pick another configured agent Note: delegates to a clone of itself, not to a different agent" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task hands a focused task to a sub-agent and returns its summary (utils/subagents.py:270 delegate, max_iterations and max_output :298-301), admin toggle src/lib/components/admin/Settings/Subagents.svelte; the sub-agent is a copy of the current model and tools (subagents.py:317 'model_id': current), it cannot pick another configured agent Note: delegates to a clone of itself, not to a different agent", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/AgentTool.node.ts:10-11 'AI Agent Tool' lets one agent call another as a tool; Agents-module sub-agents with 'use when' hints and delegation (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:132-173, en.json:7996-7997)" } }, { @@ -5190,7 +5388,7 @@ "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/autonomous-ai-agents/dynamic-workflow/SKILL.md:1-16 optional skill codifies orchestration as a re-runnable script where conditions are ordinary code; tools/code_execution_tool.py:1-5 scripts call tools with normal control flow; searched 'condition|branch node|if.?node' in hermes_cli/kanban*.py: no conditional routing in the task graph Note: Branching is code the agent writes, not a flow construct; the plan-in-code skill is optional, not bundled.", - "n8n": "docs-only: competitor_features#3046 \"Branching Logic: Conditional routing with if/switch/merge nodes\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/If and packages/nodes-base/nodes/Switch route items by conditions or rules; Text Classifier routes by an LLM category (packages/@n8n/nodes-langchain/nodes/chains/TextClassifier)", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:13 blocks.if-else and :26 blocks.question-classifier branch a flow on conditions or on an LLM classification; fail branches on node errors (nodes.common.errorHandle.failBranch)", "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); conditions can only be coded inside a Pipe or Filter function" } @@ -5216,11 +5414,11 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "partial", + "n8n": "yes", "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:240,245,254 common.runHistory / showRunHistory / viewRunHistory in the canvas editor, opening each run's tracing on the canvas; published-run logs per app (api/controllers/console/app/workflow_app_log.py:121)", - "n8n": "docs-only: competitor_features#3041 \"Execution History: Complete execution logs with replay capability\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/execution/executions/views/WorkflowExecutionsView.vue the workflow's Executions tab lists its runs and opens each one on the canvas with the data each node produced Note: Old partial rested on a generic execution-history line; runs open on the canvas.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:416-418 `kanban log` and `kanban runs` per task; hermes_cli/subcommands/cron.py:168 `cron runs`; plugins/kanban/dashboard/manifest.json:4 board shows which profile is running what Note: Run history per task or job; no flow canvas to show it on.", "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)" } @@ -5245,12 +5443,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: cron/blueprint_catalog.py:1-5 and :104-523 sixteen shipped automation blueprints rendered as a dashboard form (hermes_cli/web_routers/cron.py:393-424 GET /api/cron/blueprints, POST instantiate) and a /blueprint slash command (hermes_cli/commands.py:243) Note: Blueprints are ready-made scheduled automations, not multi-step flows.", "dify": "source read at 1.17.1, not driven: api/constants/recommended_apps.json ships 22 templates (workflow, chatflow, agent-chat, e.g. 'Text Summarization Workflow', 'Email Assistant Workflow'); api/controllers/console/explore/recommended_app.py:96,126 serve them; web/app/(commonLayout)/templates/[[...category]] create from template Note: default source is remote tmpl.dify.ai (api/configs/feature/hosted_service/__init__.py:444), builtin as fallback mode", - "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the app ships no example flows or agents, community presets live on openwebui.com (src/lib/components/workspace/Models.svelte:947)" + "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the app ships no example flows or agents, community presets live on openwebui.com (src/lib/components/workspace/Models.svelte:947)", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/workflows/readyToRun/workflows/aiWorkflow.ts ships a ready-to-run AI workflow (ReadyToRunButton.vue); the template library loads from packages/@n8n/config/src/configs/templates.config.ts:10-11 N8N_TEMPLATES_HOST https://api.n8n.io/api/ (features/workflows/templates/) Note: Most templates come from n8n's online library, so an offline instance sees only the bundled one." } }, { @@ -5274,12 +5473,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: optional-mcps/n8n-official/manifest.yaml:1-12 Nous-approved catalog entry connects the agent to an n8n instance's official MCP server with OAuth, so the agent can call n8n workflows as tools; hermes_cli/subcommands/mcp.py:27 `hermes mcp add`", "dify": "source read at 1.17.1, not driven: searched 'n8n' in api/, web/app and web/i18n: no hits, and none in langgenius/dify-official-plugins tools/ or langgenius/dify-plugins; only a hand-built HTTP Request node or custom OpenAPI tool could call an n8n webhook", - "open-webui": "source read at v0.11.4, not driven: searched 'n8n' in backend/open_webui and src: no n8n integration in core; an n8n workflow can only be called through a custom Tool, OpenAPI or MCP server or a community Pipe" + "open-webui": "source read at v0.11.4, not driven: searched 'n8n' in backend/open_webui and src: no n8n integration in core; an n8n workflow can only be called through a custom Tool, OpenAPI or MCP server or a community Pipe", + "n8n": "source read at n8n@2.40.7, not driven: this row describes n8n itself: an AI Agent calls another workflow through the Call n8n Workflow Tool (packages/@n8n/nodes-langchain/nodes/tools/ToolWorkflow), and Agents-module agents attach published workflows as tools (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:401-420, en.json:7820-7829)" } }, { @@ -5307,7 +5507,7 @@ "open-webui": "partial", "evidence": { "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:6 blocks.code, Python or JavaScript run in the dify-sandbox service (docker/docker-compose.yaml sandbox); nodes.code.syncFunctionSignature", - "n8n": "docs-only: competitor_features#3038 \"Code Nodes: JavaScript and Python code execution within workflows\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Code runs JavaScript or Python as a workflow step (task runners, packages/@n8n/config/src/configs/runners.config.ts:16-17)", "open-webui": "source read at v0.11.4, not driven: custom Python runs in the request pipeline as Filter (inlet/outlet) or Pipe functions (backend/open_webui/routers/functions.py:48, src/routes/(app)/admin/functions/create/+page.svelte, utils/filter.py:212) and on the external Pipelines server (routers/pipelines.py); searched 'canvas|workflow|flow' in src/lib/components: no flow to place the step in Note: old yes; code steps exist in the chat pipeline, not in a flow", "hermes-agent": "source read at v2026.9.24, not driven: cron/job_definition.py:15 script and no_agent (script-only jobs) and monitor_script fields; web/src/i18n/en.ts cron.scriptRequired 'Script-only jobs need a script path'; hermes_cli/subcommands/webhook.py:43-46 --script transform on a webhook route; tools/code_execution_tool.py code in a run Note: Custom code runs as a job, pre-run gate or webhook transform; there is no flow to put a code step in." } @@ -5336,7 +5536,7 @@ "n8n": "yes", "open-webui": "no", "evidence": { - "n8n": "docs-only: competitor_features#3042 \"Sub-workflows: Compose complex flows from reusable sub-workflows\"", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/ExecuteWorkflow calls another workflow and packages/nodes-base/nodes/ExecuteWorkflowTrigger receives the call with typed inputs", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_prompt.py:95-97 context_from injects the latest output of other jobs into a job's prompt (job chaining); hermes_cli/kanban_decompose.py:1-6 fans a task out into a graph of child tasks; hermes_cli/subcommands/webhook.py:47-51 a route can fire an existing job Note: Jobs and task graphs can be chained; there is no named flow to embed in another.", "dify": "source read at 1.17.1, not driven: Snippets are reusable node groups inserted into workflows (api/controllers/console/snippets/snippet_workflow.py; web/i18n/en-US/snippet.json); a published workflow can be used as a tool in other apps (web/i18n/en-US/workflow.json:257-258 common.workflowAsTool)", "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)" @@ -5363,12 +5563,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:193 `cron doctor` checks scheduled jobs for common health issues; hermes_cli/kanban_diagnostics.py:1-8 actionable diagnostics on task graphs shown as dashboard buttons; cron/lifecycle_guard.py:1-7 rejects self-destructive job specs at creation Note: Checks exist for jobs and task graphs; no pre-run wiring check of a flow.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:997-1000 panel.checklist 'Resolve the following issues before publishing', :207 needConnectTip for unconnected steps, per-node checks such as :361 nodes.agent.checkList.strategyNotSelected; agent composer validate endpoint api/controllers/console/agent/composer.py:167", - "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the only pre-run check is RRULE validation for schedules (backend/open_webui/utils/recurrence.py:106 validate_rrule)" + "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the only pre-run check is RRULE validation for schedules (backend/open_webui/utils/recurrence.py:106 validate_rrule)", + "n8n": "source read at n8n@2.40.7, not driven: the canvas flags node issues before a run, e.g. en.json:4502-4504 'Credentials for {type} are not set'; Agents module validates the whole agent (packages/cli/src/modules/agents/agents-config.controller.ts:40-55 GET /:agentId/validation) and blocks preview or publish with named issues (en.json:7734-7763)" } }, { @@ -5391,12 +5592,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:129-137 `hermes profile install ` installs a ready-made profile distribution (hermes_cli/profile_distribution.py:1-5); web/src/pages/ProfilesPage.tsx:1117-1122 shows distribution name and version; searched 'distribution' with 'catalog|registry|hub' in hermes_cli/profile_distribution.py: no browsable store Note: One-command install from a known repo URL; no store to browse.", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/explore and templates/[[...category]] browse ready-made apps including agents (api/constants/recommended_apps.json 'Investment Analysis Report Copilot', 'SVG Logo Design' in agent-chat mode); api/controllers/console/explore/recommended_app.py:96,126; one click creates a copy in the workspace Note: templates are Dify-curated, fetched from tmpl.dify.ai by default", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:945-950 'Discover a model' links to openwebui.com/models when enable_community_sharing is on; the community page posts the preset back into src/routes/(app)/workspace/models/create/+page.svelte:77 (COMMUNITY_ORIGINS check) to prefill a new model Note: the store is an outside website, not an in-app catalogue" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:945-950 'Discover a model' links to openwebui.com/models when enable_community_sharing is on; the community page posts the preset back into src/routes/(app)/workspace/models/create/+page.svelte:77 (COMMUNITY_ORIGINS check) to prefill a new model Note: the store is an outside website, not an in-app catalogue", + "n8n": "source read at n8n@2.40.7, not driven: en.json:4462 'Workflow templates' gallery with en.json:4445-4446 'Try template' and 'Use this workflow' (packages/frontend/editor-ui/src/features/workflows/templates/, setupTemplate.store.ts), fed by api.n8n.io (packages/@n8n/config/src/configs/templates.config.ts:10-11) and including AI agent workflows Note: Online library; an offline instance loses it." } }, { @@ -5421,12 +5623,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` packs a profile into a shareable archive and :122 import; hermes_cli/profile_distribution.py:175 write_manifest is only called by the installer (:547); searched write_manifest callers: no command that turns a profile into a distribution template Note: Sharing is by archive; making a reusable distribution means hand-writing distribution.yaml in a repo.", "dify": "source read at 1.17.1, not driven: an agent can be duplicated (api/controllers/console/agent/roster.py:961 copy), exported as DSL (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52), and an inline workflow agent saved to the shared roster (api/controllers/console/agent/composer.py:239 save-to-roster). Searched 'publish as template|insert-explore-apps' in api/controllers: no way to add it to the Explore template list Note: reuse by roster, copy and file; publishing a template for others goes through the Marketplace Creator Center, an outside service (web/i18n/en-US/plugin.json:230,305), not an in-product action", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:221 shareModelHandler posts the full model to openwebui.com, :214 Clone, per-model Export JSON (routers/models.py:381); public read grant makes it usable org-wide (common/AccessControl.svelte:19 'anyone')" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:221 shareModelHandler posts the full model to openwebui.com, :214 Clone, per-model Export JSON (routers/models.py:381); public read grant makes it usable org-wide (common/AccessControl.svelte:19 'anyone')", + "n8n": "source read at n8n@2.40.7, not driven: an agent can be duplicated within its project (en.json:7721 'Duplicate', packages/frontend/editor-ui/src/features/agents/views/AgentsListView.vue:136-174) or exported as JSON (en.json:7613); searched 'publish template|create template' in packages/cli/src and packages/frontend/editor-ui/src/features/workflows/templates: no way to publish one's own agent or workflow as an in-instance template Note: Reuse by copy or file, not a template others browse." } }, { @@ -5449,12 +5652,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profile_distribution.py:235-249 github.com/user/repo sources for `profile install` and :594 `profile update` re-pulls; hermes_cli/subcommands/skills.py:148 publish exists for skills only; searched 'publish' in hermes_cli/profile*.py: no profile publish Note: Install from GitHub yes, finding and publishing agent templates no.", "dify": "source read at 1.17.1, not driven: api/services/app_dsl_service.py:174 import accepts yaml_url (web/i18n/en-US/app.json:115-116 'From URL'), so a raw GitHub DSL link installs; searched 'github' in api/services/app_dsl_service.py and web/i18n/en-US/app.json: no discovery or publish to GitHub Note: install by URL only", - "open-webui": "source read at v0.11.4, not driven: searched 'github|load/url' in backend/open_webui/routers/models.py: model presets import only from a JSON file or openwebui.com; GitHub URL loading exists for tools and functions only (routers/tools.py:247, routers/functions.py:107)" + "open-webui": "source read at v0.11.4, not driven: searched 'github|load/url' in backend/open_webui/routers/models.py: model presets import only from a JSON file or openwebui.com; GitHub URL loading exists for tools and functions only (routers/tools.py:247, routers/functions.py:107)", + "n8n": "source read at n8n@2.40.7, not driven: workflows sync to a Git repository with source control (packages/cli/src/modules/source-control.ee, feat:sourceControl at packages/@n8n/constants/src/index.ts:22); searched 'github' in packages/frontend/editor-ui/src/features/workflows/templates: templates come only from api.n8n.io, no GitHub discovery or install Note: Git sync is enterprise-licensed and is not template search or publishing." } }, { @@ -5477,12 +5681,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'approv' in hermes_cli/profile_distribution.py and hermes_cli/profiles.py: none; plugin-catalog/README.md curation is Nous review of plugins, not an organisation approving agent templates", "dify": "source read at 1.17.1, not driven: searched 'approve template|template review|pending template' in api/ and web/i18n/en-US: no approval step for templates; Explore templates come from a remote or builtin catalogue (api/configs/feature/hosted_service/__init__.py:444)", - "open-webui": "source read at v0.11.4, not driven: searched 'approve|review|publish' in backend/open_webui/routers/models.py and src/lib/components/workspace/Models*: a model is shared the moment its access grants are saved (routers/models.py:1035); no approval gate" + "open-webui": "source read at v0.11.4, not driven: searched 'approve|review|publish' in backend/open_webui/routers/models.py and src/lib/components/workspace/Models*: a model is shared the moment its access grants are saved (routers/models.py:1035); no approval gate", + "n8n": "source read at n8n@2.40.7, not driven: searched 'template approv|approve template' in packages/cli/src and packages/frontend/editor-ui/src: none; workflow reviews (packages/@n8n/constants/src/index.ts:58 feat:workflowReviews, packages/frontend/editor-ui/src/features/workflow-reviews/) approve changes to a workflow, not templates for the organisation" } }, { @@ -5508,7 +5713,7 @@ "n8n": "yes", "open-webui": "no", "evidence": { - "n8n": "docs-only: competitor_features#31102 \"Git version control (Enterprise): Environments + git-backed workflow versioning in EE.\"", + "n8n": "source read at n8n@2.40.7, not driven: workflow version history with restore (en.json:4837 'Version History', 4912 restore; packages/cli/src/workflows/workflow-history/workflow-history.controller.ts) and visual compare (packages/frontend/editor-ui/src/features/workflows/workflowDiff/WorkflowDiffView.vue); Agents-module publish history with revert (packages/cli/src/modules/agents/agent-publish.controller.ts:87-111) Note: Unlicensed instances keep 24 hours of workflow history (packages/@n8n/constants/src/index.ts:79 used at packages/cli/src/license.ts:478); diffs and named versions are licence features (index.ts:49-50).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:85-87 /snapshot create|restore of Hermes config/state; hermes_cli/config_backups.py:1-8 point-in-time copies of config.yaml; hermes_cli/subcommands/profile.py:147-158 distribution update with version in ProfileInfo Note: Whole-state snapshots and config backups allow rollback; no per-agent version list or compare view.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1266,1282,1302 list versions, view one, restore it; api/models/agent.py:327,363 AgentConfigSnapshot and AgentConfigRevision; workflow version history with restore (web/i18n/en-US/workflow.json:1079-1081). Searched 'compare|diff' in agent-v-2.json and workflow.json: no version comparison (only the workflow generator's change summary, :1110) Note: versions and rollback yes, compare no; Community Edition does not version the agent's file system (agent-v-2.json build.empty.communityEditionTip)", "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/models.py and routers/models.py: updates overwrite the row (routers/models.py:932); versioning with history menu exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)" @@ -5537,7 +5742,7 @@ "n8n": "yes", "open-webui": "no", "evidence": { - "n8n": "docs-only: competitor_features#6941 \"editor: Correct navigation to evaluation tab: From n8n@2.15.0 (2026-03-30)\"", + "n8n": "source read at n8n@2.40.7, not driven: workflow evaluations run a dataset of cases with expected answers and metrics (packages/nodes-base/nodes/Evaluation, EvaluationTrigger; packages/cli/src/evaluation.ee/test-runs.controller.ee.ts; en.json:6541 helpfulness metric); Agents-module test cases with 'What to check' (en.json:8283-8285) Note: Workflow evaluations are quota-limited by licence (packages/@n8n/constants/src/index.ts:73); agent evals are opt-in and flag-gated.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/evaluations.py:222 leaderboard and arena models (admin/Settings/Evaluations/ArenaModelModal.svelte) rank models from blind user votes; searched 'expected|test case|dataset|golden' in routers/evaluations.py: no case sets with expected answers Note: old partial; arena voting is not a test set", "hermes-agent": "source read at v2026.9.24, not driven: batch_runner.py:1-6 runs the agent over a JSONL prompt dataset in parallel with trajectories and tool-usage statistics; evals/ developer harnesses; searched 'expected|assert.{0,20}answer|score' in batch_runner.py: no expected-answer scoring Note: A dataset runner exists as a repo script; it does not compare against expected answers.", "dify": "source read at 1.17.1, not driven: searched 'evaluation|test case|expected answer|dataset eval' in api/controllers and web/i18n/en-US: no agent test sets; evaluation is delegated to external tracers (web/i18n/en-US/app.json:220-258) and dataset hit testing only checks retrieval (api/controllers/console/datasets/hit_testing.py)" @@ -5564,12 +5769,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'baseline|a/b|compare.{0,20}prompt|prompt version' in hermes_cli/ and agent/: none for user prompts; evals/openrouter_pkce_ab and evals/toolperf_abeval are developer harnesses, not a user surface", "dify": "source read at 1.17.1, not driven: searched 'compare|baseline|a/b|prompt version' in web/i18n/en-US/app-debug.json, agent-v-2.json and workflow.json: classic apps can debug several models side by side on one prompt (web/app/components/app/configuration/debug/debug-with-multiple-model), but no run of a new prompt version against the old one before publishing Note: multi-model debug compares models, not prompt versions", - "open-webui": "source read at v0.11.4, not driven: searched 'baseline|compare|promote|a/b' in backend/open_webui/routers/prompts.py, routers/models.py and routers/evaluations.py: prompt versions can be set live (routers/prompts.py:384) but no side-by-side run of old versus new before promotion; arena compares models, not prompt versions" + "open-webui": "source read at v0.11.4, not driven: searched 'baseline|compare|promote|a/b' in backend/open_webui/routers/prompts.py, routers/models.py and routers/evaluations.py: prompt versions can be set live (routers/prompts.py:384) but no side-by-side run of old versus new before promotion; arena compares models, not prompt versions", + "n8n": "source read at n8n@2.40.7, not driven: workflow evaluation runs compare side by side with Cases, Outputs, Metrics and 'Workflow diff' tabs (en.json:6521-6524; packages/frontend/editor-ui/src/features/ai/evaluation.ee/components/Compare/CasesTable.vue:113-174 delta vs best, WorkflowDiffTab.vue), so a changed prompt is scored against the previous version before publishing Note: Evaluations are quota-limited by licence (packages/@n8n/constants/src/index.ts:73)." } }, { @@ -5597,7 +5803,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:38-54 browse, search and install from registries (tools/skills_hub_skillssh.py skills.sh, tools/skills_hub_clawhub.py ClawHub, tools/skills_hub_github.py); plugin-catalog/README.md:1-5 curated plugin catalog with community-tier entries via `hermes plugins catalog`", - "n8n": "docs-only: competitor_features#3045 \"Community Nodes: Community-contributed custom integration nodes\"", + "n8n": "source read at n8n@2.40.7, not driven: community nodes install from npm in the UI (en.json:3285 'Install community nodes'; packages/cli/src/modules/community-packages/community-packages.controller.ts:11 POST, default module) and the public template library at api.n8n.io (packages/@n8n/config/src/configs/templates.config.ts:10-11)", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/marketplace in-product Dify Marketplace with community Plugins and Templates, creator profiles and trending by real usage (web/i18n/en-US/plugin.json:210-240 marketplace.home.templates, creatorProfile.*); skills and agent strategies ship through it too", "open-webui": "source read at v0.11.4, not driven: openwebui.com community library of model presets, tools, functions and prompts reached from src/lib/components/workspace/Models.svelte:947, Tools.svelte:639 and admin/Functions.svelte (common/CommunityDiscover.svelte 'Made by Open WebUI Community'); import back via postMessage (routes/(app)/workspace/tools/create/+page.svelte:58) Note: no community channel for skills" } @@ -5623,12 +5829,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115-122 export/import a profile archive including its cron jobs; hermes_cli/profile_distribution.py:396-406 distributions ship and merge cron jobs into another install; hermes_cli/subcommands/profile.py:34 --clone-channels kept off by default Note: Automations move between installs by archive or distribution; there are no client organisations inside one instance.", "dify": "source read at 1.17.1, not driven: an app or agent exports as DSL YAML (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52; api/services/app_dsl_service.py:723) and imports into another workspace or instance by file or URL (api/services/app_dsl_service.py:174; web/i18n/en-US/app.json:115); snippets export and import the same way (web/i18n/en-US/snippet.json importFromDSLUrl) Note: credentials and plugin dependencies must be set up again in the target (web/app/components/workflow/plugin-dependency)", - "open-webui": "source read at v0.11.4, not driven: automations export and import as JSON (src/routes/(app)/automations/+page.svelte:91-96 Import/Export JSON, :438) and models likewise (routers/models.py:381, :441), so an automation can be moved to another instance; searched 'tenant|organization' in backend/open_webui/models: no client-organisation concept to move between" + "open-webui": "source read at v0.11.4, not driven: automations export and import as JSON (src/routes/(app)/automations/+page.svelte:91-96 Import/Export JSON, :438) and models likewise (routers/models.py:381, :441), so an automation can be moved to another instance; searched 'tenant|organization' in backend/open_webui/models: no client-organisation concept to move between", + "n8n": "source read at n8n@2.40.7, not driven: a workflow moves to another project with packages/cli/src/workflows/workflows.controller.ts:646 PUT /:workflowId/transfer, or to another instance by JSON export/import (packages/cli/src/commands/export/workflow.ts, import/workflow.ts); projects are not isolated client organisations (see op-multi-tenant) Note: Moves between projects or instances; no tenant concept." } }, { @@ -5652,12 +5859,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'course|learner|curriculum' in agent/ tools/ hermes_cli/ plugins/: none; outside the product's domain", "dify": "source read at 1.17.1, not driven: searched 'course|learner|curriculum' in api/ and web/i18n/en-US: only Dify's own product onboarding lessons (api/controllers/console/explore/recommended_app.py:111 learn-dify; web/i18n/en-US/common.json stepByStepTour.*), no learner recommendations", - "open-webui": "source read at v0.11.4, not driven: searched 'course|learner|lesson|curriculum' in backend/open_webui and src/lib/components: no learning domain" + "open-webui": "source read at v0.11.4, not driven: searched 'course|learner|lesson|curriculum' in backend/open_webui and src/lib/components: no learning domain", + "n8n": "source read at n8n@2.40.7, not driven: searched 'course|learner|curriculum|recommend' in packages/cli/src and packages/frontend/editor-ui/src: no learning features; out of n8n's domain" } }, { @@ -5687,7 +5895,7 @@ "hermes-agent": "source read at v2026.9.24, not driven: Dockerfile and docker-compose.yml at the repo root; setup-hermes.sh installer; hermes_cli/subcommands/gateway.py installs the gateway as a systemd/launchd service (hermes_cli/gateway_service_unit.py); hermes_cli/subcommands/dashboard.py self-hosted web dashboard", "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml and docker/.env.example self-host the full stack (api, worker, beat, web, plugin_daemon, sandbox, agent runtime, ssrf_proxy, database, redis, vector store); DEPLOYMENT_EDITION defaults to COMMUNITY (api/enterprise/telemetry/README.md config table)", - "n8n": "docs-only: competitor_features#31099 \"Self-hosting via Docker: Run community edition on own infra with Docker.\"", + "n8n": "source read at n8n@2.40.7, not driven: docker/ images and packages/cli/src/commands/start.ts run n8n on the organisation's own servers; queue mode with workers for scale (packages/cli/src/commands/worker.ts) Note: Under the Sustainable Use License, which limits some commercial uses (LICENSE.md).", "open-webui": "source read at v0.11.4, not driven: README.md:26 pip, uv, Docker, Kubernetes; Dockerfile and docker-compose.yaml in repo root; SQLite or PostgreSQL and local or S3/GCS/Azure storage (backend/open_webui/storage/provider.py)" } }, @@ -5712,13 +5920,14 @@ "hermes-agent": "partial", "copilot-studio": "no", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1203 OFFLINE_MODE sets HF_HUB_OFFLINE and turns off the version update check (:1205-1207); local inference through Ollama (routers/ollama.py), local embeddings and Whisper; community and update links are optional", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 local Ollama/LM Studio models; hermes_cli/config_defaults.py:2297-2305 telemetry collection and sending both off by default; :1762-1765 allow_lazy_installs false for air-gapped installs; tools/environments/docker.py:765 docker_network false air-gaps the sandbox; searched 'HERMES_OFFLINE|offline.?mode|air.?gap' in *.py: no global offline switch Note: Offline operation is assembled from settings, not a supported mode; not driven, so network calls such as model catalog refreshes were not verified to stay off.", - "dify": "source read at 1.17.1, not driven: offline is possible but not default: MARKETPLACE_ENABLED can be false with plugins uploaded as local packages (docker/.env.example:251; api/controllers/console/workspace/plugin.py:746 upload/pkg), templates in builtin mode (api/configs/feature/hosted_service/__init__.py:444 default remote), CHECK_UPDATE_URL (docker/.env.example:37) and community telemetry (api/configs/feature/__init__.py:839-850, ext_celery.py:285) must be switched off Note: every model needs a local provider plugin loaded by hand" + "dify": "source read at 1.17.1, not driven: offline is possible but not default: MARKETPLACE_ENABLED can be false with plugins uploaded as local packages (docker/.env.example:251; api/controllers/console/workspace/plugin.py:746 upload/pkg), templates in builtin mode (api/configs/feature/hosted_service/__init__.py:444 default remote), CHECK_UPDATE_URL (docker/.env.example:37) and community telemetry (api/configs/feature/__init__.py:839-850, ext_celery.py:285) must be switched off Note: every model needs a local provider plugin loaded by hand", + "n8n": "source read at n8n@2.40.7, not driven: outbound calls can be switched off: packages/@n8n/config/src/configs/diagnostics.config.ts:17 N8N_DIAGNOSTICS_ENABLED, version-notifications.config.ts:6, templates.config.ts:6 N8N_TEMPLATES_ENABLED, packages/cli/src/modules/community-packages/community-packages.config.ts:11,15 own npm registry; local models via LMChatOllama; but instance AI setup, AI credits and licence activation and renewal reach the licence server (packages/cli/src/license.ts:73-98) Note: Workflows with local models run offline; enterprise licence activation and the managed AI features need the internet." } }, { @@ -5748,7 +5957,7 @@ "hermes-agent": "source read at v2026.9.24, not driven: LICENSE:1-3 MIT License, Copyright (c) 2025 Nous Research; pyproject.toml project metadata; full source including web dashboard and desktop app in the public repo Note: MIT, not EUPL.", "copilot-studio": "docs-only: competitors#1450 license \"Proprietary\"", "dify": "source read at 1.17.1, not driven: LICENSE:3-10 'modified version of the Apache License 2.0': no multi-tenant service and no removal of the logo or copyright in web/ without a commercial licence; LICENSE:2.a the producer may change the licence. Not an OSI or EUPL licence Note: source-available with restrictions", - "n8n": "docs-only: competitors#206 license \"Sustainable Use License / Proprietary\"", + "n8n": "source read at n8n@2.40.7, not driven: LICENSE.md:3-14 core code is under the Sustainable Use License (fair-code, with use limitations) and files with '.ee.' in the name need an n8n Enterprise License (LICENSE_EE.md); neither is an OSI open source licence such as the EUPL Note: Matches the old no.", "open-webui": "source read at v0.11.4, not driven: LICENSE: 'Open WebUI License', BSD-3 style plus a branding clause (LICENSE:23-33) that forbids altering Open WebUI branding for deployments above fifty end users (:27-28) without an enterprise licence; code before commit 60d84a3 is plain BSD-3 (LICENSE_HISTORY) Note: source-available, not OSI open source and not EUPL" } }, @@ -5773,13 +5982,14 @@ "hermes-agent": "partial", "copilot-studio": "yes", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:10-11 profiles are 'multiple isolated Hermes instances' with their own config, keys, memory, sessions and skills; agent/secret_scope.py:1-10 fail-closed per-profile secret scope in the multiplexed gateway (hermes_cli/gateway_multiplex_mode.py:1-8); hermes_cli/kanban_parser.py:84 kanban --tenant namespace Note: Isolation is per profile under one operator; no organisation boundary with its own admins or data access control.", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "dify": "source read at 1.17.1, not driven: workspaces keep apps, data, providers and members apart (api/controllers/console/workspace/workspace.py:229,289 list and switch; tenant_id on every model, e.g. api/models/agent.py:163); creating workspaces is off by default (api/configs/feature/__init__.py:1599 ALLOW_CREATE_WORKSPACE=False) and LICENSE:5-6 forbids running a multi-tenant service without a commercial licence Note: works technically, licence-gated for serving several organisations", - "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide" + "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide", + "n8n": "source read at n8n@2.40.7, not driven: projects separate workflows, credentials and agents with project roles (packages/cli/src/modules/agents/entities/agent.entity.ts:13-18, packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts); team projects are limited by the licence quota quota:maxTeamProjects (packages/@n8n/constants/src/index.ts:67); users, SSO, models and settings stay instance-wide Note: Group separation inside one organisation, not tenants with their own admins and settings." } }, { @@ -5802,12 +6012,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'quota' in hermes_cli/profiles.py, hermes_cli/config_defaults.py and gateway/: only provider quota holds (cron/quota_hold.py:1-12) and gateway/platforms/api_server.py:1322 a global max_concurrent_runs; no per-organisation or per-profile quota", "dify": "source read at 1.17.1, not driven: api/services/feature_service.py:24-31 per-workspace limits (members, apps, vector space, upload quota, api/services/entities/feature_entities.py:152-161) are filled only from the Cloud billing API; self-hosted community has no per-workspace quota setting Note: Dify Cloud plans only", - "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; only per-user automation limits (routers/automations.py:69)" + "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; only per-user automation limits (routers/automations.py:69)", + "n8n": "source read at n8n@2.40.7, not driven: searched 'quota' per project in packages/cli/src/services/project.service.ee.ts and packages/cli/src/modules: quotas come from the instance licence (packages/@n8n/constants/src/index.ts:63-74), none can be set per project or organisation" } }, { @@ -5831,12 +6042,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'tenant|organisation|organization' in web/src/pages and hermes_cli/web_routers: only the kanban tenant filter (web/src/i18n/en.ts kanban.tenant); web/src/pages/ProfilesPage.tsx manages profiles one by one with no quota or retention per organisation", "dify": "source read at 1.17.1, not driven: searched 'tenant management|all workspaces admin|operations page' in api/controllers/console and web/app: /all-workspaces (api/controllers/console/workspace/workspace.py:238) lists the caller's own workspaces; workspace-wide switches come from the separate Enterprise service (api/services/system_feature_service.py:106-112, 160-197), not a page in this repo", - "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; admin settings are one instance-wide panel (src/lib/components/admin/Settings)" + "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; admin settings are one instance-wide panel (src/lib/components/admin/Settings)", + "n8n": "source read at n8n@2.40.7, not driven: searched 'tenant|organisation|organization' in packages/cli/src/controllers and packages/frontend/editor-ui/src/features/settings: no operations page that sets switches, quotas and retention per organisation; retention is instance-wide by environment variable (packages/@n8n/config/src/configs/executions.config.ts:106-111)" } }, { @@ -5864,7 +6076,7 @@ "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: SAML, OIDC and OAuth2 SSO for console and web apps is read from the Enterprise service (api/services/entities/feature_entities.py:103-106,183-184; api/services/system_feature_service.py:162-197); community offers only GitHub and Google OAuth login (api/configs/feature/__init__.py:1003,1013; api/controllers/console/auth/oauth.py). No group sync in community Note: enterprise-licensed", - "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", + "n8n": "source read at n8n@2.40.7, not driven: SAML (packages/cli/src/modules/sso-saml, isSamlLicensed at middleware/saml-enabled-middleware.ts:14), OIDC (packages/cli/src/modules/sso-oidc/oidc.controller.ee.ts:44 @Licensed('feat:oidc')) and LDAP (packages/cli/src/modules/ldap.ee/ldap.controller.ee.ts:22 @Licensed('feat:ldap')) with role mapping rules (packages/cli/src/public-api/v1/handlers/role-mapping-rules) Note: Works, enterprise-licensed. Matches the old partial.", "open-webui": "source read at v0.11.4, not driven: OAuth/OIDC with group mapping (backend/open_webui/utils/oauth.py, config.py:2582 ENABLE_OAUTH_GROUP_MANAGEMENT), LDAP/AD (config.py:2788), trusted header SSO (env.py:802), SCIM 2.0 provisioning (routers/scim.py, env.py:907) Note: old partial rested on a feature row; code covers OIDC, LDAP, SCIM and group sync", "hermes-agent": "source read at v2026.9.24, not driven: plugins/dashboard_auth/self_hosted/plugin.yaml:1-4 OIDC sign-in to the dashboard against Keycloak, Authentik, Zitadel, Okta and others; plugins/dashboard_auth/self_hosted/__init__.py:262-270 groups are folded into a free-form org_id string that no access check reads (hermes_cli/dashboard_auth/base.py:12-16); chat users are platform ids in allowlists (gateway/authz_mixin.py:32-37) Note: Sign-in with company accounts works for the dashboard; groups do not map to rights." } @@ -5894,7 +6106,7 @@ "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/secrets.py:8-20 Bitwarden Secrets Manager and 1Password sources (agent/secret_sources/); agent/vault_store.py:1-8 encrypted, model-blind local vault; hermes_cli/proxy_cli.py:352-365 iron-proxy injects real credentials at egress so sandboxes hold only proxy tokens; hermes_cli/subcommands/vault.py:8", "dify": "source read at 1.17.1, not driven: tool, model, datasource and trigger credentials are stored encrypted per workspace (api/core/helper/encrypter.py, provider_encryption.py) and referenced by agents, not typed into agent settings (api/controllers/console/workspace/tool_providers.py, model_providers.py:200); api/models/credential_permission.py limits who may use each credential Note: an encrypted store in the Dify database, not an external vault such as HashiCorp", - "n8n": "docs-only: competitor_features#31106 \"Credential vault: Encrypted credential store shared across workflows.\"", + "n8n": "source read at n8n@2.40.7, not driven: API keys live in the encrypted credential store, referenced by id, not in agent settings (packages/core/src/encryption/cipher.ts:9-10); outside vaults HashiCorp Vault, AWS, Azure Key Vault, GCP, Infisical and 1Password via packages/cli/src/modules/external-secrets.ee/providers/ (feat:externalSecrets, packages/@n8n/constants/src/index.ts:25) Note: Outside vaults are enterprise-licensed.", "open-webui": "source read at v0.11.4, not driven: outside keys are kept centrally in the config table (admin Connections, tool servers) and plugin valves are Fernet-encrypted (backend/open_webui/utils/valves.py:21 encrypt_valves), OAuth tool tokens encrypted (utils/oauth.py:269); searched 'vault|keyring|secret manager' in backend/open_webui: no external vault integration" } }, @@ -5923,7 +6135,7 @@ "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/secret_scope.py:1-10 each profile's own .env keys resolve only inside that profile's turns (fail-closed under multiplexing); hermes_cli/subcommands/profile.py:31-34 cloned profiles drop bot tokens unless --clone-channels; tui_gateway/methods_profiles.py:372-378 share_auth off forks credentials per profile", - "n8n": "docs-only: competitor_features#38153 \"core: Bind dynamic credential tokens to a user ID: From n8n@2.32.0 (2026-07-21)\"", + "n8n": "source read at n8n@2.40.7, not driven: credentials are picked per model and per tool node, not per agent identity (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:175-187 node tool credentials, :447 model credential); per-user credential resolution is enterprise-licensed dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee) and token exchange (packages/cli/src/modules/token-exchange, feat:tokenExchange at packages/@n8n/constants/src/index.ts:55) Note: An agent can be given only the credentials its tools need, but there is no credential that is the agent's own identity.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1032,1062 per-agent service API keys (create, list, revoke); per-agent secret environment variables injected only at runtime (web/i18n/en-US/agent-v-2.json advancedSettings.envEditor.scopeSecret, tools.cliDialog.securityTip); each tool on an agent picks which workspace credential it uses (agent-v-2.json tools.credential.authOne)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:389 an automation run gets a short-lived token for its owner ({'id': user.id, 'typ': 'automation'}), so it acts with the owner's full rights; tool-server auth is set per connection or per user OAuth (src/lib/components/AddToolServerModal.svelte:313); searched 'agent credential|service account|scoped token' in backend/open_webui: no credential per agent" } @@ -5948,14 +6160,14 @@ "hermes-agent": "partial", "copilot-studio": "yes", "dify": "partial", - "n8n": "yes", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ConfigPage.tsx:384-391 sectioned config editor for config.yaml plus EnvPage (Keys) and ModelsPage in the Hermes dashboard; hermes_cli/subcommands/setup.py:11 `hermes setup`; searched 'nextcloud' repo-wide: none Note: Set up from Hermes' own dashboard and CLI, not from Nextcloud admin settings.", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "dify": "source read at 1.17.1, not driven: Dify is set up in its own workspace settings and Integrations page (members api/controllers/console/workspace/members.py, model providers, plugins, web/app/(commonLayout)/integrations) plus environment variables (docker/.env.example); searched 'nextcloud' in api/ and web/: no Nextcloud admin settings panel Note: own settings, not Nextcloud's", - "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", + "n8n": "source read at n8n@2.40.7, not driven: n8n is configured in its own Settings pages (packages/frontend/editor-ui/src/features/settings/: users, sso, apiKeys, communityNodes, chat hub providers at en.json:3665-3668) and environment variables (packages/@n8n/config/src/configs/); searched 'nextcloud' in packages/frontend/editor-ui/src: no Nextcloud admin integration Note: Own settings, not Nextcloud's.", "open-webui": "source read at v0.11.4, not driven: full setup in Open WebUI's own admin panel (src/routes/(app)/admin/settings/[tab]/+page.svelte: General, Connections, Models, Documents, WebSearch, CodeExecution, Integrations, Audio, Images, Subagents, Events); not inside Nextcloud admin settings Note: own admin UI, no Nextcloud integration" } }, @@ -5979,12 +6191,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "dify": "source read at 1.17.1, not driven: api/controllers/console/setup.py:42,65 first-run admin account setup (web/app/install); api/controllers/console/onboarding.py:56 and web/app/components/step-by-step-tour a checklist tour pointing to Integrations, Knowledge, Studio and Learn Dify lessons (web/i18n/en-US/common.json:643-662); web/i18n/en-US/common.json:378 'Please install a model provider first'. No wizard that configures the first provider and agent end to end Note: a tour of pages, not a guided setup of provider plus agent", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/setup.py:11-26 `hermes setup` interactive wizard with sections; hermes_cli/gateway_setup_wizard.py:1 `hermes gateway setup` per-platform prompts; apps/desktop/e2e/core/onboarding-first-chat.spec.ts desktop onboarding to a first chat; web/src/pages/ProfileBuilderPage.tsx:32 profile builder", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/OnBoarding.svelte:82-118 is a welcome screen ('Welcome to your AI home.', 'Get started', 'Read the docs') before the first admin signs up (src/routes/auth/+page.svelte:216); searched 'wizard|setup step|first provider' in src/lib/components: no guided provider or agent setup" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/OnBoarding.svelte:82-118 is a welcome screen ('Welcome to your AI home.', 'Get started', 'Read the docs') before the first admin signs up (src/routes/auth/+page.svelte:216); searched 'wizard|setup step|first provider' in src/lib/components: no guided provider or agent setup", + "n8n": "source read at n8n@2.40.7, not driven: n8n Assistant onboarding walks an admin through connecting a model (en.json:5358-5365 'Get started', 'Connect a model'; setup state checked in packages/frontend/editor-ui/src/features/ai/instanceAi useInstanceAiReady), and a new agent then opens in that assistant to be built (packages/frontend/editor-ui/src/features/agents/views/NewAgentView.vue:58-83)" } }, { @@ -6011,7 +6224,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "n8n": "docs-only: competitor_features#6928 \"core: Fix /healthz endpoint when using N8N_PATH: From n8n@2.15.0 (2026-03-30)\"", + "n8n": "source read at n8n@2.40.7, not driven: machine health checks /healthz and /healthz/readiness (packages/cli/src/abstract-server.ts:139) and Prometheus metrics (packages/@n8n/config/src/configs/endpoints.config.ts:8); per agent channel status (packages/cli/src/modules/agents/agent-integrations.controller.ts:89-104); worker view is licensed (packages/@n8n/constants/src/index.ts:33 feat:workerView); searched 'health' in packages/frontend/editor-ui/src/features/settings: no page for chat and its dependencies Note: Endpoints for monitoring tools, no health page for people.", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SystemPage.tsx:106 doctor run with live log and :187 memory-provider status; web/src/i18n/en.ts status.* gateway running/failed, connected platforms, active sessions on the status overview; hermes_cli/web_routers/status.py:115 /api/health and gateway/platforms/api_server.py:1592 /health/detailed", "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads, /db-pool-stat JSON endpoints and api/celery_healthcheck.py for machine checks; searched 'health|status page|system status' in web/app and web/i18n/en-US: no page showing chat and dependency health Note: endpoints only, no page", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health and :3009 GET /health/db return JSON for probes; admin connection verify buttons only at edit time (AddToolServerModal.svelte:206); searched 'health|status page' in src/lib/components/admin: no page showing chat and dependency health" @@ -6038,13 +6251,14 @@ "hermes-agent": "yes", "copilot-studio": "no", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: LICENSE:1-3 MIT, no seat or message licence in the code; agent/billing_view.py:1 and hermes_cli/nous_subscription.py cover an optional Nous portal plan; model spend is paid per token to whichever provider is configured Note: Software is free; model usage is billed by the provider, per token.", "copilot-studio": "docs-only: competitor_features#31612 \"Message-metered pricing: $0.01/message or $200/mo pack; cost spikes with generative/autonomous use.\"", "open-webui": "source read at v0.11.4, not driven: no usage metering or seat licensing in the code (searched 'license key|seat|billing' in backend/open_webui), so self-hosting is free; LICENSE:23-33 requires an enterprise licence to rebrand above fifty end users, and the admin notice for more than 50 users points to enterprise licences (translation key 'You have more than 50 users...'); enterprise pricing itself is not in the code", - "dify": "source read at 1.17.1, not driven: the self-hosted Community Edition carries no seat or message fee in code (api/services/feature_service.py:24-31 billing limits only for CLOUD); enterprise licences carry a member limit (api/services/entities/feature_entities.py:161 workspace_members LicenseLimitationModel) and Cloud plans limit apps and members (:152-157) Note: community is free; paid editions are limited by members or plan, pricing itself not in code" + "dify": "source read at 1.17.1, not driven: the self-hosted Community Edition carries no seat or message fee in code (api/services/feature_service.py:24-31 billing limits only for CLOUD); enterprise licences carry a member limit (api/services/entities/feature_entities.py:161 workspace_members LicenseLimitationModel) and Cloud plans limit apps and members (:152-157) Note: community is free; paid editions are limited by members or plan, pricing itself not in code", + "n8n": "source read at n8n@2.40.7, not driven: the self-hosted community edition runs without seat or message metering; licensed plans carry quotas such as quota:users and quota:activeWorkflows (packages/@n8n/constants/src/index.ts:63-65) and report billable execution counts daily (packages/cli/src/modules/instance-reporting.ee/instance-reporting.module.ts) Note: Free self-hosting is flat; paid tiers meter users and executions. Pricing itself is not in the code." } }, { @@ -6068,13 +6282,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "partial", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31389 \"No scaling / single-instance: Docs state \"no scaling support currently\"; English-biased tool-calling models required.\"", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_swarm.py:1-8 parallel specialist workers on the kanban dispatcher (plugins/kanban/systemd/hermes-kanban-dispatcher.service); cron/jobs.py:2652-2653 at-most-once claims across N replicas; hermes_cli/gateway_multiplex_mode.py:1-8 one gateway serves many profiles; gateway/platforms/api_server.py:1322 concurrent API runs", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml:227,306,353,660 separate api, Celery worker, beat and agent_backend services; docker/.env.example:57,66-67 SERVER_WORKER_AMOUNT, CELERY_WORKER_AMOUNT, CELERY_AUTO_SCALE; dify-agent/src/dify_agent/runtime/run_scheduler.py schedules concurrent agent runs; schedules dispatched in parallel groups (api/schedule/workflow_schedule_task.py:108)", - "n8n": "docs-only: competitor_features#6931 \"core: Fix race condition when stopping jobs in queue mode: From n8n@2.15.0 (2026-03-30)\"", + "n8n": "source read at n8n@2.40.7, not driven: queue mode spreads executions over worker processes (packages/@n8n/config/src/configs/executions.config.ts:90-91 EXECUTIONS_MODE, packages/cli/src/commands/worker.ts, packages/cli/src/scaling/job-processor.ts); several main instances need a licence (packages/cli/src/scaling/multi-main-setup.ee.ts, feat:multipleMainInstances) Note: Workers are free; multi-main high availability is enterprise-licensed. Old partial rested on a bug-fix line.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:381 REDIS_URL and :382 REDIS_CLUSTER for multi-worker socket and task state; models/automations.py:308 FOR UPDATE SKIP LOCKED so several instances share scheduled runs; utils/subagents.py:298 max_concurrent sub-agents; README.md:80 horizontal scalability" } }, @@ -6099,12 +6313,13 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:5-25 inbound A2A endpoint with Agent Card; plugins/platforms/a2a/security.py:1-4 peer identity from credentials (A2A_PEER_TOKENS token -> name), trusted-peer allow-list, JSONL audit, injection filtering; gateway/slash_access.py:1-10 command lists per user id Note: Outside agents can be registered and admitted by token; their tasks run in the agent's session with its full toolset, with no per-peer tool scope or run-as identity.", "dify": "source read at 1.17.1, not driven: api/controllers/openapi/oauth_device.py:103-129 RFC 8628 device flow issues bearer tokens that act as the approving account, scoped by api/libs/oauth_bearer.py:60-65 (apps:run, apps:read, workspace:*); clients allowed only via env OPENAPI_KNOWN_CLIENT_IDS (api/configs/feature/__init__.py:639-646, default difyctl); per-app API keys (api/controllers/console/apikey.py:236) and MCP server per app (api/controllers/mcp/mcp.py:44) Note: no UI to register an outside agent; scope is per-app or coarse token scopes, not a per-tool allowlist", - "open-webui": "source read at v0.11.4, not driven: an outside agent can use a user's API key (backend/open_webui/routers/auths.py:1529) limited to listed endpoints by auth.api_key.endpoint_restrictions and allowed_endpoints (utils/auth.py:522-543), acting as that user; searched 'client registration|agent registry|service account' in backend/open_webui: no registry of outside agents or per-agent identity Note: restriction is instance-wide per key type, identity is always a human user" + "open-webui": "source read at v0.11.4, not driven: an outside agent can use a user's API key (backend/open_webui/routers/auths.py:1529) limited to listed endpoints by auth.api_key.endpoint_restrictions and allowed_endpoints (utils/auth.py:522-543), acting as that user; searched 'client registration|agent registry|service account' in backend/open_webui: no registry of outside agents or per-agent identity Note: restriction is instance-wide per key type, identity is always a human user", + "n8n": "source read at n8n@2.40.7, not driven: outside agents connect to the instance MCP server with an API key or OAuth client (packages/cli/src/modules/mcp/mcp-api-key.service.ts, packages/cli/src/modules/oauth-server) and act as the user who issued it; packages/cli/src/modules/mcp/mcp-scopes.ts:13-50 grantable scopes limit which tools they may call (workflow:read, workflow:write, workflow:execute, agent:read ...), and workflows or agents opt in to MCP one by one (agent.entity.ts:39-40 availableInMCP)" } }, { @@ -6128,13 +6343,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 USER.md holds the user's preferences and style and loads every session; hermes_cli/commands.py:163 /personality, :207 /busy, :176 /verbose, :170 /timestamps; web/src/pages/ConfigPage.tsx config editor Note: Preferences are per profile; separate people get separate preferences only through separate profiles or a user-modelling memory provider.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/account.py:376,394,412 account settings are only interface language, theme and timezone; searched 'custom instruction|personal instruction|about you|user preference' in web/i18n/en-US, api/controllers and dify-agent/src: only conversation variables that a builder defines per conversation (web/i18n/en-US/workflow.json:113) Note: no per-person settings for how agents behave", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/General.svelte:29 personal system prompt, :80 saved to user settings, model parameters (settings.personal.general.modelParameters), language; Personalization.svelte memory on/off; Notifications.svelte delivery; InputMenu.svelte:54 default tool-approval mode" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/General.svelte:29 personal system prompt, :80 saved to user settings, model parameters (settings.personal.general.modelParameters), language; Personalization.svelte memory on/off; Notifications.svelte delivery; InputMenu.svelte:54 default tool-approval mode", + "n8n": "source read at n8n@2.40.7, not driven: Settings > Context > Preferences holds per-user or shared guidance (en.json:3234-3258, scope 'Just you' or 'Everyone'), used by the n8n Assistant and connected AI tools, and shown only when a PostHog flag is on (packages/frontend/editor-ui/src/features/settings/context/context.utils.ts:20-25); searched 'preference' in packages/cli/src/modules/agents: agents people build do not read them Note: Preferences steer n8n's own assistant, behind a rollout flag." } }, { @@ -6150,14 +6366,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: agent/chat_completion_helpers.py:445-453 provider_routing.data_collection ('deny') plus only/ignore provider lists sent to OpenRouter; hermes_cli/model_data_policy_guard.py:23-55 warns before selecting a tier that trains on prompts (Meta contributor only rule); hermes_cli/models_local.py:1-5 local models keep data in house Note: Controls exist per provider route and by choosing local models; nothing guarantees it across all configured providers.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'fine.?tun|train on|zero data|data retention' in api/core, api/services and web/i18n/en-US: Dify itself trains nothing and self-hosting lets the organisation pick any provider, including local models via plugins; api/configs/feature/__init__.py:835-845 community telemetry is anonymous and can be disabled. No per-provider no-training guarantee or setting in the product Note: depends on the chosen model provider's terms, nothing in the product enforces or records it", - "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: no setting guarantees non-training; searched 'training|train on|data usage' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/nodes-langchain/nodes/llms: none; self-hosting with local models (LMChatOllama) keeps data from any outside model, and n8n's own diagnostics can be switched off (packages/@n8n/config/src/configs/diagnostics.config.ts:17) Note: Achievable by architecture (self-host plus local models); otherwise it rests on each provider's terms.", "open-webui": "source read at v0.11.4, not driven: self-hosted with local models (routers/ollama.py) keeps data in-house, and the only outward stats sync is opt-in without message content (src/lib/components/chat/Settings/SyncStatsModal.svelte:367); for remote providers nothing in the code sets or enforces a no-training term (searched 'training|opt.?out|zero retention' in routers/openai.py and utils/anthropic.py) Note: a guarantee only holds for local models" } }, @@ -6174,14 +6390,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 tool progress shows each step taken; hermes_cli/commands.py:190-192 /reasoning show displays model reasoning summaries (agent/reasoning_summaries.py); agent/turn_explainers.py:1-4 explains why a turn ended without an answer; web/src/pages/SessionsPage.tsx full transcript Note: Steps and reasoning can be shown; there is no plain-language account of how an outcome came about for a reviewer who keeps the final say.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/reasoning-panel.tsx, workflow-process.tsx and tool-detail.tsx show the model's reasoning, each workflow step and tool call under an answer; citation popup names source documents (web/app/components/base/chat/chat/citation/popup.tsx:31); Human Input node lets a person confirm before the next step (web/i18n/en-US/workflow.json:46) Note: raw trace and sources, not a generated plain-language explanation of the outcome", - "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: runs are traceable step by step (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue; Agents-module session timelines) and the AI Agent node can return its intermediate steps (packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:29 returnIntermediateSteps); searched 'explain|explanation' in packages/cli/src/modules/agents: no plain-language account of how an outcome came about Note: Technical trace, not a plain-language explanation.", "open-webui": "source read at v0.11.4, not driven: answers show sources (Messages/Citations.svelte, ResponseMessage.svelte:910), reasoning and tool steps (Messages/Markdown/MarkdownTokens.svelte:63 groupable 'tool_calls', 'reasoning', 'code_interpreter'); searched 'explain|explanation' in backend/open_webui/utils: no generated plain-language account of how an outcome came about" } }, @@ -6198,14 +6414,14 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: searched 'only answer from|answer only|grounded only|restrict.{0,20}sources' in agent/ tools/ hermes_cli/: none that constrains answers to a document set; tools/website_policy.py:1-5 blocklists sites and hermes_cli/web_routers/tools.py:280 toolset toggles can remove web tools, but nothing limits answers to validated documents Note: A profile can be narrowed by removing tools and by SOUL.md wording; nothing enforces it.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: answers can be grounded in a curated knowledge base, but the limit is only a prompt: api/core/prompt/prompt_templates/advanced_prompt_templates.py:1 'Use the following context as your learned knowledge ... If you don't know, just say that you don't know'; annotation reply returns curated answers above a score threshold (api/controllers/console/app/annotation.py:170,199; web/i18n/en-US/app-debug.json:40-47) Note: no hard switch that blocks answers outside validated documents, and no validated flag on documents", - "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: an agent can be pointed at chosen documents (Agents-module knowledge files, packages/cli/src/modules/agents/agent-knowledge.controller.ts:48; Question and Answer Chain over a retriever, packages/@n8n/nodes-langchain/nodes/chains/ChainRetrievalQA), and instructions can forbid other sources; searched 'only answer from|grounded only|strict retrieval' in packages/cli/src/modules/agents and nodes/chains: no enforced answer-only-from-sources mode or validation status on documents Note: Relies on instructions; nothing enforces it or marks documents as validated.", "open-webui": "source read at v0.11.4, not driven: an agent can be tied to curated knowledge bases (ModelEditor.svelte:1194) and the admin-editable RAG_TEMPLATE (backend/open_webui/config.py:1096) can forbid outside knowledge, but the default template tells the model to answer from its own knowledge when context lacks it (:1078); searched 'strict|only from|grounded only' in config.py and utils/middleware.py: no enforced sources-only mode Note: possible by prompt configuration, not enforced" } }, @@ -6222,14 +6438,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/tips.py:1-3 tips at CLI session start; tools/tour_tool.py:1-5 agent-led guided tours of the desktop UI; hermes_cli/journey.py:1 `hermes journey` timeline of what Hermes learned; web/src/pages/DocsPage.tsx:1 docs link in the dashboard Note: Help teaches how to use Hermes, not AI literacy (limits, risks, verification) as training modules.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:203 Help, Learn Dify and :620,643-647 step-by-step tour with hands-on lessons on workflows and agents (api/controllers/console/onboarding.py:56); searched 'ai literacy|limitations|hallucinat|responsible' in web/i18n/en-US: nothing explains AI risks or limits to end users Note: product lessons for builders only", - "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: searched 'literacy|training module|course|learn about AI' in packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src/locales/en.json: no explanation or training modules for users; in-product help is contextual (n8n Assistant, en.json:5361 'Ask anything about n8n')", "open-webui": "source read at v0.11.4, not driven: searched 'literacy|training module|tutorial|course|learn' in src/lib/components and src/routes: only onboarding welcome (OnBoarding.svelte:82) and a docs link; no in-product AI literacy modules" } }, @@ -6246,14 +6462,14 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: searched '\\bbias\\b|fairness' in agent/ tools/ hermes_cli/ evals/: only ranking bias in tools/session_search_tool.py:693 and a fairness comment in evals/; no bias test runner or stored results", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'bias|fairness|evaluation|test case' in api/controllers, api/services and web/i18n/en-US: no hits beyond external tracer blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix); no scheduled test runs of agents and no stored bias result", - "n8n": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: evaluations keep scored results per run (packages/cli/src/evaluation.ee/test-runs.controller.ee.ts) with metrics correctness, helpfulness, string similarity, exact match and tools used (en.json:6540-6544); searched 'bias|fairness' in packages/cli/src/evaluation.ee and agent-evals: no bias metric and no recurring schedule for evaluations Note: A bias dataset and its checks must be written by hand and started by hand.", "open-webui": "source read at v0.11.4, not driven: searched 'bias|fairness' in backend/open_webui and src/lib/components: no bias tests; evaluations are user-vote leaderboards (routers/evaluations.py:222)" } }, @@ -6269,14 +6485,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:459 `hermes kanban` durable task board shared across profiles; hermes_cli/kanban_db.py:1249 create_task, :2263 claim_task, :2558 reclaim_task, :2723 complete_task; tools/kanban_tools.py:112 kanban_complete/kanban_block agent tools, :237 kanban_comment hand-off between tasks.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'board|claim|kanban|task queue|hand.?off' in web/i18n/en-US/agent-v-2.json, workflow.json and dify-agent/src: no shared task board; agents meet only as nodes in a designed workflow (api/core/workflow/nodes/agent_v2) or as tools (fl-subagent)", - "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: searched 'task board|kanban|claim|hand off' in packages/@n8n/agents/src and packages/cli/src/modules/agents: the only task list is one agent's own run planner (packages/@n8n/agents/src/runtime/tools/write-todos-tool.ts, planner-todos-tool.ts; en.json:7691-7699) and sub-agent delegation; no board shared by several agents Note: A shared board could be improvised with Data Table nodes as tools, but nothing ships for it.", "open-webui": "source read at v0.11.4, not driven: searched 'board|claim|assign|handoff' in backend/open_webui/tools/builtin.py and utils/subagents.py: create_tasks/update_task (tools/builtin.py:3593, :3643) keep a checklist inside one chat message; sub-agents return a summary to the lead (utils/subagents.py:511), no shared board agents claim from" }, "built": { @@ -6297,14 +6513,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:117 /goal 'Set a standing goal Hermes works on across turns until achieved'; gateway/slash_commands_goals.py:37 handler in every messaging channel; hermes_cli/goals.py:397 GoalState, :344 GoalGate shell checks, :860 goal_judge model call decides done.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:20 Loop node with :804 'Loop Termination Condition' and :815 maximum loop count, so a builder can wrap an Agent node in a loop that repeats until a check holds; searched 'goal|until|stop condition' in dify-agent/src: an agent itself has no standing goal across turns Note: only as a builder-designed loop inside one workflow run, not across conversation turns", - "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: an agent schedule re-runs the same objective on cron (en.json:8113 'Objectives the agent runs on a schedule') but has no completion check; iterate-until-verified exists only in n8n's own builder assistant (packages/@n8n/instance-ai/src/workflow-loop/workflow-loop-controller.ts, verification-obligation.ts); searched 'goal|until reached|success criteria' in packages/cli/src/modules/agents: none Note: Recurring objective without a stop condition; the verify loop belongs to the builder assistant.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1721 timer lets the agent schedule a follow-up prompt back into the same chat (utils/timers.py create_timer, fired by the scheduler at utils/automations.py:90), so it can keep working across turns; searched 'goal|until|success check' in utils/timers.py and utils/middleware.py: no goal object or completion check Note: self-scheduled follow-ups, no goal with a stop condition" }, "built": { @@ -6325,14 +6541,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:134 /moa runs a prompt through the Mixture of Agents preset; agent/moa_loop.py:1 reference models gathered before each iteration, aggregator answers; hermes_cli/subcommands/moa.py:10 `hermes moa configure`; hermes_cli/web_routers/models.py:204 GET /api/model/moa for the dashboard.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app-debug.json:31 'Debug as Multiple Models' shows several models side by side, for builder testing only; in a workflow a builder can run several LLM nodes on parallel branches (workflow.json:152 Add Parallel Node, :19 blocks.llm) and merge with a further LLM node or Variable Aggregator (:34) Note: no built-in ensemble setting; hand-built in a flow", - "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: several model nodes can answer the same input on parallel branches and a Merge node plus a final LLM step can combine them (packages/nodes-base/nodes/Merge, packages/@n8n/nodes-langchain/nodes/chains/ChainLLM); searched 'ensemble|multi-model|compare models' in packages/cli/src/modules/chat-hub and packages/@n8n/nodes-langchain/nodes: no shipped node or chat option that fans out and merges Note: Must be hand-built in a workflow.", "open-webui": "source read at v0.11.4, not driven: several models answer one prompt side by side (permission chat.multiple_models; src/lib/components/chat/Messages/MultiResponseMessages.svelte) and 'Merge Responses' (:439) calls backend/open_webui/routers/tasks.py:610 POST /tasks/moa/completions to fuse them with moa_response_generation_template (:630)" }, "built": { @@ -6353,14 +6569,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/auth.py:10 `hermes auth add` pooled credentials; agent/credential_pool.py:122 least_used strategy, :1941 select, :2221 mark_exhausted_and_rotate; agent/agent_runtime_helpers.py:895 the turn rotates to the next key on a quota or auth failure. Note: distinct from mo-failover (second provider) and mo-key-broker (central store): same provider, many keys.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:387-390 model Load balancing: several credentials per model, round-robin, 1-minute cooldown when rate limited; api/core/model_manager.py:208,440-476 _round_robin_invoke and cooldown on InvokeRateLimitError; api/configs/feature/__init__.py:813-815 MODEL_LB_ENABLED (default False) read in api/services/feature_service.py:115 Note: self-hosted turns it on with an env flag; on Cloud it is plan-gated (common.json:442 'Upgrade your plan to enable Load Balancing')", - "n8n": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: one credential per model node; the AI Agent's fallback model can use a second credential of the same provider when the first call fails (packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:118-119 needsFallback, ToolsAgent/V3/execute.ts:85 fallbackModel); searched 'rotate|apiKeys|key pool' in packages/@n8n/nodes-langchain/nodes/llms: no pool of keys spread or rotated per provider Note: Two keys at most, by fallback, not rotation.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:328 normalize_openai_api_keys pairs exactly one key with each base URL; Ollama spreads a model over several URLs at random (routers/ollama.py:863) without keys; searched 'rotate|429|quota|next key' in routers/openai.py and routers/ollama.py: no key pool or rotation on exhaustion" }, "built": { @@ -6381,14 +6597,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/backup.py:10 `hermes backup` zips ~/.hermes, hermes_cli/backup.py:671 run_backup, :993 run_import; hermes_cli/cli_commands_mixin.py:805 /snapshot list|create|restore; hermes_cli/update_cmd_maint.py:692 automatic snapshot only before an update. No scheduled backup job and no version history (grep backup in cron/: only fallback-provider copy). Note: issue open; automatic backups are limited to the pre-update snapshot.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: per-object version restore only: agents (api/controllers/console/agent/roster.py:1302), workflows (billing.json:167-168, plan-gated on Cloud) and skills (skill.json:153-157); searched 'backup' in api/, web/i18n/en-US and docker/: only docker/dify-env-sync.sh backing up the .env file (docker/README.md:151-159); no automatic backup of all agent data Note: no platform backup; restore of single agent or workflow versions", - "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/export/entities.ts:35 'Export database entities to JSON files' and packages/cli/src/commands/import/entities.ts restore them; workflows and agents roll back to earlier versions (packages/cli/src/workflows/workflow-history/workflow-history.controller.ts, packages/cli/src/modules/agents/agent-publish.controller.ts:87); source control pushes to Git (feat:sourceControl); searched 'backup' schedule in packages/cli/src: no automatic backup Note: Manual CLI export, not automatic; point-in-time restore is per workflow or agent.", "open-webui": "source read at v0.11.4, not driven: manual only: backend/open_webui/routers/utils.py:74 GET /utils/db/download returns the raw SQLite file (admin, ENABLE_ADMIN_EXPORT config.py:2082, not for PostgreSQL), routers/configs.py:118 export and :100 import config, chat export and import (routers/chats.py:807); searched 'backup|snapshot|restore' in backend/open_webui/routers and utils: no automatic backup or point-in-time restore" }, "built": { @@ -6410,14 +6626,14 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:6 bundled A2A plugin, outbound a2a_discover/a2a_call/a2a_orchestrate; plugins/platforms/a2a/tools.py:173 a2a_call sends a task to a configured peer or URL and returns the reply, :255 a2a_orchestrate; :330 tools appear only once a2a_agents or the platform is configured. Note: issue #689 is still open but the A2A plugin shipped in core covers remote delegation; config-gated, off by default.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: a remote agent can be reached only as a tool: MCP servers added as tool providers (api/controllers/console/workspace/tool_providers.py:1373), custom OpenAPI tools (:685) or an HTTP Request node (web/i18n/en-US/workflow.json:11); searched 'a2a|remote agent|agent.?card' in api/core and web/i18n/en-US: no agent-to-agent protocol Note: works through MCP or HTTP wrappers, no native remote agent hand-off", - "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: the instance MCP server exposes 'call_agent' under the agent:execute scope (packages/cli/src/modules/mcp/mcp-scopes.ts:73), and an agent on another n8n calls it through the MCP Client Tool node (packages/@n8n/nodes-langchain/nodes/mcp/McpClientTool) or an Agents-module MCP server entry (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:228-303); any remote agent behind a webhook is reachable with the HTTP Request tool", "open-webui": "source read at v0.11.4, not driven: a remote agent server can be added as a model connection (OpenAI-compatible, routers/openai.py:865; README.md:94 Open WebUI Computer 'Connect it into Open WebUI as a model') or reached as an MCP/OpenAPI tool server (utils/middleware.py:2340); searched 'a2a|agent2agent|remote agent' in backend/open_webui: no agent-to-agent protocol, and delegate_task only spawns local clones (utils/subagents.py:317)" }, "built": { @@ -6438,14 +6654,14 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: searched 'requests_per_minute|rpm|token_bucket|throttle|rate_limit_delay' in agent/, run_agent.py, hermes_cli/: agent/rate_limit_tracker.py:181 only displays provider RPM headers; rate_limit_delay is accepted in hermes_cli/config.py:993 and hermes_cli/config_providers.py:260 but nothing in agent/ reads it. No client-side limiter. Note: a config key nothing reads, so no. Same demand in #58061.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 max_active_requests caps concurrent requests per app, enforced in api/services/app_generate_service.py:153,384; provider rate limits are only handled reactively by load-balancing cooldown (api/core/model_manager.py:469-476); searched 'per.?minute|rpm' in api/configs and api/core/model_manager.py: per-minute limits exist only for the openapi token and forms (api/configs/feature/__init__.py:1063) Note: concurrency cap, not requests per minute to a provider", - "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: the AI Agent, Text Classifier and Summarization nodes process items in batches with a delay between batches (packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V3/execute.ts:85,121-122 batchSize, delayBetweenBatches), and model nodes retry with maxRetries (packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:591,844); searched 'requests per minute|rpm|rate limit' in nodes/llms and packages/cli/src/modules/agents: no per-provider request cap Note: Throttling by batch delay, not a requests-per-minute cap; inbound channel rate limits are something else.", "open-webui": "source read at v0.11.4, not driven: searched 'rate_limit|rpm|requests per minute|throttle' in backend/open_webui/routers/openai.py, routers/ollama.py, config.py and utils/middleware.py: the only RateLimiter use is sign-in (routers/auths.py:91); no per-agent cap on provider requests" }, "built": { @@ -6466,14 +6682,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: no temperature key in hermes_cli/config*.py (grep temperature hermes_cli: none for the main agent); agent/chat_completion_helpers.py:1416 only fixed per-model temperatures; a custom provider's extra_body (hermes_cli/config.py:993, applied at agent/agent_runtime_helpers.py:1937) can pass one; MoA presets have reference/aggregator temperature (hermes_cli/web_models.py:152). Note: issue open; only indirect paths.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 ModelParameterModal per agent renders the provider's parameter rules including temperature (web/app/components/header/account-setting/model-provider-page/model-parameter-modal/__tests__/presets-parameter.spec.tsx); LLM nodes and classic apps use the same modal", - "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: chat model nodes take a temperature option, e.g. packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:543 and LMChatAnthropic/LmChatAnthropic.node.ts:369 Note: Agents-module agents expose reasoning effort instead (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:514); no temperature field there.", "open-webui": "source read at v0.11.4, not driven: per agent in ModelEditor 'Advanced Params' (ModelEditor.svelte:1127) using src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte:27 temperature, :434 label; per user and per chat in the same component; stored in Model.params (backend/open_webui/models/models.py:119)" }, "built": { @@ -6495,14 +6711,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:39 memory dir is per profile (HERMES_HOME/memories), so a profile per project gives separate memory but no shared layer; agent/prompt_builder.py:139 project .hermes.md/HERMES.md is read-only context; agent/skill_utils.py:437 project-local skills. Searched 'project.scoped|memory_scope' in agent, tools, plugins/memory: none. Note: issue open.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 agent working directories are owned per workflow run, conversation or build draft only; searched 'project' in web/i18n/en-US/agent-v-2.json and dify-agent/src: no project scope and no memory split into project and shared parts", - "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: Agents-module memory is kept per agent and resource: per user, per chat thread, per task (packages/cli/src/modules/agents/utils/agent-memory-scope.ts:1-60), and agents live in projects; workflow memory nodes take any session key, so a per-project key plus a shared key can be wired by hand (packages/@n8n/nodes-langchain/nodes/memory/MemoryPostgresChat); searched 'shared memory|project memory' in packages/cli/src/modules/agents: none Note: No built-in pairing of a project memory with a shared one.", "open-webui": "source read at v0.11.4, not driven: memories are per user with an optional path hierarchy (backend/open_webui/models/memories.py:24 path; tools/builtin.py:800 list_memory_paths, :831 read_memory_path), so a project path can hold its own facts; folders (projects) carry files and a system prompt (utils/middleware.py:2591) but searched 'folder' in utils/memory.py and routers/memories.py: no memory scoped to a project" }, "built": { @@ -6524,14 +6740,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands_session.py:862 /resume, :323 a stored session is only resumable from the same platform and thread, :303 cross-origin resume only for an explicitly configured admin with --all; all sessions share one state.db so the local CLI can reopen them. Note: issue open; cross-channel is admin-only in the gateway.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:124-128 a caller resumes a conversation by passing conversation_id with the same user id, so two self-built channels on the Service API can share one thread; conversations are filtered by end user (api/services/conversation_service.py:56-57) and the web app session is a separate end user, so nothing carries over between the web app and a messenger plugin Note: only by a builder passing ids through the API", - "n8n": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: memory and threads are keyed by channel identity: an n8n user's chats use draft-chat:, a messenger user integration:: (packages/cli/src/modules/agents/utils/agent-memory-scope.ts:1-45), so a Slack or Telegram conversation cannot be resumed in n8n's own chat; searched 'handoff|continue in|link account' in packages/cli/src/modules/agents/integrations: none Note: Sessions from other channels are visible read-only in the session list (en.json agentSessions.origin.slack), not continuable.", "open-webui": "source read at v0.11.4, not driven: chats are stored server-side so the same chat opens on any browser or the PWA (backend/open_webui/routers/chats.py:1325), but searched 'telegram|slack|messenger|move to channel' in backend/open_webui/routers and utils: there are no messenger channels and no way to carry a chat into a channel or back" }, "note": "not checked: lib/Settings/hermiq_register.json Session.talkRoomOrigin shows a Hermiq chat session can own or bind a Talk room, so one session spans the Chat page and Talk; whether a user can pick up in the Chat page a session begun in Talk was not traced to a page" @@ -6548,14 +6764,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/models/agent.py:218 AgentHomeSnapshot captured when a build is applied; release 1.17.0 'Build-time Home Snapshots' restores the sandbox home on each published run", - "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: publishing stores a snapshot of config, custom tool code and skills (packages/cli/src/modules/agents/entities/agent-history.entity.ts:34-47) and production runs use that active version (entities/agent.entity.ts:53-59 activeVersionId); workflows likewise run their published version; knowledge files (agent-knowledge.controller.ts:48) and installed community node packages are not pinned to the snapshot Note: Config and code are frozen per publish; files and installed packages can change underneath.", "open-webui": "source read at v0.11.4, not driven: searched 'snapshot|pin|lock|build' in backend/open_webui/models/models.py, routers/models.py and utils/terminals.py: runs use the model's current config and the terminal's live filesystem; no frozen build of files and tools per published agent" }, "note": "hermiq not checked: back-fill pending" @@ -6572,14 +6788,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:237,251 'Add a CLI Tool', 'Install a CLI tool from any package registry. The agent gains shell access to the binary it provides'", - "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: with a sandbox configured, Agents-module agents get workspace tools incl. workspace_execute_command (packages/@n8n/agents/src/workspace/tools/workspace-tools.ts:23-29, attached at packages/cli/src/modules/agents/agent-runtime-reconstruction.service.ts:868-893), so an agent can install and run a CLI tool; the sandbox is off by default (packages/@n8n/config/src/configs/agents.config.ts:84) Note: Needs the opt-in Agents module plus a configured Daytona or n8n sandbox; plain workflow agents have no shell.", "open-webui": "source read at v0.11.4, not driven: in an attached Open Terminal the agent can install packages through run_command (backend/open_webui/utils/tools.py:1439; separate first-party server, README.md:96); the browser Pyodide sandbox installs Python wheels with micropip (src/lib/workers/pyodide.worker.ts:72-73); core has no install tool of its own Note: needs Open Terminal for real CLI tools" }, "note": "hermiq not checked: back-fill pending" @@ -6596,14 +6812,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: docker/.env.example:271 DIFY_AGENT_RUNTIME_BACKEND=local, docker/docker-compose.e2b.yaml ships the E2B backend; web/i18n/en-US/agent-v-2.json:91 notes the limits of the community local sandbox", - "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: the operator picks where assistant code runs: packages/@n8n/config/src/configs/instance-ai.config.ts:73-74 N8N_INSTANCE_AI_SANDBOX_PROVIDER 'n8n-sandbox' (hosted service) or 'daytona' (own or hosted Daytona), and Code node runners run as a child process or a separate runner container (packages/@n8n/config/src/configs/runners.config.ts:16-17) Note: An instance-wide environment setting that also decides where Agents-module workspaces run (packages/cli/src/services/sandbox-settings.service.ts:103-109), not a choice per agent.", "open-webui": "source read at v0.11.4, not driven: admin chooses the code engine: src/lib/components/admin/Settings/CodeExecution.svelte:20 'pyodide' (in the browser) or 'jupyter' (own server), and per agent an Open Terminal server (ModelEditor.svelte:1268 TerminalSelector, AddTerminalServerModal.svelte); searched 'e2b|daytona|modal|cloud sandbox' in backend/open_webui: no hosted cloud sandbox option Note: choice between self-hosted engines only" }, "note": "hermiq not checked: back-fill pending" @@ -6620,14 +6836,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/human_input_form.py:78 /form/human_input/; api/controllers/openapi/human_input_form.py:63,83 read and submit a human input form", - "n8n": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Wait/Wait.node.ts:332-335 'On Webhook Call' resumes a waiting execution when another program calls its resume URL; send-and-wait approvals answer through a URL too (packages/nodes-base/utils/sendAndWait/utils.ts); Agents module resumes a paused run through packages/cli/src/modules/agents/agent-chat.controller.ts:199-200 POST /:agentId/chat/resume", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1893 POST /api/v1/chats/{id}/messages/{message_id}/resolve with ResolveToolCallForm action approve|reject|answer (utils/tool_approval.py:13), then resumes the run (main.py:1903 build_tool_approval_resume_payload); usable with an API key" }, "note": "hermiq not checked: back-fill pending" @@ -6644,14 +6860,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:558-561 the approval form can be emailed to chosen workspace members or external recipients, but searched 'assignee|approver' in workflow.json and api/controllers/web/human_input_form.py: whoever holds the form link can answer", - "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts:177-180 an approvers list: anyone else who clicks gets a private refusal (:56); packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:39-57 'Restrict Who Can Approve' and 'Unauthorized Reply' Note: Enforced in Slack and Telegram approvals; e-mail approval links can be answered by whoever holds the link.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/tool_approval.py:28 only the chat owner or an admin may resolve a pending call; searched 'approver|assignee' in utils/tool_approval.py and utils/middleware.py: no named approvers" }, "note": "hermiq not checked: back-fill pending" @@ -6668,14 +6884,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'context usage|context window|tokens used' in web/i18n/en-US/agent-v-2.json, share.json and app-debug.json: no indicator; compaction runs silently (dify-agent/src/dify_agent/runtime/compaction.py)", - "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: the agent preview's menu shows the session's token spend and duration (packages/frontend/editor-ui/src/features/agents/components/AgentPreviewMoreMenu.vue:138,303; en.json:8227 'Token spend') and chat hub admins set a context window in messages (en.json:3694); searched 'context window|contextUsage' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents components: no meter of how full the window is Note: Token totals, not a fill level against the model's window.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput.svelte:1837 'Context usage' readout fed by :535 statusContextUsage; backend/open_webui/utils/context_compaction.py:254 get_chat_context_usage against the compaction threshold (:290 _build_context_usage), returned with chats at routers/chats.py:1308, :1344" }, "note": "hermiq not checked: back-fill pending" @@ -6692,14 +6908,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:667-669 apps can carry tags (permission-keys.json app.tag.manage) to filter the list; no folders", - "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: workflows sort into folders (packages/cli/src/controllers/folder.controller.ts:60-125, each route @Licensed('feat:folders'); en.json:1765 'Add folder'); agents have no folder field (packages/cli/src/modules/agents/entities/agent.entity.ts:8-71) and are grouped by project only Note: Workflows only, and licence-gated.", "open-webui": "source read at v0.11.4, not driven: agents are grouped by tags, not folders (src/lib/components/workspace/Models.svelte:67 TagSelector, backend/open_webui/routers/models.py:270 /models/tags); folders exist for chats (routers/folders.py) and an automation's folder_id only files its generated chats (models/automations.py:25); there are no flows to sort" }, "note": "hermiq not checked: back-fill pending" @@ -6716,14 +6932,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'compare' in web/i18n/en-US/workflow.json and run-log.json: run history opens one run's tracing at a time (workflow.json:240-254), no comparison view", - "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: evaluation runs compare side by side with Cases, Outputs, Metrics and a 'Workflow diff' tab (en.json:6521-6524; packages/frontend/editor-ui/src/features/ai/evaluation.ee/components/Compare/) and workflow versions diff visually (packages/frontend/editor-ui/src/features/workflows/workflowDiff/WorkflowDiffView.vue); searched 'compare' in packages/frontend/editor-ui/src/features/execution/executions: no side-by-side of two ordinary executions Note: Comparison exists for evaluation runs and versions, not for two production runs.", "open-webui": "source read at v0.11.4, not driven: searched 'compare|diff' in src/lib/components/automations and backend/open_webui/routers/automations.py: runs are listed one by one (AutomationEditor.svelte:355-400); side-by-side view exists only for different models answering one prompt (chat/Messages/MultiResponseMessages.svelte), not for two runs" }, "note": "hermiq not checked: back-fill pending" @@ -6740,14 +6956,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: issue is open against the function-calling agent runner; searched 'fabricat|expected tool|zero tool call' in api/core/agent and dify-agent/src: no check", - "n8n": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: the evaluation metric 'Right tools used' scores whether expected tools were called (en.json:6544), after the fact on test cases; at run time only a prompt rule asks the model not to claim an action before its tool returns (packages/cli/src/modules/agents/integrations/integration-tool-descriptions.ts:29); searched 'claim|hallucinat|unsupported' in packages/@n8n/agents/src/runtime: no check that flags a live answer Note: Caught in evaluations, not flagged on a live answer.", "open-webui": "source read at v0.11.4, not driven: searched 'hallucinat|claimed|without calling|verify tool' in backend/open_webui/utils/middleware.py and utils/tools.py: no check that flags an answer claiming a result the agent never fetched with a tool" }, "note": "hermiq not checked: back-fill pending" @@ -6764,14 +6980,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: an Agents-module agent can be set up for research with web search (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:80-84), parallel sub-agents (:151-160) and cited knowledge reads (packages/cli/src/modules/agents/agent-knowledge-retrieval.ts:199); there is no research mode, and OpenAI deep-research models are switched off in chat (packages/cli/src/modules/chat-hub/chat-hub.constants.ts:226-231, 603-605) Note: Assembled from agent settings; no one-click deep research.", "open-webui": "source read at v0.11.4, not driven: no research mode (searched 'deep.?research' in backend/open_webui and src/lib/components: hits only in stale locale files); pieces exist: tools/builtin.py:294 search_web, :333 fetch_url, :1680 delegate_task parallel sub-agents, citations in chat/Messages/Citations.svelte" }, "note": "hermiq not checked: back-fill pending" @@ -6788,14 +7004,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", - "n8n": "unknown", + "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/mfa/totp.service.ts and packages/cli/src/controllers/mfa.controller.ts:73-115 authenticator-app setup (QR, enable) with a code at sign-in (en.json:6099 'Two-factor authentication'); forcing it on everyone is licence-gated, mfa.controller.ts:31 enforce-mfa with feat:mfaEnforcement (packages/@n8n/constants/src/index.ts:18) Note: Enforcement for all users is enterprise-licensed.", "open-webui": "source read at v0.11.4, not driven: searched 'totp|two.?factor|2fa|mfa|webauthn|passkey' in backend/open_webui and src/lib/components: no second factor; MFA only through an outside OIDC provider (utils/oauth.py)" }, "note": "hermiq not checked: back-fill pending" @@ -6812,14 +7028,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", - "n8n": "unknown", + "n8n": "no", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: chat messages are stored as ordinary rows (packages/cli/src/modules/chat-hub/chat-hub-message.entity.ts); instance encryption covers credentials with an instance key (packages/cli/src/encryption/key-manager.service.ts, packages/core/src/encryption/cipher.ts); searched 'end-to-end|e2ee|user key' in packages/cli/src/modules/chat-hub and packages/cli/src/encryption: no per-user key", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/internal/db.py:289 whole-database encryption with sqlite+sqlcipher and DATABASE_PASSWORD, instance-wide; searched 'encrypt' in models/chats.py: chats stored readable to the server and admins, no per-user key" }, "note": "hermiq not checked: back-fill pending" @@ -6836,14 +7052,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: an agent's MCP server takes one OAuth or header credential chosen by its builder (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:243-252, McpOAuth2Api at packages/@n8n/nodes-langchain/credentials/McpOAuth2Api.credentials.ts); per-person MCP connections exist for n8n's own assistant (packages/cli/src/modules/instance-ai/entities/instance-ai-thread-grant.entity.ts) and per-user resolution in workflows needs licensed dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee) Note: Per-person login only in the assistant or with an enterprise licence.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/tools.py:137-158 tool server auth types bearer, session, system_oauth, oauth_2.1 and oauth_2.1_static; src/lib/components/AddToolServerModal.svelte:143 registers an OAuth client for MCP; per-user tokens encrypted in utils/oauth.py:269 Note: discussion still open, but the code has per-user OAuth 2.1 for MCP" }, "note": "hermiq not checked: back-fill pending" @@ -6860,14 +7076,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:255-260 'Use Responses API' option; chat hub providers carry responsesApiEnabled (packages/@n8n/api-types/src/chat-hub.ts:585)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/AddConnectionModal.svelte:51 apiType '' or 'responses'; backend/open_webui/routers/openai.py:1589 is_responses, :1618-1634 posts to {url}/responses with convert_to_responses_payload Note: discussion still open; the code ships it" }, "note": "hermiq not checked: back-fill pending" @@ -6884,14 +7100,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", - "n8n": "unknown", + "n8n": "yes", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatAnthropic/LmChatAnthropic.node.ts:531-590 promptCaching option with 5m or 1h lifetime; Agents-module agents set promptCaching per agent (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:75-78, en.json:7904) Note: A switch per model node or agent, not on for every provider (an open request asks for it on OpenRouter).", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/anthropic.py:111 _copy_cache_control passes cache_control through when the caller sets it; searched 'cache_control|prompt.?cach' in utils/payload.py and routers/openai.py: nothing adds cache breakpoints automatically" }, "note": "hermiq not checked: back-fill pending" @@ -6908,14 +7124,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: workflows: the Chat node's 'Wait for User Reply' and approval response type pause the run for the person's answer (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/Chat.node.ts:141,172); Agents module: a chat_action card with buttons or radio choices suspends the run until answered (packages/@n8n/api-types/src/agents/types.ts:379, packages/frontend/editor-ui/src/features/agents/components/interactive/InteractiveCard.vue:46-55, en.json:7684 'Waiting on the card above to continue')", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:518 ask_user (1-3 questions with options and free text), resolved via utils/tool_approval.py:13 action 'answer'; src/lib/components/chat/AskUserCard.svelte mounted at chat/MessageInput.svelte:1776; survives reload (CHANGELOG.md:331)" }, "note": "hermiq not checked: back-fill pending" @@ -6932,14 +7148,14 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: an n8n Form Trigger collects declared fields (text, dropdown and more) before a workflow runs and can hand them to an AI Agent (packages/nodes-base/nodes/Form/FormTrigger.node.ts); chat agents only offer suggested prompts (packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:62-63); searched 'formFields|inputFields' in packages/cli/src/modules/chat-hub and nodes/trigger/ChatTrigger: no fields declared by the agent itself Note: Hand-built as a form in front of an agent workflow.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/chat_variables.py:127 get_chat_variables_schema parses fields from the system prompt; routers/models.py:60 add_chat_variables_schema; ModelEditor.svelte:1084 'Chat Variables' (CHANGELOG.md:655)" }, "note": "hermiq not checked: back-fill pending" @@ -6956,17 +7172,257 @@ "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: editing or regenerating a message keeps the original and adds a branch (packages/cli/src/modules/chat-hub/chat-hub-message.entity.ts:103-114 previousMessageId, retryOfMessageId, revisionOfMessageId; chat-hub.controller.ts:224,283 edit and regenerate), and the user flips between branches (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatMessageActions.vue:119-136 '1/2' alternatives; en.json:658-659) Note: Branches live inside the same conversation rather than as a separate copy.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1672 POST /chats/{id}/fork copies the chat up to a message and records the branch (utils/chat_fork.py:4 build_fork_history); fork button per response src/lib/components/chat/Messages/ResponseMessage.svelte:1528 (CHANGELOG.md:665)" }, "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-flow-change-review", + "area": "oversight", + "name": "Require a named reviewer to approve a change to a flow before it goes live.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.34.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "partial", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/workflow-reviews.ee/workflow-review-publish-guard.service.ts:8-22 blocks publishing while a review is open or changes are requested; reviewers per request in packages/@n8n/db/src/entities/workflow-review-request-reviewer.ee.ts; review inbox in packages/frontend/editor-ui/src/features/workflow-reviews/; licence flag feat:workflowReviews (packages/@n8n/constants/src/index.ts:58). Enterprise-licensed; workflows only, not Agents-module agents.", + "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-log-redaction-policy", + "area": "compliance", + "name": "Hide sensitive inputs and outputs from run logs with an instance-wide policy.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.22.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "partial", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/redaction/ (instance-redaction-enforcement.service.ts, redaction-policy.ts) redacts execution data by policy, a default module; redaction-context-hook.ts:53 skips unless isDataRedactionLicensed (feat:dataRedaction, packages/@n8n/constants/src/index.ts:56). Enterprise-licensed.", + "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-agent-workspace", + "area": "tools", + "name": "Give an agent its own writable workspace for the files it creates during a session.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.36.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "partial", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/workspace/tools/workspace-tools.ts:23-29 workspace_read_file, workspace_write_file, workspace_str_replace_file, workspace_execute_command; attached per agent in packages/cli/src/modules/agents/agent-runtime-reconstruction.service.ts:868-893 (agent-workspace.service.ts:42); only when a sandbox is configured (packages/@n8n/config/src/configs/agents.config.ts:84, default false) and in the opt-in Agents module.", + "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-native-pdf", + "area": "models", + "name": "Hand a PDF straight to a model that reads PDFs natively, without turning it into text first.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.28.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "yes", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:43-48 'Automatically Passthrough Binary PDFs' on the AI Agent node for models with native PDF input, e.g. Gemini; OpenAI Responses API support for it per release 2.28.0.", + "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-browser-use", + "area": "tools", + "name": "Let an agent drive a web browser: open pages, click and fill in forms.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.38.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "yes", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Airtop/Airtop.node.ts:23 usableAsTool with session, window, interaction, extraction and agent resources (:44-64) driving a cloud browser as an AI Agent tool (needs an Airtop account); n8n's own assistant drives the user's Chrome through packages/@n8n/mcp-browser (README.md:3-6), browser use on by default (packages/@n8n/config/src/configs/instance-ai.config.ts:65-66).", + "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-tool-call-cap", + "area": "oversight", + "name": "Stop an agent after a set number of tool calls so it cannot loop forever.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://community.n8n.io/t/feat-ai-tools-add-max-tool-interactions-to-ai-agent-nodes-to-prevent-infinite-loops/295587", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "partial", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:22-25 maxIterations (default 10) and V3/helpers/checkMaxIterations.ts:6-14 stop the loop after that many iterations; Agents module maxIterations 1-200 (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:518); a turn with several parallel tool calls counts once, so there is no cap on tool calls as such, which the open request asks for.", + "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-tool-error-recovery", + "area": "tools", + "name": "Let an agent carry on when a tool fails or returns nothing, with the error passed back to it.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://community.n8n.io/t/296548", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "partial", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: the Agents-module runtime adds a failed tool call as an error result so the model can self-correct (packages/@n8n/agents/src/runtime/tools/tool-call-executor.ts:686-687); the workflow AI Agent node stops on a tool error unless the node is set to continue on fail (packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/executeBatch.ts:114-121), which the open request says ends reasoning.", + "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-subscription-login", + "area": "models", + "name": "Sign in to a model provider with an account subscription instead of pasting an API key.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://community.n8n.io/t/285451", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "partial", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/credentials/ holds API-key credentials for every model provider (OpenAiApi, AnthropicApi, MistralCloudApi ...); the only OAuth sign-in is Azure Entra for Azure OpenAI (AzureEntraCognitiveServicesOAuth2Api.credentials.ts); searched 'copilot|chatgpt oauth' in packages/@n8n/nodes-langchain: none.", + "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-failed-run-fix", + "area": "observability", + "name": "Have an assistant investigate a failed run and propose a fix.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.28.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "yes", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: n8n Assistant (Instance AI, default module at packages/@n8n/backend-common/src/modules/module-registry.ts:79) 'Debug failed executions and suggest fixes' (packages/frontend/@n8n/i18n/src/locales/en.json:5360); failed runs hand off to it from the editor (release 2.28.0 'Investigate failed executions on Instance AI editor hand-offs'); needs a model set up.", + "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-builtin-table", + "area": "memory", + "name": "Give an agent a built-in table to read and write structured records without an outside database.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.36.0", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "yes", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/DataTable/DataTable.node.ts:27 usableAsTool, so an AI Agent reads and writes rows in n8n's built-in data tables (data-table is a default module, packages/@n8n/backend-common/src/modules/module-registry.ts:51); outside agents read rows through the MCP data table tools (packages/cli/src/modules/mcp/mcp-scopes.ts dataTable:read, dataTable:write).", + "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" } ], "pending": [ @@ -6994,7 +7450,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "n8n": "docs-only: competitor_features#38153 \"core: Bind dynamic credential tokens to a user ID: From n8n@2.32.0 (2026-07-21)\"", + "n8n": "source read at n8n@2.40.7, not driven: a workflow runs with the credentials chosen in its nodes, owned by its project; running as the person who asked needs dynamic credentials, enterprise-licensed (packages/cli/src/modules/dynamic-credentials.ee, feat:dynamicCredentials at packages/@n8n/constants/src/index.ts:53); chat hub passes the asker's auth metadata (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:178); searched 'service account' in packages/cli/src: none Note: Owner's credentials by default, requester with a licence, no service accounts.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 a requester's user id can route to their own profile, whose own keys and credentials then apply (agent/secret_scope.py:1-10); tools/environments/ssh.py runs the terminal as a configured remote account; searched 'run.?as|impersonat|service account|on behalf of' in agent/ and gateway/: no per-run identity choice Note: Tools act with the host or backend account and the profile's keys; choosing requester, owner or service identity per agent is not a setting.", "dify": "source read at 1.17.1, not driven: api/core/agent/entities.py:19 each agent tool carries a credential_id the builder picks; api/models/tools.py:121 credential visibility, web/i18n/en-US/plugin.json:27 an OAuth credential is 'only for you or shared with all workspace members'. So a tool runs as the builder's or a shared workspace credential; searched 'on_behalf|end_user credential|user_credential' in api/core/tools and api/core/plugin: no run-as-the-asking-person Note: owner or shared credential only, no per-caller identity and no service-account concept", "open-webui": "source read at v0.11.4, not driven: interactive runs act as the asking user (main.py:1118 with user from the session); automation runs act as the owner with a minted token (backend/open_webui/utils/automations.py:389 'typ': 'automation', re-gated at :366); searched 'service account|run as|impersonat' in backend/open_webui: the rights holder cannot be chosen Note: fixed by trigger type, no service-account option" @@ -7022,12 +7478,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "partial", "open-webui": "yes", "evidence": { "dify": "source read at 1.17.1, not driven: api/services/conversation_service.py:56-57,179-180 every conversation is filtered to one from_end_user_id or from_account_id; api/controllers/web/conversation.py lists, renames, pins and deletes only the caller's own conversations; the Collaboration feature is live co-editing of the workflow canvas (api/controllers/console/socketio/workflow.py, web/i18n/en-US/workflow.json:118,986 collaborator cursors) Note: old yes rested on the Collaboration beta, which is shared canvas editing for builders, not a shared chat", "open-webui": "source read at v0.11.4, not driven: Channels put colleagues and models in one timeline: backend/open_webui/routers/channels.py:976 model_response_handler answers @mentioned models (:1244) in rooms and threads; src/lib/components/channel/Channel.svelte, Thread.svelte, MessageInput/MentionList.svelte; group and member channel types (translation 'A collaboration channel where people join as members') Note: old partial; shared agent conversations happen in channels", - "hermes-agent": "source read at v2026.9.24, not driven: gateway/config.py:574-596 thread_sessions_per_user false by default, so everyone in a thread shares one session with the agent (group_sessions_per_user can be switched off for whole groups); gateway/session.py:634-641 session key resolution; hermes_cli/commands.py:76 /branch opens a shared thread" + "hermes-agent": "source read at v2026.9.24, not driven: gateway/config.py:574-596 thread_sessions_per_user false by default, so everyone in a thread shares one session with the agent (group_sessions_per_user can be switched off for whole groups); gateway/session.py:634-641 session key resolution; hermes_cli/commands.py:76 /branch opens a shared thread", + "n8n": "source read at n8n@2.40.7, not driven: in the opt-in Agents module a Slack or Discord thread is one shared conversation whose memory belongs to the thread, not the author (packages/cli/src/modules/agents/utils/agent-memory-scope.ts:9-20); chat hub conversations are private to one user (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:110 by req.user.id) Note: Shared only through a chat platform channel, not in n8n's own chat." }, "pendingReason": "Whether every talk-shared-sessions requirement is complete cannot be settled without running a live Talk room." }, @@ -7053,13 +7510,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "no", "pendingReason": "Whether another app relays anonymous citizens into this endpoint as an authenticated service account could not be settled from this repo alone.", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:35 _ALLOW_ALL_USERS lets anyone message the bot on WhatsApp, SMS, Telegram and others without an account; gateway/run_inbound_unauthorized.py:1-9 strangers otherwise get a pairing code; searched 'intake|case|file.{0,10}request' in gateway/ and tools/: no intake flow that files a request Note: A public bot is possible; filing the request somewhere is left to whatever tools the agent has.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app.json:2 web app access 'Anyone with the link'; api/controllers/web/passport.py:53-72 issues a token to an anonymous end-user session, so a resident chats without an account; filing the request needs a builder-built HTTP Request node or custom tool (web/i18n/en-US/workflow.json:11,45); no ready-made intake to a case or request system in core Note: anonymous chat is core; the filing target has to be wired by hand", - "open-webui": "source read at v0.11.4, not driven: searched 'anonymous|guest|public chat|intake' in backend/open_webui/routers/auths.py, routers/chats.py and src/routes: every chat requires an account (utils/auth.py get_verified_user); no anonymous assistant that files a request" + "open-webui": "source read at v0.11.4, not driven: searched 'anonymous|guest|public chat|intake' in backend/open_webui/routers/auths.py, routers/chats.py and src/routes: every chat requires an account (utils/auth.py get_verified_user); no anonymous assistant that files a request", + "n8n": "source read at n8n@2.40.7, not driven: a public chat page or embedded widget needs no n8n account (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:408-452 'public', packages/frontend/@n8n/chat), and the agent behind it can file a request with any tool node; the filing flow has to be built as a workflow Note: The anonymous chat is shipped; the request filing is hand-built." } }, { @@ -7087,7 +7545,7 @@ "evidence": { "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", "dify": "source read at 1.17.1, not driven: core ships only audio, code, time and webscraper tools (api/core/tools/builtin_tool/providers/); connectors come from the in-product Dify Marketplace: about 149 official tool plugins (langgenius/dify-official-plugins tools/, e.g. slack, jira, notion, gmail, salesforce, nextcloud) plus about 1,290 community packages (langgenius/dify-plugins), installed from web/app/(commonLayout)/integrations; MCP client too Note: rated partial only by the brief's plugin rule; the catalogue is well over a hundred ready-made connectors, one click from the core UI. The lane keeps partial under the plugin rule (ruling 2026-09-26).", - "n8n": "docs-only: competitor_features#31095 \"400+ app connectors: Large library of prebuilt integration nodes.\"", + "n8n": "source read at n8n@2.40.7, not driven: 272 nodes in packages/nodes-base/nodes declare usableAsTool: true (e.g. Slack, Gmail, Google Calendar, Trello, Jira, Notion, SharePoint), any of which an AI Agent can call; plus MCP registry servers (packages/cli/src/modules/mcp-registry, default module)", "hermes-agent": "source read at v2026.9.24, not driven: tools/connectors/__init__.py:1-6 and tools/connectors/gateway/client.py:1-3 managed connector accounts through the Nous tool gateway; optional-mcps/ 65 Nous-approved MCP servers (asana, atlassian, notion, stripe, supabase, ...); plugin-catalog/ ~290 curated plugins Note: The managed connector set needs a Nous account; the MCP and plugin catalogs are self-configured.", "open-webui": "source read at v0.11.4, not driven: outside services connect through generic MCP and OpenAPI tool servers (src/lib/components/AddToolServerModal.svelte:43, utils/mcp/client.py) and community Tools from openwebui.com (workspace/Tools.svelte:639); searched 'connector' in backend/open_webui: no shipped catalogue of ready-made connectors Note: ready-made connectors are community Tools, not core" }, @@ -7113,14 +7571,15 @@ "hermes-agent": "partial", "copilot-studio": "partial", "dify": "partial", - "n8n": "unknown", + "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "docs-only: competitor_features#31881 \"Context Chat (RAG over Nextcloud data): RAG over Files, Collectives and Analytics\"", "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", "dify": "source read at 1.17.1, not driven: knowledge bases from uploaded files (api/controllers/console/datasets/datasets_document.py:384) and datasource plugins; official datasources are S3, Azure, Box, Dropbox, Google Drive, OneDrive, SharePoint, Confluence, Notion, GitHub, GitLab and others, no Nextcloud (langgenius/dify-official-plugins datasources/); only the official nextcloud tool plugin can download_file at run time (tools/nextcloud/tools/download_file.yaml) Note: old yes rested on generic RAG; Nextcloud Files is not a knowledge source, only a plugin tool fetch", "open-webui": "source read at v0.11.4, not driven: RAG over uploaded files and knowledge bases: backend/open_webui/routers/retrieval.py (hybrid BM25 + vector, reranking), tools/builtin.py:3151 query_knowledge_files, :2509 query_chat_files; sources are uploads, Google Drive and OneDrive pickers (chat/MessageInput/InputMenu.svelte:399, :692); searched 'nextcloud|webdav' in backend/open_webui: no Nextcloud Files source Note: old yes; grounding works but not on Nextcloud Files", - "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file and search_files let the agent read and grep documents on the host on demand; gateway/platforms/base.py:1183-1231 attached documents are read into the turn; searched 'nextcloud' repo-wide: none, and no document index in core (RAG only via plugins/memory/retaindb, openviking) Note: Grounding in local files by reading them, not in Nextcloud Files and not through an index." + "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file and search_files let the agent read and grep documents on the host on demand; gateway/platforms/base.py:1183-1231 attached documents are read into the turn; searched 'nextcloud' repo-wide: none, and no document index in core (RAG only via plugins/memory/retaindb, openviking) Note: Grounding in local files by reading them, not in Nextcloud Files and not through an index.", + "n8n": "source read at n8n@2.40.7, not driven: the Nextcloud node downloads files (packages/nodes-base/nodes/NextCloud/NextCloud.node.ts:124-125 download) that a Default Data Loader and a vector store insert node index (packages/@n8n/nodes-langchain/nodes/document_loaders/DocumentDefaultDataLoader, nodes/vector_store/), then a vector store tool grounds the agent (nodes/tools/ToolVectorStore); searched 'nextcloud' in packages/cli/src/modules/agents and chat-hub: knowledge upload takes local files only Note: Works as a hand-built ingestion workflow; no Nextcloud source in the agent's knowledge settings." }, "pendingReason": "Real semantic/vector grounding is unbuilt (vector-rag change open); today's grounding is keyword search over the agent's declared views/files." }, @@ -7145,12 +7604,13 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "no", "open-webui": "yes", "evidence": { "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/knowledge_fs.py:307 _get_accessible_kb_ids checks owner or AccessGrants per asking user even for a model's attached knowledge (:343 _has_access); routers/knowledge.py:172 lists only readable bases Note: in legacy function-calling mode model knowledge is injected without that check (utils/middleware.py:2607)", "hermes-agent": "source read at v2026.9.24, not driven: searched 'acl|permission.{0,20}(user|requester)|allowed to see' in tools/file_tools*.py, tools/session_search_tool.py and agent/: file access follows the host account and tools/file_tools_write_guards.py protects Hermes' own files, not per-requester visibility; tools/session_search_tool.py:1-9 searches the whole profile's sessions Note: All users of one profile share what the agent can read; nothing filters by the asking person.", - "dify": "source read at 1.17.1, not driven: api/models/dataset.py:163,184-187 dataset permission (only_me, all_team, partial_members) governs which builders may attach a knowledge base, not what the end user may see; retrieval does not check the asking person. A builder can hand-build a manual metadata filter bound to a variable (api/core/workflow/nodes/knowledge_retrieval/entities.py:46-48, knowledge_retrieval_node.py:312-327 convert_template) Note: no document ACL trimming; only a hand-built metadata filter per flow" + "dify": "source read at 1.17.1, not driven: api/models/dataset.py:163,184-187 dataset permission (only_me, all_team, partial_members) governs which builders may attach a knowledge base, not what the end user may see; retrieval does not check the asking person. A builder can hand-build a manual metadata filter bound to a variable (api/core/workflow/nodes/knowledge_retrieval/entities.py:46-48, knowledge_retrieval_node.py:312-327 convert_template) Note: no document ACL trimming; only a hand-built metadata filter per flow", + "n8n": "source read at n8n@2.40.7, not driven: searched 'permission|acl|access' in packages/cli/src/modules/agents/agent-knowledge-retrieval.ts, tools/knowledge/ and packages/@n8n/nodes-langchain/nodes/vector_store/shared: retrieval returns whatever the agent's store holds, with only static metadata filters (packages/@n8n/agents/src/sdk/vector-store-filter.ts:5-19); nothing trims results to what the asking person may see" }, "pendingReason": "Needs checking OpenRegister's ObjectService/ACL enforcement for the session identity the chat request actually runs under; out of scope for a hermiq-only read." }, @@ -7174,12 +7634,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_builder.py:1656-1661 loads .hermes.md, AGENTS.md chain, CLAUDE.md and .cursorrules as instructions; hermes_cli/commands.py:234 /init generates AGENTS.md from a repo scan; SOUL.md per profile (web/src/pages/ProfilesPage.tsx:556); skills as SKILL.md documents Note: Old partial; document instructions are core.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:106 agent Files 'for reference material too long to paste into the Prompt: specs, templates, guidelines', :274 persistent in every run; workspace Skills are versioned Markdown SKILL.md packages with files (api/models/skill.py:56-66; web/i18n/en-US/skill.json referenceFiles.livePlaceholder) attached per agent (api/controllers/console/workspace/skills.py:811)", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/terminals.py:189 get_terminal_agents_md loads AGENTS.md from the attached Open Terminal and :239 add_terminal_agents_md injects it; notes can be attached as documents (chat/MessageInput/InputMenu.svelte:322 Attach Notes); folder system prompt and files (utils/middleware.py:2591)" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/terminals.py:189 get_terminal_agents_md loads AGENTS.md from the attached Open Terminal and :239 add_terminal_agents_md injects it; notes can be attached as documents (chat/MessageInput/InputMenu.svelte:322 Attach Notes); folder system prompt and files (utils/middleware.py:2591)", + "n8n": "source read at n8n@2.40.7, not driven: Agents-module skills carry markdown reference files next to their instructions (en.json:8077-8084 'References', 'Markdown reference'; packages/frontend/editor-ui/src/features/agents/components/AgentSkillFileNav.vue) and agents search uploaded Markdown or PDF knowledge files (en.json:7925) Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." }, "pendingReason": "hermiq-context-documents change (assembler + editor) is open, not implemented -- the schema field exists but nothing reads or writes it yet." }, @@ -7203,13 +7664,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "pendingReason": "The spec's own e2e-exclude note says no committed Playwright fixture provisions a second organisation, and a live shared hub needs an OpenConnector connector not configured by default -- cross-org sharing works as a manual paste/GitHub install, not a live in-instance marketplace browse.", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_sync_client_org.py:1-7 org-shared skills under ~/.hermes/skills/_org// with pull and propose; tools/skills_sync_client.py:6-8 the sync is INERT unless the user is a Nous portal admin (pre-launch gate); hermes_cli/subcommands/profile.py:20-23 --clone copies skills to another profile Note: Org skill sharing exists in code but is switched off for ordinary users; profiles on one install share by cloning.", "dify": "source read at 1.17.1, not driven: api/models/skill.py:62,66 skills are unique per tenant_id (workspace); api/controllers/console/workspace/skills.py:494 export and :385 import (web/i18n/en-US/skill.json:224 '.zip with SKILL.md, agentskills.io format') copy a skill into another workspace; searched 'share' in skill.json and skills.py: no live cross-workspace sharing Note: copy by export/import only, updates do not follow", - "open-webui": "source read at v0.11.4, not driven: skills are shared by access grants to users, groups or everyone on one instance (backend/open_webui/routers/skills.py:357 access update); searched 'tenant|organization' in backend/open_webui/models: no organisations to share across" + "open-webui": "source read at v0.11.4, not driven: skills are shared by access grants to users, groups or everyone on one instance (backend/open_webui/routers/skills.py:357 access update); searched 'tenant|organization' in backend/open_webui/models: no organisations to share across", + "n8n": "source read at n8n@2.40.7, not driven: skills are stored inside one agent (packages/cli/src/modules/agents/entities/agent.entity.ts:35-36 skills column); searched 'share' in packages/cli/src/modules/agents/agents-skills.controller.ts and agent-skills.service.ts: no sharing of a skill with other projects or organisations; the shared Skills area is 'Coming soon' (en.json:3231-3232)" } }, { @@ -7238,7 +7700,7 @@ "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions, /v1/responses, /v1/models plus /v1/runs, /api/sessions and /api/jobs with API_SERVER_KEY; gateway/platforms/api_server_runs.py run lifecycle; per-profile paths /p//", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:324 POST /v1/chat-messages and :175 completion-messages with per-app API keys (api/controllers/console/apikey.py:236); web/i18n/en-US/agent-v-2.json agentDetail.access.serviceApi 'Backend Service API' with API Reference per agent; client SDKs in sdks/nodejs-client, sdks/php-client", - "n8n": "docs-only: competitor_features#3909 \"core: Add missing fields to public API workflow schema: From n8n@2.14.0 (2026-03-24)\"", + "n8n": "source read at n8n@2.40.7, not driven: a workflow agent is called from any program through its Webhook or Chat Trigger URL (packages/nodes-base/nodes/Webhook, packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger), or through the documented instance MCP endpoint's execute_workflow tool (packages/cli/src/modules/mcp/mcp.controller.ts:117, mcp-scopes.ts:44); the public REST API (packages/cli/src/public-api/v1/handlers/workflows/spec/paths/) manages workflows and reads executions", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1109 POST /api/v1/chat/completions and :898 /api/v1/models (OpenAI-compatible), :2003 /api/v1/messages (Anthropic-compatible) with user API keys (routers/auths.py:1529); OpenAPI docs at main.py:508 /docs (served when ENV is dev)" }, "pendingReason": "whether third-party integrators are actually told about this API anywhere outside the code cannot be settled by reading the repo alone" @@ -7264,13 +7726,14 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "pendingReason": "Live publish success depends on OpenCatalogi being installed and reachable; could not verify a live 200 without running the app.", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'algoritme|algorithm register' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none", "dify": "source read at 1.17.1, not driven: searched 'algoritme|algorithm.?regist|register|ai act' in api/, web/app and web/i18n/en-US: no hits for an algorithm register or any export to one; apps and agents carry no register fields (api/models/agent.py, api/models/model.py)", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'algoritmeregister|algorithm register|register' in backend/open_webui/routers and src/lib/components/admin: no publication to the Dutch Algoritmeregister" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'algoritmeregister|algorithm register|register' in backend/open_webui/routers and src/lib/components/admin: no publication to the Dutch Algoritmeregister", + "n8n": "source read at n8n@2.40.7, not driven: searched 'algoritme|algorithm register|algoritmeregister' in packages/cli/src, packages/nodes-base/nodes and packages/frontend/editor-ui/src: no connection to the Dutch Algoritmeregister" } }, { @@ -7294,13 +7757,14 @@ "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", - "n8n": "unknown", + "n8n": "no", "open-webui": "no", "pendingReason": "Could not confirm without running the app whether the generic OpenRegister index-page edit form actually renders and saves the impactAssessments array-of-object field, or whether it is write-only through occ/API.", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no link or document field for an assessment", "dify": "source read at 1.17.1, not driven: searched 'dpia|impact assessment|fundamental rights|privacy assessment' in api/, web/app and web/i18n/en-US: no hits; agents have name, description, role and icon only (api/controllers/console/agent/roster.py:706), no field or link for an assessment", - "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpia|impact assessment|fundamental rights' in backend/open_webui and src/lib/components: models have no field or link for an assessment (backend/open_webui/models/models.py:74 ModelMeta)" + "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpia|impact assessment|fundamental rights' in backend/open_webui and src/lib/components: models have no field or link for an assessment (backend/open_webui/models/models.py:74 ModelMeta)", + "n8n": "source read at n8n@2.40.7, not driven: searched 'DPIA|IAMA|fundamental rights|impact assessment' in packages/cli/src, packages/@n8n/api-types/src/agents and packages/frontend/editor-ui/src: no link from an agent or workflow to an assessment record" } }, { @@ -7324,12 +7788,13 @@ "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", - "n8n": "unknown", + "n8n": "yes", "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 batch (parallel) mode spawns several child agents at once; hermes_cli/config_defaults.py:1332-1338 delegation block; hermes_cli/kanban_swarm.py:1-8 parallel specialist workers with a verifier; optional-skills/autonomous-ai-agents/dynamic-workflow fan-outs", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:152,217 'Add Parallel Node' parallel branches on the canvas; :684-702 Iteration node Parallel Mode with maximum parallelism over list items; api/configs/feature/__init__.py:949 MAX_SUBMIT_COUNT thread pool for parallel node execution; Agent nodes (blocks.agent-v2, api/core/workflow/nodes/agent_v2) can sit on each branch or inside the iteration Note: fan-out is designed in the flow; an agent cannot spawn parallel sub-agents itself at run time (see fl-subagent)", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task 'Delegate focused work to a parallel sub-agent', foreground bounded by a semaphore (utils/subagents.py:370 max_concurrent, default 20) and background runs (:364 max_async); admin limits in src/lib/components/admin/Settings/Subagents.svelte" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task 'Delegate focused work to a parallel sub-agent', foreground bounded by a semaphore (utils/subagents.py:370 max_concurrent, default 20) and background runs (:364 max_async); admin limits in src/lib/components/admin/Settings/Subagents.svelte", + "n8n": "source read at n8n@2.40.7, not driven: Agents-module sub-agents run in parallel up to a set number (en.json:8010-8011 'Max parallel sub-agents', packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:151-159 maxChildren) with tool calls in parallel (:517 toolCallConcurrency, en.json:7906); background sub-agents that outlive the turn need N8N_AGENTS_BACKGROUND_TASKS_ENABLED (packages/@n8n/config/src/configs/agents.config.ts:79-80, default false) Note: Agents module is opt-in; in workflows an AI Agent can call several AI Agent Tool nodes, and branches run in sequence." }, "pendingReason": "whether delegated sub-agent calls actually run concurrently needs a live run to confirm timing" }, @@ -7360,7 +7825,7 @@ "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "dify": "source read at 1.17.1, not driven: api/models/account.py:21-26 workspace roles owner, admin, editor, normal, dataset_operator; web/i18n/en-US/common.json:224 admin 'Can build apps & manage team settings', :234 editor 'Can build & edit apps', :267 normal 'Only can use apps'; api/controllers/console/workspace/members.py:368 change a member's role Note: enterprise-licensed RBAC (api/configs/enterprise/__init__.py:38 RBAC_ENABLED) adds custom roles and per-agent permission sets (web/i18n/en-US/permission-keys.json); the basic roles are in community", - "n8n": "docs-only: competitor_features#31101 \"RBAC & SSO (Enterprise): Role-based access, SSO/LDAP gated behind Enterprise.\"", + "n8n": "source read at n8n@2.40.7, not driven: instance roles owner, admin, member and project roles admin, editor, viewer (packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts); the admin role needs feat:advancedPermissions (packages/cli/src/services/user.service.ts:544), project roles feat:projectRole:* and custom roles feat:customRoles (packages/@n8n/constants/src/index.ts:34-37,51) Note: Role model exists; admin, builder-style project roles and custom roles are enterprise-licensed. Matches old partial.", "open-webui": "source read at v0.11.4, not driven: roles admin, user, pending (backend/open_webui/utils/auth.py get_admin_user / get_verified_user); per-group permissions for workspace models, knowledge, tools, skills (builder rights) and chat features (src/lib/components/admin/Users/Groups/Permissions.svelte:44-71, config.py DEFAULT_USER_PERMISSIONS)", "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_access.py:1-27 per platform allow_admin_from (all commands) vs user_allowed_commands for other allowed users; gateway/authz_mixin.py:32-37 allowlists decide who may chat; plugins/dashboard_auth/basic/__init__.py:1-8 the dashboard has one username and every signed-in user has full control (hermes_cli/dashboard_auth/base.py:12-16 no role field) Note: Two chat roles (admin, user) for slash commands; no builder role and no roles in the dashboard." }, @@ -7387,13 +7852,14 @@ "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", - "n8n": "unknown", + "n8n": "no", "open-webui": "yes", "pendingReason": "Did not verify nl.json has full key parity with en.json (that is the subject of the nl-locale-completeness spec itself).", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: web/src/i18n/ ships af, ar, de, en, es, fr, ga, hu, it, ja, ko, pt, ru, tr, uk, zh, zh-hant; locales/*.yaml the same set for CLI and gateway strings; apps/desktop/src/i18n adds no nl either; searched for nl locale files repo-wide: none Note: The model answers in Dutch when addressed in Dutch, but dashboard, CLI and desktop text have no Dutch translation.", "dify": "source read at 1.17.1, not driven: web/i18n-config/languages.ts:158-162 nl-NL 'Nederlands' marked supported; web/i18n/nl-NL has all 37 namespaces, but about 3,800 of 5,947 values are identical to en-US (e.g. workflow.json 921 of 1161, dataset-documents.json 258 of 260 untranslated), while agent-v-2, permission and skill are translated Note: Dutch is selectable, roughly two thirds of the UI still shows English", - "open-webui": "source read at v0.11.4, not driven: src/lib/i18n/locales/nl-NL/translation.json: 3432 of 3518 keys translated; language picker in src/lib/components/chat/Settings/General.svelte (settings.personal.general.language); 60+ locales in src/lib/i18n/locales" + "open-webui": "source read at v0.11.4, not driven: src/lib/i18n/locales/nl-NL/translation.json: 3432 of 3518 keys translated; language picker in src/lib/components/chat/Settings/General.svelte (settings.personal.general.language); 60+ locales in src/lib/i18n/locales", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/@n8n/i18n/src/locales/ holds only en.json; packages/@n8n/config/src/index.ts:253-254 N8N_DEFAULT_LOCALE defaults to 'en' with no Dutch locale shipped Note: Agents answer in Dutch if prompted in Dutch; the product UI is English only." } } ] From bf7d54041b891f2f5936b424ffc6ed990a80e4b2 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 16:46:51 +0200 Subject: [PATCH 08/12] chore(parity): fold the nextcloud assistant and context agent source reading, its sources object and ten rows mined from its issues and 4.0.0 --- openspec/parity/capabilities.json | 1431 +++++++++++++++++++---------- 1 file changed, 949 insertions(+), 482 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 852af9e45..f19bcde89 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -20,11 +20,71 @@ "key": "nextcloud-assistant", "name": "Nextcloud Assistant with Context Agent", "vendor": "Nextcloud GmbH", - "readOn": "2026-07-12", + "readOn": "2026-09-26", "columnAddedOn": "2026-09-26", "evidenceGrade": "docs-only", - "readHow": "26 feature rows for Nextcloud Assistant (competitor id 1428) and 4 for Nextcloud Context Agent (id 1429) in the intelligence database, all captured 2026-07-12 from product pages, docs and the Nextcloud blog; no research file exists; nobody has driven it for hermiq", - "unknownReason": "not covered by the 30 one-line Nextcloud Assistant and Context Agent feature rows captured 2026-07-12, the only research there is; nobody has driven it for this row" + "readHow": "source read at assistant v4.0.0 (366d5ee, github.com/nextcloud/assistant) and context_agent v2.8.0 (99936dd, github.com/nextcloud/context_agent), not driven: routes, controllers, services, Vue pages and l10n of the Assistant, and the Context Agent ExApp's LangGraph agent and tools; nextcloud/server's TaskProcessing providers and integration_openai were not read, so three cells stay unknown. The July column predates 4.0.0, which added Assignments (RFC 5545 scheduling), memories, agentskills.io skills, an MCP server at /mcp and streaming. There is one fixed agent, so per-agent rows are no or partial by construction. Scheduled write actions that pause for approval are partial. Licence: the Assistant ships AGPL-3.0-or-later; context_agent's LICENSE file and SPDX headers say AGPL-3.0 while its appinfo/info.xml says MIT, a contradiction in the product itself", + "unknownReason": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the code reading could not settle this row", + "sources": { + "docs": { + "assistantAdmin": "https://docs.nextcloud.com/server/latest/admin_manual/ai/app_assistant.html", + "contextAgentAdmin": "https://docs.nextcloud.com/server/latest/admin_manual/ai/app_context_agent.html", + "aiOverview": "https://docs.nextcloud.com/server/latest/admin_manual/ai/overview.html", + "userManual": "https://docs.nextcloud.com/server/latest/user_manual/en/" + }, + "sourceRepo": [ + "https://github.com/nextcloud/assistant", + "https://github.com/nextcloud/context_agent" + ], + "featurePage": "https://nextcloud.com/assistant/", + "featureRequests": [ + "https://github.com/nextcloud/assistant/labels/enhancement", + "https://github.com/nextcloud/context_agent/labels/enhancement" + ], + "issueTracker": { + "url": [ + "https://github.com/nextcloud/assistant/issues", + "https://github.com/nextcloud/context_agent/issues" + ], + "featureLabel": "enhancement" + }, + "roadmap": null, + "changelog": [ + "https://github.com/nextcloud/assistant/blob/main/CHANGELOG.md", + "https://github.com/nextcloud/context_agent/blob/main/CHANGELOG.md" + ], + "apiReference": [ + "https://github.com/nextcloud/assistant/blob/main/openapi.json", + "https://docs.nextcloud.com/server/latest/developer_manual/client_apis/OCS/ocs-taskprocessing-api.html", + "https://docs.nextcloud.com/server/latest/developer_manual/digging_deeper/task_processing.html" + ], + "marketplace": [ + "https://apps.nextcloud.com/apps/assistant", + "https://apps.nextcloud.com/apps/context_agent" + ], + "pricing": "https://nextcloud.com/pricing/", + "accessibilityStatement": "https://docs.nextcloud.com/server/latest/user_manual/en/universal_access.html", + "securityDocs": [ + "https://hackerone.com/nextcloud", + "https://github.com/nextcloud/security-advisories" + ], + "demoInstance": "https://try.nextcloud.com/", + "community": "https://help.nextcloud.com/", + "reviews": null, + "videos": "https://www.youtube.com/@Nextcloud", + "caseStudies": "https://nextcloud.com/customers/", + "partnerDirectory": "https://nextcloud.com/partners/", + "trainingCurriculum": null, + "jobPostings": "https://nextcloud.com/jobs/", + "tenders": null, + "nullReasons": { + "roadmap": "searched nextcloud.com and both repos (no GitHub projects, discussions disabled on both); search found no public roadmap, only that Enterprise customers can influence it.", + "reviews": "G2 and Capterra pages for Nextcloud return 403 to fetches; no Assistant-specific review page found.", + "trainingCurriculum": "searched nextcloud.com for training and certification: only webinars, events and partner-delivered training, no curriculum page.", + "tenders": "searched the intelligence database on 2026-09-26 (tenders name, description and keywords, and requirements text_nl/text_en, word-boundary match on 'nextcloud assistant', 'context agent'): no tender names it; 'nextcloud' alone matches Middelburg VTH (tender 1184, a Nextcloud storage integration requirement) and two Austrian tenders, none about the Assistant" + }, + "notes": "nextcloud.com pages (featurePage, pricing, caseStudies, partnerDirectory, jobPostings) were confirmed through web search results, not by direct fetch: this shell cannot reach nextcloud.com (connection fails) and WebFetch failed. docs.nextcloud.com, apps.nextcloud.com, try.nextcloud.com, help.nextcloud.com, hackerone and GitHub URLs returned 200 directly. Pricing: subscriptions from 100 users, priced by user count per instance (search result on nextcloud.com/pricing/)." + } }, { "key": "hermes-agent", @@ -400,7 +460,7 @@ "providerHow": "read-from-code", "feature": "agent-management-ui", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", @@ -411,7 +471,8 @@ "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:706 POST /agent creates an agent with name, description, role and icon; web/features/agent-v2/roster/components/create-agent-dialog.tsx:61 and agent-form-fields.tsx:73 the create form; web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/index.tsx:1088 the Prompt (instructions) editor", "open-webui": "source read at v0.11.4, not driven: an agent is a workspace Model: src/lib/components/workspace/Models/ModelEditor.svelte:789 name, :962 description, :1055 system prompt, :856 base model; backend/open_webui/routers/models.py:285 POST /models/create; backend/open_webui/models/models.py:111 model table (id, user_id, base_model_id, params, meta)", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:45,51,69 personal agent has name, description, systemPrompt; chat-hub.controller.ts:451 POST /chat/agents; packages/frontend/@n8n/i18n/src/locales/en.json:492 'Instructions' field in the Chat agent editor; the opt-in Agents module adds packages/cli/src/modules/agents/agents.controller.ts:29 POST with en.json:7867,7878 Name and Instructions Note: Chat hub is a default module, so creating a named agent with instructions works out of the box." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:45,51,69 personal agent has name, description, systemPrompt; chat-hub.controller.ts:451 POST /chat/agents; packages/frontend/@n8n/i18n/src/locales/en.json:492 'Instructions' field in the Chat agent editor; the opt-in Agents module adds packages/cli/src/modules/agents/agents.controller.ts:29 POST with en.json:7867,7878 Name and Instructions Note: Chat hub is a default module, so creating a named agent with instructions works out of the box.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'agent' in assistant:lib/Db, lib/Migration and context_agent:ex_app: tables hold chat sessions, messages, assignments and task notifications only (assistant:lib/Migration/Version030500Date20260430083738.php:33). One fixed Context Agent with a hard-coded system prompt (context_agent:ex_app/lib/agent.py:134-142); no way to create a named agent. Note: The closest things are scheduled tasks (title + prompt) and skills, rated on their own rows." } }, { @@ -431,7 +492,7 @@ "providerHow": "read-from-code", "feature": "agent-management-ui", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -441,7 +502,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:630 GET /agent lists every workspace agent with draft/published counts; web/features/agent-v2/roster/components/agent-roster-list.tsx:238 shows a Draft badge and :408 updated time, but no owner; only a 'Created by me' filter (roster-toolbar.tsx:90). The classic Studio list shows author (web/app/components/apps/app-card/index.tsx:175) but no status Note: list plus status, or list plus author, never both on one screen", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:1184-1217 profile list shows gateway running/stopped, model and skill count; hermes_cli/subcommands/profile.py:14 `hermes profile list`; hermes_cli/profiles.py:538 ProfileInfo has no owner field (name, model, provider, gateway_running, description, role only) Note: No owner column and no organisation: one operator's install lists its own profiles.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:808 owner name per row, :899 Enabled/Disabled switch; backend/open_webui/routers/models.py:162 GET /models/list (admins see all with BYPASS_ADMIN_ACCESS_CONTROL, :198), :245 GET /models/all admin; admin Settings > Models lists every model (src/lib/components/admin/Settings/Models.svelte)", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agents-list.controller.ts:17 GET /agents/v2 across projects; agents.service.ts:358-364 scoped to projects the user is a member of, so an admin does not see every agent; packages/frontend/editor-ui/src/features/agents/components/AgentCard.vue:203-220 card shows name, updated, created and a Published badge, no owner Note: No organisation-wide list and no owner column. Agents module is shipped but off by default: packages/@n8n/backend-common/src/modules/module-registry.ts:44 defaultModules omits 'agents' (enable with N8N_ENABLED_MODULES=agents)." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agents-list.controller.ts:17 GET /agents/v2 across projects; agents.service.ts:358-364 scoped to projects the user is a member of, so an admin does not see every agent; packages/frontend/editor-ui/src/features/agents/components/AgentCard.vue:203-220 card shows name, updated, created and a Published badge, no owner Note: No organisation-wide list and no owner column. Agents module is shipped but off by default: packages/@n8n/backend-common/src/modules/module-registry.ts:44 defaultModules omits 'agents' (enable with N8N_ENABLED_MODULES=agents).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'agent' entities and list views in assistant:src and lib/Controller: no agent list; one built-in agent. Session list only (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:25-45)." } }, { @@ -460,7 +522,7 @@ "providerHow": "read-from-code", "feature": "agent-management-ui", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -470,7 +532,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:540-673 per-profile SOUL, description, model editing; schedules and runs sit on other pages scoped by the managing-profile selector (web/src/i18n/en.ts:103 managingProfileBanner; web/src/pages/CronPage.tsx, SessionsPage.tsx); hermes_cli/subcommands/profile.py:76 `profile show` Note: Configuration and skills per profile exist, but schedules, runs and skills are not on one agent page.", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/navigation.tsx:62-86 detail page with Configure (model, prompt, tools, skills, knowledge, files), Access Point, Logs, Monitoring; api/controllers/console/agent/roster.py:1133 logs. No schedules: agents have no scheduler of their own, schedules only exist as trigger nodes on workflow apps Note: schedules are missing from the agent page", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194-1275 config, knowledge, tools, skills, filters, capabilities on one page; schedules live apart in /automations (src/routes/(app)/automations/[id]/+page.svelte) keyed by model_id (backend/open_webui/models/automations.py:73) and per-model chats in admin analytics (routers/analytics.py:285, :343) Note: no single page joins an agent's config with its schedules and runs", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/module.descriptor.ts:60-91 agent page with builder, preview, sessions and session-detail children; en.json:8172-8178 tabs Build, Knowledge, Sessions, Settings, Memory, Evals; en.json:8112 Schedules and 8044 Skills sections in the builder Note: Configuration, schedules and skills sit on the Build tab, runs on the Sessions tab of the same agent page. Agents module is shipped but off by default: packages/@n8n/backend-common/src/modules/module-registry.ts:44 defaultModules omits 'agents' (enable with N8N_ENABLED_MODULES=agents)." + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/module.descriptor.ts:60-91 agent page with builder, preview, sessions and session-detail children; en.json:8172-8178 tabs Build, Knowledge, Sessions, Settings, Memory, Evals; en.json:8112 Schedules and 8044 Skills sections in the builder Note: Configuration, schedules and skills sit on the Build tab, runs on the Sessions tab of the same agent page. Agents module is shipped but off by default: packages/@n8n/backend-common/src/modules/module-registry.ts:44 defaultModules omits 'agents' (enable with N8N_ENABLED_MODULES=agents).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent entity or page. Nearest: a scheduled task's session shows its prompt and recurrence (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:59-66); tool categories are an admin checkbox list (context_agent:ex_app/lib/main.py:88-94). No page combining configuration, schedules, runs and skills." } }, { @@ -489,7 +552,7 @@ "providerHow": "read-from-code", "feature": "tenant-model-policy", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -499,7 +562,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/profiles.py:942 PUT /api/profiles/{name}/model called from web/src/pages/ProfilesPage.tsx:673 setProfileModel(provider, model); hermes_cli/commands.py:157 `/model` switch (session-scoped, --global persists)", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 Model field with ModelParameterModal picking provider and model per agent; classic agent apps pick the model in app config (api/controllers/console/app/model_config.py)", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:46 AI Agent node requires a chat model sub-node (26 provider nodes under nodes/llms/); packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:107 model per chat agent; packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:446 provider/model string per agent; en.json:7870 Model field Note: Old partial rested on a credential-test release line; the code picks a model per agent everywhere.", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:856 'Base Model (From ...)' selector; backend/open_webui/models/models.py:118 base_model_id = upstream model; providers are the Ollama/OpenAI-compatible/Anthropic connections (routers/ollama.py, routers/openai.py, utils/anthropic.py)" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:856 'Base Model (From ...)' selector; backend/open_webui/models/models.py:118 base_model_id = upstream model; providers are the Ollama/OpenAI-compatible/Anthropic connections (routers/ollama.py, routers/openai.py, utils/anthropic.py)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent's model is whatever provider serves the task type core:text2text:chatwithtools (context_agent:ex_app/lib/nc_model.py:27,170-179), chosen instance-wide in the server's AI admin settings (nextcloud/server, not read); provider apps linked from assistant:src/components/AdminSettings.vue:55-120. No per-agent choice." } }, { @@ -519,7 +583,7 @@ "providerHow": "read-from-code", "feature": "agent-management-ui", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -529,7 +593,8 @@ "dify": "source read at 1.17.1, not driven: web/features/agent-v2/permissions.ts:37 the per-agent Resource Access page is shown only when systemFeatures.rbac_enabled; api/configs/enterprise/__init__.py:38 RBAC_ENABLED default False (enterprise); community has workspace-wide roles only, every member sees every agent, and a published web app URL is open to anyone who has it Note: enterprise-licensed for per-agent me/group/org scoping", "n8n": "source read at n8n@2.40.7, not driven: agents and workflows belong to a project: packages/cli/src/modules/agents/entities/agent.entity.ts:13-18 projectId; project roles in packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts:10-17 agent scopes; team projects count against packages/@n8n/constants/src/index.ts:67 quota:maxTeamProjects; chat agents are owner-only, packages/cli/src/modules/chat-hub/chat-hub-agent.repository.ts:39 where ownerId Note: Only me (personal project) or a group (team project, enterprise-licensed quota); no 'whole organisation' option.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/common/AccessControl.svelte:19 principal_type user|group|anyone; ModelEditor.svelte:600 AccessControlModal; backend/open_webui/routers/models.py:1035 POST /model/access/update; models/access_grants.py grants read/write per user or group; config.py sharing.public_models permission gates 'whole organisation' Note: old partial rested on a feature-row line; the code has private, per-user, per-group and public grants", - "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:32-37 per-platform _ALLOWED_USERS / ALLOW_ALL_USERS allowlists read per profile home (authz_mixin.py:339 _authorization_home_for_source); gateway/slash_access.py:1-27 admin vs user command lists Note: Who may talk to a profile's bot is a per-platform user-id allowlist; no only-me / group / organisation visibility model and no org directory." + "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:32-37 per-platform _ALLOWED_USERS / ALLOW_ALL_USERS allowlists read per profile home (authz_mixin.py:339 _authorization_home_for_source); gateway/slash_access.py:1-27 admin vs user command lists Note: Who may talk to a profile's bot is a per-platform user-id allowlist; no only-me / group / organisation visibility model and no org directory.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'visibility|group|share' in assistant:lib and context_agent:ex_app: the single agent is available to every user with the app enabled; no per-agent visibility setting." } }, { @@ -549,7 +614,7 @@ "providerHow": "read-from-code", "feature": "cost-guardrails", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "partial", "dify": "partial", @@ -560,7 +625,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:69 check_automation_limits: automations.max_count per user and automations.min_interval, admins bypass; model params max_tokens only caps one response; searched 'quota|budget|token limit|rate' in routers/models.py, models/models.py, utils/middleware.py: no per-agent run or token cap Note: limits are per user and only on scheduled runs, not per agent", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-63 agent.max_turns (turn cap) and agent.run_budget_seconds (wall-clock per run), per profile config.yaml; hermes_cli/config_defaults.py:1338 delegation.max_iterations per subagent; gateway/platforms/api_server.py:1322 api_server.max_concurrent_runs; searched 'max_cost|spend_limit|token_budget|cost_cap' in *.py: no token or run-count quota per agent Note: Caps iterations and wall clock per run, not tokens or number of runs.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 PUT /agent sets max_active_requests, enforced in api/services/app_generate_service.py:153,384 (concurrent requests per app); dify-agent/src/dify_agent/runtime/runner.py:94,403 a fixed 500-step and run-timeout limit per run. No per-agent run count or token budget Note: only a concurrency cap and a server-wide step limit, no token or run quota", - "n8n": "source read at n8n@2.40.7, not driven: per-run caps only: packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:518 maxIterations 1-200 per run, packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ConversationalAgent/execute.ts:58 maxIterations default 10, packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:401 maxTokens per call; searched 'budget|quota' in packages/cli/src/modules/agents: no per-agent run or token budget Note: Caps one run, not an agent's total runs or tokens." + "n8n": "source read at n8n@2.40.7, not driven: per-run caps only: packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:518 maxIterations 1-200 per run, packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ConversationalAgent/execute.ts:58 maxIterations default 10, packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:401 maxTokens per call; searched 'budget|quota' in packages/cli/src/modules/agents: no per-agent run or token budget Note: Caps one run, not an agent's total runs or tokens.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'quota|limit|budget|token' in assistant:lib and context_agent:ex_app: only a history cap (MAX_MESSAGE_HISTORY=42, context_agent:ex_app/lib/nc_model.py:87-89); no run or token cap per agent." } }, { @@ -580,7 +646,7 @@ "providerHow": "read-from-code", "feature": "agent-management-ui", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -590,7 +656,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/pause.py:1-27 `hermes pause` / `hermes resume` write/remove the ESTOP sentinel; agent/estop.py:31-39 sentinel lives in the profile's $HERMES_HOME, so `hermes -p pause` holds that profile's cron, kanban and new gateway turns without deleting it; web/src/pages/ProfilesPage.tsx:1184 per-profile gateway running/stopped Note: CLI only; the dashboard shows gateway state but has no pause toggle (searched 'estop' in web/src and hermes_cli/web_routers: none).", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/access/components/web-app-access-card.tsx:254 and service-api-access-card.tsx:114 per-surface In service/Out of service toggles; api/controllers/console/agent/roster.py:1013 POST /agent//api-enable. No single off switch: workflows that bind the agent as a node keep running it (models/agent.py:407 WorkflowAgentNodeBinding) Note: off per access point, not per agent", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:122 is_active soft-disable; routers/models.py:881 POST /model/toggle; src/lib/components/workspace/Models.svelte:899 Enabled/Disabled switch per model, :353 Enable All / Disable All", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/workflows/workflows.controller.ts:475 POST /:workflowId/deactivate turns off an agent workflow's triggers without deleting it, en.json:4567 'Deactivate workflow'; packages/cli/src/modules/agents/agent-publish.controller.ts:45 unpublish, en.json:7775 unpublish stops production executions until republished" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/workflows/workflows.controller.ts:475 POST /:workflowId/deactivate turns off an agent workflow's triggers without deleting it, en.json:4567 'Deactivate workflow'; packages/cli/src/modules/agents/agent-publish.controller.ts:45 unpublish, en.json:7775 unpublish stops production executions until republished", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent can be switched off only instance-wide: disabling the context_agent ExApp unregisters its providers (context_agent:ex_app/lib/main.py:132-135) and tool categories can be unticked (context_agent:ex_app/lib/main.py:88-94, tools.py:33); users can hide the Assistant (assistant:lib/Listener/BeforeTemplateRenderedListener.php:61-62). One agent, no per-agent off switch." } }, { @@ -610,7 +677,7 @@ "providerHow": "read-from-code", "feature": "compliance-control-packs", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", @@ -620,7 +687,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profiles.py:538-575 ProfileInfo fields (name, model, provider, description, display_name, role) carry no owner; searched 'owner' in hermes_cli/profiles.py and profile_identity.py: only file-permission and routing-index ownership Note: Single-operator install; no human owner per profile.", "dify": "source read at 1.17.1, not driven: api/services/app_service.py:672 created_by is set to the creating account and api/services/app_service.py:282 filters on it ('Created by me'); no owner field that can be assigned, models/agent.py:212 only created_by/updated_by/archived_by Note: creator is recorded, not an accountable owner that can be named", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:117 user_id owner; src/lib/components/workspace/Models.svelte:802-808 owner name and email shown per model, 'Deleted User' when the owner is gone; routers/models.py:948 only owner, write grantee or admin may update Note: owner is always the creator; there is no field to name a different accountable person", - "n8n": "source read at n8n@2.40.7, not driven: ownership sits with a project, not a person: packages/cli/src/services/user.service.ts:616 shared workflow role 'workflow:owner' held by a project; packages/cli/src/modules/agents/entities/agent.entity.ts:13-18 agent belongs to projectId; only chat agents carry a person, packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:74 ownerId Note: A personal project maps to one person; a team project has no named accountable human per agent." + "n8n": "source read at n8n@2.40.7, not driven: ownership sits with a project, not a person: packages/cli/src/services/user.service.ts:616 shared workflow role 'workflow:owner' held by a project; packages/cli/src/modules/agents/entities/agent.entity.ts:13-18 agent belongs to projectId; only chat agents carry a person, packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:74 ownerId Note: A personal project maps to one person; a team project has no named accountable human per agent.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent entity, so no owner field; assignments carry the user who created them (assistant:lib/Db/Assignment.php:40), searched 'owner' in both repos: none." } }, { @@ -639,7 +707,7 @@ "providerHow": "read-from-code", "feature": "agent-lifecycle-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -649,7 +717,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'owner|transfer|hand over|reassign' in hermes_cli/profiles.py and profile_cmd.py: none; hermes_cli/subcommands/profile.py:86 `profile rename` and :115 export/import move a profile, not an owner Note: No owner concept to hand over.", "dify": "source read at 1.17.1, not driven: searched 'transfer|owner|created_by =' in api/controllers/console and api/services/app_service.py: only workspace ownership transfer exists (api/controllers/console/workspace/members.py:418 send-owner-transfer-confirm-email); no endpoint or UI reassigns an agent or app to another member", "open-webui": "source read at v0.11.4, not driven: searched 'transfer|reassign|owner' in backend/open_webui/routers and models: no ownership transfer; models/users.py:847 delete_user_by_id leaves models orphaned (Models.svelte:808 'Deleted User'); workaround: routers/models.py:1035 write grant to another user or group so they can keep maintaining it", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/services/user.service.ts:593-610 deleting a user can transfer their personal project's resources to another user or project (en.json:3856 'Transfer their workflows, credentials and data tables'); workflow move at packages/cli/src/workflows/workflows.controller.ts:646 PUT /:workflowId/transfer; but packages/cli/src/services/ownership-transfer/ownership-transfer.manifest.json:59-60 says agents are dropped via FK cascade on transfer Note: Workflow-based agents move to a new owner; Agents-module agents are lost when their owner is deleted (the code's own manifest says so)." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/services/user.service.ts:593-610 deleting a user can transfer their personal project's resources to another user or project (en.json:3856 'Transfer their workflows, credentials and data tables'); workflow move at packages/cli/src/workflows/workflows.controller.ts:646 PUT /:workflowId/transfer; but packages/cli/src/services/ownership-transfer/ownership-transfer.manifest.json:59-60 says agents are dropped via FK cascade on transfer Note: Workflow-based agents move to a new owner; Agents-module agents are lost when their owner is deleted (the code's own manifest says so).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: on user deletion the user's assignments and chats are deleted, not handed over (assistant:lib/Listener/UserDeletedListener.php:42-48); searched 'transfer|owner' in both repos: nothing." } }, { @@ -668,7 +737,7 @@ "providerHow": "read-from-code", "feature": "agent-management-ui", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "yes", "dify": "yes", @@ -679,7 +748,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:846 build-draft/checkout and :941 build-draft/apply; web/i18n/en-US/agent-v-2.json 'Build your agent by chatting ... it fills in the form on the left'; web/features/agent-v2/agent-detail/configure/page.tsx:49 Build mode is on in Community Edition (only Preview is cloud/enterprise)", "hermes-agent": "source read at v2026.9.24, not driven: skills/autonomous-ai-agents/hermes-agent/SKILL.md:26 bundled skill teaches the agent Hermes' own profiles so it can run `hermes profile create` through its terminal tool; hermes_cli/profile_describer.py:1-25 auto-generates a description from an existing profile (the reverse); searched 'create.*bot.*from.*descri' and profile-creating tool names in *.py: no dedicated plain-language agent builder Note: The agent can build a profile only by driving the CLI itself; the dashboard builder is a form wizard.", "open-webui": "source read at v0.11.4, not driven: searched 'generate|describe|builder|magic' in src/lib/components/workspace/Models/ModelEditor.svelte and backend/open_webui/routers/models.py: model presets are built by hand; the only natural-language builder is /skills:create for skills (backend/open_webui/utils/skills.py:81), not agents", - "n8n": "source read at n8n@2.40.7, not driven: Instance AI ('n8n Agent') is a default module (packages/@n8n/backend-common/src/modules/module-registry.ts:79) enabled by default (packages/cli/src/modules/instance-ai/instance-ai-settings.service.ts:287-288) and builds workflows from chat (packages/@n8n/instance-ai/src/workflow-builder/); packages/frontend/editor-ui/src/features/agents/views/NewAgentView.vue:58-83 a new agent opens in an Instance AI thread that builds it Note: Needs a model set up in Instance AI first (useInstanceAiReady)." + "n8n": "source read at n8n@2.40.7, not driven: Instance AI ('n8n Agent') is a default module (packages/@n8n/backend-common/src/modules/module-registry.ts:79) enabled by default (packages/cli/src/modules/instance-ai/instance-ai-settings.service.ts:287-288) and builds workflows from chat (packages/@n8n/instance-ai/src/workflow-builder/); packages/frontend/editor-ui/src/features/agents/views/NewAgentView.vue:58-83 a new agent opens in an Instance AI thread that builds it Note: Needs a model set up in Instance AI first (useInstanceAiReady).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent builder; plain language builds a scheduled task (create_scheduled_task, context_agent:ex_app/lib/all_tools/assignments.py:14-39; ChattyLLMInputForm.vue:119-127 'Ask chat to create one') or a skill (store_skill, context_agent:ex_app/lib/all_tools/skills.py:115-180). The agent itself is not built from the description." } }, { @@ -699,7 +769,7 @@ "providerHow": "read-from-code", "feature": "hermiq-agent-application-slug", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -709,7 +779,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 under gateway.multiplex_profiles each profile is served at /p//v1/...; api_server.py:1336-1345 /v1/models advertises the profile name as the model id; gateway/profile_routing.py:1-11 routes senders/chats to profiles Note: A caller addresses an agent by profile name in the URL; no registry that ties an agent to a consuming application.", "dify": "source read at 1.17.1, not driven: api/models/agent.py:407 WorkflowAgentNodeBinding ties a roster agent to a workflow app node; api/controllers/console/agent/composer.py:54 agent-composer on a workflow node, :125 copy-from-roster; roster.py:474 published references listed on the agent's Access page ('Workflow access')", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:836 stable Model ID that other programs pass as 'model' to the OpenAI-compatible /api/chat/completions (backend/open_webui/main.py:1118 model_id lookup); no binding of an agent to a consuming app and no per-app discovery Note: an app can call an agent by its id, but nothing ties the agent to that app", - "n8n": "source read at n8n@2.40.7, not driven: an agent is addressable by id, not bound to a consuming app: packages/cli/src/modules/agents/entities/agent.entity.ts:39-40 availableInMCP flag, packages/cli/src/modules/agents/agent-mcp-access.controller.ts:26 toggle; workflow agents are called by webhook path (packages/nodes-base/nodes/Webhook) or Execute Workflow; searched 'appId|consumer app|slug' in packages/cli/src/modules/agents: no app binding Note: An app can call an agent by id, URL or MCP; there is no registry tying an agent to the app it serves." + "n8n": "source read at n8n@2.40.7, not driven: an agent is addressable by id, not bound to a consuming app: packages/cli/src/modules/agents/entities/agent.entity.ts:39-40 availableInMCP flag, packages/cli/src/modules/agents/agent-mcp-access.controller.ts:26 toggle; workflow agents are called by webhook path (packages/nodes-base/nodes/Webhook) or Execute Workflow; searched 'appId|consumer app|slug' in packages/cli/src/modules/agents: no app binding Note: An app can call an agent by id, URL or MCP; there is no registry tying an agent to the app it serves.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'appId|slug' in context_agent:ex_app and assistant:lib/Service: apps call the one agent through the task type core:contextagent:interaction (context_agent:ex_app/lib/provider.py:20-26); no per-app agent binding." } }, { @@ -729,7 +800,7 @@ "providerHow": "read-from-code", "feature": "agent-capability-profile", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -739,7 +810,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SkillsPage.tsx:140 skills / toolsets / hub views scoped by profile (SkillsPage.tsx:169 getToolsets(selectedProfile)); hermes_cli/web_routers/tools.py:230 GET /api/tools/toolsets; web/src/pages/ProfileBuilderPage.tsx:753 review step lists model, skills and MCPs Note: Skills and toolsets per profile are on one page (tabbed); MCP servers sit on McpPage; data access is not modelled (tools reach the whole host). Old yes rested on a docs line; the data part of the sentence has no screen.", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/ has model-config, prompt-editor, tools, skills, knowledge and files sections on the one Configure page; web/i18n/en-US/agent-v-2.json agentDetail.configure.tools/skills/knowledgeRetrieval/files", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194 Knowledge, :1198 ToolsSelector, :1202 SkillsSelector, :1206 filters/actions, :1245 Capabilities, :1262 BuiltinTools, :1268 TerminalSelector, all on the model edit page", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentCapabilitiesSection.vue:534-695 one Capabilities section with rows for tools, workflows, skills and sub-agents (en.json:8340 'Capabilities: What this agent can do'); knowledge files and vector stores on the Knowledge tab (en.json:7923,7956) Note: Data sources sit on the neighbouring Knowledge tab. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentCapabilitiesSection.vue:534-695 one Capabilities section with rows for tools, workflows, skills and sub-agents (en.json:8340 'Capabilities: What this agent can do'); knowledge files and vector stores on the Knowledge tab (en.json:7923,7956) Note: Data sources sit on the neighbouring Knowledge tab. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin settings list tool categories as checkboxes (context_agent:ex_app/lib/main.py:88-94, categories from tools.py get_categories); skills listed via GET /api/v1/skills (assistant:lib/Controller/AgentSkillsApiController.php:57-59). Instance-wide, no single per-agent screen of skills, tools and data." } }, { @@ -760,7 +832,7 @@ "feature": "agent-management-ui", "featureConfidence": "medium", "defectCandidate": "A schedule bound to a deleted agent stays enabled; ScheduleService's dispatch/findDueSchedules path has no agent-existence check, so the schedule keeps firing and presumably errors on every tick instead of stopping.", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -770,7 +842,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:52 `hermes profile delete`; hermes_cli/profiles.py:1682 delete_profile removes the profile home (jobs live under it); web/src/pages/ProfilesPage.tsx:725 deleteProfile -> DELETE /api/profiles/{name} (hermes_cli/web_routers/profiles.py:869); web/src/i18n/en.ts profiles.confirmDeleteMessage 'deletes profile ... config, keys, memories, sessions, skills, cron jobs'", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:780 DELETE /agent/; api/services/app_service.py:1078 delete_app archives the backing agent and unbinds it; api/tasks/remove_app_and_related_data_task.py:90,632,681 deletes the app's triggers and WorkflowSchedulePlan rows so schedules stop; web/i18n/en-US/agent-v-2.json roster.deleteDialog 'web app, API access, and workflows that use it stop working'", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:1111 POST /model/delete removes the model only; automations store model_id (backend/open_webui/models/automations.py:73) and routers/models.py has no Automations call, so a schedule keeps firing and fails with 'Model not found' at main.py:1128 Note: schedules are not stopped with the agent", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agents.service.ts:386-432 delete removes the agent, disconnects its channels and calls AgentTaskService.requestReconcile to stop its schedules; entities/agent-task.entity.ts:33 tasks cascade on agent delete; en.json:8128 'This schedule will stop running'; for workflow agents, archiving/deleting a workflow deactivates its Schedule Trigger (packages/cli/src/workflows/workflows.controller.ts:475)" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agents.service.ts:386-432 delete removes the agent, disconnects its channels and calls AgentTaskService.requestReconcile to stop its schedules; entities/agent-task.entity.ts:33 tasks cascade on agent delete; en.json:8128 'This schedule will stop running'; for workflow agents, archiving/deleting a workflow deactivates its Schedule Trigger (packages/cli/src/workflows/workflows.controller.ts:475)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent entity to delete. Deleting a scheduled task via DELETE /assignments/{id} (assistant:lib/Controller/AssignmentsApiController.php:205-208) is rated under schedules." } }, { @@ -790,7 +863,7 @@ "providerHow": "read-from-code", "feature": "agent-template-gallery", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -800,7 +873,8 @@ "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/sidebar-actions.tsx:33,52 Export (app DSL YAML); web/features/agent-v2/roster/components/roster-create-menu.tsx:29 import dialog; api/services/app_dsl_service.py:561,723,789 AGENT mode handled on import and export Note: imports into another Dify instance, not a Nextcloud; imported agents start with web app and API off (app_dsl_service.py:605)", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` to .tar.gz and :122 `profile import`; hermes_cli/web_routers/profiles.py:988 POST /api/profiles/{name}/export and :1006 POST /api/profiles/import; hermes_cli/commands.py:88-90 /export and /import slash commands Note: Moves between Hermes installs; there is no Nextcloud target.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:381 GET /models/export, :441 POST /models/import (ownership check :515); src/lib/components/workspace/Models.svelte:109 Import JSON, :115 Export JSON; permissions workspace.models_import/models_export in config.py DEFAULT_USER_PERMISSIONS Note: JSON file moves an agent to another Open WebUI instance", - "n8n": "source read at n8n@2.40.7, not driven: en.json:7613-7619 agent builder 'Export JSON' and 'Import agent JSON' modal (packages/frontend/editor-ui/src/features/agents/components/AgentJsonImportModal.vue); workflows export/import as JSON in the editor (en.json:1933 'From file') and by CLI packages/cli/src/commands/export/workflow.ts and packages/cli/src/commands/import/workflow.ts Note: Moves to another n8n instance (no Nextcloud target). Workflow JSON is complete; the Agents-module export (packages/frontend/editor-ui/src/features/agents/views/AgentBuilderView.vue:1466-1475) writes the config, where skills are only {type, id} references (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:189-198)." + "n8n": "source read at n8n@2.40.7, not driven: en.json:7613-7619 agent builder 'Export JSON' and 'Import agent JSON' modal (packages/frontend/editor-ui/src/features/agents/components/AgentJsonImportModal.vue); workflows export/import as JSON in the editor (en.json:1933 'From file') and by CLI packages/cli/src/commands/export/workflow.ts and packages/cli/src/commands/import/workflow.ts Note: Moves to another n8n instance (no Nextcloud target). Workflow JSON is complete; the Agents-module export (packages/frontend/editor-ui/src/features/agents/views/AgentBuilderView.vue:1466-1475) writes the config, where skills are only {type, id} references (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:189-198).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'export|import' in assistant:lib and context_agent:ex_app: no agent export or import." } }, { @@ -826,7 +900,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31372 \"AI Chat with tools (agentic mode): Chat-with-AI can call virtual integrations (tools) to perform actions; backed by the Context Agent ExApp. Chains multiple tools to complete a task.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: full-page chat at the Assistant page route '/' (assistant:appinfo/routes.php:19) mounting ChattyLLMInputForm with sessions and messages (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:9-200); messages go to the Context Agent via ChatService::scheduleMessageGeneration (assistant:lib/Service/ChatService.php:360-412).", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ChatPage.tsx:1-16 dashboard Chat page embeds the full `hermes --tui` over WebSocket /api/pty (hermes_cli/web_routers/chat_ws.py:432); hermes_cli/main.py CLI/TUI chat; gateway adapters under plugins/platforms/ carry the same conversation", "dify": "source read at 1.17.1, not driven: web/app/(shareLayout)/agent/[token]/page.tsx full-page ChatWithHistoryWrap for an agent; web/app/(shareLayout)/chat/[token] for chat apps; web/app/(commonLayout)/installed/[appId] in-console Explore chat; api/controllers/web/completion.py chat-messages", "n8n": "source read at n8n@2.40.7, not driven: Chat hub is a default module (packages/@n8n/backend-common/src/modules/module-registry.ts:60); packages/frontend/editor-ui/src/features/ai/chatHub/module.descriptor.ts:108-113 route /home/chat with a full-page 'chat' layout for models, personal agents and workflow agents; packages/cli/src/modules/chat-hub/chat-hub.controller.ts:168 POST /chat/conversations/send Note: Old partial rested on a release line about chat hub tools; the chat hub is a default full-page chat.", @@ -849,7 +923,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -859,7 +933,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/middleware.py:6304 StreamingResponse handling of streamed deltas pushed over socket.io to src/lib/components/chat/Chat.svelte; per-model stream_response param src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte:20", "hermes-agent": "source read at v2026.9.24, not driven: gateway/stream_consumer.py:1-5 on_delta() queues model deltas and progressively edits one platform message; hermes_cli/cli_stream_mixin.py streams tokens in the CLI; hermes_cli/web_routers/chat_ws.py:432 PTY stream to the dashboard chat", "dify": "source read at 1.17.1, not driven: api/controllers/web/completion.py:45-63 response_mode streaming (agent apps are streaming-only, :50); service API the same (api/controllers/service_api/app/completion.py); web chat renders SSE chunks (web/app/components/base/chat/chat-with-history/chat-wrapper.tsx)", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-stream.service.ts:160-191 sendChunk pushes content chunks to the user with reconnection replay; packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:129-131 'streaming' response mode, AI Agent node enableStreaming (nodes/agents/Agent/V3/AgentV3.node.ts:141-145); Agents module SSE in packages/cli/src/modules/agents/agent-sse-stream.ts" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-stream.service.ts:160-191 sendChunk pushes content chunks to the user with reconnection replay; packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:129-131 'streaming' response mode, AI Agent node enableStreaming (nodes/agents/Agent/V3/AgentV3.node.ts:141-145); Agents module SSE in packages/cli/src/modules/agents/agent-sse-stream.ts", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent posts intermediate output to taskprocessing stream-result (context_agent:ex_app/lib/main.py:193-205, agent.py:256-283); the chat listens on notify_push channel taskprocessing:task_id_* and updates the streaming message (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:993-1003,1079-1096). Note: Added in assistant 4.0.0 (changelog 'Streaming responses'). Needs notify_push; without it the UI polls." } }, { @@ -878,7 +953,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -888,7 +963,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:150-152 /resume and /sessions; hermes_cli/subcommands/sessions.py:22 `hermes sessions list` and :285 browse; hermes_cli/web_routers/sessions.py:167 GET /api/sessions; web/src/pages/SessionsPage.tsx:534-540 Resume in Chat", "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:48 GET /conversations, :129 rename, :179 pin/unpin; web/app/components/base/chat/chat-with-history/sidebar lists past conversations to reopen", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:249 GET /chats/list, :774 POST /chats/new, :1325 GET /chats/{id}; sidebar chat list src/lib/components/layout/Sidebar.svelte reopens earlier chats at /c/[id]", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:95 GET /chat/conversations and :110 GET one conversation; en.json:694-697 sidebar 'New chat' and 'Load more' sessions (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatSidebar.vue); agent memory keyed by session in memory nodes (nodes/memory/MemoryBufferWindow)" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:95 GET /chat/conversations and :110 GET one conversation; en.json:694-697 sidebar 'New chat' and 'Load more' sessions (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatSidebar.vue); agent memory keyed by session in memory nodes (nodes/memory/MemoryBufferWindow)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: session list with new conversation, select and title edit (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:9-57); GET /chat/sessions (assistant:appinfo/routes.php:48, lib/Controller/ChattyLLMController.php:322)." } }, { @@ -907,7 +983,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -917,7 +993,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:696 DELETE /api/sessions/{id} and :414 bulk-delete (web/src/i18n/en.ts sessions.confirmDeleteMessage 'permanently removes ... cannot be undone'); hermes_cli/subcommands/sessions.py:123 `sessions archive` soft-hides, sessions.py:750 PATCH archived flag; searched 'trash|undelete|recycle|soft.?delete' in hermes_state_sessions.py and hermes_cli/sessions*.py: no bin Note: Delete is permanent and archive is a soft hide; there is no bin to restore a deleted conversation from.", "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:116 DELETE /conversations/; api/services/conversation_service.py:232 soft-delete flag then api/tasks/delete_conversation_task.py:105 purges related data. Searched 'restore|trash|bin|undelete' in api/services/conversation_service.py and api/controllers/web: no restore from a bin Note: delete only, no bin or restore", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1568 DELETE /chats/{id} permanent, :1909 POST /{id}/archive toggles archive, :1061 GET /archived; src/lib/components/chat/Settings/ArchivedChats.svelte restores; searched 'trash|recycle|restore|bin' in en-US translation.json: no bin Note: archive is the only undo; a deleted chat cannot be restored", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:388-397 DELETE /chat/conversations/:sessionId returns 204; en.json:686-690 'Are you sure you want to delete this conversation?'; searched 'archiv|restore|deletedAt|trash' in packages/cli/src/modules/chat-hub: no conversation bin or restore (hits are archived helper workflows and memory restore) Note: Delete is permanent; no bin and no restore." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:388-397 DELETE /chat/conversations/:sessionId returns 204; en.json:686-690 'Are you sure you want to delete this conversation?'; searched 'archiv|restore|deletedAt|trash' in packages/cli/src/modules/chat-hub: no conversation bin or restore (hits are archived helper workflows and memory restore) Note: Delete is permanent; no bin and no restore.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: delete conversation with confirmation dialog (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:36-42,202-217) is a hard delete of session and messages (assistant:lib/Service/ChatService.php:142-152). Searched 'trash|restore' in both repos: no bin or restore." } }, { @@ -937,7 +1014,7 @@ "providerHow": "read-from-code", "feature": "warm-start-and-cli-step-visibility", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -947,7 +1024,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 display.tool_progress 'all' with tool_progress_grouping (one bubble or one message per tool) in chat platforms; hermes_cli/commands.py:176 /verbose cycles tool progress off/new/all/verbose in the CLI; web/src/i18n/en.ts sessions.roles.tool shows tool messages in session history", "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/agent-content.tsx:15-38 renders each agent_thought with its tool call; answer/tool-detail.tsx tool input/output; agent v2 'Ran commands' activity in web/features/agent-v2/agent-detail/configure/components/preview/chat-conversation.tsx and answer/agent-roster-response-content.tsx", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116 renders each tool call with src/lib/components/common/ToolCallDisplay.svelte:233-246 ('Executing {{NAME}}', 'View Result from {{NAME}}', 'Denied {{NAME}}'), expandable arguments and result", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentChatToolSteps.vue:33-51 renders each tool call in the agent chat (en.json:7671-7675 tool names); in workflows the chat Logs panel lists the AI Agent's tool sub-node runs with inputs, outputs and tokens (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue, ChatMessagesPanel.vue, LogsViewConsumedTokenCountText.vue)" + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentChatToolSteps.vue:33-51 renders each tool call in the agent chat (en.json:7671-7675 tool names); in workflows the chat Logs panel lists the AI Agent's tool sub-node runs with inputs, outputs and tokens (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue, ChatMessagesPanel.vue, LogsViewConsumedTokenCountText.vue)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: agent reports used tools as 'sources' (context_agent:ex_app/lib/agent.py:274-281); chat shows them live while streaming and in an 'Information sources & actions' popover with translated tool labels (assistant:src/components/ChattyLLM/Message.vue:54-72,85, lib/Controller/ChattyLLMController.php:120-170)." } }, { @@ -968,7 +1046,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -978,7 +1056,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/base.py:1183-1231 SUPPORTED_DOCUMENT_TYPES (.pdf, .docx, .md, .csv ...) accepted as chat file attachments from messaging platforms; hermes_cli/web_routers/files.py:501 POST /api/files/upload and :330 /api/chat/image-upload; hermes_cli/commands.py:297 /image; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: Attaching a file and asking about it works; there is no Nextcloud Files source.", "dify": "source read at 1.17.1, not driven: api/controllers/web/files.py:23 POST /files/upload and api/controllers/web/remote_files.py:102 upload by URL, enabled per app by web/app/components/base/features/new-feature-panel/file-upload; files go into the chat message. No picker for a document store such as Nextcloud Files: upload from the local device or a URL only Note: attach by upload or URL, not from Nextcloud", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:209 Upload Files, :322 Attach Notes, :353 Attach Knowledge, :399 Google Drive, :692 OneDrive/SharePoint; backend/open_webui/routers/files.py upload then RAG; searched 'nextcloud|webdav' in backend/open_webui and src/lib: no Nextcloud Files source Note: attaching files works, but not from Nextcloud", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:120 message attachments; en.json:594 'Attach' and 565 'Drop files here to attach' upload from the local device; searched 'nextcloud|webdav' in packages/frontend/editor-ui/src/features/ai/chatHub: no picker for files held in Nextcloud (a Nextcloud node exists only as a workflow step) Note: Uploads a local file; cannot pick a file from Nextcloud in chat." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:120 message attachments; en.json:594 'Attach' and 565 'Drop files here to attach' upload from the local device; searched 'nextcloud|webdav' in packages/frontend/editor-ui/src/features/ai/chatHub: no picker for files held in Nextcloud (a Nextcloud node exists only as a workflow step) Note: Uploads a local file; cannot pick a file from Nextcloud in chat.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: attach button with 'Upload from device' and 'Select from nextcloud' file picker (assistant:src/components/ChattyLLM/InputArea.vue:160-173); attachments passed as file ids to the multimodal agent (assistant:lib/Service/ChatService.php:402-408, context_agent:ex_app/lib/agent.py:220-224). Note: Multimodal attachments need a provider for core:contextagent:multimodal-interaction." } }, { @@ -997,7 +1076,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "yes", @@ -1007,7 +1086,8 @@ "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:1255 'Good Response', :1293 'Bad Response' buttons; backend/open_webui/routers/evaluations.py:425 POST /evaluations/feedback stores the rating", "hermes-agent": "source read at v2026.9.24, not driven: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-15 only detects affection ('good bot', hearts) to animate the pet, it records no rating", "dify": "source read at 1.17.1, not driven: api/controllers/web/message.py:107 POST /messages//feedbacks; web/app/components/base/chat/chat/answer/operation.tsx:123-144 like/dislike buttons on each answer", - "n8n": "source read at n8n@2.40.7, not driven: rating exists only in two narrower places: n8n's own builder assistant (packages/frontend/editor-ui/src/features/ai/instanceAi/useResponseFeedback.ts, instanceAi.api.ts:73-86 POST /instance-ai/feedback) and eval review rows (en.json:8317-8318 thumbs up/down); searched 'thumb|feedback|rating' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents chat components: no rating on a user agent's live answer Note: No thumbs on answers from agents people build." + "n8n": "source read at n8n@2.40.7, not driven: rating exists only in two narrower places: n8n's own builder assistant (packages/frontend/editor-ui/src/features/ai/instanceAi/useResponseFeedback.ts, instanceAi.api.ts:73-86 POST /instance-ai/feedback) and eval review rows (en.json:8317-8318 thumbs up/down); searched 'thumb|feedback|rating' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents chat components: no rating on a user agent's live answer Note: No thumbs on answers from agents people build.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'thumb|feedback|rating' in assistant:src, assistant:lib and context_agent:ex_app: no answer rating. Message actions are copy, regenerate, delete (assistant:src/components/ChattyLLM/MessageActions.vue:9-32)." } }, { @@ -1026,7 +1106,7 @@ "providerHow": "read-from-code", "feature": "companion-everywhere", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -1036,7 +1116,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: apps/desktop/electron/quick-entry.ts:1-19 Quick Entry, a global-hotkey (Cmd/Ctrl+Shift+Space) mini composer over any desktop app; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: Reachable from anywhere on the desktop via the Electron app, not from inside Nextcloud pages.", "dify": "source read at 1.17.1, not driven: web/public/embed.js (461 lines) injects a floating chat bubble into any web page that includes the script; web/i18n/en-US/app-overview.json:47 points to a separate 'Dify Chatbot Chrome Extension' (not in this repo); nothing embeds the assistant across the Dify console itself or inside Nextcloud Note: a site owner can place the bubble on their pages; no Nextcloud integration", "open-webui": "source read at v0.11.4, not driven: searched 'companion|floating|spotlight|nextcloud' in src/lib/components and src/routes: the chat is its own web app; the Spotlight-style chat bar is a separate desktop app repo (README.md:100 open-webui/desktop), not core, and nothing embeds into Nextcloud pages", - "n8n": "source read at n8n@2.40.7, not driven: an assistant side panel follows the user across the n8n editor (packages/frontend/editor-ui/src/features/ai/assistant/chatPanel.store.ts, components/AssistantsHub.vue) and the canvas chat panel (features/ai/chatHub/components/CanvasChatHubPanel.vue); searched 'nextcloud' in packages/frontend: no integration into Nextcloud pages Note: Available on every n8n page, not inside Nextcloud or other apps." + "n8n": "source read at n8n@2.40.7, not driven: an assistant side panel follows the user across the n8n editor (packages/frontend/editor-ui/src/features/ai/assistant/chatPanel.store.ts, components/AssistantsHub.vue) and the canvas chat panel (features/ai/chatHub/components/CanvasChatHubPanel.vue); searched 'nextcloud' in packages/frontend: no integration into Nextcloud pages Note: Available on every n8n page, not inside Nextcloud or other apps.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: header menu entry injected on every page when enabled (assistant:lib/Listener/BeforeTemplateRenderedListener.php:61-88, src/components/AssistantHeaderMenuEntry.vue:8) opens the non-modal Assistant dialog (assistant:src/components/AssistantTextProcessingModal.vue:126)." } }, { @@ -1055,7 +1136,7 @@ "providerHow": "read-from-code", "feature": "agent-object-leaf", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -1065,7 +1146,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:264 /browser connects the agent to the user's live Chromium browser via CDP so it can read the page being viewed (tools/browser_cdp_tool.py); tools/computer_use_tool.py screen access; searched 'nextcloud' repo-wide (excluding website/): only tests/tools/test_ssh_environment.py Note: The agent can read whatever page is open, but no app hands it the current record as context.", "dify": "source read at 1.17.1, not driven: web/public/embed.js:93-96 the host page passes config.inputs (e.g. a record id) into the embedded chat as app input variables; the agent only sees what the host page chooses to pass, no connector reads the record or its links from another app Note: a host page can hand context in, nothing looks the record up", "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|record|object context' in backend/open_webui/utils/middleware.py and src/lib/components/chat: no integration that passes the record open in another app; closest is the iframe postMessage 'input:prompt' handler at src/lib/components/chat/Chat.svelte:1470 which only pre-fills text", - "n8n": "source read at n8n@2.40.7, not driven: no host-app record context for user agents (searched 'record context|objectId|current page' in packages/cli/src/modules/agents and chat-hub: none); only n8n's own assistant can read the user's open browser tab through the AI Browser Bridge extension (packages/@n8n/mcp-browser/README.md:3-6, packages/@n8n/computer-use/README.md Browser tools) Note: Only n8n's builder assistant, through a local browser bridge; agents people build cannot see the record on screen." + "n8n": "source read at n8n@2.40.7, not driven: no host-app record context for user agents (searched 'record context|objectId|current page' in packages/cli/src/modules/agents and chat-hub: none); only n8n's own assistant can read the user's open browser tab through the AI Browser Bridge extension (packages/@n8n/mcp-browser/README.md:3-6, packages/@n8n/computer-use/README.md Browser tools) Note: Only n8n's builder assistant, through a local browser bridge; agents people build cannot see the record on screen.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: only for files: Files actions send the selected file to summarise, transcribe, speak or subtitle (assistant:src/files/fileActions.js:63,102,141,180 -> POST /api/v1/file-action/{fileId}/{taskTypeId}). Searched 'context|current' in assistant:src/assistant.js: no hand-over of a record from other apps into the chat." } }, { @@ -1085,7 +1167,7 @@ "providerHow": "read-from-code", "feature": "the-declared-tool-surface-and-the-prompt-library", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -1095,7 +1177,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/skill_commands.py:1 every installed skill is a /skill-name slash command in CLI and gateway; hermes_cli/commands.py:226 /bundles; plugin-catalog/prompt-snippets.yaml:1-5 community desktop prompt-snippet library (catalog plugin, not core); searched 'record type' concepts: none Note: Ready-made prompts exist as skills and snippets, but none is scoped to a record type or set centrally for an organisation.", "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx:48,87 builder sets an opening statement and fixed suggested questions per app; web/app/components/base/chat/chat/answer/suggested-questions.tsx. No prompt library keyed to a record type Note: per-app starter questions only", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/prompts.py:71 prompt list with access grants (:441), :384 versioning; src/lib/components/chat/MessageInput/Commands/Prompts.svelte '/' picker; per-model suggestion prompts ModelEditor.svelte:1183; no binding of prompts to a record type Note: org prompt library exists; not scoped to record types", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:62-63 suggestedPrompts per chat agent, en.json:527 'Suggestions' in the agent editor (packages/frontend/editor-ui/src/features/ai/chatHub/components/SuggestedPromptsEditor.vue, ChatSuggestedPrompts.vue); searched 'record type|prompt library' in packages/cli/src/modules/chat-hub: no organisation prompt library bound to a record type Note: Ready-made prompts are per agent and set by its owner, not per record type." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:62-63 suggestedPrompts per chat agent, en.json:527 'Suggestions' in the agent editor (packages/frontend/editor-ui/src/features/ai/chatHub/components/SuggestedPromptsEditor.vue, ChatSuggestedPrompts.vue); searched 'record type|prompt library' in packages/cli/src/modules/chat-hub: no organisation prompt library bound to a record type Note: Ready-made prompts are per agent and set by its owner, not per record type.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: chat offers hard-coded suggestion prompts (weather, share link, scheduled task, deck card, slides) in assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:355-400. Not set by the organisation and not per record type." } }, { @@ -1123,7 +1206,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31386 \"Voice input: Hands-free natural-language invocation of agent commands.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: microphone recording in the chat input (assistant:src/components/ChattyLLM/InputArea.vue:57-71, fields/AudioRecorderWrapper.vue:137-151) sent as an audio agency task (assistant:lib/Service/ChatService.php:392-401); speech-to-text also in the smart picker (assistant:lib/Reference/SpeechToTextReferenceProvider.php:30). Note: Needs audio task-type providers.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/VoiceRecording.svelte dictation and CallOverlay.svelte voice mode; backend/open_webui/routers/audio.py:1251 POST /audio/transcriptions (local Whisper, OpenAI, Deepgram, Azure, per README.md:54)", "hermes-agent": "source read at v2026.9.24, not driven: tools/voice_mode.py:1-5 push-to-talk capture with STT via tools/transcription_tools.py; hermes_cli/commands.py:202-205 /voice and /wake ('Hey Hermes' wake word); gateway/run_voice.py transcribes inbound voice messages on messaging platforms", "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:62 POST /audio-to-text; web/app/components/base/features/new-feature-panel/speech-to-text.tsx per-app switch; needs a speech2text model from a provider plugin", @@ -1148,7 +1231,7 @@ "providerHow": "read-from-code", "feature": "speech-services", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -1158,7 +1241,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/tts_tool.py:1-6 text-to-speech tool with Edge, ElevenLabs, OpenAI, local Piper/NeuTTS and more, Opus voice bubbles on messaging platforms; gateway/streaming_tts_consumer.py speaks streamed replies; hermes_cli/commands.py:202 /voice", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:1122 'Read Aloud'; backend/open_webui/routers/audio.py:601 POST /audio/speech; per-model TTS voice ModelEditor.svelte:1280", "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:119 POST /text-to-audio; web/app/components/base/features/new-feature-panel/text-to-speech (voice, autoplay) per app; needs a TTS model from a provider plugin", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatMessageActions.vue:17-19,64,72 'Read aloud' action on AI messages via browser speech synthesis (en.json:650); speech generation node packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/generate.operation.ts" + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatMessageActions.vue:17-19,64,72 'Read aloud' action on AI messages via browser speech synthesis (en.json:650); speech generation node packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/generate.operation.ts", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: audio chat answers carry an audio attachment and TTS runs when needed (assistant:lib/Listener/ChattyLLMTaskListener.php:100-112,134,185); personal setting 'Auto-play audio chat responses' (assistant:src/components/PersonalSettings.vue:24); Files action 'Text-To-Speech using AI' (assistant:src/files/fileActions.js:86-102)." } }, { @@ -1185,7 +1269,7 @@ "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31889 \"Smart Picker in-app invocation: Invoke AI from any Nextcloud text field\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: reference providers registered for text generation, image, sticker and speech-to-text (assistant:lib/AppInfo/Application.php:80-83,120; lib/Reference/FreePromptReferenceProvider.php:29-36), toggles in admin and personal settings (assistant:src/components/AdminSettings.vue:35-50).", "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; searched 'insert into|smart picker|text field' in apps/desktop/electron and web/src: the desktop Quick Entry (apps/desktop/electron/quick-entry.ts:2) opens a composer, it does not insert results into other apps' text fields", "dify": "source read at 1.17.1, not driven: searched 'smart picker|reference provider|text field|browser extension' in web/ and api/: Dify is a standalone app, AI help inside text fields exists only for its own prompt editors (api/controllers/console/app/generator.py:327 instruction-generate); nothing inserts AI output into other applications' text fields", "open-webui": "source read at v0.11.4, not driven: searched 'smart picker|reference provider|nextcloud' in backend/open_webui and src/lib: Open WebUI is standalone and offers no picker inside other apps' text fields; in-app only via note AI menu (src/lib/components/notes/AIMenu.svelte:42)", @@ -1215,7 +1299,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31383 \"Text tasks (summarize/headline/reformulate/formalize/context-write): core:text2text task-type family via Task Processing providers.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant form lists every TaskProcessing text task type (summary, headline, topics, reformulate, translate) with placeholders (assistant:src/components/AssistantTextProcessingForm.vue:584-598, Translate/TranslateForm.vue); Files action 'summarize' in one click (assistant:src/files/fileActions.js:63). Note: Needs text providers in the server.", "hermes-agent": "source read at v2026.9.24, not driven: searched '\"summarize\"|\"translate\"|\"rephrase\"|\"reformulate\"' as command or action names in *.py and *.ts outside tests: no one-click text action; summarising or translating happens only by asking in chat Note: The chat can do it when asked; no one-click action on a selected text.", "dify": "source read at 1.17.1, not driven: a builder can make a Completion (text generator) app that summarises or translates (web/app/(shareLayout)/completion/[token]); no built-in one-click summarise/reformulate/translate action on arbitrary text Note: possible by building an app, not a ready one-click action", "open-webui": "source read at v0.11.4, not driven: src/lib/components/notes/AIMenu.svelte:42 one-click 'Enhance' on a note; NoteEditor.svelte:154-157 suggested 'Summarize this note.', 'Rewrite the selected text.'; src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:26 Ask, :33 Explain on selected text; searched 'translate' in those components: no one-click translate Note: only inside notes and chat selections, no one-click translate", @@ -1245,7 +1329,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31381 \"Document & image generation: Generate spreadsheets, slides, PDFs and images from chat instructions.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: text-to-image smart picker (assistant:lib/Reference/Text2ImageReferenceProvider.php:30), Files 'New' menu image dialog (assistant:src/components/FilesNewMenu/GenerateImageDialog.vue), and agent tool generate_image (context_agent:ex_app/lib/all_tools/image_gen.py:13-14). Note: Needs a text2image provider.", "hermes-agent": "source read at v2026.9.24, not driven: tools/image_generation_tool.py:1-5 image generation tool (FAL models chosen in `hermes tools`); agent/image_gen_registry.py pluggable providers with plugins/image_gen/; the model calls it from any chat surface", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/images.py:562 POST /images/generations, :858 /images/edit (OpenAI, Gemini, ComfyUI, Automatic1111); built-in tool backend/open_webui/tools/builtin.py:370 generate_image; src/routes/(app)/playground/images/+page.svelte", "dify": "source read at 1.17.1, not driven: core builtin tools are only audio, code, time, webscraper (api/core/tools/builtin_tool/providers/); searched 'text2img|image_generation|generate image' in api/core and web/i18n/en-US: none in core. Image generation comes only from marketplace tool plugins Note: marketplace plugin only", @@ -1269,7 +1353,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -1279,7 +1363,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:268 GET /api/sessions/search behind web/src/i18n/en.ts sessions.searchPlaceholder 'Search message content'; tools/session_search_tool.py:1-9 FTS5 recall over the session DB for the agent; hermes_state_fts.py full-text index", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/conversation.py:55,119-126 builders search one app's logs by keyword over queries and answers; the end-user chat sidebar (web/app/components/base/chat/chat-with-history/sidebar) has no search and api/controllers/web/conversation.py:48 lists without a keyword Note: admin log search per app, no search for the person across their own conversations", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:865 GET /chats/search over title and message content with snippet (:178 chat_search_snippet); src/lib/components/layout/SearchModal.svelte 'Search Chats'; agent-side tool tools/builtin.py:1512 search_chats", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:95-107 GET /chat/conversations takes only limit, cursor, type (packages/@n8n/api-types/src/chat-hub.ts:491-495), no query; searched 'search' among chatHub i18n keys (en.json:539-677): only agent, tool and model search; agent sessions list has status/origin filters only (packages/frontend/editor-ui/src/features/agents/components/AgentSessionsFilter.vue:25-34)" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:95-107 GET /chat/conversations takes only limit, cursor, type (packages/@n8n/api-types/src/chat-hub.ts:491-495), no query; searched 'search' among chatHub i18n keys (en.json:539-677): only agent, tool and model search; agent sessions list has status/origin filters only (packages/frontend/editor-ui/src/features/agents/components/AgentSessionsFilter.vue:25-34)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'search|filter' in assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue and lib/Controller/ChattyLLMController.php: session list has no search and GET /chat/sessions takes only isAssignment (ChattyLLMController.php:322)." } }, { @@ -1298,7 +1383,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -1308,7 +1393,8 @@ "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:910 Citations component with source list and CitationModal (Messages/Citations/CitationModal.svelte) linking to the document or URL; model capability 'citations' (translation key settings.admin.models.capabilities.citations)", "hermes-agent": "source read at v2026.9.24, not driven: agent/anthropic_message_convert.py:52-56 carries provider citation blocks through the transcript; tools/web_tools.py web_search/web_extract return result URLs that the model quotes in its text; searched 'citation' in *.py: no source panel or structured citation rendering in gateway, CLI or dashboard Note: Sources appear only as links the model writes into the answer.", "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/citation.tsx:44 per-app Citations switch; web/app/components/base/chat/chat/citation/popup.tsx:31,109 shows each source document and segment with a link to /datasets//documents/ (link shown to console users)", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-knowledge-retrieval.ts:199,276 knowledge search returns file and line citations to the model (tools/knowledge/search-knowledge.tool.ts:215) and the chat shows 'Read file'/'Search text' tool steps (en.json:7672-7674); searched 'citation|sources' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents: no linked source list under an answer Note: The model gets citations, the answer UI shows no source links. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-knowledge-retrieval.ts:199,276 knowledge search returns file and line citations to the model (tools/knowledge/search-knowledge.tool.ts:215) and the chat shows 'Read file'/'Search text' tool steps (en.json:7672-7674); searched 'citation|sources' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents: no linked source list under an answer Note: The model gets citations, the answer UI shows no source links. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Context Chat answers show referenced sources as links (assistant:src/components/ContextChat/ContextChatOutputForm.vue:20-42, ContextChatSource.vue:46); in agent chat only tool names are listed (assistant:src/components/ChattyLLM/Message.vue:54-72). Note: Source links rely on the context_chat app and backend (not read)." } }, { @@ -1328,7 +1414,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -1338,7 +1424,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1945 POST /chats/{id}/share, :1208 GET /chats/share/{share_id}, :2029 access grants on the shared chat; src/lib/components/chat/ShareChatModal.svelte:30 shareChatById and 'Copy Share Link'; src/routes/s/[id]/+page.svelte viewer", "hermes-agent": "source read at v2026.9.24, not driven: searched 'share.*(link|url)|public.*session|shared_session' in hermes_cli/web_routers/sessions.py and gateway/platforms/api_server.py: none; hermes_cli/web_routers/sessions.py:787 GET /api/sessions/{id}/export and hermes_cli/commands.py:66 /save export to a file; hermes_cli/shared_session_attach.py:1-4 attaches local runtimes, not colleagues Note: Export to a file exists; no share link.", "dify": "source read at 1.17.1, not driven: searched 'share conversation|shareConversation|conversation.*share' in web/i18n/en-US and api/controllers/web/conversation.py (list, delete, rename, pin only): the web app URL and QR code share the app (web/i18n/en-US/agent-v-2.json access.webApp.qrCode), no link to one conversation", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentPreviewMoreMenu.vue:159-172 'Copy link' copies the session route (en.json:8223), which opens only for users with agent:read in the project; chat hub conversations are private to their user (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:110 getConversation by req.user.id); searched 'share' in chat-hub.controller.ts: no share endpoint Note: A link works for project colleagues on agent sessions; no public or chat-hub share link. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentPreviewMoreMenu.vue:159-172 'Copy link' copies the session route (en.json:8223), which opens only for users with agent:read in the project; chat hub conversations are private to their user (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:110 getConversation by req.user.id); searched 'share' in chat-hub.controller.ts: no share endpoint Note: A link works for project colleagues on agent sessions; no public or chat-hub share link. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'share' in assistant:lib/Controller: only sharing a task's output file (POST /api/v1/task/{id}/file/{fileId}/share, assistant:appinfo/routes.php:34); no link to a conversation." } }, { @@ -1357,14 +1444,14 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: scheduled tasks use an RFC 5545 RRULE, not cron (assistant:lib/Db/Assignment.php:108-116, context_agent:ex_app/lib/all_tools/assignments.py:25), checked by a 10-minute background job (assistant:lib/BackgroundJob/RunAssignmentsJob.php:201-208). No cron expression field. Note: Old 'no' rested on July docs; assistant 4.0.0 added Assignments.", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:794-799 5-6 field cron expressions via croniter; hermes_cli/subcommands/cron.py:23 `hermes cron create`; web/src/i18n/en.ts cron.schedule 'Schedule (cron expression)' on web/src/pages/CronPage.tsx -> POST /api/cron/jobs (hermes_cli/web_routers/cron.py:248)", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:10-19 Schedule Trigger start node with mode cron and cron_expression; api/schedule/workflow_schedule_task.py:18 poller (ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK default true, api/configs/feature/__init__.py:1461); an agent runs on it as an Agent node in that workflow Note: the schedule belongs to a workflow app that holds the agent node, not to the agent itself", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:105-106 'Custom (Cron)' rule, cronExpression field; agent schedules also take a cron, en.json:8143 'Custom (cron)' in the agent task editor and packages/cli/src/modules/agents/scheduling/agent-task-job-registrar.ts", @@ -1387,14 +1474,14 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: RRULE with FREQ/INTERVAL, e.g. 'FREQ=HOURLY' (tool doc context_agent:ex_app/lib/all_tools/assignments.py:16-25), created by chat or POST /assignments (assistant:lib/Controller/AssignmentsApiController.php:59-62), evaluated by Assignment::isDueToRun (assistant:lib/Db/Assignment.php:131-150). Note: Granularity is the 10-minute background job. Old 'no' is superseded by assistant 4.0.0 Assignments.", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:17,34-55 visual mode with hourly/daily/weekly/monthly frequency, on_minute, time, weekdays; api/services/trigger/schedule_service.py:257 visual_to_cron; web/i18n/en-US/workflow.json nodes.triggerSchedule.useVisualPicker Note: hourly is the finest visual step; 'every 15 minutes' needs cron", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:81-101 interval rules Seconds, Minutes, Hours, Days, Weeks, Months without cron; agent task editor en.json:8139-8142 Hourly, Daily, Weekly, Monthly", "open-webui": "source read at v0.11.4, not driven: src/lib/components/automations/ScheduleDropdown.svelte:27-33 Hourly/Daily/Weekly/Monthly presets building FREQ+INTERVAL (:92); backend/open_webui/utils/recurrence.py:62 MINUTELY/HOURLY steps aligned to the clock; builtin tool docstring tools/builtin.py:3726 'Every 30 minutes'", @@ -1417,14 +1504,14 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", "n8n": "partial", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: startsAt plus a non-repeating rule (tool doc says an empty rule means no repeat, context_agent:ex_app/lib/all_tools/assignments.py:25-26; COUNT=1 works in Recurr) stored on the assignment (assistant:lib/Service/AssignmentsService.php:46-60). Note: Needs a live check that an empty RRULE evaluates in Recurr; isDueToRun swallows errors and returns false (Assignment.php:151-155).", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:801-812 ISO timestamp parses to a one-shot job in the configured timezone; web/src/i18n/en.ts cron.scheduleModes.once 'Once' / onceAt 'Run at'", "dify": "source read at 1.17.1, not driven: searched 'once|run_at|one-time|date' in api/core/workflow/nodes/trigger_schedule/entities.py and api/services/trigger/schedule_service.py: only recurring frequencies and a 5-field cron (api/libs/schedule_utils.py:33-39), which repeats yearly; no fire-once date", "open-webui": "source read at v0.11.4, not driven: src/lib/components/automations/ScheduleDropdown.svelte:28 'Once' builds DTSTART + RRULE:FREQ=DAILY;COUNT=1 (:69, detection :110); backend/open_webui/utils/recurrence.py:106 validate_rrule requires DTSTART with COUNT", @@ -1447,14 +1534,14 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the user asks in chat and the agent translates it into an RRULE and start time via create_scheduled_task (context_agent:ex_app/lib/all_tools/assignments.py:14-37); chat suggestion 'Create a scheduled task to send me the weather every morning' (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:366-367).", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:780-790 natural phrases ('every monday 9am', 'weekdays at 9am') convert to cron via _natural_every_to_cron; tools/cronjob_tools.py:1 cronjob_manage tool lets the agent create jobs from a chat request; hermes_cli/commands.py:236 /cron", "dify": "source read at 1.17.1, not driven: searched 'natural language|describe|generate cron|text to cron' in web/i18n/en-US/workflow.json and api/services/trigger: the schedule node takes a visual picker or a cron string only (web/i18n/en-US/workflow.json nodes.triggerSchedule.*) Note: the workflow generator does not know the schedule node either: searched 'trigger-schedule|trigger_schedule|cron' in api/core/workflow/generator/, no hits", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3709 create_automation built-in tool: the chat model turns 'every weekday at eight' into an RRULE (docstring examples :3723-3728), plus :3817 update_automation and :3921 list_automations, gated by features.automations permission", @@ -1477,14 +1564,14 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each assignment stores an IANA timezone defaulting to the user's (assistant:lib/Service/AssignmentsService.php:63-67) and the RRULE is expanded in that timezone by Recurr (assistant:lib/Db/Assignment.php:136-138); tests with offsets (assistant:tests/unit/Db/AssignmentTest.php).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_time.py:1-5 tz-aware now() in the configured IANA timezone (HERMES_TIMEZONE or config timezone); cron/jobs.py:1195-1216 next fire computed on local wall clock with both DST folds tried so 09:00 local stays 09:00 across fall-back; cron/jobs.py:832 intervals measure elapsed time across DST Note: Old partial; the scheduler handles DST explicitly.", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:19 timezone per schedule; api/libs/schedule_utils.py:41-50 croniter evaluated in the pytz zone and converted to UTC, so fires follow local wall time across DST; web/i18n/en-US/workflow.json nodes.triggerSchedule.invalidTimezone", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/automations.py:319-330 claim_due fetches each owner's User.timezone and reschedules with it; utils/recurrence.py:128 next_run_ns evaluates the rule on local wall-clock time then attaches ZoneInfo (:137), so 08:00 stays 08:00 across DST", @@ -1514,7 +1601,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'run|trigger' in assistant:lib/Controller/AssignmentsApiController.php and the tools in context_agent:ex_app/lib/all_tools/assignments.py: create, list, get, update, delete only; no run-now.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:157 `hermes cron run` (next scheduler tick); hermes_cli/web_routers/cron.py:292 POST /api/cron/jobs/{id}/trigger behind web/src/i18n/en.ts cron.triggerNow 'Trigger now' on CronPage", "dify": "source read at 1.17.1, not driven: api/core/trigger/debug/event_selectors.py:140-200 a schedule test run waits for the next computed slot, it does not fire at once; the same workflow can be run now only through a second User Input start node ('Choose the start node to run', web/i18n/en-US/workflow.json common.chooseStartNodeToRun) or the workflow run API Note: no 'run now' on the schedule itself", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:334 POST /automations/{id}/run; src/lib/components/automations/AutomationItemHeaderActions.svelte:33 'Run now', AutomationMenu.svelte:96 'Run Now'; src/routes/(app)/automations/+page.svelte:196 runAutomationById", @@ -1544,7 +1631,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no paused state on the assignment entity (assistant:lib/Db/Assignment.php:57-67 columns) and no pause endpoint (assistant:lib/Controller/AssignmentsApiController.php:59-208).", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:306 POST /{id}/toggle flips is_active (models/automations.py:28); claim_due only picks is_active rows (:301); src/routes/(app)/automations/+page.svelte:166 toggle, :186 bulk toggle; tool tools/builtin.py:3993 toggle_automation", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:149-152 `cron pause` / `cron resume`; hermes_cli/web_routers/cron.py:282-287 POST /api/cron/jobs/{id}/pause|resume behind CronPage Pause/Resume (web/src/i18n/en.ts cron.pause)", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:167,197 POST /apps//trigger-enable sets AppTriggerStatus ENABLED/DISABLED; api/schedule/workflow_schedule_task.py:55-78 the poller only picks ENABLED triggers", @@ -1574,7 +1661,7 @@ "n8n": "yes", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'webhook|PublicPage' in assistant:lib and context_agent:ex_app: no inbound webhook trigger.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-10 HMAC-validated inbound POST routes render the payload into an agent prompt or fire an existing cron job; hermes_cli/subcommands/webhook.py:16-50 `hermes webhook subscribe --prompt --events --skills --deliver --cron-job`; web/src/pages/WebhooksPage.tsx:207 create subscription", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Webhook (Webhook trigger node) starts a workflow, including one with an AI Agent node, from an inbound HTTP call; Chat Trigger adds a chat webhook (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts); Agents module exposes packages/cli/src/modules/agents/agent-integrations.controller.ts:109 POST /:agentId/webhooks/:platform for chat platforms", "dify": "source read at 1.17.1, not driven: api/controllers/trigger/webhook.py:59 /triggers/webhook/ any method starts the workflow; web/i18n/en-US/workflow.json blocks.trigger-webhook 'receives HTTP pushes from third-party systems'; configurable params, headers and response (nodes.triggerWebhook.*); the agent runs as a node in that workflow", @@ -1597,7 +1684,7 @@ "providerHow": "read-from-code", "feature": "agent-webhook-trigger", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -1607,7 +1694,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/webhook.py:136 re-running `webhook subscribe --secret ` replaces the route secret (else keeps it); hermes_cli/subcommands/webhook.py:58 `webhook remove` revokes the route; web/src/pages/WebhooksPage.tsx:335-355 secret shown once at creation; hermes_cli/subcommands/hooks.py:34 revoke is for hooks, not webhook secrets Note: Rotation is a re-subscribe with a new secret on the CLI; no rotate or revoke-secret action in the dashboard.", "dify": "source read at 1.17.1, not driven: api/services/trigger/webhook_service.py:966,994-1001 the random webhook_id in the URL is the only secret, generated once at node sync; no regenerate endpoint (api/controllers/console/app/workflow_trigger.py:94 is GET only); revoke by disabling the trigger (:167) or deleting the node. No HMAC/signature check Note: revoke yes, rotate no", "open-webui": "source read at v0.11.4, not driven: channel webhook token is minted once (backend/open_webui/models/channels.py:937 secrets.token_urlsafe) with no regenerate endpoint; revoke only by deleting the webhook (routers/channels.py:1963); the API key used for machine starts can be regenerated or deleted (routers/auths.py:1529 POST, :1554 DELETE /api_key) Note: no agent webhook; nearest secrets can be revoked, only the API key rotated", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Webhook/description.ts:91-95 basic, header and JWT auth on the webhook, each backed by a stored credential; the secret is rotated or revoked by editing or deleting that credential (packages/cli/src/credentials/credentials.controller.ts:243 PATCH, :450 DELETE) Note: No dedicated rotate button; rotation is a credential edit." + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Webhook/description.ts:91-95 basic, header and JWT auth on the webhook, each backed by a stored credential; the secret is rotated or revoked by editing or deleting that credential (packages/cli/src/credentials/credentials.controller.ts:243 PATCH, :450 DELETE) Note: No dedicated rotate button; rotation is a credential edit.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no inbound webhook exists (searched 'webhook|secret' in both repos)." } }, { @@ -1634,7 +1722,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'IEventListener|NodeCreated|file upload' in assistant:lib/Listener: listeners handle task results, templates and user deletion only; nothing starts the agent on a Nextcloud event.", "copilot-studio": "docs-only: competitor_features#31603 \"Autonomous agents: Agents that trigger on events and act without a human prompt (5 messages/action).\"", "n8n": "source read at n8n@2.40.7, not driven: 103 trigger nodes in packages/nodes-base/nodes (*Trigger.node.ts), e.g. file-upload triggers for Google Drive and Dropbox; searched '*nextcloud*trigger*' in packages/nodes-base/nodes: none, so a Nextcloud event reaches n8n only as a call to a generic Webhook node (packages/nodes-base/nodes/Webhook) Note: Event triggers are rich for other apps; nothing listens to Nextcloud directly. Old yes rested on the generic webhook line.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-5 routes accept events from outside systems with header event filters (GitHub, GitLab, Linear, generic); gateway/hooks.py:1-9 lifecycle hooks (session, agent, command events) run handlers; cron/scheduler_script.py pre-run script gates a job; searched 'nextcloud' repo-wide: none Note: Agents start on outside-system events via webhooks, not on Nextcloud file or record events.", @@ -1659,7 +1747,7 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -1669,7 +1757,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/webhook.py:47-51 a webhook route can fire an existing cron job (--cron-job); the same job keeps its schedule (cron/jobs.py:772 parse_schedule) and can be run by hand (hermes_cli/web_routers/cron.py:292 trigger); cron/jobs.py:2650-2657 manual run-now without consuming the next slot Note: Triggers are chosen per job or route rather than per profile.", "dify": "source read at 1.17.1, not driven: a workflow chooses its start node(s): User Input, Schedule Trigger, Webhook Trigger or a plugin trigger (web/i18n/en-US/workflow.json blocks.trigger-schedule, blocks.trigger-webhook, onboarding.triggerDescription; common.chooseStartNodeToRun); api/controllers/console/app/workflow_trigger.py:128 lists an app's triggers Note: chosen per workflow app that wraps the agent", "open-webui": "source read at v0.11.4, not driven: an automation runs on its RRULE (backend/open_webui/models/automations.py:76) and can be run by hand (routers/automations.py:334 /run); a model is also started by hand in chat; there is no event option per agent (searched 'trigger|event' in models/automations.py and src/lib/components/automations: none) Note: schedule or manual, no event trigger to choose", - "n8n": "source read at n8n@2.40.7, not driven: each workflow picks its start: Manual Trigger, Schedule Trigger, Webhook or one of 103 app trigger nodes (packages/nodes-base/nodes/*Trigger.node.ts); Agents module agents combine chat, channel triggers and schedules per agent, en.json:8342-8343 'Triggers: Where and when this agent runs'" + "n8n": "source read at n8n@2.40.7, not driven: each workflow picks its start: Manual Trigger, Schedule Trigger, Webhook or one of 103 app trigger nodes (packages/nodes-base/nodes/*Trigger.node.ts); Agents module agents combine chat, channel triggers and schedules per agent, en.json:8342-8343 'Triggers: Where and when this agent runs'", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: two start modes exist, by hand in chat and by schedule (assistant:lib/Service/ChatService.php:360,501); no event start, so the choice is incomplete." } }, { @@ -1695,7 +1784,7 @@ "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a failed assignment run posts an error message and sends a failure notification (assistant:lib/Service/AssignmentsService.php:150-162, lib/Listener/ChattyLLMTaskListener.php:40-52); searched 'retry|backoff' in assistant:lib: no automatic retry.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json nodes.common.retry.* per-node retry on failure with max retries and a fixed retry interval in ms (api/core/workflow/generator/prompts/builder_prompts.py:111 retry_config); fail branch / default value error handling (nodes.common.errorHandle.*). Searched 'backoff|exponential' in api/core/workflow: no growing waits, no whole-run retry Note: fixed interval, node level only", "n8n": "source read at n8n@2.40.7, not driven: packages/core/src/execution-engine/workflow-execute.ts:1799-1814 node 'Retry On Fail' clamps maxTries to 2-5 and waitBetweenTries to at most 5000 ms, :2346-2347 same wait every attempt (en.json:2378-2408); failed executions can be retried by hand (en.json:1577 'Retry execution') Note: Retries stop after a limit, but the wait is fixed, not growing. Old yes rested on a generic error-handling line.", "hermes-agent": "source read at v2026.9.24, not driven: cron/unreachable_retry.py:1-17 and :31 RETRY_DELAYS_SECONDS (300, 900, 1800): growing waits, stops after three, but only for fires that never reached the model (transient network error, zero API calls); cron/quota_hold.py:1-12 parks a job until a provider quota window reopens Note: Generic run failures are not retried; the bounded ladder covers unreachable-model failures only.", @@ -1725,7 +1814,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dead|failed list' in both repos: failures are notified per run only (assistant:lib/Notification/Notifier.php:389-401).", "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 durable failure incidents grouped by job and error signature (detected, alerted, closed); hermes_cli/subcommands/cron.py:174-181 `hermes cron incidents list|ack`; cron/jobs.py:2254 dead-pin auto-pause Note: Failing jobs land in an incident list someone can acknowledge; the failed runs are not parked for replay and there is no dashboard view of incidents.", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:27,121,150 run logs filter by status (failed) and web/app/components/app/workflow-log/filter.tsx; searched 'dead letter|dead_letter|quarantine|parked' in api/: no list that parks repeatedly failing runs Note: a failed-status filter per app, not a dead-letter list", "open-webui": "source read at v0.11.4, not driven: failed runs are kept per automation in automation_run with status and error (backend/open_webui/models/automations.py:43-50), listed in src/lib/components/automations/AutomationEditor.svelte:212 getAutomationRuns; automation.run_failed event can go to a webhook (events.py AUTOMATION_RUN_FAILED); no cross-automation list of failing runs Note: per-automation run history, no parked-failures list", @@ -1749,14 +1838,14 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "medium", - "nextcloud-assistant": "no", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", "n8n": "yes", "open-webui": "no", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the next run is skipped while the previous run still waits for approval (assistant:lib/Service/AssignmentsService.php:141-144), but the job allows parallel runs (lib/BackgroundJob/RunAssignmentsJob.php:201) and does not check a still-generating run.", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-task.service.ts:529-558 takes a per-task run lock (entities/agent-task-run-lock.entity.ts:6-35) and returns 'skipped-active' when the previous run still holds it; scheduling/agent-task-task-handler.ts:59-60 skips that tick Note: Agent schedules only (opt-in Agents module); workflow Schedule Triggers can overlap and have only the instance-wide N8N_CONCURRENCY_PRODUCTION_LIMIT (packages/@n8n/config/src/configs/executions.config.ts:25).", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:2648-2670 claim_job_for_fire refuses a new fire while a fresh fire_claim exists (cleared by mark_job_run on completion, TTL for crashes); cron/jobs.py:3050 still-in-flight runs are skipped", "dify": "source read at 1.17.1, not driven: api/schedule/workflow_schedule_task.py:94-114 _process_schedules advances next_run_at and dispatches every due schedule without checking for a running execution; searched 'overlap|already running|skip_if_running|concurrency' in api/schedule and api/services/trigger: nothing", @@ -1780,14 +1869,14 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "medium", - "nextcloud-assistant": "no", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31890 \"No autonomous scheduling: Agent is interactive/reactive only; no cron/scheduled runs\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: 'Scheduled tasks' view lists them, showing prompt and recurrence and past results (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:19-22,59-66,112-121); GET /assignments (assistant:lib/Controller/AssignmentsApiController.php:87-90). No next-run time shown.", "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/automations/+page.svelte:509 list with Active/Paused filter, :100 last run time; AutomationEditor.svelte:331 next run, :361 run history with status; backend/open_webui/routers/automations.py:147 enrich_automation adds last_run and next_runs", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/CronPage.tsx with web/src/i18n/en.ts cron.last 'Last', cron.next 'Next', overdueSince; hermes_cli/web_routers/cron.py:233 GET /api/cron/jobs and :243 /runs; hermes_cli/subcommands/cron.py:20 `cron list` and :168 `cron runs`", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:45-65,128 GET /apps//triggers lists one app's triggers with status, no next run or last result; next 5 run times only in the node panel (web/i18n/en-US/workflow.json nodes.triggerSchedule.nextExecutionTimes). No workspace-wide schedule list Note: per app, no next run or last result in the list", @@ -1817,7 +1906,7 @@ "n8n": "yes", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31376 \"Files tool: Read, create, move, copy, delete files and create public share links.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tools get_file_content, upload_file, create_folder, move_file, copy_file, delete_file, convert_file (context_agent:ex_app/lib/all_tools/files.py:27-338); writes are dangerous tools needing confirmation.", "open-webui": "source read at v0.11.4, not driven: agents read uploaded and knowledge files via built-in tools backend/open_webui/tools/builtin.py:2750 view_file, :2413 list_chat_files, :2453 grep_chat_files; create and move files only inside an attached Open Terminal filesystem (utils/middleware.py:1286 write_file / run_command); searched 'nextcloud|webdav' in backend/open_webui: no Nextcloud Files Note: file work happens in the Open Terminal sandbox, not in Nextcloud Files", "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file, write_file, patch, search_files tools and :1371 registration in the file toolset, plus terminal tool for moves; searched 'nextcloud' repo-wide (excluding website/): none outside one test Note: Works on the host or sandbox filesystem; no Nextcloud Files connection.", "dify": "source read at 1.17.1, not driven: core has no file-store tool (searched 'nextcloud|webdav' in api/, web/app, web/i18n: no hits; builtin tools are audio, code, time, webscraper in api/core/tools/builtin_tool/providers/). Official marketplace plugin langgenius/dify-official-plugins tools/nextcloud/tools/ has list_files, search_files, upload_file, download_file, create_folder, delete_file: no move Note: marketplace plugin only (official 'nextcloud' plugin, read on main not at a tag), and it cannot move files", @@ -1847,7 +1936,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31373 \"Calendar tool: List calendars, schedule events, find free time slots via natural-language chat.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tools list_calendars, schedule_event with attendees, find_free_time_slot_in_calendar (context_agent:ex_app/lib/all_tools/calendar.py:30-31,103-104,187-188); schedule_event is dangerous and waits for confirmation.", "open-webui": "source read at v0.11.4, not driven: built-in calendar tools backend/open_webui/tools/builtin.py:4151 search_calendar_events, :4240 create_calendar_event, :4367 update, :4488 delete, registered at utils/tools.py:754 when calendar is enabled; data in models/calendar.py, UI src/routes/(app)/calendar/+page.svelte Note: Open WebUI's own calendar; no CalDAV or Nextcloud Calendar", "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:1-27 bundled skill reads Google Calendar, checks conflicts and creates events through a gws CLI or bundled Python client (needs Google OAuth); optional-mcps/calendly; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Calendar only; no CalDAV, so a Nextcloud calendar is out of reach.", "dify": "source read at 1.17.1, not driven: no calendar tool in core (api/core/tools/builtin_tool/providers/ has audio, code, time, webscraper). Marketplace: official langgenius/dify-official-plugins tools/google_calendar/tools/{list_events,create_event}.yaml, feishu/lark calendars, and a community CalDAV plugin langgenius/dify-plugins shaba/caldav that could point at a Nextcloud calendar Note: marketplace plugin only", @@ -1877,7 +1966,7 @@ "n8n": "yes", "open-webui": "no", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31379 \"Contacts tool: Look up contact and user information to feed other tools.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tools find_person_in_contacts, find_person_in_users, find_details_of_current_user (context_agent:ex_app/lib/all_tools/contacts.py:16-99).", "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:15-22 Contacts via the Google People API in the bundled google-workspace skill; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Contacts only; no CardDAV or Nextcloud Contacts.", "dify": "source read at 1.17.1, not driven: no contacts tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_contacts/tools/{search_contacts,get_contact}.yaml; community langgenius/dify-plugins shaba/carddav Note: marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: searched 'contacts|carddav|address book' in backend/open_webui and src/lib/components: no contacts store or tool; only the user directory used for sharing", @@ -1908,7 +1997,7 @@ "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31377 \"Deck tool: Manage Deck board cards, labels and assignments.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tools list_boards, list_board_cards, add_card, add_card_label, assign_card_to_user, delete_card, card comments (context_agent:ex_app/lib/all_tools/deck.py:14-218); available when the Deck capability is present (deck.py:243-244). Note: No tool edits a card's title or description; updates are labels, assignment and comments.", "hermes-agent": "source read at v2026.9.24, not driven: tools/kanban_tools_schemas.py:89-371 kanban_create, kanban_comment, kanban_complete tools on Hermes' own multi-profile kanban board (hermes_cli/kanban.py); optional-mcps/ has asana, linear, monday, clickup MCP entries; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Cards on Hermes' own board or third-party boards; no Nextcloud Deck.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|deck' in api/ and web/i18n: nothing in core. Marketplace kanban tools only for other products: official tools/trello/tools/{create_new_card_on_board,update_card}.yaml, monday, linear, jira Note: cards on Trello-like boards via plugins, not Nextcloud Deck", "open-webui": "source read at v0.11.4, not driven: searched 'deck|kanban|board' in backend/open_webui (py): no board tool or integration", @@ -1938,7 +2027,7 @@ "n8n": "yes", "open-webui": "no", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31375 \"Mail tool: Send emails, manage mail accounts and folders.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: send_email dangerous tool plus mail account, folder and message listing (context_agent:ex_app/lib/all_tools/mail.py:16-70). Note: Needs the Mail app.", "hermes-agent": "source read at v2026.9.24, not driven: skills/email/himalaya/SKILL.md:1-3 bundled IMAP/SMTP skill; plugins/platforms/email/plugin.yaml:5-8 email gateway polls IMAP and replies over SMTP; tools/send_message_tool.py:35 send_message delivers to the email target; skills/productivity/google-workspace Gmail", "dify": "source read at 1.17.1, not driven: core email is only the Human Input node's delivery method (web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*, api/services/feature_service.py:81 on for self-hosted). A generic send-email tool comes from the official tools/email/tools/send_mail.yaml plugin or gmail/outlook plugins Note: agent-callable email is marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: searched 'smtp|send_email|sendmail|mail' in backend/open_webui: no mail sending anywhere in core; outbound messages go only to webhooks (utils/webhook.py:30) Note: only possible through a community Tool", @@ -1968,7 +2057,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31374 \"Talk tool: List conversations, send messages, create public conversations from the agent.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: send_message_to_conversation, reply_to_message, create_poll, share_file_to_conversation (context_agent:ex_app/lib/all_tools/talk.py:49-50,137-138,159-160,222-223); available when Talk (spreed) is installed (talk.py:298-299).", "hermes-agent": "source read at v2026.9.24, not driven: tools/send_message_tool.py:1-2 and :35 send_message posts to any connected chat platform (plugins/platforms/: telegram, discord, slack, matrix, mattermost, teams, signal and more); plugin-catalog/hermes-talk.yaml:1-5 is realtime voice, not Nextcloud Talk; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Posting into a team chat works; there is no Nextcloud Talk adapter.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/i18n: nothing in core. Marketplace chat tools for other products: official tools/slack/tools/send_message.yaml, tools/teams/tools/send_channel_message.yaml, discord, dingtalk, wecom Note: posts to Slack/Teams via plugins, not Nextcloud Talk", "open-webui": "source read at v0.11.4, not driven: an automation can target an Open WebUI channel (backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation) and models answer @mentions in channels (routers/channels.py:976); channel built-in tools are read-only (tools/builtin.py:1763-1957); no Nextcloud Talk Note: posting is to Open WebUI's own channels, only via automation target or mention reply", @@ -1999,7 +2088,7 @@ "n8n": "yes", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31378 \"Tasks tool: Create, list, complete, update and delete tasks.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: add_task, list_tasks, complete_task, update_task, delete_task on CalDAV task lists (context_agent:ex_app/lib/all_tools/calendar.py:240-241,294-295,337-338,392-393,431-432).", "hermes-agent": "source read at v2026.9.24, not driven: skills/apple/apple-reminders/SKILL.md:1-3 'add, list, complete' reminders (macOS); tools/kanban_tools_schemas.py:89 kanban_complete and :371 kanban_create; optional-mcps/todoist; tools/todo_tool.py in-session todo list Note: No CalDAV tasks; Nextcloud Tasks is not reachable.", "dify": "source read at 1.17.1, not driven: no task tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_tasks/tools/{create_task,update_task}.yaml, microsoft_todo, todoist, feishu_task Note: marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3593 create_tasks and :3643 update_task keep a checklist inside the chat message (status pending|in_progress|completed); searched 'todo|caldav|vtodo' in backend/open_webui: no task app to create or complete tasks in Note: in-chat progress checklist only", @@ -2029,7 +2118,7 @@ "n8n": "no", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31384 \"Unified search tool: Access all Nextcloud search providers from the agent.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: one tool per unified search provider, built from GET /ocs/v2.php/search/providers and calling each provider's search (context_agent:ex_app/lib/all_tools/search.py:11-30).", "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; tools/session_search_tool.py searches only Hermes' own conversations and tools/file_tools.py:1270 search_files only the host filesystem Note: No Nextcloud unified search provider or equivalent cross-app search.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|unified search|unified_search' in api/ and web/: nothing. The official marketplace nextcloud plugin (langgenius/dify-official-plugins tools/nextcloud/tools/search_files.yaml) searches files only, not everything Nextcloud search reaches", "open-webui": "source read at v0.11.4, not driven: separate built-in search tools over Open WebUI's own stores: backend/open_webui/tools/builtin.py:1512 search_chats, :1127 search_notes, :865 search_memories, :1763 search_channels, :2104 search_knowledge_bases, :4151 search_calendar_events; no single cross-app search tool and no Nextcloud unified search Note: agent can search each store, not one unified index", @@ -2052,7 +2141,7 @@ "providerHow": "read-from-code", "feature": "web-research-tool", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -2062,7 +2151,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/web_tools.py:1-9 web_search and web_extract over pluggable backends in plugins/web/ (brave_free, ddgs, exa, firecrawl, searxng, tavily, perplexity ...); tools/browser_tool.py full browser for reading pages", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:294 search_web and :333 fetch_url, registered at utils/tools.py:677 when web_search is enabled; ~20 providers in backend/open_webui/retrieval/web/ (SearXNG, Brave, Tavily, ...)", "dify": "source read at 1.17.1, not driven: core ships only a page reader (api/core/tools/builtin_tool/providers/webscraper); web search engines are marketplace plugins (official tools/duckduckgo, tavily, searxng, google, bing, brave, perplexity in langgenius/dify-official-plugins); web/i18n/en-US/agent-v-2.json tools.addMenu.tool 'like web search or integrations' Note: reading pages is core, searching needs a plugin", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/tools/ToolSerpApi/ToolSerpApi.node.ts:25 'SerpApi (Google Search)' and nodes/tools/ToolSearXng agent tools; Agents module web search setting with native, Brave or SearXNG providers (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:80-84, en.json:7884-7895); pages read with the HTTP Request tool (nodes/tools/ToolHttpRequest)" + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/tools/ToolSerpApi/ToolSerpApi.node.ts:25 'SerpApi (Google Search)' and nodes/tools/ToolSearXng agent tools; Agents module web search setting with native, Brave or SearXNG providers (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:80-84, en.json:7884-7895); pages read with the HTTP Request tool (nodes/tools/ToolHttpRequest)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: DuckDuckGoSearchResults tool (context_agent:ex_app/lib/all_tools/duckduckgo.py:7-11) and web_fetch that reads a page by URL (context_agent:ex_app/lib/all_tools/web.py:13-20); the system prompt tells the agent to fetch search results (context_agent:ex_app/lib/agent.py:143-158). Note: Both are admin-toggleable categories." } }, { @@ -2081,7 +2171,7 @@ "providerHow": "read-from-code", "feature": "agent-tool-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -2091,7 +2181,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'openregister|register' as a record store in *.py and optional-mcps/: none; searched 'nextcloud' repo-wide (excluding website/): none outside one test", "dify": "source read at 1.17.1, not driven: searched 'openregister' in api/ and web/app: no hits; no OpenRegister connector in core or in the official plugin list (langgenius/dify-official-plugins tools/). Only reachable by a hand-built custom OpenAPI tool or HTTP node", "open-webui": "source read at v0.11.4, not driven: searched 'openregister|register' in backend/open_webui/tools and utils/tools.py: no OpenRegister or record-store tool; reachable only through a custom OpenAPI or MCP tool server", - "n8n": "source read at n8n@2.40.7, not driven: searched 'openregister' in packages/nodes-base/nodes, packages/@n8n/nodes-langchain/nodes and packages/cli/src: no hits; only reachable by a hand-built HTTP Request tool against its API" + "n8n": "source read at n8n@2.40.7, not driven: searched 'openregister' in packages/nodes-base/nodes, packages/@n8n/nodes-langchain/nodes and packages/cli/src: no hits; only reachable by a hand-built HTTP Request tool against its API", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'openregister|register' in context_agent:ex_app and assistant:lib: no OpenRegister tool. Only indirectly if OpenRegister exposes a unified search provider (search.py), which is not in these repos." } }, { @@ -2111,14 +2202,14 @@ "providerHow": "read-from-code", "feature": "governed-cli-mcp-transport", "featureConfidence": "high", - "nextcloud-assistant": "partial", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31385 \"Remote MCP client: Consume external MCP servers, but streamable_http only and cannot use per-user access tokens.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin 'MCP Config' JSON field (context_agent:ex_app/lib/main.py:103-110) fed to langchain MultiServerMCPClient, tools prefixed mcp_ (context_agent:ex_app/lib/all_tools/mcp.py:14-30); MCP tools are always treated as dangerous (context_agent:ex_app/lib/tools.py:48); chat labels them 'MCP server: x' (assistant:src/components/ChattyLLM/Message.vue:289). Note: Old 'partial' said streamable_http only; the config is passed straight to MultiServerMCPClient, so its transports apply. Admin-only, one config for everyone.", "hermes-agent": "source read at v2026.9.24, not driven: tools/mcp_tool.py MCP client (stdio, HTTP, OAuth in tools/mcp_oauth.py); hermes_cli/subcommands/mcp.py:27 `hermes mcp add` and :52 configure tool selection; hermes_cli/web_routers/mcp.py:110 POST /api/mcp/servers behind web/src/pages/McpPage.tsx; optional-mcps/ catalog of 65 servers", "copilot-studio": "docs-only: competitor_features#31607 \"MCP support: Copilot Studio can consume MCP tool servers.\"", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/mcp/McpClientTool/McpClientTool.node.ts attaches an outside MCP server's tools to the AI Agent node; Agents module per-agent mcpServers with auth, tool allow/exclude filter and approval (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:228-303, max 20 at :495-500)", @@ -2142,7 +2233,7 @@ "providerHow": "read-from-code", "feature": "governed-cli-mcp-transport", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -2152,7 +2243,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/app/mcp_server.py:79 enable an app's MCP server, :181 refresh its URL; api/controllers/mcp/mcp.py:44 /mcp/server//mcp endpoint serving the app as an MCP tool to outside agents Note: each app is exposed as a tool, not the workspace's whole tool catalogue", "n8n": "source read at n8n@2.40.7, not driven: instance MCP server is a default module: packages/cli/src/modules/mcp/mcp.controller.ts:37,117 POST /mcp-server/http, tools such as search_workflows and execute_workflow (packages/cli/src/modules/mcp/tools/, mcp-scopes.ts:15,44); per-workflow MCP Server Trigger node packages/@n8n/nodes-langchain/nodes/mcp/McpTrigger/McpServer.ts", "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:1-7 `hermes mcp serve` stdio MCP server exposing a channel bridge: mcp_serve.py:468 conversations_list, :600 messages_send, :626 channels_list, :662-672 approvals; plugins/platforms/a2a lets outside agents message Hermes Note: Outside agents reach conversations, messaging and approvals, not Hermes' own tool set (files, terminal, web, skills).", - "open-webui": "source read at v0.11.4, not driven: searched 'FastMCP|mcp.server|/mcp' in backend/open_webui (py): the only MCP code is the client (utils/mcp/client.py); Open WebUI exposes an OpenAI-compatible REST API, not an MCP server" + "open-webui": "source read at v0.11.4, not driven: searched 'FastMCP|mcp.server|/mcp' in backend/open_webui (py): the only MCP code is the client (utils/mcp/client.py); Open WebUI exposes an OpenAI-compatible REST API, not an MCP server", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: ExApp route 'mcp' with USER access (context_agent:appinfo/info.xml routes), FastMCP server mounted at /mcp (context_agent:ex_app/lib/main.py:38-41,269), each call authenticated as the calling user (context_agent:ex_app/lib/mcp_server.py:31-41) and the enabled tools re-registered as MCP tools (mcp_server.py:47-73)." } }, { @@ -2171,7 +2263,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", @@ -2182,7 +2274,8 @@ "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/tool-provider-list.tsx list every installed tool provider (plugins, custom, workflow-as-tool, MCP) with each tool's description; api/controllers/console/workspace/tool_providers.py lists them", "n8n": "source read at n8n@2.40.7, not driven: the node creator lists every tool node with its description (packages/frontend/editor-ui/src/features/shared/nodeCreator/components/ItemTypes/NodeItem.vue:59-75); 272 nodes in packages/nodes-base/nodes declare usableAsTool: true; Agents module tool catalog with descriptions (packages/frontend/editor-ui/src/features/agents/composables/useAgentToolCatalog.ts:79-145)", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Tools.svelte lists custom tools with descriptions (routers/tools.py); src/lib/components/workspace/Models/BuiltinTools.svelte:14-51 each built-in tool category with label and description; tool servers listed in chat/ToolServersModal.svelte" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Tools.svelte lists custom tools with descriptions (routers/tools.py); src/lib/components/workspace/Models/BuiltinTools.svelte:14-51 each built-in tool category with label and description; tool servers listed in chat/ToolServersModal.svelte", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admins see tool categories as a checkbox list (context_agent:ex_app/lib/main.py:88-94); the chat can be asked 'Which actions can you do for me?' (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:370-371). No page listing each tool with what it does." } }, { @@ -2201,7 +2294,7 @@ "providerHow": "read-from-code", "feature": "agent-tool-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -2211,7 +2304,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/tools.py:280-285 PUT /api/tools/toolsets/{name}?profile= enables/disables a toolset per profile and per platform (platform_toolsets.), behind web/src/pages/SkillsPage.tsx toolsets view; hermes_cli/commands.py:213 /tools disable|enable ; agent/subagent_lifecycle.py:415 subagents only get a subset of the parent's toolsets", "open-webui": "source read at v0.11.4, not driven: per-agent allow-list: src/lib/components/workspace/Models/ModelEditor.svelte:1198 ToolsSelector, :1262 BuiltinTools category toggles (BuiltinTools.svelte:14-51), :1245 Capabilities; backend/open_webui/utils/tools.py:520 get_builtin_tools only returns categories the model allows; tool access grants routers/tools.py:588", "dify": "source read at 1.17.1, not driven: tools are picked per agent (web/i18n/en-US/agent-v-2.json agentDetail.configure.tools.*; classic agent apps list tools in model config). But every Agent v2 run also gets a shell tool (dify-agent/src/dify_agent/layers/shell/layer.py:259,303 run) and 'Tools the agent installs in its sandbox won't appear here but stay available to it' (agent-v-2.json tools.tip) Note: explicit list for classic agents; Agent v2 always has a shell, so not 'nothing else'", - "n8n": "source read at n8n@2.40.7, not driven: an AI Agent node can call only the tool sub-nodes wired to it (packages/@n8n/nodes-langchain/nodes/agents/Agent/utils.ts:31-59 typed inputs incl. ai_tool); Agents module lists tools per agent and filters MCP tools with allow/exclude (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:266-282, :461); skills narrow further with allowedTools (en.json:8053)" + "n8n": "source read at n8n@2.40.7, not driven: an AI Agent node can call only the tool sub-nodes wired to it (packages/@n8n/nodes-langchain/nodes/agents/Agent/utils.ts:31-59 typed inputs incl. ai_tool); Agents module lists tools per agent and filters MCP tools with allow/exclude (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:266-282, :461); skills narrow further with allowedTools (en.json:8053)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool categories switch on or off for the whole instance (context_agent:ex_app/lib/tools.py:23,33-35); no per-agent or per-user grant." } }, { @@ -2232,7 +2326,7 @@ "feature": "tool-discovery-and-access-requests", "featureConfidence": "high", "defectCandidate": "ToolAccessRequestService::notifyOwner() (lib/Service/ToolAccessRequestService.php:758-766) raises notification subjects 'tool_access_requested'/'tool_access_granted', neither of which is in lib/Notification/Notifier.php's KNOWN_SUBJECTS list (lines 58-65), so INotifier::prepare() throws UnknownNotificationException and the bell-menu entry for it never renders.", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -2242,7 +2336,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'request.{0,20}(tool|toolset).{0,20}(access|enable)|ask.{0,20}(user|owner).{0,20}enable' in *.py: none; hermes_cli/tool_availability_notices.py:1-6 only prints startup notices for toolsets missing requirements; tools/tool_search.py:1-7 discloses deferred tools that are already granted Note: The agent cannot ask its owner for a new tool through any built-in flow.", "dify": "source read at 1.17.1, not driven: searched 'request access|requestAccess|ask.*owner|tool request' in web/i18n/en-US and dify-agent/src: only static 'contact your Workspace Owner' tour text (web/i18n/en-US/common.json:624); no flow where an agent asks for a missing tool", "open-webui": "source read at v0.11.4, not driven: searched 'request access|request_access|missing tool' in backend/open_webui and src/lib/components: no flow for an agent to ask its owner for a tool; the ask_user tool (tools/builtin.py:518) asks the chat user a question, not for a grant", - "n8n": "source read at n8n@2.40.7, not driven: searched 'request access|request_tool|requestTool' in packages/cli/src/modules/agents and packages/@n8n/agents/src: a running agent cannot ask its owner for a missing tool; ask_credential exists only for the builder assistant while editing an agent (packages/cli/src/modules/agents/builder/prompts/config-mutation.prompt.ts:31,103), and 'Suggest a tool' (en.json:7800-7801) is feedback from the builder to n8n Note: The builder asks the human for credentials while building; the agent at runtime cannot." + "n8n": "source read at n8n@2.40.7, not driven: searched 'request access|request_tool|requestTool' in packages/cli/src/modules/agents and packages/@n8n/agents/src: a running agent cannot ask its owner for a missing tool; ask_credential exists only for the builder assistant while editing an agent (packages/cli/src/modules/agents/builder/prompts/config-mutation.prompt.ts:31,103), and 'Suggest a tool' (en.json:7800-7801) is feedback from the builder to n8n Note: The builder asks the human for credentials while building; the agent at runtime cannot.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'request|access|grant' in context_agent:ex_app: a disabled category is silently skipped (tools.py:33-35); no access request flow." } }, { @@ -2262,7 +2357,7 @@ "providerHow": "read-from-code", "feature": "code-execution-sandbox", "featureConfidence": "low", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -2272,7 +2367,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/code_execution_tool.py:1-9 code execution through a session kernel; tools/environments/ docker.py, modal.py, daytona.py, singularity.py, vercel_sandbox.py, ssh.py isolated terminal backends (tools/terminal_tool_backends.py:1-3); hermes_cli/web_routers/tools.py:661 PUT /api/tools/terminal/backend", "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/layers/shell/layer.py:303 agent runs scripts in a per-agent Linux sandbox (dify-agent-runtime/docker/Dockerfile); workflow Code node (web/i18n/en-US/workflow.json blocks.code) runs in dify-sandbox; builtin code tool api/core/tools/builtin_tool/providers/code Note: agent-v-2.json communityEditionIsolationTip: in Community Edition the sandbox is only Landlock-protected and shares a PID namespace, not strongly isolated", "n8n": "source read at n8n@2.40.7, not driven: Code node and Custom Code Tool (packages/@n8n/nodes-langchain/nodes/tools/ToolCode/ToolCode.node.ts) run JS or Python in task runners, Python in a sandbox (packages/@n8n/task-runner-python/src/_sandbox_callables.py; runner mode config packages/@n8n/config/src/configs/runners.config.ts:16-17); Agents module custom tools run in V8 isolates (packages/cli/src/modules/agents/runtime/agent-secure-runtime.ts:5,23) Note: Default runner mode is 'internal' (a child process); the external runner container gives stronger isolation.", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:633 execute_code; src/lib/components/admin/Settings/CodeExecution.svelte:20 engines pyodide (browser WASM sandbox, src/lib/pyodide/pyodideSandboxHost.ts) and jupyter; plus Open Terminal containers (README.md:36)" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:633 execute_code; src/lib/components/admin/Settings/CodeExecution.svelte:20 engines pyodide (browser WASM sandbox, src/lib/pyodide/pyodideSandboxHost.ts) and jupyter; plus Open Terminal containers (README.md:36)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'exec|sandbox|python|subprocess|code' across context_agent:ex_app/lib/all_tools/: no code execution tool." } }, { @@ -2292,7 +2388,7 @@ "providerHow": "read-from-code", "feature": "hermiq-runner-git-capability", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -2302,7 +2398,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool.py runs git in the working tree; hermes_cli/subcommands/worktree.py:8-26 isolated git worktrees and tools/subagent_worktree.py per-subagent worktrees; hermes_cli/commands.py:173 /diff and :83 /rollback checkpoints (tools/checkpoint_manager.py); skills/software-development/ bundled coding skills", "open-webui": "source read at v0.11.4, not driven: no git tool in core (searched 'git' in backend/open_webui/tools and utils/tools.py); an agent can run git only through an attached Open Terminal via run_command (utils/tools.py:1439, utils/middleware.py:1287), which is a separate first-party server (README.md:96 open-webui/open-terminal) Note: old yes; git works only with the separate Open Terminal server", "dify": "source read at 1.17.1, not driven: dify-agent-runtime/docker/Dockerfile:31-37 installs git and openssh-client in the agent sandbox; dify-agent/src/dify_agent/layers/shell/layer.py:303 the agent runs shell scripts there, secrets via the env editor (agent-v-2.json advancedSettings.envEditor); official github/gitlab plugins add PR and commit tools Note: through the generic shell, no dedicated git UI", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Git/Git.node.ts:90 usableAsTool with operations add, clone, commit, pull, push (:136-184); GitHub and GitLab nodes for remote repositories (packages/nodes-base/nodes/Github, Gitlab) Note: Git node works on the n8n host's filesystem; needs a workflow with an AI Agent node." + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Git/Git.node.ts:90 usableAsTool with operations add, clone, commit, pull, push (:136-184); GitHub and GitLab nodes for remote repositories (packages/nodes-base/nodes/Github, Gitlab) Note: Git node works on the n8n host's filesystem; needs a workflow with an AI Agent node.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'git|repository|commit' in context_agent:ex_app: no git tool." } }, { @@ -2328,7 +2425,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31883 \"Model Context Protocol (MCP) tools: Admins add custom services to Context Agent via MCP\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admins add any MCP server in the 'MCP Config' setting without code changes (context_agent:ex_app/lib/main.py:103-110, context_agent:ex_app/lib/all_tools/mcp.py:14-30).", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/tool_providers.py:685 add a custom tool from an OpenAPI schema (web/i18n/en-US/tools.json createTool.schema), :904 publish a workflow as a tool, :1373 add an MCP server; agent-v-2.json tools.cliDialog installs a CLI tool into the agent sandbox", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/tools/ToolCode (custom code tool), ToolHttpRequest (any API) and ToolWorkflow (a workflow as a tool) are added on the canvas without code changes; Agents module custom tools and workflow tools (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:373-420, en.json:8040-8041); community nodes can be installed too", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/tools.py:346 POST /tools/create with Python code (src/routes/(app)/workspace/tools/create/+page.svelte, ToolkitEditor.svelte), :264 /tools/load/url; OpenAPI and MCP tool servers added in settings (src/lib/components/AddToolServerModal.svelte:43)", @@ -2351,7 +2448,7 @@ "providerHow": "read-from-code", "feature": "agent-tool-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -2361,7 +2458,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/sessions.py:69-78 `hermes sessions export --format jsonl|trace` writes full transcripts including every tool call and argument, filterable by age and source; hermes_cli/web_routers/sessions.py:787 GET /api/sessions/{id}/export (one session) Note: Tool calls export inside whole transcripts; there is no tool-call-only list or dashboard export across sessions.", "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI writes query, answer, inputs, sources and feedback (api/services/retention/conversation/message_export_service.py:53-62), no tool calls; api/controllers/console/workflow_run_archive.py:93-130 run-archive download is Cloud paid-plan only; tool spans reach Langfuse and other tracers (api/core/ops) Note: no community export of the tool-call list; old partial rested on the message export, which leaves tool calls out", "open-webui": "source read at v0.11.4, not driven: tool calls live inside each message's output items (utils/tool_approval.py:43 function_call entries) and leave only through chat JSON export (src/lib/components/chat/Settings/DataControls.svelte:93 exportChats, admin routers/chats.py:1049 /all/db) or chat stats export (:609); no dedicated tool-invocation log or export", - "n8n": "source read at n8n@2.40.7, not driven: tool calls sit inside execution data, exportable per run through the public API packages/cli/src/public-api/v1/handlers/executions/spec/paths/getExecutions.generated.yml:18 includeData; one agent session exports to LangSmith (packages/cli/src/modules/agents/agent-threads.controller.ts:53-65); searched 'export' in packages/frontend/editor-ui/src/features/agents and execution logs: no export of an agent's tool-call list Note: No single export of every tool call; assemble from execution data or per session." + "n8n": "source read at n8n@2.40.7, not driven: tool calls sit inside execution data, exportable per run through the public API packages/cli/src/public-api/v1/handlers/executions/spec/paths/getExecutions.generated.yml:18 includeData; one agent session exports to LangSmith (packages/cli/src/modules/agents/agent-threads.controller.ts:53-65); searched 'export' in packages/frontend/editor-ui/src/features/agents and execution logs: no export of an agent's tool-call list Note: No single export of every tool call; assemble from execution data or per session.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool names per answer are stored in the message's sources column (assistant:lib/Listener/ChattyLLMTaskListener.php:97-98); searched 'export' in assistant:lib: no export of tool calls." } }, { @@ -2380,7 +2478,7 @@ "providerHow": "read-from-code", "feature": "settings-management", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -2390,7 +2488,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ChannelsPage.tsx:42-51 live connected/disconnected/fatal state per messaging platform; web/src/pages/SystemPage.tsx:106 runs `doctor` with a live log and :187 memory-provider status, :210 credential pool; hermes_cli/web_routers/mcp.py:195 POST /api/mcp/servers/{name}/test; hermes_cli/doctor_connectivity.py:1-4 provider API probes Note: Spread over Channels, MCP and System pages rather than one list. Old partial.", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/routes.ts:2-11 one page for model providers, builtin tools, MCP, custom tools, workflow tools, data sources, endpoints, triggers, agent strategies, extensions, each showing Authorized/Unauthorized (web/i18n/en-US/tools.json auth.authorized, auth.unauthorized) Note: shows whether a connection is authorised, not a live health check", "open-webui": "source read at v0.11.4, not driven: admin Settings tabs Connections, Integrations (tool servers), Code Execution, External Knowledge (src/lib/components/admin/Settings/*.svelte) list outside connections, each with a verify or test action at add time (AddToolServerModal.svelte:206 verifyToolServerConnection, AddTerminalServerModal.svelte:246, ExternalKnowledge.svelte:295); no standing status view showing whether each still works", - "n8n": "source read at n8n@2.40.7, not driven: the Credentials page lists every outside connection (en.json:1178-1182) and a credential is tested when saved (packages/cli/src/credentials/credentials.controller.ts:147 POST /test), but the list shows no live health; per agent, packages/cli/src/modules/agents/agent-integrations.controller.ts:89-104 channel status report and en.json:8554 'Not running' badge Note: No single page with live status of every dependency." + "n8n": "source read at n8n@2.40.7, not driven: the Credentials page lists every outside connection (en.json:1178-1182) and a credential is tested when saved (packages/cli/src/credentials/credentials.controller.ts:147 POST /test), but the list shows no live health; per agent, packages/cli/src/modules/agents/agent-integrations.controller.ts:89-104 channel status report and en.json:8554 'Not running' badge Note: No single page with live status of every dependency.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: personal settings 'Configured backends' list the providers behind each feature (assistant:src/components/PersonalSettings.vue:52-60) and admin settings flag missing providers (AdminSettings.vue:55-120). No health status per outside connection, MCP servers not shown." } }, { @@ -2409,14 +2508,14 @@ "providerHow": "read-from-code", "feature": "agent-memory", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: two paths: 'Remember this' on a conversation makes it a memory summarised by a background job (assistant:lib/Service/ChatService.php:121-126, lib/Service/SessionSummaryService.php:54-150) and injected into every run (context_agent:ex_app/lib/agent.py:160-161); on-demand memory tools store markdown files (context_agent:ex_app/lib/all_tools/memory.py:246-248). Note: Old 'no' predates assistant 3.1.0 memories and context_agent 2.8.0 memory tools.", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:1-5 persistent MEMORY.md (agent notes) and USER.md (user profile) injected into every session; agent/background_review.py:1-6 after each turn a forked agent decides what to save; plugins/memory/ bundled providers (honcho, mem0, supermemory, openviking, retaindb, holographic, byterover)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/memories.py:15 per-user memory table (type user|context, path); utils/memory.py:290 add_memory_context injects memories into each chat; tools/builtin.py:923 add_memory, :865 search_memories let the agent save and recall across chats and automation runs", "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 Agent v2 working directories are owned per conversation, workflow run or build draft, so end-user runs do not carry facts into the next conversation; only builder-applied persistent files and the build note (agent-v-2.json workingDirectory.persistentFilesTooltip) carry over. Learned memory comes from marketplace plugins (official bailian_memory; community mem0, zep in langgenius/dify-plugins) Note: marketplace plugin for learned memory; plugins not read", @@ -2439,14 +2538,14 @@ "providerHow": "read-from-code", "feature": "agent-memory", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: memories are per user: summaries of remembered chats about the user's circumstances and preferences (assistant:lib/Service/SessionSummaryService.php:62) and memory files in the user's own Assistant folder (context_agent:ex_app/lib/all_tools/memory.py:26,184-186).", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 target 'user' = who the user is (name, role, preferences, style) in USER.md; plugins/memory/honcho/__init__.py:1-5 per-peer user modeling with peer cards; mem0 user_id canonical across gateways (plugins/memory/mem0/__init__.py:1-7) Note: USER.md is per profile, not per person; per-person modelling needs the honcho or mem0 provider.", "open-webui": "source read at v0.11.4, not driven: memory is kept per person: backend/open_webui/models/memories.py:22 user_id, :23 type 'user' for durable facts about the user; utils/memory.py:528 background review writes 'user' facts; src/lib/components/chat/Settings/Personalization/MemoryModal.svelte:97 'Add a preference, fact, or instruction about you' Note: old partial; memory is per user across all models, not per agent", "dify": "source read at 1.17.1, not driven: searched 'user profile|user_memory|remember' in dify-agent/src and api/core/memory (token_buffer_memory.py only): no per-person memory in core; conversation variables are per conversation (api/controllers/console/app/conversation_variables.py:88). Per-user memory only via marketplace memory plugins (community mem0, zep) Note: marketplace plugin only, plugin behaviour not read", @@ -2470,14 +2569,14 @@ "providerHow": "read-from-code", "feature": "agent-memory", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: remembered conversations are listed in personal settings (assistant:src/components/PersonalSettings.vue:61-65) and the toggle is on each chat (ChattyLLMInputForm.vue:68-82); memory files live in 'Context Agent/Memories' in the user's Files, so they can be opened, edited and deleted there (context_agent:ex_app/lib/all_tools/memory.py:26).", "hermes-agent": "source read at v2026.9.24, not driven: memories are plain files $HERMES_HOME/memories/MEMORY.md and USER.md (hermes_cli/web_routers/ops.py:481-492); web/src/pages/SystemPage.tsx:1234-1243 shows their sizes and Reset buttons only; hermes_cli/commands.py:223 /memory pending|approve|reject reviews staged writes; tools/memory_tool.py:311 agent can replace/remove entries on request Note: No viewer or editor in dashboard or CLI; correcting means editing the file by hand or asking the agent.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/Personalization.svelte:53 lists memories, :61 delete, MemoryModal.svelte:59 Edit Memory; backend/open_webui/routers/memories.py:548 update, :610 delete, :516 delete all", "dify": "source read at 1.17.1, not driven: builders see and edit the agent's persistent files and generated build note (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, files.buildNote, workingDirectory.*) and conversation variables per conversation (api/controllers/console/app/conversation_variables.py:88); there is no learned-memory store to inspect Note: the agent's files are editable, but there is no memory of learned facts to review", @@ -2500,14 +2599,14 @@ "providerHow": "read-from-code", "feature": "agent-memory", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31388 \"No persistent agent memory: Stateless per-conversation; no MEMORY/USER long-term memory store across sessions.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: outdated chat summaries are regenerated by a background job (assistant:lib/Service/SessionSummaryService.php:81-88) and the agent may overwrite a memory file with store_memory (context_agent:ex_app/lib/all_tools/memory.py:246-260). No merging of duplicates or dropping of stale facts.", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:56 hard char budgets (memory 2200, user 1375) and :323-324 'IF FULL ... reissue as ONE batch that removes or shortens enough stale entries'; agent/background_review.py:1-6 background review updates existing memory; plugins/memory/holographic/__init__.py:1-5 trust scoring and temporal decay", "dify": "source read at 1.17.1, not driven: searched 'consolidat|dedupe memory|stale|forget' in dify-agent/src and api/core: dify-agent/src/dify_agent/runtime/compaction.py only compacts the current run's context; nothing merges or prunes stored memory", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/memory.py:410 review_memory_after_turn every N turns (memories.review_interval_turns) asks the model for add/replace/move/remove operations and tells it to prefer replace/remove over duplicates (:528 prompt), applied via routers/memories.py:234 update_memories Note: off by default: ENABLE_MEMORY_BACKGROUND_REVIEW (config.py:428)", @@ -2538,7 +2637,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31881 \"Context Chat (RAG over Nextcloud data): RAG over Files, Collectives and Analytics\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: files uploaded to Nextcloud are searched through Context Chat: agent tool ask_context_chat (context_agent:ex_app/lib/all_tools/context_chat.py:28-59) and the Assistant's Context Chat form with indexing notice (assistant:src/components/ContextChat/ContextChatInputForm.vue:8). Note: Indexing lives in the context_chat app and backend (not read).", "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/datasets.py:446 create a knowledge base, datasets_document.py:384 upload documents, web/app/(commonLayout)/datasets/create; agents search it via Knowledge Retrieval (web/i18n/en-US/agent-v-2.json knowledgeRetrieval.*; dify-agent/src/dify_agent/layers/knowledge/layer.py)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/knowledge.py:318 POST /knowledge/create, file add and directories; src/routes/(app)/workspace/knowledge/[id]/+page.svelte, KnowledgeBase/AddContentMenu.svelte; attached to an agent at ModelEditor.svelte:1194; searched by tools/builtin.py:3151 query_knowledge_files", "hermes-agent": "source read at v2026.9.24, not driven: plugins/memory/retaindb/__init__.py:515-564 retaindb_upload_file, retaindb_ingest_file, retaindb_list_files with semantic search (RetainDB cloud API); plugins/memory/openviking/__init__.py:1-6 OpenViking tiered knowledge with semantic search; searched 'knowledge base|vector|embedding' for a built-in document store: none Note: Only through a bundled memory-provider plugin backed by an outside service, driven by agent tools; no upload UI or built-in knowledge base.", @@ -2562,7 +2661,7 @@ "providerHow": "read-from-code", "feature": "agent-context-system", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -2572,7 +2671,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_builder.py:1656-1668 every run loads the working directory's .hermes.md, AGENTS.md chain, CLAUDE.md and .cursorrules plus the profile SOUL.md; agent/context_references.py:1 @file:, @folder:, @git:, @url: references per message; agent/context_file_sources.py:1-6 /context lists what was loaded Note: Context follows the working directory and per-message references; there is no named, reusable bundle of files and records attached to an agent.", "dify": "source read at 1.17.1, not driven: an agent's Files are kept in its persistent working directory and available in every run (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, workingDirectory.persistentFilesTooltip; api/models/agent.py:218 AgentHomeSnapshot); knowledge retrievals attach per agent. No named bundle of files and records that can be reused across agents Note: per-agent files, not a named reusable context bundle", "open-webui": "source read at v0.11.4, not driven: per-agent bundle: ModelEditor.svelte:1194 Knowledge (knowledge bases, files, notes) stored in ModelMeta.knowledge (backend/open_webui/models/models.py:81) and injected every chat; per-project bundle: folders carry system_prompt and files applied to every chat in them (backend/open_webui/utils/middleware.py:2591-2602)", - "n8n": "source read at n8n@2.40.7, not driven: per-agent knowledge files and instructions travel with the agent (packages/cli/src/modules/agents/agent-knowledge.controller.ts:36-48, en.json:7925); the instance-wide Context settings page ships only Preferences, with 'Sources' and 'Skills' marked 'Coming soon' (packages/frontend/editor-ui/src/features/settings/context/views/SettingsContextView.vue:68-77, en.json:3229-3233) Note: No named, reusable bundle of files and records to attach to several agents." + "n8n": "source read at n8n@2.40.7, not driven: per-agent knowledge files and instructions travel with the agent (packages/cli/src/modules/agents/agent-knowledge.controller.ts:36-48, en.json:7925); the instance-wide Context settings page ships only Preferences, with 'Sources' and 'Skills' marked 'Coming soon' (packages/frontend/editor-ui/src/features/settings/context/views/SettingsContextView.vue:68-77, en.json:3229-3233) Note: No named, reusable bundle of files and records to attach to several agents.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Context Chat 'Selective context' picks files, folders or providers for one query (assistant:src/components/ContextChat/ContextChatInputForm.vue:25,158-162); no named bundle carried into every run." } }, { @@ -2591,7 +2691,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -2601,7 +2701,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/context_compressor.py:1-2 automatic compression summarises middle turns with an auxiliary model while head and tail stay; hermes_cli/commands.py:81 /compress with 'here [N]' and --preview", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/context_compaction.py:42 compact_messages_for_request summarises older turns past a token threshold (DEFAULT_CONTEXT_COMPACTION_PROMPT), retention % in config.py:2203; routers/chats.py:1271 POST /chats/{id}/compact manual; event chat.compacted", "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/runtime/compaction.py:16-44 TieredCompaction clears old tool results then SummarizingCompaction keeps the last 20 messages and summarises older ones, wired in dify-agent/src/dify_agent/runtime/runner.py:365,402 Note: Agent v2 only; classic apps use a token window (api/core/memory/token_buffer_memory.py) without summarising", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/runtime/memory/memory-orchestrator.ts:615-650 observations stand in for older messages once an observer model has summarised them (observation-log-observer.ts:166 runObservationLogObserver, thresholds in packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:42-51); workflows only window history (packages/@n8n/nodes-langchain/nodes/memory/MemoryBufferWindow) Note: Summarising needs the opt-in Agents module; workflow memory nodes truncate instead." + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/runtime/memory/memory-orchestrator.ts:615-650 observations stand in for older messages once an observer model has summarised them (observation-log-observer.ts:166 runObservationLogObserver, thresholds in packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:42-51); workflows only window history (packages/@n8n/nodes-langchain/nodes/memory/MemoryBufferWindow) Note: Summarising needs the opt-in Agents module; workflow memory nodes truncate instead.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: older turns are cut, not summarised: history capped at 42 non-tool messages and old tool outputs truncated to 2000 chars (context_agent:ex_app/lib/nc_model.py:87-89,104-148); plain chat sends the last N messages (admin setting, assistant:src/components/AdminSettings.vue:167-178)." } }, { @@ -2620,7 +2721,7 @@ "providerHow": "read-from-code", "feature": "knowledge-graph", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -2630,7 +2731,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'record|relation|knowledge graph|graph traversal' in agent/ and tools/: agent/learning_graph.py:1-6 only draws a desktop graph of learned skills and memory chunks; plugins/memory/holographic/__init__.py:1-3 resolves entities in stored facts but offers no link-following over records Note: No record store, so nothing to follow links across.", "dify": "source read at 1.17.1, not driven: searched 'knowledge.?graph|graph_rag|graphrag' in api/core/rag and web/i18n/en-US: no hits; retrieval is vector, full-text, hybrid and parent-child chunks (api/core/rag/retrieval). A neo4j query tool exists only as an official marketplace plugin (tools/neo4j)", "open-webui": "source read at v0.11.4, not driven: searched 'graph|relation|link' in backend/open_webui/retrieval and tools/builtin.py: retrieval is vector plus BM25 hybrid search over chunks; no entity or record relationship graph an agent can walk", - "n8n": "source read at n8n@2.40.7, not driven: searched 'knowledge graph|graph|relation' in packages/cli/src/modules/agents, packages/@n8n/agents/src and packages/@n8n/nodes-langchain/nodes: no graph of related records for agents to follow (agent-dependency-index.service.ts tracks config dependencies, not data); no Neo4j or graph store node in packages/nodes-base/nodes" + "n8n": "source read at n8n@2.40.7, not driven: searched 'knowledge graph|graph|relation' in packages/cli/src/modules/agents, packages/@n8n/agents/src and packages/@n8n/nodes-langchain/nodes: no graph of related records for agents to follow (agent-dependency-index.service.ts tracks config dependencies, not data); no Neo4j or graph store node in packages/nodes-base/nodes", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'relation|graph|link' in context_agent:ex_app and assistant:lib: no record relation model; the agent's graph is the LangGraph loop (context_agent:ex_app/lib/graph.py)." } }, { @@ -2650,7 +2752,7 @@ "providerHow": "read-from-code", "feature": "agent-object-leaf", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -2660,7 +2762,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; no record or object-on-screen concept in agent/prompt_builder.py context sources (agent/prompt_builder.py:1656-1661)", "dify": "source read at 1.17.1, not driven: searched 'record|object context|linked records' in api/core/app and dify-agent/src: an answer is grounded only in knowledge retrieval and inputs the caller passes (web/public/embed.js:93 inputs); nothing resolves the record on screen or follows its links", "open-webui": "source read at v0.11.4, not driven: searched 'record|object|linked' in backend/open_webui/utils/middleware.py and tools/builtin.py: there is no record model or 'record on screen' context; grounding is only on attached files, knowledge and notes", - "n8n": "source read at n8n@2.40.7, not driven: searched 'record context|objectId|current record|on screen' in packages/cli/src/modules/agents, chat-hub and packages/frontend/editor-ui/src/features/ai: agents get no host-app record or its linked records; grounding is only in uploaded knowledge files or vector stores" + "n8n": "source read at n8n@2.40.7, not driven: searched 'record context|objectId|current record|on screen' in packages/cli/src/modules/agents, chat-hub and packages/frontend/editor-ui/src/features/ai: agents get no host-app record or its linked records; grounding is only in uploaded knowledge files or vector stores", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'current|context' in assistant:src/assistant.js and lib: the chat receives no record from the page on screen, only attachments the user adds (assistant:src/components/ChattyLLM/InputArea.vue:160-173)." } }, { @@ -2679,7 +2782,7 @@ "providerHow": "read-from-code", "feature": "web-research-tool", "featureConfidence": "low", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", @@ -2690,7 +2793,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/knowledge.py:697 external knowledge connections to existing Qdrant, Milvus or pgvector collections (src/lib/components/admin/Settings/ExternalKnowledge.svelte:469-471); OneDrive/SharePoint and Google Drive only as one-time file pickers (chat/MessageInput/InputMenu.svelte:399, :707); live SharePoint/wiki sync is the separate oikb project (README.md:98) Note: no live SharePoint or wiki connector in core", "hermes-agent": "source read at v2026.9.24, not driven: optional-mcps/atlassian/manifest.yaml:1-9 Nous-approved catalog entry for Confluence pages and Jira; optional-mcps/notion, microsoft-learn, deepwiki; skills/productivity/notion bundled skill; plugin-catalog/microsoft365.yaml:1-5 SharePoint and OneDrive via a community plugin Note: SharePoint only through a community catalog plugin; wikis such as Confluence and Notion through core catalog MCP entries.", "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/external.py:153,339 connect an external knowledge API as a dataset; api/controllers/console/datasets/data_source.py:228,417 Notion import and sync in core; website crawl datasets/website.py:32; SharePoint and Confluence via official datasource plugins (langgenius/dify-official-plugins datasources/sharepoint_datasource, confluence_datasource) Note: SharePoint itself is a marketplace plugin; Notion wiki and the external-KB API are core", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Microsoft/SharePoint/v2/actions/versionDescription.ts:26 and packages/nodes-base/nodes/Notion/v2/VersionDescription.ts:26 usableAsTool, Confluence node (packages/nodes-base/nodes/Confluence); Agents module connects outside vector stores Pinecone, Qdrant, Supabase, Postgres (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:305-371, en.json:7956-7958)" + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Microsoft/SharePoint/v2/actions/versionDescription.ts:26 and packages/nodes-base/nodes/Notion/v2/VersionDescription.ts:26 usableAsTool, Confluence node (packages/nodes-base/nodes/Confluence); Agents module connects outside vector stores Pinecone, Qdrant, Supabase, Postgres (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:305-371, en.json:7956-7958)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no SharePoint or wiki connector; outside sources only through admin-configured MCP servers (context_agent:ex_app/lib/all_tools/mcp.py) or other apps' unified search providers (context_agent:ex_app/lib/all_tools/search.py). Context Chat content providers are Nextcloud apps (context_chat.py:16-26)." } }, { @@ -2709,7 +2813,7 @@ "providerHow": "read-from-code", "feature": "skills-catalog", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -2719,7 +2823,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:38 `hermes skills browse` (paginated, filter by source) and :46 search across registries (tools/skills_hub_*.py: official, GitHub, skills.sh, ClawHub); web/src/i18n/en.ts skills.browseHub 'Browse skills hub' on web/src/pages/SkillsPage.tsx:140 hub view", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/skills/page.tsx workspace Skills library; api/controllers/console/workspace/skills.py:296 list with search by name or description and tags (web/i18n/en-US/skill.json skillManagement.searchPlaceholder, tags); agents add from it (agent-v-2.json skills.addMenu.workspace 'Add from library') Note: a workspace library, not a public catalogue", "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/workspace/skills/+page.svelte and src/lib/components/workspace/Skills.svelte list every skill the user can read, with search, enable state and owner; backend/open_webui/routers/skills.py:63 GET /skills/list with access grants Note: org-internal catalogue; no public skill store link like the one for models and tools", - "n8n": "source read at n8n@2.40.7, not driven: skills exist per agent only (packages/cli/src/modules/agents/agents-skills.controller.ts:21-82 CRUD under one agent); the shared place for skills is a placeholder, packages/frontend/editor-ui/src/features/settings/context/views/SettingsContextView.vue:68-71 'Skills' row with 'Coming soon' (en.json:3231-3232); searched 'catalog|marketplace|registry' in agents-skills.controller.ts and agent-skills.service.ts: none Note: Skills can be written or imported per agent, but there is nothing to browse." + "n8n": "source read at n8n@2.40.7, not driven: skills exist per agent only (packages/cli/src/modules/agents/agents-skills.controller.ts:21-82 CRUD under one agent); the shared place for skills is a placeholder, packages/frontend/editor-ui/src/features/settings/context/views/SettingsContextView.vue:68-71 'Skills' row with 'Coming soon' (en.json:3231-3232); searched 'catalog|marketplace|registry' in agents-skills.controller.ts and agent-skills.service.ts: none Note: Skills can be written or imported per agent, but there is nothing to browse.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skills are listed via GET /api/v1/skills merging personal and admin global skills (assistant:lib/Service/AgentSkillsService.php:65-90) and shown to the agent in its prompt (context_agent:ex_app/lib/agent.py:165-177). No browsing UI; users see the SKILL.md folders in Files. Note: Skills added in assistant 4.0.0 / context_agent 2.8.0." } }, { @@ -2738,7 +2843,7 @@ "providerHow": "read-from-code", "feature": "skills-catalog", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -2748,7 +2853,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:54 `hermes skills install `; web/src/pages/SkillsPage.tsx:140 hub view with install; hermes_cli/commands.py:217 /skills install in chat; tools/skills_hub_install.py", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:811 /workspaces/current/agents//skills binds library skills to an agent; web/i18n/en-US/agent-v-2.json skills.addMenu.workspace 'Add from library' and skills.addMenu.upload 'Upload skill.zip' (embedded), limit of 20 library skills per agent (skills.workspaceSelector.limitReached)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1202 SkillsSelector attaches a skill to an agent in one pick; users can also pull a skill into one chat with the '$' mention (src/lib/components/chat/MessageInput/Commands/Skills.svelte, backend/open_webui/utils/skills.py:23 extract_skill_ids_from_messages)", - "n8n": "source read at n8n@2.40.7, not driven: en.json:8062-8063 'Upload SKILL.md' and 'Upload folder' in the agent's Skills section (packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts), saved by packages/cli/src/modules/agents/agents-skills.controller.ts:40 POST /:agentId/skills Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: en.json:8062-8063 'Upload SKILL.md' and 'Upload folder' in the agent's Skills section (packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts), saved by packages/cli/src/modules/agents/agents-skills.controller.ts:40 POST /:agentId/skills Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a skill is installed by placing a SKILL.md folder in 'Context Agent/Skills' (assistant:lib/Service/AgentSkillsService.php:31) or by the agent's store_skill (context_agent:ex_app/lib/all_tools/skills.py:115-180); admins set a global folder (assistant:src/components/AdminSettings.vue:183-214). No one-action install from a catalogue." } }, { @@ -2767,7 +2873,7 @@ "providerHow": "read-from-code", "feature": "skills-catalog", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -2777,7 +2883,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_tool.py:613 reads metadata.hermes.* (agentskills.io) tags and related_skills and :645 agentskills.io optional compatibility field; tools/skill_manager_tool.py:1-7 SKILL.md + references/ templates/ scripts/ assets/ layout; hermes_cli/subcommands/skills.py:148 publish to GitHub or ClawHub", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/skill.json emptyAction.importDescription 'Bring a .zip with SKILL.md, in the agentskills.io format', errors.missingSkillMd; api/controllers/console/workspace/skills.py:385 import and :494 export of the package; agent-v-2.json skills.upload.warning.specification 'must follow the Agent Skills specification'", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Skills.svelte:272 import accepts .md, :306-312 parses SKILL.md frontmatter; backend/open_webui/utils/terminals.py:247 get_terminal_skill reads .agents/skills//SKILL.md directories with resources (:276); utils/skills.py:37 authoring standards (name, description frontmatter, scripts/ references/ assets/) Note: DB skills are single-file; full skill folders only through Open Terminal", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts reads SKILL.md with YAML frontmatter name and description plus markdown references (en.json:8064-8080), but :56-57 rejects a scripts/ folder, en.json:8070 'Scripts aren't supported for skills yet' Note: Imports agentskills.io-style SKILL.md without scripts. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts reads SKILL.md with YAML frontmatter name and description plus markdown references (en.json:8064-8080), but :56-57 rejects a scripts/ folder, en.json:8070 'Scripts aren't supported for skills yet' Note: Imports agentskills.io-style SKILL.md without scripts. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skills follow the agentskills.io layout: folder with SKILL.md and YAML frontmatter name/description (context_agent:ex_app/lib/all_tools/skills.py:15-18, assistant:lib/Service/AgentSkillsService.php:33-37,156)." } }, { @@ -2796,7 +2903,7 @@ "providerHow": "read-from-code", "feature": "skill-self-improvement", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -2806,7 +2913,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/background_review.py:1-6 after each turn a forked agent asks whether any skill should be updated and patches it via skill_manage; hermes_cli/commands.py:124 /refine reviews the conversation and saves lessons to skills; agent/curator.py:1-7 curator may patch skills", "dify": "source read at 1.17.1, not driven: in Build mode the agent edits its own skills and files from the build conversation and holds them as a build draft to Apply (agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you'; api/controllers/console/agent/roster.py:876,941); the Skill Builder rewrites a skill on request (api/controllers/console/workspace/skills.py:516 assist/messages). Nothing proposes improvements from production runs Note: improves from the builder's build chat, not from what it learned in runs", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:35 SKILLS_CREATE_RE '/skills:create' makes the model distill the current chat into a SKILL.md and save it (:81-115), which can rewrite an existing skill; it runs only when a user types the command and needs an Open Terminal (:133); searched 'improve|propose|revision' in utils/skills.py and routers/skills.py: no agent-initiated proposals", - "n8n": "source read at n8n@2.40.7, not driven: improvement runs through the builder assistant on request: en.json:653,657 'Fix with Assistant' sends failed tool calls from a preview to the builder, and eval reviews 'Send feedback to assistant' (en.json:8313); searched 'improve|propose' in packages/cli/src/modules/agents and packages/@n8n/agents/src/runtime/skills: no agent proposing skill revisions from its own runs Note: A person triggers the fix; the agent does not propose skill updates itself. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: improvement runs through the builder assistant on request: en.json:653,657 'Fix with Assistant' sends failed tool calls from a preview to the builder, and eval reviews 'Send feedback to assistant' (en.json:8313); searched 'improve|propose' in packages/cli/src/modules/agents and packages/@n8n/agents/src/runtime/skills: no agent proposing skill revisions from its own runs Note: A person triggers the fix; the agent does not propose skill updates itself. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: store_skill can overwrite an existing skill ('created'|'overwritten', assistant:lib/Service/AgentSkillsService.php:187,218) but the prompt limits it to explicit user requests (context_agent:ex_app/lib/agent.py:178-182). No proposal from run learnings." } }, { @@ -2825,7 +2933,7 @@ "providerHow": "read-from-code", "feature": "skill-self-improvement", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -2835,7 +2943,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/write_approval.py:1-9 skills.write_approval stages agent skill writes under pending/skills/.json with a difflib diff; hermes_cli/commands.py:217-221 /skills pending|diff|approve|reject|approval; hermes_cli/write_approval_commands.py:1 Note: Off by default; the operator switches the gate on.", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/build-draft-changes-panel.tsx lists changed sections as Updated/Rewritten with Apply or Discard (build-draft-bar.tsx; roster.py:932 DELETE build-draft, :941 apply); skill drafts publish or restore (skills.py:678,703). Searched 'diff|compare' in web/i18n/en-US/skill.json and agent-v-2.json: no side-by-side difference Note: accept or reject yes, a visible diff no", "open-webui": "source read at v0.11.4, not driven: searched 'draft|diff|review|version|history' in backend/open_webui/routers/skills.py and models/skills.py: skills are edited in place (routers/skills.py:274 update); no proposed-change queue, diff or accept/reject (prompts have versions at routers/prompts.py:384, skills do not)", - "n8n": "source read at n8n@2.40.7, not driven: builder edits land in a draft; the owner can preview, publish or 'Revert changes' to the published version (en.json:7765, packages/cli/src/modules/agents/agent-publish.controller.ts:21-111 publish, revert, versions); searched 'diff' in packages/frontend/editor-ui/src/features/agents: no side-by-side diff of a skill change Note: Accept or reject happens at agent level by publishing or reverting, without a diff. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: builder edits land in a draft; the owner can preview, publish or 'Revert changes' to the published version (en.json:7765, packages/cli/src/modules/agents/agent-publish.controller.ts:21-111 publish, revert, versions); searched 'diff' in packages/frontend/editor-ui/src/features/agents: no side-by-side diff of a skill change Note: Accept or reject happens at agent level by publishing or reverting, without a diff. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: store_skill is a dangerous tool, so the user sees skill name, description and content in the confirmation card before it is written (assistant:src/components/ChattyLLM/AgencyAction.vue:6-17, AgencyConfirmation.vue:10-30). No diff against the old version." } }, { @@ -2854,7 +2963,7 @@ "providerHow": "read-from-code", "feature": "autonomous-skill-creation", "featureConfidence": "low", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -2864,7 +2973,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/background_review.py:463 'CREATE A NEW CLASS-LEVEL UMBRELLA SKILL when no existing skill covers the class' in the post-turn review prompt; tools/skill_manager_tool.py:1-5 new skills land in ~/.hermes/skills/; hermes_cli/commands.py:232 /learn builds a skill on request", "dify": "source read at 1.17.1, not driven: agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you': the agent writes skills while the builder chats in Build mode (roster.py:846 build-draft/checkout); searched 'auto.?create|learn|after solving' in dify-agent/src: no path where an agent writes a skill on its own after a production run Note: only inside a builder-driven Build session", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:81 _build_skill_create_prompt, default request 'the workflow we just went through in this conversation ... distill them into a reusable skill' (:84-86); triggered only by the user's /skills:create command and saved to the Open Terminal (:108), not on the agent's own initiative", - "n8n": "source read at n8n@2.40.7, not driven: skills are created by the builder assistant only when a person asks (packages/cli/src/modules/agents/builder/skills/target-skills.skill.ts:9-19 create_skills; builder/agents-builder-prompts.ts:215); searched 'create_skills|write_skill' in packages/@n8n/agents/src: no runtime tool letting an agent write its own skill after a task" + "n8n": "source read at n8n@2.40.7, not driven: skills are created by the builder assistant only when a person asks (packages/cli/src/modules/agents/builder/skills/target-skills.skill.ts:9-19 create_skills; builder/agents-builder-prompts.ts:215); searched 'create_skills|write_skill' in packages/@n8n/agents/src: no runtime tool letting an agent write its own skill after a task", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent may store a skill on its own only when the user describes 'a clearly reusable procedure' (context_agent:ex_app/lib/agent.py:178-182), still behind confirmation (context_agent:ex_app/lib/all_tools/skills.py:116)." } }, { @@ -2883,7 +2993,7 @@ "providerHow": "read-from-code", "feature": "skills-marketplace", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", @@ -2893,7 +3003,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/curator.py:1-7 inactivity-triggered curator runs every interval_hours, archives stale skills (never deletes), consolidates duplicates into umbrella skills, honours pins; hermes_cli/curator.py:98-163 `hermes curator` status/run --consolidate; hermes_cli/commands.py:245 /curator pin|archive|list-archived Note: The LLM merge pass is opt-in (curator.consolidate); archiving runs by default.", "dify": "source read at 1.17.1, not driven: searched 'curator|merge skill|duplicate skill|archive unused|stale' in api/services/skill_management_service.py, api/schedule and web/i18n/en-US/skill.json: only manual duplicate and delete (api/controllers/console/workspace/skills.py:474, skill.json deleteDialog); no scheduled merge or archive", "open-webui": "source read at v0.11.4, not driven: searched 'curator|merge|archive|dedupe|unused' in backend/open_webui/routers/skills.py, models/skills.py, utils/skills.py and utils/automations.py: no scheduled job that merges or archives skills", - "n8n": "source read at n8n@2.40.7, not driven: searched 'curator|archive|merge|unused' in packages/cli/src/modules/agents/agent-skills.service.ts, agents-skills.controller.ts and packages/@n8n/agents/src/runtime/skills: no scheduled merging of duplicate skills or archiving of unused ones" + "n8n": "source read at n8n@2.40.7, not driven: searched 'curator|archive|merge|unused' in packages/cli/src/modules/agents/agent-skills.service.ts, agents-skills.controller.ts and packages/@n8n/agents/src/runtime/skills: no scheduled merging of duplicate skills or archiving of unused ones", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'merge|archive|duplicate|curat' in assistant:lib/Service/AgentSkillsService.php and context_agent:ex_app/lib/all_tools/skills.py: none." } }, { @@ -2912,7 +3023,7 @@ "providerHow": "read-from-code", "feature": "skill-maturity", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -2922,7 +3033,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/skill_usage.py:1-6 per-skill use counts, provenance (bundled, hub, agent-created) and lifecycle active -> stale -> archived; web/src/i18n/en.ts analytics.topSkills with loads, edits, last used on AnalyticsPage; hermes_cli/subcommands/skills.py:28 trust/untrust and :85 audit (security scan verdicts) Note: Signals exist (usage, lifecycle, trust, scan) but no maturity or proven rating shown per skill before use.", "dify": "source read at 1.17.1, not driven: searched 'maturity|proven|rating|success rate|eval' in web/i18n/en-US/skill.json and api/services/skill_management_service.py: a skill shows only draft/published state, version number and 'Used by N agents' (skill.json detail.referencedBy_one, referenceCount); no maturity or proof signal Note: usage count is the only trust hint", "open-webui": "source read at v0.11.4, not driven: searched 'maturity|usage count|rating|verified|stable' in backend/open_webui/models/skills.py, routers/skills.py and src/lib/components/workspace/Skills*: a skill has name, description, content, meta, is_active (models/skills.py:20-32), no maturity or proof signal", - "n8n": "source read at n8n@2.40.7, not driven: searched 'maturity|proven|usage count|success rate' in packages/cli/src/modules/agents/agent-skills.service.ts, agents-skills.controller.ts and packages/frontend/editor-ui/src/features/agents/components/AgentSkill*.vue: a skill has name, description, instructions, allowed tools and references only" + "n8n": "source read at n8n@2.40.7, not driven: searched 'maturity|proven|usage count|success rate' in packages/cli/src/modules/agents/agent-skills.service.ts, agents-skills.controller.ts and packages/frontend/editor-ui/src/features/agents/components/AgentSkill*.vue: a skill has name, description, instructions, allowed tools and references only", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skill metadata is name and description only (assistant:lib/Service/AgentSkillsService.php:37); no usage or maturity data." } }, { @@ -2941,7 +3053,7 @@ "providerHow": "read-from-code", "feature": "skill-self-improvement", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -2951,7 +3063,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:112 `skills diff` against the stock bundled version and :94 reset; agent/curator_backup.py:1-6 tar.gz snapshot of the whole skills tree before each curator pass with rollback; tools/write_approval.py:1-9 staged diffs for pending writes Note: No per-skill version history; rollback is whole-tree curator snapshots and compare is only against the bundled stock copy.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:743,758 versions list and detail, :703 restore a version to draft; web/i18n/en-US/skill.json detail.versions, versionPublishNote, restoreVersion. Searched 'compare|diff' in skill.json: no comparison of two versions Note: history and rollback yes, compare no", "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/skills.py and routers/skills.py: updates overwrite content (routers/skills.py:274); version history exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)", - "n8n": "source read at n8n@2.40.7, not driven: skills live inside the agent config, so they ride the agent's publish history: packages/cli/src/modules/agents/agent-publish.controller.ts:87-111 revert-to-version and GET versions, en.json:7780-7797 'Publish history', 'Revert to this version'; searched 'diff|compare' in packages/frontend/editor-ui/src/features/agents: no comparison of two versions and no per-skill history Note: Roll back yes, compare no, and only at agent level. Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: skills live inside the agent config, so they ride the agent's publish history: packages/cli/src/modules/agents/agent-publish.controller.ts:87-111 revert-to-version and GET versions, en.json:7780-7797 'Publish history', 'Revert to this version'; searched 'diff|compare' in packages/frontend/editor-ui/src/features/agents: no comparison of two versions and no per-skill history Note: Roll back yes, compare no, and only at agent level. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no skill versioning in the Assistant; SKILL.md is an ordinary Nextcloud file (assistant:lib/Service/AgentSkillsService.php:233-239), so server file versions apply (files_versions, not read)." } }, { @@ -2970,7 +3083,7 @@ "providerHow": "read-from-code", "feature": "skills-marketplace", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", @@ -2980,7 +3093,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:165-171 `skills tap add owner/repo` adds a GitHub repo as a skill source; tools/skills_hub_github.py search and install; hermes_cli/subcommands/skills.py:148-153 `skills publish --to github --repo`", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 import takes only an uploaded zip (request.files['file']); searched 'github|repository|publish to' in api/services/skill_management_service.py and skill.json: no GitHub discovery, install or publish", "open-webui": "source read at v0.11.4, not driven: searched 'github|url' in backend/open_webui/routers/skills.py: no URL or GitHub install and no publish; GitHub raw loading exists only for tools and functions (routers/tools.py:247 github_url_to_raw_url, :264 /tools/load/url)", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts imports a local SKILL.md file or folder only (en.json:8062-8063); searched 'github' in that file and in packages/cli/src/modules/agents/agents-skills.controller.ts: no GitHub search, install or publish" + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts imports a local SKILL.md file or folder only (en.json:8062-8063); searched 'github' in that file and in packages/cli/src/modules/agents/agents-skills.controller.ts: no GitHub search, install or publish", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'github|git' in assistant:lib and context_agent:ex_app: none." } }, { @@ -2999,7 +3113,7 @@ "providerHow": "read-from-code", "feature": "skill-learnings", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", @@ -3009,7 +3123,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:319-322 corrections for a kind of work belong in that task's skill via skill_manage; agent/background_review.py:1-6 post-turn review patches the skill with the lesson; hermes_cli/commands.py:124 /refine saves lessons to memory/skills Note: Old partial; the review loop writes lessons into skills.", "dify": "source read at 1.17.1, not driven: searched 'lesson|learning|rule' in dify-agent/src, api/services/skill_management_service.py and web/i18n/en-US/skill.json: no mechanism that turns repeated run lessons into skill rules; the build note (agent-v-2.json files.buildNote) records build-session setup only", "open-webui": "source read at v0.11.4, not driven: searched 'learning|lesson|rule' in backend/open_webui/utils/skills.py, utils/memory.py and routers/skills.py: run lessons go to per-user memory (utils/memory.py:410), never into a skill's rules", - "n8n": "source read at n8n@2.40.7, not driven: lessons from runs go into episodic memory, not into skill rules (packages/@n8n/agents/src/runtime/memory/episodic-memory.ts, observation-log-reflector.ts); searched 'learning|lesson|rule' in packages/cli/src/modules/agents/agent-skills.service.ts and packages/@n8n/agents/src/runtime/skills/active-skills.ts: nothing writes back to a skill" + "n8n": "source read at n8n@2.40.7, not driven: lessons from runs go into episodic memory, not into skill rules (packages/@n8n/agents/src/runtime/memory/episodic-memory.ts, observation-log-reflector.ts); searched 'learning|lesson|rule' in packages/cli/src/modules/agents/agent-skills.service.ts and packages/@n8n/agents/src/runtime/skills/active-skills.ts: nothing writes back to a skill", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'learn|lesson|rule' in skills code (assistant:lib/Service/AgentSkillsService.php, context_agent:ex_app/lib/all_tools/skills.py): none." } }, { @@ -3028,7 +3143,7 @@ "providerHow": "read-from-code", "feature": "skills-catalog", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -3038,7 +3153,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/skills_hub.py:1260-1280 `skills snapshot export` writes only hub identifiers and taps to JSON; hermes_cli/subcommands/profile.py:115 profile export carries all skills; hermes_cli/subcommands/skills.py:148 publish to GitHub/ClawHub; skills are plain SKILL.md folders on disk Note: No single-skill export action; a skill is exported by copying its folder, publishing it, or exporting the whole profile.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:494 /workspaces/current/skills//export returns the skill package; single files downloadable (web/i18n/en-US/skill.json detail.downloadFile)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/skills.py:123 GET /skills/export; src/lib/components/workspace/Skills/SkillMenu.svelte:16 per-skill Export, Skills.svelte:91 Export JSON (permission workspace.skills_export) Note: exports JSON, not SKILL.md", - "n8n": "source read at n8n@2.40.7, not driven: the agent's 'Export JSON' (packages/frontend/editor-ui/src/features/agents/views/AgentBuilderView.vue:1413,1466-1475) writes the agent config, in which a skill is only a {type:'skill', id} reference (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:189-198); searched 'export|download' in AgentSkillViewer.vue and AgentSkillModal.vue: no skill file export" + "n8n": "source read at n8n@2.40.7, not driven: the agent's 'Export JSON' (packages/frontend/editor-ui/src/features/agents/views/AgentBuilderView.vue:1413,1466-1475) writes the agent config, in which a skill is only a {type:'skill', id} reference (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:189-198); searched 'export|download' in AgentSkillViewer.vue and AgentSkillModal.vue: no skill file export", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no export action; each skill is a SKILL.md file in the user's Files (assistant:lib/Service/AgentSkillsService.php:31-33) that can be downloaded there." } }, { @@ -3057,7 +3173,7 @@ "providerHow": "read-from-code", "feature": "skills-marketplace", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", @@ -3067,7 +3183,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:54-58 install takes a registry identifier or a direct HTTP(S) URL to a SKILL.md; :165-171 taps add any GitHub repo as a source; tools/skills_hub_sources.py", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 the only import path is a multipart zip upload; searched 'url|source address|remote' in the skill import payload and skill.json: no install from an outside address", "open-webui": "source read at v0.11.4, not driven: skills import from a local .md or .json file (src/lib/components/workspace/Skills.svelte:272) and are read live from an attached Open Terminal's .agents/skills folder (backend/open_webui/utils/terminals.py:263 GET {terminal}/skills/{name}); searched 'url|load' in routers/skills.py: no install from an outside address", - "n8n": "source read at n8n@2.40.7, not driven: skill import reads files the user selects (packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts, en.json:8062-8065); searched 'url|fetch(' in that file and 'source' in packages/cli/src/modules/agents/agents-skills.controller.ts: no install from an outside address" + "n8n": "source read at n8n@2.40.7, not driven: skill import reads files the user selects (packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts, en.json:8062-8065); searched 'url|fetch(' in that file and 'source' in packages/cli/src/modules/agents/agents-skills.controller.ts: no install from an outside address", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'url|download|http' in assistant:lib/Service/AgentSkillsService.php: skills come only from the user's or the admin's folder." } }, { @@ -3086,7 +3203,7 @@ "providerHow": "read-from-code", "feature": "agent-evals", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -3096,7 +3213,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'eval|with and without|baseline' in tools/skill*.py, hermes_cli/subcommands/skills.py and optional-skills/*/SKILL.md: no skill test-case runner; tools/skillevaluator_scan.py:1-7 is an advisory security scan on install; evals/ holds developer regression harnesses (evals/compaction, evals/tool_search ...) with no user surface", "dify": "source read at 1.17.1, not driven: searched 'evaluation|eval_set|test case' in api/controllers and web/i18n/en-US: only tracing-provider blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix 'evaluation') and dataset hit testing; no run of a skill against cases with and without it", "open-webui": "source read at v0.11.4, not driven: searched 'eval|test case|benchmark' in backend/open_webui/routers/skills.py, utils/skills.py and routers/evaluations.py: evaluations compare models by user feedback and arena ELO (routers/evaluations.py:222 leaderboard), nothing runs a skill against test cases with and without it", - "n8n": "source read at n8n@2.40.7, not driven: test-case runs exist for workflows (packages/cli/src/evaluation.ee/test-runs.controller.ee.ts, Evaluation nodes in packages/nodes-base/nodes/Evaluation) and for Agents-module agents (packages/cli/src/modules/agent-evals/agent-evals.controller.ts, gated per user by PostHog flag in agent-evals-flag-gate.ts:17-24); searched 'with and without|baseline|skill' in packages/cli/src/modules/agent-evals: no with/without-skill comparison Note: Workflow evaluations count against the licence quota quota:evaluations:maxWorkflows (packages/@n8n/constants/src/index.ts:73); agent evals are an opt-in module behind a rollout flag." + "n8n": "source read at n8n@2.40.7, not driven: test-case runs exist for workflows (packages/cli/src/evaluation.ee/test-runs.controller.ee.ts, Evaluation nodes in packages/nodes-base/nodes/Evaluation) and for Agents-module agents (packages/cli/src/modules/agent-evals/agent-evals.controller.ts, gated per user by PostHog flag in agent-evals-flag-gate.ts:17-24); searched 'with and without|baseline|skill' in packages/cli/src/modules/agent-evals: no with/without-skill comparison Note: Workflow evaluations count against the licence quota quota:evaluations:maxWorkflows (packages/@n8n/constants/src/index.ts:73); agent evals are an opt-in module behind a rollout flag.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'eval|test case' in both repos' runtime code: none (unit tests only cover parsing, assistant:tests/unit/Service/AgentSkillsServiceTest.php)." } }, { @@ -3116,7 +3234,7 @@ "providerHow": "read-from-code", "feature": "taskprocessing-consume-ui", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -3126,7 +3244,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: plugins/model-providers/ ships anthropic, azure-foundry, bedrock, gemini, vertex, deepseek, openrouter, xai, nvidia, huggingface and 30 more provider plugins; hermes_cli/subcommands/model.py `hermes model`; web/src/pages/ModelsPage.tsx and ProfilesPage.tsx:673 model picker Note: Mistral via OpenRouter or a custom endpoint; no dedicated Mistral plugin directory.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/model_providers.py:148,200 provider list and credentials; web/i18n/en-US/common.json:378-379 'Please install a model provider first ... from the Marketplace': core ships no provider, OpenAI, Anthropic, Mistral etc. are official plugins (langgenius/dify-official-plugins models/openai, anthropic, mistralai, ...) Note: every provider is a marketplace plugin run by the plugin daemon; old yes rested on a feature line", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/ ships chat model nodes for OpenAI (LMChatOpenAi), Anthropic (LMChatAnthropic), Mistral (LmChatMistralCloud), Google Gemini/Vertex, AWS Bedrock, Azure OpenAI, Cohere, DeepSeek, Groq, xAI, OpenRouter and more (26 directories)", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:129 native Anthropic model listing and :485 anthropic-version headers (utils/anthropic.py), :208 Azure AD auth, :890 Azure; any OpenAI-compatible provider such as OpenAI, Mistral, Groq, OpenRouter (README.md:28); admin UI src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte Note: old partial rested on a feature row; the code connects OpenAI, Anthropic natively and Mistral through the compatible API" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:129 native Anthropic model listing and :485 anthropic-version headers (utils/anthropic.py), :208 Azure AD auth, :890 Azure; any OpenAI-compatible provider such as OpenAI, Mistral, Groq, OpenRouter (README.md:28); admin UI src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte Note: old partial rested on a feature row; the code connects OpenAI, Anthropic natively and Mistral through the compatible API", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant and agent call the instance's TaskProcessing task types (context_agent:ex_app/lib/nc_model.py:27,170-179); commercial providers are connected in integration_openai, which the admin page links (assistant:src/components/AdminSettings.vue:70-77). That app is not read." } }, { @@ -3145,14 +3264,14 @@ "providerHow": "read-from-code", "feature": "taskprocessing-consume-ui", "featureConfidence": "high", - "nextcloud-assistant": "yes", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31885 \"Local model backend: Runs against local LLM ExApp / Ollama-compatible backends\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: model calls go through the server's TaskProcessing, and the admin page links the local LLM app llm2 (assistant:src/components/AdminSettings.vue:64-66). llm2 and Ollama support sit in other apps, not read.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 Ollama native /api/tags probe and LM Studio /api/v1/models with load-on-demand; hermes_cli/web_routers/local_models.py dashboard routes", "dify": "source read at 1.17.1, not driven: no local runtime in core (web/i18n/en-US/common.json:378 install a provider first); official plugins models/ollama, localai, xinference, openllm, triton_inference_server, huggingface_tei in langgenius/dify-official-plugins Note: marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/ollama.py full Ollama proxy with pull/manage (src/lib/components/admin/Settings/Connections/ManageOllamaModal.svelte), load balancing across URLs (:863 random.choice); openai.py:276 LM Studio provider; bundled :ollama image (README.md:26)", @@ -3183,7 +3302,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31390 \"AppAPI ExApp + Task Processing backend: Python ExApp requiring AppAPI >=3.1 and a tool-calling text2text provider (llm2 or integration_openai).\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no endpoint setting in these repos; the agent uses whatever TaskProcessing provider serves core:text2text:chatwithtools (context_agent:ex_app/lib/nc_model.py:27). OpenAI-compatible URLs are set in integration_openai (not read).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/model_setup_flows_custom.py:1-3 custom OpenAI-compatible endpoint wizard (custom_providers / providers.); plugins/model-providers/custom", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:865 GET /openai/models/{url_idx} over any configured base URL + key; src/lib/components/AddConnectionModal.svelte and admin/Settings/Connections/OpenAIConnection.svelte add arbitrary OpenAI-compatible endpoints", "dify": "source read at 1.17.1, not driven: official plugin langgenius/dify-official-plugins models/openai_api_compatible adds any OpenAI-compatible endpoint; core only provides the provider framework (api/controllers/console/workspace/model_providers.py:148) Note: marketplace plugin only", @@ -3214,7 +3333,7 @@ "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31880 \"Unified AI Task Processing GUI: Frontend for the Nextcloud Task Processing API\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent is a TaskProcessing provider that itself schedules core:text2text:chatwithtools tasks on the instance (context_agent:ex_app/lib/provider.py:20-35, nc_model.py:165-179); every Assistant feature lists the server's task types (assistant:lib/Controller/AssistantApiController.php getAvailableTaskTypes).", "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud|taskprocessing' repo-wide (excluding website/): none outside one test; no provider plugin for Nextcloud's AI task processing in plugins/model-providers/", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|taskprocessing' in api/ and web/: no hits; models come only from Dify provider plugins", "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|taskprocessing|task_processing' in backend/open_webui: no connection to Nextcloud AI task processing", @@ -3238,7 +3357,7 @@ "providerHow": "read-from-code", "feature": "taskprocessing-provide-text2text", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -3248,7 +3367,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:898 GET /api/v1/models and :1109 POST /api/v1/chat/completions (OpenAI-compatible), :2003 /api/v1/messages (Anthropic-compatible) expose every agent, custom models included, to outside clients with an API key; no Nextcloud TaskProcessing provider Note: old yes; any OpenAI-compatible client can use the agents, but nothing registers them inside Nextcloud", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions and /v1/responses serve the agent to any OpenAI client (per profile under /p//); searched 'nextcloud|taskprocessing' repo-wide: no Nextcloud provider registration Note: Another system can use Hermes as an OpenAI-compatible text model; there is no Nextcloud text-generation provider.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|text2text provider' in api/ and web/: nothing registers Dify apps as a provider for another platform's AI task framework; apps are reachable only through Dify's own service API (api/controllers/service_api/app/completion.py) and MCP (api/controllers/mcp/mcp.py:44)", - "n8n": "source read at n8n@2.40.7, not driven: agents are offered to the rest of n8n: workflows call Agents-module agents (session origin 'Workflow', en.json agentSessions.origin.workflow) and outside tools reach them through the MCP call_agent tool (packages/cli/src/modules/mcp/mcp-scopes.ts:73); searched 'chat/completions' as a served route in packages/cli/src: none, so nothing registers with Nextcloud task processing Note: Missing Nextcloud part: registering as a TaskProcessing text provider. Rewritten under the lane ruling of 2026-09-26 (was no)." + "n8n": "source read at n8n@2.40.7, not driven: agents are offered to the rest of n8n: workflows call Agents-module agents (session origin 'Workflow', en.json agentSessions.origin.workflow) and outside tools reach them through the MCP call_agent tool (packages/cli/src/modules/mcp/mcp-scopes.ts:73); searched 'chat/completions' as a served route in packages/cli/src: none, so nothing registers with Nextcloud task processing Note: Missing Nextcloud part: registering as a TaskProcessing text provider. Rewritten under the lane ruling of 2026-09-26 (was no).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent registers providers for core:contextagent:interaction and its multimodal variant (context_agent:ex_app/lib/provider.py:20-35, main.py:119-121), so any Nextcloud app can hand work to the agent through TaskProcessing; the Assistant also registers its own providers (assistant:lib/TaskProcessing/*Provider.php). Note: It is offered as an agent task type, not as plain core:text2text." } }, { @@ -3267,7 +3387,7 @@ "providerHow": "read-from-code", "feature": "agent-management-ui", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -3277,7 +3397,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/profiles.py:942 PUT /api/profiles/{name}/model per profile (web/src/pages/ProfilesPage.tsx:673); hermes_cli/config_defaults.py:1332-1338 delegation block sets a separate subagent model; hermes_cli/commands.py:157 /model per session; cron jobs carry their own model (hermes_cli/subcommands/cron.py:23 create)", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 each agent picks its own provider and model; each workflow LLM/Agent node and each classic app carries its own model config (api/controllers/console/app/model_config.py)", "n8n": "source read at n8n@2.40.7, not driven: each AI Agent node takes its own chat model sub-node (packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:46 ai_languageModel required); Agents-module agents store their own provider/model (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:446) and sub-agents can route by difficulty (:161-171); chat agents keep a model each (packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:107)", - "open-webui": "source read at v0.11.4, not driven: each workspace model has its own base_model_id and params (backend/open_webui/models/models.py:118-120; ModelEditor.svelte:856); automations pick a model per task (models/automations.py:75 model_id, src/lib/components/automations/ModelDropdown.svelte)" + "open-webui": "source read at v0.11.4, not driven: each workspace model has its own base_model_id and params (backend/open_webui/models/models.py:118-120; ModelEditor.svelte:856); automations pick a model per task (models/automations.py:75 model_id, src/lib/components/automations/ModelDropdown.svelte)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: one agent; a different provider per task type is possible because each TaskProcessing type has its own preferred provider, shown as 'Provider: {name}' (assistant:src/components/AssistantTextProcessingForm.vue:64-73). Chosen in the server AI settings (not read), not per agent." } }, { @@ -3296,7 +3417,7 @@ "providerHow": "read-from-code", "feature": "tenant-model-policy", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "yes", @@ -3306,7 +3427,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'allowed_models|model_allowlist|blocked_models' in *.py: only tools/mcp_tool_sampling.py:181 limits which models an MCP server's sampling requests may use; no organisation or tenant model in hermes_cli/profiles.py:538 ProfileInfo Note: No tenants and no model allowlist per group of agents.", "dify": "source read at 1.17.1, not driven: providers and credentials are per workspace (api/controllers/console/workspace/model_providers.py:148,200); api/controllers/console/workspace/models.py:519-545 enable/disable individual models for the workspace so its apps cannot pick them Note: per workspace; per-role model rights (permission-keys.json plugin.model_config) need enterprise RBAC", "open-webui": "source read at v0.11.4, not driven: model access is per user or group through access grants (backend/open_webui/utils/models.py:465 check_model_access, main.py:1151; admin/Settings/Models access control); searched 'tenant|organization' in backend/open_webui/routers and models: no tenant scope Note: group-level model allow-lists only; no organisation or tenant concept", - "n8n": "source read at n8n@2.40.7, not driven: Chat hub admin settings restrict providers and models instance-wide (packages/@n8n/api-types/src/chat-hub.ts:574-584 enabled and allowedModels per provider, packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:59 GlobalScope chatHub:manage); per-project node type policies can block model nodes (packages/cli/src/modules/type-availability-policies/type-availability-policy-project.controller.ts:19-24, @Licensed NODE_TYPE_POLICIES) Note: Instance-wide for chat; per-project blocking is enterprise-licensed and in a module not loaded by default; no organisation tenancy." + "n8n": "source read at n8n@2.40.7, not driven: Chat hub admin settings restrict providers and models instance-wide (packages/@n8n/api-types/src/chat-hub.ts:574-584 enabled and allowedModels per provider, packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:59 GlobalScope chatHub:manage); per-project node type policies can block model nodes (packages/cli/src/modules/type-availability-policies/type-availability-policy-project.controller.ts:19-24, @Licensed NODE_TYPE_POLICIES) Note: Instance-wide for chat; per-project blocking is enterprise-licensed and in a module not loaded by default; no organisation tenancy.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'model|provider' policy settings in assistant:lib/Settings and context_agent:ex_app/lib/main.py: no per-organisation model limit." } }, { @@ -3326,7 +3448,7 @@ "providerHow": "read-from-code", "feature": "a-provider-and-a-place-per-ai-feature", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -3336,7 +3458,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:715-790 auxiliary. provider/model per feature: vision, compression, approval, title_generation, curator, kanban_decomposer, profile_describer, goal_judge, background_review, monitor, moa_aggregator and more", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/models.py:205 default-model per model type (system reasoning, embedding, rerank, speech2text, tts) and :633 models by type; every app, node, knowledge base and generator picks its own model, so summaries and triage can run on different providers", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/config.py:2180 TASK_MODEL and :2182 TASK_MODEL_EXTERNAL for titles, tags, queries and autocomplete, set in src/lib/components/admin/Settings/Interface.svelte:180; separate engines per feature in admin Settings Audio, Images, Documents (embedding, reranker), WebSearch", - "n8n": "source read at n8n@2.40.7, not driven: every AI node chooses its own model: Summarization Chain, Text Classifier, Information Extractor and AI Agent each take a separate chat model sub-node (packages/@n8n/nodes-langchain/nodes/chains/ChainSummarization, chains/TextClassifier, agents/Agent/utils.ts:46-59); Instance AI has its own model setting (packages/cli/src/modules/instance-ai/instance-ai-model.service.ts)" + "n8n": "source read at n8n@2.40.7, not driven: every AI node chooses its own model: Summarization Chain, Text Classifier, Information Extractor and AI Agent each take a separate chat model sub-node (packages/@n8n/nodes-langchain/nodes/chains/ChainSummarization, chains/TextClassifier, agents/Agent/utils.ts:46-59); Instance AI has its own model setting (packages/cli/src/modules/instance-ai/instance-ai-model.service.ts)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each feature is its own TaskProcessing task type (summary, chat with tools, image, speech) and the UI names the provider serving it (assistant:src/components/AssistantTextProcessingForm.vue:64-73, PersonalSettings.vue:52-60). Note: The per-type provider choice itself is in the server's AI admin settings (not read)." } }, { @@ -3356,7 +3479,7 @@ "providerHow": "read-from-code", "feature": "multi-tenant-ops", "featureConfidence": "low", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -3366,7 +3489,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:24 fallback_providers chain; hermes_cli/subcommands/fallback.py:10-24 `hermes fallback add|list|remove|clear`; hermes_cli/fallback_config.py:1 effective chain; agent/fallback_cooldown.py cools a failing provider", "dify": "source read at 1.17.1, not driven: api/core/model_manager.py:440-477,1003-1066 load balancing rotates credentials of the same model and cools down one on rate-limit or connection errors; off by default (api/configs/feature/__init__.py:813 MODEL_LB_ENABLED=False). A second provider only by wiring a fail branch to another LLM node (web/i18n/en-US/workflow.json nodes.common.errorHandle.failBranch) Note: same-model credential failover, not provider fallback", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1137-1147 ENABLE_CUSTOM_MODEL_FALLBACK (env.py:1035, off by default) swaps to the first default model only when a custom model's base model is missing; Ollama spreads requests over URLs (routers/ollama.py:863 random.choice) but does not retry another provider on an error; searched 'failover|retry' in routers/openai.py: none Note: no runtime failover when a provider call fails", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:37-40,118-119 'Enable Fallback Model' adds a second model input used when the primary fails" + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:37-40,118-119 'Enable Fallback Model' adds a second model input used when the primary fails", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'fallback|failover|retry' in context_agent:ex_app/lib/nc_model.py and assistant:lib/Service: scheduling is retried on connection errors and rate limits are waited out (nc_model.py:206-219), but no second provider. Server TaskProcessing not read." } }, { @@ -3386,7 +3510,7 @@ "providerHow": "read-from-code", "feature": "tenant-model-policy", "featureConfidence": "low", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -3396,7 +3520,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'sensitiv|classification|pii.*route|route.*pii' in agent/ and hermes_cli/: no data-class routing; hermes_cli/model_data_policy_guard.py:1-6 only warns at model selection when a tier trains on prompts; agent/redact.py redacts secrets from logs and output Note: No rule that keeps sensitive data away from particular models.", "dify": "source read at 1.17.1, not driven: searched 'sensitiv|classification|pii|route.*model' in api/core/model_manager.py, api/core/moderation and dify-agent/src: no routing of data by sensitivity; only content moderation (api/core/moderation) that blocks or replaces text", "open-webui": "source read at v0.11.4, not driven: searched 'sensitiv|classification|pii|confidential' in backend/open_webui/utils/middleware.py, utils/models.py and main.py: routing follows the chosen model only; no data-classification based model selection", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/ModelSelector/ModelSelector.node.ts:73-124 routes to a model by rules on workflow data, and the Guardrails node detects PII (packages/@n8n/nodes-langchain/nodes/Guardrails); searched 'sensitiv|classification' in packages/cli/src/modules/agents: no built-in data-class-to-model policy Note: Must be hand-built from a Guardrails check plus Model Selector rules." + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/ModelSelector/ModelSelector.node.ts:73-124 routes to a model by rules on workflow data, and the Guardrails node detects PII (packages/@n8n/nodes-langchain/nodes/Guardrails); searched 'sensitiv|classification' in packages/cli/src/modules/agents: no built-in data-class-to-model policy Note: Must be hand-built from a Guardrails check plus Model Selector rules.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'sensitive|classification|confidential' in both repos: none." } }, { @@ -3416,7 +3541,7 @@ "providerHow": "read-from-code", "feature": "governed-cli-mcp-transport", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -3426,7 +3551,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: plugin-catalog/claude-subscription-directsdk.yaml:1-5 official NousResearch catalog plugin runs Hermes turns through the logged-in claude CLI (Agent SDK path); skills/autonomous-ai-agents/claude-code/SKILL.md:1-3 bundled skill delegates coding to the Claude Code CLI; tools/environments/docker.py can host the terminal Note: The turn runner is a catalog plugin, not core, and nothing places the claude CLI in its own container by design.", "dify": "source read at 1.17.1, not driven: searched 'claude code|claude cli|anthropic cli' in api/, dify-agent/src and dify-agent-runtime: model turns go through provider plugins (dify-agent/src/dify_agent/layers/dify_plugin/llm_layer.py); no runner that drives the claude command line tool", "open-webui": "source read at v0.11.4, not driven: searched 'claude|subprocess|cli' in backend/open_webui/utils and routers: Anthropic is called over HTTP (utils/anthropic.py:15 ANTHROPIC_VERSION); no runner that shells out to the claude CLI in a container", - "n8n": "source read at n8n@2.40.7, not driven: searched 'claude-code|claude code|claude-agent-sdk' in packages/cli/src, packages/@n8n/nodes-langchain/nodes, packages/@n8n/agents/src and packages/@n8n/instance-ai/src: none; Anthropic is reached only through its API (packages/@n8n/nodes-langchain/nodes/llms/LMChatAnthropic)" + "n8n": "source read at n8n@2.40.7, not driven: searched 'claude-code|claude code|claude-agent-sdk' in packages/cli/src, packages/@n8n/nodes-langchain/nodes, packages/@n8n/agents/src and packages/@n8n/instance-ai/src: none; Anthropic is reached only through its API (packages/@n8n/nodes-langchain/nodes/llms/LMChatAnthropic)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'claude|cli|subprocess' in context_agent:ex_app: none." } }, { @@ -3445,7 +3571,7 @@ "providerHow": "read-from-code", "feature": "agent-credentials", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -3455,7 +3581,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/secrets.py:8-20 `hermes secrets bitwarden|onepassword` pull provider keys from Bitwarden Secrets Manager or 1Password (agent/secret_sources/bitwarden.py:1-5, onepassword.py) so they need not sit in .env; agent/credential_pool.py:1 shared credential pool per provider; agent/secret_scope.py:1-10 profile-scoped key resolution in the multiplexed gateway", "dify": "source read at 1.17.1, not driven: model keys live once per workspace provider, encrypted, with named credentials and switching (api/controllers/console/workspace/model_providers.py:200,291; models.py:342,495); agents and apps reference the provider, never hold the key; api/models/credential_permission.py:1-35 limits which members may use a credential Note: per-member credential access needs enterprise RBAC (permission-keys.json credential.use)", "n8n": "source read at n8n@2.40.7, not driven: model keys are stored once as encrypted credentials (packages/core/src/encryption/cipher.ts:9-10 AES-256) and referenced by id from model nodes and agents (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:447 credential); external vaults via packages/cli/src/modules/external-secrets.ee (feat:externalSecrets, packages/@n8n/constants/src/index.ts:25) Note: The outside-vault option is enterprise-licensed; the built-in credential store is not.", - "open-webui": "source read at v0.11.4, not driven: provider keys live once in admin connection config (backend/open_webui/routers/openai.py:360 get_openai_connection by url_idx, config.py:2829 openai.api_keys), set in src/lib/components/admin/Settings/Connections.svelte; agents reference a base model id, never a key (models/models.py:118); tool-server OAuth tokens Fernet-encrypted (utils/oauth.py:269) Note: central config store, not an external vault" + "open-webui": "source read at v0.11.4, not driven: provider keys live once in admin connection config (backend/open_webui/routers/openai.py:360 get_openai_connection by url_idx, config.py:2829 openai.api_keys), set in src/lib/components/admin/Settings/Connections.svelte; agents reference a base model id, never a key (models/models.py:118); tool-server OAuth tokens Fernet-encrypted (utils/oauth.py:269) Note: central config store, not an external vault", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no key handling in the agent; model keys sit once per instance in the provider app's admin settings (integration_openai, not read) and the HERE key in the Context Agent admin form (context_agent:ex_app/lib/main.py:95-102). Central by construction, not a credential store." } }, { @@ -3484,7 +3611,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 routes a sender user_id to a profile, and each profile has its own .env/auth.json keys (agent/secret_scope.py:1-10); searched 'per.?user.{0,20}(key|credential)|byok' in *.py: only tool-provider BYOK rows (hermes_cli/tools_config_providers.py:760) Note: A person gets their own key only by being routed to their own profile; no per-user key field.", "dify": "source read at 1.17.1, not driven: searched 'personal credential|per.?user credential|end.?user.*credential' in api/core/tools, api/services/tools and web/i18n/en-US: credentials are workspace-level (api/controllers/console/workspace/model_providers.py:200) and runs use the app's configured credential; api/models/credential_permission.py only restricts who may use a shared credential", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/Connections.svelte:66 per-user Direct Connections (own endpoint and key), enabled by admin 'direct.enable' (backend/open_webui/config.py:230 ENABLE_DIRECT_CONNECTIONS); main.py:1164 _set_direct_model routes the user's runs through it Note: direct connections run from the browser session and are refused for sub-agents (utils/subagents.py:334)", - "n8n": "source read at n8n@2.40.7, not driven: Chat hub lets each user pick a provider credential they own, checked per user (packages/cli/src/modules/chat-hub/chat-hub-credentials.service.ts:25-31 findCredentialForUser; packages/frontend/editor-ui/src/features/ai/chatHub/components/DynamicCredentialsDrawer.vue); workflows can resolve a credential per executing user with dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee, feat:dynamicCredentials) Note: Per-user resolution in workflows is enterprise-licensed." + "n8n": "source read at n8n@2.40.7, not driven: Chat hub lets each user pick a provider credential they own, checked per user (packages/cli/src/modules/chat-hub/chat-hub-credentials.service.ts:25-31 findCredentialForUser; packages/frontend/editor-ui/src/features/ai/chatHub/components/DynamicCredentialsDrawer.vue); workflows can resolve a credential per executing user with dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee, feat:dynamicCredentials) Note: Per-user resolution in workflows is enterprise-licensed.", + "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: assistant and context_agent handle no model keys at all (context_agent:ex_app/lib/nc_model.py:165-179 schedules server tasks); a per-user key would live in integration_openai, not read." } }, { @@ -3504,14 +3632,14 @@ "providerHow": "read-from-code", "feature": "multi-tenant-ops", "featureConfidence": "high", - "nextcloud-assistant": "yes", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "no", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31886 \"On-premises / sovereign deployment: Fully self-hosted inside the customer's Nextcloud\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant and agent send model calls only to the instance's own TaskProcessing (context_agent:ex_app/lib/nc_model.py:165-179); staying on premise needs a local provider (llm2, linked at assistant:src/components/AdminSettings.vue:64-66, not read). Web, weather and routing tools call outside services but can be switched off (context_agent:ex_app/lib/main.py:88-94). Note: Old 'yes' rested on a marketing line; the code makes it possible, not guaranteed.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 Ollama and LM Studio local servers; plugins/model-providers/custom any self-hosted OpenAI-compatible endpoint; tools/transcription_local.py and tools/tts_tool.py local Piper/NeuTTS keep voice on premise; Dockerfile self-hosting", "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml self-hosts the whole stack (api, worker, web, plugin daemon, sandbox, agent runtime, vector store); with a local model plugin (langgenius/dify-official-plugins models/ollama, localai, xinference) processing stays on premise Note: local model serving itself is a marketplace plugin", @@ -3542,7 +3670,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31374 \"Talk tool: List conversations, send messages, create public conversations from the agent.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: send_message_to_conversation and share_file_to_conversation (context_agent:ex_app/lib/all_tools/talk.py:49-61,222-223); usable from chat and from scheduled tasks. Note: In scheduled runs this dangerous tool pauses for the user's approval.", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 delivers job output to origin, home or explicit chat targets on connected platforms (telegram, discord, slack, matrix, mattermost, teams and more under plugins/platforms/); web/src/i18n/en.ts cron.deliverTo; searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter Note: Delivery into a team chat room works; Nextcloud Talk is not a target.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; no official plugin for Nextcloud Talk in langgenius/dify-official-plugins tools/ (only slack, teams, discord, dingtalk, wecom, telegraph)", "open-webui": "source read at v0.11.4, not driven: automation output can go to an Open WebUI channel: backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation, src/lib/components/automations/DestinationDropdown.svelte; searched 'talk|spreed|nextcloud' in backend/open_webui: no Nextcloud Talk Note: delivers to its own channels, not Talk", @@ -3565,7 +3693,7 @@ "providerHow": "read-from-code", "feature": "talk-chat-bridge", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -3575,7 +3703,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/run_inbound.py handles group-room messages and replies in the same room on every platform adapter; gateway/platforms/access_policy_mixin.py:6-68 group allowlists per chat; searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter Note: Chat-room bridging exists for other chat systems, not for Nextcloud Talk.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; chat-app bridges exist only as plugin endpoints for other messengers (api/controllers/console/workspace/endpoint.py), none for Nextcloud Talk", "open-webui": "source read at v0.11.4, not driven: in Open WebUI channels a member @mentions a model and the reply lands in the room or thread: backend/open_webui/routers/channels.py:976 model_response_handler, :1244; src/lib/components/channel/MessageInput/MentionList.svelte; no Nextcloud Talk bridge Note: own channels only", - "n8n": "source read at n8n@2.40.7, not driven: Agents module chat channels let people chat with an agent from Slack, Telegram, Discord and Linear with replies in place (packages/cli/src/modules/agents/agents.module.ts:81-96 registry; integrations/platforms/); workflows do the same with Slack or Telegram triggers; searched 'talk|spreed|nextcloud' in integrations/: no Talk adapter Note: Works in other chat apps (opt-in Agents module or hand-built workflows), not in Nextcloud Talk." + "n8n": "source read at n8n@2.40.7, not driven: Agents module chat channels let people chat with an agent from Slack, Telegram, Discord and Linear with replies in place (packages/cli/src/modules/agents/agents.module.ts:81-96 registry; integrations/platforms/); workflows do the same with Slack or Telegram triggers; searched 'talk|spreed|nextcloud' in integrations/: no Talk adapter Note: Works in other chat apps (opt-in Agents module or hand-built workflows), not in Nextcloud Talk.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'bot|webhook|spreed' in assistant:lib and context_agent:ex_app: the agent can post to Talk but no Talk bot receives room messages. Talk bots from other Nextcloud apps are not in these repos." } }, { @@ -3595,7 +3724,7 @@ "providerHow": "read-from-code", "feature": "talk-room-grouping", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -3605,7 +3734,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter; hermes_cli/commands.py:76 /branch opens a new thread on Discord/Telegram/Slack/Matrix, which separates sessions but does not group agent rooms apart from human rooms", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed|room' in api/ and web/: no Talk integration, so no agent-room grouping", "open-webui": "source read at v0.11.4, not driven: searched 'agent room|bot room|category' in backend/open_webui/models/channels.py and src/lib/components/channel: channels have types group/dm/standard, no marking or grouping of agent rooms apart from human ones", - "n8n": "source read at n8n@2.40.7, not driven: on its own chat surfaces an agent gets its own space: in Slack each agent is its own app with its own direct messages (packages/cli/src/modules/agents/agent-slack-integrations.controller.ts:26-150 app creation and install; en.json:8408 'Agent name' shown in Slack), and n8n's chat lists agents under their own sidebar links (en.json:695-696); searched 'talk|spreed|nextcloud' in packages/cli/src/modules/agents/integrations: no Nextcloud Talk Note: Missing Nextcloud part: Talk rooms. Rewritten under the lane ruling of 2026-09-26 (was no)." + "n8n": "source read at n8n@2.40.7, not driven: on its own chat surfaces an agent gets its own space: in Slack each agent is its own app with its own direct messages (packages/cli/src/modules/agents/agent-slack-integrations.controller.ts:26-150 app creation and install; en.json:8408 'Agent name' shown in Slack), and n8n's chat lists agents under their own sidebar links (en.json:695-696); searched 'talk|spreed|nextcloud' in packages/cli/src/modules/agents/integrations: no Nextcloud Talk Note: Missing Nextcloud part: Talk rooms. Rewritten under the lane ruling of 2026-09-26 (was no).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent rooms exist; create_public_conversation makes an ordinary room (context_agent:ex_app/lib/all_tools/talk.py:38-39)." } }, { @@ -3624,7 +3754,7 @@ "providerHow": "read-from-code", "feature": "delivery-channels", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -3634,7 +3764,8 @@ "open-webui": "source read at v0.11.4, not driven: admin event webhooks (backend/open_webui/events.py:1034 dispatch_webhook_event, filters :707) and per-user notification webhooks (utils/notifications.py:264 chat.finished payload with the answer text and link) post output to another system; utils/webhook.py:30 post_webhook sends plain JSON; searched 'hmac|signature' in utils/webhook.py, events.py, utils/notifications.py: unsigned Note: old yes; webhooks exist but carry no signature", "hermes-agent": "source read at v2026.9.24, not driven: agent/outbound_webhooks.py:1-7 hooks.outbound entries POST lifecycle events (hermes_cli/plugins.py:108-118 post_llm_call, post_tool_call, on_stream_end ...) HMAC-SHA256 signed via X-Hermes-Signature-256; cron/scheduler_delivery.py:32 'webhook' is a cron delivery target", "dify": "source read at 1.17.1, not driven: a workflow HTTP Request node posts an agent's output to any URL with API-Key, Basic, Bearer or custom header auth (web/i18n/en-US/workflow.json:510-518 nodes.http.authorization.*); searched 'hmac|signature|sign' in workflow.json and the http node: no payload signing Note: outbound webhook yes, signed no", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/HttpRequest sends a run's output to any URL (also as the Respond to Webhook node); signing is hand-built with the Crypto node's HMAC (packages/nodes-base/nodes/Crypto); searched 'signature|hmac' in packages/nodes-base/nodes/HttpRequest: no built-in request signing Note: Outbound webhook yes; the signature must be wired by hand." + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/HttpRequest sends a run's output to any URL (also as the Respond to Webhook node); signing is hand-built with the Crypto node's HMAC (packages/nodes-base/nodes/Crypto); searched 'signature|hmac' in packages/nodes-base/nodes/HttpRequest: no built-in request signing Note: Outbound webhook yes; the signature must be wired by hand.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'webhook|hmac|signature' in both repos: signature.py only signs the conversation token (context_agent:ex_app/lib/signature.py); web_fetch is GET only (context_agent:ex_app/lib/all_tools/web.py:14-20)." } }, { @@ -3661,7 +3792,7 @@ "n8n": "yes", "open-webui": "no", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31375 \"Mail tool: Send emails, manage mail accounts and folders.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: send_email tool through the user's Mail account (context_agent:ex_app/lib/all_tools/mail.py:16-47).", "dify": "source read at 1.17.1, not driven: core sends mail only for Human Input requests (api/tasks/mail_human_input_delivery_task.py; web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*) and account/comment mails (api/tasks/mail_*.py); sending an agent's output as an email needs the official email/gmail/outlook tool plugins Note: marketplace plugin for general delivery", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:32 'email' delivery target; plugins/platforms/email/plugin.yaml:5-8 IMAP/SMTP email adapter; web/src/i18n/en.ts cron.delivery.email on CronPage", "open-webui": "source read at v0.11.4, not driven: searched 'smtp|email|sendmail' in backend/open_webui/utils/notifications.py, utils/webhook.py, events.py and routers: notification targets accept type 'webhook' only (utils/notifications.py:34)", @@ -3684,7 +3815,7 @@ "providerHow": "read-from-code", "feature": "delivery-channels", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -3694,7 +3825,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/terminal_notify.py:1-5 OS notifications via OSC 9/777 from the CLI; apps/desktop/electron/notification-ipc.ts:53 native desktop notifications; cron/scheduler_delivery.py:43-47 run results and approval prompts land in the home channel on Telegram, Discord, Slack, Signal; searched 'nextcloud' repo-wide: none Note: Notifies through desktop and messaging channels, not Nextcloud notifications. Old yes rested on a docs line about notifications in general.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/events.py:669 NOTIFICATION_EVENTS chat.finished, chat.failed, channel.message, calendar.alert; src/routes/+layout.svelte:622 browser Notification, utils/automations.py:500 'automation:result' socket toast; src/lib/components/chat/Settings/Notifications.svelte:32-38 per-event choice Note: 'needs me' for a waiting approval surfaces only inside the open chat", "dify": "source read at 1.17.1, not driven: when a run needs a person, the Human Input node emails workspace members or externals (api/tasks/mail_human_input_delivery_task.py; workflow.json humanInput.deliveryMethod.emailConfigure.allMembers); api/controllers/console/notification.py:43 is only product announcements. Searched 'run finished|run completed|notify' in api/tasks and web/i18n/en-US: no notice when a run finishes Note: email when input is needed, nothing on completion, no in-app notification", - "n8n": "source read at n8n@2.40.7, not driven: run alerts are hand-built: packages/nodes-base/nodes/ErrorTrigger starts a workflow when another fails, which can mail or post to chat; the push channel only refreshes open editors (packages/cli/src/modules/agents/agent-execution-update-broadcaster.ts:43); searched 'notification' in packages/nodes-base/nodes/NextCloud: none, the node has no notifications resource Note: No Nextcloud notification and no in-app inbox; an alert needs a workflow built for it." + "n8n": "source read at n8n@2.40.7, not driven: run alerts are hand-built: packages/nodes-base/nodes/ErrorTrigger starts a workflow when another fails, which can mail or post to chat; the push channel only refreshes open editors (packages/cli/src/modules/agents/agent-execution-update-broadcaster.ts:43); searched 'notification' in packages/nodes-base/nodes/NextCloud: none, the node has no notifications resource Note: No Nextcloud notification and no in-app inbox; an alert needs a workflow built for it.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: 'Get notified when the task finishes' (assistant:src/components/AssistantTextProcessingForm.vue:92, POST /api/v1/task/{id}/notify) and notifications for scheduled tasks succeeded, failed or pending review (assistant:lib/Notification/Notifier.php:341-401, lib/Service/NotificationService.php:138-166)." } }, { @@ -3713,7 +3845,7 @@ "providerHow": "read-from-code", "feature": "talk-delivery", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", @@ -3723,7 +3855,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:148 /sethome sets this chat as the home channel; cron/scheduler_delivery.py:43-47 _HOME_CHANNEL resolves the default target; web/src/i18n/en.ts cron.deliverTo with 'set a home channel first'", "dify": "source read at 1.17.1, not driven: searched 'delivery target|default delivery|preferred channel' in api/ and web/i18n/en-US: delivery is wired per workflow node (HTTP, tool plugins, Human Input delivery methods); no per-person default delivery setting", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/notifications.py:56 add target, :84 PUT /targets/{id}/default; utils/notifications.py:213 set_default_target; per-user settings in src/lib/components/chat/Settings/Notifications.svelte", - "n8n": "source read at n8n@2.40.7, not driven: searched 'default delivery|deliveryTarget|preferred channel' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/api-types/src/agents: no per-user default delivery target; each workflow or agent names its own destination node or channel" + "n8n": "source read at n8n@2.40.7, not driven: searched 'default delivery|deliveryTarget|preferred channel' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/api-types/src/agents: no per-user default delivery target; each workflow or agent names its own destination node or channel", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'target|deliver|default' in assistant:lib/Settings and PersonalSettings.vue: no default delivery setting." } }, { @@ -3743,7 +3876,7 @@ "providerHow": "read-from-code", "feature": "talk-delivery", "featureConfidence": "low", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "partial", "dify": "partial", @@ -3754,7 +3887,8 @@ "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/endpoint.py plugin endpoints host chat bots; official extensions slack_bot and wecom_bot, triggers slack_trigger and telegram_trigger (langgenius/dify-official-plugins extensions/, triggers/), community microsoft-teams (langgenius/dify-plugins); nothing for Signal found Note: marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: outbound only: utils/webhook.py:44-55 formats Slack, Google Chat, Discord and Microsoft Teams webhooks; searched 'telegram|signal|whatsapp|slack bot|bot token' in backend/open_webui: no inbound messenger adapter; chatting from Telegram or WhatsApp is the separate Open WebUI Computer project (README.md:94) Note: can post to Teams or Slack, cannot be reached from them", - "n8n": "source read at n8n@2.40.7, not driven: Agents module channels for Slack, Telegram, Discord and Linear (packages/cli/src/modules/agents/agents.module.ts:81-96, en.json:8476-8477 Slack/Telegram help texts); workflows also start from Telegram, WhatsApp, Discord, Slack and Teams trigger nodes (packages/nodes-base/nodes/Telegram, WhatsApp, Discord, Slack, Microsoft/Teams) Note: Teams and Signal are not Agents-module channels; Teams works through workflow trigger nodes, Signal not at all." + "n8n": "source read at n8n@2.40.7, not driven: Agents module channels for Slack, Telegram, Discord and Linear (packages/cli/src/modules/agents/agents.module.ts:81-96, en.json:8476-8477 Slack/Telegram help texts); workflows also start from Telegram, WhatsApp, Discord, Slack and Teams trigger nodes (packages/nodes-base/nodes/Telegram, WhatsApp, Discord, Slack, Microsoft/Teams) Note: Teams and Signal are not Agents-module channels; Teams works through workflow trigger nodes, Signal not at all.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'telegram|slack|teams|signal|matrix' in both repos: none. Outside AI clients can call tools over MCP (tl-mcp-server) but that is not a messenger channel." } }, { @@ -3774,7 +3908,7 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -3784,7 +3918,8 @@ "open-webui": "source read at v0.11.4, not driven: a scheduled automation with target channel posts its result into a team channel: backend/open_webui/models/automations.py:68-77 AutomationTarget 'channel', utils/automations.py:250 _execute_channel_automation, routers/automations.py:109 channel write check; src/lib/components/automations/DestinationDropdown.svelte", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 scheduled job output delivered to a chat target; web/src/i18n/en.ts cron.namePlaceholder 'e.g. Daily summary' with deliverTo; skills/productivity/google-workspace/SKILL.md:27 daily brief procedure; hermes_cli/web_routers/cron.py:393 blueprints for ready-made automations", "dify": "source read at 1.17.1, not driven: a Schedule Trigger workflow (api/core/workflow/nodes/trigger_schedule/entities.py:10) can end in a chat-posting tool node, but the posting tools are marketplace plugins (official tools/slack/tools/send_message.yaml, teams send_channel_message.yaml) Note: schedule is core, the chat delivery is a plugin", - "n8n": "source read at n8n@2.40.7, not driven: an Agents-module schedule runs an objective on cron (en.json:8112-8113 'Objectives the agent runs on a schedule') and a connected Slack or Discord channel gives the agent a send_channel_message action (packages/cli/src/modules/agents/integrations/integration-tool-definitions.ts:278); workflows do the same with Schedule Trigger plus Slack node Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: an Agents-module schedule runs an objective on cron (en.json:8112-8113 'Objectives the agent runs on a schedule') and a connected Slack or Discord channel gives the agent a send_channel_message action (packages/cli/src/modules/agents/integrations/integration-tool-definitions.ts:278); workflows do the same with Schedule Trigger plus Slack node Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a scheduled task can prompt the agent to post into Talk (suggestion at assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:366-367, context_agent:ex_app/lib/all_tools/talk.py:49-50), but posting is a dangerous tool, so each run stops at 'Scheduled task is pending review' (assistant:lib/Notification/Notifier.php:341-346)." } }, { @@ -3804,7 +3939,7 @@ "providerHow": "read-from-code", "feature": "identical-reports-collapse-into-one", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -3814,7 +3949,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 repeat failures with the same job and error signature resolve to one incident and repeat alerts are withheld for cron.failure_repeat_alert_hours; gateway/platforms/webhook_coalesce.py:1-8 debounces bursts of events on one entity into one run; searched 'repeat.?count|collapsed' in gateway/ and cron/: no 'N times' counter on delivered reports Note: Duplicates are suppressed or coalesced, but not collapsed into one report with a count.", "dify": "source read at 1.17.1, not driven: searched 'dedup|collapse|identical|duplicate report' in api/core/workflow, api/services and web/i18n/en-US: no collapsing of repeated outputs into one with a count", "open-webui": "source read at v0.11.4, not driven: searched 'dedup|duplicate|collapse|count' in backend/open_webui/utils/notifications.py, events.py and utils/automations.py: each run and event is delivered separately; no collapsing of identical reports", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Transform/RemoveDuplicates/v2/RemoveDuplicatesV2.description.ts:11-13 'Remove items processed in previous executions' drops repeats across runs, and the Summarize node counts groups (packages/nodes-base/nodes/Transform/Summarize); searched 'dedupe|collapse' in packages/cli/src/modules/agents: no built-in collapse of identical reports into one with a count Note: Must be wired by hand in a workflow." + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Transform/RemoveDuplicates/v2/RemoveDuplicatesV2.description.ts:11-13 'Remove items processed in previous executions' drops repeats across runs, and the Summarize node counts groups (packages/nodes-base/nodes/Transform/Summarize); searched 'dedupe|collapse' in packages/cli/src/modules/agents: no built-in collapse of identical reports into one with a count Note: Must be wired by hand in a workflow.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dedupe|duplicate|count' in assistant:lib/Service: none." } }, { @@ -3834,7 +3970,7 @@ "providerHow": "read-from-code", "feature": "dashboard-org-widgets", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -3844,7 +3980,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/productivity/live-dashboard/SKILL.md:1-3 optional skill builds self-updating dashboards; web/src/plugins/slots.ts:1-13 plugins can inject components into dashboard slots; searched 'nextcloud' repo-wide: none Note: No Nextcloud dashboard widget; agent output on a dashboard needs an optional skill or a dashboard plugin.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|dashboard widget' in api/ and web/: no widget that shows agent output on another product's dashboard; the app Overview/Monitoring pages (web/i18n/en-US/app-overview.json, agent-v-2.json monitoring.*) show usage metrics, not output", "open-webui": "source read at v0.11.4, not driven: searched 'dashboard|widget' in src/lib/components and src/routes: src/routes/(app)/home/+page.svelte is an empty shell, admin Analytics is usage stats; no widget showing agent output and no Nextcloud dashboard integration", - "n8n": "source read at n8n@2.40.7, not driven: searched 'dashboard widget|nextcloud dashboard' in packages/nodes-base/nodes/NextCloud and packages/cli/src: no Nextcloud Dashboard widget; n8n's own Insights dashboard (packages/cli/src/modules/insights) shows execution counts, not agent output" + "n8n": "source read at n8n@2.40.7, not driven: searched 'dashboard widget|nextcloud dashboard' in packages/nodes-base/nodes/NextCloud and packages/cli/src: no Nextcloud Dashboard widget; n8n's own Insights dashboard (packages/cli/src/modules/insights) shows execution counts, not agent output", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no dashboard widget registered in assistant:lib/AppInfo/Application.php:78-120 (capability, reference providers, notifier only); searched 'IWidget|Dashboard' in both repos: none." } }, { @@ -3872,7 +4009,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31382 \"Media transcription (STT): Speech-to-text transcription exposed as an agent tool.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Files action 'Transcribe audio using AI' and 'Generate subtitles' (assistant:src/files/fileActions.js:125-180), speech-to-text smart picker, and agent tool transcribe_file (context_agent:ex_app/lib/all_tools/audio2text.py:14-15). Note: Needs a core:audio2text provider.", "hermes-agent": "source read at v2026.9.24, not driven: tools/transcription_tools.py with local (tools/transcription_local.py) and cloud (tools/transcription_cloud.py) speech-to-text; gateway/run_voice.py transcribes inbound voice messages on messaging platforms", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/audio.py:1251 POST /audio/transcriptions (local Whisper, OpenAI, Deepgram, Azure, Voxtral); routers/files.py:153-155 uploaded audio files are transcribed then indexed; chat/MessageInput/VoiceRecording.svelte", "dify": "source read at 1.17.1, not driven: api/core/tools/builtin_tool/providers/audio/tools/asr.py speech-to-text tool usable in workflows and agents; api/controllers/web/audio.py:62 audio-to-text for voice messages in chat Note: needs a speech2text model from a provider plugin", @@ -3895,7 +4032,7 @@ "providerHow": "read-from-code", "feature": "case-assistant-surface", "featureConfidence": "low", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "yes", "dify": "yes", @@ -3906,7 +4043,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'embed.{0,20}(chat|widget)|chat.?widget|web.?chat' in plugin-catalog/, plugins/platforms/, gateway/platforms/, web/src: only the dashboard's own chat page; gateway/platforms/api_server.py:1178 cors_origins lets a site call the key-protected API but ships no embeddable widget or anonymous access", "dify": "source read at 1.17.1, not driven: web/public/embed.js floating chat bubble script and iframe embed chosen in web/i18n/en-US/app-overview.json:50-52 'Choose the way to embed chat app to your website', with pre-filled hidden inputs; agents have 'Embed Into Site' on their Access page (agent-v-2.json access.webApp.actions.embedIntoSite)", "open-webui": "source read at v0.11.4, not driven: searched 'embed|widget|anonymous|guest|public chat' in src/lib/components and backend/open_webui/routers/auths.py: every chat needs a signed-in user; the only embedding hook is an iframe postMessage handler for a logged-in session (src/lib/components/chat/Chat.svelte:1457 'Confirm Prompt from Embed') Note: no anonymous chat window for public websites", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:408-452 'public' chat with an embeddable widget or hosted chat page; packages/frontend/@n8n/chat/README.md:1-3 embeddable chat window with CORS allowed origins" + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:408-452 'public' chat with an embeddable widget or hosted chat page; packages/frontend/@n8n/chat/README.md:1-3 embeddable chat window with CORS allowed origins", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'PublicPage|embed|iframe' in assistant:lib/Controller: all routes need a logged-in user." } }, { @@ -3925,7 +4063,7 @@ "providerHow": "read-from-code", "feature": "human-approval-gate", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", @@ -3936,7 +4074,8 @@ "copilot-studio": "docs-only: competitor_features#31608 \"Human-in-the-loop approvals: Approval steps via Power Automate before actions execute.\"", "dify": "source read at 1.17.1, not driven: Human Input workflow node pauses a run until a person picks one of the defined user actions, with delivery by web app or email and a timeout (web/i18n/en-US/workflow.json:583-636 nodes.humanInput.*; api/controllers/web/human_input_form.py:141); in Agent v2 an ask_human deferred tool lets the agent stop for a person (dify-agent/src/dify_agent/layers/ask_human/layer.py:1-12,63) Note: the gate is a node the builder places; no automatic hold on tool calls", "n8n": "source read at n8n@2.40.7, not driven: AI Agent tools can be gated behind a human-in-the-loop node: packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts:64-77 createHitlToolkit routes a gated tool through the HITL node until approved, packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/executeBatch.ts:57-61; Agents module per-tool 'Require approval' (en.json:7840-7841) with Approve/Reject cards (en.json:7676-7681)", - "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:62 'Ask for approval': 'Stop before each tool call until you allow or deny it.'; backend/open_webui/utils/middleware.py:3613 pause_for_tool_approval holds the call; src/lib/components/common/ToolCallDisplay.svelte:250-271 Allow/Deny; utils/tool_approval.py:20 resolve_tool_call_output resumes or rejects" + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:62 'Ask for approval': 'Stop before each tool call until you allow or deny it.'; backend/open_webui/utils/middleware.py:3613 pause_for_tool_approval holds the call; src/lib/components/common/ToolCallDisplay.svelte:250-271 Allow/Deny; utils/tool_approval.py:20 resolve_tool_call_output resumes or rejects", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the LangGraph agent interrupts before any dangerous tool (context_agent:ex_app/lib/graph.py:81), the chat shows 'The Assistant wants to perform sensitive actions on your behalf' with Cancel and Confirm (assistant:src/components/ChattyLLM/AgencyConfirmation.vue:10-30), and a deny is fed back to the agent (context_agent:ex_app/lib/agent.py:206-216)." } }, { @@ -3955,7 +4094,7 @@ "providerHow": "read-from-code", "feature": "human-approval-gate", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -3965,7 +4104,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:662-670 permissions_list_open lists pending approvals across conversations seen by the MCP bridge, :672 permissions_respond; hermes_cli/commands.py:223 /memory pending and :217 /skills pending list staged writes Note: Approvals surface in the conversation that raised them; the only cross-conversation list is through the MCP bridge, with no inbox page.", "dify": "source read at 1.17.1, not driven: human input forms are reached one by one by token link (api/controllers/web/human_input_form.py:141, console/human_input_form.py:70 /form/human_input/); searched 'inbox|pending forms|awaiting' in web/i18n/en-US and api/controllers: no list of everything awaiting me", "open-webui": "source read at v0.11.4, not driven: searched 'requires_approval|pending approval|needsApproval' in src/routes and src/lib/components/layout: pending calls are shown only inside the chat message that raised them (common/ToolCallDisplay.svelte:244); no cross-chat approval inbox", - "n8n": "source read at n8n@2.40.7, not driven: waiting runs are findable with the executions list 'Waiting' status (en.json:1621); Agents-module approvals appear as cards inside each conversation (en.json:7676-7684); searched 'inbox|pending approvals' in packages/frontend/editor-ui/src/features: no single inbox of actions awaiting my approval Note: Approvals are scattered across chats, channels and waiting executions." + "n8n": "source read at n8n@2.40.7, not driven: waiting runs are findable with the executions list 'Waiting' status (en.json:1621); Agents-module approvals appear as cards inside each conversation (en.json:7676-7684); searched 'inbox|pending approvals' in packages/frontend/editor-ui/src/features: no single inbox of actions awaiting my approval Note: Approvals are scattered across chats, channels and waiting executions.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: pending actions show inside each conversation, and scheduled tasks send a 'pending review' notification (assistant:lib/Notification/Notifier.php:341-363). No inbox across conversations." } }, { @@ -3985,7 +4125,7 @@ "providerHow": "read-from-code", "feature": "human-approval-gate", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -3995,7 +4135,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/base_exec_approval.py:1-16 every approval card states what Hermes wants to run, why it was flagged (EA_REASON_LABEL_TEXT) and that silence means it does not run; tools/approval.py:1106-1109 tool approvals carry the tool name and reason; tools/approval_smart.py:1-8 guardian LLM risk assessment of the command", "dify": "source read at 1.17.1, not driven: the Human Input form shows builder-written Form Content with inserted run variables (web/i18n/en-US/workflow.json:609-612 nodes.humanInput.formContent.*), and in Agent v2 the agent writes the question and fields itself (dify-agent/src/dify_agent/layers/ask_human/schema.py AskHumanToolArgs); nothing derives what the action touches automatically Note: context is what the builder or the model chooses to show", "open-webui": "source read at v0.11.4, not driven: the pending call shows tool name and its decoded arguments (src/lib/components/common/ToolCallDisplay.svelte:147 arguments, :246 'Allow {{NAME}}?'); the reasoning is whatever the model wrote before the call; searched 'reason|impact|touches' in utils/tool_approval.py and ToolCallDisplay.svelte: no statement of what the action touches or why Note: what and with which arguments, not why or blast radius", - "n8n": "source read at n8n@2.40.7, not driven: the approval card names the tool and opens its arguments (en.json:7677 'The agent wants to run the {toolName} tool', 7682 'View tool details'); send-and-wait approval messages carry whatever the builder writes into them (packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:4-47); searched 'reason|impact|affects' in packages/frontend/editor-ui/src/features/agents/components/RichInteractionCard.vue and AgentConfirmationModal.vue: no stated reason or affected objects Note: Shows what will run and with which inputs, not why or what it touches." + "n8n": "source read at n8n@2.40.7, not driven: the approval card names the tool and opens its arguments (en.json:7677 'The agent wants to run the {toolName} tool', 7682 'View tool details'); send-and-wait approval messages carry whatever the builder writes into them (packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:4-47); searched 'reason|impact|affects' in packages/frontend/editor-ui/src/features/agents/components/RichInteractionCard.vue and AgentConfirmationModal.vue: no stated reason or affected objects Note: Shows what will run and with which inputs, not why or what it touches.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each pending action shows the tool name and its arguments with More/Less (assistant:src/components/ChattyLLM/AgencyAction.vue:6-17) plus a hint to adjust the request instead (AgencyConfirmation.vue:76)." } }, { @@ -4014,7 +4155,7 @@ "providerHow": "read-from-code", "feature": "agent-guardrails", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -4024,7 +4165,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/approval_detection.py:1-4 only commands matching dangerous patterns reach the gate; hermes_cli/config_defaults.py:1656 approvals.mode 'smart' lets an auxiliary guardian (tools/approval_smart.py) approve low-risk commands and escalate risky ones, with smart_policy rules (:1663) and a deny list (:1670)", "dify": "source read at 1.17.1, not driven: no risk scoring; a builder can route only some cases to a Human Input node with an IF/ELSE or classifier node, and the Agent v2 ask_human tool is called at the model's discretion (dify-agent/src/dify_agent/layers/ask_human/layer.py:56-78 prompt hint). Searched 'risk|threshold' in dify-agent/src and api/core/workflow: none Note: hand-built branching, no risk threshold setting", "open-webui": "source read at v0.11.4, not driven: tool_approval_mode is 'full' or 'ask' for all tool calls in a chat (src/lib/components/chat/MessageInput/InputMenu.svelte:54-64; backend/open_webui/utils/middleware.py:5934); searched 'approv|risk' in utils/tools.py and routers/tools.py: no per-tool or risk-based approval rule", - "n8n": "source read at n8n@2.40.7, not driven: approval is chosen per tool: packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:382,408,429 requireApproval on custom, workflow and node tools and :283-293 MCP approval 'selected' tools (en.json:7846 'Ask selected'); in workflows only tools wired through a human-in-the-loop node are gated (packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts:64-77) Note: Static per-tool choice, no risk scoring." + "n8n": "source read at n8n@2.40.7, not driven: approval is chosen per tool: packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:382,408,429 requireApproval on custom, workflow and node tools and :283-293 MCP approval 'selected' tools (en.json:7846 'Ask selected'); in workflows only tools wired through a human-in-the-loop node are gated (packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts:64-77) Note: Static per-tool choice, no risk scoring.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tools are marked safe or dangerous per function (context_agent:ex_app/lib/all_tools/lib/decorator.py safe_tool/dangerous_tool); only dangerous ones interrupt (context_agent:ex_app/lib/graph.py:66-81), reads run without asking. Note: The split is fixed in code, not configurable." } }, { @@ -4043,7 +4185,7 @@ "providerHow": "read-from-code", "feature": "talk-approval-reactions", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -4053,7 +4195,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/matrix/adapter.py:2419-2442 a reaction on the approval prompt resolves it (_handle_approval_reaction); plugins/platforms/telegram/adapter.py:4256-4280 inline Approve Once / Always Approve buttons; searched 'nextcloud|spreed' repo-wide: none Note: Approve by reaction works in Matrix, by buttons elsewhere; not in Nextcloud Talk.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|reaction' in api/ and web/: no Talk integration; approvals are answered only through the form link (api/controllers/web/human_input_form.py:141)", "open-webui": "source read at v0.11.4, not driven: searched 'reaction' with 'approv' in backend/open_webui/routers/channels.py and utils/tool_approval.py: channel reactions (events message.reaction_added) do not resolve tool calls; approval is only via the Allow/Deny buttons or POST /api/v1/chats/{id}/messages/{mid}/resolve (main.py:1893)", - "n8n": "source read at n8n@2.40.7, not driven: one-tap approval inside chat apps other than Talk: packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:4,31 approval buttons in Telegram, packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts Slack approvals; searched 'talk|spreed' in packages/nodes-base/nodes: no Nextcloud Talk Note: Approve from Slack or Telegram, not from Talk." + "n8n": "source read at n8n@2.40.7, not driven: one-tap approval inside chat apps other than Talk: packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:4,31 approval buttons in Telegram, packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts Slack approvals; searched 'talk|spreed' in packages/nodes-base/nodes: no Nextcloud Talk Note: Approve from Slack or Telegram, not from Talk.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: approval happens only through the chat UI or /chat/generate?agencyConfirm (assistant:lib/Controller/ChattyLLMController.php:491); searched 'reaction' in approval code: none." } }, { @@ -4073,7 +4216,7 @@ "providerHow": "read-from-code", "feature": "human-approval-gate", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -4083,7 +4226,8 @@ "dify": "source read at 1.17.1, not driven: a workflow can put a Human Input node between the LLM/Agent node and the reply so a person reviews, edits input fields and picks an action before the answer is sent (web/i18n/en-US/workflow.json nodes.humanInput.formContent.*, user actions; api/tasks/mail_human_input_delivery_task.py email delivery to staff) Note: built per workflow; chat apps with webapp delivery show the form to the end user instead", "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1095-1110 request_tool_approval lets a plugin pre_tool_call hook hold any tool call, including send_message, for a human; searched 'draft.{0,30}(approv|review|hold)|confirm.{0,20}before.{0,10}send' in *.py: no built-in hold on agent-written replies Note: Holding outgoing messages needs a plugin hook; nothing ships that queues drafts for review.", "open-webui": "source read at v0.11.4, not driven: searched 'draft|hold|review before' in backend/open_webui/utils/automations.py, routers/channels.py and utils/middleware.py: answers are written straight to the chat or channel (utils/automations.py:250 channel post); only tool calls can be held (utils/middleware.py:3613)", - "n8n": "source read at n8n@2.40.7, not driven: a sending tool can require approval before it runs (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:429 requireApproval on node tools such as Gmail or Send Email), and workflow agents can route replies through a Send and Wait approval node before the send step (packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts, packages/nodes-base/nodes/Telegram/hitl/) Note: Configured per tool or wired per workflow." + "n8n": "source read at n8n@2.40.7, not driven: a sending tool can require approval before it runs (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:429 requireApproval on node tools such as Gmail or Send Email), and workflow agents can route replies through a Send and Wait approval node before the send step (packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts, packages/nodes-base/nodes/Telegram/hitl/) Note: Configured per tool or wired per workflow.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: send_email, send_message_to_conversation and reply_to_message are dangerous tools (context_agent:ex_app/lib/all_tools/mail.py:16, talk.py:49,137), so the drafted text is shown for confirmation before it is sent (assistant:src/components/ChattyLLM/AgencyAction.vue:6-17)." } }, { @@ -4102,7 +4246,7 @@ "providerHow": "read-from-code", "feature": "human-approval-gate", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -4112,7 +4256,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/estop.py:1-8 and :36-39 `hermes pause` at the root home halts cron dispatch, kanban dispatch and new gateway turns for every profile; hermes_cli/commands.py:94 /pause; agent/estop.py:1-4 in-flight work is never killed Note: Stops new work everywhere at once; running turns finish. No organisations, so the scope is the whole install.", "dify": "source read at 1.17.1, not driven: searched 'kill switch|disable all|pause all|emergency stop' in api/controllers/console and web/i18n/en-US: no workspace-wide stop; each app's web app and API are toggled separately (api/controllers/console/agent/roster.py:1013)", "open-webui": "source read at v0.11.4, not driven: admin 'Disable All' models (src/lib/components/workspace/Models.svelte:365, routers/models.py:881 toggle each) and the global automations switch (src/lib/components/admin/Settings/General.svelte:377 ENABLE_AUTOMATIONS, checked at utils/automations.py:105) stop new runs; running tasks are stopped one by one (main.py:2128 /api/tasks/stop/{id}, admin) Note: no single action that also halts in-flight runs", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/unpublish/workflow.ts:8-29 'n8n unpublish:workflow --all' deactivates every workflow from the server shell; packages/cli/src/executions/executions.controller.ts:118 POST /stopMany stops running executions; the chat hub and Instance AI have admin on/off switches (packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:73 PUT /enabled) Note: No single UI switch that stops every agent, and Agents-module agents are not covered by the CLI command." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/unpublish/workflow.ts:8-29 'n8n unpublish:workflow --all' deactivates every workflow from the server shell; packages/cli/src/executions/executions.controller.ts:118 POST /stopMany stops running executions; the chat hub and Instance AI have admin on/off switches (packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:73 PUT /enabled) Note: No single UI switch that stops every agent, and Agents-module agents are not covered by the CLI command.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: disabling the context_agent ExApp unregisters its providers so no agent run starts (context_agent:ex_app/lib/main.py:132-136) and the admin can turn the Assistant off (assistant_enabled, assistant:lib/Controller/ConfigController.php:67-75). Instance-wide app switches, no dedicated kill switch or per-organisation scope." } }, { @@ -4132,7 +4277,7 @@ "providerHow": "read-from-code", "feature": "human-approval-gate", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -4142,7 +4287,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands.py:425-437 /stop interrupts a running agent and force-cleans a hung session; hermes_cli/commands.py:92 /stop kills background processes; agent/estop.py:31-33 `hermes -p pause` holds one profile; hermes_cli/subcommands/gateway.py stops a profile's gateway", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/completion.py:327 /agent//chat-messages//stop and workflow.py:1188 stop one running task; roster.py:1013 and web-app-access-card.tsx:254 switch the agent's surfaces off. No single control that stops all of one agent's running work at once Note: stop per run plus switch off per surface", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:881 POST /model/toggle sets is_active false and utils/models.py:210 drops inactive custom models from the served list; in-flight turns stop via main.py:2160 POST /api/tasks/chat/{chat_id}/stop and admin main.py:2128 /api/tasks/stop/{task_id}; automations pause at routers/automations.py:306", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/executions/executions.controller.ts:102-110 POST /:id/stop halts a running execution and :475 of packages/cli/src/workflows/workflows.controller.ts deactivates the workflow; Agents module: packages/cli/src/modules/agents/agent-chat.controller.ts:248 DELETE /:agentId/chat/runs/:runId stops a run and agent-publish.controller.ts:45 unpublishes" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/executions/executions.controller.ts:102-110 POST /:id/stop halts a running execution and :475 of packages/cli/src/workflows/workflows.controller.ts deactivates the workflow; Agents module: packages/cli/src/modules/agents/agent-chat.controller.ts:248 DELETE /:agentId/chat/runs/:runId stops a run and agent-publish.controller.ts:45 unpublishes", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a running Assistant task can be cancelled (assistant:src/components/TaskListItem.vue:60, AssistantTextProcessingForm.vue:99) and a scheduled task deleted (DELETE /assignments/{id}); no stop for one agent as a whole." } }, { @@ -4161,7 +4307,7 @@ "providerHow": "read-from-code", "feature": "agent-guardrails", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -4171,7 +4317,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/redact.py:871 redact_sensitive_text and :1157 redact_terminal_output mask API keys and tokens in terminal/tool output; gateway/session.py:193-203 and :382-385 privacy.redact_pii hashes user and chat ids in the model-visible session context; agent/redact.py:66 vault values redacted; searched 'pii|personal data' in agent/ tools/ gateway/: no content-level PII filter Note: Secrets are masked and identifiers can be hashed; personal data inside messages or files reaches the model unfiltered.", "dify": "source read at 1.17.1, not driven: api/core/moderation/input_moderation.py with keywords, openai_moderation and api providers (api/core/moderation/{keywords,openai_moderation,api}); api/core/moderation/base.py:10-20 DIRECT_OUTPUT blocks with a preset reply, OVERRIDDEN lets a custom API extension return rewritten inputs. No built-in PII or secret detector Note: blocking is built in; redaction only through a self-built API extension", "open-webui": "source read at v0.11.4, not driven: mechanism only: Filter functions run an inlet() on every request (backend/open_webui/utils/filter.py:212 process_filter_functions, global or per model via ModelEditor.svelte:1210 FiltersSelector); searched 'pii|presidio|redact|secret' in backend/open_webui: no shipped PII or secret filter, those are community Functions from openwebui.com Note: community Function, not core", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:71-72 'Sanitize Text' operation with PII (:138-156, all or selected entities) and secret-key detection (:174-200, strict/balanced/permissive), actions/checks/pii.ts and secretKeys.ts; placed before the AI Agent node in a workflow Note: A shipped node, placed by the builder in front of the agent." + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:71-72 'Sanitize Text' operation with PII (:138-156, all or selected entities) and secret-key detection (:174-200, strict/balanced/permissive), actions/checks/pii.ts and secretKeys.ts; placed before the AI Agent node in a workflow Note: A shipped node, placed by the builder in front of the agent.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'redact|pii|secret|filter' in context_agent:ex_app and assistant:lib/Service: prompts go to the provider unfiltered (context_agent:ex_app/lib/nc_model.py:97-157)." } }, { @@ -4190,7 +4337,7 @@ "providerHow": "read-from-code", "feature": "agent-guardrails", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "partial", "dify": "yes", @@ -4201,7 +4348,8 @@ "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:65-66 'Check Text for Violations' with keywords, jailbreak, NSFW, PII, topical alignment and URL checks (:99-273; actions/checks/*.ts), routing passing and failing text to separate outputs Note: Old partial rested on a Bedrock guardrail-version line; the Guardrails node checks output directly.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:108-111 transform_llm_output hook lets a plugin replace or block a final answer; plugins/security-guidance/README.md:1-10 bundled plugin flags dangerous code the agent writes (warns, still writes); gateway/response_filters.py:1-5 only suppresses intentional no-reply markers Note: No shipped content-rule check on answers; it takes a custom plugin hook.", "dify": "source read at 1.17.1, not driven: api/core/moderation/output_moderation.py moderates the streamed answer; web/i18n/en-US/app-debug.json:93-104 feature.moderation 'Moderate OUTPUT Content' with preset replies, keyword list, OpenAI moderation or API", - "open-webui": "source read at v0.11.4, not driven: Filter functions also run outlet() and stream hooks on answers (backend/open_webui/utils/filter.py:212, filter_type 'outlet'); searched 'moderation|guardrail|content rule' in backend/open_webui: none shipped, blocking rules must be written as or installed from community Functions Note: community Function, not core" + "open-webui": "source read at v0.11.4, not driven: Filter functions also run outlet() and stream hooks on answers (backend/open_webui/utils/filter.py:212, filter_type 'outlet'); searched 'moderation|guardrail|content rule' in backend/open_webui: none shipped, blocking rules must be written as or installed from community Functions Note: community Function, not core", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'moderation|guardrail|block' in both repos: output is stored as returned (assistant:lib/Listener/ChattyLLMTaskListener.php:128-131)." } }, { @@ -4220,7 +4368,7 @@ "providerHow": "read-from-code", "feature": "agent-guardrails", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", @@ -4230,7 +4378,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/approval_detection.py:51 hardline commands blocked unconditionally, other dangerous patterns routed to approval; tools/tirith_security.py:1-4 pre-exec scan with allow/block/warn verdicts; tools/approval.py:1095-1104 plugins can escalate any tool to the human gate; hermes_cli/config_defaults.py:1656-1670 smart mode, smart_policy and deny globs", "dify": "source read at 1.17.1, not driven: searched 'risk|dangerous|destructive|sensitive tool' in api/core/tools, dify-agent/src and web/i18n/en-US/tools.json: tools carry no risk class and no extra checks per class", "open-webui": "source read at v0.11.4, not driven: searched 'risk|danger|sensitive' in backend/open_webui/models/tools.py, routers/tools.py, utils/tools.py and utils/tool_approval.py: tools carry no risk class; approval mode is uniform per chat (utils/middleware.py:5934)", - "n8n": "source read at n8n@2.40.7, not driven: tools can be marked 'Require approval' one by one (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:382,408,429; en.json:7840-7841); searched 'risk|riskLevel|dangerous' in packages/cli/src/modules/agents and packages/@n8n/api-types/src/agents: no risk classes for tools and no stronger checks tied to a class Note: Per-tool approval, no risk classification." + "n8n": "source read at n8n@2.40.7, not driven: tools can be marked 'Require approval' one by one (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:382,408,429; en.json:7840-7841); searched 'risk|riskLevel|dangerous' in packages/cli/src/modules/agents and packages/@n8n/api-types/src/agents: no risk classes for tools and no stronger checks tied to a class Note: Per-tool approval, no risk classification.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every tool is classed safe or dangerous in code (context_agent:ex_app/lib/all_tools/lib/decorator.py), MCP tools always dangerous (context_agent:ex_app/lib/tools.py:48); dangerous ones require confirmation (context_agent:ex_app/lib/graph.py:81). Note: Two fixed classes, not admin-set." } }, { @@ -4249,7 +4398,7 @@ "providerHow": "read-from-code", "feature": "governed-cli-mcp-transport", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -4259,7 +4408,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/config.py:1122-1149 WEB_FETCH_FILTER_LIST block/allow entries enforced in retrieval/web/utils.py:153 _assert_host_allowed for fetch_url and webhooks, plus WEB_SEARCH_DOMAIN_FILTER_LIST (:1183); env-level only, and it does not cover code run in Jupyter or an Open Terminal (per-user network rules are the enterprise Terminals product, README.md:96)", "hermes-agent": "source read at v2026.9.24, not driven: tools/website_policy.py:1-5 security.website_blocklist enforced on URL-capable tools; hermes_cli/proxy_cli.py:234-254 iron-proxy allowed_hosts plus default-deny CIDRs for sandboxed terminals (tools/environments/docker_egress.py:1-5); hermes_cli/subcommands/egress.py:10-15 `hermes egress` Note: The host allowlist applies to the Docker sandbox through iron-proxy (off by default); the web tools use a blocklist.", "dify": "source read at 1.17.1, not driven: docker/ssrf_proxy/squid-agent.conf.template routes the agent sandbox through Squid, denying private networks but 'External internet is allowed' (http_access allow all); docker/ssrf_proxy/squid.conf.template does the same for HTTP nodes and tools. No per-agent allowlist of web addresses in the UI Note: blocks internal addresses, not a public-web allowlist; an admin can hand-edit the Squid config", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/ssrf-protection.config.ts:91-146 SSRF protection (off by default) blocks private IP ranges and N8N_SSRF_BLOCKED_HOSTNAMES instance-wide; credentials can restrict HTTP Request domains (packages/workflow/src/credential-domain-restrictions.ts:10-20 allowedHttpRequestDomains); searched 'allowlist|egress' in packages/cli/src/modules/agents: no per-agent list of allowed web addresses Note: Instance-wide blocking and per-credential domains; nothing per agent." + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/ssrf-protection.config.ts:91-146 SSRF protection (off by default) blocks private IP ranges and N8N_SSRF_BLOCKED_HOSTNAMES instance-wide; credentials can restrict HTTP Request domains (packages/workflow/src/credential-domain-restrictions.ts:10-20 allowedHttpRequestDomains); searched 'allowlist|egress' in packages/cli/src/modules/agents: no per-agent list of allowed web addresses Note: Instance-wide blocking and per-credential domains; nothing per agent.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the admin can switch off the Web access, DuckDuckGo, YouTube, weather and routing categories (context_agent:ex_app/lib/main.py:88-94); when on, web_fetch reaches any URL (context_agent:ex_app/lib/all_tools/web.py:14-20). No allow-list." } }, { @@ -4279,7 +4429,7 @@ "providerHow": "read-from-code", "feature": "woo-llm-anonymisation", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4289,7 +4439,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'anonymi' in *.py outside tests: only tools/browser_use_cli.py:155 disabling a telemetry flag; plugin-catalog/ has no anonymiser entry; agent/redact.py masks secrets, not personal data in documents", "dify": "source read at 1.17.1, not driven: searched 'anonymi|presidio|redact|pii' in api/core and web/i18n/en-US: only redaction of the agent backend request in logs (api/core/app/apps/agent_app/runtime_request_builder.py:34); no document anonymisation before the model reads it, and none in the official tool list (langgenius/dify-official-plugins tools/)", "open-webui": "source read at v0.11.4, not driven: searched 'anonymi|pseudonym|redact|presidio|pii' in backend/open_webui (routers, utils, retrieval): documents are extracted and embedded as-is (routers/retrieval.py); anonymising needs a community Filter function", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:71-72,138-156 'Sanitize Text' replaces detected PII in text before it reaches a model; document text comes from the Extract From File node (packages/nodes-base/nodes/Files/ExtractFromFile) Note: Works on extracted text; wired in the workflow before the model step." + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:71-72,138-156 'Sanitize Text' replaces detected PII in text before it reaches a model; document text comes from the Extract From File node (packages/nodes-base/nodes/Files/ExtractFromFile) Note: Works on extracted text; wired in the workflow before the model step.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'anonym|pseudonym|redact' in both repos: none." } }, { @@ -4308,7 +4459,7 @@ "providerHow": "read-from-code", "feature": "observability", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -4318,7 +4469,8 @@ "dify": "source read at 1.17.1, not driven: per-app and per-agent log pages to review past conversations and runs (api/controllers/console/agent/roster.py:1133,1172; web/i18n/en-US/app-log.json), with admin like/dislike and annotations (app-log.json filter.annotation.*, api/controllers/console/app/annotation.py) Note: per app log review, no cross-agent oversight page", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx browses every past session with tool messages (web/src/i18n/en.ts sessions.roles.tool) and an Automation filter for cron runs; hermes_cli/subcommands/approvals.py:13-23 `approvals suggest` mines past approval decisions; searched 'oversight|audit page' in web/src: none Note: After-the-fact review means reading transcripts; no oversight page that lists AI decisions for review.", "open-webui": "source read at v0.11.4, not driven: admins browse any model's conversations and messages: backend/open_webui/routers/analytics.py:285 /models/{id}/chats, :125 /messages, src/lib/components/admin/Analytics/AnalyticsModelModal.svelte; user feedback review in admin Evaluations (Feedbacks.svelte); no decision log with review status or sign-off Note: transcript browsing, not a structured oversight workflow", - "n8n": "source read at n8n@2.40.7, not driven: past runs can be reviewed in the executions list and per-run logs (packages/frontend/editor-ui/src/features/execution/executions, logs/components/LogsPanel.vue) and in Agents-module session timelines (packages/frontend/editor-ui/src/features/agents/views/AgentSessionTimelineView.vue); searched 'oversight|review decision' in packages/frontend/editor-ui/src/features: no page that gathers AI decisions for review Note: Run history exists; there is no oversight page for AI decisions." + "n8n": "source read at n8n@2.40.7, not driven: past runs can be reviewed in the executions list and per-run logs (packages/frontend/editor-ui/src/features/execution/executions, logs/components/LogsPanel.vue) and in Agents-module session timelines (packages/frontend/editor-ui/src/features/agents/views/AgentSessionTimelineView.vue); searched 'oversight|review decision' in packages/frontend/editor-ui/src/features: no page that gathers AI decisions for review Note: Run history exists; there is no oversight page for AI decisions.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'oversight|review|audit' in assistant:lib and src: no after-the-fact review page; only the user's own task list (assistant:src/components/TaskList.vue)." } }, { @@ -4337,7 +4489,7 @@ "providerHow": "read-from-code", "feature": "human-approval-gate", "featureConfidence": "low", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4347,7 +4499,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'automation.?bias|rubber.?stamp|approv\\w* everything|approval fatigue' in *.py and *.ts outside tests: only a code comment in gateway/authz_mixin.py:474; hermes_cli/subcommands/approvals.py:22-23 `approvals suggest` goes the other way, proposing allowlist entries from repeated approvals", "dify": "source read at 1.17.1, not driven: searched 'automation bias|rubber.?stamp|approval rate|approve all' in api/ and web/i18n/en-US: no tracking of how reviewers answer Human Input forms", "open-webui": "source read at v0.11.4, not driven: searched 'bias|rubber|approve all|approval rate' in backend/open_webui/utils/tool_approval.py, utils/middleware.py and src/lib/components/common/ToolCallDisplay.svelte: approvals are not counted or analysed per reviewer", - "n8n": "source read at n8n@2.40.7, not driven: searched 'automation bias|rubber|approval rate|approve all' in packages/cli/src/modules/agents, packages/frontend/editor-ui/src/features/agents and packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts: approvals are recorded per call only, with no warning about approving without looking" + "n8n": "source read at n8n@2.40.7, not driven: searched 'automation bias|rubber|approval rate|approve all' in packages/cli/src/modules/agents, packages/frontend/editor-ui/src/features/agents and packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts: approvals are recorded per call only, with no warning about approving without looking", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'bias|approve all|rubber' in assistant:src/components/ChattyLLM: none." } }, { @@ -4367,7 +4520,7 @@ "providerHow": "read-from-code", "feature": "agent-tool-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -4377,7 +4530,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 tool and skill usage breakdowns behind /insights (hermes_cli/commands.py:287) and web/src/i18n/en.ts models.toolCalls on AnalyticsPage; agent/tool_guardrails.py:1-6 flags tool-call loops within a turn; hermes_cli/config_defaults.py:1666 denial breaker after repeated guardian denials Note: Tool usage is counted and loops are caught; no review queue that flags misuse for a person. Old yes rested on a docs line.", "n8n": "source read at n8n@2.40.7, not driven: tool calls are reviewable per run: session timelines with tool rows and a tool filter (packages/frontend/editor-ui/src/features/agents/components/SessionTimelineTable.vue, SessionEventFilter.vue) and workflow logs (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue); every AI tool call is an event 'n8n.ai.tool.called' (packages/cli/src/eventbus/event-message-classes/index.ts:35); searched 'flag|misuse' in features/agents: no way to flag a tool call Note: Review yes, flagging misuse no.", "dify": "source read at 1.17.1, not driven: tool calls are visible per message and per run in the logs (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38, workflow run detail via api/controllers/console/app/workflow_run.py) and a reviewer can mark answers with admin feedback or annotations (api/controllers/console/app/annotation.py); searched 'misuse|flag tool' in api/: no tool-level flagging Note: review yes, flagging misuse per tool no", - "open-webui": "source read at v0.11.4, not driven: per-user 'Most used tools' in src/lib/components/chat/Settings/Usage.svelte:472 (routers/chats.py:307 /stats/usage); admins read tool calls inside any conversation (routers/analytics.py:125 /messages, :285 model chats); searched 'flag|misuse|report' in routers/analytics.py and routers/tools.py: no flagging Note: tool use is visible, misuse cannot be flagged" + "open-webui": "source read at v0.11.4, not driven: per-user 'Most used tools' in src/lib/components/chat/Settings/Usage.svelte:472 (routers/chats.py:307 /stats/usage); admins read tool calls inside any conversation (routers/analytics.py:125 /messages, :285 model chats); searched 'flag|misuse|report' in routers/analytics.py and routers/tools.py: no flagging Note: tool use is visible, misuse cannot be flagged", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each answer lists the tools it used (assistant:src/components/ChattyLLM/Message.vue:54-72) for the user themselves; no admin review or misuse flag." } }, { @@ -4397,7 +4551,7 @@ "providerHow": "read-from-code", "feature": "run-audit-log", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -4407,7 +4561,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_state_messages.py / state.db keep every message and tool call per session; cron/executions.py:1-6 durable per-attempt execution ledger with immutable terminal states; agent/curator_backup.py:37 append-only curator ledger; searched 'tamper|hash.?chain|audit trail' in *.py: no tamper-evident log, and sessions are deletable (hermes_cli/web_routers/sessions.py:696) Note: Runs and tool calls are recorded but can be deleted or pruned; nothing prevents change afterwards.", "dify": "source read at 1.17.1, not driven: every run, node execution and agent thought is stored (api/models/workflow.py node executions, message agent thoughts) but rows are deletable by retention jobs (api/services/retention/conversation/messages_clean_service.py:566); audit events are emitted as log lines for the Enterprise OTel exporter only (api/controllers/openapi/_audit.py:1-6; api/enterprise/telemetry/README.md 'only available in ENTERPRISE') Note: records exist, not tamper-proof; audit stream is enterprise-licensed", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/audit.py:36 AuditLogEntry middleware writes HTTP requests (with user, path, body up to MAX_BODY_LOG_SIZE) to DATA_DIR/audit.log via utils/logger.py:200 with rotation; off by default (env.py:1236 AUDIT_LOG_LEVEL 'NONE'); plain rotating file, not tamper-evident, and tool calls are only inside chat records Note: request-level audit, not immutable, off by default", - "n8n": "source read at n8n@2.40.7, not driven: runs are stored as executions and AI tool calls emit 'n8n.ai.tool.called' events (packages/cli/src/eventbus/event-message-classes/index.ts:16,35); the append-only copy lives outside n8n only when log streaming is on, packages/cli/src/modules/log-streaming.ee/log-streaming.controller.ts:46 @Licensed('feat:logStreaming'); executions are prunable and deletable (packages/@n8n/config/src/configs/executions.config.ts:106-111) Note: Local history can be deleted or pruned; a tamper-evident trail needs the enterprise-licensed log streaming to an outside store." + "n8n": "source read at n8n@2.40.7, not driven: runs are stored as executions and AI tool calls emit 'n8n.ai.tool.called' events (packages/cli/src/eventbus/event-message-classes/index.ts:16,35); the append-only copy lives outside n8n only when log streaming is on, packages/cli/src/modules/log-streaming.ee/log-streaming.controller.ts:46 @Licensed('feat:logStreaming'); executions are prunable and deletable (packages/@n8n/config/src/configs/executions.config.ts:106-111) Note: Local history can be deleted or pruned; a tamper-evident trail needs the enterprise-licensed log streaming to an outside store.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent logs task inputs to the Nextcloud log (context_agent:ex_app/lib/main.py:169-178) and messages keep tool names (assistant:lib/Listener/ChattyLLMTaskListener.php:97-98); searched 'audit|immutable' in both repos: no tamper-proof trail." } }, { @@ -4426,7 +4581,7 @@ "providerHow": "read-from-code", "feature": "multi-tenant-ops", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -4436,7 +4591,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/sessions.py:69-95 `sessions export --format jsonl|trace --redact` over filtered sessions; hermes_cli/subcommands/cron.py:168 `cron runs` execution history Note: Exports are transcripts, not an audit report; no dashboard export across sessions.", "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI to JSONL.GZ per app (no tool calls); api/controllers/console/workflow_run_archive.py:93-130 run archive download is Cloud paid-plan only; Enterprise OTel exporter (api/enterprise/telemetry/exporter.py) ships audit logs Note: CLI message export in community; fuller audit export is cloud or enterprise", "open-webui": "source read at v0.11.4, not driven: the audit trail is the file at env.py:1226 AUDIT_LOGS_FILE_PATH (utils/logger.py:200) that an operator can copy; searched 'audit' in backend/open_webui/routers and src/lib/components/admin: no export endpoint or UI; chat data export exists (routers/chats.py:1049 /all/db admin)", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/log-streaming.ee/destinations/ streams audit and AI events to syslog, webhook or Sentry, licence-gated at log-streaming.controller.ts:46,57 @Licensed('feat:logStreaming'); executions can be exported per run through the public API (packages/cli/src/public-api/v1/handlers/executions/spec/paths/getExecutions.generated.yml:18) Note: Enterprise-licensed; no one-file audit export for an auditor." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/log-streaming.ee/destinations/ streams audit and AI events to syslog, webhook or Sentry, licence-gated at log-streaming.controller.ts:46,57 @Licensed('feat:logStreaming'); executions can be exported per run through the public API (packages/cli/src/public-api/v1/handlers/executions/spec/paths/getExecutions.generated.yml:18) Note: Enterprise-licensed; no one-file audit export for an auditor.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'export|audit' in assistant:lib: none." } }, { @@ -4456,7 +4612,7 @@ "providerHow": "read-from-code", "feature": "agent-lifecycle-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -4466,7 +4622,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:2231-2245 sessions.auto_prune with retention_days (default 90) deletes ended sessions on startup sweeps; hermes_cli/subcommands/sessions.py:105 `sessions prune` by age, source or title; :123 archive", "dify": "source read at 1.17.1, not driven: api/configs/feature/__init__.py:1425 ENABLE_CLEAN_MESSAGES and :1623-1624 WORKFLOW_LOG_CLEANUP_ENABLED / WORKFLOW_LOG_RETENTION_DAYS; api/schedule/clean_messages.py:17-23 'Self-hosted editions delete all messages within the configured time range'; api/schedule/clean_workflow_runlogs_precise.py Note: instance-wide environment settings, off by default, no per-workspace or per-agent setting in the UI", "open-webui": "source read at v0.11.4, not driven: searched 'retention|older_than|prune|expire|ttl' in backend/open_webui/routers, models/chats.py and config.py: no chat or run retention period; ENABLE_KNOWLEDGE_FILE_RETENTION (config.py:985) only keeps files when removed from a knowledge base; temporary chats that are never stored can be enforced per user ('temporary_enforced' permission)", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/executions.config.ts:106-126 EXECUTIONS_DATA_PRUNE (on by default), EXECUTIONS_DATA_MAX_AGE 336 hours and max count 10,000 with a hard-delete buffer; agent checkpoints expire after N8N_AGENTS_CHECKPOINT_TTL (packages/@n8n/config/src/configs/agents.config.ts:38-39) Note: Set by the operator in environment variables, not in the UI." + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/executions.config.ts:106-126 EXECUTIONS_DATA_PRUNE (on by default), EXECUTIONS_DATA_MAX_AGE 336 hours and max count 10,000 with a hard-delete buffer; agent checkpoints expire after N8N_AGENTS_CHECKPOINT_TTL (packages/@n8n/config/src/configs/agents.config.ts:38-39) Note: Set by the operator in environment variables, not in the UI.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'retention|expire|cleanup' in assistant:lib: chats are kept until deleted by the user or on user deletion (assistant:lib/Listener/UserDeletedListener.php:42-48)." } }, { @@ -4486,7 +4643,7 @@ "providerHow": "read-from-code", "feature": "ai-feature-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4496,7 +4653,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/inventory.py:1-2 is a provider/model inventory for pickers, not an AI-feature register", "dify": "source read at 1.17.1, not driven: searched 'register|risk class|ai act|inventory' in api/models, api/services and web/i18n/en-US: no register of AI features with a risk class", "open-webui": "source read at v0.11.4, not driven: searched 'register|risk class|ai act|inventory' in backend/open_webui/models and src/lib/components/admin: no register of AI features with a risk class", - "n8n": "source read at n8n@2.40.7, not driven: searched 'ai register|risk class|AI Act|inventory' in packages/cli/src and packages/frontend/editor-ui/src: no register of AI features with a risk class" + "n8n": "source read at n8n@2.40.7, not driven: searched 'ai register|risk class|AI Act|inventory' in packages/cli/src and packages/frontend/editor-ui/src: no register of AI features with a risk class", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'register|risk' in both repos: none." } }, { @@ -4516,7 +4674,7 @@ "providerHow": "read-from-code", "feature": "ai-feature-governance", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4526,7 +4684,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no risk-level field", "dify": "source read at 1.17.1, not driven: searched 'risk|ai act|high.?risk|classification' in api/models/agent.py, api/models/model.py and web/i18n/en-US: agents and apps carry no risk level field", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models carry no risk-level field (backend/open_webui/models/models.py:74 ModelMeta)", - "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no EU AI Act risk classification of agents" + "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no EU AI Act risk classification of agents", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'AI Act|risk class|high-risk' in both repos: none." } }, { @@ -4546,7 +4705,7 @@ "providerHow": "read-from-code", "feature": "ai-feature-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4556,7 +4715,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; no sign-off or go-live gate on profiles, skills or plugins beyond tools/write_approval.py staged writes", "dify": "source read at 1.17.1, not driven: searched 'dpo|data protection officer|sign.?off|go.?live approval' in api/ and web/i18n/en-US: publishing an agent needs only edit/publish permission (api/controllers/console/agent/roster.py:815), no sign-off step", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; publishing a model is immediate on save (routers/models.py:285), no sign-off step", - "n8n": "source read at n8n@2.40.7, not driven: workflow reviews let an author request named reviewers (packages/@n8n/db/src/entities/workflow-review-request-reviewer.ee.ts) and block publishing while a review is open or changes are requested (packages/cli/src/modules/workflow-reviews.ee/workflow-review-publish-guard.service.ts:8-22), licence-gated by feat:workflowReviews (packages/@n8n/constants/src/index.ts:58); searched 'data protection officer|DPIA|high-risk' in packages/cli/src: no DPO role or risk trigger Note: A DPO can be named as reviewer by hand; nothing ties sign-off to high-risk features. Enterprise-licensed." + "n8n": "source read at n8n@2.40.7, not driven: workflow reviews let an author request named reviewers (packages/@n8n/db/src/entities/workflow-review-request-reviewer.ee.ts) and block publishing while a review is open or changes are requested (packages/cli/src/modules/workflow-reviews.ee/workflow-review-publish-guard.service.ts:8-22), licence-gated by feat:workflowReviews (packages/@n8n/constants/src/index.ts:58); searched 'data protection officer|DPIA|high-risk' in packages/cli/src: no DPO role or risk trigger Note: A DPO can be named as reviewer by hand; nothing ties sign-off to high-risk features. Enterprise-licensed.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dpo|sign off|approval' in assistant:lib/Settings: none." } }, { @@ -4577,7 +4737,7 @@ "feature": "compliance-control-packs", "featureConfidence": "high", "defectCandidate": "ComplianceDashboard.vue and its only two API calls (dashboard, export) are dead code per an explicit comment in src/customComponents.js; the backend routes still exist and work if called directly.", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4587,7 +4747,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/subcommands/security.py and `skills audit` scan code and skills for security patterns, not against a control framework", "dify": "source read at 1.17.1, not driven: searched 'iso 42001|42001|control framework|ai act' in api/ and web/i18n/en-US: nothing checks the organisation against a framework; web/i18n/en-US/common.json:124-125 only lists Dify's own vendor certificates (GDPR DPA, ISO 27001)", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no control framework checks anywhere in admin settings", - "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768); the security audit checks instance hygiene (packages/cli/src/security-audit/risk-reporters/ credentials, database, filesystem, instance, nodes), not a control framework" + "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768); the security audit checks instance hygiene (packages/cli/src/security-audit/risk-reporters/ credentials, database, filesystem, instance, nodes), not a control framework", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'ISO|42001|control' in both repos: none." } }, { @@ -4606,7 +4767,7 @@ "providerHow": "read-from-code", "feature": "compliance-control-packs", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -4616,7 +4777,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profile_cmd.py:384-395 `profile show` prints model and provider, gateway state, skill count, SOUL.md presence and distribution; hermes_cli/profile_cmd.py:564-570 `profile info` prints description, author, licence, requirements, source of a distribution Note: A profile summary exists; it does not describe data used or purpose in fact-sheet form or export one.", "dify": "source read at 1.17.1, not driven: searched 'fact ?sheet|model card|system card' in api/ and web/i18n/en-US: no generated fact sheet of an agent's model, data and purpose; the closest is DSL export of its configuration (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52)", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the nearest artefact is the model JSON export (routers/models.py:381) and the description field (ModelEditor.svelte:962), not a generated fact sheet", - "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no generated fact sheet for an agent's model, data and purpose" + "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no generated fact sheet for an agent's model, data and purpose", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'factsheet|model card' in both repos: only the app store 'Ethical AI Rating' text in context_agent:appinfo/info.xml description, not generated per agent." } }, { @@ -4637,7 +4799,7 @@ "feature": "compliance-control-packs", "featureConfidence": "high", "defectCandidate": "customComponents.js:100-106 itself flags this as a product decision still open: re-home the export onto compliance-operations or retire the route.", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4647,7 +4809,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; the nearest exports are session transcripts (hermes_cli/subcommands/sessions.py:69) and `hermes debug` reports (hermes_cli/commands.py:303), neither a compliance report", "dify": "source read at 1.17.1, not driven: api/controllers/console/billing/compliance.py:28-49 and api/services/compliance_download_service.py only hand out Dify's own vendor documents (GDPR DPA, ISO 27001, web/i18n/en-US/common.json:124-127) to paid Cloud plans; no compliance report about the organisation's own agents Note: the 'compliance' download is the vendor's certificate, not the customer's report", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; exports cover models, chats, feedback and config (routers/models.py:381, routers/evaluations.py:354, routers/configs.py:118), none is a compliance report", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/audit.ts:27 'Generate a security audit report for this n8n instance' and public API packages/cli/src/public-api/v1/handlers/audit/audit.handler.ts return one risk report (packages/cli/src/security-audit/risk-reporters/: credentials, database, filesystem, instance, nodes); searched 'AI Act|42001|compliance report' in packages/cli/src: no AI compliance report Note: A one-shot security risk report, not an AI compliance report." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/audit.ts:27 'Generate a security audit report for this n8n instance' and public API packages/cli/src/public-api/v1/handlers/audit/audit.handler.ts return one risk report (packages/cli/src/security-audit/risk-reporters/: credentials, database, filesystem, instance, nodes); searched 'AI Act|42001|compliance report' in packages/cli/src: no AI compliance report Note: A one-shot security risk report, not an AI compliance report.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'compliance|report' in assistant:lib: none." } }, { @@ -4666,7 +4829,7 @@ "providerHow": "read-from-code", "feature": "agent-lifecycle-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4676,7 +4839,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 records operational cron failure incidents (job id, error signature, ack) with no impact or remediation fields; searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none Note: Operational failure incidents only; no AI-incident record.", "dify": "source read at 1.17.1, not driven: searched 'incident|impact|postmortem' in api/models, api/services and web/i18n/en-US: no AI incident record", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the event catalogue (events.py:42) has no incident type", - "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no record of AI incidents, impact or follow-up" + "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no record of AI incidents, impact or follow-up", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'incident' in both repos: none." } }, { @@ -4696,7 +4860,7 @@ "providerHow": "read-from-code", "feature": "agent-lifecycle-governance", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4706,7 +4870,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; cron/incidents.py:1-10 alerts only the operator's home channel", "dify": "source read at 1.17.1, not driven: searched 'authority|regulator|serious incident|notify' in api/services and web/i18n/en-US: no incident record and no authority notification", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no incident record to notify from", - "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no incident register and no notification to an authority" + "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no incident register and no notification to an authority", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'incident|authority|notify' outside user notifications in both repos: none." } }, { @@ -4725,7 +4890,7 @@ "providerHow": "read-from-code", "feature": "agent-lifecycle-governance", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4735,7 +4900,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'owner|attest|review.{0,20}(access|owner)|recertif' in hermes_cli/profiles.py and hermes_cli/profile_cmd.py: no owner field and no periodic review; hermes_cli/profiles.py:538-575 ProfileInfo", "dify": "source read at 1.17.1, not driven: searched 'access review|attest|recertif|periodic review' in api/ and web/i18n/en-US: no periodic owner or need review of agents", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models keep their creator as owner forever (backend/open_webui/models/models.py:117) with no review date or re-attestation", - "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no periodic review in which owners attest that an agent is still needed; user and project membership pages exist but carry no review cycle" + "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no periodic review in which owners attest that an agent is still needed; user and project membership pages exist but carry no review cycle", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent owners to review; searched 'review|attest' in assistant:lib: none." } }, { @@ -4755,7 +4921,7 @@ "providerHow": "read-from-code", "feature": "ai-feature-governance", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", @@ -4765,7 +4931,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'transparency|explain.{0,20}agent|public.{0,20}(page|description)' in web/src and hermes_cli/web_routers: none; profile descriptions (hermes_cli/web_routers/profiles.py:928) feed the kanban router and are not published to anyone", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/site.py:49-57 each web app can show a description, privacy policy link and custom disclaimer to its users; no generated plain-language register or explanation of the agents employees deal with Note: per-app description and disclaimer only", "open-webui": "source read at v0.11.4, not driven: each agent has a user-facing, localisable description (backend/open_webui/models/models.py:78 'User-facing description of the model.', ModelEditor.svelte:962) shown in the model selector, and admins can post banners (src/lib/components/admin/Settings/Interface/Banners.svelte); no published page explaining the agents employees deal with Note: short per-agent descriptions only", - "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no published plain-language explanation of agents for employees" + "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no published plain-language explanation of agents for employees", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the chat states 'Output shown here is generated by AI. Make sure to always double-check.' (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:178) and the app listing carries an Ethical AI Rating (context_agent:appinfo/info.xml description). No published plain-language explanation per agent." } }, { @@ -4784,7 +4951,7 @@ "providerHow": "read-from-code", "feature": "a-provider-and-a-place-per-ai-feature", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -4794,7 +4961,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/status.py:157 `hermes status` prints the effective provider; hermes_cli/config_defaults.py:715-790 auxiliary..provider per feature in config; hermes_cli/model_data_policy_guard.py:1-6 warns when a tier trains on prompts; searched 'region|residency|data location' in hermes_cli/: no per-feature residency view Note: You can read which provider each feature uses from config and status, but not where that provider processes the data.", "dify": "source read at 1.17.1, not driven: searched 'residency|region|data location|processing location' in api/ and web/i18n/en-US: providers show no processing location per feature", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; connections record a URL but no location, and no view maps AI features to where they process data (src/lib/components/admin/Settings/Connections.svelte)", - "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no view of where each AI feature processes data; a model credential only holds its endpoint (packages/nodes-base/credentials/OpenAiApi.credentials.ts:35-36 Base URL)" + "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no view of where each AI feature processes data; a model credential only holds its endpoint (packages/nodes-base/credentials/OpenAiApi.credentials.ts:35-36 Base URL)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: users see which provider backs each feature under 'Configured backends' (assistant:src/components/PersonalSettings.vue:52-60) and per task 'Provider: {name}' (AssistantTextProcessingForm.vue:73); where that provider processes data is not shown." } }, { @@ -4814,7 +4982,7 @@ "providerHow": "read-from-code", "feature": "human-approval-gate", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -4824,7 +4992,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'department|group|org' scoping in hermes_cli/profiles.py and gateway/authz_mixin.py: no organisational units; agent/estop.py:31-39 pauses a whole profile or install and gateway/authz_mixin.py:32-37 allowlists individual user ids, with no proof-of-off report Note: Cutting a set of users off is possible by editing allowlists, not by department, and nothing proves it.", "dify": "source read at 1.17.1, not driven: searched 'department|group.*disable|ai off' in api/ and web/i18n/en-US: community has no departments; enterprise RBAC per-agent access policies (web/features/agent-v2/permissions.ts:37, api/configs/enterprise/__init__.py:38) grant access but there is no switch that turns AI off for a group with proof", "open-webui": "source read at v0.11.4, not driven: group permissions switch features and model access per group (src/lib/components/admin/Users/Groups/Permissions.svelte:44-51, backend/open_webui/routers/groups.py:401); permissions are additive and a default user permission 'will remain enabled' (Permissions.svelte:78), and there is no proof view that AI is off for a group Note: can narrow a group only when defaults are off; no evidence it is off", - "n8n": "source read at n8n@2.40.7, not driven: a project's node type policy can block AI node types for that project (packages/cli/src/modules/type-availability-policies/type-availability-policy-project.controller.ts:19-24), licence-gated in type-availability-policies.module.ts:10-12 licenseFlag NODE_TYPE_POLICIES and not in the default module list; the chat hub has only an instance-wide switch (packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:73) Note: Per project (as a department) with an enterprise licence and an opt-in module; proof is the policy itself, no report." + "n8n": "source read at n8n@2.40.7, not driven: a project's node type policy can block AI node types for that project (packages/cli/src/modules/type-availability-policies/type-availability-policy-project.controller.ts:19-24), licence-gated in type-availability-policies.module.ts:10-12 licenseFlag NODE_TYPE_POLICIES and not in the default module list; the chat hub has only an instance-wide switch (packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:73) Note: Per project (as a department) with an enterprise licence and an opt-in module; proof is the policy itself, no report.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant has one global switch and a per-user switch (assistant:lib/Listener/BeforeTemplateRenderedListener.php:61-62); limiting an app to groups is a server app-management feature (not read). No per-department AI switch or proof in these repos." } }, { @@ -4843,7 +5012,7 @@ "providerHow": "read-from-code", "feature": "run-analytics", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", @@ -4854,7 +5023,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:121 run list with status filter, created time and elapsed time (web/app/components/app/workflow-log/list.tsx); api/controllers/console/agent/roster.py:1133 agent logs with created/updated time, message count and user rate (web/i18n/en-US/agent-v-2.json logs.table.*)", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/execution/executions/views/ExecutionsView.vue lists executions with status, start time and duration (en.json:1429 'Error', 1621 'Waiting' statuses); Agents module sessions list per agent (packages/frontend/editor-ui/src/features/agents/views/AgentSessionsListView.vue, AgentSessionsFilter.vue:25-34 status filter)", "open-webui": "source read at v0.11.4, not driven: scheduled runs: backend/open_webui/routers/automations.py:388 GET /{id}/runs with status, time and error (models/automations.py:43-50), shown in src/lib/components/automations/AutomationEditor.svelte:355-400; interactive turns are chats with no status list; no list across all agents Note: old yes; run history exists only per automation", - "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx with web/src/i18n/en.ts sessions.filterAutomation 'Automation' lists cron and other runs with time; hermes_cli/web_routers/cron.py:243 GET /api/cron/jobs/{id}/runs; hermes_cli/subcommands/cron.py:168 `cron runs` durable attempts with status (cron/executions.py:1-6)" + "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx with web/src/i18n/en.ts sessions.filterAutomation 'Automation' lists cron and other runs with time; hermes_cli/web_routers/cron.py:243 GET /api/cron/jobs/{id}/runs; hermes_cli/subcommands/cron.py:168 `cron runs` durable attempts with status (cron/executions.py:1-6)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: per task type the Assistant lists past tasks with status Succeeded, Failed, Running, Scheduled (assistant:src/components/TaskList.vue, TaskListItem.vue:101-105; GET /api/v1/tasks). Agent chat turns and scheduled runs show only as chat messages, not in a run list." } }, { @@ -4873,7 +5043,7 @@ "providerHow": "read-from-code", "feature": "observability", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -4883,7 +5053,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:596 GET /api/sessions/{id}/messages and :651 /timeline behind web/src/pages/SessionsPage.tsx with user, assistant and tool roles in order (web/src/i18n/en.ts sessions.roles); plugins/observability/langfuse traces each step; hermes_cli/subcommands/sessions.py:76 `--format trace` export for the Agent Trace Viewer", "dify": "source read at 1.17.1, not driven: workflow run detail with a TRACING tab listing each node in order with inputs, outputs, status, time and tokens (web/i18n/en-US/run-log.json tracing, meta.*; web/app/components/workflow/run/node.tsx:89); chat messages show each agent thought and tool call (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38); agent logs per conversation (api/controllers/console/agent/roster.py:1172)", "n8n": "source read at n8n@2.40.7, not driven: the Logs panel shows each node, model call and tool call of a run in order with inputs and outputs (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue, LogDetailsPanel.vue, LogsViewRunData.vue); Agents-module session timeline with tool calls and token use per message (packages/frontend/editor-ui/src/features/agents/views/AgentSessionTimelineView.vue, en.json:1435 'Token Usage') Note: Old partial rested on a generic execution-history line; logs show every step in order.", - "open-webui": "source read at v0.11.4, not driven: each run is a chat whose assistant message keeps ordered output items (function_call, function_call_output, reasoning, text; backend/open_webui/utils/tool_approval.py:43, utils/middleware.py:5925); src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116-176 renders them in order; automation runs link to their chat (models/automations.py:46 chat_id)" + "open-webui": "source read at v0.11.4, not driven: each run is a chat whose assistant message keeps ordered output items (function_call, function_call_output, reasoning, text; backend/open_webui/utils/tool_approval.py:43, utils/middleware.py:5925); src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116-176 renders them in order; automation runs link to their chat (models/automations.py:46 chat_id)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: an answer shows the tools used and any reasoning content (assistant:src/components/ChattyLLM/Message.vue:36-72); tool arguments are shown only when approval is asked (AgencyAction.vue). No ordered step trace with tool results." } }, { @@ -4902,7 +5073,7 @@ "providerHow": "read-from-code", "feature": "run-replay-and-dry-run", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -4912,7 +5083,8 @@ "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/executions/executions.controller.ts:129 POST /:id/retry re-runs a past execution (en.json:1577 'Retry execution', 1579 'Retry with currently saved workflow'); 'Debug in editor' loads a past run's data into the canvas (en.json:1631), paywalled per en.json:1632 (feat:debugInEditor) Note: Retry is free; loading the run into the editor is enterprise-licensed.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:68 /retry resends the last message, :71 /undo backs up N turns and re-prompts, :76 /branch forks a session; hermes_cli/subcommands/cron.py:157 re-runs a job; agent/replay_cleanup.py:1-5 only sanitises resumed history; searched 'replay' for a run re-execution feature: none Note: You can re-run from a point in a live session, but not replay a stored past run to reproduce it.", "dify": "source read at 1.17.1, not driven: in the draft canvas a node can be re-run with its Last Run values from the variable inspector (web/i18n/en-US/workflow.json:272 debug.lastRunTab; api/controllers/console/app/workflow_draft_variable.py); searched 'replay|rerun|run again' in web/i18n/en-US and api/controllers/console/app: no replay of a logged production run (only a Re-run in RAG pipelines, pipeline.json:12) Note: node re-run in the editor, not replay of a past run", - "open-webui": "source read at v0.11.4, not driven: a past turn can be re-run with 'Regenerate' (src/lib/components/chat/Messages/ResponseMessage.svelte, permission chat.regenerate_response) and a chat cloned or forked (backend/open_webui/routers/chats.py:1775 /clone, :1672 /fork); tool results are not recorded for deterministic replay, so it is a fresh run" + "open-webui": "source read at v0.11.4, not driven: a past turn can be re-run with 'Regenerate' (src/lib/components/chat/Messages/ResponseMessage.svelte, permission chat.regenerate_response) and a chat cloned or forked (backend/open_webui/routers/chats.py:1775 /clone, :1672 /fork); tool results are not recorded for deterministic replay, so it is a fresh run", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: 'Regenerate message' reruns the last turn with current state (assistant:src/components/ChattyLLM/MessageActions.vue:18, GET /chat/regenerate); searched 'replay' in both repos: no replay of a past run." } }, { @@ -4931,7 +5103,7 @@ "providerHow": "read-from-code", "feature": "run-replay-and-dry-run", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -4941,7 +5113,8 @@ "n8n": "source read at n8n@2.40.7, not driven: pinned node data lets a run reuse fixed outputs instead of calling a service (MCP tool packages/cli/src/modules/mcp/tools/prepare-workflow-pin-data.tool.ts, instance-ai-run-pin-data.ts); the agent preview 'only tests the agent' but still runs its tools (en.json:654); searched 'dry run|dryRun|sandbox mode' in packages/cli/src/modules/agents: no mode that blocks side effects Note: No switch that keeps an agent from changing anything; pinning must be set per node.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:132 /plan writes a plan without executing anything; hermes_cli/commands.py:213 /tools disable to remove write-capable tools for a run; hermes_cli/commands.py:83 /rollback restores filesystem checkpoints (tools/checkpoint_manager.py); searched 'dry.?run' in hermes_cli/commands.py: only /worktree prune and /compress previews Note: No mode that runs an agent end to end while blocking every side effect.", "dify": "source read at 1.17.1, not driven: searched 'dry.?run|mock|simulat' in web/i18n/en-US/workflow.json, agent-v-2.json and api/core/workflow: draft debug runs and Agent v2 Build mode execute tools and the sandbox for real (agent-v-2.json build.empty.communityEditionTip 'changes made to the file system happen in real time'); only webhook triggers can be simulated (workflow.json:291) Note: test runs are separate from the published version but still act", - "open-webui": "source read at v0.11.4, not driven: searched 'dry run|dry_run|simulate|sandbox mode' in backend/open_webui/utils/middleware.py, utils/tools.py and routers: no mode that lets an agent run while blocking side effects; the closest is per-chat 'Ask for approval' (utils/middleware.py:5934)" + "open-webui": "source read at v0.11.4, not driven: searched 'dry run|dry_run|simulate|sandbox mode' in backend/open_webui/utils/middleware.py, utils/tools.py and routers: no mode that lets an agent run while blocking side effects; the closest is per-chat 'Ask for approval' (utils/middleware.py:5934)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every write tool is dangerous and stops for confirmation (context_agent:ex_app/lib/graph.py:81), so a user can see intended actions and cancel; searched 'dry|simulate' in both repos: no dry-run mode, safe read tools still run." } }, { @@ -4961,7 +5134,7 @@ "providerHow": "read-from-code", "feature": "run-analytics", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "yes", "dify": "partial", @@ -4972,7 +5145,8 @@ "dify": "source read at 1.17.1, not driven: per app/agent charts for conversations, end users, token costs, session interactions, satisfaction rate, response time and tokens per second (api/controllers/console/app/statistic.py:151-340; workflow_statistic.py:97-184; agent-v-2.json monitoring.metrics.*). No dashboard across agents and no success-rate or tool-use chart Note: per app, no cross-agent view, no tool use", "open-webui": "source read at v0.11.4, not driven: admin Analytics (src/lib/components/admin/Analytics/Dashboard.svelte) with backend/open_webui/routers/analytics.py:58 per-model counts, :85 users, :199 daily, :235 token usage by model, feedback activity; no success rate, speed, cost or tool use per agent Note: README.md:68 says cost, the code tracks tokens only", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/analytics.py:143 /api/analytics/usage and :305 /api/analytics/models behind web/src/pages/AnalyticsPage.tsx: tokens per day, sessions, API calls, estimated cost, tool calls, top skills (web/src/i18n/en.ts analytics, models); agent/insights.py:1-2 /insights Note: Cost, volume and tool use are charted; success rate and speed are not, and there is no per-agent breakdown across profiles on one dashboard.", - "n8n": "source read at n8n@2.40.7, not driven: Insights shows production executions, failure rate, time saved and average run time (en.json:6750-6755; packages/cli/src/modules/insights), the full dashboard behind feat:insights:viewDashboard (packages/@n8n/constants/src/index.ts:46); searched 'cost|tool use' in packages/cli/src/modules/insights: no cost or tool-use metrics across agents Note: Success and speed per workflow; no cost or tool use; dashboard is enterprise-licensed." + "n8n": "source read at n8n@2.40.7, not driven: Insights shows production executions, failure rate, time saved and average run time (en.json:6750-6755; packages/cli/src/modules/insights), the full dashboard behind feat:insights:viewDashboard (packages/@n8n/constants/src/index.ts:46); searched 'cost|tool use' in packages/cli/src/modules/insights: no cost or tool-use metrics across agents Note: Success and speed per workflow; no cost or tool use; dashboard is enterprise-licensed.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'analytics|metrics|stats' in both repos: none." } }, { @@ -4992,7 +5166,7 @@ "providerHow": "read-from-code", "feature": "run-analytics", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "partial", "dify": "partial", @@ -5003,7 +5177,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_state_usage.py:29-56 per-session estimated_cost_usd and actual_cost_usd with token counts; hermes_cli/commands.py:138 /status and :280 /usage show session tokens; gateway/runtime_footer.py:1-6 optional per-reply footer (model, context %, latency) Note: Tokens and cost are kept per session (run), not per step.", "dify": "source read at 1.17.1, not driven: web/app/components/workflow/run/meta.tsx:91-97 total tokens per run and web/app/components/workflow/run/node.tsx:89 tokens per node; money cost appears only in aggregate token-cost charts (api/controllers/console/app/statistic.py:232, web/app/components/app/overview/app-chart.tsx) Note: tokens per run and step, cost only in totals", "open-webui": "source read at v0.11.4, not driven: per-message token usage stored (backend/open_webui/utils/middleware.py:3737 merge_usage) and shown in src/lib/components/chat/Messages/ResponseMessage.svelte:1209-1213; searched 'cost|price' in routers/analytics.py and utils/middleware.py: no cost, and no per-step split", - "n8n": "source read at n8n@2.40.7, not driven: Agents-module sessions show token usage and cost per message (en.json:1435 'Token Usage', 1492 'Cost'; cost from the model catalog, packages/@n8n/agents/src/sdk/catalog.ts:215-217 and runtime/loop/agent-runtime.ts:1234, recorded in packages/cli/src/modules/agents/execution-recorder.ts:472); workflow Logs panel shows tokens per model call (packages/frontend/editor-ui/src/features/execution/logs/components/LogsViewConsumedTokenCountText.vue) Note: Cost only in the opt-in Agents module; workflow runs show tokens, not cost." + "n8n": "source read at n8n@2.40.7, not driven: Agents-module sessions show token usage and cost per message (en.json:1435 'Token Usage', 1492 'Cost'; cost from the model catalog, packages/@n8n/agents/src/sdk/catalog.ts:215-217 and runtime/loop/agent-runtime.ts:1234, recorded in packages/cli/src/modules/agents/execution-recorder.ts:472); workflow Logs panel shows tokens per model call (packages/frontend/editor-ui/src/features/execution/logs/components/LogsViewConsumedTokenCountText.vue) Note: Cost only in the opt-in Agents module; workflow runs show tokens, not cost.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'token|cost|usage' in assistant:lib and context_agent:ex_app/lib/nc_model.py: usage is not read or stored." } }, { @@ -5022,7 +5197,7 @@ "providerHow": "read-from-code", "feature": "cost-guardrails", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -5032,7 +5207,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-63 agent.max_turns hard cap with budget_warning_ratio one-time warning and run_budget_seconds wall-clock budget with an 80% notice; hermes_state_maintenance.py:71 max_cost is only a session filter; searched 'max_cost|spend_limit|budget_usd|cost_cap' in *.py: no money budget Note: Warning plus hard stop exist for turns and time, not for spend.", "dify": "source read at 1.17.1, not driven: searched 'budget|spend limit|spending|hard stop' in web/i18n/en-US and api/services: none for self-hosted; hosted-credit quotas (api/services/credit_pool_service.py, quota_service.py) apply to Dify Cloud's own trial credits, not a user-set budget with warning and stop", "open-webui": "source read at v0.11.4, not driven: searched 'budget|spend|limit|price' in backend/open_webui/routers/analytics.py, utils/middleware.py, routers/openai.py and config.py: no spending budget, warning level or hard stop", - "n8n": "source read at n8n@2.40.7, not driven: searched 'budget|spend limit|hard stop' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/agents/src: no user-set spending budget; the only budget is n8n's own AI gateway credit quota from the licence (packages/cli/src/services/frontend.service.ts:600 quota:aiGatewayBudget)" + "n8n": "source read at n8n@2.40.7, not driven: searched 'budget|spend limit|hard stop' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/agents/src: no user-set spending budget; the only budget is n8n's own AI gateway credit quota from the licence (packages/cli/src/services/frontend.service.ts:600 quota:aiGatewayBudget)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'budget|spend' in both repos: none." } }, { @@ -5051,7 +5227,7 @@ "providerHow": "read-from-code", "feature": "cost-guardrails", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -5061,7 +5237,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/model_cost_guard.py:1-26 warns before selecting a model priced above the input/output cost thresholds; hermes_cli/subcommands/prompt_size.py:13 `hermes prompt-size` byte breakdown of system prompt and tool schemas; hermes_cli/commands.py:143 /context usage gauge; searched 'estimate.{0,20}cost|forecast' for a pre-run cost estimate: none Note: Warns about expensive models and shows prompt size; no cost forecast for a run before it starts. Old yes rested on a docs line.", "dify": "source read at 1.17.1, not driven: searched 'estimate|expected cost|cost preview' in api/controllers/console/app and web/i18n/en-US: the only estimate is document indexing cost for knowledge bases (api/controllers/console/datasets/datasets_document.py:706 indexing-estimate), none for an agent or workflow run", "open-webui": "source read at v0.11.4, not driven: searched 'estimate|cost|price' in backend/open_webui/main.py, routers/analytics.py and src/lib/components/chat/MessageInput.svelte: main.py:1933 /api/v1/messages/count_tokens counts input tokens for Anthropic-style clients and MessageInput.svelte:1837 shows context usage, but nothing predicts a run's cost", - "n8n": "source read at n8n@2.40.7, not driven: searched 'estimate|estimated cost|forecast' in packages/cli/src/modules/agents, packages/@n8n/agents/src and packages/frontend/editor-ui/src/features/agents: cost is recorded after a run (packages/cli/src/modules/agents/execution-recorder.ts:472), never predicted before it starts; Insights 'time saved' estimates (en.json:6745) concern time, not cost" + "n8n": "source read at n8n@2.40.7, not driven: searched 'estimate|estimated cost|forecast' in packages/cli/src/modules/agents, packages/@n8n/agents/src and packages/frontend/editor-ui/src/features/agents: cost is recorded after a run (packages/cli/src/modules/agents/execution-recorder.ts:472), never predicted before it starts; Insights 'time saved' estimates (en.json:6745) concern time, not cost", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'estimate|cost' in both repos: only the provider's expected_runtime=60 (context_agent:ex_app/lib/provider.py:23)." } }, { @@ -5081,7 +5258,7 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", @@ -5091,7 +5268,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_failure_copy.py:1-6 plain-language failure notice delivered to the job's chat with the exact fix command; cron/incidents.py:1-10 alert state with repeat throttling; agent/monitoring/cron_health.py cron health events", "dify": "source read at 1.17.1, not driven: searched 'alert|on failure notify|failed run email' in api/tasks, api/schedule and web/i18n/en-US: failures show only in logs and the editor toast (web/i18n/en-US/workflow.json:242 common.scheduleTriggerRunFailed); api/schedule/queue_monitor_task.py alerts admins about Celery queue length, not run failures Note: alerting only by wiring an external tracer or OTel collector", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:526 publish_event AUTOMATION_RUN_FAILED routed to admin event webhooks (events.py:1034); chat.failed is a user notification event (events.py:669, utils/notifications.py:287) with browser and webhook delivery (src/lib/components/chat/Settings/Notifications.svelte:37 'Chat failed')", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/ErrorTrigger starts a chosen error workflow whenever a workflow fails (set per workflow in its settings as errorWorkflow), which then mails or posts the alert with any node; Agents-module channel failures show as 'Not running' (en.json:8554) Note: The alert channel is whatever the error workflow sends to." + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/ErrorTrigger starts a chosen error workflow whenever a workflow fails (set per workflow in its settings as errorWorkflow), which then mails or posts the alert with any node; Agents-module channel failures show as 'Not running' (en.json:8554) Note: The alert channel is whatever the error workflow sends to.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Nextcloud notifications on task failure and on scheduled task failure (assistant:lib/Notification/Notifier.php:158,389-401, lib/Listener/ChattyLLMTaskListener.php:40-52). Note: Alerts go to the user who ran the task, not to an admin." } }, { @@ -5110,7 +5288,7 @@ "providerHow": "read-from-code", "feature": "observability", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -5120,7 +5298,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'drift' in agent/ cron/ gateway/ hermes_cli/ excluding clock, schema, config and terminal drift: only prompt-cache and table-padding comments; cron/monitor.py:1-8 detects changes in a monitored source, not drift in agent results", "dify": "source read at 1.17.1, not driven: searched 'drift|regression|quality trend|anomal' in api/ and web/i18n/en-US: no drift detection; satisfaction rate chart (api/controllers/console/app/statistic.py:286) is the nearest signal", "open-webui": "source read at v0.11.4, not driven: searched 'drift|anomaly|regression|baseline' in backend/open_webui/routers/analytics.py, routers/evaluations.py and utils: no monitoring of result quality over time beyond the feedback leaderboard history (routers/evaluations.py:268)", - "n8n": "source read at n8n@2.40.7, not driven: searched 'drift|regression|anomal' in packages/cli/src/modules/agents, agent-evals, insights and packages/@n8n/agents/src: no watch on result quality over time; evaluations run only when started" + "n8n": "source read at n8n@2.40.7, not driven: searched 'drift|regression|anomal' in packages/cli/src/modules/agents, agent-evals, insights and packages/@n8n/agents/src: no watch on result quality over time; evaluations run only when started", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'drift|quality' in both repos: none." } }, { @@ -5140,7 +5319,7 @@ "providerHow": "read-from-code", "feature": "observability", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -5150,7 +5329,8 @@ "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/endpoints.config.ts:8 N8N_METRICS enables a Prometheus /metrics endpoint (packages/cli/src/metrics/prometheus/, event-bus-metrics.service.ts) and /healthz health checks for monitoring Note: Old partial rested on a /healthz bug fix; Prometheus metrics and health endpoints ship.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1591-1592 GET /health and /health/detailed; hermes_cli/web_routers/status.py:115 /api/health and :555 /api/system/stats; agent/monitoring/otlp_exporter.py:1-6 exports health and diagnostic events to an OpenTelemetry collector; hermes_cli/subcommands/monitoring.py:19 Note: Metrics are pushed over OTLP; the pull endpoints are health checks, not a Prometheus scrape.", "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads and /db-pool-stat endpoints; api/configs/observability/otel/otel_config.py:10-25 ENABLE_OTEL exports traces and metrics over OTLP to a monitoring system; api/celery_healthcheck.py for workers Note: OTel metrics off by default", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health, :3009 /health/db for probes; utils/telemetry/metrics.py:151 setup_metrics with request counter, duration histogram and user gauges exported over OTLP (env.py:1267 ENABLE_OTEL_METRICS, :1271 endpoint) Note: metrics are pushed over OTLP, not a Prometheus scrape endpoint" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health, :3009 /health/db for probes; utils/telemetry/metrics.py:151 setup_metrics with request counter, duration histogram and user gauges exported over OTLP (env.py:1267 ENABLE_OTEL_METRICS, :1271 endpoint) Note: metrics are pushed over OTLP, not a Prometheus scrape endpoint", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent ships a container healthcheck script only (context_agent:healthcheck.sh); searched 'metrics|prometheus' in both repos: none." } }, { @@ -5170,7 +5350,7 @@ "providerHow": "read-from-code", "feature": "observability", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -5180,7 +5360,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/app/ops_trace.py per-app tracing config; api/core/ops/ops_trace_manager.py sends traces to Langfuse, LangSmith, Opik, Weave, Arize, Phoenix, MLflow, Databricks, Aliyun, Tencent (web/i18n/en-US/app.json:221-267 tracing.*.title)", "hermes-agent": "source read at v2026.9.24, not driven: plugins/observability/langfuse/plugin.yaml:1-3 bundled Langfuse plugin traces conversations, LLM calls and tool usage (opt-in); agent/monitoring/otlp_exporter.py:1-6 OTLP export", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1266 ENABLE_OTEL_TRACES, :1270 OTEL_EXPORTER_OTLP_ENDPOINT, utils/telemetry/setup.py and instrumentors.py send traces to any OTLP collector (Langfuse accepts OTLP); direct Langfuse hooks exist only as community pipeline filters Note: OTLP in core; native Langfuse only via community pipelines", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/otel (default module, packages/@n8n/backend-common/src/modules/module-registry.ts:70) exports workflow and agent spans over OTLP (otel.config.ts:9-21 endpoint, protocol, headers), agent spans toggled by N8N_AGENTS_TRACING_ENABLED (packages/@n8n/config/src/configs/agents.config.ts:49-50); LangChain nodes honour LANGCHAIN_TRACING_V2 and agent sessions export to LangSmith (packages/cli/src/modules/agents/agent-session-langsmith-export.service.ts:29) Note: Langfuse is reached through its OTLP endpoint, not a named integration." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/otel (default module, packages/@n8n/backend-common/src/modules/module-registry.ts:70) exports workflow and agent spans over OTLP (otel.config.ts:9-21 endpoint, protocol, headers), agent spans toggled by N8N_AGENTS_TRACING_ENABLED (packages/@n8n/config/src/configs/agents.config.ts:49-50); LangChain nodes honour LANGCHAIN_TRACING_V2 and agent sessions export to LangSmith (packages/cli/src/modules/agents/agent-session-langsmith-export.service.ts:29) Note: Langfuse is reached through its OTLP endpoint, not a named integration.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'langfuse|langsmith|tracing|opentelemetry' in context_agent:ex_app and pyproject.toml: none configured." } }, { @@ -5200,7 +5381,7 @@ "providerHow": "read-from-code", "feature": "observability", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "partial", "dify": "no", @@ -5211,7 +5392,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 usage insights (tokens, cost, tool/skill use, activity, model/platform breakdowns) on demand via /insights (hermes_cli/commands.py:287) and `hermes insights`; searched 'weekly report|periodic report|digest.{0,20}usage' in cron/ and agent/: no scheduled usage report Note: Reports are on demand; a periodic one would be a hand-built cron job.", "dify": "source read at 1.17.1, not driven: searched 'report|weekly|monthly digest|usage report' in api/schedule, api/tasks and web/i18n/en-US: no periodic usage report; usage is only on the live Overview/Monitoring charts (api/controllers/console/app/statistic.py)", "open-webui": "source read at v0.11.4, not driven: searched 'report|digest|weekly' in backend/open_webui/routers/analytics.py, utils/automations.py and events.py: analytics are on-demand dashboards (src/lib/components/admin/Analytics/Dashboard.svelte); no periodic usage report", - "n8n": "source read at n8n@2.40.7, not driven: searched 'report|digest|weekly' in packages/cli/src/modules/insights and agents: no periodic usage report for people; packages/cli/src/modules/instance-reporting.ee/instance-reporting.module.ts sends daily billable execution numbers to a monitoring receiver, opt-in and not a report about agent use" + "n8n": "source read at n8n@2.40.7, not driven: searched 'report|digest|weekly' in packages/cli/src/modules/insights and agents: no periodic usage report for people; packages/cli/src/modules/instance-reporting.ee/instance-reporting.module.ts sends daily billable execution numbers to a monitoring receiver, opt-in and not a report about agent use", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'report|digest' in assistant:lib/BackgroundJob: jobs are assignments and chat summaries only." } }, { @@ -5231,7 +5413,7 @@ "providerHow": "read-from-code", "feature": "observability", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "yes", @@ -5241,7 +5423,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/app/statistic.py:286 user-satisfaction-rate per app; agent Monitoring 'User Satisfaction Rate: Percentage of agent replies that users rated with a like' (web/i18n/en-US/agent-v-2.json monitoring.metrics.userSatisfactionRate); logs show user and operator rating per conversation (agent-v-2.json logs.table.userRate, operationRate)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/evaluations.py:222 GET /leaderboard (ELO per model from thumbs ratings), :268 per-model history, :399 feedback list; src/lib/components/admin/Evaluations/Leaderboard.svelte, Feedbacks.svelte; analytics feedback activity (admin/Analytics/Dashboard.svelte)", "hermes-agent": "source read at v2026.9.24, not driven: no answer rating exists to aggregate: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-8 only detects affection for the pet animation", - "n8n": "source read at n8n@2.40.7, not driven: ratings exist only on evaluation runs: en.json:8317-8318 thumbs up/down per case and en.json:8301 '{reviewed} of {total} reviewed' in the agent's Evals tab (packages/cli/src/modules/agent-evals/agent-eval-rating.service.ts); searched 'feedback|rating' in packages/cli/src/modules/chat-hub and insights: no per-agent statistics of how people rated live answers Note: Only test-case reviews in an opt-in, flag-gated module." + "n8n": "source read at n8n@2.40.7, not driven: ratings exist only on evaluation runs: en.json:8317-8318 thumbs up/down per case and en.json:8301 '{reviewed} of {total} reviewed' in the agent's Evals tab (packages/cli/src/modules/agent-evals/agent-eval-rating.service.ts); searched 'feedback|rating' in packages/cli/src/modules/chat-hub and insights: no per-agent statistics of how people rated live answers Note: Only test-case reviews in an opt-in, flag-gated module.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no answer rating exists (ch-feedback); searched 'feedback' in both repos: none." } }, { @@ -5261,7 +5444,7 @@ "providerHow": "read-from-code", "feature": "flow-canvas", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "yes", "dify": "yes", @@ -5272,7 +5455,8 @@ "dify": "source read at 1.17.1, not driven: web/app/components/workflow canvas editor for Workflow and Chatflow apps with the node set in web/i18n/en-US/workflow.json:2-35 blocks.*; api/controllers/console/app/workflow.py draft sync and publish", "n8n": "source read at n8n@2.40.7, not driven: the n8n editor is a node canvas (packages/frontend/editor-ui/src/features/workflows/canvas/, canvas.utils.ts) where workflows are wired step by step; core product surface", "hermes-agent": "source read at v2026.9.24, not driven: searched 'canvas|flow editor|node editor|reactflow' in web/src and apps/desktop/src: no visual flow builder; plugins/kanban/dashboard/manifest.json:1-10 the Kanban tab is a drag-drop task board, not a step canvas", - "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py)" + "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'flow|canvas|workflow|node' in assistant:src: no flow builder. The agent loop is fixed in code (context_agent:ex_app/lib/graph.py)." } }, { @@ -5291,7 +5475,7 @@ "providerHow": "read-from-code", "feature": "flow-canvas", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -5301,7 +5485,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:2-3 blocks.agent and blocks.agent-v2; api/core/workflow/nodes/agent_v2/agent_node.py runs a roster or inline agent inside a flow; api/controllers/console/agent/composer.py:54 agent composer on a workflow node Note: the classic Agent node runs strategies from agent-strategy plugins", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts AI Agent node with model, memory, tools and output parser inputs (nodes/agents/Agent/utils.ts:31-59); a workflow can also call an Agents-module agent (en.json agentSessions.origin.workflow 'Workflow')", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:249-257 /kanban create, assign, link: tasks assigned to profiles (agents) and linked as dependencies; hermes_cli/kanban_parser.py:314-321 'dependency' blocks auto-promote when parents finish; hermes_cli/kanban_db_graph.py:1 task graph persistence; plugins/kanban/dashboard/manifest.json board tab Note: Multi-agent work is a dependency graph of kanban cards, not a flow with agent steps.", - "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); no flow to put an agent step in" + "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); no flow to put an agent step in", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in these repos (searched 'flow|workflow' in both). Other Nextcloud flow tools could schedule the agent task type, but none is in these repos." } }, { @@ -5321,7 +5506,7 @@ "providerHow": "read-from-code", "feature": "flow-canvas", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -5331,7 +5516,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:12 blocks.human-input and :583-636 nodes.humanInput.* (form, user actions, delivery by web app or email, timeout); api/tasks/human_input_timeout_tasks.py; api/controllers/web/human_input_form.py:141", "n8n": "source read at n8n@2.40.7, not driven: send-and-wait approval operations pause a workflow until a person answers, e.g. packages/nodes-base/nodes/Microsoft/Outlook/v2/actions/message/sendAndWait.operation.ts, Slack, Gmail, Teams, Telegram (packages/nodes-base/utils/sendAndWait/utils.ts); Wait node and Form node for manual steps (packages/nodes-base/nodes/Wait, Form)", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:314-321 `kanban block --kind needs_input` parks a card for a human and dependants wait until it is unblocked; hermes_cli/kanban_parser.py:216-218 --initial-status blocked for cards that need human ops; hermes_cli/kanban_pr_acceptance.py:1 PR acceptance gate Note: A human gate is a blocked card in the task graph, not an approval step with approve/deny.", - "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); approval exists only for tool calls in a chat (utils/middleware.py:3613)" + "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); approval exists only for tool calls in a chat (utils/middleware.py:3613)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows; approval exists only inside the agent loop (ov-approval)." } }, { @@ -5350,7 +5536,7 @@ "providerHow": "read-from-code", "feature": "sub-agent-delegation", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -5360,7 +5546,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 delegate_task spawns child agents with their own context and returns a summary, single or batch; tools/async_delegation.py:1-6 background delegation; hermes_cli/commands.py:249 kanban hands tasks to other profiles", "dify": "source read at 1.17.1, not driven: an agent can call a published workflow as a tool (web/i18n/en-US/agent-v-2.json tools.toolTabs.workflow; api/controllers/console/workspace/tool_providers.py:904) and that workflow can hold another Agent node; searched 'sub.?agent|handoff|delegat' in dify-agent/src: no direct agent-to-agent handoff Note: indirect, through workflow-as-tool", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task hands a focused task to a sub-agent and returns its summary (utils/subagents.py:270 delegate, max_iterations and max_output :298-301), admin toggle src/lib/components/admin/Settings/Subagents.svelte; the sub-agent is a copy of the current model and tools (subagents.py:317 'model_id': current), it cannot pick another configured agent Note: delegates to a clone of itself, not to a different agent", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/AgentTool.node.ts:10-11 'AI Agent Tool' lets one agent call another as a tool; Agents-module sub-agents with 'use when' hints and delegation (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:132-173, en.json:7996-7997)" + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/AgentTool.node.ts:10-11 'AI Agent Tool' lets one agent call another as a tool; Agents-module sub-agents with 'use when' hints and delegation (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:132-173, en.json:7996-7997)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'subagent|delegate|handoff' in context_agent:ex_app: single agent graph (context_agent:ex_app/lib/graph.py:48-80)." } }, { @@ -5380,7 +5567,7 @@ "providerHow": "read-from-code", "feature": "flow-canvas", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -5390,7 +5577,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/autonomous-ai-agents/dynamic-workflow/SKILL.md:1-16 optional skill codifies orchestration as a re-runnable script where conditions are ordinary code; tools/code_execution_tool.py:1-5 scripts call tools with normal control flow; searched 'condition|branch node|if.?node' in hermes_cli/kanban*.py: no conditional routing in the task graph Note: Branching is code the agent writes, not a flow construct; the plan-in-code skill is optional, not bundled.", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/If and packages/nodes-base/nodes/Switch route items by conditions or rules; Text Classifier routes by an LLM category (packages/@n8n/nodes-langchain/nodes/chains/TextClassifier)", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:13 blocks.if-else and :26 blocks.question-classifier branch a flow on conditions or on an LLM classification; fail branches on node errors (nodes.common.errorHandle.failBranch)", - "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); conditions can only be coded inside a Pipe or Filter function" + "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); conditions can only be coded inside a Pipe or Filter function", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no user-built flows; the only branch is the fixed safe/dangerous tool routing (context_agent:ex_app/lib/graph.py:56-72)." } }, { @@ -5410,7 +5598,7 @@ "providerHow": "read-from-code", "feature": "flow-canvas", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -5420,7 +5608,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:240,245,254 common.runHistory / showRunHistory / viewRunHistory in the canvas editor, opening each run's tracing on the canvas; published-run logs per app (api/controllers/console/app/workflow_app_log.py:121)", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/execution/executions/views/WorkflowExecutionsView.vue the workflow's Executions tab lists its runs and opens each one on the canvas with the data each node produced Note: Old partial rested on a generic execution-history line; runs open on the canvas.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:416-418 `kanban log` and `kanban runs` per task; hermes_cli/subcommands/cron.py:168 `cron runs`; plugins/kanban/dashboard/manifest.json:4 board shows which profile is running what Note: Run history per task or job; no flow canvas to show it on.", - "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)" + "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows, so no flow run history." } }, { @@ -5439,7 +5628,7 @@ "providerHow": "read-from-code", "feature": "flow-authoring", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -5449,7 +5638,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/blueprint_catalog.py:1-5 and :104-523 sixteen shipped automation blueprints rendered as a dashboard form (hermes_cli/web_routers/cron.py:393-424 GET /api/cron/blueprints, POST instantiate) and a /blueprint slash command (hermes_cli/commands.py:243) Note: Blueprints are ready-made scheduled automations, not multi-step flows.", "dify": "source read at 1.17.1, not driven: api/constants/recommended_apps.json ships 22 templates (workflow, chatflow, agent-chat, e.g. 'Text Summarization Workflow', 'Email Assistant Workflow'); api/controllers/console/explore/recommended_app.py:96,126 serve them; web/app/(commonLayout)/templates/[[...category]] create from template Note: default source is remote tmpl.dify.ai (api/configs/feature/hosted_service/__init__.py:444), builtin as fallback mode", "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the app ships no example flows or agents, community presets live on openwebui.com (src/lib/components/workspace/Models.svelte:947)", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/workflows/readyToRun/workflows/aiWorkflow.ts ships a ready-to-run AI workflow (ReadyToRunButton.vue); the template library loads from packages/@n8n/config/src/configs/templates.config.ts:10-11 N8N_TEMPLATES_HOST https://api.n8n.io/api/ (features/workflows/templates/) Note: Most templates come from n8n's online library, so an offline instance sees only the bundled one." + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/workflows/readyToRun/workflows/aiWorkflow.ts ships a ready-to-run AI workflow (ReadyToRunButton.vue); the template library loads from packages/@n8n/config/src/configs/templates.config.ts:10-11 N8N_TEMPLATES_HOST https://api.n8n.io/api/ (features/workflows/templates/) Note: Most templates come from n8n's online library, so an offline instance sees only the bundled one.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows ship with either app (searched 'flow|template' in both)." } }, { @@ -5469,7 +5659,7 @@ "providerHow": "read-from-code", "feature": "agent-webhook-trigger", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", @@ -5479,7 +5669,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: optional-mcps/n8n-official/manifest.yaml:1-12 Nous-approved catalog entry connects the agent to an n8n instance's official MCP server with OAuth, so the agent can call n8n workflows as tools; hermes_cli/subcommands/mcp.py:27 `hermes mcp add`", "dify": "source read at 1.17.1, not driven: searched 'n8n' in api/, web/app and web/i18n: no hits, and none in langgenius/dify-official-plugins tools/ or langgenius/dify-plugins; only a hand-built HTTP Request node or custom OpenAPI tool could call an n8n webhook", "open-webui": "source read at v0.11.4, not driven: searched 'n8n' in backend/open_webui and src: no n8n integration in core; an n8n workflow can only be called through a custom Tool, OpenAPI or MCP server or a community Pipe", - "n8n": "source read at n8n@2.40.7, not driven: this row describes n8n itself: an AI Agent calls another workflow through the Call n8n Workflow Tool (packages/@n8n/nodes-langchain/nodes/tools/ToolWorkflow), and Agents-module agents attach published workflows as tools (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:401-420, en.json:7820-7829)" + "n8n": "source read at n8n@2.40.7, not driven: this row describes n8n itself: an AI Agent calls another workflow through the Call n8n Workflow Tool (packages/@n8n/nodes-langchain/nodes/tools/ToolWorkflow), and Agents-module agents attach published workflows as tools (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:401-420, en.json:7820-7829)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'n8n' in both repos: none; only reachable if an admin adds an n8n MCP server via the MCP config (context_agent:ex_app/lib/all_tools/mcp.py)." } }, { @@ -5499,7 +5690,7 @@ "providerHow": "read-from-code", "feature": "flow-authoring", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -5509,7 +5700,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:6 blocks.code, Python or JavaScript run in the dify-sandbox service (docker/docker-compose.yaml sandbox); nodes.code.syncFunctionSignature", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Code runs JavaScript or Python as a workflow step (task runners, packages/@n8n/config/src/configs/runners.config.ts:16-17)", "open-webui": "source read at v0.11.4, not driven: custom Python runs in the request pipeline as Filter (inlet/outlet) or Pipe functions (backend/open_webui/routers/functions.py:48, src/routes/(app)/admin/functions/create/+page.svelte, utils/filter.py:212) and on the external Pipelines server (routers/pipelines.py); searched 'canvas|workflow|flow' in src/lib/components: no flow to place the step in Note: old yes; code steps exist in the chat pipeline, not in a flow", - "hermes-agent": "source read at v2026.9.24, not driven: cron/job_definition.py:15 script and no_agent (script-only jobs) and monitor_script fields; web/src/i18n/en.ts cron.scriptRequired 'Script-only jobs need a script path'; hermes_cli/subcommands/webhook.py:43-46 --script transform on a webhook route; tools/code_execution_tool.py code in a run Note: Custom code runs as a job, pre-run gate or webhook transform; there is no flow to put a code step in." + "hermes-agent": "source read at v2026.9.24, not driven: cron/job_definition.py:15 script and no_agent (script-only jobs) and monitor_script fields; web/src/i18n/en.ts cron.scriptRequired 'Script-only jobs need a script path'; hermes_cli/subcommands/webhook.py:43-46 --script transform on a webhook route; tools/code_execution_tool.py code in a run Note: Custom code runs as a job, pre-run gate or webhook transform; there is no flow to put a code step in.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows and no code tool (searched 'exec|code' in all_tools)." } }, { @@ -5529,7 +5721,7 @@ "providerHow": "read-from-code", "feature": "flow-canvas", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -5539,7 +5731,8 @@ "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/ExecuteWorkflow calls another workflow and packages/nodes-base/nodes/ExecuteWorkflowTrigger receives the call with typed inputs", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_prompt.py:95-97 context_from injects the latest output of other jobs into a job's prompt (job chaining); hermes_cli/kanban_decompose.py:1-6 fans a task out into a graph of child tasks; hermes_cli/subcommands/webhook.py:47-51 a route can fire an existing job Note: Jobs and task graphs can be chained; there is no named flow to embed in another.", "dify": "source read at 1.17.1, not driven: Snippets are reusable node groups inserted into workflows (api/controllers/console/snippets/snippet_workflow.py; web/i18n/en-US/snippet.json); a published workflow can be used as a tool in other apps (web/i18n/en-US/workflow.json:257-258 common.workflowAsTool)", - "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)" + "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in these repos." } }, { @@ -5559,7 +5752,7 @@ "providerHow": "read-from-code", "feature": "flow-canvas", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -5569,7 +5762,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:193 `cron doctor` checks scheduled jobs for common health issues; hermes_cli/kanban_diagnostics.py:1-8 actionable diagnostics on task graphs shown as dashboard buttons; cron/lifecycle_guard.py:1-7 rejects self-destructive job specs at creation Note: Checks exist for jobs and task graphs; no pre-run wiring check of a flow.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:997-1000 panel.checklist 'Resolve the following issues before publishing', :207 needConnectTip for unconnected steps, per-node checks such as :361 nodes.agent.checkList.strategyNotSelected; agent composer validate endpoint api/controllers/console/agent/composer.py:167", "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the only pre-run check is RRULE validation for schedules (backend/open_webui/utils/recurrence.py:106 validate_rrule)", - "n8n": "source read at n8n@2.40.7, not driven: the canvas flags node issues before a run, e.g. en.json:4502-4504 'Credentials for {type} are not set'; Agents module validates the whole agent (packages/cli/src/modules/agents/agents-config.controller.ts:40-55 GET /:agentId/validation) and blocks preview or publish with named issues (en.json:7734-7763)" + "n8n": "source read at n8n@2.40.7, not driven: the canvas flags node issues before a run, e.g. en.json:4502-4504 'Credentials for {type} are not set'; Agents module validates the whole agent (packages/cli/src/modules/agents/agents-config.controller.ts:40-55 GET /:agentId/validation) and blocks preview or publish with named issues (en.json:7734-7763)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in these repos." } }, { @@ -5588,7 +5782,7 @@ "providerHow": "read-from-code", "feature": "agent-template-gallery", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -5598,7 +5792,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:129-137 `hermes profile install ` installs a ready-made profile distribution (hermes_cli/profile_distribution.py:1-5); web/src/pages/ProfilesPage.tsx:1117-1122 shows distribution name and version; searched 'distribution' with 'catalog|registry|hub' in hermes_cli/profile_distribution.py: no browsable store Note: One-command install from a known repo URL; no store to browse.", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/explore and templates/[[...category]] browse ready-made apps including agents (api/constants/recommended_apps.json 'Investment Analysis Report Copilot', 'SVG Logo Design' in agent-chat mode); api/controllers/console/explore/recommended_app.py:96,126; one click creates a copy in the workspace Note: templates are Dify-curated, fetched from tmpl.dify.ai by default", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:945-950 'Discover a model' links to openwebui.com/models when enable_community_sharing is on; the community page posts the preset back into src/routes/(app)/workspace/models/create/+page.svelte:77 (COMMUNITY_ORIGINS check) to prefill a new model Note: the store is an outside website, not an in-app catalogue", - "n8n": "source read at n8n@2.40.7, not driven: en.json:4462 'Workflow templates' gallery with en.json:4445-4446 'Try template' and 'Use this workflow' (packages/frontend/editor-ui/src/features/workflows/templates/, setupTemplate.store.ts), fed by api.n8n.io (packages/@n8n/config/src/configs/templates.config.ts:10-11) and including AI agent workflows Note: Online library; an offline instance loses it." + "n8n": "source read at n8n@2.40.7, not driven: en.json:4462 'Workflow templates' gallery with en.json:4445-4446 'Try template' and 'Use this workflow' (packages/frontend/editor-ui/src/features/workflows/templates/, setupTemplate.store.ts), fed by api.n8n.io (packages/@n8n/config/src/configs/templates.config.ts:10-11) and including AI agent workflows Note: Online library; an offline instance loses it.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'store|template|marketplace' in assistant:src: no agent store; one built-in agent." } }, { @@ -5619,7 +5814,7 @@ "providerHow": "read-from-code", "feature": "agent-template-gallery", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -5629,7 +5824,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` packs a profile into a shareable archive and :122 import; hermes_cli/profile_distribution.py:175 write_manifest is only called by the installer (:547); searched write_manifest callers: no command that turns a profile into a distribution template Note: Sharing is by archive; making a reusable distribution means hand-writing distribution.yaml in a repo.", "dify": "source read at 1.17.1, not driven: an agent can be duplicated (api/controllers/console/agent/roster.py:961 copy), exported as DSL (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52), and an inline workflow agent saved to the shared roster (api/controllers/console/agent/composer.py:239 save-to-roster). Searched 'publish as template|insert-explore-apps' in api/controllers: no way to add it to the Explore template list Note: reuse by roster, copy and file; publishing a template for others goes through the Marketplace Creator Center, an outside service (web/i18n/en-US/plugin.json:230,305), not an in-product action", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:221 shareModelHandler posts the full model to openwebui.com, :214 Clone, per-model Export JSON (routers/models.py:381); public read grant makes it usable org-wide (common/AccessControl.svelte:19 'anyone')", - "n8n": "source read at n8n@2.40.7, not driven: an agent can be duplicated within its project (en.json:7721 'Duplicate', packages/frontend/editor-ui/src/features/agents/views/AgentsListView.vue:136-174) or exported as JSON (en.json:7613); searched 'publish template|create template' in packages/cli/src and packages/frontend/editor-ui/src/features/workflows/templates: no way to publish one's own agent or workflow as an in-instance template Note: Reuse by copy or file, not a template others browse." + "n8n": "source read at n8n@2.40.7, not driven: an agent can be duplicated within its project (en.json:7721 'Duplicate', packages/frontend/editor-ui/src/features/agents/views/AgentsListView.vue:136-174) or exported as JSON (en.json:7613); searched 'publish template|create template' in packages/cli/src and packages/frontend/editor-ui/src/features/workflows/templates: no way to publish one's own agent or workflow as an in-instance template Note: Reuse by copy or file, not a template others browse.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agents or templates to create (searched 'template' in assistant:lib/Service)." } }, { @@ -5648,7 +5844,7 @@ "providerHow": "read-from-code", "feature": "agent-template-github-store", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -5658,7 +5854,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profile_distribution.py:235-249 github.com/user/repo sources for `profile install` and :594 `profile update` re-pulls; hermes_cli/subcommands/skills.py:148 publish exists for skills only; searched 'publish' in hermes_cli/profile*.py: no profile publish Note: Install from GitHub yes, finding and publishing agent templates no.", "dify": "source read at 1.17.1, not driven: api/services/app_dsl_service.py:174 import accepts yaml_url (web/i18n/en-US/app.json:115-116 'From URL'), so a raw GitHub DSL link installs; searched 'github' in api/services/app_dsl_service.py and web/i18n/en-US/app.json: no discovery or publish to GitHub Note: install by URL only", "open-webui": "source read at v0.11.4, not driven: searched 'github|load/url' in backend/open_webui/routers/models.py: model presets import only from a JSON file or openwebui.com; GitHub URL loading exists for tools and functions only (routers/tools.py:247, routers/functions.py:107)", - "n8n": "source read at n8n@2.40.7, not driven: workflows sync to a Git repository with source control (packages/cli/src/modules/source-control.ee, feat:sourceControl at packages/@n8n/constants/src/index.ts:22); searched 'github' in packages/frontend/editor-ui/src/features/workflows/templates: templates come only from api.n8n.io, no GitHub discovery or install Note: Git sync is enterprise-licensed and is not template search or publishing." + "n8n": "source read at n8n@2.40.7, not driven: workflows sync to a Git repository with source control (packages/cli/src/modules/source-control.ee, feat:sourceControl at packages/@n8n/constants/src/index.ts:22); searched 'github' in packages/frontend/editor-ui/src/features/workflows/templates: templates come only from api.n8n.io, no GitHub discovery or install Note: Git sync is enterprise-licensed and is not template search or publishing.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'github|template' in both repos: none." } }, { @@ -5677,7 +5874,7 @@ "providerHow": "read-from-code", "feature": "agent-template-github-store", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -5687,7 +5884,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'approv' in hermes_cli/profile_distribution.py and hermes_cli/profiles.py: none; plugin-catalog/README.md curation is Nous review of plugins, not an organisation approving agent templates", "dify": "source read at 1.17.1, not driven: searched 'approve template|template review|pending template' in api/ and web/i18n/en-US: no approval step for templates; Explore templates come from a remote or builtin catalogue (api/configs/feature/hosted_service/__init__.py:444)", "open-webui": "source read at v0.11.4, not driven: searched 'approve|review|publish' in backend/open_webui/routers/models.py and src/lib/components/workspace/Models*: a model is shared the moment its access grants are saved (routers/models.py:1035); no approval gate", - "n8n": "source read at n8n@2.40.7, not driven: searched 'template approv|approve template' in packages/cli/src and packages/frontend/editor-ui/src: none; workflow reviews (packages/@n8n/constants/src/index.ts:58 feat:workflowReviews, packages/frontend/editor-ui/src/features/workflow-reviews/) approve changes to a workflow, not templates for the organisation" + "n8n": "source read at n8n@2.40.7, not driven: searched 'template approv|approve template' in packages/cli/src and packages/frontend/editor-ui/src: none; workflow reviews (packages/@n8n/constants/src/index.ts:58 feat:workflowReviews, packages/frontend/editor-ui/src/features/workflow-reviews/) approve changes to a workflow, not templates for the organisation", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no templates exist." } }, { @@ -5706,7 +5904,7 @@ "providerHow": "read-from-code", "feature": "agent-versioning", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -5716,7 +5914,8 @@ "n8n": "source read at n8n@2.40.7, not driven: workflow version history with restore (en.json:4837 'Version History', 4912 restore; packages/cli/src/workflows/workflow-history/workflow-history.controller.ts) and visual compare (packages/frontend/editor-ui/src/features/workflows/workflowDiff/WorkflowDiffView.vue); Agents-module publish history with revert (packages/cli/src/modules/agents/agent-publish.controller.ts:87-111) Note: Unlicensed instances keep 24 hours of workflow history (packages/@n8n/constants/src/index.ts:79 used at packages/cli/src/license.ts:478); diffs and named versions are licence features (index.ts:49-50).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:85-87 /snapshot create|restore of Hermes config/state; hermes_cli/config_backups.py:1-8 point-in-time copies of config.yaml; hermes_cli/subcommands/profile.py:147-158 distribution update with version in ProfileInfo Note: Whole-state snapshots and config backups allow rollback; no per-agent version list or compare view.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1266,1282,1302 list versions, view one, restore it; api/models/agent.py:327,363 AgentConfigSnapshot and AgentConfigRevision; workflow version history with restore (web/i18n/en-US/workflow.json:1079-1081). Searched 'compare|diff' in agent-v-2.json and workflow.json: no version comparison (only the workflow generator's change summary, :1110) Note: versions and rollback yes, compare no; Community Edition does not version the agent's file system (agent-v-2.json build.empty.communityEditionTip)", - "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/models.py and routers/models.py: updates overwrite the row (routers/models.py:932); versioning with history menu exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)" + "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/models.py and routers/models.py: updates overwrite the row (routers/models.py:932); versioning with history menu exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'version|history|rollback' in assistant:lib/Db: no agent entity, no versions." } }, { @@ -5735,7 +5934,7 @@ "providerHow": "read-from-code", "feature": "agent-evals", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", @@ -5745,7 +5944,8 @@ "n8n": "source read at n8n@2.40.7, not driven: workflow evaluations run a dataset of cases with expected answers and metrics (packages/nodes-base/nodes/Evaluation, EvaluationTrigger; packages/cli/src/evaluation.ee/test-runs.controller.ee.ts; en.json:6541 helpfulness metric); Agents-module test cases with 'What to check' (en.json:8283-8285) Note: Workflow evaluations are quota-limited by licence (packages/@n8n/constants/src/index.ts:73); agent evals are opt-in and flag-gated.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/evaluations.py:222 leaderboard and arena models (admin/Settings/Evaluations/ArenaModelModal.svelte) rank models from blind user votes; searched 'expected|test case|dataset|golden' in routers/evaluations.py: no case sets with expected answers Note: old partial; arena voting is not a test set", "hermes-agent": "source read at v2026.9.24, not driven: batch_runner.py:1-6 runs the agent over a JSONL prompt dataset in parallel with trajectories and tool-usage statistics; evals/ developer harnesses; searched 'expected|assert.{0,20}answer|score' in batch_runner.py: no expected-answer scoring Note: A dataset runner exists as a repo script; it does not compare against expected answers.", - "dify": "source read at 1.17.1, not driven: searched 'evaluation|test case|expected answer|dataset eval' in api/controllers and web/i18n/en-US: no agent test sets; evaluation is delegated to external tracers (web/i18n/en-US/app.json:220-258) and dataset hit testing only checks retrieval (api/controllers/console/datasets/hit_testing.py)" + "dify": "source read at 1.17.1, not driven: searched 'evaluation|test case|expected answer|dataset eval' in api/controllers and web/i18n/en-US: no agent test sets; evaluation is delegated to external tracers (web/i18n/en-US/app.json:220-258) and dataset hit testing only checks retrieval (api/controllers/console/datasets/hit_testing.py)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'eval|test case|expected' in runtime code of both repos: none." } }, { @@ -5765,7 +5965,7 @@ "providerHow": "read-from-code", "feature": "skill-self-improvement", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -5775,7 +5975,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'baseline|a/b|compare.{0,20}prompt|prompt version' in hermes_cli/ and agent/: none for user prompts; evals/openrouter_pkce_ab and evals/toolperf_abeval are developer harnesses, not a user surface", "dify": "source read at 1.17.1, not driven: searched 'compare|baseline|a/b|prompt version' in web/i18n/en-US/app-debug.json, agent-v-2.json and workflow.json: classic apps can debug several models side by side on one prompt (web/app/components/app/configuration/debug/debug-with-multiple-model), but no run of a new prompt version against the old one before publishing Note: multi-model debug compares models, not prompt versions", "open-webui": "source read at v0.11.4, not driven: searched 'baseline|compare|promote|a/b' in backend/open_webui/routers/prompts.py, routers/models.py and routers/evaluations.py: prompt versions can be set live (routers/prompts.py:384) but no side-by-side run of old versus new before promotion; arena compares models, not prompt versions", - "n8n": "source read at n8n@2.40.7, not driven: workflow evaluation runs compare side by side with Cases, Outputs, Metrics and 'Workflow diff' tabs (en.json:6521-6524; packages/frontend/editor-ui/src/features/ai/evaluation.ee/components/Compare/CasesTable.vue:113-174 delta vs best, WorkflowDiffTab.vue), so a changed prompt is scored against the previous version before publishing Note: Evaluations are quota-limited by licence (packages/@n8n/constants/src/index.ts:73)." + "n8n": "source read at n8n@2.40.7, not driven: workflow evaluation runs compare side by side with Cases, Outputs, Metrics and 'Workflow diff' tabs (en.json:6521-6524; packages/frontend/editor-ui/src/features/ai/evaluation.ee/components/Compare/CasesTable.vue:113-174 delta vs best, WorkflowDiffTab.vue), so a changed prompt is scored against the previous version before publishing Note: Evaluations are quota-limited by licence (packages/@n8n/constants/src/index.ts:73).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the system prompt is hard-coded (context_agent:ex_app/lib/agent.py:134-142); searched 'baseline|compare' in both repos: none." } }, { @@ -5795,7 +5996,7 @@ "providerHow": "read-from-code", "feature": "skills-marketplace", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -5805,7 +6006,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/skills.py:38-54 browse, search and install from registries (tools/skills_hub_skillssh.py skills.sh, tools/skills_hub_clawhub.py ClawHub, tools/skills_hub_github.py); plugin-catalog/README.md:1-5 curated plugin catalog with community-tier entries via `hermes plugins catalog`", "n8n": "source read at n8n@2.40.7, not driven: community nodes install from npm in the UI (en.json:3285 'Install community nodes'; packages/cli/src/modules/community-packages/community-packages.controller.ts:11 POST, default module) and the public template library at api.n8n.io (packages/@n8n/config/src/configs/templates.config.ts:10-11)", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/marketplace in-product Dify Marketplace with community Plugins and Templates, creator profiles and trending by real usage (web/i18n/en-US/plugin.json:210-240 marketplace.home.templates, creatorProfile.*); skills and agent strategies ship through it too", - "open-webui": "source read at v0.11.4, not driven: openwebui.com community library of model presets, tools, functions and prompts reached from src/lib/components/workspace/Models.svelte:947, Tools.svelte:639 and admin/Functions.svelte (common/CommunityDiscover.svelte 'Made by Open WebUI Community'); import back via postMessage (routes/(app)/workspace/tools/create/+page.svelte:58) Note: no community channel for skills" + "open-webui": "source read at v0.11.4, not driven: openwebui.com community library of model presets, tools, functions and prompts reached from src/lib/components/workspace/Models.svelte:947, Tools.svelte:639 and admin/Functions.svelte (common/CommunityDiscover.svelte 'Made by Open WebUI Community'); import back via postMessage (routes/(app)/workspace/tools/create/+page.svelte:58) Note: no community channel for skills", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'community|library|hub' in both repos: skills come from the user's or admin's folder only (assistant:lib/Service/AgentSkillsService.php:65-90)." } }, { @@ -5825,7 +6027,7 @@ "providerHow": "read-from-code", "feature": "agent-template-github-store", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", @@ -5835,7 +6037,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115-122 export/import a profile archive including its cron jobs; hermes_cli/profile_distribution.py:396-406 distributions ship and merge cron jobs into another install; hermes_cli/subcommands/profile.py:34 --clone-channels kept off by default Note: Automations move between installs by archive or distribution; there are no client organisations inside one instance.", "dify": "source read at 1.17.1, not driven: an app or agent exports as DSL YAML (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52; api/services/app_dsl_service.py:723) and imports into another workspace or instance by file or URL (api/services/app_dsl_service.py:174; web/i18n/en-US/app.json:115); snippets export and import the same way (web/i18n/en-US/snippet.json importFromDSLUrl) Note: credentials and plugin dependencies must be set up again in the target (web/app/components/workflow/plugin-dependency)", "open-webui": "source read at v0.11.4, not driven: automations export and import as JSON (src/routes/(app)/automations/+page.svelte:91-96 Import/Export JSON, :438) and models likewise (routers/models.py:381, :441), so an automation can be moved to another instance; searched 'tenant|organization' in backend/open_webui/models: no client-organisation concept to move between", - "n8n": "source read at n8n@2.40.7, not driven: a workflow moves to another project with packages/cli/src/workflows/workflows.controller.ts:646 PUT /:workflowId/transfer, or to another instance by JSON export/import (packages/cli/src/commands/export/workflow.ts, import/workflow.ts); projects are not isolated client organisations (see op-multi-tenant) Note: Moves between projects or instances; no tenant concept." + "n8n": "source read at n8n@2.40.7, not driven: a workflow moves to another project with packages/cli/src/workflows/workflows.controller.ts:646 PUT /:workflowId/transfer, or to another instance by JSON export/import (packages/cli/src/commands/export/workflow.ts, import/workflow.ts); projects are not isolated client organisations (see op-multi-tenant) Note: Moves between projects or instances; no tenant concept.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no tenants or templates in these repos." } }, { @@ -5855,7 +6058,7 @@ "providerHow": "read-from-code", "feature": "course-recommendations", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -5865,7 +6068,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'course|learner|curriculum' in agent/ tools/ hermes_cli/ plugins/: none; outside the product's domain", "dify": "source read at 1.17.1, not driven: searched 'course|learner|curriculum' in api/ and web/i18n/en-US: only Dify's own product onboarding lessons (api/controllers/console/explore/recommended_app.py:111 learn-dify; web/i18n/en-US/common.json stepByStepTour.*), no learner recommendations", "open-webui": "source read at v0.11.4, not driven: searched 'course|learner|lesson|curriculum' in backend/open_webui and src/lib/components: no learning domain", - "n8n": "source read at n8n@2.40.7, not driven: searched 'course|learner|curriculum|recommend' in packages/cli/src and packages/frontend/editor-ui/src: no learning features; out of n8n's domain" + "n8n": "source read at n8n@2.40.7, not driven: searched 'course|learner|curriculum|recommend' in packages/cli/src and packages/frontend/editor-ui/src: no learning features; out of n8n's domain", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'course|learner' in both repos: none." } }, { @@ -5891,7 +6095,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31886 \"On-premises / sovereign deployment: Fully self-hosted inside the customer's Nextcloud\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant is a PHP Nextcloud app (assistant:appinfo/info.xml) and context_agent a Docker ExApp installed on the instance (context_agent:appinfo/info.xml docker-install, context_agent:Dockerfile).", "hermes-agent": "source read at v2026.9.24, not driven: Dockerfile and docker-compose.yml at the repo root; setup-hermes.sh installer; hermes_cli/subcommands/gateway.py installs the gateway as a systemd/launchd service (hermes_cli/gateway_service_unit.py); hermes_cli/subcommands/dashboard.py self-hosted web dashboard", "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml and docker/.env.example self-host the full stack (api, worker, beat, web, plugin_daemon, sandbox, agent runtime, ssrf_proxy, database, redis, vector store); DEPLOYMENT_EDITION defaults to COMMUNITY (api/enterprise/telemetry/README.md config table)", @@ -5916,7 +6120,7 @@ "providerHow": "read-from-code", "feature": "web-research-tool", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "no", "dify": "partial", @@ -5927,7 +6131,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1203 OFFLINE_MODE sets HF_HUB_OFFLINE and turns off the version update check (:1205-1207); local inference through Ollama (routers/ollama.py), local embeddings and Whisper; community and update links are optional", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 local Ollama/LM Studio models; hermes_cli/config_defaults.py:2297-2305 telemetry collection and sending both off by default; :1762-1765 allow_lazy_installs false for air-gapped installs; tools/environments/docker.py:765 docker_network false air-gaps the sandbox; searched 'HERMES_OFFLINE|offline.?mode|air.?gap' in *.py: no global offline switch Note: Offline operation is assembled from settings, not a supported mode; not driven, so network calls such as model catalog refreshes were not verified to stay off.", "dify": "source read at 1.17.1, not driven: offline is possible but not default: MARKETPLACE_ENABLED can be false with plugins uploaded as local packages (docker/.env.example:251; api/controllers/console/workspace/plugin.py:746 upload/pkg), templates in builtin mode (api/configs/feature/hosted_service/__init__.py:444 default remote), CHECK_UPDATE_URL (docker/.env.example:37) and community telemetry (api/configs/feature/__init__.py:839-850, ext_celery.py:285) must be switched off Note: every model needs a local provider plugin loaded by hand", - "n8n": "source read at n8n@2.40.7, not driven: outbound calls can be switched off: packages/@n8n/config/src/configs/diagnostics.config.ts:17 N8N_DIAGNOSTICS_ENABLED, version-notifications.config.ts:6, templates.config.ts:6 N8N_TEMPLATES_ENABLED, packages/cli/src/modules/community-packages/community-packages.config.ts:11,15 own npm registry; local models via LMChatOllama; but instance AI setup, AI credits and licence activation and renewal reach the licence server (packages/cli/src/license.ts:73-98) Note: Workflows with local models run offline; enterprise licence activation and the managed AI features need the internet." + "n8n": "source read at n8n@2.40.7, not driven: outbound calls can be switched off: packages/@n8n/config/src/configs/diagnostics.config.ts:17 N8N_DIAGNOSTICS_ENABLED, version-notifications.config.ts:6, templates.config.ts:6 N8N_TEMPLATES_ENABLED, packages/cli/src/modules/community-packages/community-packages.config.ts:11,15 own npm registry; local models via LMChatOllama; but instance AI setup, AI credits and licence activation and renewal reach the licence server (packages/cli/src/license.ts:73-98) Note: Workflows with local models run offline; enterprise licence activation and the managed AI features need the internet.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: nothing in the agent requires the internet: models come from the instance's TaskProcessing (context_agent:ex_app/lib/nc_model.py:165-179) and online tools (DuckDuckGo, web_fetch, weather, HERE, OSM, YouTube) can be switched off (context_agent:ex_app/lib/main.py:88-94). Needs a local provider and a local image registry (not read)." } }, { @@ -5953,7 +6158,7 @@ "n8n": "no", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitors#1428 license \"AGPL-3.0\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: assistant: info.xml licence agpl (assistant:appinfo/info.xml:66) with AGPL-3.0-or-later in LICENSES; context_agent: LICENSE is AGPL-3.0 and sources carry SPDX AGPL-3.0-or-later. Note: context_agent's info.xml says MIT, which contradicts its LICENSE file.", "hermes-agent": "source read at v2026.9.24, not driven: LICENSE:1-3 MIT License, Copyright (c) 2025 Nous Research; pyproject.toml project metadata; full source including web dashboard and desktop app in the public repo Note: MIT, not EUPL.", "copilot-studio": "docs-only: competitors#1450 license \"Proprietary\"", "dify": "source read at 1.17.1, not driven: LICENSE:3-10 'modified version of the Apache License 2.0': no multi-tenant service and no removal of the logo or copyright in web/ without a commercial licence; LICENSE:2.a the producer may change the licence. Not an OSI or EUPL licence Note: source-available with restrictions", @@ -5978,7 +6183,7 @@ "providerHow": "read-from-code", "feature": "multi-tenant-ops", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "yes", "dify": "partial", @@ -5989,7 +6194,8 @@ "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "dify": "source read at 1.17.1, not driven: workspaces keep apps, data, providers and members apart (api/controllers/console/workspace/workspace.py:229,289 list and switch; tenant_id on every model, e.g. api/models/agent.py:163); creating workspaces is off by default (api/configs/feature/__init__.py:1599 ALLOW_CREATE_WORKSPACE=False) and LICENSE:5-6 forbids running a multi-tenant service without a commercial licence Note: works technically, licence-gated for serving several organisations", "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide", - "n8n": "source read at n8n@2.40.7, not driven: projects separate workflows, credentials and agents with project roles (packages/cli/src/modules/agents/entities/agent.entity.ts:13-18, packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts); team projects are limited by the licence quota quota:maxTeamProjects (packages/@n8n/constants/src/index.ts:67); users, SSO, models and settings stay instance-wide Note: Group separation inside one organisation, not tenants with their own admins and settings." + "n8n": "source read at n8n@2.40.7, not driven: projects separate workflows, credentials and agents with project roles (packages/cli/src/modules/agents/entities/agent.entity.ts:13-18, packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts); team projects are limited by the licence quota quota:maxTeamProjects (packages/@n8n/constants/src/index.ts:67); users, SSO, models and settings stay instance-wide Note: Group separation inside one organisation, not tenants with their own admins and settings.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'tenant|organisation|organization' in both repos: data is scoped per user (assistant:lib/Db/ChattyLLM/SessionMapper.php by user_id), not per organisation." } }, { @@ -6008,7 +6214,7 @@ "providerHow": "read-from-code", "feature": "multi-tenant-ops", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -6018,7 +6224,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'quota' in hermes_cli/profiles.py, hermes_cli/config_defaults.py and gateway/: only provider quota holds (cron/quota_hold.py:1-12) and gateway/platforms/api_server.py:1322 a global max_concurrent_runs; no per-organisation or per-profile quota", "dify": "source read at 1.17.1, not driven: api/services/feature_service.py:24-31 per-workspace limits (members, apps, vector space, upload quota, api/services/entities/feature_entities.py:152-161) are filled only from the Cloud billing API; self-hosted community has no per-workspace quota setting Note: Dify Cloud plans only", "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; only per-user automation limits (routers/automations.py:69)", - "n8n": "source read at n8n@2.40.7, not driven: searched 'quota' per project in packages/cli/src/services/project.service.ee.ts and packages/cli/src/modules: quotas come from the instance licence (packages/@n8n/constants/src/index.ts:63-74), none can be set per project or organisation" + "n8n": "source read at n8n@2.40.7, not driven: searched 'quota' per project in packages/cli/src/services/project.service.ee.ts and packages/cli/src/modules: quotas come from the instance licence (packages/@n8n/constants/src/index.ts:63-74), none can be set per project or organisation", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'quota|tenant' in both repos: none." } }, { @@ -6038,7 +6245,7 @@ "providerHow": "read-from-code", "feature": "multi-tenant-ops", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -6048,7 +6255,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'tenant|organisation|organization' in web/src/pages and hermes_cli/web_routers: only the kanban tenant filter (web/src/i18n/en.ts kanban.tenant); web/src/pages/ProfilesPage.tsx manages profiles one by one with no quota or retention per organisation", "dify": "source read at 1.17.1, not driven: searched 'tenant management|all workspaces admin|operations page' in api/controllers/console and web/app: /all-workspaces (api/controllers/console/workspace/workspace.py:238) lists the caller's own workspaces; workspace-wide switches come from the separate Enterprise service (api/services/system_feature_service.py:106-112, 160-197), not a page in this repo", "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; admin settings are one instance-wide panel (src/lib/components/admin/Settings)", - "n8n": "source read at n8n@2.40.7, not driven: searched 'tenant|organisation|organization' in packages/cli/src/controllers and packages/frontend/editor-ui/src/features/settings: no operations page that sets switches, quotas and retention per organisation; retention is instance-wide by environment variable (packages/@n8n/config/src/configs/executions.config.ts:106-111)" + "n8n": "source read at n8n@2.40.7, not driven: searched 'tenant|organisation|organization' in packages/cli/src/controllers and packages/frontend/editor-ui/src/features/settings: no operations page that sets switches, quotas and retention per organisation; retention is instance-wide by environment variable (packages/@n8n/config/src/configs/executions.config.ts:106-111)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no tenants; admin settings are instance-wide (assistant:lib/Settings/Admin.php:35-83)." } }, { @@ -6068,7 +6276,7 @@ "providerHow": "read-from-code", "feature": "app-runtime-requirements", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -6078,7 +6286,8 @@ "dify": "source read at 1.17.1, not driven: SAML, OIDC and OAuth2 SSO for console and web apps is read from the Enterprise service (api/services/entities/feature_entities.py:103-106,183-184; api/services/system_feature_service.py:162-197); community offers only GitHub and Google OAuth login (api/configs/feature/__init__.py:1003,1013; api/controllers/console/auth/oauth.py). No group sync in community Note: enterprise-licensed", "n8n": "source read at n8n@2.40.7, not driven: SAML (packages/cli/src/modules/sso-saml, isSamlLicensed at middleware/saml-enabled-middleware.ts:14), OIDC (packages/cli/src/modules/sso-oidc/oidc.controller.ee.ts:44 @Licensed('feat:oidc')) and LDAP (packages/cli/src/modules/ldap.ee/ldap.controller.ee.ts:22 @Licensed('feat:ldap')) with role mapping rules (packages/cli/src/public-api/v1/handlers/role-mapping-rules) Note: Works, enterprise-licensed. Matches the old partial.", "open-webui": "source read at v0.11.4, not driven: OAuth/OIDC with group mapping (backend/open_webui/utils/oauth.py, config.py:2582 ENABLE_OAUTH_GROUP_MANAGEMENT), LDAP/AD (config.py:2788), trusted header SSO (env.py:802), SCIM 2.0 provisioning (routers/scim.py, env.py:907) Note: old partial rested on a feature row; code covers OIDC, LDAP, SCIM and group sync", - "hermes-agent": "source read at v2026.9.24, not driven: plugins/dashboard_auth/self_hosted/plugin.yaml:1-4 OIDC sign-in to the dashboard against Keycloak, Authentik, Zitadel, Okta and others; plugins/dashboard_auth/self_hosted/__init__.py:262-270 groups are folded into a free-form org_id string that no access check reads (hermes_cli/dashboard_auth/base.py:12-16); chat users are platform ids in allowlists (gateway/authz_mixin.py:32-37) Note: Sign-in with company accounts works for the dashboard; groups do not map to rights." + "hermes-agent": "source read at v2026.9.24, not driven: plugins/dashboard_auth/self_hosted/plugin.yaml:1-4 OIDC sign-in to the dashboard against Keycloak, Authentik, Zitadel, Okta and others; plugins/dashboard_auth/self_hosted/__init__.py:262-270 groups are folded into a free-form org_id string that no access check reads (hermes_cli/dashboard_auth/base.py:12-16); chat users are platform ids in allowlists (gateway/authz_mixin.py:32-37) Note: Sign-in with company accounts works for the dashboard; groups do not map to rights.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant runs as the logged-in Nextcloud user and the agent acts as that user (context_agent:ex_app/lib/main.py:190-191); sign-in and groups come from the server's user backends (SAML/OIDC/LDAP apps, not read)." } }, { @@ -6097,7 +6306,7 @@ "providerHow": "read-from-code", "feature": "agent-credentials", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -6107,7 +6316,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/secrets.py:8-20 Bitwarden Secrets Manager and 1Password sources (agent/secret_sources/); agent/vault_store.py:1-8 encrypted, model-blind local vault; hermes_cli/proxy_cli.py:352-365 iron-proxy injects real credentials at egress so sandboxes hold only proxy tokens; hermes_cli/subcommands/vault.py:8", "dify": "source read at 1.17.1, not driven: tool, model, datasource and trigger credentials are stored encrypted per workspace (api/core/helper/encrypter.py, provider_encryption.py) and referenced by agents, not typed into agent settings (api/controllers/console/workspace/tool_providers.py, model_providers.py:200); api/models/credential_permission.py limits who may use each credential Note: an encrypted store in the Dify database, not an external vault such as HashiCorp", "n8n": "source read at n8n@2.40.7, not driven: API keys live in the encrypted credential store, referenced by id, not in agent settings (packages/core/src/encryption/cipher.ts:9-10); outside vaults HashiCorp Vault, AWS, Azure Key Vault, GCP, Infisical and 1Password via packages/cli/src/modules/external-secrets.ee/providers/ (feat:externalSecrets, packages/@n8n/constants/src/index.ts:25) Note: Outside vaults are enterprise-licensed.", - "open-webui": "source read at v0.11.4, not driven: outside keys are kept centrally in the config table (admin Connections, tool servers) and plugin valves are Fernet-encrypted (backend/open_webui/utils/valves.py:21 encrypt_valves), OAuth tool tokens encrypted (utils/oauth.py:269); searched 'vault|keyring|secret manager' in backend/open_webui: no external vault integration" + "open-webui": "source read at v0.11.4, not driven: outside keys are kept centrally in the config table (admin Connections, tool servers) and plugin valves are Fernet-encrypted (backend/open_webui/utils/valves.py:21 encrypt_valves), OAuth tool tokens encrypted (utils/oauth.py:269); searched 'vault|keyring|secret manager' in backend/open_webui: no external vault integration", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the only outside key (HERE) is a PASSWORD field in the ExApp admin form (context_agent:ex_app/lib/main.py:95-102) and MCP credentials would sit in the plain MCP JSON field (main.py:103-110); searched 'vault|secret' in both repos: none." } }, { @@ -6127,7 +6337,7 @@ "providerHow": "read-from-code", "feature": "agent-credentials", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -6137,7 +6347,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/secret_scope.py:1-10 each profile's own .env keys resolve only inside that profile's turns (fail-closed under multiplexing); hermes_cli/subcommands/profile.py:31-34 cloned profiles drop bot tokens unless --clone-channels; tui_gateway/methods_profiles.py:372-378 share_auth off forks credentials per profile", "n8n": "source read at n8n@2.40.7, not driven: credentials are picked per model and per tool node, not per agent identity (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:175-187 node tool credentials, :447 model credential); per-user credential resolution is enterprise-licensed dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee) and token exchange (packages/cli/src/modules/token-exchange, feat:tokenExchange at packages/@n8n/constants/src/index.ts:55) Note: An agent can be given only the credentials its tools need, but there is no credential that is the agent's own identity.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1032,1062 per-agent service API keys (create, list, revoke); per-agent secret environment variables injected only at runtime (web/i18n/en-US/agent-v-2.json advancedSettings.envEditor.scopeSecret, tools.cliDialog.securityTip); each tool on an agent picks which workspace credential it uses (agent-v-2.json tools.credential.authOne)", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:389 an automation run gets a short-lived token for its owner ({'id': user.id, 'typ': 'automation'}), so it acts with the owner's full rights; tool-server auth is set per connection or per user OAuth (src/lib/components/AddToolServerModal.svelte:313); searched 'agent credential|service account|scoped token' in backend/open_webui: no credential per agent" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:389 an automation run gets a short-lived token for its owner ({'id': user.id, 'typ': 'automation'}), so it acts with the owner's full rights; tool-server auth is set per connection or per user OAuth (src/lib/components/AddToolServerModal.svelte:313); searched 'agent credential|service account|scoped token' in backend/open_webui: no credential per agent", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent always acts as the requesting user through AppAPI (context_agent:ex_app/lib/main.py:189-191); searched 'service account|credential|token' in context_agent:ex_app: no per-agent credential." } }, { @@ -6163,7 +6374,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin section 'ai' with feature toggles, chat instructions, last-N messages and global skills folder (assistant:lib/Settings/Admin.php:35-87, src/components/AdminSettings.vue:9-214) plus the Context Agent form for tools, HERE key and MCP config (context_agent:ex_app/lib/main.py:81-112,125).", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ConfigPage.tsx:384-391 sectioned config editor for config.yaml plus EnvPage (Keys) and ModelsPage in the Hermes dashboard; hermes_cli/subcommands/setup.py:11 `hermes setup`; searched 'nextcloud' repo-wide: none Note: Set up from Hermes' own dashboard and CLI, not from Nextcloud admin settings.", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "dify": "source read at 1.17.1, not driven: Dify is set up in its own workspace settings and Integrations page (members api/controllers/console/workspace/members.py, model providers, plugins, web/app/(commonLayout)/integrations) plus environment variables (docker/.env.example); searched 'nextcloud' in api/ and web/: no Nextcloud admin settings panel Note: own settings, not Nextcloud's", @@ -6187,7 +6398,7 @@ "providerHow": "read-from-code", "feature": "app-manifest", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -6197,7 +6408,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/setup.py:42,65 first-run admin account setup (web/app/install); api/controllers/console/onboarding.py:56 and web/app/components/step-by-step-tour a checklist tour pointing to Integrations, Knowledge, Studio and Learn Dify lessons (web/i18n/en-US/common.json:643-662); web/i18n/en-US/common.json:378 'Please install a model provider first'. No wizard that configures the first provider and agent end to end Note: a tour of pages, not a guided setup of provider plus agent", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/setup.py:11-26 `hermes setup` interactive wizard with sections; hermes_cli/gateway_setup_wizard.py:1 `hermes gateway setup` per-platform prompts; apps/desktop/e2e/core/onboarding-first-chat.spec.ts desktop onboarding to a first chat; web/src/pages/ProfileBuilderPage.tsx:32 profile builder", "open-webui": "source read at v0.11.4, not driven: src/lib/components/OnBoarding.svelte:82-118 is a welcome screen ('Welcome to your AI home.', 'Get started', 'Read the docs') before the first admin signs up (src/routes/auth/+page.svelte:216); searched 'wizard|setup step|first provider' in src/lib/components: no guided provider or agent setup", - "n8n": "source read at n8n@2.40.7, not driven: n8n Assistant onboarding walks an admin through connecting a model (en.json:5358-5365 'Get started', 'Connect a model'; setup state checked in packages/frontend/editor-ui/src/features/ai/instanceAi useInstanceAiReady), and a new agent then opens in that assistant to be built (packages/frontend/editor-ui/src/features/agents/views/NewAgentView.vue:58-83)" + "n8n": "source read at n8n@2.40.7, not driven: n8n Assistant onboarding walks an admin through connecting a model (en.json:5358-5365 'Get started', 'Connect a model'; setup state checked in packages/frontend/editor-ui/src/features/ai/instanceAi useInstanceAiReady), and a new agent then opens in that assistant to be built (packages/frontend/editor-ui/src/features/agents/views/NewAgentView.vue:58-83)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin settings explain missing providers per feature with links to llm2, integration_openai, stable diffusion and whisper (assistant:src/components/AdminSettings.vue:55-120); no guided wizard." } }, { @@ -6217,7 +6429,7 @@ "providerHow": "read-from-code", "feature": "agent-engine-port", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", @@ -6227,7 +6439,8 @@ "n8n": "source read at n8n@2.40.7, not driven: machine health checks /healthz and /healthz/readiness (packages/cli/src/abstract-server.ts:139) and Prometheus metrics (packages/@n8n/config/src/configs/endpoints.config.ts:8); per agent channel status (packages/cli/src/modules/agents/agent-integrations.controller.ts:89-104); worker view is licensed (packages/@n8n/constants/src/index.ts:33 feat:workerView); searched 'health' in packages/frontend/editor-ui/src/features/settings: no page for chat and its dependencies Note: Endpoints for monitoring tools, no health page for people.", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SystemPage.tsx:106 doctor run with live log and :187 memory-provider status; web/src/i18n/en.ts status.* gateway running/failed, connected platforms, active sessions on the status overview; hermes_cli/web_routers/status.py:115 /api/health and gateway/platforms/api_server.py:1592 /health/detailed", "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads, /db-pool-stat JSON endpoints and api/celery_healthcheck.py for machine checks; searched 'health|status page|system status' in web/app and web/i18n/en-US: no page showing chat and dependency health Note: endpoints only, no page", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health and :3009 GET /health/db return JSON for probes; admin connection verify buttons only at edit time (AddToolServerModal.svelte:206); searched 'health|status page' in src/lib/components/admin: no page showing chat and dependency health" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health and :3009 GET /health/db return JSON for probes; admin connection verify buttons only at edit time (AddToolServerModal.svelte:206); searched 'health|status page' in src/lib/components/admin: no page showing chat and dependency health", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin settings show whether TaskProcessing providers and the Context Agent are available (assistant:lib/Settings/Admin.php:36-45,63-76); the chat shows a no-provider empty state (assistant:src/components/NoProviderEmptyContent.vue). No health page with dependency status." } }, { @@ -6247,7 +6460,7 @@ "providerHow": "read-from-code", "feature": "app-manifest", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "no", "dify": "partial", @@ -6258,7 +6471,8 @@ "copilot-studio": "docs-only: competitor_features#31612 \"Message-metered pricing: $0.01/message or $200/mo pack; cost spikes with generative/autonomous use.\"", "open-webui": "source read at v0.11.4, not driven: no usage metering or seat licensing in the code (searched 'license key|seat|billing' in backend/open_webui), so self-hosting is free; LICENSE:23-33 requires an enterprise licence to rebrand above fifty end users, and the admin notice for more than 50 users points to enterprise licences (translation key 'You have more than 50 users...'); enterprise pricing itself is not in the code", "dify": "source read at 1.17.1, not driven: the self-hosted Community Edition carries no seat or message fee in code (api/services/feature_service.py:24-31 billing limits only for CLOUD); enterprise licences carry a member limit (api/services/entities/feature_entities.py:161 workspace_members LicenseLimitationModel) and Cloud plans limit apps and members (:152-157) Note: community is free; paid editions are limited by members or plan, pricing itself not in code", - "n8n": "source read at n8n@2.40.7, not driven: the self-hosted community edition runs without seat or message metering; licensed plans carry quotas such as quota:users and quota:activeWorkflows (packages/@n8n/constants/src/index.ts:63-65) and report billable execution counts daily (packages/cli/src/modules/instance-reporting.ee/instance-reporting.module.ts) Note: Free self-hosting is flat; paid tiers meter users and executions. Pricing itself is not in the code." + "n8n": "source read at n8n@2.40.7, not driven: the self-hosted community edition runs without seat or message metering; licensed plans carry quotas such as quota:users and quota:activeWorkflows (packages/@n8n/constants/src/index.ts:63-65) and report billable execution counts daily (packages/cli/src/modules/instance-reporting.ee/instance-reporting.module.ts) Note: Free self-hosting is flat; paid tiers meter users and executions. Pricing itself is not in the code.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the code has no licence or seat check in either repo (searched 'licen|subscription|seat'); both are free under AGPL. Nextcloud's paid support is priced per user (see sources.json pricing), not per instance." } }, { @@ -6278,14 +6492,14 @@ "providerHow": "read-from-code", "feature": "agent-schedule", "featureConfidence": "high", - "nextcloud-assistant": "no", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31389 \"No scaling / single-instance: Docs state \"no scaling support currently\"; English-biased tool-calling models required.\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent handles several tasks at once in an asyncio TaskGroup (context_agent:ex_app/lib/main.py:144-179) inside one container; searched 'worker|replica|queue' in context_agent:ex_app: no multi-worker scaling in the app. Note: Old 'no' rested on a docs line; concurrency inside one ExApp exists.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_swarm.py:1-8 parallel specialist workers on the kanban dispatcher (plugins/kanban/systemd/hermes-kanban-dispatcher.service); cron/jobs.py:2652-2653 at-most-once claims across N replicas; hermes_cli/gateway_multiplex_mode.py:1-8 one gateway serves many profiles; gateway/platforms/api_server.py:1322 concurrent API runs", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml:227,306,353,660 separate api, Celery worker, beat and agent_backend services; docker/.env.example:57,66-67 SERVER_WORKER_AMOUNT, CELERY_WORKER_AMOUNT, CELERY_AUTO_SCALE; dify-agent/src/dify_agent/runtime/run_scheduler.py schedules concurrent agent runs; schedules dispatched in parallel groups (api/schedule/workflow_schedule_task.py:108)", "n8n": "source read at n8n@2.40.7, not driven: queue mode spreads executions over worker processes (packages/@n8n/config/src/configs/executions.config.ts:90-91 EXECUTIONS_MODE, packages/cli/src/commands/worker.ts, packages/cli/src/scaling/job-processor.ts); several main instances need a licence (packages/cli/src/scaling/multi-main-setup.ee.ts, feat:multipleMainInstances) Note: Workers are free; multi-main high availability is enterprise-licensed. Old partial rested on a bug-fix line.", @@ -6309,7 +6523,7 @@ "providerHow": "read-from-code", "feature": "agent-tool-governance", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -6319,7 +6533,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:5-25 inbound A2A endpoint with Agent Card; plugins/platforms/a2a/security.py:1-4 peer identity from credentials (A2A_PEER_TOKENS token -> name), trusted-peer allow-list, JSONL audit, injection filtering; gateway/slash_access.py:1-10 command lists per user id Note: Outside agents can be registered and admitted by token; their tasks run in the agent's session with its full toolset, with no per-peer tool scope or run-as identity.", "dify": "source read at 1.17.1, not driven: api/controllers/openapi/oauth_device.py:103-129 RFC 8628 device flow issues bearer tokens that act as the approving account, scoped by api/libs/oauth_bearer.py:60-65 (apps:run, apps:read, workspace:*); clients allowed only via env OPENAPI_KNOWN_CLIENT_IDS (api/configs/feature/__init__.py:639-646, default difyctl); per-app API keys (api/controllers/console/apikey.py:236) and MCP server per app (api/controllers/mcp/mcp.py:44) Note: no UI to register an outside agent; scope is per-app or coarse token scopes, not a per-tool allowlist", "open-webui": "source read at v0.11.4, not driven: an outside agent can use a user's API key (backend/open_webui/routers/auths.py:1529) limited to listed endpoints by auth.api_key.endpoint_restrictions and allowed_endpoints (utils/auth.py:522-543), acting as that user; searched 'client registration|agent registry|service account' in backend/open_webui: no registry of outside agents or per-agent identity Note: restriction is instance-wide per key type, identity is always a human user", - "n8n": "source read at n8n@2.40.7, not driven: outside agents connect to the instance MCP server with an API key or OAuth client (packages/cli/src/modules/mcp/mcp-api-key.service.ts, packages/cli/src/modules/oauth-server) and act as the user who issued it; packages/cli/src/modules/mcp/mcp-scopes.ts:13-50 grantable scopes limit which tools they may call (workflow:read, workflow:write, workflow:execute, agent:read ...), and workflows or agents opt in to MCP one by one (agent.entity.ts:39-40 availableInMCP)" + "n8n": "source read at n8n@2.40.7, not driven: outside agents connect to the instance MCP server with an API key or OAuth client (packages/cli/src/modules/mcp/mcp-api-key.service.ts, packages/cli/src/modules/oauth-server) and act as the user who issued it; packages/cli/src/modules/mcp/mcp-scopes.ts:13-50 grantable scopes limit which tools they may call (workflow:read, workflow:write, workflow:execute, agent:read ...), and workflows or agents opt in to MCP one by one (agent.entity.ts:39-40 availableInMCP)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: outside AI agents can call the tools over MCP at /mcp, each call running as the Nextcloud user whose credentials it presents (context_agent:ex_app/lib/mcp_server.py:17-41); only the instance-wide tool categories limit what it may call (context_agent:ex_app/lib/tools.py:33). No per-client registration." } }, { @@ -6346,7 +6561,7 @@ "n8n": "partial", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: personal settings toggle the header entry, audio auto-play and each smart picker feature, and list remembered conversations (assistant:src/components/PersonalSettings.vue:12-65, lib/Controller/ConfigController.php:43-44).", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 USER.md holds the user's preferences and style and loads every session; hermes_cli/commands.py:163 /personality, :207 /busy, :176 /verbose, :170 /timestamps; web/src/pages/ConfigPage.tsx config editor Note: Preferences are per profile; separate people get separate preferences only through separate profiles or a user-modelling memory provider.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/account.py:376,394,412 account settings are only interface language, theme and timezone; searched 'custom instruction|personal instruction|about you|user preference' in web/i18n/en-US, api/controllers and dify-agent/src: only conversation variables that a builder defines per conversation (web/i18n/en-US/workflow.json:113) Note: no per-person settings for how agents behave", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/General.svelte:29 personal system prompt, :80 saved to user settings, model parameters (settings.personal.general.modelParameters), language; Personalization.svelte memory on/off; Notifications.svelte delivery; InputMenu.svelte:54 default tool-approval mode", @@ -6362,14 +6577,14 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/364027", "originNote": "Gemeente Zaanstad zaaksysteem (2025-01-17) requirement 17539; also UWV 415648 requirement 123258", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: neither app trains or sends data for training; all model calls go to the instance's TaskProcessing (context_agent:ex_app/lib/nc_model.py:165-179). Whether a provider trains on data depends on the chosen provider app (not read); the code gives no guarantee.", "hermes-agent": "source read at v2026.9.24, not driven: agent/chat_completion_helpers.py:445-453 provider_routing.data_collection ('deny') plus only/ignore provider lists sent to OpenRouter; hermes_cli/model_data_policy_guard.py:23-55 warns before selecting a tier that trains on prompts (Meta contributor only rule); hermes_cli/models_local.py:1-5 local models keep data in house Note: Controls exist per provider route and by choosing local models; nothing guarantees it across all configured providers.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'fine.?tun|train on|zero data|data retention' in api/core, api/services and web/i18n/en-US: Dify itself trains nothing and self-hosting lets the organisation pick any provider, including local models via plugins; api/configs/feature/__init__.py:835-845 community telemetry is anonymous and can be disabled. No per-provider no-training guarantee or setting in the product Note: depends on the chosen model provider's terms, nothing in the product enforces or records it", @@ -6386,14 +6601,14 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/402469", "originNote": "Tilburg University DMS (2025-11-26) requirement 57596; also Juridisch Loket 307676 requirement 102700 and Molenlanden 415259 requirement 71423", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: answers show the tools used and the model's reasoning content (assistant:src/components/ChattyLLM/Message.vue:36-72) and an AI-generated notice (ChattyLLMInputForm.vue:178); sensitive actions wait for the user (ov-approval). No plain-language explanation of how an outcome came about.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 tool progress shows each step taken; hermes_cli/commands.py:190-192 /reasoning show displays model reasoning summaries (agent/reasoning_summaries.py); agent/turn_explainers.py:1-4 explains why a turn ended without an answer; web/src/pages/SessionsPage.tsx full transcript Note: Steps and reasoning can be shown; there is no plain-language account of how an outcome came about for a reviewer who keeps the final say.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/reasoning-panel.tsx, workflow-process.tsx and tool-detail.tsx show the model's reasoning, each workflow step and tool call under an answer; citation popup names source documents (web/app/components/base/chat/chat/citation/popup.tsx:31); Human Input node lets a person confirm before the next step (web/i18n/en-US/workflow.json:46) Note: raw trace and sources, not a generated plain-language explanation of the outcome", @@ -6410,14 +6625,14 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/371293", "originNote": "Veiligheidsregio Utrecht klantcontactsysteem (2025-03-17) requirement 4339", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Context Chat can be limited to chosen files, folders or providers per question (assistant:src/components/ContextChat/ContextChatInputForm.vue:25,158-159, context_agent:ex_app/lib/all_tools/context_chat.py:30-57); no admin-set validated corpus the assistant is locked to.", "hermes-agent": "source read at v2026.9.24, not driven: searched 'only answer from|answer only|grounded only|restrict.{0,20}sources' in agent/ tools/ hermes_cli/: none that constrains answers to a document set; tools/website_policy.py:1-5 blocklists sites and hermes_cli/web_routers/tools.py:280 toolset toggles can remove web tools, but nothing limits answers to validated documents Note: A profile can be narrowed by removing tools and by SOUL.md wording; nothing enforces it.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: answers can be grounded in a curated knowledge base, but the limit is only a prompt: api/core/prompt/prompt_templates/advanced_prompt_templates.py:1 'Use the following context as your learned knowledge ... If you don't know, just say that you don't know'; annotation reply returns curated answers above a score threshold (api/controllers/console/app/annotation.py:170,199; web/i18n/en-US/app-debug.json:40-47) Note: no hard switch that blocks answers outside validated documents, and no validated flag on documents", @@ -6434,14 +6649,14 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/415259", "originNote": "Gemeente Molenlanden zaaksysteem 2026 (2026-03-11) requirement 71423", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "no", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'literacy|training|tutorial|learn' in assistant:src: only the AI-output notice (ChattyLLMInputForm.vue:178) and a link to admin docs (AdminSettings.vue:12-15).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/tips.py:1-3 tips at CLI session start; tools/tour_tool.py:1-5 agent-led guided tours of the desktop UI; hermes_cli/journey.py:1 `hermes journey` timeline of what Hermes learned; web/src/pages/DocsPage.tsx:1 docs link in the dashboard Note: Help teaches how to use Hermes, not AI literacy (limits, risks, verification) as training modules.", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:203 Help, Learn Dify and :620,643-647 step-by-step tour with hands-on lessons on workflows and agents (api/controllers/console/onboarding.py:56); searched 'ai literacy|limitations|hallucinat|responsible' in web/i18n/en-US: nothing explains AI risks or limits to end users Note: product lessons for builders only", @@ -6458,14 +6673,14 @@ "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/415259", "originNote": "Gemeente Molenlanden zaaksysteem 2026 (2026-03-11) requirement 71423", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'bias|fairness|eval' in both repos: none.", "hermes-agent": "source read at v2026.9.24, not driven: searched '\\bbias\\b|fairness' in agent/ tools/ hermes_cli/ evals/: only ranking bias in tools/session_search_tool.py:693 and a fairness comment in evals/; no bias test runner or stored results", "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'bias|fairness|evaluation|test case' in api/controllers, api/services and web/i18n/en-US: no hits beyond external tracer blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix); no scheduled test runs of agents and no stored bias result", @@ -6481,14 +6696,14 @@ "origin": "changelog", "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.5.7", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", "n8n": "no", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'board|claim|handoff' in agent code: one agent; Deck tools manage human boards (context_agent:ex_app/lib/all_tools/deck.py) but no multi-agent task claiming.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:459 `hermes kanban` durable task board shared across profiles; hermes_cli/kanban_db.py:1249 create_task, :2263 claim_task, :2558 reclaim_task, :2723 complete_task; tools/kanban_tools.py:112 kanban_complete/kanban_block agent tools, :237 kanban_comment hand-off between tasks.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'board|claim|kanban|task queue|hand.?off' in web/i18n/en-US/agent-v-2.json, workflow.json and dify-agent/src: no shared task board; agents meet only as nodes in a designed workflow (api/core/workflow/nodes/agent_v2) or as tools (fl-subagent)", @@ -6509,14 +6724,14 @@ "origin": "changelog", "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.5.7", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each run ends when the model stops calling tools (context_agent:ex_app/lib/graph.py:56-60); scheduled runs reset context each time (assistant:lib/Service/ChatService.php:532-534). No goal check.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:117 /goal 'Set a standing goal Hermes works on across turns until achieved'; gateway/slash_commands_goals.py:37 handler in every messaging channel; hermes_cli/goals.py:397 GoalState, :344 GoalGate shell checks, :860 goal_judge model call decides done.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:20 Loop node with :804 'Loop Termination Condition' and :815 maximum loop count, so a builder can wrap an Agent node in a loop that repeats until a check holds; searched 'goal|until|stop condition' in dify-agent/src: an agent itself has no standing goal across turns Note: only as a builder-designed loop inside one workflow run, not across conversation turns", @@ -6537,14 +6752,14 @@ "origin": "changelog", "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.7.1", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: one TaskProcessing call per turn (context_agent:ex_app/lib/nc_model.py:165-179); searched 'ensemble|multiple models' in both repos: none.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:134 /moa runs a prompt through the Mixture of Agents preset; agent/moa_loop.py:1 reference models gathered before each iteration, aggregator answers; hermes_cli/subcommands/moa.py:10 `hermes moa configure`; hermes_cli/web_routers/models.py:204 GET /api/model/moa for the dashboard.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app-debug.json:31 'Debug as Multiple Models' shows several models side by side, for builder testing only; in a workflow a builder can run several LLM nodes on parallel branches (workflow.json:152 Add Parallel Node, :19 blocks.llm) and merge with a further LLM node or Variable Aggregator (:34) Note: no built-in ensemble setting; hand-built in a flow", @@ -6565,14 +6780,14 @@ "origin": "changelog", "originUrl": "https://github.com/NousResearch/hermes-agent/releases/tag/v2026.4.3", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no model keys in these repos (context_agent:ex_app/lib/nc_model.py uses server TaskProcessing); searched 'key rotation' in both: none.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/auth.py:10 `hermes auth add` pooled credentials; agent/credential_pool.py:122 least_used strategy, :1941 select, :2221 mark_exhausted_and_rotate; agent/agent_runtime_helpers.py:895 the turn rotates to the next key on a quota or auth failure. Note: distinct from mo-failover (second provider) and mo-key-broker (central store): same provider, many keys.", "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:387-390 model Load balancing: several credentials per model, round-robin, 1-minute cooldown when rate limited; api/core/model_manager.py:208,440-476 _round_robin_invoke and cooldown on InvokeRateLimitError; api/configs/feature/__init__.py:813-815 MODEL_LB_ENABLED (default False) read in api/services/feature_service.py:115 Note: self-hosted turns it on with an env flag; on Cloud it is plan-gated (common.json:442 'Upgrade your plan to enable Load Balancing')", @@ -6593,14 +6808,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/12238", "hermiq": "partial", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'backup|restore|snapshot' in both repos: none. Memories and skills are Nextcloud files, so server backups and file versions cover them (not read).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/backup.py:10 `hermes backup` zips ~/.hermes, hermes_cli/backup.py:671 run_backup, :993 run_import; hermes_cli/cli_commands_mixin.py:805 /snapshot list|create|restore; hermes_cli/update_cmd_maint.py:692 automatic snapshot only before an update. No scheduled backup job and no version history (grep backup in cron/: only fallback-provider copy). Note: issue open; automatic backups are limited to the pre-update snapshot.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: per-object version restore only: agents (api/controllers/console/agent/roster.py:1302), workflows (billing.json:167-168, plan-gated on Cloud) and skills (skill.json:153-157); searched 'backup' in api/, web/i18n/en-US and docker/: only docker/dify-env-sync.sh backing up the .env file (docker/README.md:151-159); no automatic backup of all agent data Note: no platform backup; restore of single agent or workflow versions", @@ -6622,14 +6837,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/689", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "partial", "n8n": "yes", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'a2a|remote agent|delegate' in context_agent:ex_app: none; only MCP tools from other servers (context_agent:ex_app/lib/all_tools/mcp.py).", "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:6 bundled A2A plugin, outbound a2a_discover/a2a_call/a2a_orchestrate; plugins/platforms/a2a/tools.py:173 a2a_call sends a task to a configured peer or URL and returns the reply, :255 a2a_orchestrate; :330 tools appear only once a2a_agents or the platform is configured. Note: issue #689 is still open but the A2A plugin shipped in core covers remote delegation; config-gated, off by default.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: a remote agent can be reached only as a tool: MCP servers added as tool providers (api/controllers/console/workspace/tool_providers.py:1373), custom OpenAPI tools (:685) or an HTTP Request node (web/i18n/en-US/workflow.json:11); searched 'a2a|remote agent|agent.?card' in api/core and web/i18n/en-US: no agent-to-agent protocol Note: works through MCP or HTTP wrappers, no native remote agent hand-off", @@ -6650,14 +6865,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/31802", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the model wrapper only waits when rate limited (context_agent:ex_app/lib/nc_model.py:206-219); searched 'rate' in both repos: no per-minute cap.", "hermes-agent": "source read at v2026.9.24, not driven: searched 'requests_per_minute|rpm|token_bucket|throttle|rate_limit_delay' in agent/, run_agent.py, hermes_cli/: agent/rate_limit_tracker.py:181 only displays provider RPM headers; rate_limit_delay is accepted in hermes_cli/config.py:993 and hermes_cli/config_providers.py:260 but nothing in agent/ reads it. No client-side limiter. Note: a config key nothing reads, so no. Same demand in #58061.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 max_active_requests caps concurrent requests per app, enforced in api/services/app_generate_service.py:153,384; provider rate limits are only handled reactively by load-balancing cooldown (api/core/model_manager.py:469-476); searched 'per.?minute|rpm' in api/configs and api/core/model_manager.py: per-minute limits exist only for the openapi token and forms (api/configs/feature/__init__.py:1063) Note: concurrency cap, not requests per minute to a provider", @@ -6678,14 +6893,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/17565", "hermiq": "yes", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: task input carries prompt, history and tools only (context_agent:ex_app/lib/nc_model.py:97-160); searched 'temperature' in both repos: none.", "hermes-agent": "source read at v2026.9.24, not driven: no temperature key in hermes_cli/config*.py (grep temperature hermes_cli: none for the main agent); agent/chat_completion_helpers.py:1416 only fixed per-model temperatures; a custom provider's extra_body (hermes_cli/config.py:993, applied at agent/agent_runtime_helpers.py:1937) can pass one; MoA presets have reference/aggregator temperature (hermes_cli/web_models.py:152). Note: issue open; only indirect paths.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 ModelParameterModal per agent renders the provider's parameter rules including temperature (web/app/components/header/account-setting/model-provider-page/model-parameter-modal/__tests__/presets-parameter.spec.tsx); LLM nodes and classic apps use the same modal", @@ -6707,14 +6922,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/16833", "hermiq": "partial", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "no", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: memory is one tree per user, organised by subject folders (context_agent:ex_app/lib/all_tools/memory.py:246-260); searched 'project' scoping in memory code: none.", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:39 memory dir is per profile (HERMES_HOME/memories), so a profile per project gives separate memory but no shared layer; agent/prompt_builder.py:139 project .hermes.md/HERMES.md is read-only context; agent/skill_utils.py:437 project-local skills. Searched 'project.scoped|memory_scope' in agent, tools, plugins/memory: none. Note: issue open.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 agent working directories are owned per workflow run, conversation or build draft only; searched 'project' in web/i18n/en-US/agent-v-2.json and dify-agent/src: no project scope and no memory split into project and shared parts", @@ -6736,14 +6951,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/NousResearch/hermes-agent/issues/4335", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", "n8n": "no", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: conversations live in the Assistant chat only (assistant:lib/Service/ChatService.php); searched 'channel|talk bot' in both repos: no carry-over.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands_session.py:862 /resume, :323 a stored session is only resumable from the same platform and thread, :303 cross-origin resume only for an explicitly configured admin with --all; all sessions share one state.db so the local CLI can reopen them. Note: issue open; cross-channel is admin-only in the gateway.", "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:124-128 a caller resumes a conversation by passing conversation_id with the same user id, so two self-built channels on the Service API can share one thread; conversations are filtered by end user (api/services/conversation_service.py:56-57) and the web app session is a separate end user, so nothing carries over between the web app and a messenger plugin Note: only by a builder passing ids through the API", @@ -6760,14 +6975,14 @@ "origin": "changelog", "originUrl": "https://github.com/langgenius/dify/releases/tag/1.17.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'snapshot|publish|build' in both repos: none.", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/models/agent.py:218 AgentHomeSnapshot captured when a build is applied; release 1.17.0 'Build-time Home Snapshots' restores the sandbox home on each published run", @@ -6784,14 +6999,14 @@ "origin": "changelog", "originUrl": "https://github.com/langgenius/dify/releases/tag/1.16.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'pip|npm|install|subprocess' in context_agent:ex_app/lib/all_tools/: none.", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:237,251 'Add a CLI Tool', 'Install a CLI tool from any package registry. The agent gains shell access to the binary it provides'", @@ -6808,14 +7023,14 @@ "origin": "changelog", "originUrl": "https://github.com/langgenius/dify/releases/tag/1.17.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "yes", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no shell or code execution tool exists (searched 'exec|shell' in all_tools).", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: docker/.env.example:271 DIFY_AGENT_RUNTIME_BACKEND=local, docker/docker-compose.e2b.yaml ships the E2B backend; web/i18n/en-US/agent-v-2.json:91 notes the limits of the community local sandbox", @@ -6832,14 +7047,14 @@ "origin": "changelog", "originUrl": "https://github.com/langgenius/dify/releases/tag/1.14.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: GET /chat/generate?sessionId=&agencyConfirm=1|0 answers a pending approval (assistant:lib/Controller/ChattyLLMController.php:489-491), documented in assistant:openapi.json (/ocs/v2.php/apps/assistant/chat/generate).", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/human_input_form.py:78 /form/human_input/; api/controllers/openapi/human_input_form.py:63,83 read and submit a human input form", @@ -6856,14 +7071,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/42496", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "partial", "n8n": "yes", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: only the session's own user can confirm (assistant:lib/Service/ChatService.php:360-372 checks the user's session); searched 'approver' in both repos: none.", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:558-561 the approval form can be emailed to chosen workspace members or external recipients, but searched 'assignee|approver' in workflow.json and api/controllers/web/human_input_form.py: whoever holds the form link can answer", @@ -6880,14 +7095,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/42309", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "no", "n8n": "partial", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'context window|tokens' in assistant:src/components/ChattyLLM: only a 64,000 character input limit notice (ChattyLLMInputForm.vue:191).", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'context usage|context window|tokens used' in web/i18n/en-US/agent-v-2.json, share.json and app-debug.json: no indicator; compaction runs silently (dify-agent/src/dify_agent/runtime/compaction.py)", @@ -6904,14 +7119,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/42638", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agents or flows to sort; searched 'folder' in chat session code: none.", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:667-669 apps can carry tags (permission-keys.json app.tag.manage) to filter the list; no folders", @@ -6928,14 +7143,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/41864", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "no", "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows or run views (searched 'compare|diff' in assistant:src).", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: searched 'compare' in web/i18n/en-US/workflow.json and run-log.json: run history opens one run's tracing at a time (workflow.json:240-254), no comparison view", @@ -6952,14 +7167,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/40672", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "no", "n8n": "partial", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'hallucinat|claimed|verify' in context_agent:ex_app: none.", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", "dify": "source read at 1.17.1, not driven: issue is open against the function-calling agent runner; searched 'fabricat|expected tool|zero tool call' in api/core/agent and dify-agent/src: no check", @@ -6976,14 +7191,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/9321", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent can loop over DuckDuckGo search and web_fetch and is told to fetch result pages (context_agent:ex_app/lib/agent.py:143-158, context_agent:ex_app/lib/all_tools/duckduckgo.py, web.py); no dedicated deep-research mode or cited report.", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", @@ -7000,14 +7215,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/9594", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "yes", "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: sign-in is Nextcloud's own, where two-factor providers apply (server and twofactor apps, not read); every Assistant route requires that session (assistant:lib/Controller/ChattyLLMController.php NoAdminRequired, no PublicPage).", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", @@ -7024,14 +7239,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/9826", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "no", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: messages are stored as plain text columns (assistant:lib/Migration/Version010010Date20240430083738.php:55-68); searched 'encrypt' in both repos: none.", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", @@ -7048,14 +7263,14 @@ "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/14121", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the MCP client config is one admin JSON for all users (context_agent:ex_app/lib/main.py:103-110, context_agent:ex_app/lib/all_tools/mcp.py:14-20); no per-user login to outside MCP servers. The reverse direction (this instance as MCP server) does run as the caller (mcp_server.py:31-41).", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", @@ -7079,7 +7294,7 @@ "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: the agent calls TaskProcessing only (context_agent:ex_app/lib/nc_model.py:165-179); the provider protocol is chosen inside integration_openai, not read.", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", @@ -7103,7 +7318,7 @@ "n8n": "yes", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: no caching in these repos; provider-side caching would be in integration_openai or the provider, not read.", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", @@ -7120,14 +7335,14 @@ "origin": "changelog", "originUrl": "https://github.com/open-webui/open-webui/releases/tag/v0.11.1", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the run pauses before a sensitive action and asks Confirm or Cancel, with the option to reply with new instructions (assistant:src/components/ChattyLLM/AgencyConfirmation.vue:10-30,76); free questions end the turn. No suggested-answer buttons.", "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", @@ -7144,14 +7359,14 @@ "origin": "changelog", "originUrl": "https://github.com/open-webui/open-webui/releases/tag/v0.11.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: TaskProcessing task types declare input shapes that the Assistant renders as fields, enums and numbers (assistant:src/components/fields/TaskTypeFields.vue, EnumField.vue, NumberField.vue); the agent chat has no such form.", "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", @@ -7168,14 +7383,14 @@ "origin": "changelog", "originUrl": "https://github.com/open-webui/open-webui/releases/tag/v0.11.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "yes", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: message actions are copy, regenerate and delete (assistant:src/components/ChattyLLM/MessageActions.vue:9-32); searched 'fork|branch' in chat code: none.", "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", @@ -7192,14 +7407,14 @@ "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.34.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in either repo (searched 'flow|workflow').", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", @@ -7216,14 +7431,14 @@ "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.22.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent logs task input text at INFO, skipping only the conversation token (context_agent:ex_app/lib/main.py:169-178); searched 'redact|mask' in both repos: no policy.", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", @@ -7240,14 +7455,14 @@ "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.36.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent keeps its memories and skills under 'Context Agent/' in the user's Assistant folder (context_agent:ex_app/lib/all_tools/memory.py:26, assistant:lib/Service/AgentSkillsService.php:31) and task output files can be saved there (assistant:appinfo/routes.php:35,38); files it creates go wherever it writes in the user's Files. No per-session workspace.", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", @@ -7264,14 +7479,14 @@ "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.28.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: multimodal chat passes attached files as file parts by id (context_agent:ex_app/lib/nc_model.py:58-68, agent.py:222-224), so a PDF reaches the provider unconverted; whether the model reads it natively depends on the provider (not read). Text tasks parse files to text first (POST /api/v1/parse-file).", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", @@ -7288,14 +7503,14 @@ "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.38.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'browser|playwright|selenium|click' in context_agent:ex_app: only HTTP GET via web_fetch (context_agent:ex_app/lib/all_tools/web.py).", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", @@ -7312,14 +7527,14 @@ "origin": "featureRequest", "originUrl": "https://community.n8n.io/t/feat-ai-tools-add-max-tool-interactions-to-ai-agent-nodes-to-prevent-infinite-loops/295587", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no cap in code; graph.astream runs without a recursion_limit (context_agent:ex_app/lib/agent.py:256), so LangGraph 1.0.1's default recursion limit is the only stop (context_agent:poetry.lock:2043-2050). Note: Needs a live check on the default value.", "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", @@ -7336,14 +7551,14 @@ "origin": "featureRequest", "originUrl": "https://community.n8n.io/t/296548", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool nodes have a fallback that returns 'Error: ... please fix your mistakes' to the agent as a tool message (context_agent:ex_app/lib/graph.py:22-41), and tools return error objects the agent reads (context_agent:ex_app/lib/all_tools/skills.py:96-113).", "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", @@ -7360,14 +7575,14 @@ "origin": "featureRequest", "originUrl": "https://community.n8n.io/t/285451", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no provider sign-in in these repos (models via TaskProcessing, context_agent:ex_app/lib/nc_model.py:165-179).", "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", @@ -7384,14 +7599,14 @@ "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.28.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a failed scheduled run posts a fixed error message (assistant:lib/Service/AssignmentsService.php:153-159); searched 'diagnos|fix' in both repos: none.", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", @@ -7408,14 +7623,14 @@ "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.36.0", "hermiq": "unknown", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "unknown", "copilot-studio": "unknown", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Tables tools create tables, columns and rows and read them back (context_agent:ex_app/lib/all_tools/tables.py:16-378), available when the Nextcloud Tables app is installed (tables.py:410-411).", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", @@ -7423,6 +7638,246 @@ "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" }, "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-bulk-delete-chats", + "area": "chat", + "name": "Delete many conversations at once instead of one by one.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/assistant/issues/639", + "hermiq": "unknown", + "nextcloud-assistant": "no", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the session list offers one Delete action per conversation (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:36-42) and DELETE /chat/delete_session takes one sessionId (assistant:lib/Service/ChatService.php:142); no bulk delete.", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-prompt-placeholders", + "area": "agents", + "name": "Use placeholders such as my name or today's date in the instructions an agent follows.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/assistant/issues/598", + "hermiq": "unknown", + "nextcloud-assistant": "partial", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: '{user}' is replaced with the display name in chat user instructions (assistant:lib/Service/ChatService.php:71) and the agent prompt gets today's date (context_agent:ex_app/lib/agent.py:137,186); no other placeholders.", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-ai-label", + "area": "compliance", + "name": "Label files and text an agent produced as AI-generated.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/assistant/issues/387", + "hermiq": "unknown", + "nextcloud-assistant": "partial", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: outputs of file actions and the new-file image menu get the system tag 'Generated using AI' (assistant:lib/Service/SystemTagService.php:18, lib/Listener/FileActionTaskSuccessfulListener.php:33); files the agent writes with upload_file are not tagged (context_agent:ex_app/lib/all_tools/files.py:148-165).", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-skill-search", + "area": "skills", + "name": "Let an agent find the right skill by searching when there are too many to list.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/context_agent/issues/212", + "hermiq": "unknown", + "nextcloud-assistant": "no", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every skill's name and description is put in the system prompt (context_agent:ex_app/lib/agent.py:165-177); searched 'search|rag' in skills.py: no skill search.", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-app-tools", + "area": "tools", + "name": "Let other installed apps add their own tools to the agent.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/context_agent/issues/161", + "hermiq": "unknown", + "nextcloud-assistant": "partial", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each unified search provider becomes a tool automatically (context_agent:ex_app/lib/all_tools/search.py:11-30); other tools are fixed modules shipped in all_tools or admin-added MCP servers (context_agent:ex_app/lib/tools.py:19-50).", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-mcp-oauth", + "area": "operations", + "name": "Let outside AI clients sign in to the instance's MCP server with OAuth.", + "source": "competitor-derived", + "origin": "featureRequest", + "originUrl": "https://github.com/nextcloud/context_agent/issues/74", + "hermiq": "unknown", + "nextcloud-assistant": "partial", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the MCP server forwards the client's Authorization header to /ocs/v2.php/cloud/user to find the user (context_agent:ex_app/lib/mcp_server.py:17-41); searched 'oauth|well-known' in context_agent:ex_app: no OAuth discovery or flow.", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-show-reasoning", + "area": "observability", + "name": "See the model's reasoning next to its answer.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/nextcloud/assistant/pull/595", + "hermiq": "unknown", + "nextcloud-assistant": "yes", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: reasoning output is stored per message (assistant:lib/Listener/ChattyLLMTaskListener.php:130-131, lib/Migration/Version030500Date20260630083738.php:34) and shown in a 'Reasoning content' popover and while streaming (assistant:src/components/ChattyLLM/Message.vue:36-47,79-80).", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-speech-translate", + "area": "chat", + "name": "Translate a spoken recording into another language and hear the result.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/nextcloud/assistant/pull/601", + "hermiq": "unknown", + "nextcloud-assistant": "yes", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant registers an audio-to-audio translate provider (assistant:lib/TaskProcessing/AudioToAudioTranslateProvider.php:32-43) chaining transcription, translation and speech.", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-subtitles", + "area": "delivery", + "name": "Generate a subtitle file for a video or recording from Files.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/nextcloud/assistant/pull/577", + "hermiq": "unknown", + "nextcloud-assistant": "yes", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Files action 'Generate subtitles using AI' posts to /api/v1/file-action/{fileId}/core:audio2text:subtitles (assistant:src/files/fileActions.js:164-190) with a notification when ready.", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-image-chat", + "area": "chat", + "name": "Send images to the agent in chat and get images back in its answer.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://github.com/nextcloud/assistant/pull/602", + "hermiq": "unknown", + "nextcloud-assistant": "yes", + "hermes-agent": "unknown", + "copilot-studio": "unknown", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: attachments go to the multimodal agent as file parts (context_agent:ex_app/lib/nc_model.py:58-68, agent.py:222-224) and output_attachments are saved on the answer (assistant:lib/Listener/ChattyLLMTaskListener.php:135-140, context_agent:ex_app/lib/agent.py:296-297).", + "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" } ], "pending": [ @@ -7443,7 +7898,7 @@ "providerHow": "read-from-code", "feature": "agent-identity", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -7453,7 +7908,8 @@ "n8n": "source read at n8n@2.40.7, not driven: a workflow runs with the credentials chosen in its nodes, owned by its project; running as the person who asked needs dynamic credentials, enterprise-licensed (packages/cli/src/modules/dynamic-credentials.ee, feat:dynamicCredentials at packages/@n8n/constants/src/index.ts:53); chat hub passes the asker's auth metadata (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:178); searched 'service account' in packages/cli/src: none Note: Owner's credentials by default, requester with a licence, no service accounts.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 a requester's user id can route to their own profile, whose own keys and credentials then apply (agent/secret_scope.py:1-10); tools/environments/ssh.py runs the terminal as a configured remote account; searched 'run.?as|impersonat|service account|on behalf of' in agent/ and gateway/: no per-run identity choice Note: Tools act with the host or backend account and the profile's keys; choosing requester, owner or service identity per agent is not a setting.", "dify": "source read at 1.17.1, not driven: api/core/agent/entities.py:19 each agent tool carries a credential_id the builder picks; api/models/tools.py:121 credential visibility, web/i18n/en-US/plugin.json:27 an OAuth credential is 'only for you or shared with all workspace members'. So a tool runs as the builder's or a shared workspace credential; searched 'on_behalf|end_user credential|user_credential' in api/core/tools and api/core/plugin: no run-as-the-asking-person Note: owner or shared credential only, no per-caller identity and no service-account concept", - "open-webui": "source read at v0.11.4, not driven: interactive runs act as the asking user (main.py:1118 with user from the session); automation runs act as the owner with a minted token (backend/open_webui/utils/automations.py:389 'typ': 'automation', re-gated at :366); searched 'service account|run as|impersonat' in backend/open_webui: the rights holder cannot be chosen Note: fixed by trigger type, no service-account option" + "open-webui": "source read at v0.11.4, not driven: interactive runs act as the asking user (main.py:1118 with user from the session); automation runs act as the owner with a minted token (backend/open_webui/utils/automations.py:389 'typ': 'automation', re-gated at :366); searched 'service account|run as|impersonat' in backend/open_webui: the rights holder cannot be chosen Note: fixed by trigger type, no service-account option", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent always runs with the rights of the person who asked (context_agent:ex_app/lib/main.py:190-191) and MCP calls with the caller's login (context_agent:ex_app/lib/mcp_server.py:31-41); no choice of owner or service account." }, "pendingReason": "Whether actingUser is set anywhere outside seed/repair scripts on a live instance could not be settled without running the app." }, @@ -7474,7 +7930,7 @@ "providerHow": "read-from-code", "feature": "talk-shared-sessions", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "no", @@ -7484,7 +7940,8 @@ "dify": "source read at 1.17.1, not driven: api/services/conversation_service.py:56-57,179-180 every conversation is filtered to one from_end_user_id or from_account_id; api/controllers/web/conversation.py lists, renames, pins and deletes only the caller's own conversations; the Collaboration feature is live co-editing of the workflow canvas (api/controllers/console/socketio/workflow.py, web/i18n/en-US/workflow.json:118,986 collaborator cursors) Note: old yes rested on the Collaboration beta, which is shared canvas editing for builders, not a shared chat", "open-webui": "source read at v0.11.4, not driven: Channels put colleagues and models in one timeline: backend/open_webui/routers/channels.py:976 model_response_handler answers @mentioned models (:1244) in rooms and threads; src/lib/components/channel/Channel.svelte, Thread.svelte, MessageInput/MentionList.svelte; group and member channel types (translation 'A collaboration channel where people join as members') Note: old partial; shared agent conversations happen in channels", "hermes-agent": "source read at v2026.9.24, not driven: gateway/config.py:574-596 thread_sessions_per_user false by default, so everyone in a thread shares one session with the agent (group_sessions_per_user can be switched off for whole groups); gateway/session.py:634-641 session key resolution; hermes_cli/commands.py:76 /branch opens a shared thread", - "n8n": "source read at n8n@2.40.7, not driven: in the opt-in Agents module a Slack or Discord thread is one shared conversation whose memory belongs to the thread, not the author (packages/cli/src/modules/agents/utils/agent-memory-scope.ts:9-20); chat hub conversations are private to one user (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:110 by req.user.id) Note: Shared only through a chat platform channel, not in n8n's own chat." + "n8n": "source read at n8n@2.40.7, not driven: in the opt-in Agents module a Slack or Discord thread is one shared conversation whose memory belongs to the thread, not the author (packages/cli/src/modules/agents/utils/agent-memory-scope.ts:9-20); chat hub conversations are private to one user (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:110 by req.user.id) Note: Shared only through a chat platform channel, not in n8n's own chat.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: sessions belong to one user (assistant:lib/Service/ChatService.php:50,175-180 by userId); searched 'share|participant' in chat code: none." }, "pendingReason": "Whether every talk-shared-sessions requirement is complete cannot be settled without running a live Talk room." }, @@ -7506,7 +7963,7 @@ "providerHow": "read-from-code", "feature": "a-conversational-intake-that-files-for-the-citizen", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -7517,7 +7974,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:35 _ALLOW_ALL_USERS lets anyone message the bot on WhatsApp, SMS, Telegram and others without an account; gateway/run_inbound_unauthorized.py:1-9 strangers otherwise get a pairing code; searched 'intake|case|file.{0,10}request' in gateway/ and tools/: no intake flow that files a request Note: A public bot is possible; filing the request somewhere is left to whatever tools the agent has.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app.json:2 web app access 'Anyone with the link'; api/controllers/web/passport.py:53-72 issues a token to an anonymous end-user session, so a resident chats without an account; filing the request needs a builder-built HTTP Request node or custom tool (web/i18n/en-US/workflow.json:11,45); no ready-made intake to a case or request system in core Note: anonymous chat is core; the filing target has to be wired by hand", "open-webui": "source read at v0.11.4, not driven: searched 'anonymous|guest|public chat|intake' in backend/open_webui/routers/auths.py, routers/chats.py and src/routes: every chat requires an account (utils/auth.py get_verified_user); no anonymous assistant that files a request", - "n8n": "source read at n8n@2.40.7, not driven: a public chat page or embedded widget needs no n8n account (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:408-452 'public', packages/frontend/@n8n/chat), and the agent behind it can file a request with any tool node; the filing flow has to be built as a workflow Note: The anonymous chat is shipped; the request filing is hand-built." + "n8n": "source read at n8n@2.40.7, not driven: a public chat page or embedded widget needs no n8n account (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:408-452 'public', packages/frontend/@n8n/chat), and the agent behind it can file a request with any tool node; the filing flow has to be built as a workflow Note: The anonymous chat is shipped; the request filing is hand-built.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'PublicPage|guest|anonymous' in assistant:lib/Controller: every route needs a logged-in user." } }, { @@ -7536,7 +7994,7 @@ "providerHow": "read-from-code", "feature": "agent-webhook-trigger", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "yes", "dify": "partial", @@ -7547,7 +8005,8 @@ "dify": "source read at 1.17.1, not driven: core ships only audio, code, time and webscraper tools (api/core/tools/builtin_tool/providers/); connectors come from the in-product Dify Marketplace: about 149 official tool plugins (langgenius/dify-official-plugins tools/, e.g. slack, jira, notion, gmail, salesforce, nextcloud) plus about 1,290 community packages (langgenius/dify-plugins), installed from web/app/(commonLayout)/integrations; MCP client too Note: rated partial only by the brief's plugin rule; the catalogue is well over a hundred ready-made connectors, one click from the core UI. The lane keeps partial under the plugin rule (ruling 2026-09-26).", "n8n": "source read at n8n@2.40.7, not driven: 272 nodes in packages/nodes-base/nodes declare usableAsTool: true (e.g. Slack, Gmail, Google Calendar, Trello, Jira, Notion, SharePoint), any of which an AI Agent can call; plus MCP registry servers (packages/cli/src/modules/mcp-registry, default module)", "hermes-agent": "source read at v2026.9.24, not driven: tools/connectors/__init__.py:1-6 and tools/connectors/gateway/client.py:1-3 managed connector accounts through the Nous tool gateway; optional-mcps/ 65 Nous-approved MCP servers (asana, atlassian, notion, stripe, supabase, ...); plugin-catalog/ ~290 curated plugins Note: The managed connector set needs a Nous account; the MCP and plugin catalogs are self-configured.", - "open-webui": "source read at v0.11.4, not driven: outside services connect through generic MCP and OpenAPI tool servers (src/lib/components/AddToolServerModal.svelte:43, utils/mcp/client.py) and community Tools from openwebui.com (workspace/Tools.svelte:639); searched 'connector' in backend/open_webui: no shipped catalogue of ready-made connectors Note: ready-made connectors are community Tools, not core" + "open-webui": "source read at v0.11.4, not driven: outside services connect through generic MCP and OpenAPI tool servers (src/lib/components/AddToolServerModal.svelte:43, utils/mcp/client.py) and community Tools from openwebui.com (workspace/Tools.svelte:639); searched 'connector' in backend/open_webui: no shipped catalogue of ready-made connectors Note: ready-made connectors are community Tools, not core", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: about 30 built-in tool modules for Nextcloud apps and a few web services (context_agent:ex_app/lib/all_tools/: calendar, deck, mail, talk, tables, forms, bookmarks, cookbook, openproject, weather, osm, here, youtube) plus any admin-added MCP server (mcp.py). Not hundreds of ready-made connectors." }, "pendingReason": "Hermiq documents the seam but ships no connector catalogue itself; whether integriq's own catalogue is reachable and how many connectors it exposes needs checking in the integriq repo, not done here." }, @@ -7574,7 +8033,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31881 \"Context Chat (RAG over Nextcloud data): RAG over Files, Collectives and Analytics\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: ask_context_chat searches all the user's documents or a chosen scope (context_agent:ex_app/lib/all_tools/context_chat.py:28-59); the agent can also read files directly (files.py:27-46). Note: Context Chat app and backend not read.", "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", "dify": "source read at 1.17.1, not driven: knowledge bases from uploaded files (api/controllers/console/datasets/datasets_document.py:384) and datasource plugins; official datasources are S3, Azure, Box, Dropbox, Google Drive, OneDrive, SharePoint, Confluence, Notion, GitHub, GitLab and others, no Nextcloud (langgenius/dify-official-plugins datasources/); only the official nextcloud tool plugin can download_file at run time (tools/nextcloud/tools/download_file.yaml) Note: old yes rested on generic RAG; Nextcloud Files is not a knowledge source, only a plugin tool fetch", "open-webui": "source read at v0.11.4, not driven: RAG over uploaded files and knowledge bases: backend/open_webui/routers/retrieval.py (hybrid BM25 + vector, reranking), tools/builtin.py:3151 query_knowledge_files, :2509 query_chat_files; sources are uploads, Google Drive and OneDrive pickers (chat/MessageInput/InputMenu.svelte:399, :692); searched 'nextcloud|webdav' in backend/open_webui: no Nextcloud Files source Note: old yes; grounding works but not on Nextcloud Files", @@ -7600,7 +8059,7 @@ "providerHow": "read-from-code", "feature": "vector-rag", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "partial", @@ -7610,7 +8069,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/knowledge_fs.py:307 _get_accessible_kb_ids checks owner or AccessGrants per asking user even for a model's attached knowledge (:343 _has_access); routers/knowledge.py:172 lists only readable bases Note: in legacy function-calling mode model knowledge is injected without that check (utils/middleware.py:2607)", "hermes-agent": "source read at v2026.9.24, not driven: searched 'acl|permission.{0,20}(user|requester)|allowed to see' in tools/file_tools*.py, tools/session_search_tool.py and agent/: file access follows the host account and tools/file_tools_write_guards.py protects Hermes' own files, not per-requester visibility; tools/session_search_tool.py:1-9 searches the whole profile's sessions Note: All users of one profile share what the agent can read; nothing filters by the asking person.", "dify": "source read at 1.17.1, not driven: api/models/dataset.py:163,184-187 dataset permission (only_me, all_team, partial_members) governs which builders may attach a knowledge base, not what the end user may see; retrieval does not check the asking person. A builder can hand-build a manual metadata filter bound to a variable (api/core/workflow/nodes/knowledge_retrieval/entities.py:46-48, knowledge_retrieval_node.py:312-327 convert_template) Note: no document ACL trimming; only a hand-built metadata filter per flow", - "n8n": "source read at n8n@2.40.7, not driven: searched 'permission|acl|access' in packages/cli/src/modules/agents/agent-knowledge-retrieval.ts, tools/knowledge/ and packages/@n8n/nodes-langchain/nodes/vector_store/shared: retrieval returns whatever the agent's store holds, with only static metadata filters (packages/@n8n/agents/src/sdk/vector-store-filter.ts:5-19); nothing trims results to what the asking person may see" + "n8n": "source read at n8n@2.40.7, not driven: searched 'permission|acl|access' in packages/cli/src/modules/agents/agent-knowledge-retrieval.ts, tools/knowledge/ and packages/@n8n/nodes-langchain/nodes/vector_store/shared: retrieval returns whatever the agent's store holds, with only static metadata filters (packages/@n8n/agents/src/sdk/vector-store-filter.ts:5-19); nothing trims results to what the asking person may see", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every agent run and MCP call executes as the requesting user (context_agent:ex_app/lib/main.py:190-191, mcp_server.py:31-41), so file, share and search results are limited to what that user may see; memories and skills live in the user's own folder (context_agent:ex_app/lib/all_tools/memory.py:26)." }, "pendingReason": "Needs checking OpenRegister's ObjectService/ACL enforcement for the session identity the chat request actually runs under; out of scope for a hermiq-only read." }, @@ -7630,7 +8090,7 @@ "providerHow": "read-from-code", "feature": "context-documents", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -7640,7 +8100,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_builder.py:1656-1661 loads .hermes.md, AGENTS.md chain, CLAUDE.md and .cursorrules as instructions; hermes_cli/commands.py:234 /init generates AGENTS.md from a repo scan; SOUL.md per profile (web/src/pages/ProfilesPage.tsx:556); skills as SKILL.md documents Note: Old partial; document instructions are core.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:106 agent Files 'for reference material too long to paste into the Prompt: specs, templates, guidelines', :274 persistent in every run; workspace Skills are versioned Markdown SKILL.md packages with files (api/models/skill.py:56-66; web/i18n/en-US/skill.json referenceFiles.livePlaceholder) attached per agent (api/controllers/console/workspace/skills.py:811)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/terminals.py:189 get_terminal_agents_md loads AGENTS.md from the attached Open Terminal and :239 add_terminal_agents_md injects it; notes can be attached as documents (chat/MessageInput/InputMenu.svelte:322 Attach Notes); folder system prompt and files (utils/middleware.py:2591)", - "n8n": "source read at n8n@2.40.7, not driven: Agents-module skills carry markdown reference files next to their instructions (en.json:8077-8084 'References', 'Markdown reference'; packages/frontend/editor-ui/src/features/agents/components/AgentSkillFileNav.vue) and agents search uploaded Markdown or PDF knowledge files (en.json:7925) Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: Agents-module skills carry markdown reference files next to their instructions (en.json:8077-8084 'References', 'Markdown reference'; packages/frontend/editor-ui/src/features/agents/components/AgentSkillFileNav.vue) and agents search uploaded Markdown or PDF knowledge files (en.json:7925) Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skills are markdown instruction documents (SKILL.md) the agent loads when relevant (context_agent:ex_app/lib/agent.py:165-177, context_agent:ex_app/lib/all_tools/skills.py:84-113); admins also set chat user instructions (assistant:src/components/AdminSettings.vue:123-141)." }, "pendingReason": "hermiq-context-documents change (assembler + editor) is open, not implemented -- the schema field exists but nothing reads or writes it yet." }, @@ -7660,7 +8121,7 @@ "providerHow": "read-from-code", "feature": "skills-marketplace", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -7671,7 +8132,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_sync_client_org.py:1-7 org-shared skills under ~/.hermes/skills/_org// with pull and propose; tools/skills_sync_client.py:6-8 the sync is INERT unless the user is a Nous portal admin (pre-launch gate); hermes_cli/subcommands/profile.py:20-23 --clone copies skills to another profile Note: Org skill sharing exists in code but is switched off for ordinary users; profiles on one install share by cloning.", "dify": "source read at 1.17.1, not driven: api/models/skill.py:62,66 skills are unique per tenant_id (workspace); api/controllers/console/workspace/skills.py:494 export and :385 import (web/i18n/en-US/skill.json:224 '.zip with SKILL.md, agentskills.io format') copy a skill into another workspace; searched 'share' in skill.json and skills.py: no live cross-workspace sharing Note: copy by export/import only, updates do not follow", "open-webui": "source read at v0.11.4, not driven: skills are shared by access grants to users, groups or everyone on one instance (backend/open_webui/routers/skills.py:357 access update); searched 'tenant|organization' in backend/open_webui/models: no organisations to share across", - "n8n": "source read at n8n@2.40.7, not driven: skills are stored inside one agent (packages/cli/src/modules/agents/entities/agent.entity.ts:35-36 skills column); searched 'share' in packages/cli/src/modules/agents/agents-skills.controller.ts and agent-skills.service.ts: no sharing of a skill with other projects or organisations; the shared Skills area is 'Coming soon' (en.json:3231-3232)" + "n8n": "source read at n8n@2.40.7, not driven: skills are stored inside one agent (packages/cli/src/modules/agents/entities/agent.entity.ts:35-36 skills column); searched 'share' in packages/cli/src/modules/agents/agents-skills.controller.ts and agent-skills.service.ts: no sharing of a skill with other projects or organisations; the shared Skills area is 'Coming soon' (en.json:3231-3232)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: an admin can point a global skills folder that all users of the instance get (assistant:lib/Service/AgentSkillsService.php:331-361, src/components/AdminSettings.vue:183-214); no organisations to share between." } }, { @@ -7691,7 +8153,7 @@ "providerHow": "read-from-code", "feature": "agent-tool-governance", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -7701,7 +8163,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions, /v1/responses, /v1/models plus /v1/runs, /api/sessions and /api/jobs with API_SERVER_KEY; gateway/platforms/api_server_runs.py run lifecycle; per-profile paths /p//", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:324 POST /v1/chat-messages and :175 completion-messages with per-app API keys (api/controllers/console/apikey.py:236); web/i18n/en-US/agent-v-2.json agentDetail.access.serviceApi 'Backend Service API' with API Reference per agent; client SDKs in sdks/nodejs-client, sdks/php-client", "n8n": "source read at n8n@2.40.7, not driven: a workflow agent is called from any program through its Webhook or Chat Trigger URL (packages/nodes-base/nodes/Webhook, packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger), or through the documented instance MCP endpoint's execute_workflow tool (packages/cli/src/modules/mcp/mcp.controller.ts:117, mcp-scopes.ts:44); the public REST API (packages/cli/src/public-api/v1/handlers/workflows/spec/paths/) manages workflows and reads executions", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1109 POST /api/v1/chat/completions and :898 /api/v1/models (OpenAI-compatible), :2003 /api/v1/messages (Anthropic-compatible) with user API keys (routers/auths.py:1529); OpenAPI docs at main.py:508 /docs (served when ENV is dev)" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1109 POST /api/v1/chat/completions and :898 /api/v1/models (OpenAI-compatible), :2003 /api/v1/messages (Anthropic-compatible) with user API keys (routers/auths.py:1529); OpenAPI docs at main.py:508 /docs (served when ENV is dev)", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: documented OCS API in assistant:openapi.json for chat sessions, messages, /chat/generate and /assignments (assistant:appinfo/routes.php:40-60, lib/Controller/AssignmentsApiController.php:59-208); the agent itself is reachable as TaskProcessing task type core:contextagent:interaction (context_agent:ex_app/lib/provider.py:20-26)." }, "pendingReason": "whether third-party integrators are actually told about this API anywhere outside the code cannot be settled by reading the repo alone" }, @@ -7722,7 +8185,7 @@ "providerHow": "read-from-code", "feature": "algoritmeregister-publication", "featureConfidence": "high", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -7733,7 +8196,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'algoritme|algorithm register' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none", "dify": "source read at 1.17.1, not driven: searched 'algoritme|algorithm.?regist|register|ai act' in api/, web/app and web/i18n/en-US: no hits for an algorithm register or any export to one; apps and agents carry no register fields (api/models/agent.py, api/models/model.py)", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'algoritmeregister|algorithm register|register' in backend/open_webui/routers and src/lib/components/admin: no publication to the Dutch Algoritmeregister", - "n8n": "source read at n8n@2.40.7, not driven: searched 'algoritme|algorithm register|algoritmeregister' in packages/cli/src, packages/nodes-base/nodes and packages/frontend/editor-ui/src: no connection to the Dutch Algoritmeregister" + "n8n": "source read at n8n@2.40.7, not driven: searched 'algoritme|algorithm register|algoritmeregister' in packages/cli/src, packages/nodes-base/nodes and packages/frontend/editor-ui/src: no connection to the Dutch Algoritmeregister", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'algoritme|register' in both repos: none." } }, { @@ -7753,7 +8217,7 @@ "providerHow": "read-from-code", "feature": "algoritmeregister-publication", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "unknown", "dify": "no", @@ -7764,7 +8228,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.?act|risk.?class|iso.?42001|dpia|data protection officer|algoritme' in agent/ tools/ hermes_cli/ gateway/ cron/ plugins/ web/src: none; hermes_cli/profiles.py:538-575 ProfileInfo has no link or document field for an assessment", "dify": "source read at 1.17.1, not driven: searched 'dpia|impact assessment|fundamental rights|privacy assessment' in api/, web/app and web/i18n/en-US: no hits; agents have name, description, role and icon only (api/controllers/console/agent/roster.py:706), no field or link for an assessment", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpia|impact assessment|fundamental rights' in backend/open_webui and src/lib/components: models have no field or link for an assessment (backend/open_webui/models/models.py:74 ModelMeta)", - "n8n": "source read at n8n@2.40.7, not driven: searched 'DPIA|IAMA|fundamental rights|impact assessment' in packages/cli/src, packages/@n8n/api-types/src/agents and packages/frontend/editor-ui/src: no link from an agent or workflow to an assessment record" + "n8n": "source read at n8n@2.40.7, not driven: searched 'DPIA|IAMA|fundamental rights|impact assessment' in packages/cli/src, packages/@n8n/api-types/src/agents and packages/frontend/editor-ui/src: no link from an agent or workflow to an assessment record", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dpia|assessment' in both repos: none." } }, { @@ -7784,7 +8249,7 @@ "providerHow": "read-from-code", "feature": "sub-agent-delegation", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "yes", @@ -7794,7 +8259,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/delegate_tool.py:1-11 batch (parallel) mode spawns several child agents at once; hermes_cli/config_defaults.py:1332-1338 delegation block; hermes_cli/kanban_swarm.py:1-8 parallel specialist workers with a verifier; optional-skills/autonomous-ai-agents/dynamic-workflow fan-outs", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:152,217 'Add Parallel Node' parallel branches on the canvas; :684-702 Iteration node Parallel Mode with maximum parallelism over list items; api/configs/feature/__init__.py:949 MAX_SUBMIT_COUNT thread pool for parallel node execution; Agent nodes (blocks.agent-v2, api/core/workflow/nodes/agent_v2) can sit on each branch or inside the iteration Note: fan-out is designed in the flow; an agent cannot spawn parallel sub-agents itself at run time (see fl-subagent)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task 'Delegate focused work to a parallel sub-agent', foreground bounded by a semaphore (utils/subagents.py:370 max_concurrent, default 20) and background runs (:364 max_async); admin limits in src/lib/components/admin/Settings/Subagents.svelte", - "n8n": "source read at n8n@2.40.7, not driven: Agents-module sub-agents run in parallel up to a set number (en.json:8010-8011 'Max parallel sub-agents', packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:151-159 maxChildren) with tool calls in parallel (:517 toolCallConcurrency, en.json:7906); background sub-agents that outlive the turn need N8N_AGENTS_BACKGROUND_TASKS_ENABLED (packages/@n8n/config/src/configs/agents.config.ts:79-80, default false) Note: Agents module is opt-in; in workflows an AI Agent can call several AI Agent Tool nodes, and branches run in sequence." + "n8n": "source read at n8n@2.40.7, not driven: Agents-module sub-agents run in parallel up to a set number (en.json:8010-8011 'Max parallel sub-agents', packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:151-159 maxChildren) with tool calls in parallel (:517 toolCallConcurrency, en.json:7906); background sub-agents that outlive the turn need N8N_AGENTS_BACKGROUND_TASKS_ENABLED (packages/@n8n/config/src/configs/agents.config.ts:79-80, default false) Note: Agents module is opt-in; in workflows an AI Agent can call several AI Agent Tool nodes, and branches run in sequence.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the graph routes on the first tool call only ('This assumes single tool calls', context_agent:ex_app/lib/graph.py:62-66); searched 'parallel|subagent' in context_agent:ex_app: no sub-agents." }, "pendingReason": "whether delegated sub-agent calls actually run concurrently needs a live run to confirm timing" }, @@ -7822,7 +8288,7 @@ "n8n": "partial", "open-webui": "yes", "evidence": { - "nextcloud-assistant": "docs-only: competitor_features#31888 \"Per-user AI settings & admin controls: Admin toggles and per-user AI configuration\"", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: two levels only: admin settings (assistant:lib/Settings/Admin.php, ConfigController::setAdminConfig without NoAdminRequired, lib/Controller/ConfigController.php:67) and user features (NoAdminRequired routes). No builder role.", "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", "dify": "source read at 1.17.1, not driven: api/models/account.py:21-26 workspace roles owner, admin, editor, normal, dataset_operator; web/i18n/en-US/common.json:224 admin 'Can build apps & manage team settings', :234 editor 'Can build & edit apps', :267 normal 'Only can use apps'; api/controllers/console/workspace/members.py:368 change a member's role Note: enterprise-licensed RBAC (api/configs/enterprise/__init__.py:38 RBAC_ENABLED) adds custom roles and per-agent permission sets (web/i18n/en-US/permission-keys.json); the basic roles are in community", "n8n": "source read at n8n@2.40.7, not driven: instance roles owner, admin, member and project roles admin, editor, viewer (packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts); the admin role needs feat:advancedPermissions (packages/cli/src/services/user.service.ts:544), project roles feat:projectRole:* and custom roles feat:customRoles (packages/@n8n/constants/src/index.ts:34-37,51) Note: Role model exists; admin, builder-style project roles and custom roles are enterprise-licensed. Matches old partial.", @@ -7848,7 +8314,7 @@ "providerHow": "read-from-code", "feature": "nl-locale-completeness", "featureConfidence": "medium", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "yes", "hermes-agent": "partial", "copilot-studio": "unknown", "dify": "partial", @@ -7859,7 +8325,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: web/src/i18n/ ships af, ar, de, en, es, fr, ga, hu, it, ja, ko, pt, ru, tr, uk, zh, zh-hant; locales/*.yaml the same set for CLI and gateway strings; apps/desktop/src/i18n adds no nl either; searched for nl locale files repo-wide: none Note: The model answers in Dutch when addressed in Dutch, but dashboard, CLI and desktop text have no Dutch translation.", "dify": "source read at 1.17.1, not driven: web/i18n-config/languages.ts:158-162 nl-NL 'Nederlands' marked supported; web/i18n/nl-NL has all 37 namespaces, but about 3,800 of 5,947 values are identical to en-US (e.g. workflow.json 921 of 1161, dataset-documents.json 258 of 260 untranslated), while agent-v-2, permission and skill are translated Note: Dutch is selectable, roughly two thirds of the UI still shows English", "open-webui": "source read at v0.11.4, not driven: src/lib/i18n/locales/nl-NL/translation.json: 3432 of 3518 keys translated; language picker in src/lib/components/chat/Settings/General.svelte (settings.personal.general.language); 60+ locales in src/lib/i18n/locales", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/@n8n/i18n/src/locales/ holds only en.json; packages/@n8n/config/src/index.ts:253-254 N8N_DEFAULT_LOCALE defaults to 'en' with no Dutch locale shipped Note: Agents answer in Dutch if prompted in Dutch; the product UI is English only." + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/@n8n/i18n/src/locales/ holds only en.json; packages/@n8n/config/src/index.ts:253-254 N8N_DEFAULT_LOCALE defaults to 'en' with no Dutch locale shipped Note: Agents answer in Dutch if prompted in Dutch; the product UI is English only.", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: assistant:l10n/nl.json (209 translated strings) and context_agent:l10n/nl.json; tools answer in the user's language (context_agent:ex_app/lib/agent.py:136-138)." } } ] From 4899c96b2822fd2ebfb56d2044d12299ed6d8e2e Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 17:00:43 +0200 Subject: [PATCH 09/12] chore(parity): fold the copilot studio documentation reading, its sources object and ten rows mined from What's new --- openspec/parity/capabilities.json | 1562 +++++++++++++++++++---------- 1 file changed, 1045 insertions(+), 517 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index f19bcde89..30e08a310 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -148,11 +148,111 @@ "key": "copilot-studio", "name": "Microsoft Copilot Studio", "vendor": "Microsoft", - "readOn": "2026-07-12", + "readOn": "2026-09-26", "columnAddedOn": "2026-09-26", "evidenceGrade": "docs-only", - "readHow": "10 one-line feature rows (competitor id 1450, captured 2026-07-12) in the intelligence database, the thinnest column; no research file exists; nobody has driven it", - "unknownReason": "not among the 10 one-line Copilot Studio feature rows captured 2026-07-12, the only research there is; nobody has driven it for this row" + "readHow": "public documentation read on 2026-09-26, closed source, no trial account (Ruben's rule), not driven: the Microsoft Copilot Studio docs tree, What's new, licensing and requirements pages, the Power Platform admin and governance docs, the connector reference and release plans. learn.microsoft.com answered HTTP 429 during the reading, so the docs tree was saved locally once and read from that copy, and Power Platform pages were read from the MicrosoftDocs GitHub sources and are cited by their learn.microsoft.com URL. Preview features are partial with 'preview' named; features that need a second Microsoft product or licence (Managed Environments, Microsoft 365 Copilot, Purview) are partial with the licence named; Teams, SharePoint and OneDrive count as Copilot Studio's own surface under the Nextcloud-phrased row rule", + "unknownReason": "public documentation read on 2026-09-26: the docs did not settle this row", + "sources": { + "docs": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/", + "sourceRepo": null, + "featurePage": "https://www.microsoft.com/en-us/microsoft-copilot/microsoft-copilot-studio", + "featureRequests": "https://ideas.powervirtualagents.com/d365community/forum/21a4f1f9-f7fc-ec11-82e6-000d3a8b109b", + "issueTracker": null, + "roadmap": { + "url": "https://learn.microsoft.com/en-us/power-platform/release-plan/2026wave1/microsoft-copilot-studio/planned-features", + "note": "301 to the Microsoft 365 roadmap filtered on Microsoft Copilot Studio (aka.ms/MCStoM365Roadmap)" + }, + "changelog": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "apiReference": [ + "https://learn.microsoft.com/en-us/rest/api/power-platform/", + "https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-connect-bot-to-custom-application", + "https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-rest-api" + ], + "marketplace": "https://learn.microsoft.com/en-us/connectors/connector-reference/", + "pricing": "https://www.microsoft.com/en-us/microsoft-365-copilot/pricing/copilot-studio", + "accessibilityStatement": { + "url": "https://www.microsoft.com/en-us/accessibility/conformance-reports", + "note": "Microsoft ACR portal; no Copilot Studio report visible in the fetched page; a Microsoft employee on community.powerplatform.com (threadid d7143f08-456e-4b32-80fb-88b89db3eb8c) says to search \"power virtual agent\"" + }, + "securityDocs": [ + "https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-and-governance", + "https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-faq", + "https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-certification", + "https://servicetrust.microsoft.com/", + "https://learn.microsoft.com/en-us/purview/ai-copilot-studio" + ], + "demoInstance": null, + "community": "https://community.powerplatform.com/forums/thread/?groupid=db8f53c2-767d-47d6-a1ae-fe4c828a6553", + "reviews": null, + "videos": "https://www.youtube.com/@MicrosoftCopilotStudio", + "caseStudies": null, + "partnerDirectory": null, + "trainingCurriculum": "https://learn.microsoft.com/en-us/training/browse/?products=copilot-studio", + "jobPostings": null, + "tenders": { + "count": 7, + "note": "intelligence database, word-boundary match on copilot studio in tender name or description; all licence purchases, none carries requirements", + "items": [ + { + "source": "portugal-base", + "id": "8308/2025", + "date": "2025-03-31", + "buyer": "Autoridade para as Condicoes do Trabalho", + "url": "https://files.diariodarepublica.pt/cp_hora/2025/03/063/418881177.pdf" + }, + { + "source": "poland-bzp", + "id": "2025/BZP 00356462", + "date": "2025-08-01", + "buyer": "Uniwersytet Jagiellonski", + "url": "https://ezamowienia.gov.pl/mp-client/search/list/ocds-148610-e725318e-5dd6-423d-a94f-1e9927b53a39" + }, + { + "source": "poland-bzp", + "id": "2025/BZP 00497180", + "date": "2025-10-27", + "buyer": "Centralny Osrodek Informatyki", + "url": "https://ezamowienia.gov.pl/mp-client/search/list/ocds-148610-80aab6db-492d-4385-a6a3-583210a4b28b" + }, + { + "source": "poland-bzp", + "id": "2025/BZP 00578597", + "date": "2025-12-05", + "buyer": "Uniwersytet Jagiellonski", + "url": "https://ezamowienia.gov.pl/mp-client/search/list/ocds-148610-e725318e-5dd6-423d-a94f-1e9927b53a39" + }, + { + "source": "poland-bzp", + "id": "2026/BZP 00082680", + "date": "2026-01-30", + "buyer": "Centralny Osrodek Informatyki", + "url": "https://ezamowienia.gov.pl/mp-client/search/list/ocds-148610-80aab6db-492d-4385-a6a3-583210a4b28b" + }, + { + "source": "spain-placsp", + "id": "ES-PLACSP-19645938", + "date": "2026-06-29", + "url": "https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=IJjxzWJWD01xseVhcqrkhw%3D%3D" + }, + { + "source": "spain-placsp", + "id": "ES-PLACSP-20060626", + "date": "2026-07-15", + "url": "https://contrataciondelestado.es/wps/poc?uri=deeplink:detalle_licitacion&idEvl=M3GL08endnA36J9Lctlsuw%3D%3D" + } + ] + }, + "nullReasons": { + "sourceRepo": "closed source SaaS; only github.com/microsoft/CopilotStudioSamples (samples, resolved 200) and the docs sources (MicrosoftDocs/businessapps-copilot-docs-pr is private) exist.", + "issueTracker": "no public product issue tracker; support goes through Microsoft support tickets (fundamentals-support page); the ideas portal is under featureRequests.", + "demoInstance": "only sign-in trials (go.microsoft.com/fwlink/p/?linkid=2252408 from the feature page); Ruben's rule forbids trial accounts, and no public demo agent is published.", + "reviews": "g2.com/products/microsoft-copilot-studio/reviews returns 403 to curl and WebFetch; not verified.", + "caseStudies": "feature page links microsoft.com/en-us/customers/search; fetched with a Copilot Studio filter it rendered 0 results (client-side), so no verified story URL.", + "partnerDirectory": "appsource.microsoft.com/en-us/marketplace/partner-dir returned 403; not verified.", + "jobPostings": "jobs.careers.microsoft.com search for \"copilot studio\" redirects to the generic apply.careers.microsoft.com page, query dropped; no stable listing URL." + } + } }, { "key": "dify", @@ -468,7 +568,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:18 `hermes profile create --description`; web/src/pages/ProfilesPage.tsx:442 New Profile form -> POST /api/profiles (hermes_cli/web_routers/profiles.py:704); ProfilesPage.tsx:556 edit SOUL.md (personality / system prompt) -> PUT /api/profiles/{name}/soul (profiles.py:906); web/src/pages/ProfileBuilderPage.tsx:32 builder wizard (identity, model, skills, MCPs) Note: An agent in Hermes is a profile: a name, a description and SOUL.md instructions. Old partial undersold it.", - "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/build-new-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-first-bot agent designer: name field plus Instructions section (role, tone, rules); publish requires name, description and instructions. Standard harness create flow GA.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:706 POST /agent creates an agent with name, description, role and icon; web/features/agent-v2/roster/components/create-agent-dialog.tsx:61 and agent-form-fields.tsx:73 the create form; web/features/agent-v2/agent-detail/configure/components/orchestrate/prompt-editor/index.tsx:1088 the Prompt (instructions) editor", "open-webui": "source read at v0.11.4, not driven: an agent is a workspace Model: src/lib/components/workspace/Models/ModelEditor.svelte:789 name, :962 description, :1055 system prompt, :856 base model; backend/open_webui/routers/models.py:285 POST /models/create; backend/open_webui/models/models.py:111 model table (id, user_id, base_model_id, params, meta)", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:45,51,69 personal agent has name, description, systemPrompt; chat-hub.controller.ts:451 POST /chat/agents; packages/frontend/@n8n/i18n/src/locales/en.json:492 'Instructions' field in the Chat agent editor; the opt-in Agents module adds packages/cli/src/modules/agents/agents.controller.ts:29 POST with en.json:7867,7878 Name and Instructions Note: Chat hub is a default module, so creating a named agent with instructions works out of the box.", @@ -494,7 +594,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "yes", @@ -503,7 +603,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ProfilesPage.tsx:1184-1217 profile list shows gateway running/stopped, model and skill count; hermes_cli/subcommands/profile.py:14 `hermes profile list`; hermes_cli/profiles.py:538 ProfileInfo has no owner field (name, model, provider, gateway_running, description, role only) Note: No owner column and no organisation: one operator's install lists its own profiles.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:808 owner name per row, :899 Enabled/Disabled switch; backend/open_webui/routers/models.py:162 GET /models/list (admins see all with BYPASS_ADMIN_ACCESS_CONTROL, :198), :245 GET /models/all admin; admin Settings > Models lists every model (src/lib/components/admin/Settings/Models.svelte)", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agents-list.controller.ts:17 GET /agents/v2 across projects; agents.service.ts:358-364 scoped to projects the user is a member of, so an admin does not see every agent; packages/frontend/editor-ui/src/features/agents/components/AgentCard.vue:203-220 card shows name, updated, created and a Published badge, no owner Note: No organisation-wide list and no owner column. Agents module is shipped but off by default: packages/@n8n/backend-common/src/modules/module-registry.ts:44 defaultModules omits 'agents' (enable with N8N_ENABLED_MODULES=agents).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'agent' entities and list views in assistant:src and lib/Controller: no agent list; one built-in agent. Session list only (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:25-45)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'agent' entities and list views in assistant:src and lib/Controller: no agent list; one built-in agent. Session list only (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:25-45).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-agent-inventory https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/build-new-agent Agents page lists a maker's agents; admin agent inventory in Power Platform admin center gives a tenant-wide list of draft and published agents with createdBy, ownerId and publish/channel metadata." } }, { @@ -524,7 +625,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "partial", @@ -533,7 +634,8 @@ "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/navigation.tsx:62-86 detail page with Configure (model, prompt, tools, skills, knowledge, files), Access Point, Logs, Monitoring; api/controllers/console/agent/roster.py:1133 logs. No schedules: agents have no scheduler of their own, schedules only exist as trigger nodes on workflow apps Note: schedules are missing from the agent page", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194-1275 config, knowledge, tools, skills, filters, capabilities on one page; schedules live apart in /automations (src/routes/(app)/automations/[id]/+page.svelte) keyed by model_id (backend/open_webui/models/automations.py:73) and per-model chats in admin analytics (routers/analytics.py:285, :343) Note: no single page joins an agent's config with its schedules and runs", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/module.descriptor.ts:60-91 agent page with builder, preview, sessions and session-detail children; en.json:8172-8178 tabs Build, Knowledge, Sessions, Settings, Memory, Evals; en.json:8112 Schedules and 8044 Skills sections in the builder Note: Configuration, schedules and skills sit on the Build tab, runs on the Sessions tab of the same agent page. Agents module is shipped but off by default: packages/@n8n/backend-common/src/modules/module-registry.ts:44 defaultModules omits 'agents' (enable with N8N_ENABLED_MODULES=agents).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent entity or page. Nearest: a scheduled task's session shows its prompt and recurrence (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:59-66); tool categories are an admin checkbox list (context_agent:ex_app/lib/main.py:88-94). No page combining configuration, schedules, runs and skills." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent entity or page. Nearest: a scheduled task's session shows its prompt and recurrence (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:59-66); tool categories are an admin checkbox list (context_agent:ex_app/lib/main.py:88-94). No page combining configuration, schedules, runs and skills.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-agent-status agent designer Build tab shows instructions, knowledge, tools, skills and model on one surface; Overview page carries status and triggers. Runs live in the Activity/analytics tabs and schedules in trigger flows, not on one page. Note: Agent status summary is preview." } }, { @@ -554,7 +656,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -563,7 +665,8 @@ "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 Model field with ModelParameterModal picking provider and model per agent; classic agent apps pick the model in app config (api/controllers/console/app/model_config.py)", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:46 AI Agent node requires a chat model sub-node (26 provider nodes under nodes/llms/); packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:107 model per chat agent; packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:446 provider/model string per agent; en.json:7870 Model field Note: Old partial rested on a credential-test release line; the code picks a model per agent everywhere.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:856 'Base Model (From ...)' selector; backend/open_webui/models/models.py:118 base_model_id = upstream model; providers are the Ollama/OpenAI-compatible/Anthropic connections (routers/ollama.py, routers/openai.py, utils/anthropic.py)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent's model is whatever provider serves the task type core:text2text:chatwithtools (context_agent:ex_app/lib/nc_model.py:27,170-179), chosen instance-wide in the server's AI admin settings (nextcloud/server, not read); provider apps linked from assistant:src/components/AdminSettings.vue:55-120. No per-agent choice." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent's model is whatever provider serves the task type core:text2text:chatwithtools (context_agent:ex_app/lib/nc_model.py:27,170-179), chosen instance-wide in the server's AI admin settings (nextcloud/server, not read); provider apps linked from assistant:src/components/AdminSettings.vue:55-120. No per-agent choice.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-select-agent-model https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-agent-model select and change the primary AI model from the Build tab Model list; OpenAI and Anthropic (Claude) models GA, others experimental. Provider choice is limited to Microsoft-hosted catalogue." } }, { @@ -585,7 +688,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "yes", @@ -594,7 +697,8 @@ "n8n": "source read at n8n@2.40.7, not driven: agents and workflows belong to a project: packages/cli/src/modules/agents/entities/agent.entity.ts:13-18 projectId; project roles in packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts:10-17 agent scopes; team projects count against packages/@n8n/constants/src/index.ts:67 quota:maxTeamProjects; chat agents are owner-only, packages/cli/src/modules/chat-hub/chat-hub-agent.repository.ts:39 where ownerId Note: Only me (personal project) or a group (team project, enterprise-licensed quota); no 'whole organisation' option.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/common/AccessControl.svelte:19 principal_type user|group|anyone; ModelEditor.svelte:600 AccessControlModal; backend/open_webui/routers/models.py:1035 POST /model/access/update; models/access_grants.py grants read/write per user or group; config.py sharing.public_models permission gates 'whole organisation' Note: old partial rested on a feature-row line; the code has private, per-user, per-group and public grants", "hermes-agent": "source read at v2026.9.24, not driven: gateway/authz_mixin.py:32-37 per-platform _ALLOWED_USERS / ALLOW_ALL_USERS allowlists read per profile home (authz_mixin.py:339 _authorization_home_for_source); gateway/slash_access.py:1-27 admin vs user command lists Note: Who may talk to a profile's bot is a per-platform user-id allowlist; no only-me / group / organisation visibility model and no org directory.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'visibility|group|share' in assistant:lib and context_agent:ex_app: the single agent is available to every user with the app enabled; no per-agent visibility setting." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'visibility|group|share' in assistant:lib and context_agent:ex_app: the single agent is available to every user with the app enabled; no per-agent visibility setting.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-share-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-share-bots share an agent with individual users, security groups or the entire organisation; unshared agents are visible only to owner and editors." } }, { @@ -616,12 +720,12 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "partial", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { - "copilot-studio": "docs-only: competitor_features#31612 \"Message-metered pricing: $0.01/message or $200/mo pack; cost spikes with generative/autonomous use.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-messages-management https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/enforcement-policy-credits \"You can set monthly consumption limits for individual agents in the Power Platform admin center (Licensing > Copilot Studio > Manage Agents) to cap credit usage\"; environment capacity enforcement on overage. Note: Cap is in Copilot Credits, not runs or raw tokens.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:69 check_automation_limits: automations.max_count per user and automations.min_interval, admins bypass; model params max_tokens only caps one response; searched 'quota|budget|token limit|rate' in routers/models.py, models/models.py, utils/middleware.py: no per-agent run or token cap Note: limits are per user and only on scheduled runs, not per agent", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-63 agent.max_turns (turn cap) and agent.run_budget_seconds (wall-clock per run), per profile config.yaml; hermes_cli/config_defaults.py:1338 delegation.max_iterations per subagent; gateway/platforms/api_server.py:1322 api_server.max_concurrent_runs; searched 'max_cost|spend_limit|token_budget|cost_cap' in *.py: no token or run-count quota per agent Note: Caps iterations and wall clock per run, not tokens or number of runs.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 PUT /agent sets max_active_requests, enforced in api/services/app_generate_service.py:153,384 (concurrent requests per app); dify-agent/src/dify_agent/runtime/runner.py:94,403 a fixed 500-step and run-timeout limit per run. No per-agent run count or token budget Note: only a concurrency cap and a server-wide step limit, no token or run quota", @@ -648,7 +752,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -657,7 +761,8 @@ "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/access/components/web-app-access-card.tsx:254 and service-api-access-card.tsx:114 per-surface In service/Out of service toggles; api/controllers/console/agent/roster.py:1013 POST /agent//api-enable. No single off switch: workflows that bind the agent as a node keep running it (models/agent.py:407 WorkflowAgentNodeBinding) Note: off per access point, not per agent", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:122 is_active soft-disable; routers/models.py:881 POST /model/toggle; src/lib/components/workspace/Models.svelte:899 Enabled/Disabled switch per model, :353 Enable All / Disable All", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/workflows/workflows.controller.ts:475 POST /:workflowId/deactivate turns off an agent workflow's triggers without deleting it, en.json:4567 'Deactivate workflow'; packages/cli/src/modules/agents/agent-publish.controller.ts:45 unpublish, en.json:7775 unpublish stops production executions until republished", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent can be switched off only instance-wide: disabling the context_agent ExApp unregisters its providers (context_agent:ex_app/lib/main.py:132-135) and tool categories can be unticked (context_agent:ex_app/lib/main.py:88-94, tools.py:33); users can hide the Assistant (assistant:lib/Listener/BeforeTemplateRenderedListener.php:61-62). One agent, no per-agent off switch." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent can be switched off only instance-wide: disabling the context_agent ExApp unregisters its providers (context_agent:ex_app/lib/main.py:132-135) and tool categories can be unticked (context_agent:ex_app/lib/main.py:88-94, tools.py:33); users can hide the Assistant (assistant:lib/Listener/BeforeTemplateRenderedListener.php:61-62). One agent, no per-agent off switch.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-api-quarantine https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-manage-monitor admins quarantine an agent through the Power Platform API: it stays visible and testable but no channel can use it, and can be unquarantined. No maker-facing on/off toggle for a whole agent found (searched \"turn off|deactivat|unpublish|disable agent\"). Note: Admin and API only." } }, { @@ -679,7 +784,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "yes", @@ -688,7 +793,8 @@ "dify": "source read at 1.17.1, not driven: api/services/app_service.py:672 created_by is set to the creating account and api/services/app_service.py:282 filters on it ('Created by me'); no owner field that can be assigned, models/agent.py:212 only created_by/updated_by/archived_by Note: creator is recorded, not an accountable owner that can be named", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/models.py:117 user_id owner; src/lib/components/workspace/Models.svelte:802-808 owner name and email shown per model, 'Deleted User' when the owner is gone; routers/models.py:948 only owner, write grantee or admin may update Note: owner is always the creator; there is no field to name a different accountable person", "n8n": "source read at n8n@2.40.7, not driven: ownership sits with a project, not a person: packages/cli/src/services/user.service.ts:616 shared workflow role 'workflow:owner' held by a project; packages/cli/src/modules/agents/entities/agent.entity.ts:13-18 agent belongs to projectId; only chat agents carry a person, packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:74 ownerId Note: A personal project maps to one person; a team project has no named accountable human per agent.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent entity, so no owner field; assignments carry the user who created them (assistant:lib/Db/Assignment.php:40), searched 'owner' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent entity, so no owner field; assignments carry the user who created them (assistant:lib/Db/Assignment.php:40), searched 'owner' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-agent-inventory https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-api-reassign-ownership-orphaned-agent every agent carries an owner (inventory field properties.ownerId, Entra object id of the current owner) plus createdBy." } }, { @@ -709,7 +815,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "partial", @@ -718,7 +824,8 @@ "dify": "source read at 1.17.1, not driven: searched 'transfer|owner|created_by =' in api/controllers/console and api/services/app_service.py: only workspace ownership transfer exists (api/controllers/console/workspace/members.py:418 send-owner-transfer-confirm-email); no endpoint or UI reassigns an agent or app to another member", "open-webui": "source read at v0.11.4, not driven: searched 'transfer|reassign|owner' in backend/open_webui/routers and models: no ownership transfer; models/users.py:847 delete_user_by_id leaves models orphaned (Models.svelte:808 'Deleted User'); workaround: routers/models.py:1035 write grant to another user or group so they can keep maintaining it", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/services/user.service.ts:593-610 deleting a user can transfer their personal project's resources to another user or project (en.json:3856 'Transfer their workflows, credentials and data tables'); workflow move at packages/cli/src/workflows/workflows.controller.ts:646 PUT /:workflowId/transfer; but packages/cli/src/services/ownership-transfer/ownership-transfer.manifest.json:59-60 says agents are dropped via FK cascade on transfer Note: Workflow-based agents move to a new owner; Agents-module agents are lost when their owner is deleted (the code's own manifest says so).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: on user deletion the user's assignments and chats are deleted, not handed over (assistant:lib/Listener/UserDeletedListener.php:42-48); searched 'transfer|owner' in both repos: nothing." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: on user deletion the user's assignments and chats are deleted, not handed over (assistant:lib/Listener/UserDeletedListener.php:42-48); searched 'transfer|owner' in both repos: nothing.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-api-reassign-ownership-orphaned-agent admins reassign ownership of orphaned agents (owner left the organisation) through the Power Platform API reassign operation with NewOwnerAadUserId. Note: API only for admins; no maker UI hand-over documented." } }, { @@ -739,12 +846,12 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "yes", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "no", "evidence": { - "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-first-bot \"you describe your agent in natural language (preview) and the system generates the underlying configuration\"; agentic builder (preview); standard harness NL create not available in sovereign clouds. Note: NL builder in the new experience is preview; old yes did not note that.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:846 build-draft/checkout and :941 build-draft/apply; web/i18n/en-US/agent-v-2.json 'Build your agent by chatting ... it fills in the form on the left'; web/features/agent-v2/agent-detail/configure/page.tsx:49 Build mode is on in Community Edition (only Preview is cloud/enterprise)", "hermes-agent": "source read at v2026.9.24, not driven: skills/autonomous-ai-agents/hermes-agent/SKILL.md:26 bundled skill teaches the agent Hermes' own profiles so it can run `hermes profile create` through its terminal tool; hermes_cli/profile_describer.py:1-25 auto-generates a description from an existing profile (the reverse); searched 'create.*bot.*from.*descri' and profile-creating tool names in *.py: no dedicated plain-language agent builder Note: The agent can build a profile only by driving the CLI itself; the dashboard builder is a form wizard.", "open-webui": "source read at v0.11.4, not driven: searched 'generate|describe|builder|magic' in src/lib/components/workspace/Models/ModelEditor.svelte and backend/open_webui/routers/models.py: model presets are built by hand; the only natural-language builder is /skills:create for skills (backend/open_webui/utils/skills.py:81), not agents", @@ -771,7 +878,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "partial", "open-webui": "partial", @@ -780,7 +887,8 @@ "dify": "source read at 1.17.1, not driven: api/models/agent.py:407 WorkflowAgentNodeBinding ties a roster agent to a workflow app node; api/controllers/console/agent/composer.py:54 agent-composer on a workflow node, :125 copy-from-roster; roster.py:474 published references listed on the agent's Access page ('Workflow access')", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:836 stable Model ID that other programs pass as 'model' to the OpenAI-compatible /api/chat/completions (backend/open_webui/main.py:1118 model_id lookup); no binding of an agent to a consuming app and no per-app discovery Note: an app can call an agent by its id, but nothing ties the agent to that app", "n8n": "source read at n8n@2.40.7, not driven: an agent is addressable by id, not bound to a consuming app: packages/cli/src/modules/agents/entities/agent.entity.ts:39-40 availableInMCP flag, packages/cli/src/modules/agents/agent-mcp-access.controller.ts:26 toggle; workflow agents are called by webhook path (packages/nodes-base/nodes/Webhook) or Execute Workflow; searched 'appId|consumer app|slug' in packages/cli/src/modules/agents: no app binding Note: An app can call an agent by id, URL or MCP; there is no registry tying an agent to the app it serves.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'appId|slug' in context_agent:ex_app and assistant:lib/Service: apps call the one agent through the task type core:contextagent:interaction (context_agent:ex_app/lib/provider.py:20-26); no per-app agent binding." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'appId|slug' in context_agent:ex_app and assistant:lib/Service: apps call the one agent through the task type core:contextagent:interaction (context_agent:ex_app/lib/provider.py:20-26); no per-app agent binding.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-connect-bot-to-custom-application https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-integrate-web-or-native-app-m365-agents-sdk an app reaches a published agent by its bot/environment id through Direct Line, the Microsoft 365 Agents SDK or the Client SDK. No registry that binds an agent to a named app so the app can look it up." } }, { @@ -802,7 +910,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -811,7 +919,8 @@ "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/ has model-config, prompt-editor, tools, skills, knowledge and files sections on the one Configure page; web/i18n/en-US/agent-v-2.json agentDetail.configure.tools/skills/knowledgeRetrieval/files", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1194 Knowledge, :1198 ToolsSelector, :1202 SkillsSelector, :1206 filters/actions, :1245 Capabilities, :1262 BuiltinTools, :1268 TerminalSelector, all on the model edit page", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentCapabilitiesSection.vue:534-695 one Capabilities section with rows for tools, workflows, skills and sub-agents (en.json:8340 'Capabilities: What this agent can do'); knowledge files and vector stores on the Knowledge tab (en.json:7923,7956) Note: Data sources sit on the neighbouring Knowledge tab. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin settings list tool categories as checkboxes (context_agent:ex_app/lib/main.py:88-94, categories from tools.py get_categories); skills listed via GET /api/v1/skills (assistant:lib/Controller/AgentSkillsApiController.php:57-59). Instance-wide, no single per-agent screen of skills, tools and data." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin settings list tool categories as checkboxes (context_agent:ex_app/lib/main.py:88-94, categories from tools.py get_categories); skills listed via GET /api/v1/skills (assistant:lib/Controller/AgentSkillsApiController.php:57-59). Instance-wide, no single per-agent screen of skills, tools and data.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-agent-inventory Build tab lists the agent's instructions, knowledge, tools, skills and model; admin inventory exposes capabilities (knowledge, tools, channels, auth). Data access (connections, user vs maker credentials) sits per tool, not on one capability screen." } }, { @@ -834,7 +943,7 @@ "defectCandidate": "A schedule bound to a deleted agent stays enabled; ScheduleService's dispatch/findDueSchedules path has no agent-existence check, so the schedule keeps firing and presumably errors on every tick instead of stopping.", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "partial", @@ -843,7 +952,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:780 DELETE /agent/; api/services/app_service.py:1078 delete_app archives the backing agent and unbinds it; api/tasks/remove_app_and_related_data_task.py:90,632,681 deletes the app's triggers and WorkflowSchedulePlan rows so schedules stop; web/i18n/en-US/agent-v-2.json roster.deleteDialog 'web app, API access, and workflows that use it stop working'", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:1111 POST /model/delete removes the model only; automations store model_id (backend/open_webui/models/automations.py:73) and routers/models.py has no Automations call, so a schedule keeps firing and fails with 'Model not found' at main.py:1128 Note: schedules are not stopped with the agent", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agents.service.ts:386-432 delete removes the agent, disconnects its channels and calls AgentTaskService.requestReconcile to stop its schedules; entities/agent-task.entity.ts:33 tasks cascade on agent delete; en.json:8128 'This schedule will stop running'; for workflow agents, archiving/deleting a workflow deactivates its Schedule Trigger (packages/cli/src/workflows/workflows.controller.ts:475)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent entity to delete. Deleting a scheduled task via DELETE /assignments/{id} (assistant:lib/Controller/AssignmentsApiController.php:205-208) is rated under schedules." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent entity to delete. Deleting a scheduled task via DELETE /assignments/{id} (assistant:lib/Controller/AssignmentsApiController.php:205-208) is rated under schedules.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-first-bot Delete an agent: three dots next to Settings > Delete, confirm by name; \"all data associated with the agent is deleted permanently\" (triggers are part of the agent)." } }, { @@ -865,7 +975,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -874,7 +984,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:115 `profile export` to .tar.gz and :122 `profile import`; hermes_cli/web_routers/profiles.py:988 POST /api/profiles/{name}/export and :1006 POST /api/profiles/import; hermes_cli/commands.py:88-90 /export and /import slash commands Note: Moves between Hermes installs; there is no Nextcloud target.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:381 GET /models/export, :441 POST /models/import (ownership check :515); src/lib/components/workspace/Models.svelte:109 Import JSON, :115 Export JSON; permissions workspace.models_import/models_export in config.py DEFAULT_USER_PERMISSIONS Note: JSON file moves an agent to another Open WebUI instance", "n8n": "source read at n8n@2.40.7, not driven: en.json:7613-7619 agent builder 'Export JSON' and 'Import agent JSON' modal (packages/frontend/editor-ui/src/features/agents/components/AgentJsonImportModal.vue); workflows export/import as JSON in the editor (en.json:1933 'From file') and by CLI packages/cli/src/commands/export/workflow.ts and packages/cli/src/commands/import/workflow.ts Note: Moves to another n8n instance (no Nextcloud target). Workflow JSON is complete; the Agents-module export (packages/frontend/editor-ui/src/features/agents/views/AgentBuilderView.vue:1466-1475) writes the config, where skills are only {type, id} references (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:189-198).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'export|import' in assistant:lib and context_agent:ex_app: no agent export or import." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'export|import' in assistant:lib and context_agent:ex_app: no agent export or import.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-solutions-import-export https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-export-import-copilot-components agents move between Power Platform environments by exporting and importing a solution file (managed or unmanaged); component collections export too. Moves only into another Power Platform environment, not into a Nextcloud. Note: Nextcloud-phrased row: own surface, missing the Nextcloud part." } }, { @@ -895,7 +1006,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -904,7 +1015,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ChatPage.tsx:1-16 dashboard Chat page embeds the full `hermes --tui` over WebSocket /api/pty (hermes_cli/web_routers/chat_ws.py:432); hermes_cli/main.py CLI/TUI chat; gateway adapters under plugins/platforms/ carry the same conversation", "dify": "source read at 1.17.1, not driven: web/app/(shareLayout)/agent/[token]/page.tsx full-page ChatWithHistoryWrap for an agent; web/app/(shareLayout)/chat/[token] for chat apps; web/app/(commonLayout)/installed/[appId] in-console Explore chat; api/controllers/web/completion.py chat-messages", "n8n": "source read at n8n@2.40.7, not driven: Chat hub is a default module (packages/@n8n/backend-common/src/modules/module-registry.ts:60); packages/frontend/editor-ui/src/features/ai/chatHub/module.descriptor.ts:108-113 route /home/chat with a full-page 'chat' layout for models, personal agents and workflow agents; packages/cli/src/modules/chat-hub/chat-hub.controller.ts:168 POST /chat/conversations/send Note: Old partial rested on a release line about chat hub tools; the chat hub is a default full-page chat.", - "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/c/[id]/+page.svelte and src/lib/components/chat/Chat.svelte full-page chat with a selected model (ModelSelector.svelte); backend/open_webui/main.py:1118 chat completion entry" + "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/c/[id]/+page.svelte and src/lib/components/chat/Chat.svelte full-page chat with a selected model (ModelSelector.svelte); backend/open_webui/main.py:1118 chat completion entry", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-fundamentals-publish-channels https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents published agents are chatted with in Microsoft 365 Copilot Chat, Teams, the demo website and custom web chat; the Preview pane gives makers a full conversation." } }, { @@ -934,7 +1046,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/stream_consumer.py:1-5 on_delta() queues model deltas and progressively edits one platform message; hermes_cli/cli_stream_mixin.py streams tokens in the CLI; hermes_cli/web_routers/chat_ws.py:432 PTY stream to the dashboard chat", "dify": "source read at 1.17.1, not driven: api/controllers/web/completion.py:45-63 response_mode streaming (agent apps are streaming-only, :50); service API the same (api/controllers/service_api/app/completion.py); web chat renders SSE chunks (web/app/components/base/chat/chat-with-history/chat-wrapper.tsx)", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-stream.service.ts:160-191 sendChunk pushes content chunks to the user with reconnection replay; packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:129-131 'streaming' response mode, AI Agent node enableStreaming (nodes/agents/Agent/V3/AgentV3.node.ts:141-145); Agents module SSE in packages/cli/src/modules/agents/agent-sse-stream.ts", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent posts intermediate output to taskprocessing stream-result (context_agent:ex_app/lib/main.py:193-205, agent.py:256-283); the chat listens on notify_push channel taskprocessing:task_id_* and updates the streaming message (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:993-1003,1079-1096). Note: Added in assistant 4.0.0 (changelog 'Streaming responses'). Needs notify_push; without it the UI polls." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent posts intermediate output to taskprocessing stream-result (context_agent:ex_app/lib/main.py:193-205, agent.py:256-283); the chat listens on notify_push channel taskprocessing:task_id_* and updates the streaming message (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:993-1003,1079-1096). Note: Added in assistant 4.0.0 (changelog 'Streaming responses'). Needs notify_push; without it the UI polls.", + "copilot-studio": "not checked: docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-send-event-activities not checked: the docs describe a typing activity for channels but searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"stream|streamed|incremental|partial response\" and found no statement that end users see answers token by token." } }, { @@ -955,7 +1068,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -964,7 +1077,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:48 GET /conversations, :129 rename, :179 pin/unpin; web/app/components/base/chat/chat-with-history/sidebar lists past conversations to reopen", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:249 GET /chats/list, :774 POST /chats/new, :1325 GET /chats/{id}; sidebar chat list src/lib/components/layout/Sidebar.svelte reopens earlier chats at /c/[id]", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:95 GET /chat/conversations and :110 GET one conversation; en.json:694-697 sidebar 'New chat' and 'Load more' sessions (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatSidebar.vue); agent memory keyed by session in memory nodes (nodes/memory/MemoryBufferWindow)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: session list with new conversation, select and title edit (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:9-57); GET /chat/sessions (assistant:appinfo/routes.php:48, lib/Controller/ChattyLLMController.php:322)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: session list with new conversation, select and title edit (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:9-57); GET /chat/sessions (assistant:appinfo/routes.php:48, lib/Controller/ChattyLLMController.php:322).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-history https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents makers keep a history of test conversations in the Preview tab; end-user conversation lists belong to the host channel (Microsoft 365 Copilot Chat, Teams), which the Copilot Studio docs do not describe." } }, { @@ -985,7 +1099,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -994,7 +1108,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:116 DELETE /conversations/; api/services/conversation_service.py:232 soft-delete flag then api/tasks/delete_conversation_task.py:105 purges related data. Searched 'restore|trash|bin|undelete' in api/services/conversation_service.py and api/controllers/web: no restore from a bin Note: delete only, no bin or restore", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1568 DELETE /chats/{id} permanent, :1909 POST /{id}/archive toggles archive, :1061 GET /archived; src/lib/components/chat/Settings/ArchivedChats.svelte restores; searched 'trash|recycle|restore|bin' in en-US translation.json: no bin Note: archive is the only undo; a deleted chat cannot be restored", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:388-397 DELETE /chat/conversations/:sessionId returns 204; en.json:686-690 'Are you sure you want to delete this conversation?'; searched 'archiv|restore|deletedAt|trash' in packages/cli/src/modules/chat-hub: no conversation bin or restore (hits are archived helper workflows and memory restore) Note: Delete is permanent; no bin and no restore.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: delete conversation with confirmation dialog (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:36-42,202-217) is a hard delete of session and messages (assistant:lib/Service/ChatService.php:142-152). Searched 'trash|restore' in both repos: no bin or restore." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: delete conversation with confirmation dialog (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:36-42,202-217) is a hard delete of session and messages (assistant:lib/Service/ChatService.php:142-152). Searched 'trash|restore' in both repos: no bin or restore.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-transcript-controls https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-transcripts-powerapps searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"delete.{0,40}(conversation|transcript)|bin|restore\": only admin transcript settings and Dataverse bulk deletion of transcript records, no end-user delete, bin or restore of a conversation." } }, { @@ -1016,7 +1131,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -1025,7 +1140,8 @@ "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/agent-content.tsx:15-38 renders each agent_thought with its tool call; answer/tool-detail.tsx tool input/output; agent v2 'Ran commands' activity in web/features/agent-v2/agent-detail/configure/components/preview/chat-conversation.tsx and answer/agent-roster-response-content.tsx", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116 renders each tool call with src/lib/components/common/ToolCallDisplay.svelte:233-246 ('Executing {{NAME}}', 'View Result from {{NAME}}', 'Denied {{NAME}}'), expandable arguments and result", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentChatToolSteps.vue:33-51 renders each tool call in the agent chat (en.json:7671-7675 tool names); in workflows the chat Logs panel lists the AI Agent's tool sub-node runs with inputs, outputs and tokens (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue, ChatMessagesPanel.vue, LogsViewConsumedTokenCountText.vue)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: agent reports used tools as 'sources' (context_agent:ex_app/lib/agent.py:274-281); chat shows them live while streaming and in an 'Information sources & actions' popover with translated tool labels (assistant:src/components/ChattyLLM/Message.vue:54-72,85, lib/Controller/ChattyLLMController.php:120-170)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: agent reports used tools as 'sources' (context_agent:ex_app/lib/agent.py:274-281); chat shows them live while streaming and in an 'Information sources & actions' popover with translated tool labels (assistant:src/components/ChattyLLM/Message.vue:54-72,85, lib/Controller/ChattyLLMController.php:120-170).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent activity trace renders each tool call as a collapsible card (connector, inputs, duration) for makers in test; end users only see an optional \"Ask the end user before running\" confirmation, not the step list." } }, { @@ -1048,7 +1164,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -1057,7 +1173,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/web/files.py:23 POST /files/upload and api/controllers/web/remote_files.py:102 upload by URL, enabled per app by web/app/components/base/features/new-feature-panel/file-upload; files go into the chat message. No picker for a document store such as Nextcloud Files: upload from the local device or a URL only Note: attach by upload or URL, not from Nextcloud", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:209 Upload Files, :322 Attach Notes, :353 Attach Knowledge, :399 Google Drive, :692 OneDrive/SharePoint; backend/open_webui/routers/files.py upload then RAG; searched 'nextcloud|webdav' in backend/open_webui and src/lib: no Nextcloud Files source Note: attaching files works, but not from Nextcloud", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:120 message attachments; en.json:594 'Attach' and 565 'Drop files here to attach' upload from the local device; searched 'nextcloud|webdav' in packages/frontend/editor-ui/src/features/ai/chatHub: no picker for files held in Nextcloud (a Nextcloud node exists only as a workflow step) Note: Uploads a local file; cannot pick a file from Nextcloud in chat.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: attach button with 'Upload from device' and 'Select from nextcloud' file picker (assistant:src/components/ChattyLLM/InputArea.vue:160-173); attachments passed as file ids to the multimodal agent (assistant:lib/Service/ChatService.php:402-408, context_agent:ex_app/lib/agent.py:220-224). Note: Multimodal attachments need a provider for core:contextagent:multimodal-interaction." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: attach button with 'Upload from device' and 'Select from nextcloud' file picker (assistant:src/components/ChattyLLM/InputArea.vue:160-173); attachments passed as file ids to the multimodal agent (assistant:lib/Service/ChatService.php:402-408, context_agent:ex_app/lib/agent.py:220-224). Note: Multimodal attachments need a provider for core:contextagent:multimodal-interaction.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/image-input-analysis https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/attachments-overview users attach files to a message (Teams, custom and demo website) and the agent reasons over them for that turn; attaching from the Nextcloud file store is absent, files come from the device or Microsoft 365. Note: Nextcloud-phrased row." } }, { @@ -1078,7 +1195,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "yes", @@ -1087,7 +1204,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-15 only detects affection ('good bot', hearts) to animate the pet, it records no rating", "dify": "source read at 1.17.1, not driven: api/controllers/web/message.py:107 POST /messages//feedbacks; web/app/components/base/chat/chat/answer/operation.tsx:123-144 like/dislike buttons on each answer", "n8n": "source read at n8n@2.40.7, not driven: rating exists only in two narrower places: n8n's own builder assistant (packages/frontend/editor-ui/src/features/ai/instanceAi/useResponseFeedback.ts, instanceAi.api.ts:73-86 POST /instance-ai/feedback) and eval review rows (en.json:8317-8318 thumbs up/down); searched 'thumb|feedback|rating' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents chat components: no rating on a user agent's live answer Note: No thumbs on answers from agents people build.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'thumb|feedback|rating' in assistant:src, assistant:lib and context_agent:ex_app: no answer rating. Message actions are copy, regenerate, delete (assistant:src/components/ChattyLLM/MessageActions.vue:9-32)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'thumb|feedback|rating' in assistant:src, assistant:lib and context_agent:ex_app: no answer rating. Message actions are copy, regenerate, delete (assistant:src/components/ChattyLLM/MessageActions.vue:9-32).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/analytics-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-drill-down-lists end users give thumbs-up and thumbs-down reactions with comments on answers; analytics reports total reactions and lists them." } }, { @@ -1108,7 +1226,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "no", @@ -1117,7 +1235,8 @@ "dify": "source read at 1.17.1, not driven: web/public/embed.js (461 lines) injects a floating chat bubble into any web page that includes the script; web/i18n/en-US/app-overview.json:47 points to a separate 'Dify Chatbot Chrome Extension' (not in this repo); nothing embeds the assistant across the Dify console itself or inside Nextcloud Note: a site owner can place the bubble on their pages; no Nextcloud integration", "open-webui": "source read at v0.11.4, not driven: searched 'companion|floating|spotlight|nextcloud' in src/lib/components and src/routes: the chat is its own web app; the Spotlight-style chat bar is a separate desktop app repo (README.md:100 open-webui/desktop), not core, and nothing embeds into Nextcloud pages", "n8n": "source read at n8n@2.40.7, not driven: an assistant side panel follows the user across the n8n editor (packages/frontend/editor-ui/src/features/ai/assistant/chatPanel.store.ts, components/AssistantsHub.vue) and the canvas chat panel (features/ai/chatHub/components/CanvasChatHubPanel.vue); searched 'nextcloud' in packages/frontend: no integration into Nextcloud pages Note: Available on every n8n page, not inside Nextcloud or other apps.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: header menu entry injected on every page when enabled (assistant:lib/Listener/BeforeTemplateRenderedListener.php:61-88, src/components/AssistantHeaderMenuEntry.vue:8) opens the non-modal Assistant dialog (assistant:src/components/AssistantTextProcessingModal.vue:126)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: header menu entry injected on every page when enabled (assistant:lib/Listener/BeforeTemplateRenderedListener.php:61-88, src/components/AssistantHeaderMenuEntry.vue:8) opens the non-modal Assistant dialog (assistant:src/components/AssistantTextProcessingModal.vue:126).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents agents extend Microsoft 365 Copilot, reachable from the Copilot pane inside Microsoft 365 apps; nothing opens it from any Nextcloud page. Note: Nextcloud-phrased row; the M365 Copilot surface needs a Microsoft 365 Copilot licence or consumption billing." } }, { @@ -1138,7 +1257,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "no", @@ -1147,7 +1266,8 @@ "dify": "source read at 1.17.1, not driven: web/public/embed.js:93-96 the host page passes config.inputs (e.g. a record id) into the embedded chat as app input variables; the agent only sees what the host page chooses to pass, no connector reads the record or its links from another app Note: a host page can hand context in, nothing looks the record up", "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|record|object context' in backend/open_webui/utils/middleware.py and src/lib/components/chat: no integration that passes the record open in another app; closest is the iframe postMessage 'input:prompt' handler at src/lib/components/chat/Chat.svelte:1470 which only pre-fills text", "n8n": "source read at n8n@2.40.7, not driven: no host-app record context for user agents (searched 'record context|objectId|current page' in packages/cli/src/modules/agents and chat-hub: none); only n8n's own assistant can read the user's open browser tab through the AI Browser Bridge extension (packages/@n8n/mcp-browser/README.md:3-6, packages/@n8n/computer-use/README.md Browser tools) Note: Only n8n's builder assistant, through a local browser bridge; agents people build cannot see the record on screen.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: only for files: Files actions send the selected file to summarise, transcribe, speak or subtitle (assistant:src/files/fileActions.js:63,102,141,180 -> POST /api/v1/file-action/{fileId}/{taskTypeId}). Searched 'context|current' in assistant:src/assistant.js: no hand-over of a record from other apps into the chat." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: only for files: Files actions send the selected file to summarise, transcribe, speak or subtitle (assistant:src/files/fileActions.js:63,102,141,180 -> POST /api/v1/file-action/{fileId}/{taskTypeId}). Searched 'context|current' in assistant:src/assistant.js: no hand-over of a record from other apps into the chat.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-fundamentals-publish-channels https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-power-pages agents publish into Power Apps, Power Pages and Dynamics 365 surfaces where they can receive context variables; no integration that passes a record from another Nextcloud app. Note: Nextcloud-phrased row." } }, { @@ -1169,7 +1289,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -1178,7 +1298,8 @@ "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/conversation-opener/modal.tsx:48,87 builder sets an opening statement and fixed suggested questions per app; web/app/components/base/chat/chat/answer/suggested-questions.tsx. No prompt library keyed to a record type Note: per-app starter questions only", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/prompts.py:71 prompt list with access grants (:441), :384 versioning; src/lib/components/chat/MessageInput/Commands/Prompts.svelte '/' picker; per-model suggestion prompts ModelEditor.svelte:1183; no binding of prompts to a record type Note: org prompt library exists; not scoped to record types", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:62-63 suggestedPrompts per chat agent, en.json:527 'Suggestions' in the agent editor (packages/frontend/editor-ui/src/features/ai/chatHub/components/SuggestedPromptsEditor.vue, ChatSuggestedPrompts.vue); searched 'record type|prompt library' in packages/cli/src/modules/chat-hub: no organisation prompt library bound to a record type Note: Ready-made prompts are per agent and set by its owner, not per record type.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: chat offers hard-coded suggestion prompts (weather, share link, scheduled task, deck card, slides) in assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:355-400. Not set by the organisation and not per record type." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: chat offers hard-coded suggestion prompts (weather, share link, scheduled task, deck card, slides) in assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:355-400. Not set by the organisation and not per record type.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/settings-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/nlu-prompt-node https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-starter-prompts makers set suggested prompts (conversation starters) per agent and use preset prompt-library templates when building prompts; no organisation prompt set bound to a record type." } }, { @@ -1201,7 +1322,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -1210,7 +1331,8 @@ "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/VoiceRecording.svelte dictation and CallOverlay.svelte voice mode; backend/open_webui/routers/audio.py:1251 POST /audio/transcriptions (local Whisper, OpenAI, Deepgram, Azure, per README.md:54)", "hermes-agent": "source read at v2026.9.24, not driven: tools/voice_mode.py:1-5 push-to-talk capture with STT via tools/transcription_tools.py; hermes_cli/commands.py:202-205 /voice and /wake ('Hey Hermes' wake word); gateway/run_voice.py transcribes inbound voice messages on messaging platforms", "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:62 POST /audio-to-text; web/app/components/base/features/new-feature-panel/speech-to-text.tsx per-app switch; needs a speech2text model from a provider plugin", - "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatPrompt.vue:4,53 useSpeechRecognition turns speech into the prompt; en.json:599 'Voice input' and 571-573 microphone prompts; audio transcription also shipped as a node, packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/transcribe.operation.ts Note: Browser speech recognition, so it depends on the browser supporting it." + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatPrompt.vue:4,53 useSpeechRecognition turns speech into the prompt; en.json:599 'Voice input' and 571-573 microphone prompts; audio transcription also shipped as a node, packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/transcribe.operation.ts Note: Browser speech recognition, so it depends on the browser supporting it.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-realtime-voice-agents basic voice agents (IVR, GA) and real-time voice agents take speech over telephony; \"speak your response into the microphone\" in the test panel. Note: Real-time voice agents partly preview." } }, { @@ -1233,7 +1355,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -1242,7 +1364,8 @@ "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Messages/ResponseMessage.svelte:1122 'Read Aloud'; backend/open_webui/routers/audio.py:601 POST /audio/speech; per-model TTS voice ModelEditor.svelte:1280", "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:119 POST /text-to-audio; web/app/components/base/features/new-feature-panel/text-to-speech (voice, autoplay) per app; needs a TTS model from a provider plugin", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatMessageActions.vue:17-19,64,72 'Read aloud' action on AI messages via browser speech synthesis (en.json:650); speech generation node packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/generate.operation.ts", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: audio chat answers carry an audio attachment and TTS runs when needed (assistant:lib/Listener/ChattyLLMTaskListener.php:100-112,134,185); personal setting 'Auto-play audio chat responses' (assistant:src/components/PersonalSettings.vue:24); Files action 'Text-To-Speech using AI' (assistant:src/files/fileActions.js:86-102)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: audio chat answers carry an audio attachment and TTS runs when needed (assistant:lib/Listener/ChattyLLMTaskListener.php:100-112,134,185); personal setting 'Auto-play audio chat responses' (assistant:src/components/PersonalSettings.vue:24); Files action 'Text-To-Speech using AI' (assistant:src/files/fileActions.js:86-102).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-custom-lexicon voice-enabled agents answer with text-to-speech on telephony channels; no read-aloud of an answer in the text chat channels documented." } }, { @@ -1264,7 +1387,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "yes", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -1273,7 +1396,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; searched 'insert into|smart picker|text field' in apps/desktop/electron and web/src: the desktop Quick Entry (apps/desktop/electron/quick-entry.ts:2) opens a composer, it does not insert results into other apps' text fields", "dify": "source read at 1.17.1, not driven: searched 'smart picker|reference provider|text field|browser extension' in web/ and api/: Dify is a standalone app, AI help inside text fields exists only for its own prompt editors (api/controllers/console/app/generator.py:327 instruction-generate); nothing inserts AI output into other applications' text fields", "open-webui": "source read at v0.11.4, not driven: searched 'smart picker|reference provider|nextcloud' in backend/open_webui and src/lib: Open WebUI is standalone and offers no picker inside other apps' text fields; in-app only via note AI menu (src/lib/components/notes/AIMenu.svelte:42)", - "n8n": "source read at n8n@2.40.7, not driven: the same kind of thing exists only on n8n's own surface: 'Ask AI' writes code into the Code node's field (packages/@n8n/constants/src/index.ts:39 feat:askAi, licence-gated) and the builder assistant fills node parameters; searched 'smart picker|nextcloud' in packages/frontend and packages/cli/src: no way to call it from a Nextcloud text field Note: Missing Nextcloud part: any text field in Nextcloud. Rewritten under the lane ruling of 2026-09-26 (was no)." + "n8n": "source read at n8n@2.40.7, not driven: the same kind of thing exists only on n8n's own surface: 'Ask AI' writes code into the Code node's field (packages/@n8n/constants/src/index.ts:39 feat:askAi, licence-gated) and the builder assistant fills node parameters; searched 'smart picker|nextcloud' in packages/frontend and packages/cli/src: no way to call it from a Nextcloud text field Note: Missing Nextcloud part: any text field in Nextcloud. Rewritten under the lane ruling of 2026-09-26 (was no).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents agents extend Microsoft 365 Copilot, which works inside Word and Outlook; Copilot Studio itself offers no picker in arbitrary text fields and nothing in Nextcloud. Note: Nextcloud-phrased row; needs Microsoft 365 Copilot licence." } }, { @@ -1294,7 +1418,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -1303,7 +1427,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched '\"summarize\"|\"translate\"|\"rephrase\"|\"reformulate\"' as command or action names in *.py and *.ts outside tests: no one-click text action; summarising or translating happens only by asking in chat Note: The chat can do it when asked; no one-click action on a selected text.", "dify": "source read at 1.17.1, not driven: a builder can make a Completion (text generator) app that summarises or translates (web/app/(shareLayout)/completion/[token]); no built-in one-click summarise/reformulate/translate action on arbitrary text Note: possible by building an app, not a ready one-click action", "open-webui": "source read at v0.11.4, not driven: src/lib/components/notes/AIMenu.svelte:42 one-click 'Enhance' on a note; NoteEditor.svelte:154-157 suggested 'Summarize this note.', 'Rewrite the selected text.'; src/lib/components/chat/ContentRenderer/FloatingButtons.svelte:26 Ask, :33 Explain on selected text; searched 'translate' in those components: no one-click translate Note: only inside notes and chat selections, no one-click translate", - "n8n": "source read at n8n@2.40.7, not driven: text tasks ship as workflow nodes, not one-click actions: packages/@n8n/nodes-langchain/nodes/chains/ChainSummarization (summarise), nodes/vendors/OpenAi/v2/actions/audio/translate.operation.ts, nodes-base DeepL node (packages/nodes-base/nodes/DeepL); searched 'summarize|translate|rephrase' in packages/frontend/editor-ui/src/features/ai/chatHub: no one-click text actions Note: Needs a workflow built around a node or a typed chat request." + "n8n": "source read at n8n@2.40.7, not driven: text tasks ship as workflow nodes, not one-click actions: packages/@n8n/nodes-langchain/nodes/chains/ChainSummarization (summarise), nodes/vendors/OpenAi/v2/actions/audio/translate.operation.ts, nodes-base DeepL node (packages/nodes-base/nodes/DeepL); searched 'summarize|translate|rephrase' in packages/frontend/editor-ui/src/features/ai/chatHub: no one-click text actions Note: Needs a workflow built around a node or a typed chat request.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompts-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/create-custom-prompt makers build prompt tools (summarise, translate, extract) used by agents and flows; no end-user one-click text transform surface in Copilot Studio." } }, { @@ -1324,7 +1449,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -1333,7 +1458,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/image_generation_tool.py:1-5 image generation tool (FAL models chosen in `hermes tools`); agent/image_gen_registry.py pluggable providers with plugins/image_gen/; the model calls it from any chat surface", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/images.py:562 POST /images/generations, :858 /images/edit (OpenAI, Gemini, ComfyUI, Automatic1111); built-in tool backend/open_webui/tools/builtin.py:370 generate_image; src/routes/(app)/playground/images/+page.svelte", "dify": "source read at 1.17.1, not driven: core builtin tools are only audio, code, time, webscraper (api/core/tools/builtin_tool/providers/); searched 'text2img|image_generation|generate image' in api/core and web/i18n/en-US: none in core. Image generation comes only from marketplace tool plugins Note: marketplace plugin only", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/image/generate.operation.ts image generation operation; Google Gemini vendor node image actions (nodes/vendors/GoogleGemini); both usable in a workflow or as an agent tool" + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/image/generate.operation.ts image generation operation; Google Gemini vendor node image actions (nodes/vendors/GoogleGemini); both usable in a workflow or as an agent tool", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents \"Image generation isn't natively supported in Copilot Studio agents\" (use a connector); agents extending Microsoft 365 Copilot can turn on \"Create images\". Note: Only on the M365 Copilot surface (licence), else via an outside connector." } }, { @@ -1355,7 +1481,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "no", "open-webui": "yes", @@ -1364,7 +1490,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/app/conversation.py:55,119-126 builders search one app's logs by keyword over queries and answers; the end-user chat sidebar (web/app/components/base/chat/chat-with-history/sidebar) has no search and api/controllers/web/conversation.py:48 lists without a keyword Note: admin log search per app, no search for the person across their own conversations", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:865 GET /chats/search over title and message content with snippet (:178 chat_search_snippet); src/lib/components/layout/SearchModal.svelte 'Search Chats'; agent-side tool tools/builtin.py:1512 search_chats", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:95-107 GET /chat/conversations takes only limit, cursor, type (packages/@n8n/api-types/src/chat-hub.ts:491-495), no query; searched 'search' among chatHub i18n keys (en.json:539-677): only agent, tool and model search; agent sessions list has status/origin filters only (packages/frontend/editor-ui/src/features/agents/components/AgentSessionsFilter.vue:25-34)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'search|filter' in assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue and lib/Controller/ChattyLLMController.php: session list has no search and GET /chat/sessions takes only isAssignment (ChattyLLMController.php:322)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'search|filter' in assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue and lib/Controller/ChattyLLMController.php: session list has no search and GET /chat/sessions takes only isAssignment (ChattyLLMController.php:322).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-history searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"search.{0,30}(past|previous) conversations|conversation search|search history\": nothing for end users; only makers' test history and admin transcripts." } }, { @@ -1385,7 +1512,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "yes", @@ -1394,7 +1521,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/anthropic_message_convert.py:52-56 carries provider citation blocks through the transcript; tools/web_tools.py web_search/web_extract return result URLs that the model quotes in its text; searched 'citation' in *.py: no source panel or structured citation rendering in gateway, CLI or dashboard Note: Sources appear only as links the model writes into the answer.", "dify": "source read at 1.17.1, not driven: web/app/components/base/features/new-feature-panel/citation.tsx:44 per-app Citations switch; web/app/components/base/chat/chat/citation/popup.tsx:31,109 shows each source document and segment with a link to /datasets//documents/ (link shown to console users)", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-knowledge-retrieval.ts:199,276 knowledge search returns file and line citations to the model (tools/knowledge/search-knowledge.tool.ts:215) and the chat shows 'Read file'/'Search text' tool steps (en.json:7672-7674); searched 'citation|sources' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents: no linked source list under an answer Note: The model gets citations, the answer UI shows no source links. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Context Chat answers show referenced sources as links (assistant:src/components/ContextChat/ContextChatOutputForm.vue:20-42, ContextChatSource.vue:46); in agent chat only tool names are listed (assistant:src/components/ChattyLLM/Message.vue:54-72). Note: Source links rely on the context_chat app and backend (not read)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Context Chat answers show referenced sources as links (assistant:src/components/ContextChat/ContextChatOutputForm.vue:20-42, ContextChatSource.vue:46); in agent chat only tool names are listed (assistant:src/components/ChattyLLM/Message.vue:54-72). Note: Source links rely on the context_chat app and backend (not read).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/knowledge-copilot-studio https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-test-bot knowledge answers include citations showing where information came from; makers check citations and source attributions in test." } }, { @@ -1416,7 +1544,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "partial", "open-webui": "yes", @@ -1425,7 +1553,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'share.*(link|url)|public.*session|shared_session' in hermes_cli/web_routers/sessions.py and gateway/platforms/api_server.py: none; hermes_cli/web_routers/sessions.py:787 GET /api/sessions/{id}/export and hermes_cli/commands.py:66 /save export to a file; hermes_cli/shared_session_attach.py:1-4 attaches local runtimes, not colleagues Note: Export to a file exists; no share link.", "dify": "source read at 1.17.1, not driven: searched 'share conversation|shareConversation|conversation.*share' in web/i18n/en-US and api/controllers/web/conversation.py (list, delete, rename, pin only): the web app URL and QR code share the app (web/i18n/en-US/agent-v-2.json access.webApp.qrCode), no link to one conversation", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentPreviewMoreMenu.vue:159-172 'Copy link' copies the session route (en.json:8223), which opens only for users with agent:read in the project; chat hub conversations are private to their user (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:110 getConversation by req.user.id); searched 'share' in chat-hub.controller.ts: no share endpoint Note: A link works for project colleagues on agent sessions; no public or chat-hub share link. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'share' in assistant:lib/Controller: only sharing a task's output file (POST /api/v1/task/{id}/file/{fileId}/share, assistant:appinfo/routes.php:34); no link to a conversation." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'share' in assistant:lib/Controller: only sharing a task's output file (POST /api/v1/task/{id}/file/{fileId}/share, assistant:appinfo/routes.php:34); no link to a conversation.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-share-agent searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"share.{0,20}(conversation|chat)|conversation link\": sharing covers agents, prompts and apps, not a conversation by link." } }, { @@ -1446,7 +1575,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "partial", @@ -1455,7 +1584,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:794-799 5-6 field cron expressions via croniter; hermes_cli/subcommands/cron.py:23 `hermes cron create`; web/src/i18n/en.ts cron.schedule 'Schedule (cron expression)' on web/src/pages/CronPage.tsx -> POST /api/cron/jobs (hermes_cli/web_routers/cron.py:248)", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:10-19 Schedule Trigger start node with mode cron and cron_expression; api/schedule/workflow_schedule_task.py:18 poller (ENABLE_WORKFLOW_SCHEDULE_POLLER_TASK default true, api/configs/feature/__init__.py:1461); an agent runs on it as an Agent node in that workflow Note: the schedule belongs to a workflow app that holds the agent node, not to the agent itself", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:105-106 'Custom (Cron)' rule, cronExpression field; agent schedules also take a cron, en.json:8143 'Custom (cron)' in the agent task editor and packages/cli/src/modules/agents/scheduling/agent-task-job-registrar.ts", - "open-webui": "source read at v0.11.4, not driven: schedules are iCalendar RRULE, not cron: backend/open_webui/models/automations.py:76 rrule; utils/recurrence.py:37 _parse_rule (dateutil rrulestr); src/lib/components/automations/ScheduleDropdown.svelte:33 'Custom' free-text field with placeholder RRULE:FREQ=DAILY;BYHOUR=9 (:223); searched 'cron' in backend/open_webui/utils and routers/automations.py: none Note: same power as cron via RRULE, but no cron syntax" + "open-webui": "source read at v0.11.4, not driven: schedules are iCalendar RRULE, not cron: backend/open_webui/models/automations.py:76 rrule; utils/recurrence.py:37 _parse_rule (dateutil rrulestr); src/lib/components/automations/ScheduleDropdown.svelte:33 'Custom' free-text field with placeholder RRULE:FREQ=DAILY;BYHOUR=9 (:223); searched 'cron' in backend/open_webui/utils and routers/automations.py: none Note: same power as cron via RRULE, but no cron syntax", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-triggers-about https://learn.microsoft.com/en-us/azure/connectors/connectors-native-recurrence agents run on a schedule through the Recurrence trigger (interval, frequency, advanced hours/days/minutes options); searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"cron\": no cron expression field. Note: Same schedules are reachable, not in cron syntax. Recurrence page read via its MicrosoftDocs source." } }, { @@ -1476,7 +1606,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -1485,7 +1615,8 @@ "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:17,34-55 visual mode with hourly/daily/weekly/monthly frequency, on_minute, time, weekdays; api/services/trigger/schedule_service.py:257 visual_to_cron; web/i18n/en-US/workflow.json nodes.triggerSchedule.useVisualPicker Note: hourly is the finest visual step; 'every 15 minutes' needs cron", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:81-101 interval rules Seconds, Minutes, Hours, Days, Weeks, Months without cron; agent task editor en.json:8139-8142 Hourly, Daily, Weekly, Monthly", "open-webui": "source read at v0.11.4, not driven: src/lib/components/automations/ScheduleDropdown.svelte:27-33 Hourly/Daily/Weekly/Monthly presets building FREQ+INTERVAL (:92); backend/open_webui/utils/recurrence.py:62 MINUTELY/HOURLY steps aligned to the clock; builtin tool docstring tools/builtin.py:3726 'Every 30 minutes'", - "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:791-792 'every 30m' / '30m' become recurring interval schedules; web/src/i18n/en.ts cron.scheduleModes.interval 'Every interval' with minutes/hours/days units on CronPage" + "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:791-792 'every 30m' / '30m' become recurring interval schedules; web/src/i18n/en.ts cron.scheduleModes.interval 'Every interval' with minutes/hours/days units on CronPage", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-triggers-about https://learn.microsoft.com/en-us/azure/connectors/connectors-native-recurrence \"a recurrence trigger set to activate every 10 minutes sends a trigger payload as a message to an agent every 10 minutes\"; Interval plus Frequency (minute, hour, day, week, month)." } }, { @@ -1506,7 +1637,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "yes", @@ -1515,7 +1646,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:801-812 ISO timestamp parses to a one-shot job in the configured timezone; web/src/i18n/en.ts cron.scheduleModes.once 'Once' / onceAt 'Run at'", "dify": "source read at 1.17.1, not driven: searched 'once|run_at|one-time|date' in api/core/workflow/nodes/trigger_schedule/entities.py and api/services/trigger/schedule_service.py: only recurring frequencies and a 5-field cron (api/libs/schedule_utils.py:33-39), which repeats yearly; no fire-once date", "open-webui": "source read at v0.11.4, not driven: src/lib/components/automations/ScheduleDropdown.svelte:28 'Once' builds DTSTART + RRULE:FREQ=DAILY;COUNT=1 (:69, detection :110); backend/open_webui/utils/recurrence.py:106 validate_rrule requires DTSTART with COUNT", - "n8n": "source read at n8n@2.40.7, not driven: no one-shot trigger: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:81-106 only recurring rules; inside a running workflow the Wait node can hold until a date (packages/nodes-base/nodes/Wait/Wait.node.ts:329 resume 'specificTime'); agent schedules are recurring only (packages/cli/src/modules/agents/builder/skills/target-tasks.skill.ts:10 'Not for one-off requests') Note: A one-off run needs a workflow that starts then waits until the date." + "n8n": "source read at n8n@2.40.7, not driven: no one-shot trigger: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:81-106 only recurring rules; inside a running workflow the Wait node can hold until a date (packages/nodes-base/nodes/Wait/Wait.node.ts:329 resume 'specificTime'); agent schedules are recurring only (packages/cli/src/modules/agents/builder/skills/target-tasks.skill.ts:10 'Not for one-off requests') Note: A one-off run needs a workflow that starts then waits until the date.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/azure/connectors/connectors-native-recurrence https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer Recurrence has a Start Time (first occurrence) but always repeats; a one-off run means a recurrence plus turning the flow off, or a delay-until action. No documented single-shot scheduled run." } }, { @@ -1536,7 +1668,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "yes", "open-webui": "yes", @@ -1545,7 +1677,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:780-790 natural phrases ('every monday 9am', 'weekdays at 9am') convert to cron via _natural_every_to_cron; tools/cronjob_tools.py:1 cronjob_manage tool lets the agent create jobs from a chat request; hermes_cli/commands.py:236 /cron", "dify": "source read at 1.17.1, not driven: searched 'natural language|describe|generate cron|text to cron' in web/i18n/en-US/workflow.json and api/services/trigger: the schedule node takes a visual picker or a cron string only (web/i18n/en-US/workflow.json nodes.triggerSchedule.*) Note: the workflow generator does not know the schedule node either: searched 'trigger-schedule|trigger_schedule|cron' in api/core/workflow/generator/, no hits", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3709 create_automation built-in tool: the chat model turns 'every weekday at eight' into an RRULE (docstring examples :3723-3728), plus :3817 update_automation and :3921 list_automations, gated by features.automations permission", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/builder/skills/target-tasks.skill.ts:5-20 the agent builder assistant turns a request for a recurring schedule into create_tasks/update_task calls; Instance AI (default module) builds Schedule Trigger workflows from plain prompts, e.g. en.json:1271 'Every morning, scan Gmail ...' suggestion Note: Through the AI builder, which needs a model configured." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/builder/skills/target-tasks.skill.ts:5-20 the agent builder assistant turns a request for a recurring schedule into create_tasks/update_task calls; Instance AI (default module) builds Schedule Trigger workflows from plain prompts, e.g. en.json:1271 'Every morning, scan Gmail ...' suggestion Note: Through the AI builder, which needs a model configured.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-nl https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-triggers-about describe an agent flow in natural language and Copilot builds the trigger, \"for example ... on a recurring schedule\"; agent event triggers themselves are configured in a form." } }, { @@ -1566,7 +1699,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -1575,7 +1708,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_time.py:1-5 tz-aware now() in the configured IANA timezone (HERMES_TIMEZONE or config timezone); cron/jobs.py:1195-1216 next fire computed on local wall clock with both DST folds tried so 09:00 local stays 09:00 across fall-back; cron/jobs.py:832 intervals measure elapsed time across DST Note: Old partial; the scheduler handles DST explicitly.", "dify": "source read at 1.17.1, not driven: api/core/workflow/nodes/trigger_schedule/entities.py:19 timezone per schedule; api/libs/schedule_utils.py:41-50 croniter evaluated in the pytz zone and converted to UTC, so fires follow local wall time across DST; web/i18n/en-US/workflow.json nodes.triggerSchedule.invalidTimezone", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/automations.py:319-330 claim_due fetches each owner's User.timezone and reschedules with it; utils/recurrence.py:128 next_run_ns evaluates the rule on local wall-clock time then attaches ZoneInfo (:137), so 08:00 stays 08:00 across DST", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:501-532 rules evaluated in the workflow/instance IANA timezone with moment-timezone; agent schedules carry their own zone, packages/cli/src/modules/agents/scheduling/task-timezone.ts:10-18 and agent-task-job-registrar.ts:190-195 cron planned in that zone" + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Schedule/ScheduleTrigger.node.ts:501-532 rules evaluated in the workflow/instance IANA timezone with moment-timezone; agent schedules carry their own zone, packages/cli/src/modules/agents/scheduling/task-timezone.ts:10-18 and agent-task-job-registrar.ts:190-195 cron planned in that zone", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/azure/connectors/connectors-native-recurrence Recurrence takes a Time Zone with the start time; \"If you want the trigger to honor daylight saving time (DST), make sure that you select a time zone\". Note: Read via the MicrosoftDocs source of the Logic Apps/Power Automate Recurrence page." } }, { @@ -1596,7 +1730,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -1605,7 +1739,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:157 `hermes cron run` (next scheduler tick); hermes_cli/web_routers/cron.py:292 POST /api/cron/jobs/{id}/trigger behind web/src/i18n/en.ts cron.triggerNow 'Trigger now' on CronPage", "dify": "source read at 1.17.1, not driven: api/core/trigger/debug/event_selectors.py:140-200 a schedule test run waits for the next computed slot, it does not fire at once; the same workflow can be run now only through a second User Input start node ('Choose the start node to run', web/i18n/en-US/workflow.json common.chooseStartNodeToRun) or the workflow run API Note: no 'run now' on the schedule itself", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:334 POST /automations/{id}/run; src/lib/components/automations/AutomationItemHeaderActions.svelte:33 'Run now', AutomationMenu.svelte:96 'Run Now'; src/routes/(app)/automations/+page.svelte:196 runAutomationById", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-tasks.controller.ts:98-99 POST /:agentId/tasks/:taskId/run, en.json:8155 'Run schedule'; workflows with a Schedule Trigger run on demand from the editor's execute button (packages/cli/src/workflows/workflows.controller.ts manual run)" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-tasks.controller.ts:98-99 POST /:agentId/tasks/:taskId/run, en.json:8155 'Run schedule'; workflows with a Schedule Trigger run on demand from the editor's execute button (packages/cli/src/workflows/workflows.controller.ts manual run)", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-trigger-event https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer \"Select Test trigger icon beside the trigger in the agent's Overview page\"; for Recurrence triggers a test run \"runs once\" immediately." } }, { @@ -1626,7 +1761,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -1635,7 +1770,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:306 POST /{id}/toggle flips is_active (models/automations.py:28); claim_due only picks is_active rows (:301); src/routes/(app)/automations/+page.svelte:166 toggle, :186 bulk toggle; tool tools/builtin.py:3993 toggle_automation", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/cron.py:149-152 `cron pause` / `cron resume`; hermes_cli/web_routers/cron.py:282-287 POST /api/cron/jobs/{id}/pause|resume behind CronPage Pause/Resume (web/src/i18n/en.ts cron.pause)", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:167,197 POST /apps//trigger-enable sets AppTriggerStatus ENABLED/DISABLED; api/schedule/workflow_schedule_task.py:55-78 the poller only picks ENABLED triggers", - "n8n": "source read at n8n@2.40.7, not driven: en.json:8122 per-schedule 'Enabled' switch in the agent task editor, packages/api-types agent-json-config.schema.ts:200-210 task enabled flag; whole workflows pause and resume with packages/cli/src/workflows/workflows.controller.ts:441 activate and :475 deactivate" + "n8n": "source read at n8n@2.40.7, not driven: en.json:8122 per-schedule 'Enabled' switch in the agent task editor, packages/api-types agent-json-config.schema.ts:200-210 task enabled flag; whole workflows pause and resume with packages/cli/src/workflows/workflows.controller.ts:441 activate and :475 deactivate", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-manage-monitor https://learn.microsoft.com/en-us/power-automate/disable-flow agent flow Overview: \"Delete the flow or turn it off to prevent it from triggering\"; Power Automate turn a flow on or off." } }, { @@ -1656,7 +1792,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "partial", @@ -1665,7 +1801,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-10 HMAC-validated inbound POST routes render the payload into an agent prompt or fire an existing cron job; hermes_cli/subcommands/webhook.py:16-50 `hermes webhook subscribe --prompt --events --skills --deliver --cron-job`; web/src/pages/WebhooksPage.tsx:207 create subscription", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Webhook (Webhook trigger node) starts a workflow, including one with an AI Agent node, from an inbound HTTP call; Chat Trigger adds a chat webhook (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts); Agents module exposes packages/cli/src/modules/agents/agent-integrations.controller.ts:109 POST /:agentId/webhooks/:platform for chat platforms", "dify": "source read at 1.17.1, not driven: api/controllers/trigger/webhook.py:59 /triggers/webhook/ any method starts the workflow; web/i18n/en-US/workflow.json blocks.trigger-webhook 'receives HTTP pushes from third-party systems'; configurable params, headers and response (nodes.triggerWebhook.*); the agent runs as a node in that workflow", - "open-webui": "source read at v0.11.4, not driven: inbound channel webhooks only post a message: backend/open_webui/routers/channels.py:2005 POST /channels/webhooks/{id}/{token} does not call model_response_handler (:976, only invoked at :1244 for user posts); another system can start a model turn only by calling the OpenAI-compatible API with an API key (routers/auths.py:1529, main.py:1118) Note: no webhook trigger bound to an agent; API call is the only machine start" + "open-webui": "source read at v0.11.4, not driven: inbound channel webhooks only post a message: backend/open_webui/routers/channels.py:2005 POST /channels/webhooks/{id}/{token} does not call model_response_handler (:976, only invoked at :1244 for user posts); another system can start a model turn only by calling the OpenAI-compatible API with an API key (routers/auths.py:1529, main.py:1118) Note: no webhook trigger bound to an agent; API call is the only machine start", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-triggers-about workflow trigger types include \"Manual / HTTP request\" and \"HTTP webhook ... trigger it from the external system\"; a flow calls the agent through the agent node." } }, { @@ -1686,7 +1823,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "partial", @@ -1695,7 +1832,8 @@ "dify": "source read at 1.17.1, not driven: api/services/trigger/webhook_service.py:966,994-1001 the random webhook_id in the URL is the only secret, generated once at node sync; no regenerate endpoint (api/controllers/console/app/workflow_trigger.py:94 is GET only); revoke by disabling the trigger (:167) or deleting the node. No HMAC/signature check Note: revoke yes, rotate no", "open-webui": "source read at v0.11.4, not driven: channel webhook token is minted once (backend/open_webui/models/channels.py:937 secrets.token_urlsafe) with no regenerate endpoint; revoke only by deleting the webhook (routers/channels.py:1963); the API key used for machine starts can be regenerated or deleted (routers/auths.py:1529 POST, :1554 DELETE /api_key) Note: no agent webhook; nearest secrets can be revoked, only the API key rotated", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Webhook/description.ts:91-95 basic, header and JWT auth on the webhook, each backed by a stored credential; the secret is rotated or revoked by editing or deleting that credential (packages/cli/src/credentials/credentials.controller.ts:243 PATCH, :450 DELETE) Note: No dedicated rotate button; rotation is a credential edit.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no inbound webhook exists (searched 'webhook|secret' in both repos)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no inbound webhook exists (searched 'webhook|secret' in both repos).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-automate/regenerate-sas-key https://learn.microsoft.com/en-us/power-automate/oauth-authentication Power Automate documents regenerating the SAS key of an HTTP-trigger flow and OAuth (Entra) restriction of who can trigger it; no agent-level webhook secret screen in Copilot Studio." } }, { @@ -1717,13 +1855,13 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "yes", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'IEventListener|NodeCreated|file upload' in assistant:lib/Listener: listeners handle task results, templates and user deletion only; nothing starts the agent on a Nextcloud event.", - "copilot-studio": "docs-only: competitor_features#31603 \"Autonomous agents: Agents that trigger on events and act without a human prompt (5 messages/action).\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-triggers-about https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-trigger-event event triggers start an agent: \"When a file is created in OneDrive\", \"When an item is created in SharePoint\", Dataverse row changes, Planner tasks. Nothing fires on Nextcloud file uploads or records. Note: Old yes rested on a generic feature row; on the Nextcloud ruling this is its own surface.", "n8n": "source read at n8n@2.40.7, not driven: 103 trigger nodes in packages/nodes-base/nodes (*Trigger.node.ts), e.g. file-upload triggers for Google Drive and Dropbox; searched '*nextcloud*trigger*' in packages/nodes-base/nodes: none, so a Nextcloud event reaches n8n only as a call to a generic Webhook node (packages/nodes-base/nodes/Webhook) Note: Event triggers are rich for other apps; nothing listens to Nextcloud directly. Old yes rested on the generic webhook line.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/webhook.py:1-5 routes accept events from outside systems with header event filters (GitHub, GitLab, Linear, generic); gateway/hooks.py:1-9 lifecycle hooks (session, agent, command events) run handlers; cron/scheduler_script.py pre-run script gates a job; searched 'nextcloud' repo-wide: none Note: Agents start on outside-system events via webhooks, not on Nextcloud file or record events.", "dify": "source read at 1.17.1, not driven: api/controllers/trigger/trigger.py:17 /triggers/plugin/ receives events from trigger plugins with subscriptions (api/controllers/console/workspace/trigger_providers.py:191); the event sources (GitHub, Slack, etc.) come from marketplace trigger plugins. No internal event bus for Dify's own events, no Nextcloud source Note: marketplace plugin only", @@ -1749,7 +1887,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "partial", @@ -1758,7 +1896,8 @@ "dify": "source read at 1.17.1, not driven: a workflow chooses its start node(s): User Input, Schedule Trigger, Webhook Trigger or a plugin trigger (web/i18n/en-US/workflow.json blocks.trigger-schedule, blocks.trigger-webhook, onboarding.triggerDescription; common.chooseStartNodeToRun); api/controllers/console/app/workflow_trigger.py:128 lists an app's triggers Note: chosen per workflow app that wraps the agent", "open-webui": "source read at v0.11.4, not driven: an automation runs on its RRULE (backend/open_webui/models/automations.py:76) and can be run by hand (routers/automations.py:334 /run); a model is also started by hand in chat; there is no event option per agent (searched 'trigger|event' in models/automations.py and src/lib/components/automations: none) Note: schedule or manual, no event trigger to choose", "n8n": "source read at n8n@2.40.7, not driven: each workflow picks its start: Manual Trigger, Schedule Trigger, Webhook or one of 103 app trigger nodes (packages/nodes-base/nodes/*Trigger.node.ts); Agents module agents combine chat, channel triggers and schedules per agent, en.json:8342-8343 'Triggers: Where and when this agent runs'", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: two start modes exist, by hand in chat and by schedule (assistant:lib/Service/ChatService.php:360,501); no event start, so the choice is incomplete." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: two start modes exist, by hand in chat and by schedule (assistant:lib/Service/ChatService.php:360,501); no event start, so the choice is incomplete.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-triggers-about https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-overview per agent: chat by hand, add event triggers or a Recurrence trigger; flows \"can be instant (manually run on demand), based on a schedule, or triggered by other events\"." } }, { @@ -1779,7 +1918,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "no", @@ -1788,7 +1927,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json nodes.common.retry.* per-node retry on failure with max retries and a fixed retry interval in ms (api/core/workflow/generator/prompts/builder_prompts.py:111 retry_config); fail branch / default value error handling (nodes.common.errorHandle.*). Searched 'backoff|exponential' in api/core/workflow: no growing waits, no whole-run retry Note: fixed interval, node level only", "n8n": "source read at n8n@2.40.7, not driven: packages/core/src/execution-engine/workflow-execute.ts:1799-1814 node 'Retry On Fail' clamps maxTries to 2-5 and waitBetweenTries to at most 5000 ms, :2346-2347 same wait every attempt (en.json:2378-2408); failed executions can be retried by hand (en.json:1577 'Retry execution') Note: Retries stop after a limit, but the wait is fixed, not growing. Old yes rested on a generic error-handling line.", "hermes-agent": "source read at v2026.9.24, not driven: cron/unreachable_retry.py:1-17 and :31 RETRY_DELAYS_SECONDS (300, 900, 1800): growing waits, stops after three, but only for fires that never reached the model (transient network error, zero API calls); cron/quota_hold.py:1-12 parks a job until a provider quota window reopens Note: Generic run failures are not retried; the bounded ladder covers unreachable-model failures only.", - "open-webui": "source read at v0.11.4, not driven: searched 'retry|backoff|attempt' in backend/open_webui/utils/automations.py, models/automations.py, routers/automations.py: execute_automation (utils/automations.py:345) catches the error, records status 'error' (:617 _record_run) and waits for the next RRULE slot; no automatic retry" + "open-webui": "source read at v0.11.4, not driven: searched 'retry|backoff|attempt' in backend/open_webui/utils/automations.py, models/automations.py, routers/automations.py: execute_automation (utils/automations.py:345) catches the error, records status 'error' (:617 _record_run) and waits for the next RRULE slot; no automatic retry", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-automate/limits-and-config https://learn.microsoft.com/en-us/power-automate/flows-designer Retry Policy per action: default exponential interval, up to 12 retries, or custom exponential/fixed, or none. Applies to agent flow actions, not to a whole agent turn." } }, { @@ -1809,7 +1949,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -1818,7 +1958,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/incidents.py:1-10 durable failure incidents grouped by job and error signature (detected, alerted, closed); hermes_cli/subcommands/cron.py:174-181 `hermes cron incidents list|ack`; cron/jobs.py:2254 dead-pin auto-pause Note: Failing jobs land in an incident list someone can acknowledge; the failed runs are not parked for replay and there is no dashboard view of incidents.", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:27,121,150 run logs filter by status (failed) and web/app/components/app/workflow-log/filter.tsx; searched 'dead letter|dead_letter|quarantine|parked' in api/: no list that parks repeatedly failing runs Note: a failed-status filter per app, not a dead-letter list", "open-webui": "source read at v0.11.4, not driven: failed runs are kept per automation in automation_run with status and error (backend/open_webui/models/automations.py:43-50), listed in src/lib/components/automations/AutomationEditor.svelte:212 getAutomationRuns; automation.run_failed event can go to a webhook (events.py AUTOMATION_RUN_FAILED); no cross-automation list of failing runs Note: per-automation run history, no parked-failures list", - "n8n": "source read at n8n@2.40.7, not driven: the executions list filters failed runs (en.json:1429 'Error' status) with manual 'Retry execution' (en.json:1577-1579), and an Error Workflow can route failures elsewhere (workflow settings errorWorkflow); searched 'dead letter|deadLetter|parked' in packages/cli/src: no dedicated queue for runs that keep failing Note: Failed runs are findable by status, not parked in their own list." + "n8n": "source read at n8n@2.40.7, not driven: the executions list filters failed runs (en.json:1429 'Error' status) with manual 'Retry execution' (en.json:1577-1579), and an Error Workflow can route failures elsewhere (workflow settings errorWorkflow); searched 'dead letter|deadLetter|parked' in packages/cli/src: no dedicated queue for runs that keep failing Note: Failed runs are findable by status, not parked in their own list.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-manage-monitor run history filters Failed runs and lets makers resubmit or cancel selected runs; no separate dead-letter list that parks repeatedly failing runs." } }, { @@ -1840,7 +1981,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "no", "n8n": "yes", "open-webui": "no", @@ -1849,7 +1990,8 @@ "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-task.service.ts:529-558 takes a per-task run lock (entities/agent-task-run-lock.entity.ts:6-35) and returns 'skipped-active' when the previous run still holds it; scheduling/agent-task-task-handler.ts:59-60 skips that tick Note: Agent schedules only (opt-in Agents module); workflow Schedule Triggers can overlap and have only the instance-wide N8N_CONCURRENCY_PRODUCTION_LIMIT (packages/@n8n/config/src/configs/executions.config.ts:25).", "hermes-agent": "source read at v2026.9.24, not driven: cron/jobs.py:2648-2670 claim_job_for_fire refuses a new fire while a fresh fire_claim exists (cleared by mark_job_run on completion, TTL for crashes); cron/jobs.py:3050 still-in-flight runs are skipped", "dify": "source read at 1.17.1, not driven: api/schedule/workflow_schedule_task.py:94-114 _process_schedules advances next_run_at and dispatches every due schedule without checking for a running execution; searched 'overlap|already running|skip_if_running|concurrency' in api/schedule and api/services/trigger: nothing", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/automations.py:289 claim_due only prevents double claiming of one slot (next_run_at advanced, SKIP LOCKED); utils/automations.py:112 asyncio.create_task(execute_automation) with no check that the previous run finished; searched 'running|in_progress|overlap|lock' in utils/automations.py: none" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/automations.py:289 claim_due only prevents double claiming of one slot (next_run_at advanced, SKIP LOCKED); utils/automations.py:112 asyncio.create_task(execute_automation) with no check that the previous run finished; searched 'running|in_progress|overlap|lock' in utils/automations.py: none", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-automate/guidance/coding-guidelines/optimize-power-automate-triggers trigger Concurrency control sets the maximum concurrent runs (degree of parallelism); set to 1 to stop overlapping runs." } }, { @@ -1871,7 +2013,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "yes", @@ -1880,7 +2022,8 @@ "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/automations/+page.svelte:509 list with Active/Paused filter, :100 last run time; AutomationEditor.svelte:331 next run, :361 run history with status; backend/open_webui/routers/automations.py:147 enrich_automation adds last_run and next_runs", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/CronPage.tsx with web/src/i18n/en.ts cron.last 'Last', cron.next 'Next', overdueSince; hermes_cli/web_routers/cron.py:233 GET /api/cron/jobs and :243 /runs; hermes_cli/subcommands/cron.py:20 `cron list` and :168 `cron runs`", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_trigger.py:45-65,128 GET /apps//triggers lists one app's triggers with status, no next run or last result; next 5 run times only in the node panel (web/i18n/en-US/workflow.json nodes.triggerSchedule.nextExecutionTimes). No workspace-wide schedule list Note: per app, no next run or last result in the list", - "n8n": "source read at n8n@2.40.7, not driven: per agent only: en.json:8119-8123 'Next run', 'Last run', 'Schedule status' in the agent's Schedules section (packages/frontend/editor-ui/src/features/agents/components/AgentSchedulesRow.vue); searched 'schedule' list views in packages/frontend/editor-ui/src/features: no instance-wide schedule overview for workflows or agents Note: No single list of every schedule." + "n8n": "source read at n8n@2.40.7, not driven: per agent only: en.json:8119-8123 'Next run', 'Last run', 'Schedule status' in the agent's Schedules section (packages/frontend/editor-ui/src/features/agents/components/AgentSchedulesRow.vue); searched 'schedule' list views in packages/frontend/editor-ui/src/features: no instance-wide schedule overview for workflows or agents Note: No single list of every schedule.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-trigger-event https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-manage-monitor the agent Overview page lists its triggers and each flow's Activity tab shows runs and status; no single list of every schedule with its next run time." } }, { @@ -1901,7 +2044,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "partial", @@ -1910,7 +2053,8 @@ "open-webui": "source read at v0.11.4, not driven: agents read uploaded and knowledge files via built-in tools backend/open_webui/tools/builtin.py:2750 view_file, :2413 list_chat_files, :2453 grep_chat_files; create and move files only inside an attached Open Terminal filesystem (utils/middleware.py:1286 write_file / run_command); searched 'nextcloud|webdav' in backend/open_webui: no Nextcloud Files Note: file work happens in the Open Terminal sandbox, not in Nextcloud Files", "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file, write_file, patch, search_files tools and :1371 registration in the file toolset, plus terminal tool for moves; searched 'nextcloud' repo-wide (excluding website/): none outside one test Note: Works on the host or sandbox filesystem; no Nextcloud Files connection.", "dify": "source read at 1.17.1, not driven: core has no file-store tool (searched 'nextcloud|webdav' in api/, web/app, web/i18n: no hits; builtin tools are audio, code, time, webscraper in api/core/tools/builtin_tool/providers/). Official marketplace plugin langgenius/dify-official-plugins tools/nextcloud/tools/ has list_files, search_files, upload_file, download_file, create_folder, delete_file: no move Note: marketplace plugin only (official 'nextcloud' plugin, read on main not at a tag), and it cannot move files", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/NextCloud/NextCloud.node.ts:35 usableAsTool, so an AI Agent can call it; :82-143 file resource with copy, delete, download, move, share, upload and :163-188 folder create, list, move; authenticated by Nextcloud access token or OAuth2 (:40-70) Note: Needs a workflow with an AI Agent node and the Nextcloud tool attached." + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/NextCloud/NextCloud.node.ts:35 usableAsTool, so an AI Agent can call it; :82-143 file resource with copy, delete, download, move, share, upload and :163-188 folder create, list, move; authenticated by Nextcloud access token or OAuth2 (:40-70) Note: Needs a workflow with an AI Agent node and the Nextcloud tool attached.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-onedrive-tools https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-sharepoint-tools https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors agents read and write files through the OneDrive and SharePoint MCP tools (preview) and the prebuilt OneDrive/SharePoint connectors; nothing reaches Nextcloud Files. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -1931,7 +2075,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -1940,7 +2084,8 @@ "open-webui": "source read at v0.11.4, not driven: built-in calendar tools backend/open_webui/tools/builtin.py:4151 search_calendar_events, :4240 create_calendar_event, :4367 update, :4488 delete, registered at utils/tools.py:754 when calendar is enabled; data in models/calendar.py, UI src/routes/(app)/calendar/+page.svelte Note: Open WebUI's own calendar; no CalDAV or Nextcloud Calendar", "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:1-27 bundled skill reads Google Calendar, checks conflicts and creates events through a gws CLI or bundled Python client (needs Google OAuth); optional-mcps/calendly; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Calendar only; no CalDAV, so a Nextcloud calendar is out of reach.", "dify": "source read at 1.17.1, not driven: no calendar tool in core (api/core/tools/builtin_tool/providers/ has audio, code, time, webscraper). Marketplace: official langgenius/dify-official-plugins tools/google_calendar/tools/{list_events,create_event}.yaml, feishu/lark calendars, and a community CalDAV plugin langgenius/dify-plugins shaba/caldav that could point at a Nextcloud calendar Note: marketplace plugin only", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Google/Calendar/GoogleCalendar.node.ts:57 usableAsTool, event get/getAll/create as an AI Agent tool; Microsoft Outlook node has calendar events (packages/nodes-base/nodes/Microsoft/Outlook/v2); searched 'caldav' in packages/nodes-base/nodes: none, so a Nextcloud calendar needs a hand-built HTTP Request tool Note: Google and Microsoft calendars; no CalDAV or Nextcloud Calendar node." + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Google/Calendar/GoogleCalendar.node.ts:57 usableAsTool, event get/getAll/create as an AI Agent tool; Microsoft Outlook node has calendar events (packages/nodes-base/nodes/Microsoft/Outlook/v2); searched 'caldav' in packages/nodes-base/nodes: none, so a Nextcloud calendar needs a hand-built HTTP Request tool Note: Google and Microsoft calendars; no CalDAV or Nextcloud Calendar node.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-calendar-tools https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors Office 365 Outlook connector actions (GA) read and create events; the Calendar MCP server (preview) covers \"creating, updating, retrieving events\"." } }, { @@ -1961,7 +2106,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "no", @@ -1970,7 +2115,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: skills/productivity/google-workspace/SKILL.md:15-22 Contacts via the Google People API in the bundled google-workspace skill; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Google Contacts only; no CardDAV or Nextcloud Contacts.", "dify": "source read at 1.17.1, not driven: no contacts tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_contacts/tools/{search_contacts,get_contact}.yaml; community langgenius/dify-plugins shaba/carddav Note: marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: searched 'contacts|carddav|address book' in backend/open_webui and src/lib/components: no contacts store or tool; only the user directory used for sharing", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Google/Contacts/GoogleContacts.node.ts:35 usableAsTool with contact get/getAll; searched 'carddav' in packages/nodes-base/nodes: none, so Nextcloud Contacts is only reachable by a hand-built HTTP Request tool Note: Google Contacts; no CardDAV or Nextcloud Contacts node." + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Google/Contacts/GoogleContacts.node.ts:35 usableAsTool with contact get/getAll; searched 'carddav' in packages/nodes-base/nodes: none, so Nextcloud Contacts is only reachable by a hand-built HTTP Request tool Note: Google Contacts; no CardDAV or Nextcloud Contacts node.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-user-tools https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors Office 365 Users/Outlook contacts connectors and the User MCP tools (preview) look up people and contacts in the directory." } }, { @@ -1992,7 +2138,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "no", @@ -2001,7 +2147,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/kanban_tools_schemas.py:89-371 kanban_create, kanban_comment, kanban_complete tools on Hermes' own multi-profile kanban board (hermes_cli/kanban.py); optional-mcps/ has asana, linear, monday, clickup MCP entries; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Cards on Hermes' own board or third-party boards; no Nextcloud Deck.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|deck' in api/ and web/i18n: nothing in core. Marketplace kanban tools only for other products: official tools/trello/tools/{create_new_card_on_board,update_card}.yaml, monday, linear, jira Note: cards on Trello-like boards via plugins, not Nextcloud Deck", "open-webui": "source read at v0.11.4, not driven: searched 'deck|kanban|board' in backend/open_webui (py): no board tool or integration", - "n8n": "source read at n8n@2.40.7, not driven: card boards of other products as agent tools: packages/nodes-base/nodes/Trello/Trello.node.ts:42 usableAsTool (card create/update), Asana and Jira nodes; searched 'deck' in packages/nodes-base/nodes/NextCloud: the Nextcloud node has only file, folder and user resources (NextCloud.node.ts:82-91) Note: Cards on Trello-like boards, not Nextcloud Deck." + "n8n": "source read at n8n@2.40.7, not driven: card boards of other products as agent tools: packages/nodes-base/nodes/Trello/Trello.node.ts:42 usableAsTool (card create/update), Asana and Jira nodes; searched 'deck' in packages/nodes-base/nodes/NextCloud: the Nextcloud node has only file, folder and user resources (NextCloud.node.ts:82-91) Note: Cards on Trello-like boards, not Nextcloud Deck.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-triggers-about the Planner connector creates and updates tasks on a Planner board (Planner is also a trigger source); no Nextcloud Deck. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -2022,7 +2169,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "no", @@ -2031,7 +2178,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: skills/email/himalaya/SKILL.md:1-3 bundled IMAP/SMTP skill; plugins/platforms/email/plugin.yaml:5-8 email gateway polls IMAP and replies over SMTP; tools/send_message_tool.py:35 send_message delivers to the email target; skills/productivity/google-workspace Gmail", "dify": "source read at 1.17.1, not driven: core email is only the Human Input node's delivery method (web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*, api/services/feature_service.py:81 on for self-hosted). A generic send-email tool comes from the official tools/email/tools/send_mail.yaml plugin or gmail/outlook plugins Note: agent-callable email is marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: searched 'smtp|send_email|sendmail|mail' in backend/open_webui: no mail sending anywhere in core; outbound messages go only to webhooks (utils/webhook.py:30) Note: only possible through a community Tool", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/EmailSend/v2/EmailSendV2.node.ts:32 usableAsTool sends SMTP mail; packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts:54 usableAsTool with send" + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/EmailSend/v2/EmailSendV2.node.ts:32 usableAsTool sends SMTP mail; packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts:54 usableAsTool with send", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-mail-tools https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors Office 365 Outlook \"Send an email\" connector action (GA); Mail MCP tools (preview)." } }, { @@ -2052,7 +2200,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -2061,7 +2209,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/send_message_tool.py:1-2 and :35 send_message posts to any connected chat platform (plugins/platforms/: telegram, discord, slack, matrix, mattermost, teams, signal and more); plugin-catalog/hermes-talk.yaml:1-5 is realtime voice, not Nextcloud Talk; searched 'nextcloud|caldav|carddav' in plugin-catalog/, optional-mcps/, skills/, optional-skills/: none Note: Posting into a team chat works; there is no Nextcloud Talk adapter.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/i18n: nothing in core. Marketplace chat tools for other products: official tools/slack/tools/send_message.yaml, tools/teams/tools/send_channel_message.yaml, discord, dingtalk, wecom Note: posts to Slack/Teams via plugins, not Nextcloud Talk", "open-webui": "source read at v0.11.4, not driven: an automation can target an Open WebUI channel (backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation) and models answer @mentions in channels (routers/channels.py:976); channel built-in tools are read-only (tools/builtin.py:1763-1957); no Nextcloud Talk Note: posting is to Open WebUI's own channels, only via automation target or mention reply", - "n8n": "source read at n8n@2.40.7, not driven: team chat tools for other products: packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts:75, Mattermost/v1/MattermostV1.node.ts:19, Microsoft/Teams/v2/MicrosoftTeamsV2.node.ts:21 all usableAsTool; searched 'talk|spreed' in packages/nodes-base/nodes: no Nextcloud Talk node Note: Posts to Slack, Mattermost or Teams, not Nextcloud Talk." + "n8n": "source read at n8n@2.40.7, not driven: team chat tools for other products: packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts:75, Mattermost/v1/MattermostV1.node.ts:19, Microsoft/Teams/v2/MicrosoftTeamsV2.node.ts:21 all usableAsTool; searched 'talk|spreed' in packages/nodes-base/nodes: no Nextcloud Talk node Note: Posts to Slack, Mattermost or Teams, not Nextcloud Talk.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-teams-tools https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-proactive-message agents post into Teams chats and channels (Teams connector, Teams MCP tools preview, proactive messages); no Nextcloud Talk. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -2083,7 +2232,7 @@ "featureConfidence": "low", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "partial", @@ -2092,7 +2241,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: skills/apple/apple-reminders/SKILL.md:1-3 'add, list, complete' reminders (macOS); tools/kanban_tools_schemas.py:89 kanban_complete and :371 kanban_create; optional-mcps/todoist; tools/todo_tool.py in-session todo list Note: No CalDAV tasks; Nextcloud Tasks is not reachable.", "dify": "source read at 1.17.1, not driven: no task tool in core (api/core/tools/builtin_tool/providers/). Marketplace: official tools/google_tasks/tools/{create_task,update_task}.yaml, microsoft_todo, todoist, feishu_task Note: marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3593 create_tasks and :3643 update_task keep a checklist inside the chat message (status pending|in_progress|completed); searched 'todo|caldav|vtodo' in backend/open_webui: no task app to create or complete tasks in Note: in-chat progress checklist only", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Google/Task/GoogleTasks.node.ts:29, Microsoft/ToDo/MicrosoftToDo.node.ts:33 and Todoist/v2/TodoistV2.node.ts:61 are usableAsTool with create and update (complete) task operations Note: No Nextcloud Tasks (CalDAV) node." + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Google/Task/GoogleTasks.node.ts:29, Microsoft/ToDo/MicrosoftToDo.node.ts:33 and Todoist/v2/TodoistV2.node.ts:61 are usableAsTool with create and update (complete) task operations Note: No Nextcloud Tasks (CalDAV) node.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-triggers-about Planner and To Do connectors create and complete tasks; \"When a task is completed in Planner\" trigger." } }, { @@ -2113,7 +2263,7 @@ "featureConfidence": "low", "nextcloud-assistant": "yes", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "partial", @@ -2122,7 +2272,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud' repo-wide (excluding website/): none outside one test; tools/session_search_tool.py searches only Hermes' own conversations and tools/file_tools.py:1270 search_files only the host filesystem Note: No Nextcloud unified search provider or equivalent cross-app search.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|unified search|unified_search' in api/ and web/: nothing. The official marketplace nextcloud plugin (langgenius/dify-official-plugins tools/nextcloud/tools/search_files.yaml) searches files only, not everything Nextcloud search reaches", "open-webui": "source read at v0.11.4, not driven: separate built-in search tools over Open WebUI's own stores: backend/open_webui/tools/builtin.py:1512 search_chats, :1127 search_notes, :865 search_memories, :1763 search_channels, :2104 search_knowledge_bases, :4151 search_calendar_events; no single cross-app search tool and no Nextcloud unified search Note: agent can search each store, not one unified index", - "n8n": "source read at n8n@2.40.7, not driven: searched 'unified search|unifiedsearch|nextcloud search' in packages/nodes-base/nodes, packages/@n8n/nodes-langchain/nodes and packages/cli/src/modules/agents: no tool that searches across a Nextcloud instance; the Nextcloud node covers files, folders and users only (packages/nodes-base/nodes/NextCloud/NextCloud.node.ts:82-91)" + "n8n": "source read at n8n@2.40.7, not driven: searched 'unified search|unifiedsearch|nextcloud search' in packages/nodes-base/nodes, packages/@n8n/nodes-langchain/nodes and packages/cli/src/modules/agents: no tool that searches across a Nextcloud instance; the Nextcloud node covers files, folders and users only (packages/nodes-base/nodes/NextCloud/NextCloud.node.ts:82-91)", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-copilot-connectors https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/add-work-iq agents search across Microsoft 365 through Microsoft Graph / Copilot connectors and Work IQ (files, mail, chats, meetings); not Nextcloud unified search. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -2143,7 +2294,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -2152,7 +2303,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:294 search_web and :333 fetch_url, registered at utils/tools.py:677 when web_search is enabled; ~20 providers in backend/open_webui/retrieval/web/ (SearXNG, Brave, Tavily, ...)", "dify": "source read at 1.17.1, not driven: core ships only a page reader (api/core/tools/builtin_tool/providers/webscraper); web search engines are marketplace plugins (official tools/duckduckgo, tavily, searxng, google, bing, brave, perplexity in langgenius/dify-official-plugins); web/i18n/en-US/agent-v-2.json tools.addMenu.tool 'like web search or integrations' Note: reading pages is core, searching needs a plugin", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/tools/ToolSerpApi/ToolSerpApi.node.ts:25 'SerpApi (Google Search)' and nodes/tools/ToolSearXng agent tools; Agents module web search setting with native, Brave or SearXNG providers (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:80-84, en.json:7884-7895); pages read with the HTTP Request tool (nodes/tools/ToolHttpRequest)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: DuckDuckGoSearchResults tool (context_agent:ex_app/lib/all_tools/duckduckgo.py:7-11) and web_fetch that reads a page by URL (context_agent:ex_app/lib/all_tools/web.py:13-20); the system prompt tells the agent to fetch search results (context_agent:ex_app/lib/agent.py:143-158). Note: Both are admin-toggleable categories." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: DuckDuckGoSearchResults tool (context_agent:ex_app/lib/all_tools/duckduckgo.py:7-11) and web_fetch that reads a page by URL (context_agent:ex_app/lib/all_tools/web.py:13-20); the system prompt tells the agent to fetch search results (context_agent:ex_app/lib/agent.py:143-158). Note: Both are admin-toggleable categories.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-public-website https://learn.microsoft.com/en-us/microsoft-copilot-studio/data-privacy-security-web-search web search (Bing) grounds answers on public websites and the wider web; admins can switch it off." } }, { @@ -2173,7 +2325,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -2182,7 +2334,8 @@ "dify": "source read at 1.17.1, not driven: searched 'openregister' in api/ and web/app: no hits; no OpenRegister connector in core or in the official plugin list (langgenius/dify-official-plugins tools/). Only reachable by a hand-built custom OpenAPI tool or HTTP node", "open-webui": "source read at v0.11.4, not driven: searched 'openregister|register' in backend/open_webui/tools and utils/tools.py: no OpenRegister or record-store tool; reachable only through a custom OpenAPI or MCP tool server", "n8n": "source read at n8n@2.40.7, not driven: searched 'openregister' in packages/nodes-base/nodes, packages/@n8n/nodes-langchain/nodes and packages/cli/src: no hits; only reachable by a hand-built HTTP Request tool against its API", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'openregister|register' in context_agent:ex_app and assistant:lib: no OpenRegister tool. Only indirectly if OpenRegister exposes a unified search provider (search.py), which is not in these repos." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'openregister|register' in context_agent:ex_app and assistant:lib: no OpenRegister tool. Only indirectly if OpenRegister exposes a unified search provider (search.py), which is not in these repos.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-dataverse https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-dataverse agents query and update records in Dataverse (Dataverse MCP server preview: create_record, read_query; Dataverse knowledge GA); no OpenRegister. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -2211,7 +2364,7 @@ "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin 'MCP Config' JSON field (context_agent:ex_app/lib/main.py:103-110) fed to langchain MultiServerMCPClient, tools prefixed mcp_ (context_agent:ex_app/lib/all_tools/mcp.py:14-30); MCP tools are always treated as dangerous (context_agent:ex_app/lib/tools.py:48); chat labels them 'MCP server: x' (assistant:src/components/ChattyLLM/Message.vue:289). Note: Old 'partial' said streamable_http only; the config is passed straight to MultiServerMCPClient, so its transports apply. Admin-only, one config for everyone.", "hermes-agent": "source read at v2026.9.24, not driven: tools/mcp_tool.py MCP client (stdio, HTTP, OAuth in tools/mcp_oauth.py); hermes_cli/subcommands/mcp.py:27 `hermes mcp add` and :52 configure tool selection; hermes_cli/web_routers/mcp.py:110 POST /api/mcp/servers behind web/src/pages/McpPage.tsx; optional-mcps/ catalog of 65 servers", - "copilot-studio": "docs-only: competitor_features#31607 \"MCP support: Copilot Studio can consume MCP tool servers.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-extend-action-mcp https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent add an existing MCP server to an agent with API key or OAuth 2.0 authentication; tools appear in the agent.", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/mcp/McpClientTool/McpClientTool.node.ts attaches an outside MCP server's tools to the AI Agent node; Agents module per-agent mcpServers with auth, tool allow/exclude filter and approval (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:228-303, max 20 at :495-500)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/AddToolServerModal.svelte:43 type 'openapi' | 'mcp', :313 OAuth 2.1; backend/open_webui/utils/mcp/client.py:67 streamablehttp_client; utils/middleware.py:2340 connect_mcp_server with access check :2361 and function_name_filter_list :2380", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/tool_providers.py:1373 add an MCP server as a tool provider, :1501 MCP OAuth, :1577 list its tools; api/core/mcp/types.py:26 client negotiates protocol 2025-06-18; web/i18n/en-US/agent-v-2.json tools.toolTabs.mcp so agents pick MCP tools" @@ -2235,7 +2388,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -2244,7 +2397,8 @@ "n8n": "source read at n8n@2.40.7, not driven: instance MCP server is a default module: packages/cli/src/modules/mcp/mcp.controller.ts:37,117 POST /mcp-server/http, tools such as search_workflows and execute_workflow (packages/cli/src/modules/mcp/tools/, mcp-scopes.ts:15,44); per-workflow MCP Server Trigger node packages/@n8n/nodes-langchain/nodes/mcp/McpTrigger/McpServer.ts", "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:1-7 `hermes mcp serve` stdio MCP server exposing a channel bridge: mcp_serve.py:468 conversations_list, :600 messages_send, :626 channels_list, :662-672 approvals; plugins/platforms/a2a lets outside agents message Hermes Note: Outside agents reach conversations, messaging and approvals, not Hermes' own tool set (files, terminal, web, skills).", "open-webui": "source read at v0.11.4, not driven: searched 'FastMCP|mcp.server|/mcp' in backend/open_webui (py): the only MCP code is the client (utils/mcp/client.py); Open WebUI exposes an OpenAI-compatible REST API, not an MCP server", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: ExApp route 'mcp' with USER access (context_agent:appinfo/info.xml routes), FastMCP server mounted at /mcp (context_agent:ex_app/lib/main.py:38-41,269), each call authenticated as the calling user (context_agent:ex_app/lib/mcp_server.py:31-41) and the enabled tools re-registered as MCP tools (mcp_server.py:47-73)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: ExApp route 'mcp' with USER access (context_agent:appinfo/info.xml routes), FastMCP server mounted at /mcp (context_agent:ex_app/lib/main.py:38-41,269), each call authenticated as the calling user (context_agent:ex_app/lib/mcp_server.py:31-41) and the enabled tools re-registered as MCP tools (mcp_server.py:47-73).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-dataverse the Microsoft Dataverse MCP server (preview) lets outside clients \"such as Microsoft Copilot Studio and Claude Desktop\" call Dataverse tools; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"expose (agent|tools) as MCP|MCP server endpoint\": agents and their tools are not published as an MCP server. Note: Preview; covers Dataverse only." } }, { @@ -2271,7 +2425,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:213-215 /tools list and /toolsets; hermes_cli/web_routers/tools.py:230 GET /api/tools/toolsets behind web/src/pages/SkillsPage.tsx:140 toolsets view with descriptions; tools/tool_search.py lets the agent search the tool catalog", - "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/tools-available tool picker lists 1,400+ prebuilt Power Platform connectors, MCP servers, flows, prompts, REST APIs and computer use, each with a description.", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/tool-provider-list.tsx list every installed tool provider (plugins, custom, workflow-as-tool, MCP) with each tool's description; api/controllers/console/workspace/tool_providers.py lists them", "n8n": "source read at n8n@2.40.7, not driven: the node creator lists every tool node with its description (packages/frontend/editor-ui/src/features/shared/nodeCreator/components/ItemTypes/NodeItem.vue:59-75); 272 nodes in packages/nodes-base/nodes declare usableAsTool: true; Agents module tool catalog with descriptions (packages/frontend/editor-ui/src/features/agents/composables/useAgentToolCatalog.ts:79-145)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Tools.svelte lists custom tools with descriptions (routers/tools.py); src/lib/components/workspace/Models/BuiltinTools.svelte:14-51 each built-in tool category with label and description; tool servers listed in chat/ToolServersModal.svelte", @@ -2296,7 +2450,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -2305,7 +2459,8 @@ "open-webui": "source read at v0.11.4, not driven: per-agent allow-list: src/lib/components/workspace/Models/ModelEditor.svelte:1198 ToolsSelector, :1262 BuiltinTools category toggles (BuiltinTools.svelte:14-51), :1245 Capabilities; backend/open_webui/utils/tools.py:520 get_builtin_tools only returns categories the model allows; tool access grants routers/tools.py:588", "dify": "source read at 1.17.1, not driven: tools are picked per agent (web/i18n/en-US/agent-v-2.json agentDetail.configure.tools.*; classic agent apps list tools in model config). But every Agent v2 run also gets a shell tool (dify-agent/src/dify_agent/layers/shell/layer.py:259,303 run) and 'Tools the agent installs in its sandbox won't appear here but stay available to it' (agent-v-2.json tools.tip) Note: explicit list for classic agents; Agent v2 always has a shell, so not 'nothing else'", "n8n": "source read at n8n@2.40.7, not driven: an AI Agent node can call only the tool sub-nodes wired to it (packages/@n8n/nodes-langchain/nodes/agents/Agent/utils.ts:31-59 typed inputs incl. ai_tool); Agents module lists tools per agent and filters MCP tools with allow/exclude (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:266-282, :461); skills narrow further with allowedTools (en.json:8053)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool categories switch on or off for the whole instance (context_agent:ex_app/lib/tools.py:23,33-35); no per-agent or per-user grant." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool categories switch on or off for the whole instance (context_agent:ex_app/lib/tools.py:23,33-35); no per-agent or per-user grant.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-data-loss-prevention an agent uses only the tools added to it and each can be turned off; admins restrict connectors per environment through data policies." } }, { @@ -2328,7 +2483,7 @@ "defectCandidate": "ToolAccessRequestService::notifyOwner() (lib/Service/ToolAccessRequestService.php:758-766) raises notification subjects 'tool_access_requested'/'tool_access_granted', neither of which is in lib/Notification/Notifier.php's KNOWN_SUBJECTS list (lines 58-65), so INotifier::prepare() throws UnknownNotificationException and the bell-menu entry for it never renders.", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -2337,7 +2492,8 @@ "dify": "source read at 1.17.1, not driven: searched 'request access|requestAccess|ask.*owner|tool request' in web/i18n/en-US and dify-agent/src: only static 'contact your Workspace Owner' tour text (web/i18n/en-US/common.json:624); no flow where an agent asks for a missing tool", "open-webui": "source read at v0.11.4, not driven: searched 'request access|request_access|missing tool' in backend/open_webui and src/lib/components: no flow for an agent to ask its owner for a tool; the ask_user tool (tools/builtin.py:518) asks the chat user a question, not for a grant", "n8n": "source read at n8n@2.40.7, not driven: searched 'request access|request_tool|requestTool' in packages/cli/src/modules/agents and packages/@n8n/agents/src: a running agent cannot ask its owner for a missing tool; ask_credential exists only for the builder assistant while editing an agent (packages/cli/src/modules/agents/builder/prompts/config-mutation.prompt.ts:31,103), and 'Suggest a tool' (en.json:7800-7801) is feedback from the builder to n8n Note: The builder asks the human for credentials while building; the agent at runtime cannot.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'request|access|grant' in context_agent:ex_app: a disabled category is silently skipped (tools.py:33-35); no access request flow." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'request|access|grant' in context_agent:ex_app: a disabled category is silently skipped (tools.py:33-35); no access request flow.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"request (access|permission)|ask (the )?owner|access request\" in tool pages: only OAuth consent for connections, no flow where an agent asks its owner for a new tool." } }, { @@ -2359,7 +2515,7 @@ "featureConfidence": "low", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -2368,7 +2524,8 @@ "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/layers/shell/layer.py:303 agent runs scripts in a per-agent Linux sandbox (dify-agent-runtime/docker/Dockerfile); workflow Code node (web/i18n/en-US/workflow.json blocks.code) runs in dify-sandbox; builtin code tool api/core/tools/builtin_tool/providers/code Note: agent-v-2.json communityEditionIsolationTip: in Community Edition the sandbox is only Landlock-protected and shares a PID namespace, not strongly isolated", "n8n": "source read at n8n@2.40.7, not driven: Code node and Custom Code Tool (packages/@n8n/nodes-langchain/nodes/tools/ToolCode/ToolCode.node.ts) run JS or Python in task runners, Python in a sandbox (packages/@n8n/task-runner-python/src/_sandbox_callables.py; runner mode config packages/@n8n/config/src/configs/runners.config.ts:16-17); Agents module custom tools run in V8 isolates (packages/cli/src/modules/agents/runtime/agent-secure-runtime.ts:5,23) Note: Default runner mode is 'internal' (a child process); the external runner container gives stronger isolation.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:633 execute_code; src/lib/components/admin/Settings/CodeExecution.svelte:20 engines pyodide (browser WASM sandbox, src/lib/pyodide/pyodideSandboxHost.ts) and jupyter; plus Open Terminal containers (README.md:36)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'exec|sandbox|python|subprocess|code' across context_agent:ex_app/lib/all_tools/: no code execution tool." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'exec|sandbox|python|subprocess|code' across context_agent:ex_app/lib/all_tools/: no code execution tool.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/code-interpreter-for-prompts https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-overview code interpreter lets agents \"write and run Python code\"; GitHub Copilot harness agents \"run in a secure sandbox\". Note: Harness sandbox is part of a production-ready preview; code interpreter GA outside sovereign clouds." } }, { @@ -2390,7 +2547,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "partial", @@ -2399,7 +2556,8 @@ "open-webui": "source read at v0.11.4, not driven: no git tool in core (searched 'git' in backend/open_webui/tools and utils/tools.py); an agent can run git only through an attached Open Terminal via run_command (utils/tools.py:1439, utils/middleware.py:1287), which is a separate first-party server (README.md:96 open-webui/open-terminal) Note: old yes; git works only with the separate Open Terminal server", "dify": "source read at 1.17.1, not driven: dify-agent-runtime/docker/Dockerfile:31-37 installs git and openssh-client in the agent sandbox; dify-agent/src/dify_agent/layers/shell/layer.py:303 the agent runs shell scripts there, secrets via the env editor (agent-v-2.json advancedSettings.envEditor); official github/gitlab plugins add PR and commit tools Note: through the generic shell, no dedicated git UI", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Git/Git.node.ts:90 usableAsTool with operations add, clone, commit, pull, push (:136-184); GitHub and GitLab nodes for remote repositories (packages/nodes-base/nodes/Github, Gitlab) Note: Git node works on the n8n host's filesystem; needs a workflow with an AI Agent node.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'git|repository|commit' in context_agent:ex_app: no git tool." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'git|repository|commit' in context_agent:ex_app: no git tool.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors a GitHub connector exists among the prebuilt connectors and GitHub Copilot harness agents can use coding-agent skills, but searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"git (clone|commit)|repository\": no documented agent working tree that commits code." } }, { @@ -2420,7 +2578,7 @@ "featureConfidence": "low", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -2429,7 +2587,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/tool_providers.py:685 add a custom tool from an OpenAPI schema (web/i18n/en-US/tools.json createTool.schema), :904 publish a workflow as a tool, :1373 add an MCP server; agent-v-2.json tools.cliDialog installs a CLI tool into the agent sandbox", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/tools/ToolCode (custom code tool), ToolHttpRequest (any API) and ToolWorkflow (a workflow as a tool) are added on the canvas without code changes; Agents module custom tools and workflow tools (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:373-420, en.json:8040-8041); community nodes can be installed too", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/tools.py:346 POST /tools/create with Python code (src/routes/(app)/workspace/tools/create/+page.svelte, ToolkitEditor.svelte), :264 /tools/load/url; OpenAPI and MCP tool servers added in settings (src/lib/components/AddToolServerModal.svelte:43)", - "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:456 register_tool in the plugin context; hermes_cli/subcommands/plugins.py:18 `hermes plugins install` from a git URL, into ~/.hermes/plugins; web/src/i18n/en.ts pluginsPage.installHeading 'Install from GitHub / Git URL'; hermes_cli/subcommands/mcp.py:27 add any MCP server" + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:456 register_tool in the plugin context; hermes_cli/subcommands/plugins.py:18 `hermes plugins install` from a git URL, into ~/.hermes/plugins; web/src/i18n/en.ts pluginsPage.installHeading 'Install from GitHub / Git URL'; hermes_cli/subcommands/mcp.py:27 add any MCP server", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-extend-action-rest-api https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent add a REST API (OpenAPI), custom connector, MCP server, agent flow or prompt as a tool from the maker UI without app code changes." } }, { @@ -2450,7 +2609,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -2459,7 +2618,8 @@ "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI writes query, answer, inputs, sources and feedback (api/services/retention/conversation/message_export_service.py:53-62), no tool calls; api/controllers/console/workflow_run_archive.py:93-130 run-archive download is Cloud paid-plan only; tool spans reach Langfuse and other tracers (api/core/ops) Note: no community export of the tool-call list; old partial rested on the message export, which leaves tool calls out", "open-webui": "source read at v0.11.4, not driven: tool calls live inside each message's output items (utils/tool_approval.py:43 function_call entries) and leave only through chat JSON export (src/lib/components/chat/Settings/DataControls.svelte:93 exportChats, admin routers/chats.py:1049 /all/db) or chat stats export (:609); no dedicated tool-invocation log or export", "n8n": "source read at n8n@2.40.7, not driven: tool calls sit inside execution data, exportable per run through the public API packages/cli/src/public-api/v1/handlers/executions/spec/paths/getExecutions.generated.yml:18 includeData; one agent session exports to LangSmith (packages/cli/src/modules/agents/agent-threads.controller.ts:53-65); searched 'export' in packages/frontend/editor-ui/src/features/agents and execution logs: no export of an agent's tool-call list Note: No single export of every tool call; assemble from execution data or per session.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool names per answer are stored in the message's sources column (assistant:lib/Listener/ChattyLLMTaskListener.php:97-98); searched 'export' in assistant:lib: no export of tool calls." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool names per answer are stored in the message's sources column (assistant:lib/Listener/ChattyLLMTaskListener.php:97-98); searched 'export' in assistant:lib: no export of tool calls.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-logging-copilot-studio https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-transcripts-studio Purview audit (exportable, Office 365 Management API) records agent usage events and transcripts; transcripts download as files. No per-agent tool-call export screen in Copilot Studio. Note: Purview audit needs a Microsoft 365 licence." } }, { @@ -2480,7 +2640,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -2489,7 +2649,8 @@ "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/integrations/[[...slug]]/page.tsx and web/app/components/integrations/routes.ts:2-11 one page for model providers, builtin tools, MCP, custom tools, workflow tools, data sources, endpoints, triggers, agent strategies, extensions, each showing Authorized/Unauthorized (web/i18n/en-US/tools.json auth.authorized, auth.unauthorized) Note: shows whether a connection is authorised, not a live health check", "open-webui": "source read at v0.11.4, not driven: admin Settings tabs Connections, Integrations (tool servers), Code Execution, External Knowledge (src/lib/components/admin/Settings/*.svelte) list outside connections, each with a verify or test action at add time (AddToolServerModal.svelte:206 verifyToolServerConnection, AddTerminalServerModal.svelte:246, ExternalKnowledge.svelte:295); no standing status view showing whether each still works", "n8n": "source read at n8n@2.40.7, not driven: the Credentials page lists every outside connection (en.json:1178-1182) and a credential is tested when saved (packages/cli/src/credentials/credentials.controller.ts:147 POST /test), but the list shows no live health; per agent, packages/cli/src/modules/agents/agent-integrations.controller.ts:89-104 channel status report and en.json:8554 'Not running' badge Note: No single page with live status of every dependency.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: personal settings 'Configured backends' list the providers behind each feature (assistant:src/components/PersonalSettings.vue:52-60) and admin settings flag missing providers (AdminSettings.vue:55-120). No health status per outside connection, MCP servers not shown." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: personal settings 'Configured backends' list the providers behind each feature (assistant:src/components/PersonalSettings.vue:52-60) and admin settings flag missing providers (AdminSettings.vue:55-120). No health status per outside connection, MCP servers not shown.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-connections Connection Settings page lists every connection the agent uses with status (connected, not connected, deactivated, expired) and lets makers fix them." } }, { @@ -2510,7 +2671,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -2519,7 +2680,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:1-5 persistent MEMORY.md (agent notes) and USER.md (user profile) injected into every session; agent/background_review.py:1-6 after each turn a forked agent decides what to save; plugins/memory/ bundled providers (honcho, mem0, supermemory, openviking, retaindb, holographic, byterover)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/models/memories.py:15 per-user memory table (type user|context, path); utils/memory.py:290 add_memory_context injects memories into each chat; tools/builtin.py:923 add_memory, :865 search_memories let the agent save and recall across chats and automation runs", "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 Agent v2 working directories are owned per conversation, workflow run or build draft, so end-user runs do not carry facts into the next conversation; only builder-applied persistent files and the build note (agent-v-2.json workingDirectory.persistentFilesTooltip) carry over. Learned memory comes from marketplace plugins (official bailian_memory; community mem0, zep in langgenius/dify-plugins) Note: marketplace plugin for learned memory; plugins not read", - "n8n": "source read at n8n@2.40.7, not driven: Agents module episodic memory stores source-backed facts across conversations (packages/@n8n/agents/src/runtime/memory/episodic-memory.ts, packages/cli/src/modules/agents/entities/agent-memory-entry.entity.ts, en.json:7918-7919); workflows keep chat history across runs in persistent memory nodes keyed by session (packages/@n8n/nodes-langchain/nodes/memory/MemoryPostgresChat, MemoryRedisChat, MemoryZep) Note: Fact memory needs the opt-in Agents module; workflow memory nodes keep conversation history, not distilled facts." + "n8n": "source read at n8n@2.40.7, not driven: Agents module episodic memory stores source-backed facts across conversations (packages/@n8n/agents/src/runtime/memory/episodic-memory.ts, packages/cli/src/modules/agents/entities/agent-memory-entry.entity.ts, en.json:7918-7919); workflows keep chat history across runs in persistent memory nodes keyed by session (packages/@n8n/nodes-langchain/nodes/memory/MemoryPostgresChat, MemoryRedisChat, MemoryZep) Note: Fact memory needs the opt-in Agents module; workflow memory nodes keep conversation history, not distilled facts.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/memory-overview Memory (production-ready preview, GitHub Copilot harness) captures preferences and context per user and applies them on later interactions; memories expire after 28 days without interaction. Note: Preview; standard harness agents have no memory." } }, { @@ -2540,7 +2702,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -2549,7 +2711,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 target 'user' = who the user is (name, role, preferences, style) in USER.md; plugins/memory/honcho/__init__.py:1-5 per-peer user modeling with peer cards; mem0 user_id canonical across gateways (plugins/memory/mem0/__init__.py:1-7) Note: USER.md is per profile, not per person; per-person modelling needs the honcho or mem0 provider.", "open-webui": "source read at v0.11.4, not driven: memory is kept per person: backend/open_webui/models/memories.py:22 user_id, :23 type 'user' for durable facts about the user; utils/memory.py:528 background review writes 'user' facts; src/lib/components/chat/Settings/Personalization/MemoryModal.svelte:97 'Add a preference, fact, or instruction about you' Note: old partial; memory is per user across all models, not per agent", "dify": "source read at 1.17.1, not driven: searched 'user profile|user_memory|remember' in dify-agent/src and api/core/memory (token_buffer_memory.py only): no per-person memory in core; conversation variables are per conversation (api/controllers/console/app/conversation_variables.py:88). Per-user memory only via marketplace memory plugins (community mem0, zep) Note: marketplace plugin only, plugin behaviour not read", - "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/utils/agent-memory-scope.ts:1-60 memory is scoped per resource: per n8n user (draft-chat:), per chat-platform user (integration::) and per task; memory entries indexed by agentId and resourceId (entities/agent-memory-entry.entity.ts:8-17) Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/utils/agent-memory-scope.ts:1-60 memory is scoped per resource: per n8n user (draft-chat:), per chat-platform user (integration::) and per task; memory entries indexed by agentId and resourceId (entities/agent-memory-entry.entity.ts:8-17) Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/memory-overview \"Each agent maintains a separate memory store for every user\"; it captures user preferences and patterns. Disabled in group chats and Teams channels. Note: Preview." } }, { @@ -2571,7 +2734,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "yes", @@ -2580,7 +2743,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: memories are plain files $HERMES_HOME/memories/MEMORY.md and USER.md (hermes_cli/web_routers/ops.py:481-492); web/src/pages/SystemPage.tsx:1234-1243 shows their sizes and Reset buttons only; hermes_cli/commands.py:223 /memory pending|approve|reject reviews staged writes; tools/memory_tool.py:311 agent can replace/remove entries on request Note: No viewer or editor in dashboard or CLI; correcting means editing the file by hand or asking the agent.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/Personalization.svelte:53 lists memories, :61 delete, MemoryModal.svelte:59 Edit Memory; backend/open_webui/routers/memories.py:548 update, :610 delete, :516 delete all", "dify": "source read at 1.17.1, not driven: builders see and edit the agent's persistent files and generated build note (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, files.buildNote, workingDirectory.*) and conversation variables per conversation (api/controllers/console/app/conversation_variables.py:88); there is no learned-memory store to inspect Note: the agent's files are editable, but there is no memory of learned facts to review", - "n8n": "source read at n8n@2.40.7, not driven: workflow chat memory can be read, overwritten or deleted with the Chat Memory Manager node (packages/@n8n/nodes-langchain/nodes/memory/MemoryManager/MemoryManager.node.ts:127-183 load, insert, override, delete); the Agents module Memory tab only configures memory (packages/frontend/editor-ui/src/features/agents/components/AgentMemoryPanel.vue:225-316) and searched 'memory' in packages/cli/src/modules/agents/*.controller.ts: no endpoint to list or edit remembered facts Note: Facts an agent remembers cannot be seen or corrected in the UI." + "n8n": "source read at n8n@2.40.7, not driven: workflow chat memory can be read, overwritten or deleted with the Chat Memory Manager node (packages/@n8n/nodes-langchain/nodes/memory/MemoryManager/MemoryManager.node.ts:127-183 load, insert, override, delete); the Agents module Memory tab only configures memory (packages/frontend/editor-ui/src/features/agents/components/AgentMemoryPanel.vue:225-316) and searched 'memory' in packages/cli/src/modules/agents/*.controller.ts: no endpoint to list or edit remembered facts Note: Facts an agent remembers cannot be seen or corrected in the UI.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/memory-overview users ask the agent what it remembers, update or forget a memory, or open the memory portal to view and delete all; makers cannot see end users' memories. Note: Preview; the portal offers view and delete-all, edits go through chat." } }, { @@ -2601,7 +2765,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "yes", "open-webui": "yes", @@ -2610,7 +2774,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:56 hard char budgets (memory 2200, user 1375) and :323-324 'IF FULL ... reissue as ONE batch that removes or shortens enough stale entries'; agent/background_review.py:1-6 background review updates existing memory; plugins/memory/holographic/__init__.py:1-5 trust scoring and temporal decay", "dify": "source read at 1.17.1, not driven: searched 'consolidat|dedupe memory|stale|forget' in dify-agent/src and api/core: dify-agent/src/dify_agent/runtime/compaction.py only compacts the current run's context; nothing merges or prunes stored memory", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/memory.py:410 review_memory_after_turn every N turns (memories.review_interval_turns) asks the model for add/replace/move/remove operations and tells it to prefer replace/remove over duplicates (:528 prompt), applied via routers/memories.py:234 update_memories Note: off by default: ENABLE_MEMORY_BACKGROUND_REVIEW (config.py:428)", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/runtime/memory/observation-log-reflector.ts:76,123-160 a reflector model merges observations and marks superseded ones; memory-lifecycle.ts:1-12 active, superseded, dropped states; reflector model chosen in en.json:8034-8035 'Memory model' Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules)." + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/runtime/memory/observation-log-reflector.ts:76,123-160 a reflector model merges observations and marks superseded ones; memory-lifecycle.ts:1-12 active, superseded, dropped states; reflector model chosen in en.json:8034-8035 'Memory model' Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/memory-overview memories are deleted wholesale after 28 days of inactivity; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"consolidat|merge|dedup|stale\" in memory pages: no merging or pruning of individual facts." } }, { @@ -2632,7 +2797,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -2641,7 +2806,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/datasets.py:446 create a knowledge base, datasets_document.py:384 upload documents, web/app/(commonLayout)/datasets/create; agents search it via Knowledge Retrieval (web/i18n/en-US/agent-v-2.json knowledgeRetrieval.*; dify-agent/src/dify_agent/layers/knowledge/layer.py)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/knowledge.py:318 POST /knowledge/create, file add and directories; src/routes/(app)/workspace/knowledge/[id]/+page.svelte, KnowledgeBase/AddContentMenu.svelte; attached to an agent at ModelEditor.svelte:1194; searched by tools/builtin.py:3151 query_knowledge_files", "hermes-agent": "source read at v2026.9.24, not driven: plugins/memory/retaindb/__init__.py:515-564 retaindb_upload_file, retaindb_ingest_file, retaindb_list_files with semantic search (RetainDB cloud API); plugins/memory/openviking/__init__.py:1-6 OpenViking tiered knowledge with semantic search; searched 'knowledge base|vector|embedding' for a built-in document store: none Note: Only through a bundled memory-provider plugin backed by an outside service, driven by agent tools; no upload UI or built-in knowledge base.", - "n8n": "source read at n8n@2.40.7, not driven: Chat hub agents take knowledge files with semantic search (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:484 POST /chat/agents/:agentId/files, en.json:515); Agents module knowledge base for CSV, PDF, Markdown, TXT (packages/cli/src/modules/agents/agent-knowledge.controller.ts:48, en.json:7925); workflows load documents into vector stores (packages/@n8n/nodes-langchain/nodes/vector_store/) Note: Chat hub PDF upload needs semantic search configured by the owner." + "n8n": "source read at n8n@2.40.7, not driven: Chat hub agents take knowledge files with semantic search (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:484 POST /chat/agents/:agentId/files, en.json:515); Agents module knowledge base for CSV, PDF, Markdown, TXT (packages/cli/src/modules/agents/agent-knowledge.controller.ts:48, en.json:7925); workflows load documents into vector stores (packages/@n8n/nodes-langchain/nodes/vector_store/) Note: Chat hub PDF upload needs semantic search configured by the owner.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-file-upload https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/knowledge-sources-overview upload files as a knowledge source (up to 500 knowledge sources per agent, 512 MB per file) that the agent searches." } }, { @@ -2663,7 +2829,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "yes", @@ -2672,7 +2838,8 @@ "dify": "source read at 1.17.1, not driven: an agent's Files are kept in its persistent working directory and available in every run (web/i18n/en-US/agent-v-2.json agentDetail.configure.files.*, workingDirectory.persistentFilesTooltip; api/models/agent.py:218 AgentHomeSnapshot); knowledge retrievals attach per agent. No named bundle of files and records that can be reused across agents Note: per-agent files, not a named reusable context bundle", "open-webui": "source read at v0.11.4, not driven: per-agent bundle: ModelEditor.svelte:1194 Knowledge (knowledge bases, files, notes) stored in ModelMeta.knowledge (backend/open_webui/models/models.py:81) and injected every chat; per-project bundle: folders carry system_prompt and files applied to every chat in them (backend/open_webui/utils/middleware.py:2591-2602)", "n8n": "source read at n8n@2.40.7, not driven: per-agent knowledge files and instructions travel with the agent (packages/cli/src/modules/agents/agent-knowledge.controller.ts:36-48, en.json:7925); the instance-wide Context settings page ships only Preferences, with 'Sources' and 'Skills' marked 'Coming soon' (packages/frontend/editor-ui/src/features/settings/context/views/SettingsContextView.vue:68-77, en.json:3229-3233) Note: No named, reusable bundle of files and records to attach to several agents.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Context Chat 'Selective context' picks files, folders or providers for one query (assistant:src/components/ContextChat/ContextChatInputForm.vue:25,158-162); no named bundle carried into every run." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Context Chat 'Selective context' picks files, folders or providers for one query (assistant:src/components/ContextChat/ContextChatInputForm.vue:25,158-162); no named bundle carried into every run.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-file-groups https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-instructions file groups bundle uploaded files into one named knowledge source with its own instructions; agents search it when relevant rather than carrying it into every run, and records are separate knowledge sources." } }, { @@ -2702,7 +2869,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/context_compaction.py:42 compact_messages_for_request summarises older turns past a token threshold (DEFAULT_CONTEXT_COMPACTION_PROMPT), retention % in config.py:2203; routers/chats.py:1271 POST /chats/{id}/compact manual; event chat.compacted", "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/runtime/compaction.py:16-44 TieredCompaction clears old tool results then SummarizingCompaction keeps the last 20 messages and summarises older ones, wired in dify-agent/src/dify_agent/runtime/runner.py:365,402 Note: Agent v2 only; classic apps use a token window (api/core/memory/token_buffer_memory.py) without summarising", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/runtime/memory/memory-orchestrator.ts:615-650 observations stand in for older messages once an observer model has summarised them (observation-log-observer.ts:166 runObservationLogObserver, thresholds in packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:42-51); workflows only window history (packages/@n8n/nodes-langchain/nodes/memory/MemoryBufferWindow) Note: Summarising needs the opt-in Agents module; workflow memory nodes truncate instead.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: older turns are cut, not summarised: history capped at 42 non-tool messages and old tool outputs truncated to 2000 chars (context_agent:ex_app/lib/nc_model.py:87-89,104-148); plain chat sends the last N messages (admin setting, assistant:src/components/AdminSettings.vue:167-178)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: older turns are cut, not summarised: history capped at 42 non-tool messages and old tool outputs truncated to 2000 chars (context_agent:ex_app/lib/nc_model.py:87-89,104-148); plain chat sends the last N messages (admin setting, assistant:src/components/AdminSettings.vue:167-178).", + "copilot-studio": "not checked: docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/troubleshooting-error-codes not checked: the troubleshooting page tells users to start a new conversation or pick a larger context window when history is too long; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"summari[sz].{0,40}(history|older|turns)\" found no automatic summarising of older turns." } }, { @@ -2723,7 +2891,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -2732,7 +2900,8 @@ "dify": "source read at 1.17.1, not driven: searched 'knowledge.?graph|graph_rag|graphrag' in api/core/rag and web/i18n/en-US: no hits; retrieval is vector, full-text, hybrid and parent-child chunks (api/core/rag/retrieval). A neo4j query tool exists only as an official marketplace plugin (tools/neo4j)", "open-webui": "source read at v0.11.4, not driven: searched 'graph|relation|link' in backend/open_webui/retrieval and tools/builtin.py: retrieval is vector plus BM25 hybrid search over chunks; no entity or record relationship graph an agent can walk", "n8n": "source read at n8n@2.40.7, not driven: searched 'knowledge graph|graph|relation' in packages/cli/src/modules/agents, packages/@n8n/agents/src and packages/@n8n/nodes-langchain/nodes: no graph of related records for agents to follow (agent-dependency-index.service.ts tracks config dependencies, not data); no Neo4j or graph store node in packages/nodes-base/nodes", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'relation|graph|link' in context_agent:ex_app and assistant:lib: no record relation model; the agent's graph is the LangGraph loop (context_agent:ex_app/lib/graph.py)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'relation|graph|link' in context_agent:ex_app and assistant:lib: no record relation model; the agent's graph is the LangGraph loop (context_agent:ex_app/lib/graph.py).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-fabric-iq-ontology https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/fabric-iq-connect https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-dataverse Fabric IQ ontology (preview) exposes entities and relations to agents; Dataverse MCP describe_table returns relationships. No generic record-link graph an agent walks. Note: Preview, and Fabric needs its own capacity licence." } }, { @@ -2754,7 +2923,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -2763,7 +2932,8 @@ "dify": "source read at 1.17.1, not driven: searched 'record|object context|linked records' in api/core/app and dify-agent/src: an answer is grounded only in knowledge retrieval and inputs the caller passes (web/public/embed.js:93 inputs); nothing resolves the record on screen or follows its links", "open-webui": "source read at v0.11.4, not driven: searched 'record|object|linked' in backend/open_webui/utils/middleware.py and tools/builtin.py: there is no record model or 'record on screen' context; grounding is only on attached files, knowledge and notes", "n8n": "source read at n8n@2.40.7, not driven: searched 'record context|objectId|current record|on screen' in packages/cli/src/modules/agents, chat-hub and packages/frontend/editor-ui/src/features/ai: agents get no host-app record or its linked records; grounding is only in uploaded knowledge files or vector stores", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'current|context' in assistant:src/assistant.js and lib: the chat receives no record from the page on screen, only attachments the user adds (assistant:src/components/ChattyLLM/InputArea.vue:160-173)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'current|context' in assistant:src/assistant.js and lib: the chat receives no record from the page on screen, only attachments the user adds (assistant:src/components/ChattyLLM/InputArea.vue:160-173).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-dataverse https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-power-pages Dataverse knowledge grounds answers in tables and their related rows; context variables pass the page an agent is embedded in. No built-in \"record on screen plus linked records\" grounding across apps." } }, { @@ -2789,7 +2959,7 @@ "n8n": "yes", "open-webui": "partial", "evidence": { - "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-copilot-connectors https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-azure-ai-search knowledge sources include SharePoint, Dataverse, Azure AI Search and Microsoft Graph (Copilot) connectors such as ServiceNow and Confluence.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/knowledge.py:697 external knowledge connections to existing Qdrant, Milvus or pgvector collections (src/lib/components/admin/Settings/ExternalKnowledge.svelte:469-471); OneDrive/SharePoint and Google Drive only as one-time file pickers (chat/MessageInput/InputMenu.svelte:399, :707); live SharePoint/wiki sync is the separate oikb project (README.md:98) Note: no live SharePoint or wiki connector in core", "hermes-agent": "source read at v2026.9.24, not driven: optional-mcps/atlassian/manifest.yaml:1-9 Nous-approved catalog entry for Confluence pages and Jira; optional-mcps/notion, microsoft-learn, deepwiki; skills/productivity/notion bundled skill; plugin-catalog/microsoft365.yaml:1-5 SharePoint and OneDrive via a community plugin Note: SharePoint only through a community catalog plugin; wikis such as Confluence and Notion through core catalog MCP entries.", "dify": "source read at 1.17.1, not driven: api/controllers/console/datasets/external.py:153,339 connect an external knowledge API as a dataset; api/controllers/console/datasets/data_source.py:228,417 Notion import and sync in core; website crawl datasets/website.py:32; SharePoint and Confluence via official datasource plugins (langgenius/dify-official-plugins datasources/sharepoint_datasource, confluence_datasource) Note: SharePoint itself is a marketplace plugin; Notion wiki and the external-KB API are core", @@ -2815,7 +2985,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "no", "open-webui": "yes", @@ -2824,7 +2994,8 @@ "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/skills/page.tsx workspace Skills library; api/controllers/console/workspace/skills.py:296 list with search by name or description and tags (web/i18n/en-US/skill.json skillManagement.searchPlaceholder, tags); agents add from it (agent-v-2.json skills.addMenu.workspace 'Add from library') Note: a workspace library, not a public catalogue", "open-webui": "source read at v0.11.4, not driven: src/routes/(app)/workspace/skills/+page.svelte and src/lib/components/workspace/Skills.svelte list every skill the user can read, with search, enable state and owner; backend/open_webui/routers/skills.py:63 GET /skills/list with access grants Note: org-internal catalogue; no public skill store link like the one for models and tools", "n8n": "source read at n8n@2.40.7, not driven: skills exist per agent only (packages/cli/src/modules/agents/agents-skills.controller.ts:21-82 CRUD under one agent); the shared place for skills is a placeholder, packages/frontend/editor-ui/src/features/settings/context/views/SettingsContextView.vue:68-71 'Skills' row with 'Coming soon' (en.json:3231-3232); searched 'catalog|marketplace|registry' in agents-skills.controller.ts and agent-skills.service.ts: none Note: Skills can be written or imported per agent, but there is nothing to browse.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skills are listed via GET /api/v1/skills merging personal and admin global skills (assistant:lib/Service/AgentSkillsService.php:65-90) and shown to the agent in its prompt (context_agent:ex_app/lib/agent.py:165-177). No browsing UI; users see the SKILL.md folders in Files. Note: Skills added in assistant 4.0.0 / context_agent 2.8.0." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skills are listed via GET /api/v1/skills merging personal and admin global skills (assistant:lib/Service/AgentSkillsService.php:65-90) and shown to the agent in its prompt (context_agent:ex_app/lib/agent.py:165-177). No browsing UI; users see the SKILL.md folders in Files. Note: Skills added in assistant 4.0.0 / context_agent 2.8.0.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-add-existing \"add existing skills to your agent by browsing a skill catalog or uploading a skill package\"; only the upload path is documented, no catalogue page described. Note: GitHub Copilot harness is a production-ready preview." } }, { @@ -2845,7 +3016,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -2854,7 +3025,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:811 /workspaces/current/agents//skills binds library skills to an agent; web/i18n/en-US/agent-v-2.json skills.addMenu.workspace 'Add from library' and skills.addMenu.upload 'Upload skill.zip' (embedded), limit of 20 library skills per agent (skills.workspaceSelector.limitReached)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/ModelEditor.svelte:1202 SkillsSelector attaches a skill to an agent in one pick; users can also pull a skill into one chat with the '$' mention (src/lib/components/chat/MessageInput/Commands/Skills.svelte, backend/open_webui/utils/skills.py:23 extract_skill_ids_from_messages)", "n8n": "source read at n8n@2.40.7, not driven: en.json:8062-8063 'Upload SKILL.md' and 'Upload folder' in the agent's Skills section (packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts), saved by packages/cli/src/modules/agents/agents-skills.controller.ts:40 POST /:agentId/skills Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a skill is installed by placing a SKILL.md folder in 'Context Agent/Skills' (assistant:lib/Service/AgentSkillsService.php:31) or by the agent's store_skill (context_agent:ex_app/lib/all_tools/skills.py:115-180); admins set a global folder (assistant:src/components/AdminSettings.vue:183-214). No one-action install from a catalogue." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a skill is installed by placing a SKILL.md folder in 'Context Agent/Skills' (assistant:lib/Service/AgentSkillsService.php:31) or by the agent's store_skill (context_agent:ex_app/lib/all_tools/skills.py:115-180); admins set a global folder (assistant:src/components/AdminSettings.vue:183-214). No one-action install from a catalogue.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-add-existing https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-create Add skill > Upload a skill (Markdown or ZIP with SKILL.md) or Generate with AI > Add to agent; one action per skill on the Build tab. Note: GitHub Copilot harness is a production-ready preview." } }, { @@ -2875,7 +3047,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "partial", "open-webui": "yes", @@ -2884,7 +3056,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/skill.json emptyAction.importDescription 'Bring a .zip with SKILL.md, in the agentskills.io format', errors.missingSkillMd; api/controllers/console/workspace/skills.py:385 import and :494 export of the package; agent-v-2.json skills.upload.warning.specification 'must follow the Agent Skills specification'", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Skills.svelte:272 import accepts .md, :306-312 parses SKILL.md frontmatter; backend/open_webui/utils/terminals.py:247 get_terminal_skill reads .agents/skills//SKILL.md directories with resources (:276); utils/skills.py:37 authoring standards (name, description frontmatter, scripts/ references/ assets/) Note: DB skills are single-file; full skill folders only through Open Terminal", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts reads SKILL.md with YAML frontmatter name and description plus markdown references (en.json:8064-8080), but :56-57 rejects a scripts/ folder, en.json:8070 'Scripts aren't supported for skills yet' Note: Imports agentskills.io-style SKILL.md without scripts. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skills follow the agentskills.io layout: folder with SKILL.md and YAML frontmatter name/description (context_agent:ex_app/lib/all_tools/skills.py:15-18, assistant:lib/Service/AgentSkillsService.php:33-37,156)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skills follow the agentskills.io layout: folder with SKILL.md and YAML frontmatter name/description (context_agent:ex_app/lib/all_tools/skills.py:15-18, assistant:lib/Service/AgentSkillsService.php:33-37,156).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-add-existing skills \"follow an open specification\" with progressive disclosure; accepted format is SKILL.md with name and description in YAML front matter plus Markdown, optionally scripts and resources (the agentskills.io shape). Note: GitHub Copilot harness is a production-ready preview." } }, { @@ -2905,7 +3078,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -2914,7 +3087,8 @@ "dify": "source read at 1.17.1, not driven: in Build mode the agent edits its own skills and files from the build conversation and holds them as a build draft to Apply (agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you'; api/controllers/console/agent/roster.py:876,941); the Skill Builder rewrites a skill on request (api/controllers/console/workspace/skills.py:516 assist/messages). Nothing proposes improvements from production runs Note: improves from the builder's build chat, not from what it learned in runs", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:35 SKILLS_CREATE_RE '/skills:create' makes the model distill the current chat into a SKILL.md and save it (:81-115), which can rewrite an existing skill; it runs only when a user types the command and needs an Open Terminal (:133); searched 'improve|propose|revision' in utils/skills.py and routers/skills.py: no agent-initiated proposals", "n8n": "source read at n8n@2.40.7, not driven: improvement runs through the builder assistant on request: en.json:653,657 'Fix with Assistant' sends failed tool calls from a preview to the builder, and eval reviews 'Send feedback to assistant' (en.json:8313); searched 'improve|propose' in packages/cli/src/modules/agents and packages/@n8n/agents/src/runtime/skills: no agent proposing skill revisions from its own runs Note: A person triggers the fix; the agent does not propose skill updates itself. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: store_skill can overwrite an existing skill ('created'|'overwritten', assistant:lib/Service/AgentSkillsService.php:187,218) but the prompt limits it to explicit user requests (context_agent:ex_app/lib/agent.py:178-182). No proposal from run learnings." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: store_skill can overwrite an existing skill ('created'|'overwritten', assistant:lib/Service/AgentSkillsService.php:187,218) but the prompt limits it to explicit user requests (context_agent:ex_app/lib/agent.py:178-182). No proposal from run learnings.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-manage searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"version|history|rollback|curat|maturity|GitHub|improv|learn\" in the four skills pages: skills change only when a maker edits or replaces them; no agent-proposed revisions." } }, { @@ -2935,7 +3109,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "partial", "open-webui": "no", @@ -2944,7 +3118,8 @@ "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/build-draft-changes-panel.tsx lists changed sections as Updated/Rewritten with Apply or Discard (build-draft-bar.tsx; roster.py:932 DELETE build-draft, :941 apply); skill drafts publish or restore (skills.py:678,703). Searched 'diff|compare' in web/i18n/en-US/skill.json and agent-v-2.json: no side-by-side difference Note: accept or reject yes, a visible diff no", "open-webui": "source read at v0.11.4, not driven: searched 'draft|diff|review|version|history' in backend/open_webui/routers/skills.py and models/skills.py: skills are edited in place (routers/skills.py:274 update); no proposed-change queue, diff or accept/reject (prompts have versions at routers/prompts.py:384, skills do not)", "n8n": "source read at n8n@2.40.7, not driven: builder edits land in a draft; the owner can preview, publish or 'Revert changes' to the published version (en.json:7765, packages/cli/src/modules/agents/agent-publish.controller.ts:21-111 publish, revert, versions); searched 'diff' in packages/frontend/editor-ui/src/features/agents: no side-by-side diff of a skill change Note: Accept or reject happens at agent level by publishing or reverting, without a diff. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: store_skill is a dangerous tool, so the user sees skill name, description and content in the confirmation card before it is written (assistant:src/components/ChattyLLM/AgencyAction.vue:6-17, AgencyConfirmation.vue:10-30). No diff against the old version." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: store_skill is a dangerous tool, so the user sees skill name, description and content in the confirmation card before it is written (assistant:src/components/ChattyLLM/AgencyAction.vue:6-17, AgencyConfirmation.vue:10-30). No diff against the old version.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-manage searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"version|history|rollback|curat|maturity|GitHub|improv|learn\" in the four skills pages: edit or replace overwrite the skill in place; no proposed-change diff with accept or reject." } }, { @@ -2965,7 +3140,7 @@ "featureConfidence": "low", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "no", "open-webui": "partial", @@ -2974,7 +3149,8 @@ "dify": "source read at 1.17.1, not driven: agent-v-2.json skills.tip 'In Build mode, the agent can set these up for you': the agent writes skills while the builder chats in Build mode (roster.py:846 build-draft/checkout); searched 'auto.?create|learn|after solving' in dify-agent/src: no path where an agent writes a skill on its own after a production run Note: only inside a builder-driven Build session", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/skills.py:81 _build_skill_create_prompt, default request 'the workflow we just went through in this conversation ... distill them into a reusable skill' (:84-86); triggered only by the user's /skills:create command and saved to the Open Terminal (:108), not on the agent's own initiative", "n8n": "source read at n8n@2.40.7, not driven: skills are created by the builder assistant only when a person asks (packages/cli/src/modules/agents/builder/skills/target-skills.skill.ts:9-19 create_skills; builder/agents-builder-prompts.ts:215); searched 'create_skills|write_skill' in packages/@n8n/agents/src: no runtime tool letting an agent write its own skill after a task", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent may store a skill on its own only when the user describes 'a clearly reusable procedure' (context_agent:ex_app/lib/agent.py:178-182), still behind confirmation (context_agent:ex_app/lib/all_tools/skills.py:116)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent may store a skill on its own only when the user describes 'a clearly reusable procedure' (context_agent:ex_app/lib/agent.py:178-182), still behind confirmation (context_agent:ex_app/lib/all_tools/skills.py:116).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-create searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"version|history|rollback|curat|maturity|GitHub|improv|learn\" in the four skills pages: \"Generate with AI\" drafts a skill from a maker's description; the agent never writes a skill on its own after a task." } }, { @@ -2995,7 +3171,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -3004,7 +3180,8 @@ "dify": "source read at 1.17.1, not driven: searched 'curator|merge skill|duplicate skill|archive unused|stale' in api/services/skill_management_service.py, api/schedule and web/i18n/en-US/skill.json: only manual duplicate and delete (api/controllers/console/workspace/skills.py:474, skill.json deleteDialog); no scheduled merge or archive", "open-webui": "source read at v0.11.4, not driven: searched 'curator|merge|archive|dedupe|unused' in backend/open_webui/routers/skills.py, models/skills.py, utils/skills.py and utils/automations.py: no scheduled job that merges or archives skills", "n8n": "source read at n8n@2.40.7, not driven: searched 'curator|archive|merge|unused' in packages/cli/src/modules/agents/agent-skills.service.ts, agents-skills.controller.ts and packages/@n8n/agents/src/runtime/skills: no scheduled merging of duplicate skills or archiving of unused ones", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'merge|archive|duplicate|curat' in assistant:lib/Service/AgentSkillsService.php and context_agent:ex_app/lib/all_tools/skills.py: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'merge|archive|duplicate|curat' in assistant:lib/Service/AgentSkillsService.php and context_agent:ex_app/lib/all_tools/skills.py: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-manage searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"version|history|rollback|curat|maturity|GitHub|improv|learn\" in the four skills pages: no scheduled merge or archive of skills; makers delete skills by hand." } }, { @@ -3025,7 +3202,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -3034,7 +3211,8 @@ "dify": "source read at 1.17.1, not driven: searched 'maturity|proven|rating|success rate|eval' in web/i18n/en-US/skill.json and api/services/skill_management_service.py: a skill shows only draft/published state, version number and 'Used by N agents' (skill.json detail.referencedBy_one, referenceCount); no maturity or proof signal Note: usage count is the only trust hint", "open-webui": "source read at v0.11.4, not driven: searched 'maturity|usage count|rating|verified|stable' in backend/open_webui/models/skills.py, routers/skills.py and src/lib/components/workspace/Skills*: a skill has name, description, content, meta, is_active (models/skills.py:20-32), no maturity or proof signal", "n8n": "source read at n8n@2.40.7, not driven: searched 'maturity|proven|usage count|success rate' in packages/cli/src/modules/agents/agent-skills.service.ts, agents-skills.controller.ts and packages/frontend/editor-ui/src/features/agents/components/AgentSkill*.vue: a skill has name, description, instructions, allowed tools and references only", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skill metadata is name and description only (assistant:lib/Service/AgentSkillsService.php:37); no usage or maturity data." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skill metadata is name and description only (assistant:lib/Service/AgentSkillsService.php:37); no usage or maturity data.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-overview searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"version|history|rollback|curat|maturity|GitHub|improv|learn\" in the four skills pages: no maturity, usage or proof indicator on a skill." } }, { @@ -3055,7 +3233,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "partial", "open-webui": "no", @@ -3064,7 +3242,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:743,758 versions list and detail, :703 restore a version to draft; web/i18n/en-US/skill.json detail.versions, versionPublishNote, restoreVersion. Searched 'compare|diff' in skill.json: no comparison of two versions Note: history and rollback yes, compare no", "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/skills.py and routers/skills.py: updates overwrite content (routers/skills.py:274); version history exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)", "n8n": "source read at n8n@2.40.7, not driven: skills live inside the agent config, so they ride the agent's publish history: packages/cli/src/modules/agents/agent-publish.controller.ts:87-111 revert-to-version and GET versions, en.json:7780-7797 'Publish history', 'Revert to this version'; searched 'diff|compare' in packages/frontend/editor-ui/src/features/agents: no comparison of two versions and no per-skill history Note: Roll back yes, compare no, and only at agent level. Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no skill versioning in the Assistant; SKILL.md is an ordinary Nextcloud file (assistant:lib/Service/AgentSkillsService.php:233-239), so server file versions apply (files_versions, not read)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no skill versioning in the Assistant; SKILL.md is an ordinary Nextcloud file (assistant:lib/Service/AgentSkillsService.php:233-239), so server file versions apply (files_versions, not read).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-manage searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"version|history|rollback|curat|maturity|GitHub|improv|learn\" in the four skills pages: \"Replace\" swaps the uploaded skill; no version history, compare or rollback." } }, { @@ -3085,7 +3264,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -3094,7 +3273,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 import takes only an uploaded zip (request.files['file']); searched 'github|repository|publish to' in api/services/skill_management_service.py and skill.json: no GitHub discovery, install or publish", "open-webui": "source read at v0.11.4, not driven: searched 'github|url' in backend/open_webui/routers/skills.py: no URL or GitHub install and no publish; GitHub raw loading exists only for tools and functions (routers/tools.py:247 github_url_to_raw_url, :264 /tools/load/url)", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts imports a local SKILL.md file or folder only (en.json:8062-8063); searched 'github' in that file and in packages/cli/src/modules/agents/agents-skills.controller.ts: no GitHub search, install or publish", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'github|git' in assistant:lib and context_agent:ex_app: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'github|git' in assistant:lib and context_agent:ex_app: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-add-existing searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"version|history|rollback|curat|maturity|GitHub|improv|learn\" in the four skills pages: skills come from a local file upload or AI generation; no GitHub discovery or publishing." } }, { @@ -3115,7 +3295,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -3124,7 +3304,8 @@ "dify": "source read at 1.17.1, not driven: searched 'lesson|learning|rule' in dify-agent/src, api/services/skill_management_service.py and web/i18n/en-US/skill.json: no mechanism that turns repeated run lessons into skill rules; the build note (agent-v-2.json files.buildNote) records build-session setup only", "open-webui": "source read at v0.11.4, not driven: searched 'learning|lesson|rule' in backend/open_webui/utils/skills.py, utils/memory.py and routers/skills.py: run lessons go to per-user memory (utils/memory.py:410), never into a skill's rules", "n8n": "source read at n8n@2.40.7, not driven: lessons from runs go into episodic memory, not into skill rules (packages/@n8n/agents/src/runtime/memory/episodic-memory.ts, observation-log-reflector.ts); searched 'learning|lesson|rule' in packages/cli/src/modules/agents/agent-skills.service.ts and packages/@n8n/agents/src/runtime/skills/active-skills.ts: nothing writes back to a skill", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'learn|lesson|rule' in skills code (assistant:lib/Service/AgentSkillsService.php, context_agent:ex_app/lib/all_tools/skills.py): none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'learn|lesson|rule' in skills code (assistant:lib/Service/AgentSkillsService.php, context_agent:ex_app/lib/all_tools/skills.py): none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/memory-overview searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"version|history|rollback|curat|maturity|GitHub|improv|learn\" in the four skills pages: memory stores per-user preferences, not rules added to a skill." } }, { @@ -3145,7 +3326,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "no", "open-webui": "yes", @@ -3154,7 +3335,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:494 /workspaces/current/skills//export returns the skill package; single files downloadable (web/i18n/en-US/skill.json detail.downloadFile)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/skills.py:123 GET /skills/export; src/lib/components/workspace/Skills/SkillMenu.svelte:16 per-skill Export, Skills.svelte:91 Export JSON (permission workspace.skills_export) Note: exports JSON, not SKILL.md", "n8n": "source read at n8n@2.40.7, not driven: the agent's 'Export JSON' (packages/frontend/editor-ui/src/features/agents/views/AgentBuilderView.vue:1413,1466-1475) writes the agent config, in which a skill is only a {type:'skill', id} reference (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:189-198); searched 'export|download' in AgentSkillViewer.vue and AgentSkillModal.vue: no skill file export", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no export action; each skill is a SKILL.md file in the user's Files (assistant:lib/Service/AgentSkillsService.php:31-33) that can be downloaded there." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no export action; each skill is a SKILL.md file in the user's Files (assistant:lib/Service/AgentSkillsService.php:31-33) that can be downloaded there.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-manage https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-overview \"You can download a skill to share it with others or back it up\"; it downloads as a Markdown file with YAML front matter; export as Markdown or package. Note: GitHub Copilot harness is a production-ready preview." } }, { @@ -3175,7 +3357,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "partial", @@ -3184,7 +3366,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/skills.py:385-409 the only import path is a multipart zip upload; searched 'url|source address|remote' in the skill import payload and skill.json: no install from an outside address", "open-webui": "source read at v0.11.4, not driven: skills import from a local .md or .json file (src/lib/components/workspace/Skills.svelte:272) and are read live from an attached Open Terminal's .agents/skills folder (backend/open_webui/utils/terminals.py:263 GET {terminal}/skills/{name}); searched 'url|load' in routers/skills.py: no install from an outside address", "n8n": "source read at n8n@2.40.7, not driven: skill import reads files the user selects (packages/frontend/editor-ui/src/features/agents/composables/useAgentSkillImport.ts, en.json:8062-8065); searched 'url|fetch(' in that file and 'source' in packages/cli/src/modules/agents/agents-skills.controller.ts: no install from an outside address", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'url|download|http' in assistant:lib/Service/AgentSkillsService.php: skills come only from the user's or the admin's folder." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'url|download|http' in assistant:lib/Service/AgentSkillsService.php: skills come only from the user's or the admin's folder.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-add-existing searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"URL|source address|from a link\" in skills pages: skills install only from an uploaded file or AI generation." } }, { @@ -3205,7 +3388,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -3214,7 +3397,8 @@ "dify": "source read at 1.17.1, not driven: searched 'evaluation|eval_set|test case' in api/controllers and web/i18n/en-US: only tracing-provider blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix 'evaluation') and dataset hit testing; no run of a skill against cases with and without it", "open-webui": "source read at v0.11.4, not driven: searched 'eval|test case|benchmark' in backend/open_webui/routers/skills.py, utils/skills.py and routers/evaluations.py: evaluations compare models by user feedback and arena ELO (routers/evaluations.py:222 leaderboard), nothing runs a skill against test cases with and without it", "n8n": "source read at n8n@2.40.7, not driven: test-case runs exist for workflows (packages/cli/src/evaluation.ee/test-runs.controller.ee.ts, Evaluation nodes in packages/nodes-base/nodes/Evaluation) and for Agents-module agents (packages/cli/src/modules/agent-evals/agent-evals.controller.ts, gated per user by PostHog flag in agent-evals-flag-gate.ts:17-24); searched 'with and without|baseline|skill' in packages/cli/src/modules/agent-evals: no with/without-skill comparison Note: Workflow evaluations count against the licence quota quota:evaluations:maxWorkflows (packages/@n8n/constants/src/index.ts:73); agent evals are an opt-in module behind a rollout flag.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'eval|test case' in both repos' runtime code: none (unit tests only cover parsing, assistant:tests/unit/Service/AgentSkillsServiceTest.php)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'eval|test case' in both repos' runtime code: none (unit tests only cover parsing, assistant:tests/unit/Service/AgentSkillsServiceTest.php).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-intro https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-results agent evaluations run test sets against an agent and compare multiple agent versions side by side, which can show a before/after for a skill; no skill-level with/without run." } }, { @@ -3236,7 +3420,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -3245,7 +3429,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/model_providers.py:148,200 provider list and credentials; web/i18n/en-US/common.json:378-379 'Please install a model provider first ... from the Marketplace': core ships no provider, OpenAI, Anthropic, Mistral etc. are official plugins (langgenius/dify-official-plugins models/openai, anthropic, mistralai, ...) Note: every provider is a marketplace plugin run by the plugin daemon; old yes rested on a feature line", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/ ships chat model nodes for OpenAI (LMChatOpenAi), Anthropic (LMChatAnthropic), Mistral (LmChatMistralCloud), Google Gemini/Vertex, AWS Bedrock, Azure OpenAI, Cohere, DeepSeek, Groq, xAI, OpenRouter and more (26 directories)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:129 native Anthropic model listing and :485 anthropic-version headers (utils/anthropic.py), :208 Azure AD auth, :890 Azure; any OpenAI-compatible provider such as OpenAI, Mistral, Groq, OpenRouter (README.md:28); admin UI src/lib/components/admin/Settings/Connections/OpenAIConnection.svelte Note: old partial rested on a feature row; the code connects OpenAI, Anthropic natively and Mistral through the compatible API", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant and agent call the instance's TaskProcessing task types (context_agent:ex_app/lib/nc_model.py:27,170-179); commercial providers are connected in integration_openai, which the admin page links (assistant:src/components/AdminSettings.vue:70-77). That app is not read." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant and agent call the instance's TaskProcessing task types (context_agent:ex_app/lib/nc_model.py:27,170-179); commercial providers are connected in integration_openai, which the admin page links (assistant:src/components/AdminSettings.vue:70-77). That app is not read.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-external-response-model https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-agent-model-availability agents pick OpenAI GPT models and Anthropic Claude (GA), Mistral and xAI (experimental, admin must accept terms); providers are brokered by Microsoft, not connected with the customer's own provider account." } }, { @@ -3266,7 +3451,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -3275,7 +3460,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 Ollama native /api/tags probe and LM Studio /api/v1/models with load-on-demand; hermes_cli/web_routers/local_models.py dashboard routes", "dify": "source read at 1.17.1, not driven: no local runtime in core (web/i18n/en-US/common.json:378 install a provider first); official plugins models/ollama, localai, xinference, openllm, triton_inference_server, huggingface_tei in langgenius/dify-official-plugins Note: marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/ollama.py full Ollama proxy with pull/manage (src/lib/components/admin/Settings/Connections/ManageOllamaModal.svelte), load balancing across URLs (:863 random.choice); openai.py:276 LM Studio provider; bundled :ollama image (README.md:26)", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatOllama and LMChatLemonade chat model nodes, EmbeddingsOllama for local embeddings; Ollama vendor node packages/@n8n/nodes-langchain/nodes/vendors/Ollama" + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatOllama and LMChatLemonade chat model nodes, EmbeddingsOllama for local embeddings; Ollama vendor node packages/@n8n/nodes-langchain/nodes/vendors/Ollama", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/bring-your-own-model-prompts https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-agent-model-availability searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"Ollama|local model|on-premises model|self-hosted model\": models are Microsoft-hosted, external-provider or Azure AI Foundry deployments; no local model server." } }, { @@ -3297,7 +3483,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -3306,7 +3492,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/model_setup_flows_custom.py:1-3 custom OpenAI-compatible endpoint wizard (custom_providers / providers.); plugins/model-providers/custom", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:865 GET /openai/models/{url_idx} over any configured base URL + key; src/lib/components/AddConnectionModal.svelte and admin/Settings/Connections/OpenAIConnection.svelte add arbitrary OpenAI-compatible endpoints", "dify": "source read at 1.17.1, not driven: official plugin langgenius/dify-official-plugins models/openai_api_compatible adds any OpenAI-compatible endpoint; core only provides the provider framework (api/controllers/console/workspace/model_providers.py:148) Note: marketplace plugin only", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/credentials/OpenAiApi.credentials.ts:35-36 'Base URL' field, :80 baseURL taken from it, so the OpenAI chat model node talks to any OpenAI-compatible server; OpenRouter and Vercel AI Gateway nodes too (nodes/llms/LmChatOpenRouter, LmChatVercelAiGateway)" + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/credentials/OpenAiApi.credentials.ts:35-36 'Base URL' field, :80 baseURL taken from it, so the OpenAI chat model node talks to any OpenAI-compatible server; OpenRouter and Vercel AI Gateway nodes too (nodes/llms/LmChatOpenRouter, LmChatVercelAiGateway)", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/bring-your-own-model-prompts prompts can use a model deployed in Azure AI Foundry (deployment name plus base model) and generative answers can use an Azure OpenAI deployment; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"OpenAI-compatible|base URL|custom endpoint\": no arbitrary endpoint." } }, { @@ -3328,7 +3515,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -3337,7 +3524,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'nextcloud|taskprocessing' repo-wide (excluding website/): none outside one test; no provider plugin for Nextcloud's AI task processing in plugins/model-providers/", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|taskprocessing' in api/ and web/: no hits; models come only from Dify provider plugins", "open-webui": "source read at v0.11.4, not driven: searched 'nextcloud|taskprocessing|task_processing' in backend/open_webui: no connection to Nextcloud AI task processing", - "n8n": "source read at n8n@2.40.7, not driven: n8n's own centrally set-up models can be reused: chat hub providers configured once by an admin (packages/@n8n/api-types/src/chat-hub.ts:574-585, packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:59) and 'Included in n8n' credit models (en.json:5450); searched 'nextcloud|taskprocessing' in packages/@n8n/nodes-langchain/nodes and packages/cli/src/modules: no provider backed by Nextcloud AI task processing Note: Missing Nextcloud part: TaskProcessing as a model source. Rewritten under the lane ruling of 2026-09-26 (was no)." + "n8n": "source read at n8n@2.40.7, not driven: n8n's own centrally set-up models can be reused: chat hub providers configured once by an admin (packages/@n8n/api-types/src/chat-hub.ts:574-585, packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:59) and 'Included in n8n' credit models (en.json:5450); searched 'nextcloud|taskprocessing' in packages/@n8n/nodes-langchain/nodes and packages/cli/src/modules: no provider backed by Nextcloud AI task processing Note: Missing Nextcloud part: TaskProcessing as a model source. Rewritten under the lane ruling of 2026-09-26 (was no).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompt-model-settings https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompts-overview Copilot Studio agents, Power Apps and Power Automate share the platform's managed models and prompt catalogue (AI Builder prompts); nothing reads models configured in Nextcloud TaskProcessing. Note: Nextcloud-phrased row: own platform surface." } }, { @@ -3359,7 +3547,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "partial", @@ -3368,7 +3556,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1-6 OpenAI-compatible /v1/chat/completions and /v1/responses serve the agent to any OpenAI client (per profile under /p//); searched 'nextcloud|taskprocessing' repo-wide: no Nextcloud provider registration Note: Another system can use Hermes as an OpenAI-compatible text model; there is no Nextcloud text-generation provider.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|task processing|text2text provider' in api/ and web/: nothing registers Dify apps as a provider for another platform's AI task framework; apps are reachable only through Dify's own service API (api/controllers/service_api/app/completion.py) and MCP (api/controllers/mcp/mcp.py:44)", "n8n": "source read at n8n@2.40.7, not driven: agents are offered to the rest of n8n: workflows call Agents-module agents (session origin 'Workflow', en.json agentSessions.origin.workflow) and outside tools reach them through the MCP call_agent tool (packages/cli/src/modules/mcp/mcp-scopes.ts:73); searched 'chat/completions' as a served route in packages/cli/src: none, so nothing registers with Nextcloud task processing Note: Missing Nextcloud part: registering as a TaskProcessing text provider. Rewritten under the lane ruling of 2026-09-26 (was no).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent registers providers for core:contextagent:interaction and its multimodal variant (context_agent:ex_app/lib/provider.py:20-35, main.py:119-121), so any Nextcloud app can hand work to the agent through TaskProcessing; the Assistant also registers its own providers (assistant:lib/TaskProcessing/*Provider.php). Note: It is offered as an agent task type, not as plain core:text2text." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent registers providers for core:contextagent:interaction and its multimodal variant (context_agent:ex_app/lib/provider.py:20-35, main.py:119-121), so any Nextcloud app can hand work to the agent through TaskProcessing; the Assistant also registers its own providers (assistant:lib/TaskProcessing/*Provider.php). Note: It is offered as an agent task type, not as plain core:text2text.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-node-workflow published agents serve other Microsoft surfaces: Microsoft 365 Copilot, and flows call an agent through the agent node or the Copilot Studio connector; no Nextcloud text generation provider. Note: Nextcloud-phrased row." } }, { @@ -3389,7 +3578,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -3398,7 +3587,8 @@ "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 each agent picks its own provider and model; each workflow LLM/Agent node and each classic app carries its own model config (api/controllers/console/app/model_config.py)", "n8n": "source read at n8n@2.40.7, not driven: each AI Agent node takes its own chat model sub-node (packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:46 ai_languageModel required); Agents-module agents store their own provider/model (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:446) and sub-agents can route by difficulty (:161-171); chat agents keep a model each (packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:107)", "open-webui": "source read at v0.11.4, not driven: each workspace model has its own base_model_id and params (backend/open_webui/models/models.py:118-120; ModelEditor.svelte:856); automations pick a model per task (models/automations.py:75 model_id, src/lib/components/automations/ModelDropdown.svelte)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: one agent; a different provider per task type is possible because each TaskProcessing type has its own preferred provider, shown as 'Provider: {name}' (assistant:src/components/AssistantTextProcessingForm.vue:64-73). Chosen in the server AI settings (not read), not per agent." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: one agent; a different provider per task type is possible because each TaskProcessing type has its own preferred provider, shown as 'Provider: {name}' (assistant:src/components/AssistantTextProcessingForm.vue:64-73). Chosen in the server AI settings (not read), not per agent.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-agent-model https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-select-agent-model each agent has its own primary model selected in its Model section / Build tab." } }, { @@ -3419,7 +3609,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "partial", @@ -3428,7 +3618,8 @@ "dify": "source read at 1.17.1, not driven: providers and credentials are per workspace (api/controllers/console/workspace/model_providers.py:148,200); api/controllers/console/workspace/models.py:519-545 enable/disable individual models for the workspace so its apps cannot pick them Note: per workspace; per-role model rights (permission-keys.json plugin.model_config) need enterprise RBAC", "open-webui": "source read at v0.11.4, not driven: model access is per user or group through access grants (backend/open_webui/utils/models.py:465 check_model_access, main.py:1151; admin/Settings/Models access control); searched 'tenant|organization' in backend/open_webui/routers and models: no tenant scope Note: group-level model allow-lists only; no organisation or tenant concept", "n8n": "source read at n8n@2.40.7, not driven: Chat hub admin settings restrict providers and models instance-wide (packages/@n8n/api-types/src/chat-hub.ts:574-584 enabled and allowedModels per provider, packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:59 GlobalScope chatHub:manage); per-project node type policies can block model nodes (packages/cli/src/modules/type-availability-policies/type-availability-policy-project.controller.ts:19-24, @Licensed NODE_TYPE_POLICIES) Note: Instance-wide for chat; per-project blocking is enterprise-licensed and in a module not loaded by default; no organisation tenancy.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'model|provider' policy settings in assistant:lib/Settings and context_agent:ex_app/lib/main.py: no per-organisation model limit." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'model|provider' policy settings in assistant:lib/Settings and context_agent:ex_app/lib/main.py: no per-organisation model limit.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-select-agent-model https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-external-response-model \"Administrators can allow or block makers from adding preview and experimental AI models\"; admins allow or remove external (Anthropic, Mistral, xAI) models in the Microsoft 365 admin center." } }, { @@ -3450,7 +3641,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -3459,7 +3650,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/models.py:205 default-model per model type (system reasoning, embedding, rerank, speech2text, tts) and :633 models by type; every app, node, knowledge base and generator picks its own model, so summaries and triage can run on different providers", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/config.py:2180 TASK_MODEL and :2182 TASK_MODEL_EXTERNAL for titles, tags, queries and autocomplete, set in src/lib/components/admin/Settings/Interface.svelte:180; separate engines per feature in admin Settings Audio, Images, Documents (embedding, reranker), WebSearch", "n8n": "source read at n8n@2.40.7, not driven: every AI node chooses its own model: Summarization Chain, Text Classifier, Information Extractor and AI Agent each take a separate chat model sub-node (packages/@n8n/nodes-langchain/nodes/chains/ChainSummarization, chains/TextClassifier, agents/Agent/utils.ts:46-59); Instance AI has its own model setting (packages/cli/src/modules/instance-ai/instance-ai-model.service.ts)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each feature is its own TaskProcessing task type (summary, chat with tools, image, speech) and the UI names the provider serving it (assistant:src/components/AssistantTextProcessingForm.vue:64-73, PersonalSettings.vue:52-60). Note: The per-type provider choice itself is in the server's AI admin settings (not read)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each feature is its own TaskProcessing task type (summary, chat with tools, image, speech) and the UI names the provider serving it (assistant:src/components/AssistantTextProcessingForm.vue:64-73, PersonalSettings.vue:52-60). Note: The per-type provider choice itself is in the server's AI admin settings (not read).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-agent-model https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompt-model-settings separate model settings for orchestration, deep reasoning, generative responses and each prompt in prompt builder." } }, { @@ -3481,7 +3673,7 @@ "featureConfidence": "low", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "partial", @@ -3490,7 +3682,8 @@ "dify": "source read at 1.17.1, not driven: api/core/model_manager.py:440-477,1003-1066 load balancing rotates credentials of the same model and cools down one on rate-limit or connection errors; off by default (api/configs/feature/__init__.py:813 MODEL_LB_ENABLED=False). A second provider only by wiring a fail branch to another LLM node (web/i18n/en-US/workflow.json nodes.common.errorHandle.failBranch) Note: same-model credential failover, not provider fallback", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1137-1147 ENABLE_CUSTOM_MODEL_FALLBACK (env.py:1035, off by default) swaps to the first default model only when a custom model's base model is missing; Ollama spreads requests over URLs (routers/ollama.py:863 random.choice) but does not retry another provider on an error; searched 'failover|retry' in routers/openai.py: none Note: no runtime failover when a provider call fails", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:37-40,118-119 'Enable Fallback Model' adds a second model input used when the primary fails", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'fallback|failover|retry' in context_agent:ex_app/lib/nc_model.py and assistant:lib/Service: scheduling is retried on connection errors and rate limits are waited out (nc_model.py:206-219), but no second provider. Server TaskProcessing not read." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'fallback|failover|retry' in context_agent:ex_app/lib/nc_model.py and assistant:lib/Service: scheduling is retried on connection errors and rate limits are waited out (nc_model.py:206-219), but no second provider. Server TaskProcessing not read.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-agent-model \"Agents also use the default model as a fallback if a selected model is turned off or unavailable\"; no configurable second provider on runtime errors." } }, { @@ -3512,7 +3705,7 @@ "featureConfidence": "low", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -3521,7 +3714,8 @@ "dify": "source read at 1.17.1, not driven: searched 'sensitiv|classification|pii|route.*model' in api/core/model_manager.py, api/core/moderation and dify-agent/src: no routing of data by sensitivity; only content moderation (api/core/moderation) that blocks or replaces text", "open-webui": "source read at v0.11.4, not driven: searched 'sensitiv|classification|pii|confidential' in backend/open_webui/utils/middleware.py, utils/models.py and main.py: routing follows the chosen model only; no data-classification based model selection", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/ModelSelector/ModelSelector.node.ts:73-124 routes to a model by rules on workflow data, and the Guardrails node detects PII (packages/@n8n/nodes-langchain/nodes/Guardrails); searched 'sensitiv|classification' in packages/cli/src/modules/agents: no built-in data-class-to-model policy Note: Must be hand-built from a Guardrails check plus Model Selector rules.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'sensitive|classification|confidential' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'sensitive|classification|confidential' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/sensitivity-label-copilot-studio sensitivity labels are shown on knowledge sources and answers; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"sensitivity.{0,40}model|route.{0,30}model\": no routing of labelled data to specific models (only a tenant-wide block of external models)." } }, { @@ -3543,7 +3737,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -3552,7 +3746,8 @@ "dify": "source read at 1.17.1, not driven: searched 'claude code|claude cli|anthropic cli' in api/, dify-agent/src and dify-agent-runtime: model turns go through provider plugins (dify-agent/src/dify_agent/layers/dify_plugin/llm_layer.py); no runner that drives the claude command line tool", "open-webui": "source read at v0.11.4, not driven: searched 'claude|subprocess|cli' in backend/open_webui/utils and routers: Anthropic is called over HTTP (utils/anthropic.py:15 ANTHROPIC_VERSION); no runner that shells out to the claude CLI in a container", "n8n": "source read at n8n@2.40.7, not driven: searched 'claude-code|claude code|claude-agent-sdk' in packages/cli/src, packages/@n8n/nodes-langchain/nodes, packages/@n8n/agents/src and packages/@n8n/instance-ai/src: none; Anthropic is reached only through its API (packages/@n8n/nodes-langchain/nodes/llms/LMChatAnthropic)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'claude|cli|subprocess' in context_agent:ex_app: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'claude|cli|subprocess' in context_agent:ex_app: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-external-response-model searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"claude code|command line|CLI\" in model pages: Anthropic models run as a Microsoft subprocessor inside the service; no CLI-in-container runner." } }, { @@ -3573,7 +3768,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -3582,7 +3777,8 @@ "dify": "source read at 1.17.1, not driven: model keys live once per workspace provider, encrypted, with named credentials and switching (api/controllers/console/workspace/model_providers.py:200,291; models.py:342,495); agents and apps reference the provider, never hold the key; api/models/credential_permission.py:1-35 limits which members may use a credential Note: per-member credential access needs enterprise RBAC (permission-keys.json credential.use)", "n8n": "source read at n8n@2.40.7, not driven: model keys are stored once as encrypted credentials (packages/core/src/encryption/cipher.ts:9-10 AES-256) and referenced by id from model nodes and agents (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:447 credential); external vaults via packages/cli/src/modules/external-secrets.ee (feat:externalSecrets, packages/@n8n/constants/src/index.ts:25) Note: The outside-vault option is enterprise-licensed; the built-in credential store is not.", "open-webui": "source read at v0.11.4, not driven: provider keys live once in admin connection config (backend/open_webui/routers/openai.py:360 get_openai_connection by url_idx, config.py:2829 openai.api_keys), set in src/lib/components/admin/Settings/Connections.svelte; agents reference a base model id, never a key (models/models.py:118); tool-server OAuth tokens Fernet-encrypted (utils/oauth.py:269) Note: central config store, not an external vault", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no key handling in the agent; model keys sit once per instance in the provider app's admin settings (integration_openai, not read) and the HERE key in the Context Agent admin form (context_agent:ex_app/lib/main.py:95-102). Central by construction, not a credential store." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no key handling in the agent; model keys sit once per instance in the provider app's admin settings (integration_openai, not read) and the HERE key in the Context Agent admin form (context_agent:ex_app/lib/main.py:95-102). Central by construction, not a credential store.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompt-model-settings https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-variables managed models need no keys at all; outside secrets live in environment variables that reference Azure Key Vault, and connections are stored centrally per environment." } }, { @@ -3603,7 +3799,7 @@ "featureConfidence": "high", "nextcloud-assistant": "unknown", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "yes", "open-webui": "yes", @@ -3612,7 +3808,8 @@ "dify": "source read at 1.17.1, not driven: searched 'personal credential|per.?user credential|end.?user.*credential' in api/core/tools, api/services/tools and web/i18n/en-US: credentials are workspace-level (api/controllers/console/workspace/model_providers.py:200) and runs use the app's configured credential; api/models/credential_permission.py only restricts who may use a shared credential", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/Connections.svelte:66 per-user Direct Connections (own endpoint and key), enabled by admin 'direct.enable' (backend/open_webui/config.py:230 ENABLE_DIRECT_CONNECTIONS); main.py:1164 _set_direct_model routes the user's runs through it Note: direct connections run from the browser session and are refused for sub-agents (utils/subagents.py:334)", "n8n": "source read at n8n@2.40.7, not driven: Chat hub lets each user pick a provider credential they own, checked per user (packages/cli/src/modules/chat-hub/chat-hub-credentials.service.ts:25-31 findCredentialForUser; packages/frontend/editor-ui/src/features/ai/chatHub/components/DynamicCredentialsDrawer.vue); workflows can resolve a credential per executing user with dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee, feat:dynamicCredentials) Note: Per-user resolution in workflows is enterprise-licensed.", - "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: assistant and context_agent handle no model keys at all (context_agent:ex_app/lib/nc_model.py:165-179 schedules server tasks); a per-user key would live in integration_openai, not read." + "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: assistant and context_agent handle no model keys at all (context_agent:ex_app/lib/nc_model.py:165-179 schedules server tasks); a per-user key would live in integration_openai, not read.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-external-response-model https://learn.microsoft.com/en-us/microsoft-copilot-studio/bring-your-own-model-prompts searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"own (API )?key|personal key|bring your own key\": model access is tenant or environment level, no per-person model key." } }, { @@ -3634,14 +3831,14 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "no", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant and agent send model calls only to the instance's own TaskProcessing (context_agent:ex_app/lib/nc_model.py:165-179); staying on premise needs a local provider (llm2, linked at assistant:src/components/AdminSettings.vue:64-66, not read). Web, weather and routing tools call outside services but can be switched off (context_agent:ex_app/lib/main.py:88-94). Note: Old 'yes' rested on a marketing line; the code makes it possible, not guaranteed.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 Ollama and LM Studio local servers; plugins/model-providers/custom any self-hosted OpenAI-compatible endpoint; tools/transcription_local.py and tools/tts_tool.py local Piper/NeuTTS keep voice on premise; Dockerfile self-hosting", - "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/geo-data-residency https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-external-response-model EU/EFTA tenants with all environments in EU regions are in scope of the EU Data Boundary; external models (Anthropic, Mistral, xAI) and Bing may process outside; no on-premises option. Note: Old no ignored the EU Data Boundary; still not on premise.", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml self-hosts the whole stack (api, worker, web, plugin daemon, sandbox, agent runtime, vector store); with a local model plugin (langgenius/dify-official-plugins models/ollama, localai, xinference) processing stays on premise Note: local model serving itself is a marketplace plugin", "n8n": "source read at n8n@2.40.7, not driven: self-hosted by design (docker/ images, packages/cli/src/commands/start.ts) with local models through LMChatOllama and LMChatLemonade (packages/@n8n/nodes-langchain/nodes/llms/), so all processing can stay on premise", "open-webui": "source read at v0.11.4, not driven: self-hosted server (README.md:26 pip, Docker, Kubernetes) with local inference via Ollama (backend/open_webui/routers/ollama.py) and local embeddings, Whisper STT and local TTS engines; nothing forces an outside call" @@ -3665,7 +3862,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "partial", @@ -3674,7 +3871,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 delivers job output to origin, home or explicit chat targets on connected platforms (telegram, discord, slack, matrix, mattermost, teams and more under plugins/platforms/); web/src/i18n/en.ts cron.deliverTo; searched 'nextcloud|spreed' repo-wide (excluding website/): none outside one test; plugins/platforms/ has no Talk adapter Note: Delivery into a team chat room works; Nextcloud Talk is not a target.", "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; no official plugin for Nextcloud Talk in langgenius/dify-official-plugins tools/ (only slack, teams, discord, dingtalk, wecom, telegraph)", "open-webui": "source read at v0.11.4, not driven: automation output can go to an Open WebUI channel: backend/open_webui/models/automations.py:68 AutomationTarget type 'channel', utils/automations.py:250 _execute_channel_automation, src/lib/components/automations/DestinationDropdown.svelte; searched 'talk|spreed|nextcloud' in backend/open_webui: no Nextcloud Talk Note: delivers to its own channels, not Talk", - "n8n": "source read at n8n@2.40.7, not driven: output goes to team chats of other products through Slack, Mattermost and Teams nodes (packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts, Mattermost/v1, Microsoft/Teams/v2); searched 'talk|spreed' in packages/nodes-base/nodes and packages/cli/src/modules/agents/integrations: no Nextcloud Talk target Note: Delivery into a team chat works; Nextcloud Talk is not a target." + "n8n": "source read at n8n@2.40.7, not driven: output goes to team chats of other products through Slack, Mattermost and Teams nodes (packages/nodes-base/nodes/Slack/V2/SlackV2.node.ts, Mattermost/v1, Microsoft/Teams/v2); searched 'talk|spreed' in packages/nodes-base/nodes and packages/cli/src/modules/agents/integrations: no Nextcloud Talk target Note: Delivery into a team chat works; Nextcloud Talk is not a target.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-proactive-message https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-teams-tools agents deliver output into Microsoft Teams chats and channels (proactive messages via the Teams connector in a flow, Teams MCP tools); no Nextcloud Talk. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -3695,7 +3893,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "partial", @@ -3704,7 +3902,8 @@ "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed' in api/ and web/: no hits; chat-app bridges exist only as plugin endpoints for other messengers (api/controllers/console/workspace/endpoint.py), none for Nextcloud Talk", "open-webui": "source read at v0.11.4, not driven: in Open WebUI channels a member @mentions a model and the reply lands in the room or thread: backend/open_webui/routers/channels.py:976 model_response_handler, :1244; src/lib/components/channel/MessageInput/MentionList.svelte; no Nextcloud Talk bridge Note: own channels only", "n8n": "source read at n8n@2.40.7, not driven: Agents module chat channels let people chat with an agent from Slack, Telegram, Discord and Linear with replies in place (packages/cli/src/modules/agents/agents.module.ts:81-96 registry; integrations/platforms/); workflows do the same with Slack or Telegram triggers; searched 'talk|spreed|nextcloud' in integrations/: no Talk adapter Note: Works in other chat apps (opt-in Agents module or hand-built workflows), not in Nextcloud Talk.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'bot|webhook|spreed' in assistant:lib and context_agent:ex_app: the agent can post to Talk but no Talk bot receives room messages. Talk bots from other Nextcloud apps are not in these repos." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'bot|webhook|spreed' in assistant:lib and context_agent:ex_app: the agent can post to Talk but no Talk bot receives room messages. Talk bots from other Nextcloud apps are not in these repos.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-microsoft-teams publish an agent to Teams so users chat with it in a Teams chat or channel and replies land there; not Nextcloud Talk. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -3726,7 +3925,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -3735,7 +3934,8 @@ "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|spreed|room' in api/ and web/: no Talk integration, so no agent-room grouping", "open-webui": "source read at v0.11.4, not driven: searched 'agent room|bot room|category' in backend/open_webui/models/channels.py and src/lib/components/channel: channels have types group/dm/standard, no marking or grouping of agent rooms apart from human ones", "n8n": "source read at n8n@2.40.7, not driven: on its own chat surfaces an agent gets its own space: in Slack each agent is its own app with its own direct messages (packages/cli/src/modules/agents/agent-slack-integrations.controller.ts:26-150 app creation and install; en.json:8408 'Agent name' shown in Slack), and n8n's chat lists agents under their own sidebar links (en.json:695-696); searched 'talk|spreed|nextcloud' in packages/cli/src/modules/agents/integrations: no Nextcloud Talk Note: Missing Nextcloud part: Talk rooms. Rewritten under the lane ruling of 2026-09-26 (was no).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent rooms exist; create_public_conversation makes an ordinary room (context_agent:ex_app/lib/all_tools/talk.py:38-39)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent rooms exist; create_public_conversation makes an ordinary room (context_agent:ex_app/lib/all_tools/talk.py:38-39).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-microsoft-teams in Teams the agent is its own app with its own chat, apart from human conversations; no Nextcloud Talk grouping. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -3756,7 +3956,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -3765,7 +3965,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: agent/outbound_webhooks.py:1-7 hooks.outbound entries POST lifecycle events (hermes_cli/plugins.py:108-118 post_llm_call, post_tool_call, on_stream_end ...) HMAC-SHA256 signed via X-Hermes-Signature-256; cron/scheduler_delivery.py:32 'webhook' is a cron delivery target", "dify": "source read at 1.17.1, not driven: a workflow HTTP Request node posts an agent's output to any URL with API-Key, Basic, Bearer or custom header auth (web/i18n/en-US/workflow.json:510-518 nodes.http.authorization.*); searched 'hmac|signature|sign' in workflow.json and the http node: no payload signing Note: outbound webhook yes, signed no", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/HttpRequest sends a run's output to any URL (also as the Respond to Webhook node); signing is hand-built with the Crypto node's HMAC (packages/nodes-base/nodes/Crypto); searched 'signature|hmac' in packages/nodes-base/nodes/HttpRequest: no built-in request signing Note: Outbound webhook yes; the signature must be wired by hand.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'webhook|hmac|signature' in both repos: signature.py only signs the conversation token (context_agent:ex_app/lib/signature.py); web_fetch is GET only (context_agent:ex_app/lib/all_tools/web.py:14-20)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'webhook|hmac|signature' in both repos: signature.py only signs the conversation token (context_agent:ex_app/lib/signature.py); web_fetch is GET only (context_agent:ex_app/lib/all_tools/web.py:14-20).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-http-node https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-flow agents send output to another system with the Send HTTP request node or a flow HTTP action (auth headers); searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"HMAC|signature|signed webhook\": no built-in payload signing." } }, { @@ -3787,7 +3988,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "no", @@ -3796,7 +3997,8 @@ "dify": "source read at 1.17.1, not driven: core sends mail only for Human Input requests (api/tasks/mail_human_input_delivery_task.py; web/i18n/en-US/workflow.json nodes.humanInput.deliveryMethod.emailConfigure.*) and account/comment mails (api/tasks/mail_*.py); sending an agent's output as an email needs the official email/gmail/outlook tool plugins Note: marketplace plugin for general delivery", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:32 'email' delivery target; plugins/platforms/email/plugin.yaml:5-8 IMAP/SMTP email adapter; web/src/i18n/en.ts cron.delivery.email on CronPage", "open-webui": "source read at v0.11.4, not driven: searched 'smtp|email|sendmail' in backend/open_webui/utils/notifications.py, utils/webhook.py, events.py and routers: notification targets accept type 'webhook' only (utils/notifications.py:34)", - "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/EmailSend/v2/EmailSendV2.node.ts SMTP send and Gmail/Outlook send operations (packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts) deliver an agent's output by email" + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/EmailSend/v2/EmailSendV2.node.ts SMTP send and Gmail/Outlook send operations (packages/nodes-base/nodes/Google/Gmail/v2/GmailV2.node.ts) deliver an agent's output by email", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-mail-tools https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors agents and agent flows send email through the Office 365 Outlook connector (GA) or Mail MCP tools (preview)." } }, { @@ -3817,7 +4019,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "yes", @@ -3826,7 +4028,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/events.py:669 NOTIFICATION_EVENTS chat.finished, chat.failed, channel.message, calendar.alert; src/routes/+layout.svelte:622 browser Notification, utils/automations.py:500 'automation:result' socket toast; src/lib/components/chat/Settings/Notifications.svelte:32-38 per-event choice Note: 'needs me' for a waiting approval surfaces only inside the open chat", "dify": "source read at 1.17.1, not driven: when a run needs a person, the Human Input node emails workspace members or externals (api/tasks/mail_human_input_delivery_task.py; workflow.json humanInput.deliveryMethod.emailConfigure.allMembers); api/controllers/console/notification.py:43 is only product announcements. Searched 'run finished|run completed|notify' in api/tasks and web/i18n/en-US: no notice when a run finishes Note: email when input is needed, nothing on completion, no in-app notification", "n8n": "source read at n8n@2.40.7, not driven: run alerts are hand-built: packages/nodes-base/nodes/ErrorTrigger starts a workflow when another fails, which can mail or post to chat; the push channel only refreshes open editors (packages/cli/src/modules/agents/agent-execution-update-broadcaster.ts:43); searched 'notification' in packages/nodes-base/nodes/NextCloud: none, the node has no notifications resource Note: No Nextcloud notification and no in-app inbox; an alert needs a workflow built for it.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: 'Get notified when the task finishes' (assistant:src/components/AssistantTextProcessingForm.vue:92, POST /api/v1/task/{id}/notify) and notifications for scheduled tasks succeeded, failed or pending review (assistant:lib/Notification/Notifier.php:341-401, lib/Service/NotificationService.php:138-166)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: 'Get notified when the task finishes' (assistant:src/components/AssistantTextProcessingForm.vue:92, POST /api/v1/task/{id}/notify) and notifications for scheduled tasks succeeded, failed or pending review (assistant:lib/Notification/Notifier.php:341-401, lib/Service/NotificationService.php:138-166).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-proactive-message https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals flows notify people in Teams (proactive message labelled \"Notification via\") and by approval emails when a run needs them; no Nextcloud notification. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -3847,7 +4050,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "yes", @@ -3856,7 +4059,8 @@ "dify": "source read at 1.17.1, not driven: searched 'delivery target|default delivery|preferred channel' in api/ and web/i18n/en-US: delivery is wired per workflow node (HTTP, tool plugins, Human Input delivery methods); no per-person default delivery setting", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/notifications.py:56 add target, :84 PUT /targets/{id}/default; utils/notifications.py:213 set_default_target; per-user settings in src/lib/components/chat/Settings/Notifications.svelte", "n8n": "source read at n8n@2.40.7, not driven: searched 'default delivery|deliveryTarget|preferred channel' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/api-types/src/agents: no per-user default delivery target; each workflow or agent names its own destination node or channel", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'target|deliver|default' in assistant:lib/Settings and PersonalSettings.vue: no default delivery setting." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'target|deliver|default' in assistant:lib/Settings and PersonalSettings.vue: no default delivery setting.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/publication-channels-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-proactive-message searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"default (channel|destination|delivery)|delivery preference\": delivery targets are set per flow action by the maker; no per-user default delivery setting." } }, { @@ -3878,13 +4082,13 @@ "featureConfidence": "low", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "partial", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/ telegram, slack, teams, discord, whatsapp, matrix, mattermost, sms, line, feishu, dingtalk, wecom, google_chat and more; gateway/platforms/signal.py Signal adapter; hermes_cli/subcommands/gateway.py setup and web/src/pages/ChannelsPage.tsx", - "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-connect-bot-to-azure-bot-service-channels https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-whatsapp https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-facebook standard harness agents publish to Teams, WhatsApp, Facebook Messenger and Azure Bot Service channels such as Slack and Telegram. Note: GitHub Copilot harness agents list Slack, WhatsApp, Telegram, Facebook as \"not currently available\". No Signal.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/endpoint.py plugin endpoints host chat bots; official extensions slack_bot and wecom_bot, triggers slack_trigger and telegram_trigger (langgenius/dify-official-plugins extensions/, triggers/), community microsoft-teams (langgenius/dify-plugins); nothing for Signal found Note: marketplace plugin only", "open-webui": "source read at v0.11.4, not driven: outbound only: utils/webhook.py:44-55 formats Slack, Google Chat, Discord and Microsoft Teams webhooks; searched 'telegram|signal|whatsapp|slack bot|bot token' in backend/open_webui: no inbound messenger adapter; chatting from Telegram or WhatsApp is the separate Open WebUI Computer project (README.md:94) Note: can post to Teams or Slack, cannot be reached from them", "n8n": "source read at n8n@2.40.7, not driven: Agents module channels for Slack, Telegram, Discord and Linear (packages/cli/src/modules/agents/agents.module.ts:81-96, en.json:8476-8477 Slack/Telegram help texts); workflows also start from Telegram, WhatsApp, Discord, Slack and Teams trigger nodes (packages/nodes-base/nodes/Telegram, WhatsApp, Discord, Slack, Microsoft/Teams) Note: Teams and Signal are not Agents-module channels; Teams works through workflow trigger nodes, Signal not at all.", @@ -3910,7 +4114,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -3919,7 +4123,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_delivery.py:1-2 scheduled job output delivered to a chat target; web/src/i18n/en.ts cron.namePlaceholder 'e.g. Daily summary' with deliverTo; skills/productivity/google-workspace/SKILL.md:27 daily brief procedure; hermes_cli/web_routers/cron.py:393 blueprints for ready-made automations", "dify": "source read at 1.17.1, not driven: a Schedule Trigger workflow (api/core/workflow/nodes/trigger_schedule/entities.py:10) can end in a chat-posting tool node, but the posting tools are marketplace plugins (official tools/slack/tools/send_message.yaml, teams send_channel_message.yaml) Note: schedule is core, the chat delivery is a plugin", "n8n": "source read at n8n@2.40.7, not driven: an Agents-module schedule runs an objective on cron (en.json:8112-8113 'Objectives the agent runs on a schedule') and a connected Slack or Discord channel gives the agent a send_channel_message action (packages/cli/src/modules/agents/integrations/integration-tool-definitions.ts:278); workflows do the same with Schedule Trigger plus Slack node Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a scheduled task can prompt the agent to post into Talk (suggestion at assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:366-367, context_agent:ex_app/lib/all_tools/talk.py:49-50), but posting is a dangerous tool, so each run stops at 'Scheduled task is pending review' (assistant:lib/Notification/Notifier.php:341-346)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a scheduled task can prompt the agent to post into Talk (suggestion at assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:366-367, context_agent:ex_app/lib/all_tools/talk.py:49-50), but posting is a dangerous tool, so each run stops at 'Scheduled task is pending review' (assistant:lib/Notification/Notifier.php:341-346).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-proactive-message https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-triggers-about a Recurrence-triggered flow posts proactive messages to Teams users or channels, so a scheduled digest reaches the team chat." } }, { @@ -3941,7 +4146,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -3950,7 +4155,8 @@ "dify": "source read at 1.17.1, not driven: searched 'dedup|collapse|identical|duplicate report' in api/core/workflow, api/services and web/i18n/en-US: no collapsing of repeated outputs into one with a count", "open-webui": "source read at v0.11.4, not driven: searched 'dedup|duplicate|collapse|count' in backend/open_webui/utils/notifications.py, events.py and utils/automations.py: each run and event is delivered separately; no collapsing of identical reports", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Transform/RemoveDuplicates/v2/RemoveDuplicatesV2.description.ts:11-13 'Remove items processed in previous executions' drops repeats across runs, and the Summarize node counts groups (packages/nodes-base/nodes/Transform/Summarize); searched 'dedupe|collapse' in packages/cli/src/modules/agents: no built-in collapse of identical reports into one with a count Note: Must be wired by hand in a workflow.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dedupe|duplicate|count' in assistant:lib/Service: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dedupe|duplicate|count' in assistant:lib/Service: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-proactive-message searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"dedup|duplicate (message|report)|collapse\": no collapsing of identical deliveries." } }, { @@ -3972,7 +4178,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -3981,7 +4187,8 @@ "dify": "source read at 1.17.1, not driven: searched 'nextcloud|dashboard widget' in api/ and web/: no widget that shows agent output on another product's dashboard; the app Overview/Monitoring pages (web/i18n/en-US/app-overview.json, agent-v-2.json monitoring.*) show usage metrics, not output", "open-webui": "source read at v0.11.4, not driven: searched 'dashboard|widget' in src/lib/components and src/routes: src/routes/(app)/home/+page.svelte is an empty shell, admin Analytics is usage stats; no widget showing agent output and no Nextcloud dashboard integration", "n8n": "source read at n8n@2.40.7, not driven: searched 'dashboard widget|nextcloud dashboard' in packages/nodes-base/nodes/NextCloud and packages/cli/src: no Nextcloud Dashboard widget; n8n's own Insights dashboard (packages/cli/src/modules/insights) shows execution counts, not agent output", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no dashboard widget registered in assistant:lib/AppInfo/Application.php:78-120 (capability, reference providers, notifier only); searched 'IWidget|Dashboard' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no dashboard widget registered in assistant:lib/AppInfo/Application.php:78-120 (capability, reference providers, notifier only); searched 'IWidget|Dashboard' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-viva-insights https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/analytics-overview agent analytics and a Viva Insights agents report are dashboards about agents, not agent output; agent output can reach Power BI or Teams through flows. No Nextcloud dashboard widget. Note: Nextcloud-phrased row: own Microsoft 365 surface." } }, { @@ -4004,7 +4211,7 @@ "defectCandidate": "SpeechController's transcribe/synthesise routes and the per-agent voice settings look built for a composer mic feature that has no frontend caller; worth confirming live whether a mic button exists anywhere the static search missed.", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -4013,7 +4220,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/transcription_tools.py with local (tools/transcription_local.py) and cloud (tools/transcription_cloud.py) speech-to-text; gateway/run_voice.py transcribes inbound voice messages on messaging platforms", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/audio.py:1251 POST /audio/transcriptions (local Whisper, OpenAI, Deepgram, Azure, Voxtral); routers/files.py:153-155 uploaded audio files are transcribed then indexed; chat/MessageInput/VoiceRecording.svelte", "dify": "source read at 1.17.1, not driven: api/core/tools/builtin_tool/providers/audio/tools/asr.py speech-to-text tool usable in workflows and agents; api/controllers/web/audio.py:62 audio-to-text for voice messages in chat Note: needs a speech2text model from a provider plugin", - "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/transcribe.operation.ts transcribes audio files to text; chat hub voice input turns speech into text (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatPrompt.vue:53)" + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/transcribe.operation.ts transcribes audio files to text; chat hub voice input turns speech into text (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatPrompt.vue:53)", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-consent-based-record voice agents convert caller speech to text and can record and transcribe calls with consent; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"transcrib.{0,20}(file|recording|voice message)\": no transcription of an uploaded recording." } }, { @@ -4039,7 +4247,7 @@ "n8n": "yes", "open-webui": "no", "evidence": { - "copilot-studio": "docs-only: competitor_features#31610 \"Multi-channel deployment: Publish agents to Teams, web, M365 Copilot Chat and custom apps.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-connect-bot-to-web-channels https://learn.microsoft.com/en-us/microsoft-copilot-studio/customize-default-canvas publish to a custom website with an embed code (iframe) or customise the web chat canvas; demo website for quick sharing.", "hermes-agent": "source read at v2026.9.24, not driven: searched 'embed.{0,20}(chat|widget)|chat.?widget|web.?chat' in plugin-catalog/, plugins/platforms/, gateway/platforms/, web/src: only the dashboard's own chat page; gateway/platforms/api_server.py:1178 cors_origins lets a site call the key-protected API but ships no embeddable widget or anonymous access", "dify": "source read at 1.17.1, not driven: web/public/embed.js floating chat bubble script and iframe embed chosen in web/i18n/en-US/app-overview.json:50-52 'Choose the way to embed chat app to your website', with pre-filled hidden inputs; agents have 'Embed Into Site' on their Access page (agent-v-2.json access.webApp.actions.embedIntoSite)", "open-webui": "source read at v0.11.4, not driven: searched 'embed|widget|anonymous|guest|public chat' in src/lib/components and backend/open_webui/routers/auths.py: every chat needs a signed-in user; the only embedding hook is an iframe postMessage handler for a logged-in session (src/lib/components/chat/Chat.svelte:1457 'Confirm Prompt from Embed') Note: no anonymous chat window for public websites", @@ -4071,7 +4279,7 @@ "open-webui": "yes", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1-12 dangerous-command and tool approval gate with a human decision engine; hermes_cli/commands.py:96-99 /approve and /deny in chat and gateway; hermes_cli/commands.py:187 /approvals mode; gateway/platforms/base_exec_approval.py approval prompts on messaging platforms", - "copilot-studio": "docs-only: competitor_features#31608 \"Human-in-the-loop approvals: Approval steps via Power Automate before actions execute.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals per tool \"Ask the end user before running\" confirmation (GA); agent flows hold on the Approvals connector (standard approvals GA; multistage and AI approval stages preview) until a person approves or rejects.", "dify": "source read at 1.17.1, not driven: Human Input workflow node pauses a run until a person picks one of the defined user actions, with delivery by web app or email and a timeout (web/i18n/en-US/workflow.json:583-636 nodes.humanInput.*; api/controllers/web/human_input_form.py:141); in Agent v2 an ask_human deferred tool lets the agent stop for a person (dify-agent/src/dify_agent/layers/ask_human/layer.py:1-12,63) Note: the gate is a node the builder places; no automatic hold on tool calls", "n8n": "source read at n8n@2.40.7, not driven: AI Agent tools can be gated behind a human-in-the-loop node: packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts:64-77 createHitlToolkit routes a gated tool through the HITL node until approved, packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/executeBatch.ts:57-61; Agents module per-tool 'Require approval' (en.json:7840-7841) with Approve/Reject cards (en.json:7676-7681)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/InputMenu.svelte:62 'Ask for approval': 'Stop before each tool call until you allow or deny it.'; backend/open_webui/utils/middleware.py:3613 pause_for_tool_approval holds the call; src/lib/components/common/ToolCallDisplay.svelte:250-271 Allow/Deny; utils/tool_approval.py:20 resolve_tool_call_output resumes or rejects", @@ -4096,7 +4304,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -4105,7 +4313,8 @@ "dify": "source read at 1.17.1, not driven: human input forms are reached one by one by token link (api/controllers/web/human_input_form.py:141, console/human_input_form.py:70 /form/human_input/); searched 'inbox|pending forms|awaiting' in web/i18n/en-US and api/controllers: no list of everything awaiting me", "open-webui": "source read at v0.11.4, not driven: searched 'requires_approval|pending approval|needsApproval' in src/routes and src/lib/components/layout: pending calls are shown only inside the chat message that raised them (common/ToolCallDisplay.svelte:244); no cross-chat approval inbox", "n8n": "source read at n8n@2.40.7, not driven: waiting runs are findable with the executions list 'Waiting' status (en.json:1621); Agents-module approvals appear as cards inside each conversation (en.json:7676-7684); searched 'inbox|pending approvals' in packages/frontend/editor-ui/src/features: no single inbox of actions awaiting my approval Note: Approvals are scattered across chats, channels and waiting executions.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: pending actions show inside each conversation, and scheduled tasks send a 'pending review' notification (assistant:lib/Notification/Notifier.php:341-363). No inbox across conversations." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: pending actions show inside each conversation, and scheduled tasks send a 'pending review' notification (assistant:lib/Notification/Notifier.php:341-363). No inbox across conversations.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals approvers respond through the Microsoft Teams Approvals app, Outlook or the Power Automate approvals center, which lists every pending approval. Note: Inbox belongs to Power Automate/Teams, shared with non-agent approvals." } }, { @@ -4127,7 +4336,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -4136,7 +4345,8 @@ "dify": "source read at 1.17.1, not driven: the Human Input form shows builder-written Form Content with inserted run variables (web/i18n/en-US/workflow.json:609-612 nodes.humanInput.formContent.*), and in Agent v2 the agent writes the question and fields itself (dify-agent/src/dify_agent/layers/ask_human/schema.py AskHumanToolArgs); nothing derives what the action touches automatically Note: context is what the builder or the model chooses to show", "open-webui": "source read at v0.11.4, not driven: the pending call shows tool name and its decoded arguments (src/lib/components/common/ToolCallDisplay.svelte:147 arguments, :246 'Allow {{NAME}}?'); the reasoning is whatever the model wrote before the call; searched 'reason|impact|touches' in utils/tool_approval.py and ToolCallDisplay.svelte: no statement of what the action touches or why Note: what and with which arguments, not why or blast radius", "n8n": "source read at n8n@2.40.7, not driven: the approval card names the tool and opens its arguments (en.json:7677 'The agent wants to run the {toolName} tool', 7682 'View tool details'); send-and-wait approval messages carry whatever the builder writes into them (packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:4-47); searched 'reason|impact|affects' in packages/frontend/editor-ui/src/features/agents/components/RichInteractionCard.vue and AgentConfirmationModal.vue: no stated reason or affected objects Note: Shows what will run and with which inputs, not why or what it touches.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each pending action shows the tool name and its arguments with More/Less (assistant:src/components/ChattyLLM/AgencyAction.vue:6-17) plus a hint to adjust the request instead (AgencyConfirmation.vue:76)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each pending action shows the tool name and its arguments with More/Less (assistant:src/components/ChattyLLM/AgencyAction.vue:6-17) plus a hint to adjust the request instead (AgencyConfirmation.vue:76).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent the approval request carries the title, details and attachments the maker wires in, and AI stages show decision and rationale; tool confirmations show the tool and its description. What the action touches is only shown if the maker builds it into the request." } }, { @@ -4157,7 +4367,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "no", @@ -4166,7 +4376,8 @@ "dify": "source read at 1.17.1, not driven: no risk scoring; a builder can route only some cases to a Human Input node with an IF/ELSE or classifier node, and the Agent v2 ask_human tool is called at the model's discretion (dify-agent/src/dify_agent/layers/ask_human/layer.py:56-78 prompt hint). Searched 'risk|threshold' in dify-agent/src and api/core/workflow: none Note: hand-built branching, no risk threshold setting", "open-webui": "source read at v0.11.4, not driven: tool_approval_mode is 'full' or 'ask' for all tool calls in a chat (src/lib/components/chat/MessageInput/InputMenu.svelte:54-64; backend/open_webui/utils/middleware.py:5934); searched 'approv|risk' in utils/tools.py and routers/tools.py: no per-tool or risk-based approval rule", "n8n": "source read at n8n@2.40.7, not driven: approval is chosen per tool: packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:382,408,429 requireApproval on custom, workflow and node tools and :283-293 MCP approval 'selected' tools (en.json:7846 'Ask selected'); in workflows only tools wired through a human-in-the-loop node are gated (packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts:64-77) Note: Static per-tool choice, no risk scoring.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tools are marked safe or dangerous per function (context_agent:ex_app/lib/all_tools/lib/decorator.py safe_tool/dangerous_tool); only dangerous ones interrupt (context_agent:ex_app/lib/graph.py:66-81), reads run without asking. Note: The split is fixed in code, not configurable." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tools are marked safe or dangerous per function (context_agent:ex_app/lib/all_tools/lib/decorator.py safe_tool/dangerous_tool); only dangerous ones interrupt (context_agent:ex_app/lib/graph.py:66-81), reads run without asking. Note: The split is fixed in code, not configurable.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent confirmation is switched on per tool, and conditional approvals or AI approval stages (preview) route routine requests automatically and escalate complex ones to people; no risk score threshold." } }, { @@ -4187,7 +4398,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -4196,7 +4407,8 @@ "dify": "source read at 1.17.1, not driven: searched 'nextcloud|talk|reaction' in api/ and web/: no Talk integration; approvals are answered only through the form link (api/controllers/web/human_input_form.py:141)", "open-webui": "source read at v0.11.4, not driven: searched 'reaction' with 'approv' in backend/open_webui/routers/channels.py and utils/tool_approval.py: channel reactions (events message.reaction_added) do not resolve tool calls; approval is only via the Allow/Deny buttons or POST /api/v1/chats/{id}/messages/{mid}/resolve (main.py:1893)", "n8n": "source read at n8n@2.40.7, not driven: one-tap approval inside chat apps other than Talk: packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:4,31 approval buttons in Telegram, packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts Slack approvals; searched 'talk|spreed' in packages/nodes-base/nodes: no Nextcloud Talk Note: Approve from Slack or Telegram, not from Talk.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: approval happens only through the chat UI or /chat/generate?agencyConfirm (assistant:lib/Controller/ChattyLLMController.php:491); searched 'reaction' in approval code: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: approval happens only through the chat UI or /chat/generate?agencyConfirm (assistant:lib/Controller/ChattyLLMController.php:491); searched 'reaction' in approval code: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals approvers approve or reject in the Teams Approvals app or Outlook actionable message; no Nextcloud Talk, and not by emoji reaction. Note: Nextcloud-phrased row." } }, { @@ -4218,7 +4430,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -4227,7 +4439,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/approval.py:1095-1110 request_tool_approval lets a plugin pre_tool_call hook hold any tool call, including send_message, for a human; searched 'draft.{0,30}(approv|review|hold)|confirm.{0,20}before.{0,10}send' in *.py: no built-in hold on agent-written replies Note: Holding outgoing messages needs a plugin hook; nothing ships that queues drafts for review.", "open-webui": "source read at v0.11.4, not driven: searched 'draft|hold|review before' in backend/open_webui/utils/automations.py, routers/channels.py and utils/middleware.py: answers are written straight to the chat or channel (utils/automations.py:250 channel post); only tool calls can be held (utils/middleware.py:3613)", "n8n": "source read at n8n@2.40.7, not driven: a sending tool can require approval before it runs (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:429 requireApproval on node tools such as Gmail or Send Email), and workflow agents can route replies through a Send and Wait approval node before the send step (packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts, packages/nodes-base/nodes/Telegram/hitl/) Note: Configured per tool or wired per workflow.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: send_email, send_message_to_conversation and reply_to_message are dangerous tools (context_agent:ex_app/lib/all_tools/mail.py:16, talk.py:49,137), so the drafted text is shown for confirmation before it is sent (assistant:src/components/ChattyLLM/AgencyAction.vue:6-17)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: send_email, send_message_to_conversation and reply_to_message are dangerous tools (context_agent:ex_app/lib/all_tools/mail.py:16, talk.py:49,137), so the drafted text is shown for confirmation before it is sent (assistant:src/components/ChattyLLM/AgencyAction.vue:6-17).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-request-for-information https://learn.microsoft.com/en-us/microsoft-copilot-studio/azure-openai-human-review makers can route an AI-generated draft through an approval or request-for-information step and prompt docs call for human review of output; no built-in hold on agent chat replies." } }, { @@ -4248,7 +4461,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "partial", @@ -4257,7 +4470,8 @@ "dify": "source read at 1.17.1, not driven: searched 'kill switch|disable all|pause all|emergency stop' in api/controllers/console and web/i18n/en-US: no workspace-wide stop; each app's web app and API are toggled separately (api/controllers/console/agent/roster.py:1013)", "open-webui": "source read at v0.11.4, not driven: admin 'Disable All' models (src/lib/components/workspace/Models.svelte:365, routers/models.py:881 toggle each) and the global automations switch (src/lib/components/admin/Settings/General.svelte:377 ENABLE_AUTOMATIONS, checked at utils/automations.py:105) stop new runs; running tasks are stopped one by one (main.py:2128 /api/tasks/stop/{id}, admin) Note: no single action that also halts in-flight runs", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/unpublish/workflow.ts:8-29 'n8n unpublish:workflow --all' deactivates every workflow from the server shell; packages/cli/src/executions/executions.controller.ts:118 POST /stopMany stops running executions; the chat hub and Instance AI have admin on/off switches (packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:73 PUT /enabled) Note: No single UI switch that stops every agent, and Agents-module agents are not covered by the CLI command.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: disabling the context_agent ExApp unregisters its providers so no agent run starts (context_agent:ex_app/lib/main.py:132-136) and the admin can turn the Assistant off (assistant_enabled, assistant:lib/Controller/ConfigController.php:67-75). Instance-wide app switches, no dedicated kill switch or per-organisation scope." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: disabling the context_agent ExApp unregisters its providers so no agent run starts (context_agent:ex_app/lib/main.py:132-136) and the admin can turn the Assistant off (assistant_enabled, assistant:lib/Controller/ConfigController.php:67-75). Instance-wide app switches, no dedicated kill switch or per-organisation scope.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-data-loss-prevention admins block Copilot Studio capabilities tenant-wide with data policies (published agents then error) and can turn off publishing of generative AI agents for the tenant; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"kill switch|all agents at once|emergency stop\": no single stop control." } }, { @@ -4279,7 +4493,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "yes", @@ -4288,7 +4502,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/app/completion.py:327 /agent//chat-messages//stop and workflow.py:1188 stop one running task; roster.py:1013 and web-app-access-card.tsx:254 switch the agent's surfaces off. No single control that stops all of one agent's running work at once Note: stop per run plus switch off per surface", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:881 POST /model/toggle sets is_active false and utils/models.py:210 drops inactive custom models from the served list; in-flight turns stop via main.py:2160 POST /api/tasks/chat/{chat_id}/stop and admin main.py:2128 /api/tasks/stop/{task_id}; automations pause at routers/automations.py:306", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/executions/executions.controller.ts:102-110 POST /:id/stop halts a running execution and :475 of packages/cli/src/workflows/workflows.controller.ts deactivates the workflow; Agents module: packages/cli/src/modules/agents/agent-chat.controller.ts:248 DELETE /:agentId/chat/runs/:runId stops a run and agent-publish.controller.ts:45 unpublishes", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a running Assistant task can be cancelled (assistant:src/components/TaskListItem.vue:60, AssistantTextProcessingForm.vue:99) and a scheduled task deleted (DELETE /assignments/{id}); no stop for one agent as a whole." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a running Assistant task can be cancelled (assistant:src/components/TaskListItem.vue:60, AssistantTextProcessingForm.vue:99) and a scheduled task deleted (DELETE /assignments/{id}); no stop for one agent as a whole.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-api-quarantine admins quarantine one agent through the Power Platform API; it immediately stops working in every channel except makers' testing, and can be unquarantined later. Note: API only." } }, { @@ -4309,7 +4524,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "partial", @@ -4318,7 +4533,8 @@ "dify": "source read at 1.17.1, not driven: api/core/moderation/input_moderation.py with keywords, openai_moderation and api providers (api/core/moderation/{keywords,openai_moderation,api}); api/core/moderation/base.py:10-20 DIRECT_OUTPUT blocks with a preset reply, OVERRIDDEN lets a custom API extension return rewritten inputs. No built-in PII or secret detector Note: blocking is built in; redaction only through a self-built API extension", "open-webui": "source read at v0.11.4, not driven: mechanism only: Filter functions run an inlet() on every request (backend/open_webui/utils/filter.py:212 process_filter_functions, global or per model via ModelEditor.svelte:1210 FiltersSelector); searched 'pii|presidio|redact|secret' in backend/open_webui: no shipped PII or secret filter, those are community Functions from openwebui.com Note: community Function, not core", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:71-72 'Sanitize Text' operation with PII (:138-156, all or selected entities) and secret-key detection (:174-200, strict/balanced/permissive), actions/checks/pii.ts and secretKeys.ts; placed before the AI Agent node in a workflow Note: A shipped node, placed by the builder in front of the agent.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'redact|pii|secret|filter' in context_agent:ex_app and assistant:lib/Service: prompts go to the provider unfiltered (context_agent:ex_app/lib/nc_model.py:97-157)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'redact|pii|secret|filter' in context_agent:ex_app and assistant:lib/Service: prompts go to the provider unfiltered (context_agent:ex_app/lib/nc_model.py:97-157).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-sensitive-data built-in blocking of prompt-injection (UPIA, XPIA); sensitive-variable masking keeps values out of transcripts and logs; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"redact.{0,40}(model|prompt)|PII filter\": no filter that strips personal data before the model sees it." } }, { @@ -4339,12 +4555,12 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "partial", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "partial", "evidence": { - "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/settings-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompt-model-settings Moderation level (Minimum to Maximum) filters unsafe responses per agent, and per prompt content moderation sensitivity; responsible AI filtering blocks answers. Note: Old partial rested on DLP, which governs connectors, not answers.", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:65-66 'Check Text for Violations' with keywords, jailbreak, NSFW, PII, topical alignment and URL checks (:99-273; actions/checks/*.ts), routing passing and failing text to separate outputs Note: Old partial rested on a Bedrock guardrail-version line; the Guardrails node checks output directly.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:108-111 transform_llm_output hook lets a plugin replace or block a final answer; plugins/security-guidance/README.md:1-10 bundled plugin flags dangerous code the agent writes (warns, still writes); gateway/response_filters.py:1-5 only suppresses intentional no-reply markers Note: No shipped content-rule check on answers; it takes a custom plugin hook.", "dify": "source read at 1.17.1, not driven: api/core/moderation/output_moderation.py moderates the streamed answer; web/i18n/en-US/app-debug.json:93-104 feature.moderation 'Moderate OUTPUT Content' with preset replies, keyword list, OpenAI moderation or API", @@ -4370,7 +4586,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -4379,7 +4595,8 @@ "dify": "source read at 1.17.1, not driven: searched 'risk|dangerous|destructive|sensitive tool' in api/core/tools, dify-agent/src and web/i18n/en-US/tools.json: tools carry no risk class and no extra checks per class", "open-webui": "source read at v0.11.4, not driven: searched 'risk|danger|sensitive' in backend/open_webui/models/tools.py, routers/tools.py, utils/tools.py and utils/tool_approval.py: tools carry no risk class; approval mode is uniform per chat (utils/middleware.py:5934)", "n8n": "source read at n8n@2.40.7, not driven: tools can be marked 'Require approval' one by one (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:382,408,429; en.json:7840-7841); searched 'risk|riskLevel|dangerous' in packages/cli/src/modules/agents and packages/@n8n/api-types/src/agents: no risk classes for tools and no stronger checks tied to a class Note: Per-tool approval, no risk classification.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every tool is classed safe or dangerous in code (context_agent:ex_app/lib/all_tools/lib/decorator.py), MCP tools always dangerous (context_agent:ex_app/lib/tools.py:48); dangerous ones require confirmation (context_agent:ex_app/lib/graph.py:81). Note: Two fixed classes, not admin-set." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every tool is classed safe or dangerous in code (context_agent:ex_app/lib/all_tools/lib/decorator.py), MCP tools always dangerous (context_agent:ex_app/lib/tools.py:48); dangerous ones require confirmation (context_agent:ex_app/lib/graph.py:81). Note: Two fixed classes, not admin-set.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/external-security-provider https://learn.microsoft.com/en-us/power-platform/admin/advanced-connector-policies data policies classify connectors (business, non-business, blocked) and advanced connector policies restrict actions; an external threat-detection webhook (preview) can block any tool call. No per-tool risk level with extra checks." } }, { @@ -4400,7 +4617,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -4409,7 +4626,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/website_policy.py:1-5 security.website_blocklist enforced on URL-capable tools; hermes_cli/proxy_cli.py:234-254 iron-proxy allowed_hosts plus default-deny CIDRs for sandboxed terminals (tools/environments/docker_egress.py:1-5); hermes_cli/subcommands/egress.py:10-15 `hermes egress` Note: The host allowlist applies to the Docker sandbox through iron-proxy (off by default); the web tools use a blocklist.", "dify": "source read at 1.17.1, not driven: docker/ssrf_proxy/squid-agent.conf.template routes the agent sandbox through Squid, denying private networks but 'External internet is allowed' (http_access allow all); docker/ssrf_proxy/squid.conf.template does the same for HTTP nodes and tools. No per-agent allowlist of web addresses in the UI Note: blocks internal addresses, not a public-web allowlist; an admin can hand-edit the Squid config", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/ssrf-protection.config.ts:91-146 SSRF protection (off by default) blocks private IP ranges and N8N_SSRF_BLOCKED_HOSTNAMES instance-wide; credentials can restrict HTTP Request domains (packages/workflow/src/credential-domain-restrictions.ts:10-20 allowedHttpRequestDomains); searched 'allowlist|egress' in packages/cli/src/modules/agents: no per-agent list of allowed web addresses Note: Instance-wide blocking and per-credential domains; nothing per agent.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the admin can switch off the Web access, DuckDuckGo, YouTube, weather and routing categories (context_agent:ex_app/lib/main.py:88-94); when on, web_fetch reaches any URL (context_agent:ex_app/lib/all_tools/web.py:14-20). No allow-list." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the admin can switch off the Web access, DuckDuckGo, YouTube, weather and routing categories (context_agent:ex_app/lib/main.py:88-94); when on, web_fetch reaches any URL (context_agent:ex_app/lib/all_tools/web.py:14-20). No allow-list.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-data-loss-prevention https://learn.microsoft.com/en-us/power-platform/admin/connector-endpoint-filtering data policy endpoint filtering allows or denies specific HTTP, SharePoint and website endpoints; \"Block HTTP requests\"; computer use tools take an allow list of websites and apps." } }, { @@ -4431,7 +4649,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "yes", "open-webui": "no", @@ -4440,7 +4658,8 @@ "dify": "source read at 1.17.1, not driven: searched 'anonymi|presidio|redact|pii' in api/core and web/i18n/en-US: only redaction of the agent backend request in logs (api/core/app/apps/agent_app/runtime_request_builder.py:34); no document anonymisation before the model reads it, and none in the official tool list (langgenius/dify-official-plugins tools/)", "open-webui": "source read at v0.11.4, not driven: searched 'anonymi|pseudonym|redact|presidio|pii' in backend/open_webui (routers, utils, retrieval): documents are extracted and embedded as-is (routers/retrieval.py); anonymising needs a community Filter function", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/Guardrails/description.ts:71-72,138-156 'Sanitize Text' replaces detected PII in text before it reaches a model; document text comes from the Extract From File node (packages/nodes-base/nodes/Files/ExtractFromFile) Note: Works on extracted text; wired in the workflow before the model step.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'anonym|pseudonym|redact' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'anonym|pseudonym|redact' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-sensitive-data https://learn.microsoft.com/en-us/microsoft-copilot-studio/sensitivity-label-copilot-studio searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"anonymi|pseudonymi|redact\": masking covers transcripts and logs only; no anonymising of a document before a model reads it." } }, { @@ -4461,7 +4680,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -4470,7 +4689,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SessionsPage.tsx browses every past session with tool messages (web/src/i18n/en.ts sessions.roles.tool) and an Automation filter for cron runs; hermes_cli/subcommands/approvals.py:13-23 `approvals suggest` mines past approval decisions; searched 'oversight|audit page' in web/src: none Note: After-the-fact review means reading transcripts; no oversight page that lists AI decisions for review.", "open-webui": "source read at v0.11.4, not driven: admins browse any model's conversations and messages: backend/open_webui/routers/analytics.py:285 /models/{id}/chats, :125 /messages, src/lib/components/admin/Analytics/AnalyticsModelModal.svelte; user feedback review in admin Evaluations (Feedbacks.svelte); no decision log with review status or sign-off Note: transcript browsing, not a structured oversight workflow", "n8n": "source read at n8n@2.40.7, not driven: past runs can be reviewed in the executions list and per-run logs (packages/frontend/editor-ui/src/features/execution/executions, logs/components/LogsPanel.vue) and in Agents-module session timelines (packages/frontend/editor-ui/src/features/agents/views/AgentSessionTimelineView.vue); searched 'oversight|review decision' in packages/frontend/editor-ui/src/features: no page that gathers AI decisions for review Note: Run history exists; there is no oversight page for AI decisions.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'oversight|review|audit' in assistant:lib and src: no after-the-fact review page; only the user's own task list (assistant:src/components/TaskList.vue)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'oversight|review|audit' in assistant:lib and src: no after-the-fact review page; only the user's own task list (assistant:src/components/TaskList.vue).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-transcripts-studio AI approval stage decisions and rationale are reviewable in the approvals center, transcripts and the activity map review conversations after the fact; no dedicated oversight page for AI decisions." } }, { @@ -4491,7 +4711,7 @@ "featureConfidence": "low", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -4500,7 +4720,8 @@ "dify": "source read at 1.17.1, not driven: searched 'automation bias|rubber.?stamp|approval rate|approve all' in api/ and web/i18n/en-US: no tracking of how reviewers answer Human Input forms", "open-webui": "source read at v0.11.4, not driven: searched 'bias|rubber|approve all|approval rate' in backend/open_webui/utils/tool_approval.py, utils/middleware.py and src/lib/components/common/ToolCallDisplay.svelte: approvals are not counted or analysed per reviewer", "n8n": "source read at n8n@2.40.7, not driven: searched 'automation bias|rubber|approval rate|approve all' in packages/cli/src/modules/agents, packages/frontend/editor-ui/src/features/agents and packages/core/src/execution-engine/node-execution-context/utils/get-input-connection-data.ts: approvals are recorded per call only, with no warning about approving without looking", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'bias|approve all|rubber' in assistant:src/components/ChattyLLM: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'bias|approve all|rubber' in assistant:src/components/ChattyLLM: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"automation bias|rubber.?stamp|approve everything\": no warning about reviewers approving without looking." } }, { @@ -4522,7 +4743,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -4531,7 +4752,8 @@ "n8n": "source read at n8n@2.40.7, not driven: tool calls are reviewable per run: session timelines with tool rows and a tool filter (packages/frontend/editor-ui/src/features/agents/components/SessionTimelineTable.vue, SessionEventFilter.vue) and workflow logs (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue); every AI tool call is an event 'n8n.ai.tool.called' (packages/cli/src/eventbus/event-message-classes/index.ts:35); searched 'flag|misuse' in features/agents: no way to flag a tool call Note: Review yes, flagging misuse no.", "dify": "source read at 1.17.1, not driven: tool calls are visible per message and per run in the logs (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38, workflow run detail via api/controllers/console/app/workflow_run.py) and a reviewer can mark answers with admin feedback or annotations (api/controllers/console/app/annotation.py); searched 'misuse|flag tool' in api/: no tool-level flagging Note: review yes, flagging misuse per tool no", "open-webui": "source read at v0.11.4, not driven: per-user 'Most used tools' in src/lib/components/chat/Settings/Usage.svelte:472 (routers/chats.py:307 /stats/usage); admins read tool calls inside any conversation (routers/analytics.py:125 /messages, :285 model chats); searched 'flag|misuse|report' in routers/analytics.py and routers/tools.py: no flagging Note: tool use is visible, misuse cannot be flagged", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each answer lists the tools it used (assistant:src/components/ChattyLLM/Message.vue:54-72) for the user themselves; no admin review or misuse flag." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each answer lists the tools it used (assistant:src/components/ChattyLLM/Message.vue:54-72) for the user themselves; no admin review or misuse flag.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace https://learn.microsoft.com/en-us/microsoft-copilot-studio/external-security-provider activity trace shows each tool call with its inputs; external threat detection (preview) flags and blocks suspicious tool use; Purview audit logs runtime events. No review screen that flags misuse after the fact." } }, { @@ -4553,7 +4775,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -4562,7 +4784,8 @@ "dify": "source read at 1.17.1, not driven: every run, node execution and agent thought is stored (api/models/workflow.py node executions, message agent thoughts) but rows are deletable by retention jobs (api/services/retention/conversation/messages_clean_service.py:566); audit events are emitted as log lines for the Enterprise OTel exporter only (api/controllers/openapi/_audit.py:1-6; api/enterprise/telemetry/README.md 'only available in ENTERPRISE') Note: records exist, not tamper-proof; audit stream is enterprise-licensed", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/audit.py:36 AuditLogEntry middleware writes HTTP requests (with user, path, body up to MAX_BODY_LOG_SIZE) to DATA_DIR/audit.log via utils/logger.py:200 with rotation; off by default (env.py:1236 AUDIT_LOG_LEVEL 'NONE'); plain rotating file, not tamper-evident, and tool calls are only inside chat records Note: request-level audit, not immutable, off by default", "n8n": "source read at n8n@2.40.7, not driven: runs are stored as executions and AI tool calls emit 'n8n.ai.tool.called' events (packages/cli/src/eventbus/event-message-classes/index.ts:16,35); the append-only copy lives outside n8n only when log streaming is on, packages/cli/src/modules/log-streaming.ee/log-streaming.controller.ts:46 @Licensed('feat:logStreaming'); executions are prunable and deletable (packages/@n8n/config/src/configs/executions.config.ts:106-111) Note: Local history can be deleted or pruned; a tamper-evident trail needs the enterprise-licensed log streaming to an outside store.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent logs task inputs to the Nextcloud log (context_agent:ex_app/lib/main.py:169-178) and messages keep tool names (assistant:lib/Listener/ChattyLLMTaskListener.php:97-98); searched 'audit|immutable' in both repos: no tamper-proof trail." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent logs task inputs to the Nextcloud log (context_agent:ex_app/lib/main.py:169-178) and messages keep tool names (assistant:lib/Listener/ChattyLLMTaskListener.php:97-98); searched 'audit|immutable' in both repos: no tamper-proof trail.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-logging-copilot-studio https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-and-governance Purview audit logs authoring and usage events; \"agent invocation events, tool and action calls, policy enforcement decisions\" flow into Purview audit; collection cannot be disabled. Immutability of records is not stated in these pages. Note: Purview audit needs Microsoft 365 licences; logs sit outside Copilot Studio." } }, { @@ -4583,7 +4806,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -4592,7 +4815,8 @@ "dify": "source read at 1.17.1, not driven: api/commands/retention.py:1591 export-app-messages CLI to JSONL.GZ per app (no tool calls); api/controllers/console/workflow_run_archive.py:93-130 run archive download is Cloud paid-plan only; Enterprise OTel exporter (api/enterprise/telemetry/exporter.py) ships audit logs Note: CLI message export in community; fuller audit export is cloud or enterprise", "open-webui": "source read at v0.11.4, not driven: the audit trail is the file at env.py:1226 AUDIT_LOGS_FILE_PATH (utils/logger.py:200) that an operator can copy; searched 'audit' in backend/open_webui/routers and src/lib/components/admin: no export endpoint or UI; chat data export exists (routers/chats.py:1049 /all/db admin)", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/log-streaming.ee/destinations/ streams audit and AI events to syslog, webhook or Sentry, licence-gated at log-streaming.controller.ts:46,57 @Licensed('feat:logStreaming'); executions can be exported per run through the public API (packages/cli/src/public-api/v1/handlers/executions/spec/paths/getExecutions.generated.yml:18) Note: Enterprise-licensed; no one-file audit export for an auditor.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'export|audit' in assistant:lib: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'export|audit' in assistant:lib: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-logging-copilot-studio https://learn.microsoft.com/en-us/purview/ai-copilot-studio audit events are searchable in the Purview Audit solution and available through the Office 365 Management API; eDiscovery can export Copilot Studio interactions." } }, { @@ -4614,7 +4838,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -4623,7 +4847,8 @@ "dify": "source read at 1.17.1, not driven: api/configs/feature/__init__.py:1425 ENABLE_CLEAN_MESSAGES and :1623-1624 WORKFLOW_LOG_CLEANUP_ENABLED / WORKFLOW_LOG_RETENTION_DAYS; api/schedule/clean_messages.py:17-23 'Self-hosted editions delete all messages within the configured time range'; api/schedule/clean_workflow_runlogs_precise.py Note: instance-wide environment settings, off by default, no per-workspace or per-agent setting in the UI", "open-webui": "source read at v0.11.4, not driven: searched 'retention|older_than|prune|expire|ttl' in backend/open_webui/routers, models/chats.py and config.py: no chat or run retention period; ENABLE_KNOWLEDGE_FILE_RETENTION (config.py:985) only keeps files when removed from a knowledge base; temporary chats that are never stored can be enforced per user ('temporary_enforced' permission)", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/config/src/configs/executions.config.ts:106-126 EXECUTIONS_DATA_PRUNE (on by default), EXECUTIONS_DATA_MAX_AGE 336 hours and max count 10,000 with a hard-delete buffer; agent checkpoints expire after N8N_AGENTS_CHECKPOINT_TTL (packages/@n8n/config/src/configs/agents.config.ts:38-39) Note: Set by the operator in environment variables, not in the UI.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'retention|expire|cleanup' in assistant:lib: chats are kept until deleted by the user or on user deletion (assistant:lib/Listener/UserDeletedListener.php:42-48)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'retention|expire|cleanup' in assistant:lib: chats are kept until deleted by the user or on user deletion (assistant:lib/Listener/UserDeletedListener.php:42-48).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-transcript-controls https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-transcripts-powerapps https://learn.microsoft.com/en-us/purview/ai-copilot-studio admins turn transcript saving off per environment; a Dataverse bulk-delete job removes transcripts older than a set age; Purview retention policies retain or delete Copilot Studio interactions." } }, { @@ -4645,7 +4870,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -4654,7 +4879,8 @@ "dify": "source read at 1.17.1, not driven: searched 'register|risk class|ai act|inventory' in api/models, api/services and web/i18n/en-US: no register of AI features with a risk class", "open-webui": "source read at v0.11.4, not driven: searched 'register|risk class|ai act|inventory' in backend/open_webui/models and src/lib/components/admin: no register of AI features with a risk class", "n8n": "source read at n8n@2.40.7, not driven: searched 'ai register|risk class|AI Act|inventory' in packages/cli/src and packages/frontend/editor-ui/src: no register of AI features with a risk class", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'register|risk' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'register|risk' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-agent-inventory agent inventory lists every Copilot Studio and Agent Builder agent tenant-wide with owner, channels and capabilities; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"risk class|risk level|register\" in admin pages: no AI-feature register with risk class." } }, { @@ -4676,7 +4902,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -4685,7 +4911,8 @@ "dify": "source read at 1.17.1, not driven: searched 'risk|ai act|high.?risk|classification' in api/models/agent.py, api/models/model.py and web/i18n/en-US: agents and apps carry no risk level field", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models carry no risk-level field (backend/open_webui/models/models.py:74 ModelMeta)", "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no EU AI Act risk classification of agents", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'AI Act|risk class|high-risk' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'AI Act|risk class|high-risk' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-agent-inventory https://learn.microsoft.com/en-us/purview/ai-copilot-studio searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"EU AI Act|risk class|high-risk\": no per-agent AI Act classification; Purview Compliance Manager templates assess the organisation, not a single agent." } }, { @@ -4707,7 +4934,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -4716,7 +4943,8 @@ "dify": "source read at 1.17.1, not driven: searched 'dpo|data protection officer|sign.?off|go.?live approval' in api/ and web/i18n/en-US: publishing an agent needs only edit/publish permission (api/controllers/console/agent/roster.py:815), no sign-off step", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; publishing a model is immediate on save (routers/models.py:285), no sign-off step", "n8n": "source read at n8n@2.40.7, not driven: workflow reviews let an author request named reviewers (packages/@n8n/db/src/entities/workflow-review-request-reviewer.ee.ts) and block publishing while a review is open or changes are requested (packages/cli/src/modules/workflow-reviews.ee/workflow-review-publish-guard.service.ts:8-22), licence-gated by feat:workflowReviews (packages/@n8n/constants/src/index.ts:58); searched 'data protection officer|DPIA|high-risk' in packages/cli/src: no DPO role or risk trigger Note: A DPO can be named as reviewer by hand; nothing ties sign-off to high-risk features. Enterprise-licensed.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dpo|sign off|approval' in assistant:lib/Settings: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dpo|sign off|approval' in assistant:lib/Settings: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-platform/alm/extend-pipelines https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-solutions-overview Power Platform pipelines can require an approval before deployment (delegated deployment, pre-deployment step), which a DPO could give; nothing specific to high-risk features or DPO roles." } }, { @@ -4739,7 +4967,7 @@ "defectCandidate": "ComplianceDashboard.vue and its only two API calls (dashboard, export) are dead code per an explicit comment in src/customComponents.js; the backend routes still exist and work if called directly.", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -4748,7 +4976,8 @@ "dify": "source read at 1.17.1, not driven: searched 'iso 42001|42001|control framework|ai act' in api/ and web/i18n/en-US: nothing checks the organisation against a framework; web/i18n/en-US/common.json:124-125 only lists Dify's own vendor certificates (GDPR DPA, ISO 27001)", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no control framework checks anywhere in admin settings", "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768); the security audit checks instance hygiene (packages/cli/src/security-audit/risk-reporters/ credentials, database, filesystem, instance, nodes), not a control framework", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'ISO|42001|control' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'ISO|42001|control' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/purview/ai-copilot-studio Purview Compliance Manager \"provides regulatory templates to help you assess, implement, and strengthen your compliance requirements for all generative AI apps\" (EU AI Act, ISO 42001 templates). Note: Purview Compliance Manager premium templates, separate licence." } }, { @@ -4769,7 +4998,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -4778,7 +5007,8 @@ "dify": "source read at 1.17.1, not driven: searched 'fact ?sheet|model card|system card' in api/ and web/i18n/en-US: no generated fact sheet of an agent's model, data and purpose; the closest is DSL export of its configuration (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52)", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the nearest artefact is the model JSON export (routers/models.py:381) and the description field (ModelEditor.svelte:962), not a generated fact sheet", "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no generated fact sheet for an agent's model, data and purpose", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'factsheet|model card' in both repos: only the app store 'Ethical AI Rating' text in context_agent:appinfo/info.xml description, not generated per agent." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'factsheet|model card' in both repos: only the app store 'Ethical AI Rating' text in context_agent:appinfo/info.xml description, not generated per agent.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-agent-inventory the inventory exposes per-agent metadata (creator, owner, channels, authentication, knowledge and tool capabilities) through the admin center, API and Azure Resource Graph; no generated fact sheet document with model and purpose." } }, { @@ -4801,7 +5031,7 @@ "defectCandidate": "customComponents.js:100-106 itself flags this as a product decision still open: re-home the export onto compliance-operations or retire the route.", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -4810,7 +5040,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/billing/compliance.py:28-49 and api/services/compliance_download_service.py only hand out Dify's own vendor documents (GDPR DPA, ISO 27001, web/i18n/en-US/common.json:124-127) to paid Cloud plans; no compliance report about the organisation's own agents Note: the 'compliance' download is the vendor's certificate, not the customer's report", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; exports cover models, chats, feedback and config (routers/models.py:381, routers/evaluations.py:354, routers/configs.py:118), none is a compliance report", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/audit.ts:27 'Generate a security audit report for this n8n instance' and public API packages/cli/src/public-api/v1/handlers/audit/audit.handler.ts return one risk report (packages/cli/src/security-audit/risk-reporters/: credentials, database, filesystem, instance, nodes); searched 'AI Act|42001|compliance report' in packages/cli/src: no AI compliance report Note: A one-shot security risk report, not an AI compliance report.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'compliance|report' in assistant:lib: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'compliance|report' in assistant:lib: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/purview/ai-copilot-studio https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-logging-copilot-studio Compliance Manager assessments and DSPM for AI reports, plus Purview audit exports, give compliance evidence across tools; no single-file compliance report from Copilot Studio. Note: Purview licences." } }, { @@ -4831,7 +5062,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -4840,7 +5071,8 @@ "dify": "source read at 1.17.1, not driven: searched 'incident|impact|postmortem' in api/models, api/services and web/i18n/en-US: no AI incident record", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; the event catalogue (events.py:42) has no incident type", "n8n": "source read at n8n@2.40.7, not driven: searched 'AI Act|42001|risk class|DPIA|data protection officer|incident|factsheet|algoritme' in packages/cli/src, packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src (only hit: an onboarding survey option 'Incident response', en.json:2768): no record of AI incidents, impact or follow-up", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'incident' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'incident' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-and-governance https://learn.microsoft.com/en-us/purview/ai-copilot-studio searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"incident (register|record|log)|AI incident\": security signals go to Sentinel, Defender XDR and Insider Risk; no AI-incident record with impact and follow-up." } }, { @@ -4862,7 +5094,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -4871,7 +5103,8 @@ "dify": "source read at 1.17.1, not driven: searched 'authority|regulator|serious incident|notify' in api/services and web/i18n/en-US: no incident record and no authority notification", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; no incident record to notify from", "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no incident register and no notification to an authority", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'incident|authority|notify' outside user notifications in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'incident|authority|notify' outside user notifications in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-and-governance searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"notify.{0,30}authority|regulator|serious incident\": nothing." } }, { @@ -4892,7 +5125,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -4901,7 +5134,8 @@ "dify": "source read at 1.17.1, not driven: searched 'access review|attest|recertif|periodic review' in api/ and web/i18n/en-US: no periodic owner or need review of agents", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; models keep their creator as owner forever (backend/open_webui/models/models.py:117) with no review date or re-attestation", "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no periodic review in which owners attest that an agent is still needed; user and project membership pages exist but carry no review cycle", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent owners to review; searched 'review|attest' in assistant:lib: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agent owners to review; searched 'review|attest' in assistant:lib: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-use-entra-agent-identities https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-api-reassign-ownership-orphaned-agent agents get Microsoft Entra Agent IDs with \"Integration with Entra ID Governance\" (access reviews and lifecycle); inventory shows owners. No built-in periodic owner attestation inside Copilot Studio. Note: Entra ID Governance is a separate licence." } }, { @@ -4923,7 +5157,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "no", "open-webui": "partial", @@ -4932,7 +5166,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/console/app/site.py:49-57 each web app can show a description, privacy policy link and custom disclaimer to its users; no generated plain-language register or explanation of the agents employees deal with Note: per-app description and disclaimer only", "open-webui": "source read at v0.11.4, not driven: each agent has a user-facing, localisable description (backend/open_webui/models/models.py:78 'User-facing description of the model.', ModelEditor.svelte:962) shown in the model selector, and admins can post banners (src/lib/components/admin/Settings/Interface/Banners.svelte); no published page explaining the agents employees deal with Note: short per-agent descriptions only", "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no published plain-language explanation of agents for employees", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the chat states 'Output shown here is generated by AI. Make sure to always double-check.' (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:178) and the app listing carries an Ethical AI Rating (context_agent:appinfo/info.xml description). No published plain-language explanation per agent." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the chat states 'Output shown here is generated by AI. Make sure to always double-check.' (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:178) and the app listing carries an Ethical AI Rating (context_agent:appinfo/info.xml description). No published plain-language explanation per agent.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/publication-publish-agent each agent carries a name and description shown to users in Teams and Microsoft 365 Copilot; Microsoft publishes a transparency note for the service. No per-organisation public explanation page of its agents." } }, { @@ -4953,7 +5188,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "no", "n8n": "no", "open-webui": "no", @@ -4962,7 +5197,8 @@ "dify": "source read at 1.17.1, not driven: searched 'residency|region|data location|processing location' in api/ and web/i18n/en-US: providers show no processing location per feature", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpo|data protection officer|iso 42001|ai act|incident|factsheet|model card|residency|attestation|access review|algoritmeregister|dpia|impact assessment' in backend/open_webui, src/lib/components and src/routes: no matches; connections record a URL but no location, and no view maps AI features to where they process data (src/lib/components/admin/Settings/Connections.svelte)", "n8n": "source read at n8n@2.40.7, not driven: searched 'authority|regulator|attest|access review|transparency|residency|data location' in packages/cli/src and packages/frontend/editor-ui/src: no view of where each AI feature processes data; a model credential only holds its endpoint (packages/nodes-base/credentials/OpenAiApi.credentials.ts:35-36 Base URL)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: users see which provider backs each feature under 'Configured backends' (assistant:src/components/PersonalSettings.vue:52-60) and per task 'Provider: {name}' (AssistantTextProcessingForm.vue:73); where that provider processes data is not shown." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: users see which provider backs each feature under 'Configured backends' (assistant:src/components/PersonalSettings.vue:52-60) and per task 'Provider: {name}' (AssistantTextProcessingForm.vue:73); where that provider processes data is not shown.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/data-location https://learn.microsoft.com/en-us/microsoft-copilot-studio/geo-data-residency https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-external-response-model data locations per geography list the Azure regions used; pages state which features move data (generative AI outside the US, Bing, Anthropic/Mistral/xAI hosted outside Microsoft)." } }, { @@ -4984,7 +5220,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "partial", @@ -4993,7 +5229,8 @@ "dify": "source read at 1.17.1, not driven: searched 'department|group.*disable|ai off' in api/ and web/i18n/en-US: community has no departments; enterprise RBAC per-agent access policies (web/features/agent-v2/permissions.ts:37, api/configs/enterprise/__init__.py:38) grant access but there is no switch that turns AI off for a group with proof", "open-webui": "source read at v0.11.4, not driven: group permissions switch features and model access per group (src/lib/components/admin/Users/Groups/Permissions.svelte:44-51, backend/open_webui/routers/groups.py:401); permissions are additive and a default user permission 'will remain enabled' (Permissions.svelte:78), and there is no proof view that AI is off for a group Note: can narrow a group only when defaults are off; no evidence it is off", "n8n": "source read at n8n@2.40.7, not driven: a project's node type policy can block AI node types for that project (packages/cli/src/modules/type-availability-policies/type-availability-policy-project.controller.ts:19-24), licence-gated in type-availability-policies.module.ts:10-12 licenseFlag NODE_TYPE_POLICIES and not in the default module list; the chat hub has only an instance-wide switch (packages/cli/src/modules/chat-hub/chat-hub.settings.controller.ts:73) Note: Per project (as a department) with an enterprise licence and an opt-in module; proof is the policy itself, no report.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant has one global switch and a per-user switch (assistant:lib/Listener/BeforeTemplateRenderedListener.php:61-62); limiting an app to groups is a server app-management feature (not read). No per-department AI switch or proof in these repos." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant has one global switch and a per-user switch (assistant:lib/Listener/BeforeTemplateRenderedListener.php:61-62); limiting an app to groups is a server app-management feature (not read). No per-department AI switch or proof in these repos.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-data-loss-prevention https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-sharing-controls-limits data policies and Managed Environment sharing limits apply per environment or environment group, so a department in its own environment can have AI blocked; proof is the policy and inventory, not a per-department AI off switch. Note: Managed Environments licence for sharing limits." } }, { @@ -5019,7 +5256,7 @@ "n8n": "yes", "open-webui": "partial", "evidence": { - "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-review-activity https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-manage-monitor the Activity page lists agent sessions, including autonomous trigger runs, with status and time; agent flows list runs with status and duration.", "dify": "source read at 1.17.1, not driven: api/controllers/console/app/workflow_app_log.py:121 run list with status filter, created time and elapsed time (web/app/components/app/workflow-log/list.tsx); api/controllers/console/agent/roster.py:1133 agent logs with created/updated time, message count and user rate (web/i18n/en-US/agent-v-2.json logs.table.*)", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/execution/executions/views/ExecutionsView.vue lists executions with status, start time and duration (en.json:1429 'Error', 1621 'Waiting' statuses); Agents module sessions list per agent (packages/frontend/editor-ui/src/features/agents/views/AgentSessionsListView.vue, AgentSessionsFilter.vue:25-34 status filter)", "open-webui": "source read at v0.11.4, not driven: scheduled runs: backend/open_webui/routers/automations.py:388 GET /{id}/runs with status, time and error (models/automations.py:43-50), shown in src/lib/components/automations/AutomationEditor.svelte:355-400; interactive turns are chats with no status list; no list across all agents Note: old yes; run history exists only per automation", @@ -5045,7 +5282,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -5054,7 +5291,8 @@ "dify": "source read at 1.17.1, not driven: workflow run detail with a TRACING tab listing each node in order with inputs, outputs, status, time and tokens (web/i18n/en-US/run-log.json tracing, meta.*; web/app/components/workflow/run/node.tsx:89); chat messages show each agent thought and tool call (web/app/components/base/chat/chat/answer/agent-content.tsx:31-38); agent logs per conversation (api/controllers/console/agent/roster.py:1172)", "n8n": "source read at n8n@2.40.7, not driven: the Logs panel shows each node, model call and tool call of a run in order with inputs and outputs (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue, LogDetailsPanel.vue, LogsViewRunData.vue); Agents-module session timeline with tool calls and token use per message (packages/frontend/editor-ui/src/features/agents/views/AgentSessionTimelineView.vue, en.json:1435 'Token Usage') Note: Old partial rested on a generic execution-history line; logs show every step in order.", "open-webui": "source read at v0.11.4, not driven: each run is a chat whose assistant message keeps ordered output items (function_call, function_call_output, reasoning, text; backend/open_webui/utils/tool_approval.py:43, utils/middleware.py:5925); src/lib/components/chat/Messages/StructuredOutputRenderer.svelte:116-176 renders them in order; automation runs link to their chat (models/automations.py:46 chat_id)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: an answer shows the tools used and any reasoning content (assistant:src/components/ChattyLLM/Message.vue:36-72); tool arguments are shown only when approval is asked (AgencyAction.vue). No ordered step trace with tool results." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: an answer shows the tools used and any reasoning content (assistant:src/components/ChattyLLM/Message.vue:36-72); tool arguments are shown only when approval is asked (AgencyAction.vue). No ordered step trace with tool results.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-transcripts-studio activity trace / activity map renders each step in order: knowledge searches with sources, tool calls with inputs and duration, and model responses." } }, { @@ -5075,7 +5313,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "partial", @@ -5084,7 +5322,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:68 /retry resends the last message, :71 /undo backs up N turns and re-prompts, :76 /branch forks a session; hermes_cli/subcommands/cron.py:157 re-runs a job; agent/replay_cleanup.py:1-5 only sanitises resumed history; searched 'replay' for a run re-execution feature: none Note: You can re-run from a point in a live session, but not replay a stored past run to reproduce it.", "dify": "source read at 1.17.1, not driven: in the draft canvas a node can be re-run with its Last Run values from the variable inspector (web/i18n/en-US/workflow.json:272 debug.lastRunTab; api/controllers/console/app/workflow_draft_variable.py); searched 'replay|rerun|run again' in web/i18n/en-US and api/controllers/console/app: no replay of a logged production run (only a Re-run in RAG pipelines, pipeline.json:12) Note: node re-run in the editor, not replay of a past run", "open-webui": "source read at v0.11.4, not driven: a past turn can be re-run with 'Regenerate' (src/lib/components/chat/Messages/ResponseMessage.svelte, permission chat.regenerate_response) and a chat cloned or forked (backend/open_webui/routers/chats.py:1775 /clone, :1672 /fork); tool results are not recorded for deterministic replay, so it is a fresh run", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: 'Regenerate message' reruns the last turn with current state (assistant:src/components/ChattyLLM/MessageActions.vue:18, GET /chat/regenerate); searched 'replay' in both repos: no replay of a past run." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: 'Regenerate message' reruns the last turn with current state (assistant:src/components/ChattyLLM/MessageActions.vue:18, GET /chat/regenerate); searched 'replay' in both repos: no replay of a past run.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer https://learn.microsoft.com/en-us/microsoft-copilot-studio/computer-use-standalone flows: open a failing run and \"Load values from previous run\" to replay upstream data, or resubmit runs; computer use keeps session replays. No replay of a whole agent conversation." } }, { @@ -5105,7 +5344,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", @@ -5114,7 +5353,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:132 /plan writes a plan without executing anything; hermes_cli/commands.py:213 /tools disable to remove write-capable tools for a run; hermes_cli/commands.py:83 /rollback restores filesystem checkpoints (tools/checkpoint_manager.py); searched 'dry.?run' in hermes_cli/commands.py: only /worktree prune and /compress previews Note: No mode that runs an agent end to end while blocking every side effect.", "dify": "source read at 1.17.1, not driven: searched 'dry.?run|mock|simulat' in web/i18n/en-US/workflow.json, agent-v-2.json and api/core/workflow: draft debug runs and Agent v2 Build mode execute tools and the sandbox for real (agent-v-2.json build.empty.communityEditionTip 'changes made to the file system happen in real time'); only webhook triggers can be simulated (workflow.json:291) Note: test runs are separate from the published version but still act", "open-webui": "source read at v0.11.4, not driven: searched 'dry run|dry_run|simulate|sandbox mode' in backend/open_webui/utils/middleware.py, utils/tools.py and routers: no mode that lets an agent run while blocking side effects; the closest is per-chat 'Ask for approval' (utils/middleware.py:5934)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every write tool is dangerous and stops for confirmation (context_agent:ex_app/lib/graph.py:81), so a user can see intended actions and cancel; searched 'dry|simulate' in both repos: no dry-run mode, safe read tools still run." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every write tool is dangerous and stops for confirmation (context_agent:ex_app/lib/graph.py:81), so a user can see intended actions and cancel; searched 'dry|simulate' in both repos: no dry-run mode, safe read tools still run.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-test-bot the test pane and flow tests call the real connectors; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"dry.?run|mock|simulat\": only mock trigger inputs and evaluation profiles; isolation comes from testing in a separate development environment." } }, { @@ -5141,7 +5381,7 @@ "n8n": "partial", "open-webui": "partial", "evidence": { - "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/analytics-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-improve-agent-health analytics dashboard covers sessions, resolution and effectiveness, errors and health, tool and knowledge use, reactions and Copilot Credit cost across the selected period. Note: Per agent; cross-agent views live in the Power Platform admin center.", "dify": "source read at 1.17.1, not driven: per app/agent charts for conversations, end users, token costs, session interactions, satisfaction rate, response time and tokens per second (api/controllers/console/app/statistic.py:151-340; workflow_statistic.py:97-184; agent-v-2.json monitoring.metrics.*). No dashboard across agents and no success-rate or tool-use chart Note: per app, no cross-agent view, no tool use", "open-webui": "source read at v0.11.4, not driven: admin Analytics (src/lib/components/admin/Analytics/Dashboard.svelte) with backend/open_webui/routers/analytics.py:58 per-model counts, :85 users, :199 daily, :235 token usage by model, feedback activity; no success rate, speed, cost or tool use per agent Note: README.md:68 says cost, the code tracks tokens only", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/analytics.py:143 /api/analytics/usage and :305 /api/analytics/models behind web/src/pages/AnalyticsPage.tsx: tokens per day, sessions, API calls, estimated cost, tool calls, top skills (web/src/i18n/en.ts analytics, models); agent/insights.py:1-2 /insights Note: Cost, volume and tool use are charted; success rate and speed are not, and there is no per-agent breakdown across profiles on one dashboard.", @@ -5173,7 +5413,7 @@ "n8n": "yes", "open-webui": "partial", "evidence": { - "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-consumption https://learn.microsoft.com/en-us/power-platform/admin/manage-copilot-studio-copilot-credits-capacity the Monitor page shows Copilot Credits by agent and feature over a period; admin center shows agent and environment consumption. No tokens or cost per run or per step.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_state_usage.py:29-56 per-session estimated_cost_usd and actual_cost_usd with token counts; hermes_cli/commands.py:138 /status and :280 /usage show session tokens; gateway/runtime_footer.py:1-6 optional per-reply footer (model, context %, latency) Note: Tokens and cost are kept per session (run), not per step.", "dify": "source read at 1.17.1, not driven: web/app/components/workflow/run/meta.tsx:91-97 total tokens per run and web/app/components/workflow/run/node.tsx:89 tokens per node; money cost appears only in aggregate token-cost charts (api/controllers/console/app/statistic.py:232, web/app/components/app/overview/app-chart.tsx) Note: tokens per run and step, cost only in totals", "open-webui": "source read at v0.11.4, not driven: per-message token usage stored (backend/open_webui/utils/middleware.py:3737 merge_usage) and shown in src/lib/components/chat/Messages/ResponseMessage.svelte:1209-1213; searched 'cost|price' in routers/analytics.py and utils/middleware.py: no cost, and no per-step split", @@ -5199,7 +5439,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "no", "n8n": "no", "open-webui": "no", @@ -5208,7 +5448,8 @@ "dify": "source read at 1.17.1, not driven: searched 'budget|spend limit|spending|hard stop' in web/i18n/en-US and api/services: none for self-hosted; hosted-credit quotas (api/services/credit_pool_service.py, quota_service.py) apply to Dify Cloud's own trial credits, not a user-set budget with warning and stop", "open-webui": "source read at v0.11.4, not driven: searched 'budget|spend|limit|price' in backend/open_webui/routers/analytics.py, utils/middleware.py, routers/openai.py and config.py: no spending budget, warning level or hard stop", "n8n": "source read at n8n@2.40.7, not driven: searched 'budget|spend limit|hard stop' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/agents/src: no user-set spending budget; the only budget is n8n's own AI gateway credit quota from the licence (packages/cli/src/services/frontend.service.ts:600 quota:aiGatewayBudget)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'budget|spend' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'budget|spend' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-platform/admin/manage-copilot-studio-copilot-credits-capacity monthly consumption limit per agent with notifications \"when an agent's usage approaches the defined limit\" and a hard stop: \"The agent is automatically turned off once it hits the defined limit\"." } }, { @@ -5229,7 +5470,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -5238,7 +5479,8 @@ "dify": "source read at 1.17.1, not driven: searched 'estimate|expected cost|cost preview' in api/controllers/console/app and web/i18n/en-US: the only estimate is document indexing cost for knowledge bases (api/controllers/console/datasets/datasets_document.py:706 indexing-estimate), none for an agent or workflow run", "open-webui": "source read at v0.11.4, not driven: searched 'estimate|cost|price' in backend/open_webui/main.py, routers/analytics.py and src/lib/components/chat/MessageInput.svelte: main.py:1933 /api/v1/messages/count_tokens counts input tokens for Anthropic-style clients and MessageInput.svelte:1837 shows context usage, but nothing predicts a run's cost", "n8n": "source read at n8n@2.40.7, not driven: searched 'estimate|estimated cost|forecast' in packages/cli/src/modules/agents, packages/@n8n/agents/src and packages/frontend/editor-ui/src/features/agents: cost is recorded after a run (packages/cli/src/modules/agents/execution-recorder.ts:472), never predicted before it starts; Insights 'time saved' estimates (en.json:6745) concern time, not cost", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'estimate|cost' in both repos: only the provider's expected_runtime=60 (context_agent:ex_app/lib/provider.py:23)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'estimate|cost' in both repos: only the provider's expected_runtime=60 (context_agent:ex_app/lib/provider.py:23).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-usage-estimator the agent usage estimator forecasts Copilot Credit consumption for planned agents before deploying at scale; no per-run cost preview before a run starts." } }, { @@ -5260,7 +5502,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "yes", "open-webui": "yes", @@ -5269,7 +5511,8 @@ "dify": "source read at 1.17.1, not driven: searched 'alert|on failure notify|failed run email' in api/tasks, api/schedule and web/i18n/en-US: failures show only in logs and the editor toast (web/i18n/en-US/workflow.json:242 common.scheduleTriggerRunFailed); api/schedule/queue_monitor_task.py alerts admins about Celery queue length, not run failures Note: alerting only by wiring an external tracer or OTel collector", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:526 publish_event AUTOMATION_RUN_FAILED routed to admin event webhooks (events.py:1034); chat.failed is a user notification event (events.py:669, utils/notifications.py:287) with browser and webhook delivery (src/lib/components/chat/Settings/Notifications.svelte:37 'Chat failed')", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/ErrorTrigger starts a chosen error workflow whenever a workflow fails (set per workflow in its settings as errorWorkflow), which then mails or posts the alert with any node; Agents-module channel failures show as 'Not running' (en.json:8554) Note: The alert channel is whatever the error workflow sends to.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Nextcloud notifications on task failure and on scheduled task failure (assistant:lib/Notification/Notifier.php:158,389-401, lib/Listener/ChattyLLMTaskListener.php:40-52). Note: Alerts go to the user who ran the task, not to an admin." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Nextcloud notifications on task failure and on scheduled task failure (assistant:lib/Notification/Notifier.php:158,389-401, lib/Listener/ChattyLLMTaskListener.php:40-52). Note: Alerts go to the user who ran the task, not to an admin.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-environment-level-agent-telemetry https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-manage-monitor exported telemetry lets admins \"create alerts\" in Azure Monitor/Application Insights; flow Activity tab shows failures. No built-in alert on a failed agent run inside Copilot Studio. Note: Needs an Azure subscription for Application Insights." } }, { @@ -5290,7 +5533,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "no", "open-webui": "no", @@ -5299,7 +5542,8 @@ "dify": "source read at 1.17.1, not driven: searched 'drift|regression|quality trend|anomal' in api/ and web/i18n/en-US: no drift detection; satisfaction rate chart (api/controllers/console/app/statistic.py:286) is the nearest signal", "open-webui": "source read at v0.11.4, not driven: searched 'drift|anomaly|regression|baseline' in backend/open_webui/routers/analytics.py, routers/evaluations.py and utils: no monitoring of result quality over time beyond the feedback leaderboard history (routers/evaluations.py:268)", "n8n": "source read at n8n@2.40.7, not driven: searched 'drift|regression|anomal' in packages/cli/src/modules/agents, agent-evals, insights and packages/@n8n/agents/src: no watch on result quality over time; evaluations run only when started", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'drift|quality' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'drift|quality' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-rest-api https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-automate-tools evaluations can run on a schedule (REST API preview, Power Automate connector) for \"recurring performance checks\" and regressions, then email or chart the results; no built-in drift warning." } }, { @@ -5321,7 +5565,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -5330,7 +5574,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:1591-1592 GET /health and /health/detailed; hermes_cli/web_routers/status.py:115 /api/health and :555 /api/system/stats; agent/monitoring/otlp_exporter.py:1-6 exports health and diagnostic events to an OpenTelemetry collector; hermes_cli/subcommands/monitoring.py:19 Note: Metrics are pushed over OTLP; the pull endpoints are health checks, not a Prometheus scrape.", "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads and /db-pool-stat endpoints; api/configs/observability/otel/otel_config.py:10-25 ENABLE_OTEL exports traces and metrics over OTLP to a monitoring system; api/celery_healthcheck.py for workers Note: OTel metrics off by default", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health, :3009 /health/db for probes; utils/telemetry/metrics.py:151 setup_metrics with request counter, duration histogram and user gauges exported over OTLP (env.py:1267 ENABLE_OTEL_METRICS, :1271 endpoint) Note: metrics are pushed over OTLP, not a Prometheus scrape endpoint", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent ships a container healthcheck script only (context_agent:healthcheck.sh); searched 'metrics|prometheus' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent ships a container healthcheck script only (context_agent:healthcheck.sh); searched 'metrics|prometheus' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-environment-level-agent-telemetry https://learn.microsoft.com/en-us/microsoft-copilot-studio/telemetry-overview agent telemetry exports to Azure Application Insights (OpenTelemetry-aligned spans) for Azure Monitor dashboards; no scrape endpoint for other monitoring systems (SaaS). Note: Environment-level export is preview." } }, { @@ -5352,7 +5597,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -5361,7 +5606,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: plugins/observability/langfuse/plugin.yaml:1-3 bundled Langfuse plugin traces conversations, LLM calls and tool usage (opt-in); agent/monitoring/otlp_exporter.py:1-6 OTLP export", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1266 ENABLE_OTEL_TRACES, :1270 OTEL_EXPORTER_OTLP_ENDPOINT, utils/telemetry/setup.py and instrumentors.py send traces to any OTLP collector (Langfuse accepts OTLP); direct Langfuse hooks exist only as community pipeline filters Note: OTLP in core; native Langfuse only via community pipelines", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/otel (default module, packages/@n8n/backend-common/src/modules/module-registry.ts:70) exports workflow and agent spans over OTLP (otel.config.ts:9-21 endpoint, protocol, headers), agent spans toggled by N8N_AGENTS_TRACING_ENABLED (packages/@n8n/config/src/configs/agents.config.ts:49-50); LangChain nodes honour LANGCHAIN_TRACING_V2 and agent sessions export to LangSmith (packages/cli/src/modules/agents/agent-session-langsmith-export.service.ts:29) Note: Langfuse is reached through its OTLP endpoint, not a named integration.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'langfuse|langsmith|tracing|opentelemetry' in context_agent:ex_app and pyproject.toml: none configured." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'langfuse|langsmith|tracing|opentelemetry' in context_agent:ex_app and pyproject.toml: none configured.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-environment-level-agent-telemetry https://learn.microsoft.com/en-us/microsoft-copilot-studio/telemetry-overview traces go to Azure Application Insights only; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"Langfuse|OTLP|Datadog|third-party tracing\": no other tracing destination." } }, { @@ -5383,12 +5629,12 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "partial", + "copilot-studio": "yes", "dify": "no", "n8n": "no", "open-webui": "no", "evidence": { - "copilot-studio": "docs-only: competitor_features#31611 \"Analytics dashboard: Session, resolution and message-consumption analytics.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-viva-insights analytics summarises themes, engagement, sentiment and trends per reporting period; the Viva Insights agents report covers use across the tenant. Note: Viva Insights report excludes generative-orchestration agents.", "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 usage insights (tokens, cost, tool/skill use, activity, model/platform breakdowns) on demand via /insights (hermes_cli/commands.py:287) and `hermes insights`; searched 'weekly report|periodic report|digest.{0,20}usage' in cron/ and agent/: no scheduled usage report Note: Reports are on demand; a periodic one would be a hand-built cron job.", "dify": "source read at 1.17.1, not driven: searched 'report|weekly|monthly digest|usage report' in api/schedule, api/tasks and web/i18n/en-US: no periodic usage report; usage is only on the live Overview/Monitoring charts (api/controllers/console/app/statistic.py)", "open-webui": "source read at v0.11.4, not driven: searched 'report|digest|weekly' in backend/open_webui/routers/analytics.py, utils/automations.py and events.py: analytics are on-demand dashboards (src/lib/components/admin/Analytics/Dashboard.svelte); no periodic usage report", @@ -5415,7 +5661,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "yes", @@ -5424,7 +5670,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/evaluations.py:222 GET /leaderboard (ELO per model from thumbs ratings), :268 per-model history, :399 feedback list; src/lib/components/admin/Evaluations/Leaderboard.svelte, Feedbacks.svelte; analytics feedback activity (admin/Analytics/Dashboard.svelte)", "hermes-agent": "source read at v2026.9.24, not driven: no answer rating exists to aggregate: searched 'thumbs|feedback.*(up|down)|rate.*(answer|response)' in *.py and *.ts outside tests: none; agent/reactions.py:1-8 only detects affection for the pet animation", "n8n": "source read at n8n@2.40.7, not driven: ratings exist only on evaluation runs: en.json:8317-8318 thumbs up/down per case and en.json:8301 '{reviewed} of {total} reviewed' in the agent's Evals tab (packages/cli/src/modules/agent-evals/agent-eval-rating.service.ts); searched 'feedback|rating' in packages/cli/src/modules/chat-hub and insights: no per-agent statistics of how people rated live answers Note: Only test-case reviews in an opt-in, flag-gated module.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no answer rating exists (ch-feedback); searched 'feedback' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no answer rating exists (ch-feedback); searched 'feedback' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/analytics-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-drill-down-lists per agent \"Total reactions\" with thumbs up and down and comments; filterable lists of reactions downloadable to CSV." } }, { @@ -5451,7 +5698,7 @@ "n8n": "yes", "open-webui": "no", "evidence": { - "copilot-studio": "docs-only: competitor_features#31604 \"Low-code agent builder: Natural-language + graphical builder for topics, actions and knowledge.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-designer https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer agent flows and workflows are built on a designer canvas: add and remove actions by drag and drop, check errors, publish.", "dify": "source read at 1.17.1, not driven: web/app/components/workflow canvas editor for Workflow and Chatflow apps with the node set in web/i18n/en-US/workflow.json:2-35 blocks.*; api/controllers/console/app/workflow.py draft sync and publish", "n8n": "source read at n8n@2.40.7, not driven: the n8n editor is a node canvas (packages/frontend/editor-ui/src/features/workflows/canvas/, canvas.utils.ts) where workflows are wired step by step; core product surface", "hermes-agent": "source read at v2026.9.24, not driven: searched 'canvas|flow editor|node editor|reactflow' in web/src and apps/desktop/src: no visual flow builder; plugins/kanban/dashboard/manifest.json:1-10 the Kanban tab is a drag-drop task board, not a step canvas", @@ -5477,7 +5724,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -5486,7 +5733,8 @@ "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts AI Agent node with model, memory, tools and output parser inputs (nodes/agents/Agent/utils.ts:31-59); a workflow can also call an Agents-module agent (en.json agentSessions.origin.workflow 'Workflow')", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:249-257 /kanban create, assign, link: tasks assigned to profiles (agents) and linked as dependencies; hermes_cli/kanban_parser.py:314-321 'dependency' blocks auto-promote when parents finish; hermes_cli/kanban_db_graph.py:1 task graph persistence; plugins/kanban/dashboard/manifest.json board tab Note: Multi-agent work is a dependency graph of kanban cards, not a flow with agent steps.", "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); no flow to put an agent step in", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in these repos (searched 'flow|workflow' in both). Other Nextcloud flow tools could schedule the agent task type, but none is in these repos." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in these repos (searched 'flow|workflow' in both). Other Nextcloud flow tools could schedule the agent task type, but none is in these repos.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-node-workflow https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/agent-node-workflow the agent node lets a flow hand work to an existing published agent or an inline agent built inside the node." } }, { @@ -5508,7 +5756,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -5517,7 +5765,8 @@ "n8n": "source read at n8n@2.40.7, not driven: send-and-wait approval operations pause a workflow until a person answers, e.g. packages/nodes-base/nodes/Microsoft/Outlook/v2/actions/message/sendAndWait.operation.ts, Slack, Gmail, Teams, Telegram (packages/nodes-base/utils/sendAndWait/utils.ts); Wait node and Form node for manual steps (packages/nodes-base/nodes/Wait, Form)", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:314-321 `kanban block --kind needs_input` parks a card for a human and dependants wait until it is unblocked; hermes_cli/kanban_parser.py:216-218 --initial-status blocked for cards that need human ops; hermes_cli/kanban_pr_acceptance.py:1 PR acceptance gate Note: A human gate is a blocked card in the task graph, not an approval step with approve/deny.", "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); approval exists only for tool calls in a chat (utils/middleware.py:3613)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows; approval exists only inside the agent loop (ov-approval)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows; approval exists only inside the agent loop (ov-approval).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-request-for-information standard approvals connector in agent flows (GA); multistage approvals with manual and AI stages and the request-for-information action are preview." } }, { @@ -5538,7 +5787,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "partial", @@ -5547,7 +5796,8 @@ "dify": "source read at 1.17.1, not driven: an agent can call a published workflow as a tool (web/i18n/en-US/agent-v-2.json tools.toolTabs.workflow; api/controllers/console/workspace/tool_providers.py:904) and that workflow can hold another Agent node; searched 'sub.?agent|handoff|delegat' in dify-agent/src: no direct agent-to-agent handoff Note: indirect, through workflow-as-tool", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task hands a focused task to a sub-agent and returns its summary (utils/subagents.py:270 delegate, max_iterations and max_output :298-301), admin toggle src/lib/components/admin/Settings/Subagents.svelte; the sub-agent is a copy of the current model and tools (subagents.py:317 'model_id': current), it cannot pick another configured agent Note: delegates to a clone of itself, not to a different agent", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/AgentTool.node.ts:10-11 'AI Agent Tool' lets one agent call another as a tool; Agents-module sub-agents with 'use when' hints and delegation (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:132-173, en.json:7996-7997)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'subagent|delegate|handoff' in context_agent:ex_app: single agent graph (context_agent:ex_app/lib/graph.py:48-80)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'subagent|delegate|handoff' in context_agent:ex_app: single agent graph (context_agent:ex_app/lib/graph.py:48-80).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-child-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-copilot-studio-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-agent-to-agent agents delegate to child agents, other Copilot Studio agents, Foundry and Fabric agents, and over the A2A protocol (GA April 2026), using the results in the conversation." } }, { @@ -5569,7 +5819,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -5578,7 +5828,8 @@ "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/If and packages/nodes-base/nodes/Switch route items by conditions or rules; Text Classifier routes by an LLM category (packages/@n8n/nodes-langchain/nodes/chains/TextClassifier)", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:13 blocks.if-else and :26 blocks.question-classifier branch a flow on conditions or on an LLM classification; fail branches on node errors (nodes.common.errorHandle.failBranch)", "open-webui": "source read at v0.11.4, not driven: searched 'canvas|workflow|flow editor|node' in src/lib/components and src/routes: @xyflow/svelte (package.json:89) is used only for the chat message-tree overview (src/lib/components/chat/Overview/Flow.svelte); multi-step logic lives in Python Pipe functions or the external Pipelines server (backend/open_webui/routers/pipelines.py); conditions can only be coded inside a Pipe or Filter function", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no user-built flows; the only branch is the fixed safe/dangerous tool routing (context_agent:ex_app/lib/graph.py:56-72)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no user-built flows; the only branch is the fixed safe/dangerous tool routing (context_agent:ex_app/lib/graph.py:56-72).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-using-conditions flows include \"control structures for looping and branching\"; topics branch with Condition nodes and condition groups." } }, { @@ -5600,7 +5851,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -5609,7 +5860,8 @@ "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/execution/executions/views/WorkflowExecutionsView.vue the workflow's Executions tab lists its runs and opens each one on the canvas with the data each node produced Note: Old partial rested on a generic execution-history line; runs open on the canvas.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:416-418 `kanban log` and `kanban runs` per task; hermes_cli/subcommands/cron.py:168 `cron runs`; plugins/kanban/dashboard/manifest.json:4 board shows which profile is running what Note: Run history per task or job; no flow canvas to show it on.", "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows, so no flow run history." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows, so no flow run history.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer \"The Activity panel doubles as your workflow's run history\": filter runs and open any run on the canvas to inspect each step's inputs and outputs." } }, { @@ -5630,7 +5882,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -5639,7 +5891,8 @@ "dify": "source read at 1.17.1, not driven: api/constants/recommended_apps.json ships 22 templates (workflow, chatflow, agent-chat, e.g. 'Text Summarization Workflow', 'Email Assistant Workflow'); api/controllers/console/explore/recommended_app.py:96,126 serve them; web/app/(commonLayout)/templates/[[...category]] create from template Note: default source is remote tmpl.dify.ai (api/configs/feature/hosted_service/__init__.py:444), builtin as fallback mode", "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the app ships no example flows or agents, community presets live on openwebui.com (src/lib/components/workspace/Models.svelte:947)", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/workflows/readyToRun/workflows/aiWorkflow.ts ships a ready-to-run AI workflow (ReadyToRunButton.vue); the template library loads from packages/@n8n/config/src/configs/templates.config.ts:10-11 N8N_TEMPLATES_HOST https://api.n8n.io/api/ (features/workflows/templates/) Note: Most templates come from n8n's online library, so an offline instance sees only the bundled one.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows ship with either app (searched 'flow|template' in both)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows ship with either app (searched 'flow|template' in both).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-flow-create https://learn.microsoft.com/en-us/microsoft-copilot-studio/template-fundamentals Copilot Studio ships agent templates (IT helpdesk, website Q&A and others); a new agent flow opens from a starter template with the agent trigger and response. No library of ready business flows in these docs." } }, { @@ -5661,7 +5914,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "yes", "open-webui": "no", @@ -5670,7 +5923,8 @@ "dify": "source read at 1.17.1, not driven: searched 'n8n' in api/, web/app and web/i18n: no hits, and none in langgenius/dify-official-plugins tools/ or langgenius/dify-plugins; only a hand-built HTTP Request node or custom OpenAPI tool could call an n8n webhook", "open-webui": "source read at v0.11.4, not driven: searched 'n8n' in backend/open_webui and src: no n8n integration in core; an n8n workflow can only be called through a custom Tool, OpenAPI or MCP server or a community Pipe", "n8n": "source read at n8n@2.40.7, not driven: this row describes n8n itself: an AI Agent calls another workflow through the Call n8n Workflow Tool (packages/@n8n/nodes-langchain/nodes/tools/ToolWorkflow), and Agents-module agents attach published workflows as tools (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:401-420, en.json:7820-7829)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'n8n' in both repos: none; only reachable if an admin adds an n8n MCP server via the MCP config (context_agent:ex_app/lib/all_tools/mcp.py)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'n8n' in both repos: none; only reachable if an admin adds an n8n MCP server via the MCP config (context_agent:ex_app/lib/all_tools/mcp.py).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-flow-express-mode https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-flow heavy work goes to agent flows and Power Automate cloud flows called from an agent; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"n8n\": none, an n8n workflow is reachable only through a generic HTTP request or MCP server. Note: Own surface (Power Automate) instead of n8n." } }, { @@ -5692,7 +5946,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "partial", @@ -5701,7 +5955,8 @@ "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Code runs JavaScript or Python as a workflow step (task runners, packages/@n8n/config/src/configs/runners.config.ts:16-17)", "open-webui": "source read at v0.11.4, not driven: custom Python runs in the request pipeline as Filter (inlet/outlet) or Pipe functions (backend/open_webui/routers/functions.py:48, src/routes/(app)/admin/functions/create/+page.svelte, utils/filter.py:212) and on the external Pipelines server (routers/pipelines.py); searched 'canvas|workflow|flow' in src/lib/components: no flow to place the step in Note: old yes; code steps exist in the chat pipeline, not in a flow", "hermes-agent": "source read at v2026.9.24, not driven: cron/job_definition.py:15 script and no_agent (script-only jobs) and monitor_script fields; web/src/i18n/en.ts cron.scriptRequired 'Script-only jobs need a script path'; hermes_cli/subcommands/webhook.py:43-46 --script transform on a webhook route; tools/code_execution_tool.py code in a run Note: Custom code runs as a job, pre-run gate or webhook transform; there is no flow to put a code step in.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows and no code tool (searched 'exec|code' in all_tools)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows and no code tool (searched 'exec|code' in all_tools).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/code-interpreter-for-prompts https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompt-node-workflow a prompt node with code interpreter runs generated Python inside a flow; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"inline code|code step|run script\" in flow pages: no step for hand-written custom code." } }, { @@ -5723,7 +5978,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -5732,7 +5987,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler_prompt.py:95-97 context_from injects the latest output of other jobs into a job's prompt (job chaining); hermes_cli/kanban_decompose.py:1-6 fans a task out into a graph of child tasks; hermes_cli/subcommands/webhook.py:47-51 a route can fire an existing job Note: Jobs and task graphs can be chained; there is no named flow to embed in another.", "dify": "source read at 1.17.1, not driven: Snippets are reusable node groups inserted into workflows (api/controllers/console/snippets/snippet_workflow.py; web/i18n/en-US/snippet.json); a published workflow can be used as a tool in other apps (web/i18n/en-US/workflow.json:257-258 common.workflowAsTool)", "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in these repos." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in these repos.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-overview built-in tools include \"child flows\", so one flow runs another." } }, { @@ -5754,7 +6010,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "no", @@ -5763,7 +6019,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:997-1000 panel.checklist 'Resolve the following issues before publishing', :207 needConnectTip for unconnected steps, per-node checks such as :361 nodes.agent.checkList.strategyNotSelected; agent composer validate endpoint api/controllers/console/agent/composer.py:167", "open-webui": "source read at v0.11.4, not driven: no flow feature to hold it (searched 'canvas|workflow|flow' in src/lib/components and src/routes; @xyflow/svelte only draws the chat overview, src/lib/components/chat/Overview/Flow.svelte); the only pre-run check is RRULE validation for schedules (backend/open_webui/utils/recurrence.py:106 validate_rrule)", "n8n": "source read at n8n@2.40.7, not driven: the canvas flags node issues before a run, e.g. en.json:4502-4504 'Credentials for {type} are not set'; Agents module validates the whole agent (packages/cli/src/modules/agents/agents-config.controller.ts:40-55 GET /:agentId/validation) and blocks preview or publish with named issues (en.json:7734-7763)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in these repos." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in these repos.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-designer https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer \"Errors in agent flow actions are indicated in red ... To list all errors in the entire flow\" use the checker before publishing." } }, { @@ -5784,7 +6041,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "partial", @@ -5793,7 +6050,8 @@ "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/explore and templates/[[...category]] browse ready-made apps including agents (api/constants/recommended_apps.json 'Investment Analysis Report Copilot', 'SVG Logo Design' in agent-chat mode); api/controllers/console/explore/recommended_app.py:96,126; one click creates a copy in the workspace Note: templates are Dify-curated, fetched from tmpl.dify.ai by default", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:945-950 'Discover a model' links to openwebui.com/models when enable_community_sharing is on; the community page posts the preset back into src/routes/(app)/workspace/models/create/+page.svelte:77 (COMMUNITY_ORIGINS check) to prefill a new model Note: the store is an outside website, not an in-app catalogue", "n8n": "source read at n8n@2.40.7, not driven: en.json:4462 'Workflow templates' gallery with en.json:4445-4446 'Try template' and 'Use this workflow' (packages/frontend/editor-ui/src/features/workflows/templates/, setupTemplate.store.ts), fed by api.n8n.io (packages/@n8n/config/src/configs/templates.config.ts:10-11) and including AI agent workflows Note: Online library; an offline instance loses it.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'store|template|marketplace' in assistant:src: no agent store; one built-in agent." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'store|template|marketplace' in assistant:src: no agent store; one built-in agent.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/template-fundamentals https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-microsoft-teams agent templates (IT Helpdesk, Website Q&A, Safe Travels and others) start an agent from the Agents page; published agents appear in the Teams / Microsoft 365 agent store for users to add." } }, { @@ -5816,7 +6074,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "yes", @@ -5825,7 +6083,8 @@ "dify": "source read at 1.17.1, not driven: an agent can be duplicated (api/controllers/console/agent/roster.py:961 copy), exported as DSL (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52), and an inline workflow agent saved to the shared roster (api/controllers/console/agent/composer.py:239 save-to-roster). Searched 'publish as template|insert-explore-apps' in api/controllers: no way to add it to the Explore template list Note: reuse by roster, copy and file; publishing a template for others goes through the Marketplace Creator Center, an outside service (web/i18n/en-US/plugin.json:230,305), not an in-product action", "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models.svelte:221 shareModelHandler posts the full model to openwebui.com, :214 Clone, per-model Export JSON (routers/models.py:381); public read grant makes it usable org-wide (common/AccessControl.svelte:19 'anyone')", "n8n": "source read at n8n@2.40.7, not driven: an agent can be duplicated within its project (en.json:7721 'Duplicate', packages/frontend/editor-ui/src/features/agents/views/AgentsListView.vue:136-174) or exported as JSON (en.json:7613); searched 'publish template|create template' in packages/cli/src and packages/frontend/editor-ui/src/features/workflows/templates: no way to publish one's own agent or workflow as an in-instance template Note: Reuse by copy or file, not a template others browse.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agents or templates to create (searched 'template' in assistant:lib/Service)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agents or templates to create (searched 'template' in assistant:lib/Service).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-export-import-copilot-components https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents component collections package an agent's topics, knowledge and tools for reuse in other agents; agents download as .zip or copy between Microsoft 365 Copilot and Copilot Studio. No \"save as organisation template\" for an agent." } }, { @@ -5846,7 +6105,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "no", @@ -5855,7 +6114,8 @@ "dify": "source read at 1.17.1, not driven: api/services/app_dsl_service.py:174 import accepts yaml_url (web/i18n/en-US/app.json:115-116 'From URL'), so a raw GitHub DSL link installs; searched 'github' in api/services/app_dsl_service.py and web/i18n/en-US/app.json: no discovery or publish to GitHub Note: install by URL only", "open-webui": "source read at v0.11.4, not driven: searched 'github|load/url' in backend/open_webui/routers/models.py: model presets import only from a JSON file or openwebui.com; GitHub URL loading exists for tools and functions only (routers/tools.py:247, routers/functions.py:107)", "n8n": "source read at n8n@2.40.7, not driven: workflows sync to a Git repository with source control (packages/cli/src/modules/source-control.ee, feat:sourceControl at packages/@n8n/constants/src/index.ts:22); searched 'github' in packages/frontend/editor-ui/src/features/workflows/templates: templates come only from api.n8n.io, no GitHub discovery or install Note: Git sync is enterprise-licensed and is not template search or publishing.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'github|template' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'github|template' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-clone-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-and-governance agents clone to local folders with the VS Code extension and live in Git; \"GitHub-backed source control and deploy-from-Git\"; no GitHub template discovery or publishing." } }, { @@ -5876,7 +6136,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "no", "n8n": "no", "open-webui": "no", @@ -5885,7 +6145,8 @@ "dify": "source read at 1.17.1, not driven: searched 'approve template|template review|pending template' in api/ and web/i18n/en-US: no approval step for templates; Explore templates come from a remote or builtin catalogue (api/configs/feature/hosted_service/__init__.py:444)", "open-webui": "source read at v0.11.4, not driven: searched 'approve|review|publish' in backend/open_webui/routers/models.py and src/lib/components/workspace/Models*: a model is shared the moment its access grants are saved (routers/models.py:1035); no approval gate", "n8n": "source read at n8n@2.40.7, not driven: searched 'template approv|approve template' in packages/cli/src and packages/frontend/editor-ui/src: none; workflow reviews (packages/@n8n/constants/src/index.ts:58 feat:workflowReviews, packages/frontend/editor-ui/src/features/workflow-reviews/) approve changes to a workflow, not templates for the organisation", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no templates exist." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no templates exist.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-microsoft-teams https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents sharing an agent with the whole organisation means \"submitting the agent for admin approval to be featured in the Built for your org section\"; the tenant admin adds it to the organisational catalogue." } }, { @@ -5906,7 +6167,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "no", @@ -5915,7 +6176,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:85-87 /snapshot create|restore of Hermes config/state; hermes_cli/config_backups.py:1-8 point-in-time copies of config.yaml; hermes_cli/subcommands/profile.py:147-158 distribution update with version in ProfileInfo Note: Whole-state snapshots and config backups allow rollback; no per-agent version list or compare view.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1266,1282,1302 list versions, view one, restore it; api/models/agent.py:327,363 AgentConfigSnapshot and AgentConfigRevision; workflow version history with restore (web/i18n/en-US/workflow.json:1079-1081). Searched 'compare|diff' in agent-v-2.json and workflow.json: no version comparison (only the workflow generator's change summary, :1110) Note: versions and rollback yes, compare no; Community Edition does not version the agent's file system (agent-v-2.json build.empty.communityEditionTip)", "open-webui": "source read at v0.11.4, not driven: searched 'version|history|rollback' in backend/open_webui/models/models.py and routers/models.py: updates overwrite the row (routers/models.py:932); versioning with history menu exists only for prompts (routers/prompts.py:384, workspace/Prompts/PromptHistoryMenu.svelte)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'version|history|rollback' in assistant:lib/Db: no agent entity, no versions." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'version|history|rollback' in assistant:lib/Db: no agent entity, no versions.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/publication-publish-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-results \"The new version replaces the previous published version\"; evaluations compare two runs across versions; solution versions and Git hold history. No in-product version list with rollback." } }, { @@ -5936,7 +6198,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "no", "n8n": "yes", "open-webui": "no", @@ -5945,7 +6207,8 @@ "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/evaluations.py:222 leaderboard and arena models (admin/Settings/Evaluations/ArenaModelModal.svelte) rank models from blind user votes; searched 'expected|test case|dataset|golden' in routers/evaluations.py: no case sets with expected answers Note: old partial; arena voting is not a test set", "hermes-agent": "source read at v2026.9.24, not driven: batch_runner.py:1-6 runs the agent over a JSONL prompt dataset in parallel with trajectories and tool-usage statistics; evals/ developer harnesses; searched 'expected|assert.{0,20}answer|score' in batch_runner.py: no expected-answer scoring Note: A dataset runner exists as a repo script; it does not compare against expected answers.", "dify": "source read at 1.17.1, not driven: searched 'evaluation|test case|expected answer|dataset eval' in api/controllers and web/i18n/en-US: no agent test sets; evaluation is delegated to external tracers (web/i18n/en-US/app.json:220-258) and dataset hit testing only checks retrieval (api/controllers/console/datasets/hit_testing.py)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'eval|test case|expected' in runtime code of both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'eval|test case|expected' in runtime code of both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-intro https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-create agent evaluations (GA March 2026) run test sets with expected answers and graders, single and multi-turn." } }, { @@ -5967,7 +6230,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "no", "n8n": "yes", "open-webui": "no", @@ -5976,7 +6239,8 @@ "dify": "source read at 1.17.1, not driven: searched 'compare|baseline|a/b|prompt version' in web/i18n/en-US/app-debug.json, agent-v-2.json and workflow.json: classic apps can debug several models side by side on one prompt (web/app/components/app/configuration/debug/debug-with-multiple-model), but no run of a new prompt version against the old one before publishing Note: multi-model debug compares models, not prompt versions", "open-webui": "source read at v0.11.4, not driven: searched 'baseline|compare|promote|a/b' in backend/open_webui/routers/prompts.py, routers/models.py and routers/evaluations.py: prompt versions can be set live (routers/prompts.py:384) but no side-by-side run of old versus new before promotion; arena compares models, not prompt versions", "n8n": "source read at n8n@2.40.7, not driven: workflow evaluation runs compare side by side with Cases, Outputs, Metrics and 'Workflow diff' tabs (en.json:6521-6524; packages/frontend/editor-ui/src/features/ai/evaluation.ee/components/Compare/CasesTable.vue:113-174 delta vs best, WorkflowDiffTab.vue), so a changed prompt is scored against the previous version before publishing Note: Evaluations are quota-limited by licence (packages/@n8n/constants/src/index.ts:73).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the system prompt is hard-coded (context_agent:ex_app/lib/agent.py:134-142); searched 'baseline|compare' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the system prompt is hard-coded (context_agent:ex_app/lib/agent.py:134-142); searched 'baseline|compare' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-results https://learn.microsoft.com/en-us/microsoft-copilot-studio/batch-testing-prompts \"Compare multiple agent versions side by side to validate improvements\"; compare two runs of the same test set; batch testing for prompt changes." } }, { @@ -5998,7 +6262,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -6007,7 +6271,8 @@ "n8n": "source read at n8n@2.40.7, not driven: community nodes install from npm in the UI (en.json:3285 'Install community nodes'; packages/cli/src/modules/community-packages/community-packages.controller.ts:11 POST, default module) and the public template library at api.n8n.io (packages/@n8n/config/src/configs/templates.config.ts:10-11)", "dify": "source read at 1.17.1, not driven: web/app/(commonLayout)/marketplace in-product Dify Marketplace with community Plugins and Templates, creator profiles and trending by real usage (web/i18n/en-US/plugin.json:210-240 marketplace.home.templates, creatorProfile.*); skills and agent strategies ship through it too", "open-webui": "source read at v0.11.4, not driven: openwebui.com community library of model presets, tools, functions and prompts reached from src/lib/components/workspace/Models.svelte:947, Tools.svelte:639 and admin/Functions.svelte (common/CommunityDiscover.svelte 'Made by Open WebUI Community'); import back via postMessage (routes/(app)/workspace/tools/create/+page.svelte:58) Note: no community channel for skills", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'community|library|hub' in both repos: skills come from the user's or admin's folder only (assistant:lib/Service/AgentSkillsService.php:65-90)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'community|library|hub' in both repos: skills come from the user's or admin's folder only (assistant:lib/Service/AgentSkillsService.php:65-90).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new https://learn.microsoft.com/en-us/microsoft-copilot-studio/template-fundamentals Microsoft-curated templates, the Sample Solution Gallery and Power CAT's Copilot Agent Kit; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"community (gallery|library)\": no public community library of agents and skills in the product." } }, { @@ -6029,7 +6294,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "partial", "open-webui": "partial", @@ -6038,7 +6303,8 @@ "dify": "source read at 1.17.1, not driven: an app or agent exports as DSL YAML (web/features/agent-v2/agent-detail/sidebar-actions.tsx:52; api/services/app_dsl_service.py:723) and imports into another workspace or instance by file or URL (api/services/app_dsl_service.py:174; web/i18n/en-US/app.json:115); snippets export and import the same way (web/i18n/en-US/snippet.json importFromDSLUrl) Note: credentials and plugin dependencies must be set up again in the target (web/app/components/workflow/plugin-dependency)", "open-webui": "source read at v0.11.4, not driven: automations export and import as JSON (src/routes/(app)/automations/+page.svelte:91-96 Import/Export JSON, :438) and models likewise (routers/models.py:381, :441), so an automation can be moved to another instance; searched 'tenant|organization' in backend/open_webui/models: no client-organisation concept to move between", "n8n": "source read at n8n@2.40.7, not driven: a workflow moves to another project with packages/cli/src/workflows/workflows.controller.ts:646 PUT /:workflowId/transfer, or to another instance by JSON export/import (packages/cli/src/commands/export/workflow.ts, import/workflow.ts); projects are not isolated client organisations (see op-multi-tenant) Note: Moves between projects or instances; no tenant concept.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no tenants or templates in these repos." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no tenants or templates in these repos.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-solutions-import-export https://learn.microsoft.com/en-us/microsoft-copilot-studio/multi-tenant-overview solutions export and import move an agent to another environment, including another tenant; multitenant mode (preview) serves one agent to other Entra tenants." } }, { @@ -6060,7 +6326,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -6069,7 +6335,8 @@ "dify": "source read at 1.17.1, not driven: searched 'course|learner|curriculum' in api/ and web/i18n/en-US: only Dify's own product onboarding lessons (api/controllers/console/explore/recommended_app.py:111 learn-dify; web/i18n/en-US/common.json stepByStepTour.*), no learner recommendations", "open-webui": "source read at v0.11.4, not driven: searched 'course|learner|lesson|curriculum' in backend/open_webui and src/lib/components: no learning domain", "n8n": "source read at n8n@2.40.7, not driven: searched 'course|learner|curriculum|recommend' in packages/cli/src and packages/frontend/editor-ui/src: no learning features; out of n8n's domain", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'course|learner' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'course|learner' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/template-fundamentals searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"course|learner|learning path\": no learning recommendation feature; could only be custom-built." } }, { @@ -6097,7 +6364,7 @@ "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant is a PHP Nextcloud app (assistant:appinfo/info.xml) and context_agent a Docker ExApp installed on the instance (context_agent:appinfo/info.xml docker-install, context_agent:Dockerfile).", "hermes-agent": "source read at v2026.9.24, not driven: Dockerfile and docker-compose.yml at the repo root; setup-hermes.sh installer; hermes_cli/subcommands/gateway.py installs the gateway as a systemd/launchd service (hermes_cli/gateway_service_unit.py); hermes_cli/subcommands/dashboard.py self-hosted web dashboard", - "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/data-location Copilot Studio runs as a Microsoft cloud service in Azure regions per geography (web app at copilotstudio.microsoft.com); searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"on-premises|self-host\": only on-premises A2A agents or data gateways can be reached, the service itself is not hostable.", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml and docker/.env.example self-host the full stack (api, worker, beat, web, plugin_daemon, sandbox, agent runtime, ssrf_proxy, database, redis, vector store); DEPLOYMENT_EDITION defaults to COMMUNITY (api/enterprise/telemetry/README.md config table)", "n8n": "source read at n8n@2.40.7, not driven: docker/ images and packages/cli/src/commands/start.ts run n8n on the organisation's own servers; queue mode with workers for scale (packages/cli/src/commands/worker.ts) Note: Under the Sustainable Use License, which limits some commercial uses (LICENSE.md).", "open-webui": "source read at v0.11.4, not driven: README.md:26 pip, uv, Docker, Kubernetes; Dockerfile and docker-compose.yaml in repo root; SQLite or PostgreSQL and local or S3/GCS/Azure storage (backend/open_webui/storage/provider.py)" @@ -6127,7 +6394,7 @@ "n8n": "partial", "open-webui": "yes", "evidence": { - "copilot-studio": "docs-only: competitors#1450 tech_stack \"Power Platform, Dataverse, Azure AI Foundry, Power Automate, autonomous agents, connectors\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/data-location https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-and-governance searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"offline|disconnected|air.?gap\": none; the service needs Microsoft cloud connectivity (sovereign clouds exist, but are still Microsoft-hosted).", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1203 OFFLINE_MODE sets HF_HUB_OFFLINE and turns off the version update check (:1205-1207); local inference through Ollama (routers/ollama.py), local embeddings and Whisper; community and update links are optional", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/models_local.py:1-5 local Ollama/LM Studio models; hermes_cli/config_defaults.py:2297-2305 telemetry collection and sending both off by default; :1762-1765 allow_lazy_installs false for air-gapped installs; tools/environments/docker.py:765 docker_network false air-gaps the sandbox; searched 'HERMES_OFFLINE|offline.?mode|air.?gap' in *.py: no global offline switch Note: Offline operation is assembled from settings, not a supported mode; not driven, so network calls such as model catalog refreshes were not verified to stay off.", "dify": "source read at 1.17.1, not driven: offline is possible but not default: MARKETPLACE_ENABLED can be false with plugins uploaded as local packages (docker/.env.example:251; api/controllers/console/workspace/plugin.py:746 upload/pkg), templates in builtin mode (api/configs/feature/hosted_service/__init__.py:444 default remote), CHECK_UPDATE_URL (docker/.env.example:37) and community telemetry (api/configs/feature/__init__.py:839-850, ext_celery.py:285) must be switched off Note: every model needs a local provider plugin loaded by hand", @@ -6160,7 +6427,7 @@ "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: assistant: info.xml licence agpl (assistant:appinfo/info.xml:66) with AGPL-3.0-or-later in LICENSES; context_agent: LICENSE is AGPL-3.0 and sources carry SPDX AGPL-3.0-or-later. Note: context_agent's info.xml says MIT, which contradicts its LICENSE file.", "hermes-agent": "source read at v2026.9.24, not driven: LICENSE:1-3 MIT License, Copyright (c) 2025 Nous Research; pyproject.toml project metadata; full source including web dashboard and desktop app in the public repo Note: MIT, not EUPL.", - "copilot-studio": "docs-only: competitors#1450 license \"Proprietary\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/billing-licensing https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-licensing licensed per user and by Copilot Credits under the Microsoft Product Terms; proprietary, no open source licence.", "dify": "source read at 1.17.1, not driven: LICENSE:3-10 'modified version of the Apache License 2.0': no multi-tenant service and no removal of the logo or copyright in web/ without a commercial licence; LICENSE:2.a the producer may change the licence. Not an OSI or EUPL licence Note: source-available with restrictions", "n8n": "source read at n8n@2.40.7, not driven: LICENSE.md:3-14 core code is under the Sustainable Use License (fair-code, with use limitations) and files with '.ee.' in the name need an n8n Enterprise License (LICENSE_EE.md); neither is an OSI open source licence such as the EUPL Note: Matches the old no.", "open-webui": "source read at v0.11.4, not driven: LICENSE: 'Open WebUI License', BSD-3 style plus a branding clause (LICENSE:23-33) that forbids altering Open WebUI branding for deployments above fifty end users (:27-28) without an enterprise licence; code before commit 60d84a3 is plain BSD-3 (LICENSE_HISTORY) Note: source-available, not OSI open source and not EUPL" @@ -6191,7 +6458,7 @@ "open-webui": "no", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/profile.py:10-11 profiles are 'multiple isolated Hermes instances' with their own config, keys, memory, sessions and skills; agent/secret_scope.py:1-10 fail-closed per-profile secret scope in the multiplexed gateway (hermes_cli/gateway_multiplex_mode.py:1-8); hermes_cli/kanban_parser.py:84 kanban --tenant namespace Note: Isolation is per profile under one operator; no organisation boundary with its own admins or data access control.", - "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/environments-first-run-experience https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-data-loss-prevention Power Platform environments separate agents, data, roles and policies within a tenant (\"separate environments that correspond to specific teams or departments\"); each customer organisation is its own Entra tenant.", "dify": "source read at 1.17.1, not driven: workspaces keep apps, data, providers and members apart (api/controllers/console/workspace/workspace.py:229,289 list and switch; tenant_id on every model, e.g. api/models/agent.py:163); creating workspaces is off by default (api/configs/feature/__init__.py:1599 ALLOW_CREATE_WORKSPACE=False) and LICENSE:5-6 forbids running a multi-tenant service without a commercial licence Note: works technically, licence-gated for serving several organisations", "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide", "n8n": "source read at n8n@2.40.7, not driven: projects separate workflows, credentials and agents with project roles (packages/cli/src/modules/agents/entities/agent.entity.ts:13-18, packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts); team projects are limited by the licence quota quota:maxTeamProjects (packages/@n8n/constants/src/index.ts:67); users, SSO, models and settings stay instance-wide Note: Group separation inside one organisation, not tenants with their own admins and settings.", @@ -6216,7 +6483,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "no", "n8n": "no", "open-webui": "no", @@ -6225,7 +6492,8 @@ "dify": "source read at 1.17.1, not driven: api/services/feature_service.py:24-31 per-workspace limits (members, apps, vector space, upload quota, api/services/entities/feature_entities.py:152-161) are filled only from the Cloud billing API; self-hosted community has no per-workspace quota setting Note: Dify Cloud plans only", "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; only per-user automation limits (routers/automations.py:69)", "n8n": "source read at n8n@2.40.7, not driven: searched 'quota' per project in packages/cli/src/services/project.service.ee.ts and packages/cli/src/modules: quotas come from the instance licence (packages/@n8n/constants/src/index.ts:63-74), none can be set per project or organisation", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'quota|tenant' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'quota|tenant' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-platform/admin/manage-copilot-studio-copilot-credits-capacity admins allocate prepaid Copilot Credit capacity per environment, can stop an environment drawing tenant capacity, and link pay-as-you-go billing plans per environment." } }, { @@ -6247,7 +6515,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "no", "n8n": "no", "open-webui": "no", @@ -6256,7 +6524,8 @@ "dify": "source read at 1.17.1, not driven: searched 'tenant management|all workspaces admin|operations page' in api/controllers/console and web/app: /all-workspaces (api/controllers/console/workspace/workspace.py:238) lists the caller's own workspaces; workspace-wide switches come from the separate Enterprise service (api/services/system_feature_service.py:106-112, 160-197), not a page in this repo", "open-webui": "source read at v0.11.4, not driven: searched 'tenant|organization|org_id|workspace_id' in backend/open_webui/models and routers: the only hits are vector-store multitenancy modes (retrieval/vector/dbs/qdrant_multitenancy.py, milvus_multitenancy.py) that partition collections; users, groups and config are instance-wide; admin settings are one instance-wide panel (src/lib/components/admin/Settings)", "n8n": "source read at n8n@2.40.7, not driven: searched 'tenant|organisation|organization' in packages/cli/src/controllers and packages/frontend/editor-ui/src/features/settings: no operations page that sets switches, quotas and retention per organisation; retention is instance-wide by environment variable (packages/@n8n/config/src/configs/executions.config.ts:106-111)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no tenants; admin settings are instance-wide (assistant:lib/Settings/Admin.php:35-83)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no tenants; admin settings are instance-wide (assistant:lib/Settings/Admin.php:35-83).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-platform/admin/manage-copilot-studio-copilot-credits-capacity https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-transcript-controls https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-data-loss-prevention the Power Platform admin center manages per-environment capacity, data policies, transcript retention settings and environment groups and rules in one place." } }, { @@ -6278,7 +6547,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "yes", @@ -6287,7 +6556,8 @@ "n8n": "source read at n8n@2.40.7, not driven: SAML (packages/cli/src/modules/sso-saml, isSamlLicensed at middleware/saml-enabled-middleware.ts:14), OIDC (packages/cli/src/modules/sso-oidc/oidc.controller.ee.ts:44 @Licensed('feat:oidc')) and LDAP (packages/cli/src/modules/ldap.ee/ldap.controller.ee.ts:22 @Licensed('feat:ldap')) with role mapping rules (packages/cli/src/public-api/v1/handlers/role-mapping-rules) Note: Works, enterprise-licensed. Matches the old partial.", "open-webui": "source read at v0.11.4, not driven: OAuth/OIDC with group mapping (backend/open_webui/utils/oauth.py, config.py:2582 ENABLE_OAUTH_GROUP_MANAGEMENT), LDAP/AD (config.py:2788), trusted header SSO (env.py:802), SCIM 2.0 provisioning (routers/scim.py, env.py:907) Note: old partial rested on a feature row; code covers OIDC, LDAP, SCIM and group sync", "hermes-agent": "source read at v2026.9.24, not driven: plugins/dashboard_auth/self_hosted/plugin.yaml:1-4 OIDC sign-in to the dashboard against Keycloak, Authentik, Zitadel, Okta and others; plugins/dashboard_auth/self_hosted/__init__.py:262-270 groups are folded into a free-form org_id string that no access check reads (hermes_cli/dashboard_auth/base.py:12-16); chat users are platform ids in allowlists (gateway/authz_mixin.py:32-37) Note: Sign-in with company accounts works for the dashboard; groups do not map to rights.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant runs as the logged-in Nextcloud user and the agent acts as that user (context_agent:ex_app/lib/main.py:190-191); sign-in and groups come from the server's user backends (SAML/OIDC/LDAP apps, not read)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant runs as the logged-in Nextcloud user and the agent acts as that user (context_agent:ex_app/lib/main.py:190-191); sign-in and groups come from the server's user backends (SAML/OIDC/LDAP apps, not read).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-sso https://learn.microsoft.com/en-us/microsoft-copilot-studio/configuration-authentication-azure-ad agents authenticate users with Microsoft Entra ID, including SSO in Teams, Microsoft 365 Copilot and websites; security groups control sharing." } }, { @@ -6308,7 +6578,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "partial", @@ -6317,7 +6587,8 @@ "dify": "source read at 1.17.1, not driven: tool, model, datasource and trigger credentials are stored encrypted per workspace (api/core/helper/encrypter.py, provider_encryption.py) and referenced by agents, not typed into agent settings (api/controllers/console/workspace/tool_providers.py, model_providers.py:200); api/models/credential_permission.py limits who may use each credential Note: an encrypted store in the Dify database, not an external vault such as HashiCorp", "n8n": "source read at n8n@2.40.7, not driven: API keys live in the encrypted credential store, referenced by id, not in agent settings (packages/core/src/encryption/cipher.ts:9-10); outside vaults HashiCorp Vault, AWS, Azure Key Vault, GCP, Infisical and 1Password via packages/cli/src/modules/external-secrets.ee/providers/ (feat:externalSecrets, packages/@n8n/constants/src/index.ts:25) Note: Outside vaults are enterprise-licensed.", "open-webui": "source read at v0.11.4, not driven: outside keys are kept centrally in the config table (admin Connections, tool servers) and plugin valves are Fernet-encrypted (backend/open_webui/utils/valves.py:21 encrypt_valves), OAuth tool tokens encrypted (utils/oauth.py:269); searched 'vault|keyring|secret manager' in backend/open_webui: no external vault integration", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the only outside key (HERE) is a PASSWORD field in the ExApp admin form (context_agent:ex_app/lib/main.py:95-102) and MCP credentials would sit in the plain MCP JSON field (main.py:103-110); searched 'vault|secret' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the only outside key (HERE) is a PASSWORD field in the ExApp admin form (context_agent:ex_app/lib/main.py:95-102) and MCP credentials would sit in the plain MCP JSON field (main.py:103-110); searched 'vault|secret' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-variables https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-connections \"An environment variable can reference a secret in Key Vault\"; connections hold credentials centrally, outside agent settings." } }, { @@ -6339,7 +6610,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "no", @@ -6348,7 +6619,8 @@ "n8n": "source read at n8n@2.40.7, not driven: credentials are picked per model and per tool node, not per agent identity (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:175-187 node tool credentials, :447 model credential); per-user credential resolution is enterprise-licensed dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee) and token exchange (packages/cli/src/modules/token-exchange, feat:tokenExchange at packages/@n8n/constants/src/index.ts:55) Note: An agent can be given only the credentials its tools need, but there is no credential that is the agent's own identity.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:1032,1062 per-agent service API keys (create, list, revoke); per-agent secret environment variables injected only at runtime (web/i18n/en-US/agent-v-2.json advancedSettings.envEditor.scopeSecret, tools.cliDialog.securityTip); each tool on an agent picks which workspace credential it uses (agent-v-2.json tools.credential.authOne)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/automations.py:389 an automation run gets a short-lived token for its owner ({'id': user.id, 'typ': 'automation'}), so it acts with the owner's full rights; tool-server auth is set per connection or per user OAuth (src/lib/components/AddToolServerModal.svelte:313); searched 'agent credential|service account|scoped token' in backend/open_webui: no credential per agent", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent always acts as the requesting user through AppAPI (context_agent:ex_app/lib/main.py:189-191); searched 'service account|credential|token' in context_agent:ex_app: no per-agent credential." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent always acts as the requesting user through AppAPI (context_agent:ex_app/lib/main.py:189-191); searched 'service account|credential|token' in context_agent:ex_app: no per-agent credential.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-use-entra-agent-identities https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new every new agent gets its own Microsoft Entra Agent ID (automatic since July 2026) used to scope connector permissions, Conditional Access and data policies per agent." } }, { @@ -6369,14 +6641,14 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "yes", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin section 'ai' with feature toggles, chat instructions, last-N messages and global skills folder (assistant:lib/Settings/Admin.php:35-87, src/components/AdminSettings.vue:9-214) plus the Context Agent form for tools, HERE key and MCP config (context_agent:ex_app/lib/main.py:81-112,125).", "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/ConfigPage.tsx:384-391 sectioned config editor for config.yaml plus EnvPage (Keys) and ModelsPage in the Hermes dashboard; hermes_cli/subcommands/setup.py:11 `hermes setup`; searched 'nextcloud' repo-wide: none Note: Set up from Hermes' own dashboard and CLI, not from Nextcloud admin settings.", - "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-and-governance https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-data-loss-prevention set-up and governance run in the Power Platform admin center (environments, data policies, capacity, Copilot hub) and Microsoft 365 admin center; no Nextcloud admin settings. Note: Nextcloud-phrased row: own admin surface.", "dify": "source read at 1.17.1, not driven: Dify is set up in its own workspace settings and Integrations page (members api/controllers/console/workspace/members.py, model providers, plugins, web/app/(commonLayout)/integrations) plus environment variables (docker/.env.example); searched 'nextcloud' in api/ and web/: no Nextcloud admin settings panel Note: own settings, not Nextcloud's", "n8n": "source read at n8n@2.40.7, not driven: n8n is configured in its own Settings pages (packages/frontend/editor-ui/src/features/settings/: users, sso, apiKeys, communityNodes, chat hub providers at en.json:3665-3668) and environment variables (packages/@n8n/config/src/configs/); searched 'nextcloud' in packages/frontend/editor-ui/src: no Nextcloud admin integration Note: Own settings, not Nextcloud's.", "open-webui": "source read at v0.11.4, not driven: full setup in Open WebUI's own admin panel (src/routes/(app)/admin/settings/[tab]/+page.svelte: General, Connections, Models, Documents, WebSearch, CodeExecution, Integrations, Audio, Images, Subagents, Events); not inside Nextcloud admin settings Note: own admin UI, no Nextcloud integration" @@ -6400,7 +6672,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "no", @@ -6409,7 +6681,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/setup.py:11-26 `hermes setup` interactive wizard with sections; hermes_cli/gateway_setup_wizard.py:1 `hermes gateway setup` per-platform prompts; apps/desktop/e2e/core/onboarding-first-chat.spec.ts desktop onboarding to a first chat; web/src/pages/ProfileBuilderPage.tsx:32 profile builder", "open-webui": "source read at v0.11.4, not driven: src/lib/components/OnBoarding.svelte:82-118 is a welcome screen ('Welcome to your AI home.', 'Get started', 'Read the docs') before the first admin signs up (src/routes/auth/+page.svelte:216); searched 'wizard|setup step|first provider' in src/lib/components: no guided provider or agent setup", "n8n": "source read at n8n@2.40.7, not driven: n8n Assistant onboarding walks an admin through connecting a model (en.json:5358-5365 'Get started', 'Connect a model'; setup state checked in packages/frontend/editor-ui/src/features/ai/instanceAi useInstanceAiReady), and a new agent then opens in that assistant to be built (packages/frontend/editor-ui/src/features/agents/views/NewAgentView.vue:58-83)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin settings explain missing providers per feature with links to llm2, integration_openai, stable diffusion and whisper (assistant:src/components/AdminSettings.vue:55-120); no guided wizard." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin settings explain missing providers per feature with links to llm2, integration_openai, stable diffusion and whisper (assistant:src/components/AdminSettings.vue:55-120); no guided wizard.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-first-bot https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/build-new-agent the conversational agent creation guides makers through a first agent, and the agentic builder (preview) asks clarifying questions; models are pre-provisioned so there is no provider set-up step to guide." } }, { @@ -6431,7 +6704,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -6440,7 +6713,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: web/src/pages/SystemPage.tsx:106 doctor run with live log and :187 memory-provider status; web/src/i18n/en.ts status.* gateway running/failed, connected platforms, active sessions on the status overview; hermes_cli/web_routers/status.py:115 /api/health and gateway/platforms/api_server.py:1592 /health/detailed", "dify": "source read at 1.17.1, not driven: api/extensions/ext_app_metrics.py:20,28,54 /health, /threads, /db-pool-stat JSON endpoints and api/celery_healthcheck.py for machine checks; searched 'health|status page|system status' in web/app and web/i18n/en-US: no page showing chat and dependency health Note: endpoints only, no page", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:2963 GET /health and :3009 GET /health/db return JSON for probes; admin connection verify buttons only at edit time (AddToolServerModal.svelte:206); searched 'health|status page' in src/lib/components/admin: no page showing chat and dependency health", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin settings show whether TaskProcessing providers and the Context Agent are available (assistant:lib/Settings/Admin.php:36-45,63-76); the chat shows a no-provider empty state (assistant:src/components/NoProviderEmptyContent.vue). No health page with dependency status." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: admin settings show whether TaskProcessing providers and the Context Agent are available (assistant:lib/Settings/Admin.php:36-45,63-76); the chat shows a no-provider empty state (assistant:src/components/NoProviderEmptyContent.vue). No health page with dependency status.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-agent-status https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-connections Agent status summary (preview) groups blocking and warning issues for readiness and runtime; Connection settings show each connection's state. No health page for the chat service and its dependencies." } }, { @@ -6468,7 +6742,7 @@ "open-webui": "partial", "evidence": { "hermes-agent": "source read at v2026.9.24, not driven: LICENSE:1-3 MIT, no seat or message licence in the code; agent/billing_view.py:1 and hermes_cli/nous_subscription.py cover an optional Nous portal plan; model spend is paid per token to whichever provider is configured Note: Software is free; model usage is billed by the provider, per token.", - "copilot-studio": "docs-only: competitor_features#31612 \"Message-metered pricing: $0.01/message or $200/mo pack; cost spikes with generative/autonomous use.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/billing-licensing https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-messages-management billed per Copilot Credit through pay-as-you-go meters or prepaid credit packs, plus per-user licences for makers; no flat price per instance.", "open-webui": "source read at v0.11.4, not driven: no usage metering or seat licensing in the code (searched 'license key|seat|billing' in backend/open_webui), so self-hosting is free; LICENSE:23-33 requires an enterprise licence to rebrand above fifty end users, and the admin notice for more than 50 users points to enterprise licences (translation key 'You have more than 50 users...'); enterprise pricing itself is not in the code", "dify": "source read at 1.17.1, not driven: the self-hosted Community Edition carries no seat or message fee in code (api/services/feature_service.py:24-31 billing limits only for CLOUD); enterprise licences carry a member limit (api/services/entities/feature_entities.py:161 workspace_members LicenseLimitationModel) and Cloud plans limit apps and members (:152-157) Note: community is free; paid editions are limited by members or plan, pricing itself not in code", "n8n": "source read at n8n@2.40.7, not driven: the self-hosted community edition runs without seat or message metering; licensed plans carry quotas such as quota:users and quota:activeWorkflows (packages/@n8n/constants/src/index.ts:63-65) and report billable execution counts daily (packages/cli/src/modules/instance-reporting.ee/instance-reporting.module.ts) Note: Free self-hosting is flat; paid tiers meter users and executions. Pricing itself is not in the code.", @@ -6494,7 +6768,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -6503,7 +6777,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_swarm.py:1-8 parallel specialist workers on the kanban dispatcher (plugins/kanban/systemd/hermes-kanban-dispatcher.service); cron/jobs.py:2652-2653 at-most-once claims across N replicas; hermes_cli/gateway_multiplex_mode.py:1-8 one gateway serves many profiles; gateway/platforms/api_server.py:1322 concurrent API runs", "dify": "source read at 1.17.1, not driven: docker/docker-compose.yaml:227,306,353,660 separate api, Celery worker, beat and agent_backend services; docker/.env.example:57,66-67 SERVER_WORKER_AMOUNT, CELERY_WORKER_AMOUNT, CELERY_AUTO_SCALE; dify-agent/src/dify_agent/runtime/run_scheduler.py schedules concurrent agent runs; schedules dispatched in parallel groups (api/schedule/workflow_schedule_task.py:108)", "n8n": "source read at n8n@2.40.7, not driven: queue mode spreads executions over worker processes (packages/@n8n/config/src/configs/executions.config.ts:90-91 EXECUTIONS_MODE, packages/cli/src/commands/worker.ts, packages/cli/src/scaling/job-processor.ts); several main instances need a licence (packages/cli/src/scaling/multi-main-setup.ee.ts, feat:multipleMainInstances) Note: Workers are free; multi-main high availability is enterprise-licensed. Old partial rested on a bug-fix line.", - "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:381 REDIS_URL and :382 REDIS_CLUSTER for multi-worker socket and task state; models/automations.py:308 FOR UPDATE SKIP LOCKED so several instances share scheduled runs; utils/subagents.py:298 max_concurrent sub-agents; README.md:80 horizontal scalability" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:381 REDIS_URL and :382 REDIS_CLUSTER for multi-worker socket and task state; models/automations.py:308 FOR UPDATE SKIP LOCKED so several instances share scheduled runs; utils/subagents.py:298 max_concurrent sub-agents; README.md:80 horizontal scalability", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-quotas managed cloud service; quotas of thousands of requests per minute per Dataverse environment (for example 8,000 RPM for actions with a paid plan) and adjustable on request." } }, { @@ -6525,7 +6800,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "yes", "open-webui": "partial", @@ -6534,7 +6809,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/openapi/oauth_device.py:103-129 RFC 8628 device flow issues bearer tokens that act as the approving account, scoped by api/libs/oauth_bearer.py:60-65 (apps:run, apps:read, workspace:*); clients allowed only via env OPENAPI_KNOWN_CLIENT_IDS (api/configs/feature/__init__.py:639-646, default difyctl); per-app API keys (api/controllers/console/apikey.py:236) and MCP server per app (api/controllers/mcp/mcp.py:44) Note: no UI to register an outside agent; scope is per-app or coarse token scopes, not a per-tool allowlist", "open-webui": "source read at v0.11.4, not driven: an outside agent can use a user's API key (backend/open_webui/routers/auths.py:1529) limited to listed endpoints by auth.api_key.endpoint_restrictions and allowed_endpoints (utils/auth.py:522-543), acting as that user; searched 'client registration|agent registry|service account' in backend/open_webui: no registry of outside agents or per-agent identity Note: restriction is instance-wide per key type, identity is always a human user", "n8n": "source read at n8n@2.40.7, not driven: outside agents connect to the instance MCP server with an API key or OAuth client (packages/cli/src/modules/mcp/mcp-api-key.service.ts, packages/cli/src/modules/oauth-server) and act as the user who issued it; packages/cli/src/modules/mcp/mcp-scopes.ts:13-50 grantable scopes limit which tools they may call (workflow:read, workflow:write, workflow:execute, agent:read ...), and workflows or agents opt in to MCP one by one (agent.entity.ts:39-40 availableInMCP)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: outside AI agents can call the tools over MCP at /mcp, each call running as the Nextcloud user whose credentials it presents (context_agent:ex_app/lib/mcp_server.py:17-41); only the instance-wide tool categories limit what it may call (context_agent:ex_app/lib/tools.py:33). No per-client registration." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: outside AI agents can call the tools over MCP at /mcp, each call running as the Nextcloud user whose credentials it presents (context_agent:ex_app/lib/mcp_server.py:17-41); only the instance-wide tool categories limit what it may call (context_agent:ex_app/lib/tools.py:33). No per-client registration.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-agent-to-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-use-entra-agent-identities outside agents connect over A2A or as Foundry/Fabric agents with their own authentication; Entra Agent IDs and Agent 365 govern agent identities. Registering an outside agent to call Copilot Studio tools with scoped rights is not documented here. Note: Agent 365 is a separate product." } }, { @@ -6556,7 +6832,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "yes", @@ -6565,7 +6841,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:325 USER.md holds the user's preferences and style and loads every session; hermes_cli/commands.py:163 /personality, :207 /busy, :176 /verbose, :170 /timestamps; web/src/pages/ConfigPage.tsx config editor Note: Preferences are per profile; separate people get separate preferences only through separate profiles or a user-modelling memory provider.", "dify": "source read at 1.17.1, not driven: api/controllers/console/workspace/account.py:376,394,412 account settings are only interface language, theme and timezone; searched 'custom instruction|personal instruction|about you|user preference' in web/i18n/en-US, api/controllers and dify-agent/src: only conversation variables that a builder defines per conversation (web/i18n/en-US/workflow.json:113) Note: no per-person settings for how agents behave", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/Settings/General.svelte:29 personal system prompt, :80 saved to user settings, model parameters (settings.personal.general.modelParameters), language; Personalization.svelte memory on/off; Notifications.svelte delivery; InputMenu.svelte:54 default tool-approval mode", - "n8n": "source read at n8n@2.40.7, not driven: Settings > Context > Preferences holds per-user or shared guidance (en.json:3234-3258, scope 'Just you' or 'Everyone'), used by the n8n Assistant and connected AI tools, and shown only when a PostHog flag is on (packages/frontend/editor-ui/src/features/settings/context/context.utils.ts:20-25); searched 'preference' in packages/cli/src/modules/agents: agents people build do not read them Note: Preferences steer n8n's own assistant, behind a rollout flag." + "n8n": "source read at n8n@2.40.7, not driven: Settings > Context > Preferences holds per-user or shared guidance (en.json:3234-3258, scope 'Just you' or 'Everyone'), used by the n8n Assistant and connected AI tools, and shown only when a PostHog flag is on (packages/frontend/editor-ui/src/features/settings/context/context.utils.ts:20-25); searched 'preference' in packages/cli/src/modules/agents: agents people build do not read them Note: Preferences steer n8n's own assistant, behind a rollout flag.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/memory-overview memory (preview) learns each user's preferences per agent; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"user (settings|preferences)\": no settings page where a person sets how agents work for them." } }, { @@ -6579,14 +6856,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: neither app trains or sends data for training; all model calls go to the instance's TaskProcessing (context_agent:ex_app/lib/nc_model.py:165-179). Whether a provider trains on data depends on the chosen provider app (not read); the code gives no guarantee.", "hermes-agent": "source read at v2026.9.24, not driven: agent/chat_completion_helpers.py:445-453 provider_routing.data_collection ('deny') plus only/ignore provider lists sent to OpenRouter; hermes_cli/model_data_policy_guard.py:23-55 warns before selecting a tier that trains on prompts (Meta contributor only rule); hermes_cli/models_local.py:1-5 local models keep data in house Note: Controls exist per provider route and by choosing local models; nothing guarantees it across all configured providers.", - "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/system-service-card-copilot-studio https://learn.microsoft.com/en-us/microsoft-copilot-studio/data-privacy-security-web-search \"Microsoft does not train foundation models using customer data\"; web search queries \"aren't used to train generative AI foundation models\". Note: Third-party models (Anthropic, Mistral, xAI) run under their own terms; check those.", "dify": "source read at 1.17.1, not driven: searched 'fine.?tun|train on|zero data|data retention' in api/core, api/services and web/i18n/en-US: Dify itself trains nothing and self-hosting lets the organisation pick any provider, including local models via plugins; api/configs/feature/__init__.py:835-845 community telemetry is anonymous and can be disabled. No per-provider no-training guarantee or setting in the product Note: depends on the chosen model provider's terms, nothing in the product enforces or records it", "n8n": "source read at n8n@2.40.7, not driven: no setting guarantees non-training; searched 'training|train on|data usage' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/nodes-langchain/nodes/llms: none; self-hosting with local models (LMChatOllama) keeps data from any outside model, and n8n's own diagnostics can be switched off (packages/@n8n/config/src/configs/diagnostics.config.ts:17) Note: Achievable by architecture (self-host plus local models); otherwise it rests on each provider's terms.", "open-webui": "source read at v0.11.4, not driven: self-hosted with local models (routers/ollama.py) keeps data in-house, and the only outward stats sync is opt-in without message content (src/lib/components/chat/Settings/SyncStatsModal.svelte:367); for remote providers nothing in the code sets or enforces a no-training term (searched 'training|opt.?out|zero retention' in routers/openai.py and utils/anthropic.py) Note: a guarantee only holds for local models" @@ -6603,14 +6880,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: answers show the tools used and the model's reasoning content (assistant:src/components/ChattyLLM/Message.vue:36-72) and an AI-generated notice (ChattyLLMInputForm.vue:178); sensitive actions wait for the user (ov-approval). No plain-language explanation of how an outcome came about.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/display_config.py:16-17 tool progress shows each step taken; hermes_cli/commands.py:190-192 /reasoning show displays model reasoning summaries (agent/reasoning_summaries.py); agent/turn_explainers.py:1-4 explains why a turn ended without an answer; web/src/pages/SessionsPage.tsx full transcript Note: Steps and reasoning can be shown; there is no plain-language account of how an outcome came about for a reviewer who keeps the final say.", - "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/knowledge-copilot-studio citations show sources to users; the activity trace shows makers \"what the agent did and why\" (chain of thought); AI approval stages give a rationale. End users get no plain-language explanation of how an outcome came about.", "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/reasoning-panel.tsx, workflow-process.tsx and tool-detail.tsx show the model's reasoning, each workflow step and tool call under an answer; citation popup names source documents (web/app/components/base/chat/chat/citation/popup.tsx:31); Human Input node lets a person confirm before the next step (web/i18n/en-US/workflow.json:46) Note: raw trace and sources, not a generated plain-language explanation of the outcome", "n8n": "source read at n8n@2.40.7, not driven: runs are traceable step by step (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue; Agents-module session timelines) and the AI Agent node can return its intermediate steps (packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:29 returnIntermediateSteps); searched 'explain|explanation' in packages/cli/src/modules/agents: no plain-language account of how an outcome came about Note: Technical trace, not a plain-language explanation.", "open-webui": "source read at v0.11.4, not driven: answers show sources (Messages/Citations.svelte, ResponseMessage.svelte:910), reasoning and tool steps (Messages/Markdown/MarkdownTokens.svelte:63 groupable 'tool_calls', 'reasoning', 'code_interpreter'); searched 'explain|explanation' in backend/open_webui/utils: no generated plain-language account of how an outcome came about" @@ -6627,14 +6904,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Context Chat can be limited to chosen files, folders or providers per question (assistant:src/components/ContextChat/ContextChatInputForm.vue:25,158-159, context_agent:ex_app/lib/all_tools/context_chat.py:30-57); no admin-set validated corpus the assistant is locked to.", "hermes-agent": "source read at v2026.9.24, not driven: searched 'only answer from|answer only|grounded only|restrict.{0,20}sources' in agent/ tools/ hermes_cli/: none that constrains answers to a document set; tools/website_policy.py:1-5 blocklists sites and hermes_cli/web_routers/tools.py:280 toolset toggles can remove web tools, but nothing limits answers to validated documents Note: A profile can be narrowed by removing tools and by SOUL.md wording; nothing enforces it.", - "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/knowledge-add-existing-copilot https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint standard harness \"Use general knowledge\" off limits answers to added knowledge sources; data policy endpoint filtering restricts which SharePoint sites can be sources. Note: GitHub Copilot harness has no general knowledge switch; it uses the sources you add.", "dify": "source read at 1.17.1, not driven: answers can be grounded in a curated knowledge base, but the limit is only a prompt: api/core/prompt/prompt_templates/advanced_prompt_templates.py:1 'Use the following context as your learned knowledge ... If you don't know, just say that you don't know'; annotation reply returns curated answers above a score threshold (api/controllers/console/app/annotation.py:170,199; web/i18n/en-US/app-debug.json:40-47) Note: no hard switch that blocks answers outside validated documents, and no validated flag on documents", "n8n": "source read at n8n@2.40.7, not driven: an agent can be pointed at chosen documents (Agents-module knowledge files, packages/cli/src/modules/agents/agent-knowledge.controller.ts:48; Question and Answer Chain over a retriever, packages/@n8n/nodes-langchain/nodes/chains/ChainRetrievalQA), and instructions can forbid other sources; searched 'only answer from|grounded only|strict retrieval' in packages/cli/src/modules/agents and nodes/chains: no enforced answer-only-from-sources mode or validation status on documents Note: Relies on instructions; nothing enforces it or marks documents as validated.", "open-webui": "source read at v0.11.4, not driven: an agent can be tied to curated knowledge bases (ModelEditor.svelte:1194) and the admin-editable RAG_TEMPLATE (backend/open_webui/config.py:1096) can forbid outside knowledge, but the default template tells the model to answer from its own knowledge when context lacks it (:1078); searched 'strict|only from|grounded only' in config.py and utils/middleware.py: no enforced sources-only mode Note: possible by prompt configuration, not enforced" @@ -6651,14 +6928,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "no", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'literacy|training|tutorial|learn' in assistant:src: only the AI-output notice (ChattyLLMInputForm.vue:178) and a link to admin docs (AdminSettings.vue:12-15).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/tips.py:1-3 tips at CLI session start; tools/tour_tool.py:1-5 agent-led guided tours of the desktop UI; hermes_cli/journey.py:1 `hermes journey` timeline of what Hermes learned; web/src/pages/DocsPage.tsx:1 docs link in the dashboard Note: Help teaches how to use Hermes, not AI literacy (limits, risks, verification) as training modules.", - "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/system-service-card-copilot-studio https://learn.microsoft.com/en-us/microsoft-copilot-studio/fundamentals-what-is-copilot-studio Microsoft publishes Learn training and application cards; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"AI literacy|training module|onboarding\" for end users: nothing built into agents or the product.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:203 Help, Learn Dify and :620,643-647 step-by-step tour with hands-on lessons on workflows and agents (api/controllers/console/onboarding.py:56); searched 'ai literacy|limitations|hallucinat|responsible' in web/i18n/en-US: nothing explains AI risks or limits to end users Note: product lessons for builders only", "n8n": "source read at n8n@2.40.7, not driven: searched 'literacy|training module|course|learn about AI' in packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src/locales/en.json: no explanation or training modules for users; in-product help is contextual (n8n Assistant, en.json:5361 'Ask anything about n8n')", "open-webui": "source read at v0.11.4, not driven: searched 'literacy|training module|tutorial|course|learn' in src/lib/components and src/routes: only onboarding welcome (OnBoarding.svelte:82) and a docs link; no in-product AI literacy modules" @@ -6675,14 +6952,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'bias|fairness|eval' in both repos: none.", "hermes-agent": "source read at v2026.9.24, not driven: searched '\\bbias\\b|fairness' in agent/ tools/ hermes_cli/ evals/: only ranking bias in tools/session_search_tool.py:693 and a fairness comment in evals/; no bias test runner or stored results", - "copilot-studio": "not checked: demand row mined from the intelligence database on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-rest-api evaluations include a \"hatefulness and unfairness\" safety grader and custom graders (\"Avoids discrimination, bias\"); runs can be scheduled through the API and results downloaded. No dedicated bias test suite.", "dify": "source read at 1.17.1, not driven: searched 'bias|fairness|evaluation|test case' in api/controllers, api/services and web/i18n/en-US: no hits beyond external tracer blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix); no scheduled test runs of agents and no stored bias result", "n8n": "source read at n8n@2.40.7, not driven: evaluations keep scored results per run (packages/cli/src/evaluation.ee/test-runs.controller.ee.ts) with metrics correctness, helpfulness, string similarity, exact match and tools used (en.json:6540-6544); searched 'bias|fairness' in packages/cli/src/evaluation.ee and agent-evals: no bias metric and no recurring schedule for evaluations Note: A bias dataset and its checks must be written by hand and started by hand.", "open-webui": "source read at v0.11.4, not driven: searched 'bias|fairness' in backend/open_webui and src/lib/components: no bias tests; evaluations are user-vote leaderboards (routers/evaluations.py:222)" @@ -6698,14 +6975,14 @@ "hermiq": "no", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'board|claim|handoff' in agent code: one agent; Deck tools manage human boards (context_agent:ex_app/lib/all_tools/deck.py) but no multi-agent task claiming.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/kanban_parser.py:459 `hermes kanban` durable task board shared across profiles; hermes_cli/kanban_db.py:1249 create_task, :2263 claim_task, :2558 reclaim_task, :2723 complete_task; tools/kanban_tools.py:112 kanban_complete/kanban_block agent tools, :237 kanban_comment hand-off between tasks.", - "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-child-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-generative-actions searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"task board|claim|hand off.{0,20}task\": multi-agent work is parent-to-child delegation, no shared board agents claim tasks from.", "dify": "source read at 1.17.1, not driven: searched 'board|claim|kanban|task queue|hand.?off' in web/i18n/en-US/agent-v-2.json, workflow.json and dify-agent/src: no shared task board; agents meet only as nodes in a designed workflow (api/core/workflow/nodes/agent_v2) or as tools (fl-subagent)", "n8n": "source read at n8n@2.40.7, not driven: searched 'task board|kanban|claim|hand off' in packages/@n8n/agents/src and packages/cli/src/modules/agents: the only task list is one agent's own run planner (packages/@n8n/agents/src/runtime/tools/write-todos-tool.ts, planner-todos-tool.ts; en.json:7691-7699) and sub-agent delegation; no board shared by several agents Note: A shared board could be improvised with Data Table nodes as tools, but nothing ships for it.", "open-webui": "source read at v0.11.4, not driven: searched 'board|claim|assign|handoff' in backend/open_webui/tools/builtin.py and utils/subagents.py: create_tasks/update_task (tools/builtin.py:3593, :3643) keep a checklist inside one chat message; sub-agents return a summary to the lead (utils/subagents.py:511), no shared board agents claim from" @@ -6726,14 +7003,14 @@ "hermiq": "no", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each run ends when the model stops calling tools (context_agent:ex_app/lib/graph.py:56-60); scheduled runs reset context each time (assistant:lib/Service/ChatService.php:532-534). No goal check.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:117 /goal 'Set a standing goal Hermes works on across turns until achieved'; gateway/slash_commands_goals.py:37 handler in every messaging channel; hermes_cli/goals.py:397 GoalState, :344 GoalGate shell checks, :860 goal_judge model call decides done.", - "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/harnesses-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-overview the GitHub Copilot harness \"can take a goal, break it into steps ... and adjust when a step fails\", within a task; no standing goal kept across turns until a check passes. Note: GitHub Copilot harness is a production-ready preview.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:20 Loop node with :804 'Loop Termination Condition' and :815 maximum loop count, so a builder can wrap an Agent node in a loop that repeats until a check holds; searched 'goal|until|stop condition' in dify-agent/src: an agent itself has no standing goal across turns Note: only as a builder-designed loop inside one workflow run, not across conversation turns", "n8n": "source read at n8n@2.40.7, not driven: an agent schedule re-runs the same objective on cron (en.json:8113 'Objectives the agent runs on a schedule') but has no completion check; iterate-until-verified exists only in n8n's own builder assistant (packages/@n8n/instance-ai/src/workflow-loop/workflow-loop-controller.ts, verification-obligation.ts); searched 'goal|until reached|success criteria' in packages/cli/src/modules/agents: none Note: Recurring objective without a stop condition; the verify loop belongs to the builder assistant.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1721 timer lets the agent schedule a follow-up prompt back into the same chat (utils/timers.py create_timer, fired by the scheduler at utils/automations.py:90), so it can keep working across turns; searched 'goal|until|success check' in utils/timers.py and utils/middleware.py: no goal object or completion check Note: self-scheduled follow-ups, no goal with a stop condition" @@ -6754,14 +7031,14 @@ "hermiq": "no", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: one TaskProcessing call per turn (context_agent:ex_app/lib/nc_model.py:165-179); searched 'ensemble|multiple models' in both repos: none.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:134 /moa runs a prompt through the Mixture of Agents preset; agent/moa_loop.py:1 reference models gathered before each iteration, aggregator answers; hermes_cli/subcommands/moa.py:10 `hermes moa configure`; hermes_cli/web_routers/models.py:204 GET /api/model/moa for the dashboard.", - "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-agent-model searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"multiple models|several models|ensemble\": one primary model per agent (plus per-feature models), no fan-out and merge.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app-debug.json:31 'Debug as Multiple Models' shows several models side by side, for builder testing only; in a workflow a builder can run several LLM nodes on parallel branches (workflow.json:152 Add Parallel Node, :19 blocks.llm) and merge with a further LLM node or Variable Aggregator (:34) Note: no built-in ensemble setting; hand-built in a flow", "n8n": "source read at n8n@2.40.7, not driven: several model nodes can answer the same input on parallel branches and a Merge node plus a final LLM step can combine them (packages/nodes-base/nodes/Merge, packages/@n8n/nodes-langchain/nodes/chains/ChainLLM); searched 'ensemble|multi-model|compare models' in packages/cli/src/modules/chat-hub and packages/@n8n/nodes-langchain/nodes: no shipped node or chat option that fans out and merges Note: Must be hand-built in a workflow.", "open-webui": "source read at v0.11.4, not driven: several models answer one prompt side by side (permission chat.multiple_models; src/lib/components/chat/Messages/MultiResponseMessages.svelte) and 'Merge Responses' (:439) calls backend/open_webui/routers/tasks.py:610 POST /tasks/moa/completions to fuse them with moa_response_generation_template (:630)" @@ -6782,14 +7059,14 @@ "hermiq": "no", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "yes", "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no model keys in these repos (context_agent:ex_app/lib/nc_model.py uses server TaskProcessing); searched 'key rotation' in both: none.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/auth.py:10 `hermes auth add` pooled credentials; agent/credential_pool.py:122 least_used strategy, :1941 select, :2221 mark_exhausted_and_rotate; agent/agent_runtime_helpers.py:895 the turn rotates to the next key on a quota or auth failure. Note: distinct from mo-failover (second provider) and mo-key-broker (central store): same provider, many keys.", - "copilot-studio": "not checked: demand row mined from the hermes-agent changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-agent-model searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"rotate|rotation\" for model keys: models are Microsoft-managed without customer keys; only CMK and Direct Line secrets rotate.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:387-390 model Load balancing: several credentials per model, round-robin, 1-minute cooldown when rate limited; api/core/model_manager.py:208,440-476 _round_robin_invoke and cooldown on InvokeRateLimitError; api/configs/feature/__init__.py:813-815 MODEL_LB_ENABLED (default False) read in api/services/feature_service.py:115 Note: self-hosted turns it on with an env flag; on Cloud it is plan-gated (common.json:442 'Upgrade your plan to enable Load Balancing')", "n8n": "source read at n8n@2.40.7, not driven: one credential per model node; the AI Agent's fallback model can use a second credential of the same provider when the first call fails (packages/@n8n/nodes-langchain/nodes/agents/Agent/V3/AgentV3.node.ts:118-119 needsFallback, ToolsAgent/V3/execute.ts:85 fallbackModel); searched 'rotate|apiKeys|key pool' in packages/@n8n/nodes-langchain/nodes/llms: no pool of keys spread or rotated per provider Note: Two keys at most, by fallback, not rotation.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:328 normalize_openai_api_keys pairs exactly one key with each base URL; Ollama spreads a model over several URLs at random (routers/ollama.py:863) without keys; searched 'rotate|429|quota|next key' in routers/openai.py and routers/ollama.py: no key pool or rotation on exhaustion" @@ -6810,14 +7087,14 @@ "hermiq": "partial", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'backup|restore|snapshot' in both repos: none. Memories and skills are Nextcloud files, so server backups and file versions cover them (not read).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/subcommands/backup.py:10 `hermes backup` zips ~/.hermes, hermes_cli/backup.py:671 run_backup, :993 run_import; hermes_cli/cli_commands_mixin.py:805 /snapshot list|create|restore; hermes_cli/update_cmd_maint.py:692 automatic snapshot only before an update. No scheduled backup job and no version history (grep backup in cron/: only fallback-provider copy). Note: issue open; automatic backups are limited to the pre-update snapshot.", - "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-platform/admin/backup-restore-environments https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-solutions-import-export Power Platform environments (holding agents in Dataverse) get automatic system backups and restore to an earlier point; solutions export gives manual backups. Note: Read via its MicrosoftDocs source.", "dify": "source read at 1.17.1, not driven: per-object version restore only: agents (api/controllers/console/agent/roster.py:1302), workflows (billing.json:167-168, plan-gated on Cloud) and skills (skill.json:153-157); searched 'backup' in api/, web/i18n/en-US and docker/: only docker/dify-env-sync.sh backing up the .env file (docker/README.md:151-159); no automatic backup of all agent data Note: no platform backup; restore of single agent or workflow versions", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/commands/export/entities.ts:35 'Export database entities to JSON files' and packages/cli/src/commands/import/entities.ts restore them; workflows and agents roll back to earlier versions (packages/cli/src/workflows/workflow-history/workflow-history.controller.ts, packages/cli/src/modules/agents/agent-publish.controller.ts:87); source control pushes to Git (feat:sourceControl); searched 'backup' schedule in packages/cli/src: no automatic backup Note: Manual CLI export, not automatic; point-in-time restore is per workflow or agent.", "open-webui": "source read at v0.11.4, not driven: manual only: backend/open_webui/routers/utils.py:74 GET /utils/db/download returns the raw SQLite file (admin, ENABLE_ADMIN_EXPORT config.py:2082, not for PostgreSQL), routers/configs.py:118 export and :100 import config, chat export and import (routers/chats.py:807); searched 'backup|snapshot|restore' in backend/open_webui/routers and utils: no automatic backup or point-in-time restore" @@ -6839,14 +7116,14 @@ "hermiq": "no", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'a2a|remote agent|delegate' in context_agent:ex_app: none; only MCP tools from other servers (context_agent:ex_app/lib/all_tools/mcp.py).", "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/a2a/plugin.yaml:6 bundled A2A plugin, outbound a2a_discover/a2a_call/a2a_orchestrate; plugins/platforms/a2a/tools.py:173 a2a_call sends a task to a configured peer or URL and returns the reply, :255 a2a_orchestrate; :330 tools appear only once a2a_agents or the platform is configured. Note: issue #689 is still open but the A2A plugin shipped in core covers remote delegation; config-gated, off by default.", - "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-agent-to-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-foundry-agent connect an agent on another server over the A2A protocol (GA April 2026) or a Foundry agent; the main agent sends tasks and uses the answer.", "dify": "source read at 1.17.1, not driven: a remote agent can be reached only as a tool: MCP servers added as tool providers (api/controllers/console/workspace/tool_providers.py:1373), custom OpenAPI tools (:685) or an HTTP Request node (web/i18n/en-US/workflow.json:11); searched 'a2a|remote agent|agent.?card' in api/core and web/i18n/en-US: no agent-to-agent protocol Note: works through MCP or HTTP wrappers, no native remote agent hand-off", "n8n": "source read at n8n@2.40.7, not driven: the instance MCP server exposes 'call_agent' under the agent:execute scope (packages/cli/src/modules/mcp/mcp-scopes.ts:73), and an agent on another n8n calls it through the MCP Client Tool node (packages/@n8n/nodes-langchain/nodes/mcp/McpClientTool) or an Agents-module MCP server entry (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:228-303); any remote agent behind a webhook is reachable with the HTTP Request tool", "open-webui": "source read at v0.11.4, not driven: a remote agent server can be added as a model connection (OpenAI-compatible, routers/openai.py:865; README.md:94 Open WebUI Computer 'Connect it into Open WebUI as a model') or reached as an MCP/OpenAPI tool server (utils/middleware.py:2340); searched 'a2a|agent2agent|remote agent' in backend/open_webui: no agent-to-agent protocol, and delegate_task only spawns local clones (utils/subagents.py:317)" @@ -6867,14 +7144,14 @@ "hermiq": "no", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the model wrapper only waits when rate limited (context_agent:ex_app/lib/nc_model.py:206-219); searched 'rate' in both repos: no per-minute cap.", "hermes-agent": "source read at v2026.9.24, not driven: searched 'requests_per_minute|rpm|token_bucket|throttle|rate_limit_delay' in agent/, run_agent.py, hermes_cli/: agent/rate_limit_tracker.py:181 only displays provider RPM headers; rate_limit_delay is accepted in hermes_cli/config.py:993 and hermes_cli/config_providers.py:260 but nothing in agent/ reads it. No client-side limiter. Note: a config key nothing reads, so no. Same demand in #58061.", - "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-quotas Microsoft applies requests-per-minute quotas per environment and throttles; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"rate limit\" in settings: makers cannot set their own RPM cap per agent.", "dify": "source read at 1.17.1, not driven: api/controllers/console/agent/roster.py:749 max_active_requests caps concurrent requests per app, enforced in api/services/app_generate_service.py:153,384; provider rate limits are only handled reactively by load-balancing cooldown (api/core/model_manager.py:469-476); searched 'per.?minute|rpm' in api/configs and api/core/model_manager.py: per-minute limits exist only for the openapi token and forms (api/configs/feature/__init__.py:1063) Note: concurrency cap, not requests per minute to a provider", "n8n": "source read at n8n@2.40.7, not driven: the AI Agent, Text Classifier and Summarization nodes process items in batches with a delay between batches (packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V3/execute.ts:85,121-122 batchSize, delayBetweenBatches), and model nodes retry with maxRetries (packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:591,844); searched 'requests per minute|rpm|rate limit' in nodes/llms and packages/cli/src/modules/agents: no per-provider request cap Note: Throttling by batch delay, not a requests-per-minute cap; inbound channel rate limits are something else.", "open-webui": "source read at v0.11.4, not driven: searched 'rate_limit|rpm|requests per minute|throttle' in backend/open_webui/routers/openai.py, routers/ollama.py, config.py and utils/middleware.py: the only RateLimiter use is sign-in (routers/auths.py:91); no per-agent cap on provider requests" @@ -6895,14 +7172,14 @@ "hermiq": "yes", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: task input carries prompt, history and tools only (context_agent:ex_app/lib/nc_model.py:97-160); searched 'temperature' in both repos: none.", "hermes-agent": "source read at v2026.9.24, not driven: no temperature key in hermes_cli/config*.py (grep temperature hermes_cli: none for the main agent); agent/chat_completion_helpers.py:1416 only fixed per-model temperatures; a custom provider's extra_body (hermes_cli/config.py:993, applied at agent/agent_runtime_helpers.py:1937) can pass one; MoA presets have reference/aggregator temperature (hermes_cli/web_models.py:152). Note: issue open; only indirect paths.", - "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/nlu-prompt-node https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompt-model-settings prompts expose temperature per prompt; the agent's orchestration model has no temperature setting.", "dify": "source read at 1.17.1, not driven: web/features/agent-v2/agent-detail/configure/components/orchestrate/model-config/field.tsx:29-39 ModelParameterModal per agent renders the provider's parameter rules including temperature (web/app/components/header/account-setting/model-provider-page/model-parameter-modal/__tests__/presets-parameter.spec.tsx); LLM nodes and classic apps use the same modal", "n8n": "source read at n8n@2.40.7, not driven: chat model nodes take a temperature option, e.g. packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:543 and LMChatAnthropic/LmChatAnthropic.node.ts:369 Note: Agents-module agents expose reasoning effort instead (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:514); no temperature field there.", "open-webui": "source read at v0.11.4, not driven: per agent in ModelEditor 'Advanced Params' (ModelEditor.svelte:1127) using src/lib/components/chat/Settings/Advanced/AdvancedParams.svelte:27 temperature, :434 label; per user and per chat in the same component; stored in Model.params (backend/open_webui/models/models.py:119)" @@ -6924,14 +7201,14 @@ "hermiq": "partial", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: memory is one tree per user, organised by subject folders (context_agent:ex_app/lib/all_tools/memory.py:246-260); searched 'project' scoping in memory code: none.", "hermes-agent": "source read at v2026.9.24, not driven: tools/memory_tool.py:39 memory dir is per profile (HERMES_HOME/memories), so a profile per project gives separate memory but no shared layer; agent/prompt_builder.py:139 project .hermes.md/HERMES.md is read-only context; agent/skill_utils.py:437 project-local skills. Searched 'project.scoped|memory_scope' in agent, tools, plugins/memory: none. Note: issue open.", - "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/memory-overview memory is one store per user per agent; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"project\" in memory pages: no per-project memory.", "dify": "source read at 1.17.1, not driven: api/models/agent.py:126-131 agent working directories are owned per workflow run, conversation or build draft only; searched 'project' in web/i18n/en-US/agent-v-2.json and dify-agent/src: no project scope and no memory split into project and shared parts", "n8n": "source read at n8n@2.40.7, not driven: Agents-module memory is kept per agent and resource: per user, per chat thread, per task (packages/cli/src/modules/agents/utils/agent-memory-scope.ts:1-60), and agents live in projects; workflow memory nodes take any session key, so a per-project key plus a shared key can be wired by hand (packages/@n8n/nodes-langchain/nodes/memory/MemoryPostgresChat); searched 'shared memory|project memory' in packages/cli/src/modules/agents: none Note: No built-in pairing of a project memory with a shared one.", "open-webui": "source read at v0.11.4, not driven: memories are per user with an optional path hierarchy (backend/open_webui/models/memories.py:24 path; tools/builtin.py:800 list_memory_paths, :831 read_memory_path), so a project path can hold its own facts; folders (projects) carry files and a system prompt (utils/middleware.py:2591) but searched 'folder' in utils/memory.py and routers/memories.py: no memory scoped to a project" @@ -6953,14 +7230,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "no", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: conversations live in the Assistant chat only (assistant:lib/Service/ChatService.php); searched 'channel|talk bot' in both repos: no carry-over.", "hermes-agent": "source read at v2026.9.24, not driven: gateway/slash_commands_session.py:862 /resume, :323 a stored session is only resumable from the same platform and thread, :303 cross-origin resume only for an explicitly configured admin with --all; all sessions share one state.db so the local CLI can reopen them. Note: issue open; cross-channel is admin-only in the gateway.", - "copilot-studio": "not checked: demand row mined from the hermes-agent feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/publication-channels-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/memory-overview searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"across channels|continue.{0,30}conversation\": conversations are per channel; only per-user memory (preview) carries preferences across channels.", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:124-128 a caller resumes a conversation by passing conversation_id with the same user id, so two self-built channels on the Service API can share one thread; conversations are filtered by end user (api/services/conversation_service.py:56-57) and the web app session is a separate end user, so nothing carries over between the web app and a messenger plugin Note: only by a builder passing ids through the API", "n8n": "source read at n8n@2.40.7, not driven: memory and threads are keyed by channel identity: an n8n user's chats use draft-chat:, a messenger user integration:: (packages/cli/src/modules/agents/utils/agent-memory-scope.ts:1-45), so a Slack or Telegram conversation cannot be resumed in n8n's own chat; searched 'handoff|continue in|link account' in packages/cli/src/modules/agents/integrations: none Note: Sessions from other channels are visible read-only in the session list (en.json agentSessions.origin.slack), not continuable.", "open-webui": "source read at v0.11.4, not driven: chats are stored server-side so the same chat opens on any browser or the PWA (backend/open_webui/routers/chats.py:1325), but searched 'telegram|slack|messenger|move to channel' in backend/open_webui/routers and utils: there are no messenger channels and no way to carry a chat into a channel or back" @@ -6977,14 +7254,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'snapshot|publish|build' in both repos: none.", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/publication-fundamentals-publish-channels https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/publication-publish-agent publishing \"creates a live version of the current draft\"; draft changes do not reach users until the next publish, which replaces the previous version.", "dify": "source read at 1.17.1, not driven: api/models/agent.py:218 AgentHomeSnapshot captured when a build is applied; release 1.17.0 'Build-time Home Snapshots' restores the sandbox home on each published run", "n8n": "source read at n8n@2.40.7, not driven: publishing stores a snapshot of config, custom tool code and skills (packages/cli/src/modules/agents/entities/agent-history.entity.ts:34-47) and production runs use that active version (entities/agent.entity.ts:53-59 activeVersionId); workflows likewise run their published version; knowledge files (agent-knowledge.controller.ts:48) and installed community node packages are not pinned to the snapshot Note: Config and code are frozen per publish; files and installed packages can change underneath.", "open-webui": "source read at v0.11.4, not driven: searched 'snapshot|pin|lock|build' in backend/open_webui/models/models.py, routers/models.py and utils/terminals.py: runs use the model's current config and the terminal's live filesystem; no frozen build of files and tools per published agent" @@ -7001,14 +7278,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "yes", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'pip|npm|install|subprocess' in context_agent:ex_app/lib/all_tools/: none.", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-windows-365-agents the Windows 365 for Agents shell checks commands against an allow list and blocks global npm installs and similar; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"npm|pip install|package registry\": no agent-driven CLI tool install.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:237,251 'Add a CLI Tool', 'Install a CLI tool from any package registry. The agent gains shell access to the binary it provides'", "n8n": "source read at n8n@2.40.7, not driven: with a sandbox configured, Agents-module agents get workspace tools incl. workspace_execute_command (packages/@n8n/agents/src/workspace/tools/workspace-tools.ts:23-29, attached at packages/cli/src/modules/agents/agent-runtime-reconstruction.service.ts:868-893), so an agent can install and run a CLI tool; the sandbox is off by default (packages/@n8n/config/src/configs/agents.config.ts:84) Note: Needs the opt-in Agents module plus a configured Daytona or n8n sandbox; plain workflow agents have no shell.", "open-webui": "source read at v0.11.4, not driven: in an attached Open Terminal the agent can install packages through run_command (backend/open_webui/utils/tools.py:1439; separate first-party server, README.md:96); the browser Pyodide sandbox installs Python wheels with micropip (src/lib/workers/pyodide.worker.ts:72-73); core has no install tool of its own Note: needs Open Terminal for real CLI tools" @@ -7025,14 +7302,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no shell or code execution tool exists (searched 'exec|shell' in all_tools).", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-where-computer-use-runs https://learn.microsoft.com/en-us/microsoft-copilot-studio/use-cloud-pc-pool computer use runs on a hosted browser / Windows 365 Cloud PC pool (Microsoft cloud) or on the customer's own registered machine. Note: Hosted browser is preview.", "dify": "source read at 1.17.1, not driven: docker/.env.example:271 DIFY_AGENT_RUNTIME_BACKEND=local, docker/docker-compose.e2b.yaml ships the E2B backend; web/i18n/en-US/agent-v-2.json:91 notes the limits of the community local sandbox", "n8n": "source read at n8n@2.40.7, not driven: the operator picks where assistant code runs: packages/@n8n/config/src/configs/instance-ai.config.ts:73-74 N8N_INSTANCE_AI_SANDBOX_PROVIDER 'n8n-sandbox' (hosted service) or 'daytona' (own or hosted Daytona), and Code node runners run as a child process or a separate runner container (packages/@n8n/config/src/configs/runners.config.ts:16-17) Note: An instance-wide environment setting that also decides where Agents-module workspaces run (packages/cli/src/services/sandbox-settings.service.ts:103-109), not a choice per agent.", "open-webui": "source read at v0.11.4, not driven: admin chooses the code engine: src/lib/components/admin/Settings/CodeExecution.svelte:20 'pyodide' (in the browser) or 'jupyter' (own server), and per agent an Open Terminal server (ModelEditor.svelte:1268 TerminalSelector, AddTerminalServerModal.svelte); searched 'e2b|daytona|modal|cloud sandbox' in backend/open_webui: no hosted cloud sandbox option Note: choice between self-hosted engines only" @@ -7049,14 +7326,14 @@ "hermiq": "unknown", "nextcloud-assistant": "yes", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: GET /chat/generate?sessionId=&agencyConfirm=1|0 answers a pending approval (assistant:lib/Controller/ChattyLLMController.php:489-491), documented in assistant:openapi.json (/ocs/v2.php/apps/assistant/chat/generate).", "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals approvals are answered in the Teams Approvals app, Outlook or the Power Automate portal; approval records live in Dataverse, but an API answer path is not documented in these pages.", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/human_input_form.py:78 /form/human_input/; api/controllers/openapi/human_input_form.py:63,83 read and submit a human input form", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Wait/Wait.node.ts:332-335 'On Webhook Call' resumes a waiting execution when another program calls its resume URL; send-and-wait approvals answer through a URL too (packages/nodes-base/utils/sendAndWait/utils.ts); Agents module resumes a paused run through packages/cli/src/modules/agents/agent-chat.controller.ts:199-200 POST /:agentId/chat/resume", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1893 POST /api/v1/chats/{id}/messages/{message_id}/resolve with ResolveToolCallForm action approve|reject|answer (utils/tool_approval.py:13), then resumes the run (main.py:1903 build_tool_approval_resume_payload); usable with an API key" @@ -7073,14 +7350,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: only the session's own user can confirm (assistant:lib/Service/ChatService.php:360-372 checks the user's session); searched 'approver' in both repos: none.", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-request-for-information each approval stage sets \"who the approval should be assigned to\" with \"First to respond\" or \"Everyone must approve\"; request-for-information goes to named addresses.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:558-561 the approval form can be emailed to chosen workspace members or external recipients, but searched 'assignee|approver' in workflow.json and api/controllers/web/human_input_form.py: whoever holds the form link can answer", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts:177-180 an approvers list: anyone else who clicks gets a private refusal (:56); packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:39-57 'Restrict Who Can Approve' and 'Unauthorized Reply' Note: Enforced in Slack and Telegram approvals; e-mail approval links can be answered by whoever holds the link.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/tool_approval.py:28 only the chat owner or an admin may resolve a pending call; searched 'approver|assignee' in utils/tool_approval.py and utils/middleware.py: no named approvers" @@ -7097,14 +7374,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'context window|tokens' in assistant:src/components/ChattyLLM: only a 64,000 character input limit notice (ChattyLLMInputForm.vue:191).", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/troubleshooting-error-codes searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"context (window|usage)\": only a troubleshooting hint to start a new conversation, no meter.", "dify": "source read at 1.17.1, not driven: searched 'context usage|context window|tokens used' in web/i18n/en-US/agent-v-2.json, share.json and app-debug.json: no indicator; compaction runs silently (dify-agent/src/dify_agent/runtime/compaction.py)", "n8n": "source read at n8n@2.40.7, not driven: the agent preview's menu shows the session's token spend and duration (packages/frontend/editor-ui/src/features/agents/components/AgentPreviewMoreMenu.vue:138,303; en.json:8227 'Token spend') and chat hub admins set a context window in messages (en.json:3694); searched 'context window|contextUsage' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents components: no meter of how full the window is Note: Token totals, not a fill level against the model's window.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput.svelte:1837 'Context usage' readout fed by :535 statusContextUsage; backend/open_webui/utils/context_compaction.py:254 get_chat_context_usage against the compaction threshold (:290 _build_context_usage), returned with chats at routers/chats.py:1308, :1344" @@ -7121,14 +7398,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agents or flows to sort; searched 'folder' in chat session code: none.", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-solutions-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-export-import-copilot-components solutions and component collections group agents and flows; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"folder\" in authoring pages: no folders on the agents or flows list.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:667-669 apps can carry tags (permission-keys.json app.tag.manage) to filter the list; no folders", "n8n": "source read at n8n@2.40.7, not driven: workflows sort into folders (packages/cli/src/controllers/folder.controller.ts:60-125, each route @Licensed('feat:folders'); en.json:1765 'Add folder'); agents have no folder field (packages/cli/src/modules/agents/entities/agent.entity.ts:8-71) and are grouped by project only Note: Workflows only, and licence-gated.", "open-webui": "source read at v0.11.4, not driven: agents are grouped by tags, not folders (src/lib/components/workspace/Models.svelte:67 TagSelector, backend/open_webui/routers/models.py:270 /models/tags); folders exist for chats (routers/folders.py) and an automation's folder_id only files its generated chats (models/automations.py:25); there are no flows to sort" @@ -7145,14 +7422,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows or run views (searched 'compare|diff' in assistant:src).", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-results https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer evaluation runs compare side by side (\"Comparison with\"); flow runs open one at a time on the canvas, no two-run diff.", "dify": "source read at 1.17.1, not driven: searched 'compare' in web/i18n/en-US/workflow.json and run-log.json: run history opens one run's tracing at a time (workflow.json:240-254), no comparison view", "n8n": "source read at n8n@2.40.7, not driven: evaluation runs compare side by side with Cases, Outputs, Metrics and a 'Workflow diff' tab (en.json:6521-6524; packages/frontend/editor-ui/src/features/ai/evaluation.ee/components/Compare/) and workflow versions diff visually (packages/frontend/editor-ui/src/features/workflows/workflowDiff/WorkflowDiffView.vue); searched 'compare' in packages/frontend/editor-ui/src/features/execution/executions: no side-by-side of two ordinary executions Note: Comparison exists for evaluation runs and versions, not for two production runs.", "open-webui": "source read at v0.11.4, not driven: searched 'compare|diff' in src/lib/components/automations and backend/open_webui/routers/automations.py: runs are listed one by one (AutomationEditor.svelte:355-400); side-by-side view exists only for different models answering one prompt (chat/Messages/MultiResponseMessages.svelte), not for two runs" @@ -7169,14 +7446,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'hallucinat|claimed|verify' in context_agent:ex_app: none.", "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-create the evaluation \"Tool use\" grader fails a test case that did not use the expected tools; not applied to live answers.", "dify": "source read at 1.17.1, not driven: issue is open against the function-calling agent runner; searched 'fabricat|expected tool|zero tool call' in api/core/agent and dify-agent/src: no check", "n8n": "source read at n8n@2.40.7, not driven: the evaluation metric 'Right tools used' scores whether expected tools were called (en.json:6544), after the fact on test cases; at run time only a prompt rule asks the model not to claim an action before its tool returns (packages/cli/src/modules/agents/integrations/integration-tool-descriptions.ts:29); searched 'claim|hallucinat|unsupported' in packages/@n8n/agents/src/runtime: no check that flags a live answer Note: Caught in evaluations, not flagged on a live answer.", "open-webui": "source read at v0.11.4, not driven: searched 'hallucinat|claimed|without calling|verify tool' in backend/open_webui/utils/middleware.py and utils/tools.py: no check that flags an answer claiming a result the agent never fetched with a tool" @@ -7193,14 +7470,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent can loop over DuckDuckGo search and web_fetch and is told to fetch result pages (context_agent:ex_app/lib/agent.py:143-158, context_agent:ex_app/lib/all_tools/duckduckgo.py, web.py); no dedicated deep-research mode or cited report.", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/microsoft-365-copilot-node-workflow a workflow node can call Microsoft 365 Copilot's Researcher agent for research and audit drafting; no deep research tool native to Copilot Studio agents. Note: Needs Microsoft 365 Copilot.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: an Agents-module agent can be set up for research with web search (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:80-84), parallel sub-agents (:151-160) and cited knowledge reads (packages/cli/src/modules/agents/agent-knowledge-retrieval.ts:199); there is no research mode, and OpenAI deep-research models are switched off in chat (packages/cli/src/modules/chat-hub/chat-hub.constants.ts:226-231, 603-605) Note: Assembled from agent settings; no one-click deep research.", "open-webui": "source read at v0.11.4, not driven: no research mode (searched 'deep.?research' in backend/open_webui and src/lib/components: hits only in stale locale files); pieces exist: tools/builtin.py:294 search_web, :333 fetch_url, :1680 delegate_task parallel sub-agents, citations in chat/Messages/Citations.svelte" @@ -7217,14 +7494,14 @@ "hermiq": "unknown", "nextcloud-assistant": "yes", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "unknown", "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: sign-in is Nextcloud's own, where two-factor providers apply (server and twofactor apps, not read); every Assistant route requires that session (assistant:lib/Controller/ChattyLLMController.php NoAdminRequired, no PublicPage).", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-conditional-access https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-use-entra-agent-identities sign-in goes through Microsoft Entra ID, where Conditional Access policies require MFA for Copilot Studio. Note: Entra ID P1 for Conditional Access.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/mfa/totp.service.ts and packages/cli/src/controllers/mfa.controller.ts:73-115 authenticator-app setup (QR, enable) with a code at sign-in (en.json:6099 'Two-factor authentication'); forcing it on everyone is licence-gated, mfa.controller.ts:31 enforce-mfa with feat:mfaEnforcement (packages/@n8n/constants/src/index.ts:18) Note: Enforcement for all users is enterprise-licensed.", "open-webui": "source read at v0.11.4, not driven: searched 'totp|two.?factor|2fa|mfa|webauthn|passkey' in backend/open_webui and src/lib/components: no second factor; MFA only through an outside OIDC provider (utils/oauth.py)" @@ -7241,14 +7518,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "unknown", "n8n": "no", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: messages are stored as plain text columns (assistant:lib/Migration/Version010010Date20240430083738.php:55-68); searched 'encrypt' in both repos: none.", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-customer-managed-keys CMK encrypts an environment with the organisation's key; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"user.{0,10}key|end-to-end\": no per-user key that locks out admins.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: chat messages are stored as ordinary rows (packages/cli/src/modules/chat-hub/chat-hub-message.entity.ts); instance encryption covers credentials with an instance key (packages/cli/src/encryption/key-manager.service.ts, packages/core/src/encryption/cipher.ts); searched 'end-to-end|e2ee|user key' in packages/cli/src/modules/chat-hub and packages/cli/src/encryption: no per-user key", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/internal/db.py:289 whole-database encryption with sqlite+sqlcipher and DATABASE_PASSWORD, instance-wide; searched 'encrypt' in models/chats.py: chats stored readable to the server and admins, no per-user key" @@ -7265,14 +7542,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "unknown", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the MCP client config is one admin JSON for all users (context_agent:ex_app/lib/main.py:103-110, context_agent:ex_app/lib/all_tools/mcp.py:14-20); no per-user login to outside MCP servers. The reverse direction (this instance as MCP server) does run as the caller (mcp_server.py:31-41).", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-extend-action-mcp MCP servers connect with OAuth 2.0 so \"individual users grant access to their data\"; tool calls then run with that user's rights.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: an agent's MCP server takes one OAuth or header credential chosen by its builder (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:243-252, McpOAuth2Api at packages/@n8n/nodes-langchain/credentials/McpOAuth2Api.credentials.ts); per-person MCP connections exist for n8n's own assistant (packages/cli/src/modules/instance-ai/entities/instance-ai-thread-grant.entity.ts) and per-user resolution in workflows needs licensed dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee) Note: Per-person login only in the assistant or with an enterprise licence.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/tools.py:137-158 tool server auth types bearer, session, system_oauth, oauth_2.1 and oauth_2.1_static; src/lib/components/AddToolServerModal.svelte:143 registers an OAuth client for MCP; per-user tokens encrypted in utils/oauth.py:269 Note: discussion still open, but the code has per-user OAuth 2.1 for MCP" @@ -7289,14 +7566,14 @@ "hermiq": "unknown", "nextcloud-assistant": "unknown", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "unknown", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: the agent calls TaskProcessing only (context_agent:ex_app/lib/nc_model.py:165-179); the provider protocol is chosen inside integration_openai, not read.", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/bring-your-own-model-prompts \"If you use the model's Responses API endpoint ... the connection fails\"; only chat completions endpoints are supported.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:255-260 'Use Responses API' option; chat hub providers carry responsesApiEnabled (packages/@n8n/api-types/src/chat-hub.ts:585)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/AddConnectionModal.svelte:51 apiType '' or 'responses'; backend/open_webui/routers/openai.py:1589 is_responses, :1618-1634 posts to {url}/responses with convert_to_responses_payload Note: discussion still open; the code ships it" @@ -7320,7 +7597,7 @@ "evidence": { "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: no caching in these repos; provider-side caching would be in integration_openai or the provider, not read.", "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "not checked: docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompt-model-settings https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-messages-management not checked: searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"prompt cach|caching\" and found nothing on provider-side prompt caching; billing is per Copilot Credit, so any caching is invisible to customers.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatAnthropic/LmChatAnthropic.node.ts:531-590 promptCaching option with 5m or 1h lifetime; Agents-module agents set promptCaching per agent (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:75-78, en.json:7904) Note: A switch per model node or agent, not on for every provider (an open request asks for it on OpenRouter).", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/anthropic.py:111 _copy_cache_control passes cache_control through when the caller sets it; searched 'cache_control|prompt.?cach' in utils/payload.py and routers/openai.py: nothing adds cache breakpoints automatically" @@ -7337,14 +7614,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "unknown", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the run pauses before a sensitive action and asks Confirm or Cancel, with the option to reply with new instructions (assistant:src/components/ChattyLLM/AgencyConfirmation.vue:10-30,76); free questions end the turn. No suggested-answer buttons.", "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-ask-a-question https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-generative-actions generative orchestration generates \"questions to ask the user for missing information\"; Question nodes offer multiple-choice options before continuing.", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: workflows: the Chat node's 'Wait for User Reply' and approval response type pause the run for the person's answer (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/Chat.node.ts:141,172); Agents module: a chat_action card with buttons or radio choices suspends the run until answered (packages/@n8n/api-types/src/agents/types.ts:379, packages/frontend/editor-ui/src/features/agents/components/interactive/InteractiveCard.vue:46-55, en.json:7684 'Waiting on the card above to continue')", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:518 ask_user (1-3 questions with options and free text), resolved via utils/tool_approval.py:13 action 'answer'; src/lib/components/chat/AskUserCard.svelte mounted at chat/MessageInput.svelte:1776; survives reload (CHANGELOG.md:331)" @@ -7361,14 +7638,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: TaskProcessing task types declare input shapes that the Assistant renders as fields, enums and numbers (assistant:src/components/fields/TaskTypeFields.vue, EnumField.vue, NumberField.vue); the agent chat has no such form.", "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-ask-with-adaptive-card https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-bot-greeting an Adaptive Card form in the Conversation Start topic can collect fields at the start; agents do not declare typed start fields natively.", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: an n8n Form Trigger collects declared fields (text, dropdown and more) before a workflow runs and can hand them to an AI Agent (packages/nodes-base/nodes/Form/FormTrigger.node.ts); chat agents only offer suggested prompts (packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:62-63); searched 'formFields|inputFields' in packages/cli/src/modules/chat-hub and nodes/trigger/ChatTrigger: no fields declared by the agent itself Note: Hand-built as a form in front of an agent workflow.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/chat_variables.py:127 get_chat_variables_schema parses fields from the system prompt; routers/models.py:60 add_chat_variables_schema; ModelEditor.svelte:1084 'Chat Variables' (CHANGELOG.md:655)" @@ -7385,14 +7662,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "unknown", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: message actions are copy, regenerate and delete (assistant:src/components/ChattyLLM/MessageActions.vue:9-32); searched 'fork|branch' in chat code: none.", "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-history searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"fork|branch the conversation|edit.{0,20}message\": nothing.", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: editing or regenerating a message keeps the original and adds a branch (packages/cli/src/modules/chat-hub/chat-hub-message.entity.ts:103-114 previousMessageId, retryOfMessageId, revisionOfMessageId; chat-hub.controller.ts:224,283 edit and regenerate), and the user flips between branches (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatMessageActions.vue:119-136 '1/2' alternatives; en.json:658-659) Note: Branches live inside the same conversation rather than as a separate copy.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1672 POST /chats/{id}/fork copies the chat up to a message and records the branch (utils/chat_fork.py:4 build_fork_history); fork button per response src/lib/components/chat/Messages/ResponseMessage.svelte:1528 (CHANGELOG.md:665)" @@ -7409,14 +7686,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in either repo (searched 'flow|workflow').", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-platform/alm/extend-pipelines https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-solutions-overview Power Platform pipelines with delegated deployment require approval from an authorised identity before a solution (agent or flow) reaches the next stage.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/workflow-reviews.ee/workflow-review-publish-guard.service.ts:8-22 blocks publishing while a review is open or changes are requested; reviewers per request in packages/@n8n/db/src/entities/workflow-review-request-reviewer.ee.ts; review inbox in packages/frontend/editor-ui/src/features/workflow-reviews/; licence flag feat:workflowReviews (packages/@n8n/constants/src/index.ts:58). Enterprise-licensed; workflows only, not Agents-module agents.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" @@ -7433,14 +7710,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent logs task input text at INFO, skipping only the conversation token (context_agent:ex_app/lib/main.py:169-178); searched 'redact|mask' in both repos: no policy.", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-sensitive-data https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-transcript-controls per variable \"sensitive data\" keeps values out of transcripts and logs; admins turn transcript saving off per environment or environment group. No instance-wide redaction policy.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/redaction/ (instance-redaction-enforcement.service.ts, redaction-policy.ts) redacts execution data by policy, a default module; redaction-context-hook.ts:53 skips unless isDataRedactionLicensed (feat:dataRedaction, packages/@n8n/constants/src/index.ts:56). Enterprise-licensed.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" @@ -7457,14 +7734,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent keeps its memories and skills under 'Context Agent/' in the user's Assistant folder (context_agent:ex_app/lib/all_tools/memory.py:26, assistant:lib/Service/AgentSkillsService.php:31) and task output files can be saved there (assistant:appinfo/routes.php:35,38); files it creates go wherever it writes in the user's Files. No per-session workspace.", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/created-files-overview agents create files during a conversation, stored with it so user and agent reference them across turns. Note: Preview, GitHub Copilot harness.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/workspace/tools/workspace-tools.ts:23-29 workspace_read_file, workspace_write_file, workspace_str_replace_file, workspace_execute_command; attached per agent in packages/cli/src/modules/agents/agent-runtime-reconstruction.service.ts:868-893 (agent-workspace.service.ts:42); only when a sandbox is configured (packages/@n8n/config/src/configs/agents.config.ts:84, default false) and in the opt-in Agents module.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" @@ -7481,14 +7758,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: multimodal chat passes attached files as file parts by id (context_agent:ex_app/lib/nc_model.py:58-68, agent.py:222-224), so a PDF reaches the provider unconverted; whether the model reads it natively depends on the provider (not read). Text tasks parse files to text first (POST /api/v1/parse-file).", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-inputs-prompt https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/attachments-overview prompt document input accepts PDF directly; agent attachments extract PDF text (\"Text is extracted for the agent to reason over\").", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:43-48 'Automatically Passthrough Binary PDFs' on the AI Agent node for models with native PDF input, e.g. Gemini; OpenAI Responses API support for it per release 2.28.0.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" @@ -7505,14 +7782,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'browser|playwright|selenium|click' in context_agent:ex_app: only HTTP GET via web_fetch (context_agent:ex_app/lib/all_tools/web.py).", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/computer-use https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new computer use (GA May 2026) lets agents automate web and desktop apps by controlling browsers: open pages, click, fill in forms.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Airtop/Airtop.node.ts:23 usableAsTool with session, window, interaction, extraction and agent resources (:44-64) driving a cloud browser as an AI Agent tool (needs an Airtop account); n8n's own assistant drives the user's Chrome through packages/@n8n/mcp-browser (README.md:3-6), browser use on by default (packages/@n8n/config/src/configs/instance-ai.config.ts:65-66).", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" @@ -7529,14 +7806,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no cap in code; graph.astream runs without a recursion_limit (context_agent:ex_app/lib/agent.py:256), so LangGraph 1.0.1's default recursion limit is the only stop (context_agent:poetry.lock:2043-2050). Note: Needs a live check on the default value.", "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-generative-actions https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-quotas searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"maximum number of (tool|steps)|step limit|loop\": no maker setting that caps tool calls per run.", "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:22-25 maxIterations (default 10) and V3/helpers/checkMaxIterations.ts:6-14 stop the loop after that many iterations; Agents module maxIterations 1-200 (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:518); a turn with several parallel tool calls counts once, so there is no cap on tool calls as such, which the open request asks for.", "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" @@ -7553,14 +7830,14 @@ "hermiq": "unknown", "nextcloud-assistant": "yes", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool nodes have a fallback that returns 'Error: ... please fix your mistakes' to the agent as a tool message (context_agent:ex_app/lib/graph.py:22-41), and tools return error objects the agent reads (context_agent:ex_app/lib/all_tools/skills.py:96-113).", "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/harnesses-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-overview the GitHub Copilot harness \"retries and finds alternative paths automatically\"; standard harness follows the authored paths and error topics. Note: GitHub Copilot harness is a production-ready preview.", "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: the Agents-module runtime adds a failed tool call as an error result so the model can self-correct (packages/@n8n/agents/src/runtime/tools/tool-call-executor.ts:686-687); the workflow AI Agent node stops on a tool error unless the node is set to continue on fail (packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/executeBatch.ts:114-121), which the open request says ends reasoning.", "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" @@ -7577,14 +7854,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no provider sign-in in these repos (models via TaskProcessing, context_agent:ex_app/lib/nc_model.py:165-179).", "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-external-response-model models come with the Copilot Studio licence; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"subscription.{0,20}(login|sign in)\": no provider account sign-in.", "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/credentials/ holds API-key credentials for every model provider (OpenAiApi, AnthropicApi, MistralCloudApi ...); the only OAuth sign-in is Azure Entra for Azure OpenAI (AzureEntraCognitiveServicesOAuth2Api.credentials.ts); searched 'copilot|chatgpt oauth' in packages/@n8n/nodes-langchain: none.", "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" @@ -7601,14 +7878,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a failed scheduled run posts a fixed error message (assistant:lib/Service/AssignmentsService.php:153-159); searched 'diagnos|fix' in both repos: none.", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-manage-monitor https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"Copilot.{0,40}(fix|troubleshoot|diagnos)\": failed runs are inspected by hand; no assistant that proposes a fix.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: n8n Assistant (Instance AI, default module at packages/@n8n/backend-common/src/modules/module-registry.ts:79) 'Debug failed executions and suggest fixes' (packages/frontend/@n8n/i18n/src/locales/en.json:5360); failed runs hand off to it from the editor (release 2.28.0 'Investigate failed executions on Instance AI editor hand-offs'); needs a model set up.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" @@ -7625,14 +7902,14 @@ "hermiq": "unknown", "nextcloud-assistant": "yes", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Tables tools create tables, columns and rows and read them back (context_agent:ex_app/lib/all_tools/tables.py:16-378), available when the Nextcloud Tables app is installed (tables.py:410-411).", "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-dataverse https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-dataverse every environment has Dataverse; agents read tables as knowledge and create, read and update records (Dataverse connector, Dataverse MCP create_record/read_query). Note: MCP server preview.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/DataTable/DataTable.node.ts:27 usableAsTool, so an AI Agent reads and writes rows in n8n's built-in data tables (data-table is a default module, packages/@n8n/backend-common/src/modules/module-registry.ts:51); outside agents read rows through the MCP data table tools (packages/cli/src/modules/mcp/mcp-scopes.ts dataTable:read, dataTable:write).", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" @@ -7649,14 +7926,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the session list offers one Delete action per conversation (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:36-42) and DELETE /chat/delete_session takes one sessionId (assistant:lib/Service/ChatService.php:142); no bulk delete.", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-transcript-controls https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-transcripts-powerapps only admins bulk-delete transcript records in Dataverse; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"delete.{0,40}conversations\": no end-user bulk delete of chats.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" @@ -7673,14 +7950,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: '{user}' is replaced with the display name in chat user instructions (assistant:lib/Service/ChatService.php:71) and the agent prompt gets today's date (context_agent:ex_app/lib/agent.py:137,186); no other placeholders.", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-child-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-file-groups \"To reference tools, variables, or add Power Fx formulas in your instructions, enter a slash (/)\"; system variables such as User.DisplayName and Power Fx Today()/Now() fill in per user and date.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" @@ -7697,14 +7974,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: outputs of file actions and the new-file image menu get the system tag 'Generated using AI' (assistant:lib/Service/SystemTagService.php:18, lib/Listener/FileActionTaskSuccessfulListener.php:33); files the agent writes with upload_file are not tagged (context_agent:ex_app/lib/all_tools/files.py:148-165).", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/system-service-card-copilot-studio docs advise makers to \"inform your users that AI generated some of the conversation\" in the start topic; created Word/PowerPoint content inherits sensitivity labels. No automatic AI-generated label on outputs.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" @@ -7721,14 +7998,14 @@ "hermiq": "unknown", "nextcloud-assistant": "no", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every skill's name and description is put in the system prompt (context_agent:ex_app/lib/agent.py:165-177); searched 'search|rag' in skills.py: no skill search.", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-overview skills \"implement a progressive disclosure pattern so agents load only the context they need\"; the runtime picks a skill by its description, but no search over a large skill set is documented. Note: Preview.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" @@ -7745,14 +8022,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each unified search provider becomes a tool automatically (context_agent:ex_app/lib/all_tools/search.py:11-30); other tools are fixed modules shipped in all_tools or admin-added MCP servers (context_agent:ex_app/lib/tools.py:19-50).", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-certification https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors third parties add tools as certified connectors and certified MCP servers (certification preview) that appear in the tool picker; installed apps do not register tools with an agent on their own.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" @@ -7769,14 +8046,14 @@ "hermiq": "unknown", "nextcloud-assistant": "partial", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the MCP server forwards the client's Authorization header to /ocs/v2.php/cloud/user to find the user (context_agent:ex_app/lib/mcp_server.py:17-41); searched 'oauth|well-known' in context_agent:ex_app: no OAuth discovery or flow.", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-dataverse outside clients such as Claude Desktop sign in with Entra ID to the Dataverse MCP server (preview); there is no MCP server for Copilot Studio agents themselves.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" @@ -7793,14 +8070,14 @@ "hermiq": "unknown", "nextcloud-assistant": "yes", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: reasoning output is stored per message (assistant:lib/Listener/ChattyLLMTaskListener.php:130-131, lib/Migration/Version030500Date20260630083738.php:34) and shown in a 'Reasoning content' popover and while streaming (assistant:src/components/ChattyLLM/Message.vue:36-47,79-80).", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace the maker view shows \"the reasoning card within the chat\" and the activity trace shows chain-of-thought steps; end users do not see the reasoning next to answers.", "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" @@ -7817,14 +8094,14 @@ "hermiq": "unknown", "nextcloud-assistant": "yes", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant registers an audio-to-audio translate provider (assistant:lib/TaskProcessing/AudioToAudioTranslateProvider.php:32-43) chaining transcription, translation and speech.", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-consent-based-record https://learn.microsoft.com/en-us/microsoft-copilot-studio/multilingual voice channels offer call recording, transcription and real-time translation (Dynamics 365 voice) and multilingual agents; no translation of an uploaded recording played back.", "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" @@ -7841,14 +8118,14 @@ "hermiq": "unknown", "nextcloud-assistant": "yes", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Files action 'Generate subtitles using AI' posts to /api/v1/file-action/{fileId}/core:audio2text:subtitles (assistant:src/files/fileActions.js:164-190) with a notification when ready.", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-overview searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"subtitle|caption|SRT|VTT\": nothing; no subtitle generation for recordings.", "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" @@ -7865,19 +8142,259 @@ "hermiq": "unknown", "nextcloud-assistant": "yes", "hermes-agent": "unknown", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: attachments go to the multimodal agent as file parts (context_agent:ex_app/lib/nc_model.py:58-68, agent.py:222-224) and output_attachments are saved on the answer (assistant:lib/Listener/ChattyLLMTaskListener.php:135-140, context_agent:ex_app/lib/agent.py:296-297).", "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "copilot-studio": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/image-input-analysis https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/created-files-overview users send images that vision models analyse; the GitHub Copilot harness can return created files including an image or chart (preview); native image generation is not supported in agents.", "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" }, "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-computer-use", + "area": "tools", + "name": "Let an agent operate desktop applications on a Windows machine by looking at the screen and clicking, when the application has no API.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "yes", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/computer-use https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-where-computer-use-runs computer use GA (May 2026) automates web and desktop apps by controlling them; runs on a hosted Cloud PC or the customer's own machine.", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-custom-metrics", + "area": "observability", + "name": "Define my own analytics measures in plain language and see them next to the built-in ones.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "partial", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-custom-metrics up to three custom metrics described in natural language, calculated over conversations (preview, April 2026).", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-question-themes", + "area": "observability", + "name": "See the questions people ask an agent grouped into themes, and drill into each theme.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "partial", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-themes themes group related user questions with drill-down (preview since October 2025).", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-savings-tracking", + "area": "observability", + "name": "Track how much time and money an agent saves compared with doing the work by hand.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "yes", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-flow-savings https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-cost-savings makers define savings rules per agent flow and agent; analytics show time and cost saved (solution-based flows only).", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-call-consent", + "area": "compliance", + "name": "Ask a caller for consent before a voice call with an agent is recorded and transcribed.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "yes", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-consent-based-record consent-based recording prompts callers and continues without recording or transcription when consent is refused (May 2026).", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-async-flow-step", + "area": "flows", + "name": "Let a long-running flow step return its result to the agent later instead of failing on a time limit.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "yes", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-asynchronous-response \"Asynchronous flows continue running beyond the previous two-minute limit while still returning a response to the agent\" (new infrastructure only).", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-builder-upgrade", + "area": "reuse", + "name": "Upgrade an agent someone built in the lightweight in-chat builder into the full agent builder without starting over.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "yes", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents copy agents created in Microsoft 365 Copilot (Agent Builder) into Copilot Studio to add workflows and integrations (November 2025).", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-metadata-filter", + "area": "memory", + "name": "Limit which documents an agent searches by their metadata, such as owner, file name or modified date.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "yes", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint SharePoint metadata filters (file name, owner, modified date) refine knowledge retrieval (November 2025).", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-eval-in-pipeline", + "area": "reuse", + "name": "Run an agent's test set automatically from a build pipeline through an API and fail the build on regressions.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "partial", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-rest-api https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-automate-tools evaluations run from the Power Platform API (preview) or the Power Automate connector for CI/CD and recurring checks.", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" + }, + { + "id": "dm-agent-as-code", + "area": "reuse", + "name": "Edit an agent as files in a code editor, keep it in git and sync the changes back to the builder.", + "source": "competitor-derived", + "origin": "changelog", + "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", + "hermiq": "unknown", + "nextcloud-assistant": "unknown", + "hermes-agent": "unknown", + "copilot-studio": "yes", + "dify": "unknown", + "n8n": "unknown", + "open-webui": "unknown", + "evidence": { + "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-clone-agent the Visual Studio Code extension (GA January 2026) clones an agent to a local folder, supports git and applies changes back to Copilot Studio.", + "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + }, + "note": "hermiq not checked: back-fill pending" } ], "pending": [ @@ -7900,7 +8417,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "partial", @@ -7909,7 +8426,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: gateway/profile_routing.py:1-11 a requester's user id can route to their own profile, whose own keys and credentials then apply (agent/secret_scope.py:1-10); tools/environments/ssh.py runs the terminal as a configured remote account; searched 'run.?as|impersonat|service account|on behalf of' in agent/ and gateway/: no per-run identity choice Note: Tools act with the host or backend account and the profile's keys; choosing requester, owner or service identity per agent is not a setting.", "dify": "source read at 1.17.1, not driven: api/core/agent/entities.py:19 each agent tool carries a credential_id the builder picks; api/models/tools.py:121 credential visibility, web/i18n/en-US/plugin.json:27 an OAuth credential is 'only for you or shared with all workspace members'. So a tool runs as the builder's or a shared workspace credential; searched 'on_behalf|end_user credential|user_credential' in api/core/tools and api/core/plugin: no run-as-the-asking-person Note: owner or shared credential only, no per-caller identity and no service-account concept", "open-webui": "source read at v0.11.4, not driven: interactive runs act as the asking user (main.py:1118 with user from the session); automation runs act as the owner with a minted token (backend/open_webui/utils/automations.py:389 'typ': 'automation', re-gated at :366); searched 'service account|run as|impersonat' in backend/open_webui: the rights holder cannot be chosen Note: fixed by trigger type, no service-account option", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent always runs with the rights of the person who asked (context_agent:ex_app/lib/main.py:190-191) and MCP calls with the caller's login (context_agent:ex_app/lib/mcp_server.py:31-41); no choice of owner or service account." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent always runs with the rights of the person who asked (context_agent:ex_app/lib/main.py:190-191) and MCP calls with the caller's login (context_agent:ex_app/lib/mcp_server.py:31-41); no choice of owner or service account.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-use-entra-agent-identities per tool \"use the user's (End user) or maker's (Maker-provided) credentials\"; each agent also has its own Microsoft Entra Agent ID for scoped connector permissions (service-account style)." }, "pendingReason": "Whether actingUser is set anywhere outside seed/repair scripts on a live instance could not be settled without running the app." }, @@ -7932,7 +8450,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "yes", @@ -7941,7 +8459,8 @@ "open-webui": "source read at v0.11.4, not driven: Channels put colleagues and models in one timeline: backend/open_webui/routers/channels.py:976 model_response_handler answers @mentioned models (:1244) in rooms and threads; src/lib/components/channel/Channel.svelte, Thread.svelte, MessageInput/MentionList.svelte; group and member channel types (translation 'A collaboration channel where people join as members') Note: old partial; shared agent conversations happen in channels", "hermes-agent": "source read at v2026.9.24, not driven: gateway/config.py:574-596 thread_sessions_per_user false by default, so everyone in a thread shares one session with the agent (group_sessions_per_user can be switched off for whole groups); gateway/session.py:634-641 session key resolution; hermes_cli/commands.py:76 /branch opens a shared thread", "n8n": "source read at n8n@2.40.7, not driven: in the opt-in Agents module a Slack or Discord thread is one shared conversation whose memory belongs to the thread, not the author (packages/cli/src/modules/agents/utils/agent-memory-scope.ts:9-20); chat hub conversations are private to one user (packages/cli/src/modules/chat-hub/chat-hub.controller.ts:110 by req.user.id) Note: Shared only through a chat platform channel, not in n8n's own chat.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: sessions belong to one user (assistant:lib/Service/ChatService.php:50,175-180 by userId); searched 'share|participant' in chat code: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: sessions belong to one user (assistant:lib/Service/ChatService.php:50,175-180 by userId); searched 'share|participant' in chat code: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-add-bot-to-microsoft-teams https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/memory-overview an agent added to a Teams group chat or channel converses with several colleagues in one thread (memory and SSO are off there); no shared session in the web chat." }, "pendingReason": "Whether every talk-shared-sessions requirement is complete cannot be settled without running a live Talk room." }, @@ -7965,7 +8484,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "partial", "open-webui": "no", @@ -7975,7 +8494,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app.json:2 web app access 'Anyone with the link'; api/controllers/web/passport.py:53-72 issues a token to an anonymous end-user session, so a resident chats without an account; filing the request needs a builder-built HTTP Request node or custom tool (web/i18n/en-US/workflow.json:11,45); no ready-made intake to a case or request system in core Note: anonymous chat is core; the filing target has to be wired by hand", "open-webui": "source read at v0.11.4, not driven: searched 'anonymous|guest|public chat|intake' in backend/open_webui/routers/auths.py, routers/chats.py and src/routes: every chat requires an account (utils/auth.py get_verified_user); no anonymous assistant that files a request", "n8n": "source read at n8n@2.40.7, not driven: a public chat page or embedded widget needs no n8n account (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/ChatTrigger.node.ts:408-452 'public', packages/frontend/@n8n/chat), and the agent behind it can file a request with any tool node; the filing flow has to be built as a workflow Note: The anonymous chat is shipped; the request filing is hand-built.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'PublicPage|guest|anonymous' in assistant:lib/Controller: every route needs a logged-in user." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'PublicPage|guest|anonymous' in assistant:lib/Controller: every route needs a logged-in user.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/configuration-end-user-authentication https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-connect-bot-to-web-channels \"No authentication\" lets anyone on a public website chat with the agent, and topics/flows file the request (Dataverse, connectors); the IT Helpdesk and Website Q&A templates show the pattern." } }, { @@ -8001,7 +8521,7 @@ "n8n": "yes", "open-webui": "partial", "evidence": { - "copilot-studio": "docs-only: competitor_features#31605 \"1400+ connectors (Power Platform): Reuses Power Platform / Power Automate connector catalogue.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors agents use 1,400+ prebuilt Power Platform connectors to outside services, plus custom connectors.", "dify": "source read at 1.17.1, not driven: core ships only audio, code, time and webscraper tools (api/core/tools/builtin_tool/providers/); connectors come from the in-product Dify Marketplace: about 149 official tool plugins (langgenius/dify-official-plugins tools/, e.g. slack, jira, notion, gmail, salesforce, nextcloud) plus about 1,290 community packages (langgenius/dify-plugins), installed from web/app/(commonLayout)/integrations; MCP client too Note: rated partial only by the brief's plugin rule; the catalogue is well over a hundred ready-made connectors, one click from the core UI. The lane keeps partial under the plugin rule (ruling 2026-09-26).", "n8n": "source read at n8n@2.40.7, not driven: 272 nodes in packages/nodes-base/nodes declare usableAsTool: true (e.g. Slack, Gmail, Google Calendar, Trello, Jira, Notion, SharePoint), any of which an AI Agent can call; plus MCP registry servers (packages/cli/src/modules/mcp-registry, default module)", "hermes-agent": "source read at v2026.9.24, not driven: tools/connectors/__init__.py:1-6 and tools/connectors/gateway/client.py:1-3 managed connector accounts through the Nous tool gateway; optional-mcps/ 65 Nous-approved MCP servers (asana, atlassian, notion, stripe, supabase, ...); plugin-catalog/ ~290 curated plugins Note: The managed connector set needs a Nous account; the MCP and plugin catalogs are self-configured.", @@ -8034,7 +8554,7 @@ "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: ask_context_chat searches all the user's documents or a chosen scope (context_agent:ex_app/lib/all_tools/context_chat.py:28-59); the agent can also read files directly (files.py:27-46). Note: Context Chat app and backend not read.", - "copilot-studio": "docs-only: competitor_features#31606 \"Dataverse knowledge grounding: Grounds agents on SharePoint, Dataverse, Graph and external sources.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-file-upload answers are grounded in files from SharePoint and OneDrive (respecting user permissions) or uploaded files; no Nextcloud Files source. Note: Nextcloud-phrased row: own surface.", "dify": "source read at 1.17.1, not driven: knowledge bases from uploaded files (api/controllers/console/datasets/datasets_document.py:384) and datasource plugins; official datasources are S3, Azure, Box, Dropbox, Google Drive, OneDrive, SharePoint, Confluence, Notion, GitHub, GitLab and others, no Nextcloud (langgenius/dify-official-plugins datasources/); only the official nextcloud tool plugin can download_file at run time (tools/nextcloud/tools/download_file.yaml) Note: old yes rested on generic RAG; Nextcloud Files is not a knowledge source, only a plugin tool fetch", "open-webui": "source read at v0.11.4, not driven: RAG over uploaded files and knowledge bases: backend/open_webui/routers/retrieval.py (hybrid BM25 + vector, reranking), tools/builtin.py:3151 query_knowledge_files, :2509 query_chat_files; sources are uploads, Google Drive and OneDrive pickers (chat/MessageInput/InputMenu.svelte:399, :692); searched 'nextcloud|webdav' in backend/open_webui: no Nextcloud Files source Note: old yes; grounding works but not on Nextcloud Files", "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1133-1270 read_file and search_files let the agent read and grep documents on the host on demand; gateway/platforms/base.py:1183-1231 attached documents are read into the turn; searched 'nextcloud' repo-wide: none, and no document index in core (RAG only via plugins/memory/retaindb, openviking) Note: Grounding in local files by reading them, not in Nextcloud Files and not through an index.", @@ -8061,7 +8581,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "no", "open-webui": "yes", @@ -8070,7 +8590,8 @@ "hermes-agent": "source read at v2026.9.24, not driven: searched 'acl|permission.{0,20}(user|requester)|allowed to see' in tools/file_tools*.py, tools/session_search_tool.py and agent/: file access follows the host account and tools/file_tools_write_guards.py protects Hermes' own files, not per-requester visibility; tools/session_search_tool.py:1-9 searches the whole profile's sessions Note: All users of one profile share what the agent can read; nothing filters by the asking person.", "dify": "source read at 1.17.1, not driven: api/models/dataset.py:163,184-187 dataset permission (only_me, all_team, partial_members) governs which builders may attach a knowledge base, not what the end user may see; retrieval does not check the asking person. A builder can hand-build a manual metadata filter bound to a variable (api/core/workflow/nodes/knowledge_retrieval/entities.py:46-48, knowledge_retrieval_node.py:312-327 convert_template) Note: no document ACL trimming; only a hand-built metadata filter per flow", "n8n": "source read at n8n@2.40.7, not driven: searched 'permission|acl|access' in packages/cli/src/modules/agents/agent-knowledge-retrieval.ts, tools/knowledge/ and packages/@n8n/nodes-langchain/nodes/vector_store/shared: retrieval returns whatever the agent's store holds, with only static metadata filters (packages/@n8n/agents/src/sdk/vector-store-filter.ts:5-19); nothing trims results to what the asking person may see", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every agent run and MCP call executes as the requesting user (context_agent:ex_app/lib/main.py:190-191, mcp_server.py:31-41), so file, share and search results are limited to what that user may see; memories and skills live in the user's own folder (context_agent:ex_app/lib/all_tools/memory.py:26)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every agent run and MCP call executes as the requesting user (context_agent:ex_app/lib/main.py:190-191, mcp_server.py:31-41), so file, share and search results are limited to what that user may see; memories and skills live in the user's own folder (context_agent:ex_app/lib/all_tools/memory.py:26).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents with SharePoint knowledge \"the agent surfaces only content that the user has permission to access\"; Microsoft 365 Copilot uses the user's credentials for mail and files." }, "pendingReason": "Needs checking OpenRegister's ObjectService/ACL enforcement for the session identity the chat request actually runs under; out of scope for a hermiq-only read." }, @@ -8092,7 +8613,7 @@ "featureConfidence": "high", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -8101,7 +8622,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:106 agent Files 'for reference material too long to paste into the Prompt: specs, templates, guidelines', :274 persistent in every run; workspace Skills are versioned Markdown SKILL.md packages with files (api/models/skill.py:56-66; web/i18n/en-US/skill.json referenceFiles.livePlaceholder) attached per agent (api/controllers/console/workspace/skills.py:811)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/terminals.py:189 get_terminal_agents_md loads AGENTS.md from the attached Open Terminal and :239 add_terminal_agents_md injects it; notes can be attached as documents (chat/MessageInput/InputMenu.svelte:322 Attach Notes); folder system prompt and files (utils/middleware.py:2591)", "n8n": "source read at n8n@2.40.7, not driven: Agents-module skills carry markdown reference files next to their instructions (en.json:8077-8084 'References', 'Markdown reference'; packages/frontend/editor-ui/src/features/agents/components/AgentSkillFileNav.vue) and agents search uploaded Markdown or PDF knowledge files (en.json:7925) Note: Agents module is opt-in (not in module-registry.ts:44 defaultModules).", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skills are markdown instruction documents (SKILL.md) the agent loads when relevant (context_agent:ex_app/lib/agent.py:165-177, context_agent:ex_app/lib/all_tools/skills.py:84-113); admins also set chat user instructions (assistant:src/components/AdminSettings.vue:123-141)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: skills are markdown instruction documents (SKILL.md) the agent loads when relevant (context_agent:ex_app/lib/agent.py:165-177, context_agent:ex_app/lib/all_tools/skills.py:84-113); admins also set chat user instructions (assistant:src/components/AdminSettings.vue:123-141).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-instructions https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-overview instructions up to 8,000 characters plus uploaded files and skills written in Markdown give an agent standards and guidance documents. Note: Skills are preview." }, "pendingReason": "hermiq-context-documents change (assembler + editor) is open, not implemented -- the schema field exists but nothing reads or writes it yet." }, @@ -8123,7 +8645,7 @@ "featureConfidence": "high", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "partial", "n8n": "no", "open-webui": "no", @@ -8133,7 +8655,8 @@ "dify": "source read at 1.17.1, not driven: api/models/skill.py:62,66 skills are unique per tenant_id (workspace); api/controllers/console/workspace/skills.py:494 export and :385 import (web/i18n/en-US/skill.json:224 '.zip with SKILL.md, agentskills.io format') copy a skill into another workspace; searched 'share' in skill.json and skills.py: no live cross-workspace sharing Note: copy by export/import only, updates do not follow", "open-webui": "source read at v0.11.4, not driven: skills are shared by access grants to users, groups or everyone on one instance (backend/open_webui/routers/skills.py:357 access update); searched 'tenant|organization' in backend/open_webui/models: no organisations to share across", "n8n": "source read at n8n@2.40.7, not driven: skills are stored inside one agent (packages/cli/src/modules/agents/entities/agent.entity.ts:35-36 skills column); searched 'share' in packages/cli/src/modules/agents/agents-skills.controller.ts and agent-skills.service.ts: no sharing of a skill with other projects or organisations; the shared Skills area is 'Coming soon' (en.json:3231-3232)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: an admin can point a global skills folder that all users of the instance get (assistant:lib/Service/AgentSkillsService.php:331-361, src/components/AdminSettings.vue:183-214); no organisations to share between." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: an admin can point a global skills folder that all users of the instance get (assistant:lib/Service/AgentSkillsService.php:331-361, src/components/AdminSettings.vue:183-214); no organisations to share between.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-manage https://learn.microsoft.com/en-us/microsoft-copilot-studio/multi-tenant-overview searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"share.{0,30}skill|tenant\" in skills pages: skills are shared only by downloading and re-uploading the file; no cross-tenant skill sharing." } }, { @@ -8155,7 +8678,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "yes", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -8164,7 +8687,8 @@ "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/completion.py:324 POST /v1/chat-messages and :175 completion-messages with per-app API keys (api/controllers/console/apikey.py:236); web/i18n/en-US/agent-v-2.json agentDetail.access.serviceApi 'Backend Service API' with API Reference per agent; client SDKs in sdks/nodejs-client, sdks/php-client", "n8n": "source read at n8n@2.40.7, not driven: a workflow agent is called from any program through its Webhook or Chat Trigger URL (packages/nodes-base/nodes/Webhook, packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger), or through the documented instance MCP endpoint's execute_workflow tool (packages/cli/src/modules/mcp/mcp.controller.ts:117, mcp-scopes.ts:44); the public REST API (packages/cli/src/public-api/v1/handlers/workflows/spec/paths/) manages workflows and reads executions", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1109 POST /api/v1/chat/completions and :898 /api/v1/models (OpenAI-compatible), :2003 /api/v1/messages (Anthropic-compatible) with user API keys (routers/auths.py:1529); OpenAPI docs at main.py:508 /docs (served when ENV is dev)", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: documented OCS API in assistant:openapi.json for chat sessions, messages, /chat/generate and /assignments (assistant:appinfo/routes.php:40-60, lib/Controller/AssignmentsApiController.php:59-208); the agent itself is reachable as TaskProcessing task type core:contextagent:interaction (context_agent:ex_app/lib/provider.py:20-26)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: documented OCS API in assistant:openapi.json for chat sessions, messages, /chat/generate and /assignments (assistant:appinfo/routes.php:40-60, lib/Controller/AssignmentsApiController.php:59-208); the agent itself is reachable as TaskProcessing task type core:contextagent:interaction (context_agent:ex_app/lib/provider.py:20-26).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-connect-bot-to-custom-application https://learn.microsoft.com/en-us/microsoft-copilot-studio/publication-integrate-web-or-native-app-m365-agents-sdk programs talk to an agent through the documented Bot Framework Direct Line API (token, conversationId) or the Microsoft 365 Agents SDK and Client SDK." }, "pendingReason": "whether third-party integrators are actually told about this API anywhere outside the code cannot be settled by reading the repo alone" }, @@ -8187,7 +8711,7 @@ "featureConfidence": "high", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -8197,7 +8721,8 @@ "dify": "source read at 1.17.1, not driven: searched 'algoritme|algorithm.?regist|register|ai act' in api/, web/app and web/i18n/en-US: no hits for an algorithm register or any export to one; apps and agents carry no register fields (api/models/agent.py, api/models/model.py)", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'algoritmeregister|algorithm register|register' in backend/open_webui/routers and src/lib/components/admin: no publication to the Dutch Algoritmeregister", "n8n": "source read at n8n@2.40.7, not driven: searched 'algoritme|algorithm register|algoritmeregister' in packages/cli/src, packages/nodes-base/nodes and packages/frontend/editor-ui/src: no connection to the Dutch Algoritmeregister", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'algoritme|register' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'algoritme|register' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/geo-data-residency searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"algoritme|algorithm register|public register\": no publication to the Dutch Algoritmeregister." } }, { @@ -8219,7 +8744,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "no", - "copilot-studio": "unknown", + "copilot-studio": "no", "dify": "no", "n8n": "no", "open-webui": "no", @@ -8229,7 +8754,8 @@ "dify": "source read at 1.17.1, not driven: searched 'dpia|impact assessment|fundamental rights|privacy assessment' in api/, web/app and web/i18n/en-US: no hits; agents have name, description, role and icon only (api/controllers/console/agent/roster.py:706), no field or link for an assessment", "open-webui": "source read at v0.11.4, not driven: searched word-bounded 'dpia|impact assessment|fundamental rights' in backend/open_webui and src/lib/components: models have no field or link for an assessment (backend/open_webui/models/models.py:74 ModelMeta)", "n8n": "source read at n8n@2.40.7, not driven: searched 'DPIA|IAMA|fundamental rights|impact assessment' in packages/cli/src, packages/@n8n/api-types/src/agents and packages/frontend/editor-ui/src: no link from an agent or workflow to an assessment record", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dpia|assessment' in both repos: none." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'dpia|assessment' in both repos: none.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/geo-data-residency https://learn.microsoft.com/en-us/microsoft-copilot-studio/personal-data-summary Microsoft supplies DPIA guidance for the service through the Service Trust portal; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"DPIA|impact assessment\" in agent settings: no link from an agent to its DPIA or FRIA." } }, { @@ -8251,7 +8777,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "no", "hermes-agent": "yes", - "copilot-studio": "unknown", + "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", @@ -8260,7 +8786,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:152,217 'Add Parallel Node' parallel branches on the canvas; :684-702 Iteration node Parallel Mode with maximum parallelism over list items; api/configs/feature/__init__.py:949 MAX_SUBMIT_COUNT thread pool for parallel node execution; Agent nodes (blocks.agent-v2, api/core/workflow/nodes/agent_v2) can sit on each branch or inside the iteration Note: fan-out is designed in the flow; an agent cannot spawn parallel sub-agents itself at run time (see fl-subagent)", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680 delegate_task 'Delegate focused work to a parallel sub-agent', foreground bounded by a semaphore (utils/subagents.py:370 max_concurrent, default 20) and background runs (:364 max_async); admin limits in src/lib/components/admin/Settings/Subagents.svelte", "n8n": "source read at n8n@2.40.7, not driven: Agents-module sub-agents run in parallel up to a set number (en.json:8010-8011 'Max parallel sub-agents', packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:151-159 maxChildren) with tool calls in parallel (:517 toolCallConcurrency, en.json:7906); background sub-agents that outlive the turn need N8N_AGENTS_BACKGROUND_TASKS_ENABLED (packages/@n8n/config/src/configs/agents.config.ts:79-80, default false) Note: Agents module is opt-in; in workflows an AI Agent can call several AI Agent Tool nodes, and branches run in sequence.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the graph routes on the first tool call only ('This assumes single tool calls', context_agent:ex_app/lib/graph.py:62-66); searched 'parallel|subagent' in context_agent:ex_app: no sub-agents." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the graph routes on the first tool call only ('This assumes single tool calls', context_agent:ex_app/lib/graph.py:62-66); searched 'parallel|subagent' in context_agent:ex_app: no sub-agents.", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-add-other-agents https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-overview orchestration delegates to child and connected agents, and flows run branches in parallel; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"parallel\" for agents: no documented concurrent run of several sub-agents on one task." }, "pendingReason": "whether delegated sub-agent calls actually run concurrently needs a live run to confirm timing" }, @@ -8283,13 +8810,13 @@ "featureConfidence": "medium", "nextcloud-assistant": "partial", "hermes-agent": "partial", - "copilot-studio": "partial", + "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: two levels only: admin settings (assistant:lib/Settings/Admin.php, ConfigController::setAdminConfig without NoAdminRequired, lib/Controller/ConfigController.php:67) and user features (NoAdminRequired routes). No builder role.", - "copilot-studio": "docs-only: competitor_features#31609 \"Governance & DLP: Admin governance, data-loss-prevention policies and environment isolation.\"", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-share-bots https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-sharing-controls-limits https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new roles: owner, Editor (co-author, needs Environment Maker), Viewer (chat only), Analytics Viewer, Bot Transcript Viewer, and admin roles; Dataverse security roles. Note: Old partial understated the documented roles.", "dify": "source read at 1.17.1, not driven: api/models/account.py:21-26 workspace roles owner, admin, editor, normal, dataset_operator; web/i18n/en-US/common.json:224 admin 'Can build apps & manage team settings', :234 editor 'Can build & edit apps', :267 normal 'Only can use apps'; api/controllers/console/workspace/members.py:368 change a member's role Note: enterprise-licensed RBAC (api/configs/enterprise/__init__.py:38 RBAC_ENABLED) adds custom roles and per-agent permission sets (web/i18n/en-US/permission-keys.json); the basic roles are in community", "n8n": "source read at n8n@2.40.7, not driven: instance roles owner, admin, member and project roles admin, editor, viewer (packages/@n8n/permissions/src/roles/scopes/project-scopes.ee.ts); the admin role needs feat:advancedPermissions (packages/cli/src/services/user.service.ts:544), project roles feat:projectRole:* and custom roles feat:customRoles (packages/@n8n/constants/src/index.ts:34-37,51) Note: Role model exists; admin, builder-style project roles and custom roles are enterprise-licensed. Matches old partial.", "open-webui": "source read at v0.11.4, not driven: roles admin, user, pending (backend/open_webui/utils/auth.py get_admin_user / get_verified_user); per-group permissions for workspace models, knowledge, tools, skills (builder rights) and chat features (src/lib/components/admin/Users/Groups/Permissions.svelte:44-71, config.py DEFAULT_USER_PERMISSIONS)", @@ -8316,7 +8843,7 @@ "featureConfidence": "medium", "nextcloud-assistant": "yes", "hermes-agent": "partial", - "copilot-studio": "unknown", + "copilot-studio": "yes", "dify": "partial", "n8n": "no", "open-webui": "yes", @@ -8326,7 +8853,8 @@ "dify": "source read at 1.17.1, not driven: web/i18n-config/languages.ts:158-162 nl-NL 'Nederlands' marked supported; web/i18n/nl-NL has all 37 namespaces, but about 3,800 of 5,947 values are identical to en-US (e.g. workflow.json 921 of 1161, dataset-documents.json 258 of 260 untranslated), while agent-v-2, permission and skill are translated Note: Dutch is selectable, roughly two thirds of the UI still shows English", "open-webui": "source read at v0.11.4, not driven: src/lib/i18n/locales/nl-NL/translation.json: 3432 of 3518 keys translated; language picker in src/lib/components/chat/Settings/General.svelte (settings.personal.general.language); 60+ locales in src/lib/i18n/locales", "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/@n8n/i18n/src/locales/ holds only en.json; packages/@n8n/config/src/index.ts:253-254 N8N_DEFAULT_LOCALE defaults to 'en' with no Dutch locale shipped Note: Agents answer in Dutch if prompted in Dutch; the product UI is English only.", - "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: assistant:l10n/nl.json (209 translated strings) and context_agent:l10n/nl.json; tools answer in the user's language (context_agent:ex_app/lib/agent.py:136-138)." + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: assistant:l10n/nl.json (209 translated strings) and context_agent:l10n/nl.json; tools answer in the user's language (context_agent:ex_app/lib/agent.py:136-138).", + "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-language-support the authoring canvas and agent languages include Dutch (nl-NL); agents can be multilingual." } } ] From fa1f31c02f2ca065742481bedc3ba96338ede76f Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 22:53:49 +0200 Subject: [PATCH 10/12] chore(parity): fold the back-fill cells that landed before the session limit (hermiq on 53 demand rows, hermes-agent 45, dify 10) --- openspec/parity/capabilities.json | 734 +++++++++++++++++++++--------- 1 file changed, 518 insertions(+), 216 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 30e08a310..69de2aba9 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -6853,7 +6853,7 @@ "origin": "tender", "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/364027", "originNote": "Gemeente Zaanstad zaaksysteem (2025-01-17) requirement 17539; also UWV 415648 requirement 123258", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "yes", @@ -6867,7 +6867,14 @@ "dify": "source read at 1.17.1, not driven: searched 'fine.?tun|train on|zero data|data retention' in api/core, api/services and web/i18n/en-US: Dify itself trains nothing and self-hosting lets the organisation pick any provider, including local models via plugins; api/configs/feature/__init__.py:835-845 community telemetry is anonymous and can be disabled. No per-provider no-training guarantee or setting in the product Note: depends on the chosen model provider's terms, nothing in the product enforces or records it", "n8n": "source read at n8n@2.40.7, not driven: no setting guarantees non-training; searched 'training|train on|data usage' in packages/cli/src/modules/agents, chat-hub and packages/@n8n/nodes-langchain/nodes/llms: none; self-hosting with local models (LMChatOllama) keeps data from any outside model, and n8n's own diagnostics can be switched off (packages/@n8n/config/src/configs/diagnostics.config.ts:17) Note: Achievable by architecture (self-host plus local models); otherwise it rests on each provider's terms.", "open-webui": "source read at v0.11.4, not driven: self-hosted with local models (routers/ollama.py) keeps data in-house, and the only outward stats sync is opt-in without message content (src/lib/components/chat/Settings/SyncStatsModal.svelte:367); for remote providers nothing in the code sets or enforces a no-training term (searched 'training|opt.?out|zero retention' in routers/openai.py and utils/anthropic.py) Note: a guarantee only holds for local models" - } + }, + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/views/TenantOps.vue:148-171 Model policy section; src/api/modelPolicy.js:47,59 -> appinfo/routes.php:291-294 TenantModelPolicyController; lib/Service/Llm/ProviderFactory.php:686 refuses a provider or model outside the organisation's allowlist, :470 ollama driver keeps calls local. Searched 'train|data.?collection|zero.?retention|opt.?out' in lib/ src/ exapp/: no no-training setting or guarantee" + }, + "reachedOn": "/tenant-ops -> Model policy", + "note": "An organisation can restrict agents to local models (ollama, nextcloud) through the model policy; for remote providers nothing sets or records a no-training term." }, { "id": "td-explain", @@ -6877,7 +6884,7 @@ "origin": "tender", "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/402469", "originNote": "Tilburg University DMS (2025-11-26) requirement 57596; also Juridisch Loket 307676 requirement 102700 and Molenlanden 415259 requirement 71423", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "partial", @@ -6891,7 +6898,14 @@ "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/reasoning-panel.tsx, workflow-process.tsx and tool-detail.tsx show the model's reasoning, each workflow step and tool call under an answer; citation popup names source documents (web/app/components/base/chat/chat/citation/popup.tsx:31); Human Input node lets a person confirm before the next step (web/i18n/en-US/workflow.json:46) Note: raw trace and sources, not a generated plain-language explanation of the outcome", "n8n": "source read at n8n@2.40.7, not driven: runs are traceable step by step (packages/frontend/editor-ui/src/features/execution/logs/components/LogsOverviewPanel.vue; Agents-module session timelines) and the AI Agent node can return its intermediate steps (packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:29 returnIntermediateSteps); searched 'explain|explanation' in packages/cli/src/modules/agents: no plain-language account of how an outcome came about Note: Technical trace, not a plain-language explanation.", "open-webui": "source read at v0.11.4, not driven: answers show sources (Messages/Citations.svelte, ResponseMessage.svelte:910), reasoning and tool steps (Messages/Markdown/MarkdownTokens.svelte:63 groupable 'tool_calls', 'reasoning', 'code_interpreter'); searched 'explain|explanation' in backend/open_webui/utils: no generated plain-language account of how an outcome came about" - } + }, + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/views/Chat.vue:266-288 each answer lists its RAG sources with match score, :384-396 'Used tool: {tool}' steps while streaming; src/widgets/AgentRunHistoryWidget.vue per-run trace -> src/api/agents.js:125 getRunTrace -> appinfo/routes.php:56-59 runHistory#trace; src/manifest.json AiOversight page records the human decision on AI suggestions. Searched 'explain|explanation|rationale' in src/ lib/Service: no plain-language account" + }, + "reachedOn": "/chat -> answer Sources and tool steps; /agents/:id -> Run history -> trace; /ai-oversight", + "note": "Sources, tool steps and a step trace, not a generated plain-language explanation of how an outcome came about." }, { "id": "td-validated-sources", @@ -6901,7 +6915,7 @@ "origin": "tender", "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/371293", "originNote": "Veiligheidsregio Utrecht klantcontactsysteem (2025-03-17) requirement 4339", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "partial", "hermes-agent": "no", "copilot-studio": "yes", @@ -6915,7 +6929,14 @@ "dify": "source read at 1.17.1, not driven: answers can be grounded in a curated knowledge base, but the limit is only a prompt: api/core/prompt/prompt_templates/advanced_prompt_templates.py:1 'Use the following context as your learned knowledge ... If you don't know, just say that you don't know'; annotation reply returns curated answers above a score threshold (api/controllers/console/app/annotation.py:170,199; web/i18n/en-US/app-debug.json:40-47) Note: no hard switch that blocks answers outside validated documents, and no validated flag on documents", "n8n": "source read at n8n@2.40.7, not driven: an agent can be pointed at chosen documents (Agents-module knowledge files, packages/cli/src/modules/agents/agent-knowledge.controller.ts:48; Question and Answer Chain over a retriever, packages/@n8n/nodes-langchain/nodes/chains/ChainRetrievalQA), and instructions can forbid other sources; searched 'only answer from|grounded only|strict retrieval' in packages/cli/src/modules/agents and nodes/chains: no enforced answer-only-from-sources mode or validation status on documents Note: Relies on instructions; nothing enforces it or marks documents as validated.", "open-webui": "source read at v0.11.4, not driven: an agent can be tied to curated knowledge bases (ModelEditor.svelte:1194) and the admin-editable RAG_TEMPLATE (backend/open_webui/config.py:1096) can forbid outside knowledge, but the default template tells the model to answer from its own knowledge when context lacks it (:1078); searched 'strict|only from|grounded only' in config.py and utils/middleware.py: no enforced sources-only mode Note: possible by prompt configuration, not enforced" - } + }, + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/modals/AgentFormModal.vue:223-240 'Ground responses in your data (RAG)' and source count; lib/Service/Engine/ContextRetrievalHandler.php:134-138,321-339 retrieval scoped to the agent's views; lib/Service/Engine/ResponseGenerationHandler.php:357-358 prompt says 'If the context doesn't contain relevant information, say so honestly. Always cite which sources'. Searched 'validated|strictRag|sourcesOnly' in lib/Service: no enforced sources-only mode or validated flag" + }, + "reachedOn": "/agents -> New or Edit agent (AgentFormModal) -> RAG settings", + "note": "Grounding and scope exist; the limit to validated documents is a prompt instruction, not enforced, and documents carry no validated status." }, { "id": "td-ai-literacy", @@ -6925,7 +6946,7 @@ "origin": "tender", "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/415259", "originNote": "Gemeente Molenlanden zaaksysteem 2026 (2026-03-11) requirement 71423", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "no", @@ -6939,7 +6960,14 @@ "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:203 Help, Learn Dify and :620,643-647 step-by-step tour with hands-on lessons on workflows and agents (api/controllers/console/onboarding.py:56); searched 'ai literacy|limitations|hallucinat|responsible' in web/i18n/en-US: nothing explains AI risks or limits to end users Note: product lessons for builders only", "n8n": "source read at n8n@2.40.7, not driven: searched 'literacy|training module|course|learn about AI' in packages/frontend/editor-ui/src and packages/frontend/@n8n/i18n/src/locales/en.json: no explanation or training modules for users; in-product help is contextual (n8n Assistant, en.json:5361 'Ask anything about n8n')", "open-webui": "source read at v0.11.4, not driven: searched 'literacy|training module|tutorial|course|learn' in src/lib/components and src/routes: only onboarding welcome (OnBoarding.svelte:82) and a docs link; no in-product AI literacy modules" - } + }, + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'literacy|tutorial|course|hallucinat|can be wrong' in src/ lib/ (excluding the learniq course recommender, lib/Service/CourseRecommendationEngine.php, which ranks a learner's courses): only the product tour src/manifest.json:1650 walkthrough 'Getting started' (7 steps on agents, skills, settings, flows) and the setup wizard; nothing explains AI limits, risks or verification to users" + }, + "reachedOn": "none", + "note": "A product tour teaches the app, not AI literacy." }, { "id": "td-bias-test", @@ -6949,7 +6977,7 @@ "origin": "tender", "originUrl": "https://www.tenderned.nl/aankondigingen/overzicht/415259", "originNote": "Gemeente Molenlanden zaaksysteem 2026 (2026-03-11) requirement 71423", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "partial", @@ -6963,7 +6991,14 @@ "dify": "source read at 1.17.1, not driven: searched 'bias|fairness|evaluation|test case' in api/controllers, api/services and web/i18n/en-US: no hits beyond external tracer blurbs (web/i18n/en-US/app.json:220-258 Langfuse, Arize, Phoenix); no scheduled test runs of agents and no stored bias result", "n8n": "source read at n8n@2.40.7, not driven: evaluations keep scored results per run (packages/cli/src/evaluation.ee/test-runs.controller.ee.ts) with metrics correctness, helpfulness, string similarity, exact match and tools used (en.json:6540-6544); searched 'bias|fairness' in packages/cli/src/evaluation.ee and agent-evals: no bias metric and no recurring schedule for evaluations Note: A bias dataset and its checks must be written by hand and started by hand.", "open-webui": "source read at v0.11.4, not driven: searched 'bias|fairness' in backend/open_webui and src/lib/components: no bias tests; evaluations are user-vote leaderboards (routers/evaluations.py:222)" - } + }, + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/manifest.json EvalDatasets /evals and EvalDatasetDetail; src/widgets/EvalRunPanelWidget.vue:424 runEval -> src/api/evals.js:37 -> appinfo/routes.php:96 evalRun#run; lib/Service/EvalScoringService.php header: contains, notContains, jsonPathEquals and an LLM-judge rubric; lib/Service/EvalRunService.php:1293 stores each EvalRun. Searched 'bias|fairness' in lib/ src/: none; no background job schedules evals (lib/BackgroundJob/)" + }, + "reachedOn": "/evals -> dataset -> Run evaluation (EvalRunPanelWidget)", + "note": "Results are kept, but a bias dataset and rubric must be written by hand and runs are started by hand." }, { "id": "dm-task-board", @@ -7251,22 +7286,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/langgenius/dify/releases/tag/1.17.0", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'snapshot|publish|build' in both repos: none.", - "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'snapshot|pinned|frozen|published' in hermes_cli/, agent/, cron/: an agent is a live profile directory and every run reads its current config, skills and terminal environment; hermes_cli/profile_cmd.py:474 `hermes profile export` and hermes_cli/skills_hub.py:1260-1285 skill snapshot export/import are manual backups, not a build that runs start from Note: No publish or build step exists; export and import are backups.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/publication-fundamentals-publish-channels https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/publication-publish-agent publishing \"creates a live version of the current draft\"; draft changes do not reach users until the next publish, which replaces the previous version.", "dify": "source read at 1.17.1, not driven: api/models/agent.py:218 AgentHomeSnapshot captured when a build is applied; release 1.17.0 'Build-time Home Snapshots' restores the sandbox home on each published run", "n8n": "source read at n8n@2.40.7, not driven: publishing stores a snapshot of config, custom tool code and skills (packages/cli/src/modules/agents/entities/agent-history.entity.ts:34-47) and production runs use that active version (entities/agent.entity.ts:53-59 activeVersionId); workflows likewise run their published version; knowledge files (agent-knowledge.controller.ts:48) and installed community node packages are not pinned to the snapshot Note: Config and code are frozen per publish; files and installed packages can change underneath.", "open-webui": "source read at v0.11.4, not driven: searched 'snapshot|pin|lock|build' in backend/open_webui/models/models.py, routers/models.py and utils/terminals.py: runs use the model's current config and the terminal's live filesystem; no frozen build of files and tools per published agent" }, - "note": "hermiq not checked: back-fill pending" + "note": "Version is recorded and can be rolled back, but a run does not start from a frozen build; agents have no files or installed tools of their own.", + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Service/ScheduleService.php:1814 records the agent's current version id on each run; lib/Service/AgentVersionService.php header: versions are audit-trail entries used for rollback; runs read the live agent config (lib/Service/Engine/ResponseGenerationHandler.php:327) and skillInstalls holds skill uuids, not versions (lib/Settings/hermiq_register.json:2609-2618). Searched 'snapshot|pinned|frozen' in lib/Service: no frozen build per published agent" + }, + "reachedOn": "none" }, { "id": "dm-install-cli-tool", @@ -7275,22 +7316,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/langgenius/dify/releases/tag/1.16.0", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "no", "dify": "yes", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'pip|npm|install|subprocess' in context_agent:ex_app/lib/all_tools/: none.", - "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool.py:1249,1489-1490 the terminal tool runs any shell command in the agent's backend, so the agent installs a package (pip, npm, apt) and uses it in later calls; tools/lazy_deps.py and tools/browser_tool_install.py install missing dependencies on demand; the prompt tells the agent to try another package manager when an install fails (agent/prompt_builder.py:386-387) Note: Persistence of what is installed depends on the backend (local and docker persist, cloud sandboxes per their settings).", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-windows-365-agents the Windows 365 for Agents shell checks commands against an allow list and blocks global npm installs and similar; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"npm|pip install|package registry\": no agent-driven CLI tool install.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:237,251 'Add a CLI Tool', 'Install a CLI tool from any package registry. The agent gains shell access to the binary it provides'", "n8n": "source read at n8n@2.40.7, not driven: with a sandbox configured, Agents-module agents get workspace tools incl. workspace_execute_command (packages/@n8n/agents/src/workspace/tools/workspace-tools.ts:23-29, attached at packages/cli/src/modules/agents/agent-runtime-reconstruction.service.ts:868-893), so an agent can install and run a CLI tool; the sandbox is off by default (packages/@n8n/config/src/configs/agents.config.ts:84) Note: Needs the opt-in Agents module plus a configured Daytona or n8n sandbox; plain workflow agents have no shell.", "open-webui": "source read at v0.11.4, not driven: in an attached Open Terminal the agent can install packages through run_command (backend/open_webui/utils/tools.py:1439; separate first-party server, README.md:96); the browser Pyodide sandbox installs Python wheels with micropip (src/lib/workers/pyodide.worker.ts:72-73); core has no install tool of its own Note: needs Open Terminal for real CLI tools" }, - "note": "hermiq not checked: back-fill pending" + "note": "Operator can widen the stage allowlist by environment variable; an agent cannot install a tool.", + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'npm install|pip install|apt-get|installTool|package registry' in lib/ src/ exapp/: none. Agent turns run with shell tools denied (exapp/llm-runner/src/providers.js:140-142 DISALLOWED_BUILTIN_TOOLS includes Bash); the flow workload step runs only allowlisted commands (exapp/llm-runner/src/stage.js:137-141 RUNNER_STAGE_COMMANDS default 'scripts/run-hydra-gates.sh,claude'), set by the operator's container environment, not by the agent" + }, + "reachedOn": "none" }, { "id": "dm-sandbox-choice", @@ -7299,22 +7346,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/langgenius/dify/releases/tag/1.17.0", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no shell or code execution tool exists (searched 'exec|shell' in all_tools).", - "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool_backends.py:54 built-in backends 'local, docker, singularity, modal, daytona, vercel_sandbox, ssh'; hermes_cli/config_defaults.py:277-279 terminal.backend (default local) and modal_mode; hermes_cli/setup_terminal.py:1 `hermes setup terminal` wizard picks one; tools/environments/modal.py, daytona.py, vercel_sandbox.py implement the hosted sandboxes Note: Set per profile, and a profile is one agent.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-where-computer-use-runs https://learn.microsoft.com/en-us/microsoft-copilot-studio/use-cloud-pc-pool computer use runs on a hosted browser / Windows 365 Cloud PC pool (Microsoft cloud) or on the customer's own registered machine. Note: Hosted browser is preview.", "dify": "source read at 1.17.1, not driven: docker/.env.example:271 DIFY_AGENT_RUNTIME_BACKEND=local, docker/docker-compose.e2b.yaml ships the E2B backend; web/i18n/en-US/agent-v-2.json:91 notes the limits of the community local sandbox", "n8n": "source read at n8n@2.40.7, not driven: the operator picks where assistant code runs: packages/@n8n/config/src/configs/instance-ai.config.ts:73-74 N8N_INSTANCE_AI_SANDBOX_PROVIDER 'n8n-sandbox' (hosted service) or 'daytona' (own or hosted Daytona), and Code node runners run as a child process or a separate runner container (packages/@n8n/config/src/configs/runners.config.ts:16-17) Note: An instance-wide environment setting that also decides where Agents-module workspaces run (packages/cli/src/services/sandbox-settings.service.ts:103-109), not a choice per agent.", "open-webui": "source read at v0.11.4, not driven: admin chooses the code engine: src/lib/components/admin/Settings/CodeExecution.svelte:20 'pyodide' (in the browser) or 'jupyter' (own server), and per agent an Open Terminal server (ModelEditor.svelte:1268 TerminalSelector, AddTerminalServerModal.svelte); searched 'e2b|daytona|modal|cloud sandbox' in backend/open_webui: no hosted cloud sandbox option Note: choice between self-hosted engines only" }, - "note": "hermiq not checked: back-fill pending" + "note": "One self-hosted execution place, no choice between own server and a hosted sandbox.", + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "the only place code runs is the hermiq-llm-runner ExApp on the instance's own AppAPI daemon (exapp/llm-runner/README.md 'Hardening guarantees'; lib/Flow/HermiqWorkloadNode.php:116-117 hermiq.workload-step dispatches to it via lib/Service/StageDispatchService.php); agent chat turns have no shell. Searched 'e2b|daytona|cloud sandbox|sandbox' in lib/ src/ exapp/: no hosted sandbox option and no per-agent choice" + }, + "reachedOn": "none" }, { "id": "dm-approval-api", @@ -7323,22 +7376,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/langgenius/dify/releases/tag/1.14.0", - "hermiq": "unknown", + "hermiq": "yes", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "partial", "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: GET /chat/generate?sessionId=&agencyConfirm=1|0 answers a pending approval (assistant:lib/Controller/ChattyLLMController.php:489-491), documented in assistant:openapi.json (/ocs/v2.php/apps/assistant/chat/generate).", - "hermes-agent": "not checked: demand row mined from the dify changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/platforms/api_server.py:85 route POST /v1/runs/{run_id}/approval, handled at gateway/platforms/api_server_runs.py:190 for runs in status waiting_for_approval (:222); mcp_serve.py:1-4 the `hermes mcp serve` MCP server lets another client 'manage approvals'", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals approvals are answered in the Teams Approvals app, Outlook or the Power Automate portal; approval records live in Dataverse, but an API answer path is not documented in these pages.", "dify": "source read at 1.17.1, not driven: api/controllers/service_api/app/human_input_form.py:78 /form/human_input/; api/controllers/openapi/human_input_form.py:63,83 read and submit a human input form", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Wait/Wait.node.ts:332-335 'On Webhook Call' resumes a waiting execution when another program calls its resume URL; send-and-wait approvals answer through a URL too (packages/nodes-base/utils/sendAndWait/utils.ts); Agents module resumes a paused run through packages/cli/src/modules/agents/agent-chat.controller.ts:199-200 POST /:agentId/chat/resume", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/main.py:1893 POST /api/v1/chats/{id}/messages/{message_id}/resolve with ResolveToolCallForm action approve|reject|answer (utils/tool_approval.py:13), then resumes the run (main.py:1903 build_tool_approval_resume_payload); usable with an API key" }, - "note": "hermiq not checked: back-fill pending" + "note": "No OpenAPI document ships for the hermiq route; the OpenRegister task mirror is the standard path for another program.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "appinfo/routes.php:182-184 GET /api/approvals, POST /api/approvals/{id}/approve and /deny -> lib/Controller/ApprovalController.php:112,149 (@NoCSRFRequired, reviewer-checked), callable by any client with an app password; lib/Service/Approval/ApprovalTaskBridge.php mirrors each pending approval as an OpenRegister task and lib/Listener/TaskTerminalListener.php (registered lib/AppInfo/Application.php:265-266) applies a completed task as approve or deny" + }, + "reachedOn": "/approvals (ApprovalInbox) and the same endpoints from another program; OpenRegister task inbox" }, { "id": "dm-named-approvers", @@ -7347,22 +7406,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/42496", - "hermiq": "unknown", + "hermiq": "yes", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "yes", "dify": "partial", "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: only the session's own user can confirm (assistant:lib/Service/ChatService.php:360-372 checks the user's session); searched 'approver' in both repos: none.", - "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: plugins/platforms/discord/adapter.py:6222-6236 require_admin_for_exec_approval limits approval buttons to allow_admin_from ids; gateway/slash_access.py:1-10 allow_admin_from and user_allowed_commands gate who may run /approve (gateway/slash_commands.py:1187); gateway/platforms/qqbot/adapter.py:659 checks the operator on approval clicks Note: Per platform and per profile config, not people named on an approval step; off by default, and not in every adapter.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-advanced-approvals https://learn.microsoft.com/en-us/microsoft-copilot-studio/flows-request-for-information each approval stage sets \"who the approval should be assigned to\" with \"First to respond\" or \"Everyone must approve\"; request-for-information goes to named addresses.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/workflow.json:558-561 the approval form can be emailed to chosen workspace members or external recipients, but searched 'assignee|approver' in workflow.json and api/controllers/web/human_input_form.py: whoever holds the form link can answer", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Slack/V2/SlackHitlWebhook.ts:177-180 an approvers list: anyone else who clicks gets a private refusal (:56); packages/nodes-base/nodes/Telegram/hitl/descriptions.ts:39-57 'Restrict Who Can Approve' and 'Unauthorized Reply' Note: Enforced in Slack and Telegram approvals; e-mail approval links can be answered by whoever holds the link.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/tool_approval.py:28 only the chat owner or an admin may resolve a pending call; searched 'approver|assignee' in utils/tool_approval.py and utils/middleware.py: no named approvers" }, - "note": "hermiq not checked: back-fill pending" + "note": "Instance admins can always decide; webhook runs take the webhook's own reviewer, and flow runs default to the agent owner.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/modals/ScheduleFormModal.vue:169-182 Reviewer type (user or group) and reviewer id, mounted from src/widgets/AgentRunOperationsWidget.vue:293; lib/Service/ApprovalService.php:220-233 stores the resolved reviewer on the Approval; :1218-1228 isReviewer admits only that user, members of that group, or an instance admin; lib/Controller/ApprovalController.php:200 refuses anyone else; Talk reactions are checked against the same reviewer (lib/Listener/TalkApprovalReactionListener.php:14)" + }, + "reachedOn": "/agents/:id -> Run operations -> Schedule (ScheduleFormModal) -> Reviewer" }, { "id": "dm-context-meter", @@ -7371,22 +7436,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/42309", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "no", "dify": "no", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'context window|tokens' in assistant:src/components/ChattyLLM: only a 64,000 character input limit notice (ChattyLLMInputForm.vue:191).", - "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/cli_status_bar_mixin.py:340 context_percent, :1046-1058 status bar shows used/total context and a percentage; hermes_cli/commands.py:143 /context 'Show detailed context window view with usage gauge, category breakdown, compression stats'; agent/context_breakdown.py:1-5 live breakdown for UI surfaces", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/troubleshooting-error-codes searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"context (window|usage)\": only a troubleshooting hint to start a new conversation, no meter.", "dify": "source read at 1.17.1, not driven: searched 'context usage|context window|tokens used' in web/i18n/en-US/agent-v-2.json, share.json and app-debug.json: no indicator; compaction runs silently (dify-agent/src/dify_agent/runtime/compaction.py)", "n8n": "source read at n8n@2.40.7, not driven: the agent preview's menu shows the session's token spend and duration (packages/frontend/editor-ui/src/features/agents/components/AgentPreviewMoreMenu.vue:138,303; en.json:8227 'Token spend') and chat hub admins set a context window in messages (en.json:3694); searched 'context window|contextUsage' in packages/frontend/editor-ui/src/features/ai/chatHub and features/agents components: no meter of how full the window is Note: Token totals, not a fill level against the model's window.", "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput.svelte:1837 'Context usage' readout fed by :535 statusContextUsage; backend/open_webui/utils/context_compaction.py:254 get_chat_context_usage against the compaction threshold (:290 _build_context_usage), returned with chats at routers/chats.py:1308, :1344" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'context.?window|contextUsage|tokens used|token' in src/views/Chat.vue, src/components/CnAgentChatTab/ and src/api/chat.js: no readout of how full the context is (only request tokens); the one hit, src/views/TenantOps.vue, is an organisation budget page. The memory panel's character budget bar (src/registry.js agent-memory note) measures memory, not the context window" + }, + "reachedOn": "none" }, { "id": "dm-folders", @@ -7395,22 +7465,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/42638", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no agents or flows to sort; searched 'folder' in chat session code: none.", - "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'folder|group|tag|category' in web/src/pages/ProfilesPage.tsx and CronPage.tsx and hermes_cli/web_routers/profiles.py: agents are profiles and scheduled work is cron jobs, both flat lists; the only folders are project checkouts that group sessions (hermes_cli/web_routers/profiles.py:576-579) Note: Hermes has no flows; agents and cron jobs cannot be sorted into folders.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-solutions-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-export-import-copilot-components solutions and component collections group agents and flows; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"folder\" in authoring pages: no folders on the agents or flows list.", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/common.json:667-669 apps can carry tags (permission-keys.json app.tag.manage) to filter the list; no folders", "n8n": "source read at n8n@2.40.7, not driven: workflows sort into folders (packages/cli/src/controllers/folder.controller.ts:60-125, each route @Licensed('feat:folders'); en.json:1765 'Add folder'); agents have no folder field (packages/cli/src/modules/agents/entities/agent.entity.ts:8-71) and are grouped by project only Note: Workflows only, and licence-gated.", "open-webui": "source read at v0.11.4, not driven: agents are grouped by tags, not folders (src/lib/components/workspace/Models.svelte:67 TagSelector, backend/open_webui/routers/models.py:270 /models/tags); folders exist for chats (routers/folders.py) and an automation's folder_id only files its generated chats (models/automations.py:25); there are no flows to sort" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'folder|tag|category' in the agent schema (lib/Settings/hermiq_register.json:2436 onward) and the AgentCatalog and FlowIndex pages in src/manifest.json: agents list by name and model only, flows by the shared flow index; no folder or grouping field for agents or flows" + }, + "reachedOn": "none" }, { "id": "dm-run-compare", @@ -7419,22 +7494,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/41864", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows or run views (searched 'compare|diff' in assistant:src).", - "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'compare|diff|side.by.side' in cron/, hermes_cli/cron.py, hermes_cli/web_routers/ and web/src/pages/: cron run outputs and sessions are opened one at a time; no view that compares two runs Note: Hermes has no flows in the flow-builder sense.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-results https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/flow-designer evaluation runs compare side by side (\"Comparison with\"); flow runs open one at a time on the canvas, no two-run diff.", "dify": "source read at 1.17.1, not driven: searched 'compare' in web/i18n/en-US/workflow.json and run-log.json: run history opens one run's tracing at a time (workflow.json:240-254), no comparison view", "n8n": "source read at n8n@2.40.7, not driven: evaluation runs compare side by side with Cases, Outputs, Metrics and a 'Workflow diff' tab (en.json:6521-6524; packages/frontend/editor-ui/src/features/ai/evaluation.ee/components/Compare/) and workflow versions diff visually (packages/frontend/editor-ui/src/features/workflows/workflowDiff/WorkflowDiffView.vue); searched 'compare' in packages/frontend/editor-ui/src/features/execution/executions: no side-by-side of two ordinary executions Note: Comparison exists for evaluation runs and versions, not for two production runs.", "open-webui": "source read at v0.11.4, not driven: searched 'compare|diff' in src/lib/components/automations and backend/open_webui/routers/automations.py: runs are listed one by one (AutomationEditor.svelte:355-400); side-by-side view exists only for different models answering one prompt (chat/Messages/MultiResponseMessages.svelte), not for two runs" }, - "note": "hermiq not checked: back-fill pending" + "note": "Compares a replay against its original run for scheduled agent runs; there is no side-by-side of two chosen runs, and not for flow runs.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/widgets/AgentRunHistoryWidget.vue:112-126 per-run 'Replay this run as a dry run and compare', :238-248 says whether the replay produced the same or a different outcome, :253-256 lists the replay steps; src/api/agents.js:154 replayRun -> appinfo/routes.php:83-87 runHistory#replay -> lib/Controller/RunHistoryController.php:206 replay with a step diff against the original" + }, + "reachedOn": "/agents/:id -> Run history -> Replay" }, { "id": "dm-claimed-tool-call", @@ -7443,22 +7524,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/langgenius/dify/issues/40672", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "partial", "dify": "no", "n8n": "partial", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'hallucinat|claimed|verify' in context_agent:ex_app: none.", - "hermes-agent": "not checked: demand row mined from the dify feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: agent/verification_stop.py:1-3,158-165 turn-end guard: when the model tries to finish right after editing code without fresh verification evidence, a follow-up nudge is injected (agent/verification_evidence.py ledger of what was actually run); agent/prompt_builder.py:380-389 every prompt forbids fabricated output in place of real tool results Note: Covers coding edits claimed done without a check; a general answer claiming an unfetched result is only covered by prompt wording.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-create the evaluation \"Tool use\" grader fails a test case that did not use the expected tools; not applied to live answers.", "dify": "source read at 1.17.1, not driven: issue is open against the function-calling agent runner; searched 'fabricat|expected tool|zero tool call' in api/core/agent and dify-agent/src: no check", "n8n": "source read at n8n@2.40.7, not driven: the evaluation metric 'Right tools used' scores whether expected tools were called (en.json:6544), after the fact on test cases; at run time only a prompt rule asks the model not to claim an action before its tool returns (packages/cli/src/modules/agents/integrations/integration-tool-descriptions.ts:29); searched 'claim|hallucinat|unsupported' in packages/@n8n/agents/src/runtime: no check that flags a live answer Note: Caught in evaluations, not flagged on a live answer.", "open-webui": "source read at v0.11.4, not driven: searched 'hallucinat|claimed|without calling|verify tool' in backend/open_webui/utils/middleware.py and utils/tools.py: no check that flags an answer claiming a result the agent never fetched with a tool" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'claim|hallucinat|fabricat|without calling|expectedTool|toolsUsed' in lib/Service/Engine, lib/Service/*.php and src/: no check that flags an answer claiming a result no tool produced; lib/Service/Engine/FacadeToolInvoker.php:949-992 only handles calls to tools that were never offered, and eval scoring has no tool-called assertion (lib/Service/EvalScoringService.php header)" + }, + "reachedOn": "none" }, { "id": "dm-deep-research", @@ -7467,22 +7553,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/9321", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent can loop over DuckDuckGo search and web_fetch and is told to fetch result pages (context_agent:ex_app/lib/agent.py:143-158, context_agent:ex_app/lib/all_tools/duckduckgo.py, web.py); no dedicated deep-research mode or cited report.", - "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: skills/research/grounded-citations/SKILL.md:1-25 bundled skill: numbered citations from a retrieval ledger, verbatim quote checks, `verify --evidence` fails uncited claims, for reports; tools/web_tools.py:519,525 web_search and web_extract; tools/delegate_tool.py:738 delegate_task parallel sub-agents; optional-skills/research/parallel-cli adds a vendor deep-research service Note: No dedicated research button; the agent does it on its own with the bundled skill and tools.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/microsoft-365-copilot-node-workflow a workflow node can call Microsoft 365 Copilot's Researcher agent for research and audit drafting; no deep research tool native to Copilot Studio agents. Note: Needs Microsoft 365 Copilot.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: an Agents-module agent can be set up for research with web search (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:80-84), parallel sub-agents (:151-160) and cited knowledge reads (packages/cli/src/modules/agents/agent-knowledge-retrieval.ts:199); there is no research mode, and OpenAI deep-research models are switched off in chat (packages/cli/src/modules/chat-hub/chat-hub.constants.ts:226-231, 603-605) Note: Assembled from agent settings; no one-click deep research.", "open-webui": "source read at v0.11.4, not driven: no research mode (searched 'deep.?research' in backend/open_webui and src/lib/components: hits only in stale locale files); pieces exist: tools/builtin.py:294 search_web, :333 fetch_url, :1680 delegate_task parallel sub-agents, citations in chat/Messages/Citations.svelte" }, - "note": "hermiq not checked: back-fill pending" + "note": "Pieces exist; no deep-research mode that runs many searches and writes a cited report on its own.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Mcp/HermiqToolProvider.php:468,490 hermiq.webSearch and hermiq.webFetch agent tools, enabled in src/modals/WebResearchSettingsModal.vue (AdminRoot); :514 hermiq.delegateAgent sub-agents; lib/Service/Engine/ResponseGenerationHandler.php:358 'Always cite which sources you used'; lib/Service/Llm/ProviderFactory.php:219 at most 10 tool rounds per turn. Searched 'deep.?research' in lib/ src/: no research mode or report" + }, + "reachedOn": "/chat with an agent granted webSearch/webFetch; Admin settings -> Web research" }, { "id": "dm-second-factor", @@ -7491,22 +7583,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/9594", - "hermiq": "unknown", + "hermiq": "yes", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "yes", "dify": "unknown", "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: sign-in is Nextcloud's own, where two-factor providers apply (server and twofactor apps, not read); every Assistant route requires that session (assistant:lib/Controller/ChattyLLMController.php NoAdminRequired, no PublicPage).", - "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'totp|two.?factor|2fa|mfa|webauthn|passkey' in hermes_cli/, gateway/, web/src and agent/: the dashboard authorises with one session token (hermes_cli/web_server.py:318-324,405-416) and messaging users by platform id allowlists; TOTP hits are the credential vault that fills OTP codes on outside sites for the agent (agent/vault_store.py:75-87) Note: Sign-in to outside sites with 2FA is supported for the agent; signing in to Hermes itself has no second factor.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-conditional-access https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-use-entra-agent-identities sign-in goes through Microsoft Entra ID, where Conditional Access policies require MFA for Copilot Studio. Note: Entra ID P1 for Conditional Access.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/mfa/totp.service.ts and packages/cli/src/controllers/mfa.controller.ts:73-115 authenticator-app setup (QR, enable) with a code at sign-in (en.json:6099 'Two-factor authentication'); forcing it on everyone is licence-gated, mfa.controller.ts:31 enforce-mfa with feat:mfaEnforcement (packages/@n8n/constants/src/index.ts:18) Note: Enforcement for all users is enterprise-licensed.", "open-webui": "source read at v0.11.4, not driven: searched 'totp|two.?factor|2fa|mfa|webauthn|passkey' in backend/open_webui and src/lib/components: no second factor; MFA only through an outside OIDC provider (utils/oauth.py)" }, - "note": "hermiq not checked: back-fill pending" + "note": "Rated like nextcloud-assistant: the second factor is Nextcloud's, not hermiq's.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "every hermiq page and API route requires a Nextcloud session (only Health, ChatHealth, Metrics, EgressAuthorize, McpRun and the two webhook controllers carry PublicPage, each token- or secret-guarded), so Nextcloud's own sign-in applies, where two-factor providers are enforced (server and twofactor apps, not read)" + }, + "reachedOn": "Nextcloud sign-in" }, { "id": "dm-user-key-encryption", @@ -7515,22 +7613,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/9826", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "no", "dify": "unknown", "n8n": "no", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: messages are stored as plain text columns (assistant:lib/Migration/Version010010Date20240430083738.php:55-68); searched 'encrypt' in both repos: none.", - "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: sessions live in the profile's SQLite state.db (hermes_state_dbfile.py:1-4); searched 'encrypt|sqlcipher|fernet' in hermes_state*.py, hermes_cli/, agent/, gateway/: hits are provider encrypted_content passthrough (agent/native_compaction.py:345) and peer transport (gateway/hosted_room_peer.py:510-545), no key a user holds over stored conversations Note: A single-user local install where the operator is usually the user; a shared gateway operator can read all sessions.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-customer-managed-keys CMK encrypts an environment with the organisation's key; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"user.{0,10}key|end-to-end\": no per-user key that locks out admins.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: chat messages are stored as ordinary rows (packages/cli/src/modules/chat-hub/chat-hub-message.entity.ts); instance encryption covers credentials with an instance key (packages/cli/src/encryption/key-manager.service.ts, packages/core/src/encryption/cipher.ts); searched 'end-to-end|e2ee|user key' in packages/cli/src/modules/chat-hub and packages/cli/src/encryption: no per-user key", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/internal/db.py:289 whole-database encryption with sqlite+sqlcipher and DATABASE_PASSWORD, instance-wide; searched 'encrypt' in models/chats.py: chats stored readable to the server and admins, no per-user key" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "sessions and turns are OpenRegister objects (lib/Settings/hermiq_register.json agentsession schema); searched 'encrypt' in lib/ src/: only lib/Service/ScheduleWebhookSecretService.php, lib/Service/Llm/BrokerHttpClient.php and lib/Repair/RemoveLegacyLlmKeys.php (secrets and credentials); no per-user key over conversations" + }, + "reachedOn": "none" }, { "id": "dm-mcp-user-auth", @@ -7539,22 +7642,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/14121", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "yes", "dify": "unknown", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the MCP client config is one admin JSON for all users (context_agent:ex_app/lib/main.py:103-110, context_agent:ex_app/lib/all_tools/mcp.py:14-20); no per-user login to outside MCP servers. The reverse direction (this instance as MCP server) does run as the caller (mcp_server.py:31-41).", - "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/mcp_oauth.py:1-9 OAuth 2.1 with PKCE per MCP server, tokens kept in HERMES_HOME/mcp-tokens/ (:412); hermes_cli/web_routers/mcp.py:21-37 dashboard OAuth flow; tools/mcp_tool_scope.py:1-14 each profile holds its own connection and credentials Note: Per profile (one login per agent owner), not per person: in a shared gateway chat every participant's tool calls run with the profile's login.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-extend-action-mcp MCP servers connect with OAuth 2.0 so \"individual users grant access to their data\"; tool calls then run with that user's rights.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: an agent's MCP server takes one OAuth or header credential chosen by its builder (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:243-252, McpOAuth2Api at packages/@n8n/nodes-langchain/credentials/McpOAuth2Api.credentials.ts); per-person MCP connections exist for n8n's own assistant (packages/cli/src/modules/instance-ai/entities/instance-ai-thread-grant.entity.ts) and per-user resolution in workflows needs licensed dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee) Note: Per-person login only in the assistant or with an enterprise licence.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/tools.py:137-158 tool server auth types bearer, session, system_oauth, oauth_2.1 and oauth_2.1_static; src/lib/components/AddToolServerModal.svelte:143 registers an OAuth client for MCP; per-user tokens encrypted in utils/oauth.py:269 Note: discussion still open, but the code has per-user OAuth 2.1 for MCP" }, - "note": "hermiq not checked: back-fill pending" + "note": "Tool calls run with the person's own Nextcloud rights; outside MCP servers are not connected per person (remote systems route through OpenConnector, not read).", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "tools come from each app's IMcpToolProvider through OpenRegister's ToolRegistryFacade (lib/Service/Engine/ToolLoop.php:195 listAgentFunctions, lib/Service/Engine/FacadeToolInvoker.php:1238 invokeTool) and run as the acting Nextcloud user (lib/Mcp/HermiqToolProvider.php:676-681; lib/Controller/McpRunController.php impersonates the token's user); searched 'mcpServer|remote mcp|oauth' in lib/ src/: no connection to an outside MCP server with each person's login" + }, + "reachedOn": "/mcp-tools; /agents -> Edit agent tool picker" }, { "id": "dm-responses-api", @@ -7563,22 +7672,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/11874", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "no", "dify": "unknown", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: the agent calls TaskProcessing only (context_agent:ex_app/lib/nc_model.py:165-179); the provider protocol is chosen inside integration_openai, not read.", - "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: agent/codex_responses_adapter.py:1-2 'OpenAI Responses API (OpenAI Codex, xAI, GitHub Models and other compatible endpoints)', agent/transports/codex.py:1 Responses transport; hermes_cli/main_provider_setup.py:418 custom provider setup asks for the api_mode, hermes_cli/model_setup_flows_custom.py:99,146 stores codex_responses; hermes_cli/config_defaults.py:747 api_mode chat_completions | anthropic_messages | codex_responses", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/bring-your-own-model-prompts \"If you use the model's Responses API endpoint ... the connection fails\"; only chat completions endpoints are supported.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:255-260 'Use Responses API' option; chat hub providers carry responsesApiEnabled (packages/@n8n/api-types/src/chat-hub.ts:585)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/AddConnectionModal.svelte:51 apiType '' or 'responses'; backend/open_webui/routers/openai.py:1589 is_responses, :1618-1634 posts to {url}/responses with convert_to_responses_payload Note: discussion still open; the code ships it" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Service/Llm/ProviderFactory.php:762 OpenAI-compatible calls post to {baseUrl}/chat/completions, :888 Anthropic to /v1/messages, :470 ollama native; searched 'responses api|/responses|responsesApi' in lib/ src/ exapp/: none" + }, + "reachedOn": "none" }, { "id": "dm-prompt-cache", @@ -7587,22 +7701,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/open-webui/open-webui/discussions/7873", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "unknown", "dify": "unknown", "n8n": "yes", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: no caching in these repos; provider-side caching would be in integration_openai or the provider, not read.", - "hermes-agent": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_caching.py:1-5 four cache_control breakpoints set automatically on the system prefix and last messages; hermes_cli/config_defaults.py:675-679 prompt_caching.cache_ttl 5m or 1h for Claude via OpenRouter or the native API; hermes_cli/cli_status_bar_mixin.py:991 status bar shows cache_hit Note: Anthropic-style caching is set by Hermes; other providers cache on their own side.", "copilot-studio": "not checked: docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompt-model-settings https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-messages-management not checked: searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"prompt cach|caching\" and found nothing on provider-side prompt caching; billing is per Copilot Credit, so any caching is invisible to customers.", "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatAnthropic/LmChatAnthropic.node.ts:531-590 promptCaching option with 5m or 1h lifetime; Agents-module agents set promptCaching per agent (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:75-78, en.json:7904) Note: A switch per model node or agent, not on for every provider (an open request asks for it on OpenRouter).", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/anthropic.py:111 _copy_cache_control passes cache_control through when the caller sets it; searched 'cache_control|prompt.?cach' in utils/payload.py and routers/openai.py: nothing adds cache breakpoints automatically" }, - "note": "hermiq not checked: back-fill pending" + "note": "The claude CLI transport (exapp/llm-runner) may cache on its own; that is vendor CLI behaviour, not hermiq code, and was not read.", + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'cache_control|prompt.?cach' in lib/ src/ exapp/: none; lib/Service/Llm/ProviderFactory.php:1009-1023 builds each Anthropic payload with model, max_tokens, messages, system and tools only, no cache breakpoints" + }, + "reachedOn": "none" }, { "id": "dm-ask-mid-run", @@ -7611,22 +7731,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/open-webui/open-webui/releases/tag/v0.11.1", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "yes", "dify": "unknown", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the run pauses before a sensitive action and asks Confirm or Cancel, with the option to reply with new instructions (assistant:src/components/ChattyLLM/AgencyConfirmation.vue:10-30,76); free questions end the turn. No suggested-answer buttons.", - "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/clarify_tool.py:1-3 'structured multiple-choice / open-ended questions to the user', :9 up to 4 choices plus 'Other', :16 first choice marked (Recommended), registered at :306-307; answered in the CLI, TUI and every gateway (gateway/run_turn_runner_clarify_delivery.py)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-ask-a-question https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-generative-actions generative orchestration generates \"questions to ask the user for missing information\"; Question nodes offer multiple-choice options before continuing.", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: workflows: the Chat node's 'Wait for User Reply' and approval response type pause the run for the person's answer (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/Chat.node.ts:141,172); Agents module: a chat_action card with buttons or radio choices suspends the run until answered (packages/@n8n/api-types/src/agents/types.ts:379, packages/frontend/editor-ui/src/features/agents/components/interactive/InteractiveCard.vue:46-55, en.json:7684 'Waiting on the card above to continue')", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:518 ask_user (1-3 questions with options and free text), resolved via utils/tool_approval.py:13 action 'answer'; src/lib/components/chat/AskUserCard.svelte mounted at chat/MessageInput.svelte:1776; survives reload (CHANGELOG.md:331)" }, - "note": "hermiq not checked: back-fill pending" + "note": "Pauses for approve or reject only; the agent cannot ask a question with suggested answers and wait for it.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "docs/approvals.md:24-33 scheduled, flow, webhook and confirm-classified tool calls pause for a person; src/views/ApprovalInbox.vue:90 approve, deny with a reason; lib/Service/ApprovalService.php:1231-1240 approval resumes the gated run. Searched 'ask_user|askUser|clarif|suggest' in lib/ src/: the only hit is exapp/llm-runner/src/providers.js:175 which DENIES the CLI's AskUserQuestion tool" + }, + "reachedOn": "/approvals (ApprovalInbox)" }, { "id": "dm-agent-form-fields", @@ -7635,22 +7761,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/open-webui/open-webui/releases/tag/v0.11.0", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: TaskProcessing task types declare input shapes that the Assistant renders as fields, enums and numbers (assistant:src/components/fields/TaskTypeFields.vue, EnumField.vue, NumberField.vue); the agent chat has no such form.", - "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'form|fields|inputs|variables' in agent/prompt_builder.py, tools/blueprints.py and hermes_cli/web_routers/profiles.py: a profile declares no start-of-chat form; skills can declare required environment variables captured at first use (tools/skills_tool_setup.py:46-56) and blueprints gather slot values conversationally (hermes_cli/blueprint_cmd.py:15-20), neither is a form filled before the conversation", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-ask-with-adaptive-card https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-bot-greeting an Adaptive Card form in the Conversation Start topic can collect fields at the start; agents do not declare typed start fields natively.", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: an n8n Form Trigger collects declared fields (text, dropdown and more) before a workflow runs and can hand them to an AI Agent (packages/nodes-base/nodes/Form/FormTrigger.node.ts); chat agents only offer suggested prompts (packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:62-63); searched 'formFields|inputFields' in packages/cli/src/modules/chat-hub and nodes/trigger/ChatTrigger: no fields declared by the agent itself Note: Hand-built as a form in front of an agent workflow.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/chat_variables.py:127 get_chat_variables_schema parses fields from the system prompt; routers/models.py:60 add_chat_variables_schema; ModelEditor.svelte:1084 'Chat Variables' (CHANGELOG.md:655)" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'chat variable|formFields|input fields|startForm' in lib/ src/: only src/formFields/EmailField.vue (a register form field) and src/registry.js; the agent schema declares no start-of-chat fields and src/views/Chat.vue opens straight to the composer" + }, + "reachedOn": "none" }, { "id": "dm-fork-chat", @@ -7659,22 +7790,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/open-webui/open-webui/releases/tag/v0.11.0", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "no", "dify": "unknown", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: message actions are copy, regenerate and delete (assistant:src/components/ChattyLLM/MessageActions.vue:9-32); searched 'fork|branch' in chat code: none.", - "hermes-agent": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:76-77 /branch (alias /fork) clones the current session into a new one, the original stays; gateway/slash_commands_branch_thread.py:1-6 opens the clone as a sibling thread on Discord, Telegram, Slack and Matrix; hermes_cli/commands.py:71 /undo backs up N turns, so a branch followed by /undo reaches an earlier answer Note: Forks at the current end of the session; there is no fork button on an individual answer.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-history searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"fork|branch the conversation|edit.{0,20}message\": nothing.", "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: editing or regenerating a message keeps the original and adds a branch (packages/cli/src/modules/chat-hub/chat-hub-message.entity.ts:103-114 previousMessageId, retryOfMessageId, revisionOfMessageId; chat-hub.controller.ts:224,283 edit and regenerate), and the user flips between branches (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatMessageActions.vue:119-136 '1/2' alternatives; en.json:658-659) Note: Branches live inside the same conversation rather than as a separate copy.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1672 POST /chats/{id}/fork copies the chat up to a message and records the branch (utils/chat_fork.py:4 build_fork_history); fork button per response src/lib/components/chat/Messages/ResponseMessage.svelte:1528 (CHANGELOG.md:665)" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'fork|branch|regenerat|edit message' in src/views/Chat.vue and src/api/chat.js: none; session routes are CRUD, archive, restore and permanent delete (appinfo/routes.php:566-587) with no copy-from-message" + }, + "reachedOn": "none" }, { "id": "dm-flow-change-review", @@ -7683,22 +7819,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.34.0", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in either repo (searched 'flow|workflow').", - "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: scheduled work is cron jobs and blueprints (tools/blueprints.py:1-7, tools/cronjob_tools.py); searched 'review|approv|reviewer' in cron/ and tools/cronjob*.py: cron prompts are scanned for injection (tools/cronjob_prompt_scan.py) but no named person approves a change before it goes live Note: Hermes has no flows; its nearest equivalent, cron jobs, has no change review.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-platform/alm/extend-pipelines https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-solutions-overview Power Platform pipelines with delegated deployment require approval from an authorised identity before a solution (agent or flow) reaches the next stage.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/workflow-reviews.ee/workflow-review-publish-guard.service.ts:8-22 blocks publishing while a review is open or changes are requested; reviewers per request in packages/@n8n/db/src/entities/workflow-review-request-reviewer.ee.ts; review inbox in packages/frontend/editor-ui/src/features/workflow-reviews/; licence flag feat:workflowReviews (packages/@n8n/constants/src/index.ts:58). Enterprise-licensed; workflows only, not Agents-module agents.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "Any publish or review gate would live in OpenRegister's flow store, not read here.", + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "flows are edited on the shared OpenRegister flow page (src/manifest.json FlowDetail type flow, CnFlowEditorPage) and hermiq only contributes nodes (lib/Flow/HermiqFlowNodeListener.php:73-76); searched 'review|approv' in lib/Flow and lib/Service/Schedule: no reviewer gate on a flow change before it goes live (approvals gate runs, not edits)" + }, + "reachedOn": "none" }, { "id": "dm-log-redaction-policy", @@ -7707,22 +7849,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.22.0", - "hermiq": "unknown", + "hermiq": "yes", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent logs task input text at INFO, skipping only the conversation token (context_agent:ex_app/lib/main.py:169-178); searched 'redact|mask' in both repos: no policy.", - "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: agent/redact.py:1-5 regex secret redaction for logs and tool output; hermes_logging.py:6,234 every log handler uses RedactingFormatter 'so secrets never reach disk'; hermes_cli/config_defaults.py:1739 security.redact_secrets (default true) and :1045 privacy.redact_pii hashes user ids and strips phone numbers from model context; cron/scheduler_diagnostics.py:13-15 run errors redacted too Note: A per-profile setting (one profile is one agent install), masking secrets and PII by pattern.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-sensitive-data https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-transcript-controls per variable \"sensitive data\" keeps values out of transcripts and logs; admins turn transcript saving off per environment or environment group. No instance-wide redaction policy.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/redaction/ (instance-redaction-enforcement.service.ts, redaction-policy.ts) redacts execution data by policy, a default module; redaction-context-hook.ts:53 skips unless isDataRedactionLicensed (feat:dataRedaction, packages/@n8n/constants/src/index.ts:56). Enterprise-licensed.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "The instance-wide part is a fixed secret and PII pattern set, always on for run logs; what else to hide is set per organisation, not per instance.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Service/RedactionService.php:221-222 redact() always masks API keys, auth headers, private keys, JWTs, DSN passwords and phone numbers before any audit write, used by ScheduleService.php:1120,1202, FlowAgentRunService, WebhookAgentRunService, ApprovalService and DeliveryService; :198 instance toggle for the non-forced pass; src/views/GuardrailPolicySettings.vue:52,341 per-organisation input and output filters with a Redact action; appinfo/routes.php:56 redacted run trace" + }, + "reachedOn": "/guardrail-policy (GuardrailPolicySettings); run traces on /agents/:id" }, { "id": "dm-agent-workspace", @@ -7731,22 +7879,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.36.0", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent keeps its memories and skills under 'Context Agent/' in the user's Assistant folder (context_agent:ex_app/lib/all_tools/memory.py:26, assistant:lib/Service/AgentSkillsService.php:31) and task output files can be saved there (assistant:appinfo/routes.php:35,38); files it creates go wherever it writes in the user's Files. No per-session workspace.", - "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool.py:1489-1490 and tools/file_tools.py give the agent a writable working directory in its terminal backend (tools/environments/local.py, docker.py, modal.py, daytona.py); hermes_cli/commands.py:78-80 /worktree creates an isolated git worktree per session; tools/subagent_worktree.py:1-6 one worktree per delegated sub-agent; hermes_cli/web_routers/chat_workspaces.py:1-7 dashboard chats pick their working directory", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/created-files-overview agents create files during a conversation, stored with it so user and agent reference them across turns. Note: Preview, GitHub Copilot harness.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/workspace/tools/workspace-tools.ts:23-29 workspace_read_file, workspace_write_file, workspace_str_replace_file, workspace_execute_command; attached per agent in packages/cli/src/modules/agents/agent-runtime-reconstruction.service.ts:868-893 (agent-workspace.service.ts:42); only when a sandbox is configured (packages/@n8n/config/src/configs/agents.config.ts:84, default false) and in the opt-in Agents module.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "A per-step scratch checkout inside a flow, not a writable workspace an agent keeps for a session.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Flow/HermiqWorkloadNode.php:116-117 hermiq.workload-step clones a ref into a throwaway checkout where the model with a shell can edit files (exapp/llm-runner/src/stage.js:31,161 scratch tree removed on exit), lib/Flow/HermiqWorkloadCollectNode.php collects the result and files, or a push phase commits them; chat and scheduled agent runs have no workspace, only tools into the user's own Files and Notes" + }, + "reachedOn": "/flows/:id -> Hermiq workload step node" }, { "id": "dm-native-pdf", @@ -7755,22 +7909,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.28.0", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: multimodal chat passes attached files as file parts by id (context_agent:ex_app/lib/nc_model.py:58-68, agent.py:222-224), so a PDF reaches the provider unconverted; whether the model reads it natively depends on the provider (not read). Text tasks parse files to text first (POST /api/v1/parse-file).", - "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:422,1142 read_file turns PDFs into text ('PDF (text layer)'); agent/image_routing.py:31 'a PDF must never become a vision part'; agent/models_dev.py:74,81 supports_pdf only labels a model's modality in listings, nothing sends a PDF as a document part (searched 'application/pdf|document block|pdf' in agent/transports, agent/anthropic_adapter.py)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-inputs-prompt https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/attachments-overview prompt document input accepts PDF directly; agent attachments extract PDF text (\"Text is extracted for the agent to reason over\").", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:43-48 'Automatically Passthrough Binary PDFs' on the AI Agent node for models with native PDF input, e.g. Gemini; OpenAI Responses API support for it per release 2.28.0.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Mcp/HermiqToolProvider.php:186-191 readFile reads 'the text content of a file' (:837 getContent), and web pages go through lib/Service/WebResearch/ReadableTextExtractor.php; searched 'pdf|document block|file part|multimodal' in lib/Service/Llm and lib/Service/Engine: no path that hands a PDF to the model as a file" + }, + "reachedOn": "none" }, { "id": "dm-browser-use", @@ -7779,22 +7938,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.38.0", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "yes", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'browser|playwright|selenium|click' in context_agent:ex_app: only HTTP GET via web_fetch (context_agent:ex_app/lib/all_tools/web.py).", - "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/browser_tool.py:469-512 browser_navigate, browser_snapshot, browser_click and browser_type tools, plus tools/browser_cdp_tool.py and browser_dialog_tool.py; local Chromium or cloud providers (tools/browser_tool_cloud.py, browser_camofox.py, browser_lightpanda.py) and the user's real profile (tools/browser_tool_real_profile.py)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/computer-use https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new computer use (GA May 2026) lets agents automate web and desktop apps by controlling browsers: open pages, click, fill in forms.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Airtop/Airtop.node.ts:23 usableAsTool with session, window, interaction, extraction and agent resources (:44-64) driving a cloud browser as an AI Agent tool (needs an Airtop account); n8n's own assistant drives the user's Chrome through packages/@n8n/mcp-browser (README.md:3-6), browser use on by default (packages/@n8n/config/src/configs/instance-ai.config.ts:65-66).", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Mcp/HermiqToolProvider.php:490 hermiq.webFetch fetches a page over HTTP (lib/Service/WebResearch/WebFetchService.php) and returns readable text; searched 'browser|playwright|puppeteer|selenium|click' in lib/ exapp/: no browser the agent can drive, and the runner denies the CLI's built-in tools (exapp/llm-runner/src/providers.js:140)" + }, + "reachedOn": "none" }, { "id": "dm-tool-call-cap", @@ -7803,22 +7967,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://community.n8n.io/t/feat-ai-tools-add-max-tool-interactions-to-ai-agent-nodes-to-prevent-infinite-loops/295587", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "no", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no cap in code; graph.astream runs without a recursion_limit (context_agent:ex_app/lib/agent.py:256), so LangGraph 1.0.1's default recursion limit is the only stop (context_agent:poetry.lock:2043-2050). Note: Needs a live check on the default value.", - "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-56 agent.max_turns caps iterations per run (default unlimited), agent/iteration_budget.py:1-5 per-agent budget (sub-agents 50); :534-545 tool_loop_guardrails hard-stops after repeated failures or no progress (on by default for gateway and cron) with per-turn ceilings; agent/tool_guardrails.py:80-81 at most 50 web searches and 50 sub-agents per turn Note: The main cap counts model iterations, not individual tool calls; the per-tool ceilings count calls.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-generative-actions https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-quotas searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"maximum number of (tool|steps)|step limit|loop\": no maker setting that caps tool calls per run.", "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:22-25 maxIterations (default 10) and V3/helpers/checkMaxIterations.ts:6-14 stop the loop after that many iterations; Agents module maxIterations 1-200 (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:518); a turn with several parallel tool calls counts once, so there is no cap on tool calls as such, which the open request asks for.", "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "A fixed round cap on one provider path, not a number the builder sets and not a count of tool calls.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Service/Llm/ProviderFactory.php:219 MAX_TOOL_ITERATIONS = 10, :1009 the Anthropic tool loop stops after 10 rounds; other providers run the tool loop inside LLPhant (lib/Service/Engine/ResponseGenerationHandler.php:475 setTools, vendor loop not read); searched 'maxToolCalls|maxIterations|toolCallLimit' in lib/Settings/hermiq_register.json and src/modals/AgentFormModal.vue: no setting" + }, + "reachedOn": "none (fixed in code)" }, { "id": "dm-tool-error-recovery", @@ -7827,22 +7997,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://community.n8n.io/t/296548", - "hermiq": "unknown", + "hermiq": "yes", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "partial", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool nodes have a fallback that returns 'Error: ... please fix your mistakes' to the agent as a tool message (context_agent:ex_app/lib/graph.py:22-41), and tools return error objects the agent reads (context_agent:ex_app/lib/all_tools/skills.py:96-113).", - "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/registry.py:887-913 dispatch returns every tool exception as {\"error\": 'Tool execution failed: ...'} to the model instead of raising; agent/tool_executor.py:175 invalid arguments come back as an error result; agent/tool_guardrails.py:1-5 repeated failures turn into guidance before any halt", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/harnesses-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-overview the GitHub Copilot harness \"retries and finds alternative paths automatically\"; standard harness follows the authored paths and error topics. Note: GitHub Copilot harness is a production-ready preview.", "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: the Agents-module runtime adds a failed tool call as an error result so the model can self-correct (packages/@n8n/agents/src/runtime/tools/tool-call-executor.ts:686-687); the workflow AI Agent node stops on a tool error unless the node is set to continue on fail (packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/executeBatch.ts:114-121), which the open request says ends reasoning.", "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Service/Engine/FacadeToolInvoker.php:1236-1238 the tool facade returns a {result, isError} envelope instead of throwing, :1271-1276 which is JSON-encoded back to the model as the tool result; refusals come back the same way (:751 tool_denied_by_policy, :885 approval_required); lib/Mcp/HermiqToolProvider.php header 'invokeTool() never throws: every failure returns a structured error'" + }, + "reachedOn": "/chat and every agent run (engine behaviour)" }, { "id": "dm-subscription-login", @@ -7851,22 +8026,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://community.n8n.io/t/285451", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "no", "dify": "unknown", "n8n": "partial", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no provider sign-in in these repos (models via TaskProcessing, context_agent:ex_app/lib/nc_model.py:165-179).", - "hermes-agent": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/auth_codex_browser.py:1-6 ChatGPT/Codex sign-in by browser with PKCE (`hermes auth add openai-codex --browser`); hermes_cli/web_routers/oauth.py:1 in-browser device-code login flows in the dashboard; hermes_cli/commands.py:284 /login with a Nous account; provider logins in hermes_cli/auth_nous.py, auth_qwen.py, auth_xai.py, auth_zai_kimi.py", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-external-response-model models come with the Copilot Studio licence; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"subscription.{0,20}(login|sign in)\": no provider account sign-in.", "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/credentials/ holds API-key credentials for every model provider (OpenAiApi, AnthropicApi, MistralCloudApi ...); the only OAuth sign-in is Azure Entra for Azure OpenAI (AzureEntraCognitiveServicesOAuth2Api.credentials.ts); searched 'copilot|chatgpt oauth' in packages/@n8n/nodes-langchain: none.", "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "Uses a subscription instead of an API key, but the user pastes a subscription token; there is no provider sign-in flow, and only for Claude.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/credentials.json:24-31 personal credentials anthropic-oauth and anthropic-cli for a Claude Max subscription, declared to the credential broker from src/App.vue:153; src/modals/LlmProviderModal.vue:131-150,251 'Claude Max subscription (OAuth)' auth mode, personal only; lib/Service/Llm/ProviderFactory.php:876 oauth beta header on the http path, :1622 the cli path runs the official claude CLI in exapp/llm-runner with that token" + }, + "reachedOn": "Personal settings credential (anthropic-cli) plus Admin settings -> LLM provider -> Claude subscription" }, { "id": "dm-failed-run-fix", @@ -7875,22 +8056,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.28.0", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "no", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a failed scheduled run posts a fixed error message (assistant:lib/Service/AssignmentsService.php:153-159); searched 'diagnos|fix' in both repos: none.", - "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler.py:287-312 a failed cron run gets a rule-based failure notice with remediation copy (cron/scheduler_failure_copy.py), :2849-2855 or the agent's own diagnosis when it declared the failure; agent/turn_explainers.py explains why a turn ended; the agent can read run output with its own tools when asked. Searched 'investigat|diagnos|suggest.*fix' in cron/ and hermes_cli/commands.py: no action that hands a failed run to an assistant to investigate Note: Classified hints and a capable agent, not a one-step investigate-and-propose-fix.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-manage-monitor https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"Copilot.{0,40}(fix|troubleshoot|diagnos)\": failed runs are inspected by hand; no assistant that proposes a fix.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: n8n Assistant (Instance AI, default module at packages/@n8n/backend-common/src/modules/module-registry.ts:79) 'Debug failed executions and suggest fixes' (packages/frontend/@n8n/i18n/src/locales/en.json:5360); failed runs hand off to it from the editor (release 2.28.0 'Investigate failed executions on Instance AI editor hand-offs'); needs a model set up.", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "failed runs are listed (src/views/Runs.vue) and a dead-letter run can be re-run or replayed (src/widgets/AgentRunHistoryWidget.vue); searched 'diagnos|investigat|suggest.*fix|propose.*fix' in lib/ src/: no assistant that investigates a failed run; lib/Repair/SeedHydraTriageFlow.php triages code findings for the Hydra pipeline, not failed hermiq runs" + }, + "reachedOn": "none" }, { "id": "dm-builtin-table", @@ -7899,22 +8085,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/n8n-io/n8n/releases/tag/n8n%402.36.0", - "hermiq": "unknown", + "hermiq": "yes", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "yes", "dify": "unknown", "n8n": "yes", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Tables tools create tables, columns and rows and read them back (context_agent:ex_app/lib/all_tools/tables.py:16-378), available when the Nextcloud Tables app is installed (tables.py:410-411).", - "hermes-agent": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: registered tools (tools/*.py registry.register names) include memory, todo_list, session_search, kanban tools and cronjob_manage, each fixed-purpose; searched 'table|records|sqlite tool|datastore' in tools/: no general table the agent can define and fill; it can reach SQLite only through terminal or execute_code (tools/code_execution_tool.py:924) Note: An agent can build a SQLite file with its shell, which is not a built-in table.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-dataverse https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-dataverse every environment has Dataverse; agents read tables as knowledge and create, read and update records (Dataverse connector, Dataverse MCP create_record/read_query). Note: MCP server preview.", "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/DataTable/DataTable.node.ts:27 usableAsTool, so an AI Agent reads and writes rows in n8n's built-in data tables (data-table is a default module, packages/@n8n/backend-common/src/modules/module-registry.ts:51); outside agents read rows through the MCP data table tools (packages/cli/src/modules/mcp/mcp-scopes.ts dataTable:read, dataTable:write).", "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "The table is an OpenRegister register and schema, created in OpenRegister, which hermiq requires; no outside database.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/components/ToolGrantEditor.vue:53,65 grants an agent an OpenRegister schema's tools with {app}.{schema}.* (read) or {app}.{schema}.*:write, mounted from src/widgets/AgentToolGovernanceWidget.vue; lib/Service/Engine/ToolLoop.php:195 resolves them through OpenRegister's ToolRegistryFacade, and lib/Service/Engine/FacadeToolInvoker.php:1238 runs search, get, create and update on the register objects" + }, + "reachedOn": "/agents/:id -> Tool governance (ToolGrantEditor)" }, { "id": "dm-bulk-delete-chats", @@ -7923,22 +8115,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/nextcloud/assistant/issues/639", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "no", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the session list offers one Delete action per conversation (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:36-42) and DELETE /chat/delete_session takes one sessionId (assistant:lib/Service/ChatService.php:142); no bulk delete.", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:414-428 POST /api/sessions/bulk-delete deletes a list of ids, driven by the selectable rows in web/src/pages/SessionsPage.tsx:1395 via web/src/lib/api.ts:504-505; hermes_cli/subcommands/sessions.py:105-109 `hermes sessions prune` deletes many by age, source or title", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-transcript-controls https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-transcripts-powerapps only admins bulk-delete transcript records in Dataverse; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"delete.{0,40}conversations\": no end-user bulk delete of chats.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "src/views/Chat.vue:461 SessionDeleteModal deletes one session (src/modals/SessionDeleteModal.vue:69 deleteSessionPermanent); appinfo/routes.php:576,584-587 DELETE /api/sessions/{uuid} and /permanent take one uuid; lib/Controller/ChatController.php:539-567 clearHistory archives one conversationId. Searched 'bulk|selected|deleteMany|select all' in src/views/Chat.vue: none" + }, + "reachedOn": "none" }, { "id": "dm-prompt-placeholders", @@ -7947,22 +8144,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/nextcloud/assistant/issues/598", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "yes", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: '{user}' is replaced with the display name in chat user instructions (assistant:lib/Service/ChatService.php:71) and the agent prompt gets today's date (context_agent:ex_app/lib/agent.py:137,186); no other placeholders.", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: agent/system_prompt.py:488-506 the system prompt always gets a 'Conversation started' and 'Today's date' line; gateway/session_context.py:37-43 the speaker's user name and id are passed as HERMES_SESSION_USER_NAME and _USER_ID to tools; searched 'placeholder|\\{\\{|substitut|template var' in agent/prompt_builder.py and agent/system_prompt.py: no placeholders an author writes into SOUL.md or instructions Note: Date and user are injected automatically; the author cannot place them in the instructions.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-child-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-file-groups \"To reference tools, variables, or add Power Fx formulas in your instructions, enter a slash (/)\"; system variables such as User.DisplayName and Power Fx Today()/Now() fill in per user and date.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Service/Engine/ResponseGenerationHandler.php:326-358 the system prompt is the agent's prompt text plus context, app-context and RAG blocks, with no substitution; searched 'placeholder|str_replace|strtr|\\{user|\\{date|\\{\\{' in lib/Service/Engine and lib/Service/Agent: none (the only placeholders are conversation titles)" + }, + "reachedOn": "none" }, { "id": "dm-ai-label", @@ -7971,22 +8173,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/nextcloud/assistant/issues/387", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: outputs of file actions and the new-file image menu get the system tag 'Generated using AI' (assistant:lib/Service/SystemTagService.php:18, lib/Listener/FileActionTaskSuccessfulListener.php:33); files the agent writes with upload_file are not tagged (context_agent:ex_app/lib/all_tools/files.py:148-165).", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.generated|generated by|c2pa|watermark|co-authored-by' in agent/, tools/, gateway/, hermes_cli/: files the agent writes (tools/file_tools.py) and images it generates (tools/image_generation_tool.py:894) carry no AI-generated mark", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/system-service-card-copilot-studio docs advise makers to \"inform your users that AI generated some of the conversation\" in the start topic; created Word/PowerPoint content inherits sensitivity labels. No automatic AI-generated label on outputs.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "Notes, contacts and events are marked; chat text and other outputs are not labelled.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Service/NcNative/AgentArtefactMarker.php:75 system tag 'Agent authored' on files, :82 X-HERMIQ-AGENT-AUTHORED on vCard and iCalendar objects, applied in the same write (NotesWriteService.php:228, ContactWriteService.php:137, CalendarWriteService.php:236) behind the agent tools in lib/Mcp/NcNativeWriteToolDescriptors.php:66,106,155; searched 'AI-generated|generated by AI' in src/: chat answers carry no label" + }, + "reachedOn": "Files tag on notes the agent wrote; Contacts and Calendar objects" }, { "id": "dm-skill-search", @@ -7995,22 +8203,28 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/nextcloud/context_agent/issues/212", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "no", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every skill's name and description is put in the system prompt (context_agent:ex_app/lib/agent.py:165-177); searched 'search|rag' in skills.py: no skill search.", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_tool.py:656-690 skills_list takes an optional category filter, then skill_view loads one; agent/prompt_builder.py:1346-1370 the skills index collapses off-context categories to names only instead of dropping them; tools/tool_search.py:1-7 progressive disclosure with tool_search exists for tools, not skills; skills_hub search (tools/skills_hub_search.py) finds skills to install Note: Narrowing by category and a compact index, no query search over installed skills.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-overview skills \"implement a progressive disclosure pattern so agents load only the context they need\"; the runtime picks a skill by its description, but no search over a large skill set is documented. Note: Preview.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "Progressive disclosure exists for tools; skills are all loaded.", + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "lib/Service/Engine/ContextAssembler.php header: every active installed skill's name, description and body is injected into the run context (assembleSkillsForRun), no lookup; searched 'searchSkill|skill.?search|findSkill' in lib/ src/: none. Tools, not skills, get search: lib/Service/Engine/ToolLoop.php:27 above tools.disclosureThreshold only hermiq.searchTools is offered (lib/Mcp/HermiqToolProvider.php:292)" + }, + "reachedOn": "none" }, { "id": "dm-app-tools", @@ -8019,22 +8233,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/nextcloud/context_agent/issues/161", - "hermiq": "unknown", + "hermiq": "yes", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each unified search provider becomes a tool automatically (context_agent:ex_app/lib/all_tools/search.py:11-30); other tools are fixed modules shipped in all_tools or admin-added MCP servers (context_agent:ex_app/lib/tools.py:19-50).", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:6 plugins install as pip packages on the hermes_agent.plugins entry-point group or as directories with plugin.yaml, :456 register_tool adds their tools to the agent; tools/mcp_tool.py connects MCP servers as tool sources; plugins/ ships first-party examples", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-certification https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors third parties add tools as certified connectors and certified MCP servers (certification preview) that appear in the tool picker; installed apps do not register tools with an agent on their own.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/views/McpTools.vue:6-12,25-28 lists tools from 'every app that registers an IMcpToolProvider', read from src/api/agents.js:67 -> appinfo/routes.php:504 agents#tools; lib/Service/Engine/ToolLoop.php:195 listAgentFunctions takes them from OpenRegister's ToolRegistryFacade and lib/Service/Engine/FacadeToolInvoker.php:1238 invokes them, so an installed app's tools reach the agent with no hermiq change" + }, + "reachedOn": "/mcp-tools; /agents -> Edit agent tool picker; /agents/:id -> Tool governance" }, { "id": "dm-mcp-oauth", @@ -8043,22 +8262,27 @@ "source": "competitor-derived", "origin": "featureRequest", "originUrl": "https://github.com/nextcloud/context_agent/issues/74", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "partial", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the MCP server forwards the client's Authorization header to /ocs/v2.php/cloud/user to find the user (context_agent:ex_app/lib/mcp_server.py:17-41); searched 'oauth|well-known' in context_agent:ex_app: no OAuth discovery or flow.", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:1-6 `hermes mcp serve` is a stdio MCP server for a local client launched as a subprocess; searched 'oauth|bearer|token' in mcp_serve.py: no network transport and no OAuth sign-in for outside clients (the OAuth code in tools/mcp_oauth.py is Hermes as a client)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-dataverse outside clients such as Claude Desktop sign in with Entra ID to the Dataverse MCP server (preview); there is no MCP server for Copilot Studio agents themselves.", "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "the only MCP server hermiq serves is lib/Controller/McpRunController.php, a PublicPage endpoint for its own CLI runner authorised by a per-run bearer token (lib/Service/Llm/RunTokenService.php); searched 'oauth|well-known|authorization_server' in lib/Controller and lib/Mcp: no OAuth for outside clients. hermiq's tools are published through OpenRegister's MCP server (lib/Mcp/HermiqToolProvider.php), whose sign-in is OpenRegister's and was not read" + }, + "reachedOn": "none" }, { "id": "dm-show-reasoning", @@ -8067,22 +8291,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/nextcloud/assistant/pull/595", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "partial", "dify": "unknown", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: reasoning output is stored per message (assistant:lib/Listener/ChattyLLMTaskListener.php:130-131, lib/Migration/Version030500Date20260630083738.php:34) and shown in a 'Reasoning content' popover and while streaming (assistant:src/components/ChattyLLM/Message.vue:36-47,79-80).", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:190-192 /reasoning show|hide|full; hermes_cli/config_defaults.py:830 display.show_reasoning (default true); agent/reasoning_summaries.py summaries shown beside the answer in CLI, TUI and gateways", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace the maker view shows \"the reasoning card within the chat\" and the activity trace shows chain-of-thought steps; end users do not see the reasoning next to answers.", "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'reasoning|thinking' in src/ and lib/ (php, js, vue): no hit outside a code comment; src/views/Chat.vue renders the answer, sources and tool steps only (:266-288, :384-396)" + }, + "reachedOn": "none" }, { "id": "dm-speech-translate", @@ -8091,7 +8320,7 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/nextcloud/assistant/pull/601", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "yes", "hermes-agent": "unknown", "copilot-studio": "partial", @@ -8106,7 +8335,13 @@ "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "A person can speak, ask the agent to translate and hear the reply; there is no action that translates a recording.", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/modals/AgentFormModal.vue:256-304 dictation engine and 'Allow speaking with this agent' (reply spoken back); lib/Controller/SpeechController.php transcribe and synthesise over lib/Service/Speech/SpeechClient.php (appinfo/routes.php:540-542); lib/TaskProcessing/AudioToTextProvider.php:68-69 and TextToSpeechProvider.php for other apps. Searched 'translat' in lib/ src/ exapp/speech-runner: no translate step" + }, + "reachedOn": "/chat with a voice-enabled agent (microphone and spoken reply)" }, { "id": "dm-subtitles", @@ -8115,7 +8350,7 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/nextcloud/assistant/pull/577", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "yes", "hermes-agent": "unknown", "copilot-studio": "no", @@ -8130,7 +8365,13 @@ "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "Nextcloud-phrased row: hermiq provides transcription to TaskProcessing, not subtitle files from Files.", + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "lib/TaskProcessing/AudioToTextProvider.php:68-69,92-93 registers hermiq:audio2text for the plain core audio-to-text task type only; searched 'subtitle|\\.srt|webvtt' in lib/ src/ exapp/: no subtitle output and no Files action" + }, + "reachedOn": "none" }, { "id": "dm-image-chat", @@ -8139,7 +8380,7 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://github.com/nextcloud/assistant/pull/602", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "yes", "hermes-agent": "unknown", "copilot-studio": "partial", @@ -8154,7 +8395,12 @@ "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'attach|image|upload|fileId|vision|multimodal' in src/views/Chat.vue, src/api/chat.js, lib/Service/Engine and lib/Service/Llm/ProviderFactory.php: the composer sends text only (the one Chat.vue hit, :615, is the agent avatar), messages are built as text (lib/Service/Engine/ResponseGenerationHandler.php:363 LLPhantMessage::user($userMessage)) and no answer carries images" + }, + "reachedOn": "none" }, { "id": "dm-computer-use", @@ -8163,22 +8409,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "yes", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/computer_use_tool.py:14-24 registers computer_use: desktop control via cua-driver on macOS, Windows and Linux with any tool-capable model; toolsets.py:99-103 screenshots, mouse, keyboard, scroll, drag; tools/computer_use/tool.py:890-891 platform check incl. win32; tools/computer_use/permissions.py approval hook Note: opt-in toolset that needs the cua-driver binary on the machine; not in the default coding toolset (toolsets.py:70)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/computer-use https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-where-computer-use-runs computer use GA (May 2026) automates web and desktop apps by controlling them; runs on a hosted Cloud PC or the customer's own machine.", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'computer.?use|pyautogui|xdotool|desktop|screenshot' in api/core, dify-agent/, dify-agent-runtime/ and web/i18n/en-US: none beyond multimodal retrieval copy (dataset-settings.json:19); the agent sandbox is a Linux shell (docker/.env.example:271 DIFY_AGENT_RUNTIME_BACKEND), with no screen-reading or desktop-control tool Note: marketplace plugins were not checked; nothing in the core release", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'computer.?use|screenshot|pyautogui|xdotool|mouse|click|vnc|rdp|desktop|windows' in lib/, src/ and exapp/llm-runner/src: no screen-reading or desktop-control tool; the runner executes repo stages and MCP tools (exapp/llm-runner/src/runner.js), and hits are UI copy only (lib/Listener/TalkApprovalReactionListener.php:10 one-click approval)" + }, + "reachedOn": "nowhere" }, { "id": "dm-custom-metrics", @@ -8187,22 +8438,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 fixed insights (tokens, cost estimates, tool and skill usage, activity, model and platform breakdowns) behind /insights (hermes_cli/commands.py:287) and hermes_cli/web_routers/analytics.py:143 /api/analytics/usage for web/src/pages/AnalyticsPage.tsx; searched 'custom.?metric|metric.?defin' in agent/, hermes_cli/, web/src: no user-defined measures", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-custom-metrics up to three custom metrics described in natural language, calculated over conversations (preview, April 2026).", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:317-324 agent monitoring shows fixed metrics (active users, session interactions, token speed, token usage and cost); searched 'custom.?metric|customMetric' in api/ and web/app: none; custom measures only exist in external tracers Dify can forward to (web/i18n/en-US/app.json:220-266 Langfuse, Arize, Opik and others)", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "src/manifest.json:763-767 Dashboard shows fixed run metrics (success rate, latency, token usage) from lib/Controller/AnalyticsController.php:78 -> lib/Service/AnalyticsService.php:249-253; searched 'custom.?metric|metric.?defin|measure' in lib/, src/ and lib/Settings/hermiq_register.json: no user-defined measure, plain-language or otherwise" + }, + "reachedOn": "nowhere (built-in KPIs only, Dashboard /)" }, { "id": "dm-question-themes", @@ -8211,22 +8467,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'theme|cluster|topic|categor' in agent/insights.py, hermes_cli/web_routers/analytics.py and web/src/pages/AnalyticsPage.tsx: insights break usage down by model, platform, tool, skill and activity hour (agent/insights.py:318-442), never by what people asked; web/src/pages/SessionsPage.tsx lists sessions one by one", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-themes themes group related user questions with drill-down (preview since October 2025).", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'theme|cluster|topic' in web/i18n/en-US: only chat colour theme (app-overview.json:62) and the question-classifier node's topic names (workflow.json:875), which route a message inside a flow rather than grouping asked questions for review; logs (app-log.json) list conversations one by one with no theme view", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "report-similarity grouping is the nearest thing but answers a different question and has no drill-down view of agent questions", + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'theme|cluster|topic|categori|intent' in lib/Service, lib/Controller and src/: no grouping of user questions into themes; hits are GitHub repo topics (lib/Service/GitHubTemplatePushService.php) and a conversation-summary prompt (lib/Service/Engine/ConversationManagementHandler.php:415); lib/Controller/ReportSimilarityController.php groups incoming citizen reports for an owning app, not questions asked of an agent" + }, + "reachedOn": "nowhere" }, { "id": "dm-savings-tracking", @@ -8235,22 +8497,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "yes", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'time.?saved|savings|roi|hours saved' in agent/, hermes_cli/, web/src and locales/en.yaml: only context-compression savings (locales/en.yaml:337); agent/insights.py:29 estimates what runs cost, with no manual-effort baseline to compare against", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-flow-savings https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-cost-savings makers define savings rules per agent flow and agent; analytics show time and cost saved (solution-based flows only).", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'time saved|saving|ROI|cost saved' in web/i18n/en-US and api/services: none; monitoring reports token usage and estimated cost only (web/i18n/en-US/agent-v-2.json:323), with no manual-effort baseline", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'saving|time.?saved|hours saved|roi|cost.?avoid|manual' in lib/ and src/: none; analytics and budgets track spend only (lib/Service/AnalyticsService.php:253 tokens, lib/Controller/BudgetController.php), with no baseline of manual effort to compare against" + }, + "reachedOn": "nowhere" }, { "id": "dm-call-consent", @@ -8259,22 +8526,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "yes", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/productivity/telephony/SKILL.md:1-24 optional skill places outbound AI calls via Twilio, Bland.ai or Vapi, and scripts/telephony.py:595-622 can request recording and :857 returns the transcript; searched 'consent' in that script and plugins/platforms/discord: no step that asks the other party before recording or transcribing Note: calls exist only through an optional skill; recording is a flag the agent sets, with no consent prompt", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-consent-based-record consent-based recording prompts callers and continues without recording or transcription when consent is refused (May 2026).", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'consent|phone|telephon|recording' in api/core, api/controllers and web/i18n/en-US: no voice-call channel and no consent step; speech is text-to-speech and speech-to-text in the chat window only", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "the per-agent voiceInputEngine local/browser choice is a privacy control set by the agent owner, not caller consent", + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'consent|phone|telephon|sip|voice call|record' in lib/Service/Speech, lib/Controller/SpeechController.php and src/: no calls and no consent prompt; voice is dictation and a hands-free conversation mode in the chat composer (lib/Settings/hermiq_register.json:2715 voiceConversationEnabled, src/modals/AgentFormModal.vue:283), governed by a per-agent engine choice, never by asking the speaker" + }, + "reachedOn": "nowhere" }, { "id": "dm-async-flow-step", @@ -8283,22 +8556,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "yes", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool.py:955-964 a command asking for more than the foreground cap is promoted to a tracked background process and its result arrives later as a notification instead of failing; tools/async_delegation.py:1-8 delegate_task(background=true) returns a handle and the subagent result surfaces as a new turn (tools/process_registry_notifications.py:1-4) Note: works for tool calls and subagents; Hermes has no designed flows, so there is no flow step as such", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-asynchronous-response \"Asynchronous flows continue running beyond the previous two-minute limit while still returning a response to the agent\" (new infrastructure only).", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'async|background|long.?running|callback|resume' in web/i18n/en-US/workflow.json and api/core/workflow: a run pauses only for Human Input (api/core/workflow/nodes/human_input/pause_reason.py:21, api/repositories/sqlalchemy_api_workflow_run_repository.py:78); other steps are synchronous under timeouts (workflow.json:533-539 HTTP node, api/configs/feature/__init__.py:901 WORKFLOW_MAX_EXECUTION_TIME) Note: no step that hands back a result later; a long step has to fit within the timeouts", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "the late result flows into the next flow node; there is no path where an agent calls a flow as a tool and receives its answer later in the same turn", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/manifest.json:1271 Flows page authors OpenRegister flows; lib/Flow/HermiqFlowNodeListener.php:74-75 registers hermiq.workload-step and its collect node; lib/Flow/HermiqWorkloadCollectNode.php:3-20 an async step starts a minutes-long stage, the flow suspends on openregister.wait and collects the result on a later pass via lib/Service/AsyncStageDispatchService.php:44" + }, + "reachedOn": "Flows page (/flows), workload step with async: true" }, { "id": "dm-builder-upgrade", @@ -8307,22 +8586,27 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "no", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "yes", - "dify": "unknown", + "dify": "partial", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: one profile model: created in the dashboard (web/src/pages/ProfileBuilderPage.tsx) or the CLI, exported and imported as archives (hermes_cli/commands.py:88-90); searched 'builder|upgrade|promote' in hermes_cli/ and tui_gateway/: tui_gateway/onboarding_personalization.py:1 only writes onboarding answers to memory, so there is no lightweight builder tier to upgrade from", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents copy agents created in Microsoft 365 Copilot (Agent Builder) into Copilot Studio to add workflows and integrations (November 2025).", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app.json:212-216 'Switch to Workflow Orchestrate' creates a workflow copy of a basic app, no way back; web/app/components/app/switch-app-modal/index.tsx:81-91 -> api/controllers/console/app/workflow.py:1402-1421 POST /apps//convert-to-workflow for chat and completion apps Note: the upgrade path runs from the simple form builder to the workflow canvas; the lightweight builder is not in-chat, and basic agent apps are not in the allowed modes", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "built": { + "state": "none", + "owner": "ConductionNL/hermiq", + "evidence": "searched 'builder|create_agent|createAgent|draft.?agent|upgrade|promote' in lib/Mcp, lib/Service/Engine, lib/Service/Intake and src/: there is one agent editor (src/modals/AgentFormModal.vue on /agents) and no lightweight in-chat builder whose agents could be carried over; lib/Service/Assistant/AssistantService.php:576 findOrCreateAgent makes a per-app assistant agent, not a user-built one" + }, + "reachedOn": "nowhere" }, { "id": "dm-metadata-filter", @@ -8331,22 +8615,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "yes", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1268-1283 search_files takes path, file-name glob (file_glob) and newest-first order by modified time, chosen by the model per call; searched 'owner|modified_after|since|metadata' in tools/file_tools.py and tools/session_search_tool.py: no owner or date-range filter and no document knowledge base whose scope can be set by metadata", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint SharePoint metadata filters (file name, owner, modified date) refine knowledge retrieval (November 2025).", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/core/rag/index_processor/constant/built_in_field.py:4-9 built-in document_name, uploader, upload_date, last_update_date, source; api/core/workflow/nodes/knowledge_retrieval/entities.py:46-48 metadata_filtering_mode disabled|automatic|manual with conditions; web/i18n/en-US/workflow.json:722-737 Metadata Filter Conditions panel; also in app retrieval settings (web/app/components/app/configuration/dataset-config/index.tsx:195-217)", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "object search can be narrowed by saved views; document (file) search cannot be narrowed by metadata, and Context bundles have no page of their own", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/views/Chat.vue:848-867 chat search is scoped per agent to OpenRegister views (saved object filters) plus on/off for files and objects, sent to OpenRegister chat; lib/Settings/hermiq_register.json:3026-3044 Context bundles pin named file paths and object queries with equality filters, resolved in lib/Service/Engine/ContextAssembler.php:354,394; no filter on files by owner, file name or modified date" + }, + "reachedOn": "Chat page (/chat) agent settings; Context bundles via the generic objects API only" }, { "id": "dm-eval-in-pipeline", @@ -8355,22 +8645,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "yes", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "partial", - "dify": "unknown", + "dify": "no", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: evals/ holds the project's own regression probes (evals/approvals_test.py, evals/tool_search/tool_search_livetest.py) run by its developers, not a test set a user keeps for their agent; searched 'eval|benchmark|test set' in hermes_cli/commands.py, hermes_cli/main.py and hermes_cli/web_routers: no command or endpoint that runs an agent's cases and fails on a regression", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-rest-api https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-automate-tools evaluations run from the Power Platform API (preview) or the Power Automate connector for CI/CD and recurring checks.", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'evaluation|test_case|testset|regression' in api/controllers, api/services, api/models and web/app/components: no test sets for an app; difyctl can run an app from CI with deterministic exit codes (cli/README.md:39-41,76) but compares nothing, and evaluation is left to external tracers (web/i18n/en-US/app.json:222-266)", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "no shipped CI action; the pipeline fails itself by reading regressionGateResult. Owner-guarded: the pipeline must authenticate as the dataset and agent owner", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "docs/features/evaluations.md:41-42 documents POST /apps/hermiq/api/evals/{id}/run; appinfo/routes.php:96 -> lib/Controller/EvalRunController.php:127-139 NoCSRFRequired so an app-password client can call it, runs synchronously and returns regressionGateResult (lib/Service/EvalRunService.php:1149-1163 'failed' when the pass rate drops more than the threshold, overridable per call via regressionThresholdPercent)" + }, + "reachedOn": "Evaluations page (/evals/:id, eval-run-panel) and the documented REST endpoint" }, { "id": "dm-agent-as-code", @@ -8379,22 +8675,28 @@ "source": "competitor-derived", "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", - "hermiq": "unknown", + "hermiq": "partial", "nextcloud-assistant": "unknown", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "yes", - "dify": "unknown", + "dify": "yes", "n8n": "unknown", "open-webui": "unknown", "evidence": { "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "hermes-agent": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profiles.py:35,151,306 an agent (profile) is a directory of plain files (config.yaml, .env, SOUL.md, MEMORY.md, skills/) under HERMES_HOME that any editor and git can hold; hermes_cli/web_routers/analytics.py:33-54 the dashboard Config page reads and writes the same config.yaml, so edits made in files show up there; hermes_cli/commands.py:88-90 export and import profile archives Note: no git integration of its own; the files are the source of truth, so versioning them in git is direct", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-clone-agent the Visual Studio Code extension (GA January 2026) clones an agent to a local folder, supports git and applies changes back to Copilot Studio.", - "dify": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: cli/src/commands/export/studio-app/index.ts:8-12 difyctl export studio-app writes the app DSL as YAML to a file; cli/src/commands/import/studio-app/index.ts:9-17,31-33 import --from-file with --app-id overwrites the existing app; console equivalents at api/controllers/console/app/app.py:1024 and app_import.py:74 Note: overwrite in place is limited to workflow and advanced-chat apps (import flag help); CLI install is via R2 edge or GitHub release installers", "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" }, - "note": "hermiq not checked: back-fill pending" + "note": "one-way publish and install of templates; edits made in git do not sync back into the existing agent, they arrive as a new template to instantiate", + "built": { + "state": "built", + "owner": "ConductionNL/hermiq", + "evidence": "src/widgets/AgentTemplateRowActions.vue:261 export a template package; src/modals/AgentTemplatePublishModal.vue:198 -> lib/Controller/AgentTemplateController.php:629 publish to a NEW GitHub repo (lib/Service/GitHubTemplatePushService.php:14-17 re-publish to an existing repo is refused); src/widgets/AgentTemplateGithubStore.vue:449 -> AgentTemplateController.php:557 install from GitHub lands a new quarantined template" + }, + "reachedOn": "Store page (/store), template row actions and GitHub store" } ], "pending": [ From 8102829c5ea09e5bd49cf5cdebfc74d706da3e8b Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:00:55 +0200 Subject: [PATCH 11/12] chore(parity): fold the second back-fill round on the copilot-mined rows --- openspec/parity/capabilities.json | 120 +++++++++++++++--------------- 1 file changed, 60 insertions(+), 60 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 69de2aba9..0b5d1dc39 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -8410,19 +8410,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "yes", "dify": "no", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "partial", + "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'screen|click|desktop|computer' in context_agent:ex_app/lib (*.py): no hits; the 28 tool modules under context_agent:ex_app/lib/all_tools call Nextcloud and web APIs only, nothing that looks at a screen or drives a Windows app", "hermes-agent": "source read at v2026.9.24, not driven: tools/computer_use_tool.py:14-24 registers computer_use: desktop control via cua-driver on macOS, Windows and Linux with any tool-capable model; toolsets.py:99-103 screenshots, mouse, keyboard, scroll, drag; tools/computer_use/tool.py:890-891 platform check incl. win32; tools/computer_use/permissions.py approval hook Note: opt-in toolset that needs the cua-driver binary on the machine; not in the default coding toolset (toolsets.py:70)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/computer-use https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-where-computer-use-runs computer use GA (May 2026) automates web and desktop apps by controlling them; runs on a hosted Cloud PC or the customer's own machine.", "dify": "source read at 1.17.1, not driven: searched 'computer.?use|pyautogui|xdotool|desktop|screenshot' in api/core, dify-agent/, dify-agent-runtime/ and web/i18n/en-US: none beyond multimodal retrieval copy (dataset-settings.json:19); the agent sandbox is a Linux shell (docker/.env.example:271 DIFY_AGENT_RUNTIME_BACKEND), with no screen-reading or desktop-control tool Note: marketplace plugins were not checked; nothing in the core release", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/computer-use/README.md lists screen_screenshot and mouse/keyboard tools for macOS, Linux X11 and Windows, src/tools/screenshot/screenshot.ts:39, src/tools/mouse-keyboard/mouse-keyboard.ts:131; paired from instance-ai.controller.ts:1237 POST /gateway/create-link; default permission deny Note: works for the built-in n8n Assistant through a local gateway run with npx, not as a tool on a user-built agent or workflow", + "open-webui": "source read at v0.11.4, not driven: searched 'computer.use|desktop|screenshot|vnc|pyautogui' in backend/open_webui and CHANGELOG.md: only a desktop client app and a camera screenshot in CallOverlay.svelte:125; routers/terminals.py proxies shell terminal servers, no screen-and-click control of Windows apps" }, "built": { "state": "none", @@ -8439,19 +8439,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "partial", "dify": "no", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "partial", + "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'analytic|metric|statistic' in assistant:lib, assistant:src and context_agent:ex_app: no analytics surface at all, so no user-defined measures; the admin page assistant:src/components/AdminSettings.vue sets providers and features only", "hermes-agent": "source read at v2026.9.24, not driven: agent/insights.py:1-2 fixed insights (tokens, cost estimates, tool and skill usage, activity, model and platform breakdowns) behind /insights (hermes_cli/commands.py:287) and hermes_cli/web_routers/analytics.py:143 /api/analytics/usage for web/src/pages/AnalyticsPage.tsx; searched 'custom.?metric|metric.?defin' in agent/, hermes_cli/, web/src: no user-defined measures", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-custom-metrics up to three custom metrics described in natural language, calculated over conversations (preview, April 2026).", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/agent-v-2.json:317-324 agent monitoring shows fixed metrics (active users, session interactions, token speed, token usage and cost); searched 'custom.?metric|customMetric' in api/ and web/app: none; custom measures only exist in external tracers Dify can forward to (web/i18n/en-US/app.json:220-266 Langfuse, Arize, Opik and others)", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Evaluation/Evaluation/Description.node.ts:378-420 metric options include 'Custom Metrics: Define your own metric(s)' beside correctness and helpfulness, whose judge prompts are editable text (:432); production Insights (packages/cli/src/modules/insights/insights.controller.ts:24-87) are a fixed set Note: own measures exist for evaluation test runs, not for live analytics; evaluations are licence-quota gated", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/analytics.py:58-343 fixed endpoints (models, users, messages, summary, daily, tokens, model overview), admin UI src/lib/components/admin/Analytics/Dashboard.svelte; searched 'custom.?metric|measure' in routers/ and components/admin: no user-defined measures" }, "built": { "state": "none", @@ -8468,19 +8468,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "partial", "dify": "no", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "no", + "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'topic|theme|cluster|analytic' in assistant:lib and assistant:src: the only topic hit is the TextToTextTopics task type (assistant:lib/Service/AssistantService.php:48,79) that extracts topics from text a user pastes; nothing groups the questions people ask the agent", "hermes-agent": "source read at v2026.9.24, not driven: searched 'theme|cluster|topic|categor' in agent/insights.py, hermes_cli/web_routers/analytics.py and web/src/pages/AnalyticsPage.tsx: insights break usage down by model, platform, tool, skill and activity hour (agent/insights.py:318-442), never by what people asked; web/src/pages/SessionsPage.tsx lists sessions one by one", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-themes themes group related user questions with drill-down (preview since October 2025).", "dify": "source read at 1.17.1, not driven: searched 'theme|cluster|topic' in web/i18n/en-US: only chat colour theme (app-overview.json:62) and the question-classifier node's topic names (workflow.json:875), which route a message inside a flow rather than grouping asked questions for review; logs (app-log.json) list conversations one by one with no theme view", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: searched 'topic|theme|cluster|categor' in packages/cli/src/modules/insights and modules/agents and in the en.json locale: insights count executions, failures and time saved per workflow; agent threads carry only an emoji for the session topic (agents/entities/agent-execution-thread.entity.ts:39), no grouping of user questions into themes", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/analytics.py:343-415 model overview counts the top 10 chat tags per model; tags come from LLM tag generation, routers/tasks.py:279 /tags/completions, config.py:2297 ENABLE_TAGS_GENERATION default on; src/lib/components/admin/Analytics/AnalyticsModelModal.svelte:259-266 shows them as plain chips Note: auto tags work as rough themes per model for admins, but a chip does not drill into the questions behind it" }, "note": "report-similarity grouping is the nearest thing but answers a different question and has no drill-down view of agent questions", "built": { @@ -8498,19 +8498,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "yes", "dify": "no", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "partial", + "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'time saved|savings|roi|cost|usage' in assistant:lib, assistant:src and context_agent:ex_app: no hit that measures time or money saved, and no analytics page", "hermes-agent": "source read at v2026.9.24, not driven: searched 'time.?saved|savings|roi|hours saved' in agent/, hermes_cli/, web/src and locales/en.yaml: only context-compression savings (locales/en.yaml:337); agent/insights.py:29 estimates what runs cost, with no manual-effort baseline to compare against", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-flow-savings https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-cost-savings makers define savings rules per agent flow and agent; analytics show time and cost saved (solution-based flows only).", "dify": "source read at 1.17.1, not driven: searched 'time saved|saving|ROI|cost saved' in web/i18n/en-US and api/services: none; monitoring reports token usage and estimated cost only (web/i18n/en-US/agent-v-2.json:323), with no manual-effort baseline", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/insights/insights-collection.service.ts:345-348 records timeSavedPerExecution, fixed or dynamic via time saved nodes; locale en.json:4817-4825 'Estimated time saved' in workflow settings; insights.controller.ts:87 /by-time/time-saved not licence-restricted, :42-66 per-workflow and by-time dashboards licence-gated (feat:insights:viewDashboard) Note: time saved is tracked, money saved is not; per-workflow breakdown is enterprise-licensed", + "open-webui": "source read at v0.11.4, not driven: searched 'time.?saved|savings|roi|cost' in backend/open_webui/routers and src/lib/components/admin: analytics.py:235 reports token usage only, no time or money saved measure" }, "built": { "state": "none", @@ -8527,19 +8527,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "yes", "dify": "no", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "no", + "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'consent' in assistant:lib, assistant:src and context_agent:ex_app: zero hits; context_agent:ex_app/lib/all_tools/talk.py handles Talk conversations and messages, not voice calls, and audio2text.py transcribes a given file without a consent step", "hermes-agent": "source read at v2026.9.24, not driven: optional-skills/productivity/telephony/SKILL.md:1-24 optional skill places outbound AI calls via Twilio, Bland.ai or Vapi, and scripts/telephony.py:595-622 can request recording and :857 returns the transcript; searched 'consent' in that script and plugins/platforms/discord: no step that asks the other party before recording or transcribing Note: calls exist only through an optional skill; recording is a flag the agent sets, with no consent prompt", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-consent-based-record consent-based recording prompts callers and continues without recording or transcription when consent is refused (May 2026).", "dify": "source read at 1.17.1, not driven: searched 'consent|phone|telephon|recording' in api/core, api/controllers and web/i18n/en-US: no voice-call channel and no consent step; speech is text-to-speech and speech-to-text in the chat window only", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: agent channels are packages/cli/src/modules/agents/integrations/platforms (discord, linear, n8n chat, slack, telegram), no voice channel; searched 'consent' in packages/cli/src and the en.json locale: only OAuth and quick-connect consent screens, no call-recording consent", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/chat/MessageInput/CallOverlay.svelte is an in-browser voice call transcribed by speech-to-text; searched 'consent' in src/ and backend/ (excluding locale json): zero hits, no phone channel and no consent prompt before recording" }, "note": "the per-agent voiceInputEngine local/browser choice is a privacy control set by the agent owner, not caller consent", "built": { @@ -8557,19 +8557,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "partial", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "yes", "dify": "no", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "yes", + "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent:ex_app/lib/all_tools/lib/task_processing.py:54-55 a tool polls its TaskProcessing task every 5 s for at most 10 minutes, then gives up; searched 'workflowengine|IOperation|flow' in assistant:lib: no flow steps and no deferred hand-back to the agent", "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool.py:955-964 a command asking for more than the foreground cap is promoted to a tracked background process and its result arrives later as a notification instead of failing; tools/async_delegation.py:1-8 delegate_task(background=true) returns a handle and the subagent result surfaces as a new turn (tools/process_registry_notifications.py:1-4) Note: works for tool calls and subagents; Hermes has no designed flows, so there is no flow step as such", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-asynchronous-response \"Asynchronous flows continue running beyond the previous two-minute limit while still returning a response to the agent\" (new infrastructure only).", "dify": "source read at 1.17.1, not driven: searched 'async|background|long.?running|callback|resume' in web/i18n/en-US/workflow.json and api/core/workflow: a run pauses only for Human Input (api/core/workflow/nodes/human_input/pause_reason.py:21, api/repositories/sqlalchemy_api_workflow_run_repository.py:78); other steps are synchronous under timeouts (workflow.json:533-539 HTTP node, api/configs/feature/__init__.py:901 WORKFLOW_MAX_EXECUTION_TIME) Note: no step that hands back a result later; a long step has to fit within the timeouts", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-workflow-tool-resume.service.ts:24-48 wakes the agent tool call when the workflow it started leaves 'waiting' (timer, webhook, form, auto-resume), handleWorkflowExecuteAfter reads parentAgentRun; agents/agent-chat.controller.ts:268 background-tasks per thread Note: Agents module is opt-in (N8N_ENABLED_MODULES=agents); plain workflows also wait on the Wait node's resume webhook", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:1680-1699 delegate_task(background=True) 'Return immediately and continue this chat when the sub-agent finishes'; utils/subagents.py:307 gated by subagents.background_enabled, :362-369 async slot cap. Searched 'workflow|flow|callback' in routers/: no flow engine Note: a long task can hand back later through a background sub-agent; there is no flow with steps, so the flow half of the row is missing" }, "note": "the late result flows into the next flow node; there is no path where an agent calls a flow as a tool and receives its answer later in the same turn", "built": { @@ -8587,19 +8587,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "no", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "yes", "dify": "partial", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "yes", + "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: one fixed agent (context_agent:ex_app/lib/agent.py builds a single system prompt); searched 'builder|agent create|upgrade' in assistant:lib and assistant:src: no agent builder of either kind", "hermes-agent": "source read at v2026.9.24, not driven: one profile model: created in the dashboard (web/src/pages/ProfileBuilderPage.tsx) or the CLI, exported and imported as archives (hermes_cli/commands.py:88-90); searched 'builder|upgrade|promote' in hermes_cli/ and tui_gateway/: tui_gateway/onboarding_personalization.py:1 only writes onboarding answers to memory, so there is no lightweight builder tier to upgrade from", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/microsoft-365-copilot-extend-with-agents copy agents created in Microsoft 365 Copilot (Agent Builder) into Copilot Studio to add workflows and integrations (November 2025).", "dify": "source read at 1.17.1, not driven: web/i18n/en-US/app.json:212-216 'Switch to Workflow Orchestrate' creates a workflow copy of a basic app, no way back; web/app/components/app/switch-app-modal/index.tsx:81-91 -> api/controllers/console/app/workflow.py:1402-1421 POST /apps//convert-to-workflow for chat and completion apps Note: the upgrade path runs from the simple form builder to the workflow canvas; the lightweight builder is not in-chat, and basic agent apps are not in the allowed modes", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/instance-ai-builder-delegate.adapter.ts:143-150 the in-chat n8n Assistant's build-agent tool (packages/@n8n/instance-ai/src/tools/tool-ids.ts:39) creates a real agent through agentsService.createOrAdopt; instance-ai/agent-preview-handoff.ts binds that agent as the builder target, so the same agent opens in the full agent builder Note: Agents module is opt-in (N8N_ENABLED_MODULES=agents); instance-ai is a default module", + "open-webui": "source read at v0.11.4, not driven: searched 'builder|create_model|upgrade|convert' in backend/open_webui/tools/builtin.py, routers/ and src/lib/i18n/locales/en-US/translation.json: one model editor under src/lib/components/workspace/Models, no lightweight in-chat builder, so there is nothing to upgrade from" }, "built": { "state": "none", @@ -8616,19 +8616,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "partial", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "yes", "dify": "yes", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "yes", + "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent:ex_app/lib/all_tools/context_chat.py:30-55 ask_context_chat scopes semantic search by scope_type 'source' (file ids) or 'provider'; context_agent:ex_app/lib/all_tools/search.py:17-28 unified search tools accept each provider's filters (person, dates, name term) to find those ids Note: the model can narrow by owner or date by chaining unified search into a scoped question, but no metadata filter is set on the agent's knowledge itself, and it needs the separate context_chat app", "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:1268-1283 search_files takes path, file-name glob (file_glob) and newest-first order by modified time, chosen by the model per call; searched 'owner|modified_after|since|metadata' in tools/file_tools.py and tools/session_search_tool.py: no owner or date-range filter and no document knowledge base whose scope can be set by metadata", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-sharepoint SharePoint metadata filters (file name, owner, modified date) refine knowledge retrieval (November 2025).", "dify": "source read at 1.17.1, not driven: api/core/rag/index_processor/constant/built_in_field.py:4-9 built-in document_name, uploader, upload_date, last_update_date, source; api/core/workflow/nodes/knowledge_retrieval/entities.py:46-48 metadata_filtering_mode disabled|automatic|manual with conditions; web/i18n/en-US/workflow.json:722-737 Metadata Filter Conditions panel; also in app retrieval settings (web/app/components/app/configuration/dataset-config/index.tsx:195-217)", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/vector_store/VectorStorePGVector/VectorStorePGVector.node.ts:185 and VectorStorePinecone/VectorStorePinecone.node.ts:29 add metadataFilterField from @n8n/ai-utilities; the same field is on Qdrant, Chroma, Supabase, Zep, MongoDB Atlas and Redis vector store nodes Note: filters on whatever metadata the ingest flow stored, so owner, file name or date need to be written at load time", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:3151-3165 query_knowledge_files scopes only by knowledge_ids, :2164-2183 search_knowledge_files matches file names and returns updated_at; retrieval/utils.py:344 query_doc takes no filter; model knowledge attachments pick which KBs or files an agent sees. Searched 'filter' in retrieval/utils.py: no owner or date filter on retrieval Note: scoping is by picking collections or files, not by owner, name pattern or modified date on the search itself" }, "note": "object search can be narrowed by saved views; document (file) search cannot be narrowed by metadata, and Context bundles have no page of their own", "built": { @@ -8646,19 +8646,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "yes", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "partial", "dify": "no", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "partial", + "open-webui": "no", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'evaluat|test set|dataset|regress' in assistant:lib, assistant:openapi.json and context_agent:ex_app: no stored test set, no evaluation run and no API a pipeline could call; the only 'evaluates' hit is recurrence logic in assistant:lib/Db/Assignment.php:131", "hermes-agent": "source read at v2026.9.24, not driven: evals/ holds the project's own regression probes (evals/approvals_test.py, evals/tool_search/tool_search_livetest.py) run by its developers, not a test set a user keeps for their agent; searched 'eval|benchmark|test set' in hermes_cli/commands.py, hermes_cli/main.py and hermes_cli/web_routers: no command or endpoint that runs an agent's cases and fails on a regression", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-rest-api https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-agent-evaluation-automate-tools evaluations run from the Power Platform API (preview) or the Power Automate connector for CI/CD and recurring checks.", "dify": "source read at 1.17.1, not driven: searched 'evaluation|test_case|testset|regression' in api/controllers, api/services, api/models and web/app/components: no test sets for an app; difyctl can run an app from CI with deterministic exit codes (cli/README.md:39-41,76) but compares nothing, and evaluation is left to external tracers (web/i18n/en-US/app.json:222-266)", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/public-api/v1/handlers/evaluations/spec/paths/workflows.id.test-runs.yml:33-40 POST trigger a test run, GET run and cases return metrics (schemas/testRunSummary.yml:17); evaluations.handler.ts:32-37 refuses when licence quota quota:evaluations:maxWorkflows is 0 Note: a pipeline can trigger and read a run over the public API, but the pass or fail threshold lives in the pipeline script, and the feature is licence-quota gated", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/evaluations.py:222-462 is arena feedback and a leaderboard (thumbs, won/lost), src/lib/components/admin/Evaluations/Leaderboard.svelte; searched 'test.?set|dataset|eval.*run|suite' in backend/open_webui/routers: no stored test set and no API to run one, so nothing for a pipeline to call" }, "note": "no shipped CI action; the pipeline fails itself by reading regressionGateResult. Owner-guarded: the pipeline must authenticate as the dataset and agent owner", "built": { @@ -8676,19 +8676,19 @@ "origin": "changelog", "originUrl": "https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new", "hermiq": "partial", - "nextcloud-assistant": "unknown", + "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "yes", "dify": "yes", - "n8n": "unknown", - "open-webui": "unknown", + "n8n": "partial", + "open-webui": "partial", "evidence": { - "nextcloud-assistant": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", + "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent:ex_app/lib/all_tools/skills.py:14-17 skills are SKILL.md folders under 'Context Agent/Skills' in the user's Files; assistant:lib/Service/AgentSkillsService.php:31 SKILLS_FOLDER_PATH, lib/Controller/AgentSkillsApiController.php:59,95,135 list, load, store Note: one fixed agent; only its skills live as editable files (syncable with the desktop client), no agent definition to edit and no git sync", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/profiles.py:35,151,306 an agent (profile) is a directory of plain files (config.yaml, .env, SOUL.md, MEMORY.md, skills/) under HERMES_HOME that any editor and git can hold; hermes_cli/web_routers/analytics.py:33-54 the dashboard Config page reads and writes the same config.yaml, so edits made in files show up there; hermes_cli/commands.py:88-90 export and import profile archives Note: no git integration of its own; the files are the source of truth, so versioning them in git is direct", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/visual-studio-code-extension-clone-agent the Visual Studio Code extension (GA January 2026) clones an agent to a local folder, supports git and applies changes back to Copilot Studio.", "dify": "source read at 1.17.1, not driven: cli/src/commands/export/studio-app/index.ts:8-12 difyctl export studio-app writes the app DSL as YAML to a file; cli/src/commands/import/studio-app/index.ts:9-17,31-33 import --from-file with --app-id overwrites the existing app; console equivalents at api/controllers/console/app/app.py:1024 and app_import.py:74 Note: overwrite in place is limited to workflow and advanced-chat apps (import flag help); CLI install is via R2 edge or GitHub release installers", - "n8n": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the copilot-studio changelog on 2026-09-26, back-fill pending" + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/source-control.ee/source-control.controller.ee.ts:196,226 push and pull a git work folder, constants.ts:4-11 exports workflows, credential stubs, projects, folders and data tables but no agents, licence feat:sourceControl (packages/@n8n/constants/src/index.ts:22); agents/agents-config.controller.ts:25,62 GET and PUT an agent's JSON config Note: enterprise-licensed git sync covers workflows, not the opt-in Agents module; an agent round-trips as JSON over the REST config endpoint only", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/models.py:381 GET /models/export and :441 POST /models/import (JSON), :685 POST /models/sync admin-only; src/lib/components/workspace/Models.svelte:288,498 export and import buttons; routers/tools.py:264 POST /tools/load/url pulls a tool from a GitHub URL one way. Searched 'git|repo|sync' in routers/: no git link or two-way sync Note: an agent (model) round-trips as a JSON file you can edit and keep in git by hand; no built-in git sync or file-per-agent layout" }, "note": "one-way publish and install of templates; edits made in git do not sync back into the existing agent, they arrive as a new template to instantiate", "built": { From bbe81f2dc74eabcaa28ecef8f4769ff196411790 Mon Sep 17 00:00:00 2001 From: Ruben van der Linde Date: Sat, 26 Sep 2026 23:12:39 +0200 Subject: [PATCH 12/12] chore(parity): fold the last back-fill round and apply the lane rulings on dify's responses-api and native-pdf cells --- openspec/parity/capabilities.json | 248 +++++++++++++++--------------- 1 file changed, 124 insertions(+), 124 deletions(-) diff --git a/openspec/parity/capabilities.json b/openspec/parity/capabilities.json index 0b5d1dc39..8523c55d3 100644 --- a/openspec/parity/capabilities.json +++ b/openspec/parity/capabilities.json @@ -7557,14 +7557,14 @@ "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "partial", - "dify": "unknown", + "dify": "partial", "n8n": "partial", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent can loop over DuckDuckGo search and web_fetch and is told to fetch result pages (context_agent:ex_app/lib/agent.py:143-158, context_agent:ex_app/lib/all_tools/duckduckgo.py, web.py); no dedicated deep-research mode or cited report.", "hermes-agent": "source read at v2026.9.24, not driven: skills/research/grounded-citations/SKILL.md:1-25 bundled skill: numbered citations from a retrieval ledger, verbatim quote checks, `verify --evidence` fails uncited claims, for reports; tools/web_tools.py:519,525 web_search and web_extract; tools/delegate_tool.py:738 delegate_task parallel sub-agents; optional-skills/research/parallel-cli adds a vendor deep-research service Note: No dedicated research button; the agent does it on its own with the bundled skill and tools.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/workflows-experience/microsoft-365-copilot-node-workflow a workflow node can call Microsoft 365 Copilot's Researcher agent for research and audit drafting; no deep research tool native to Copilot Studio agents. Note: Needs Microsoft 365 Copilot.", - "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'deep.?research' in api/, web/app, web/i18n/en-US: no packaged mode, not among the built-in templates in api/constants/recommended_apps.json; an author can build one from the function-calling agent (api/core/agent/fc_agent_runner.py) or the workflow Agent node (api/core/workflow/nodes/agent/agent_node.py:30) with search tool plugins such as tavily or perplexity Note: Buildable, not shipped as a feature.", "n8n": "source read at n8n@2.40.7, not driven: an Agents-module agent can be set up for research with web search (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:80-84), parallel sub-agents (:151-160) and cited knowledge reads (packages/cli/src/modules/agents/agent-knowledge-retrieval.ts:199); there is no research mode, and OpenAI deep-research models are switched off in chat (packages/cli/src/modules/chat-hub/chat-hub.constants.ts:226-231, 603-605) Note: Assembled from agent settings; no one-click deep research.", "open-webui": "source read at v0.11.4, not driven: no research mode (searched 'deep.?research' in backend/open_webui and src/lib/components: hits only in stale locale files); pieces exist: tools/builtin.py:294 search_web, :333 fetch_url, :1680 delegate_task parallel sub-agents, citations in chat/Messages/Citations.svelte" }, @@ -7587,14 +7587,14 @@ "nextcloud-assistant": "yes", "hermes-agent": "no", "copilot-studio": "yes", - "dify": "unknown", + "dify": "no", "n8n": "yes", "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: sign-in is Nextcloud's own, where two-factor providers apply (server and twofactor apps, not read); every Assistant route requires that session (assistant:lib/Controller/ChattyLLMController.php NoAdminRequired, no PublicPage).", "hermes-agent": "source read at v2026.9.24, not driven: searched 'totp|two.?factor|2fa|mfa|webauthn|passkey' in hermes_cli/, gateway/, web/src and agent/: the dashboard authorises with one session token (hermes_cli/web_server.py:318-324,405-416) and messaging users by platform id allowlists; TOTP hits are the credential vault that fills OTP codes on outside sites for the agent (agent/vault_store.py:75-87) Note: Sign-in to outside sites with 2FA is supported for the agent; signing in to Hermes itself has no second factor.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/security-conditional-access https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-use-entra-agent-identities sign-in goes through Microsoft Entra ID, where Conditional Access policies require MFA for Copilot Studio. Note: Entra ID P1 for Conditional Access.", - "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'totp|two.?factor|2fa|mfa|authenticator|pyotp' in api/, web/app, web/i18n/en-US: no second factor; api/controllers/console/auth/login.py:120,191 password or email-code login as alternatives; api/services/system_feature_service.py:163 SSO enforcement comes from the enterprise edition Note: An enterprise SSO IdP can impose MFA outside Dify.", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/mfa/totp.service.ts and packages/cli/src/controllers/mfa.controller.ts:73-115 authenticator-app setup (QR, enable) with a code at sign-in (en.json:6099 'Two-factor authentication'); forcing it on everyone is licence-gated, mfa.controller.ts:31 enforce-mfa with feat:mfaEnforcement (packages/@n8n/constants/src/index.ts:18) Note: Enforcement for all users is enterprise-licensed.", "open-webui": "source read at v0.11.4, not driven: searched 'totp|two.?factor|2fa|mfa|webauthn|passkey' in backend/open_webui and src/lib/components: no second factor; MFA only through an outside OIDC provider (utils/oauth.py)" }, @@ -7617,14 +7617,14 @@ "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "no", - "dify": "unknown", + "dify": "no", "n8n": "no", "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: messages are stored as plain text columns (assistant:lib/Migration/Version010010Date20240430083738.php:55-68); searched 'encrypt' in both repos: none.", "hermes-agent": "source read at v2026.9.24, not driven: sessions live in the profile's SQLite state.db (hermes_state_dbfile.py:1-4); searched 'encrypt|sqlcipher|fernet' in hermes_state*.py, hermes_cli/, agent/, gateway/: hits are provider encrypted_content passthrough (agent/native_compaction.py:345) and peer transport (gateway/hosted_room_peer.py:510-545), no key a user holds over stored conversations Note: A single-user local install where the operator is usually the user; a shared gateway operator can read all sessions.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-customer-managed-keys CMK encrypts an environment with the organisation's key; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"user.{0,10}key|end-to-end\": no per-user key that locks out admins.", - "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'end.to.end encrypt|e2ee|passphrase|client.side encrypt|user.?encryption.?key' in api/, web/app, web/i18n/en-US: none; api/core/helper/encrypter.py:17 and api/libs/rsa.py:47 encrypt provider credentials with a server-held tenant key, while messages are stored readable (api/models/model.py:1496 Message rows)", "n8n": "source read at n8n@2.40.7, not driven: chat messages are stored as ordinary rows (packages/cli/src/modules/chat-hub/chat-hub-message.entity.ts); instance encryption covers credentials with an instance key (packages/cli/src/encryption/key-manager.service.ts, packages/core/src/encryption/cipher.ts); searched 'end-to-end|e2ee|user key' in packages/cli/src/modules/chat-hub and packages/cli/src/encryption: no per-user key", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/internal/db.py:289 whole-database encryption with sqlite+sqlcipher and DATABASE_PASSWORD, instance-wide; searched 'encrypt' in models/chats.py: chats stored readable to the server and admins, no per-user key" }, @@ -7646,14 +7646,14 @@ "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "yes", - "dify": "unknown", + "dify": "partial", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the MCP client config is one admin JSON for all users (context_agent:ex_app/lib/main.py:103-110, context_agent:ex_app/lib/all_tools/mcp.py:14-20); no per-user login to outside MCP servers. The reverse direction (this instance as MCP server) does run as the caller (mcp_server.py:31-41).", "hermes-agent": "source read at v2026.9.24, not driven: tools/mcp_oauth.py:1-9 OAuth 2.1 with PKCE per MCP server, tokens kept in HERMES_HOME/mcp-tokens/ (:412); hermes_cli/web_routers/mcp.py:21-37 dashboard OAuth flow; tools/mcp_tool_scope.py:1-14 each profile holds its own connection and credentials Note: Per profile (one login per agent owner), not per person: in a shared gateway chat every participant's tool calls run with the profile's login.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-add-existing-server-to-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/agent-extend-action-mcp MCP servers connect with OAuth 2.0 so \"individual users grant access to their data\"; tool calls then run with that user's rights.", - "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/models/tools.py:300-324 an MCP provider is stored per workspace (unique on tenant_id), so its OAuth token or header is shared; api/core/tools/mcp_tool/tool.py:276,318-321,340-372 forwards the calling user's identity as X-Dify-SSO-Token only when DEPLOYMENT_EDITION is ENTERPRISE and identity mode is on Note: Per-person identity on MCP calls is enterprise-licensed; the community edition connects with one workspace credential.", "n8n": "source read at n8n@2.40.7, not driven: an agent's MCP server takes one OAuth or header credential chosen by its builder (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:243-252, McpOAuth2Api at packages/@n8n/nodes-langchain/credentials/McpOAuth2Api.credentials.ts); per-person MCP connections exist for n8n's own assistant (packages/cli/src/modules/instance-ai/entities/instance-ai-thread-grant.entity.ts) and per-user resolution in workflows needs licensed dynamic credentials (packages/cli/src/modules/dynamic-credentials.ee) Note: Per-person login only in the assistant or with an enterprise licence.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/tools.py:137-158 tool server auth types bearer, session, system_oauth, oauth_2.1 and oauth_2.1_static; src/lib/components/AddToolServerModal.svelte:143 registers an OAuth client for MCP; per-user tokens encrypted in utils/oauth.py:269 Note: discussion still open, but the code has per-user OAuth 2.1 for MCP" }, @@ -7676,14 +7676,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "no", - "dify": "unknown", + "dify": "partial", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: the agent calls TaskProcessing only (context_agent:ex_app/lib/nc_model.py:165-179); the provider protocol is chosen inside integration_openai, not read.", "hermes-agent": "source read at v2026.9.24, not driven: agent/codex_responses_adapter.py:1-2 'OpenAI Responses API (OpenAI Codex, xAI, GitHub Models and other compatible endpoints)', agent/transports/codex.py:1 Responses transport; hermes_cli/main_provider_setup.py:418 custom provider setup asks for the api_mode, hermes_cli/model_setup_flows_custom.py:99,146 stores codex_responses; hermes_cli/config_defaults.py:747 api_mode chat_completions | anthropic_messages | codex_responses", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/bring-your-own-model-prompts \"If you use the model's Responses API endpoint ... the connection fails\"; only chat completions endpoints are supported.", - "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: core has no provider code (model providers are plugins); the official OpenAI model plugin (langgenius/dify-official-plugins models/openai/models/llm/llm.py:19-24,74-89,216-222, GitHub main) calls client.responses by default unless api_protocol is set to chat Note: Marketplace plugin per the lane rule, although every Dify model provider is a plugin. Stays partial: the plugin was read on GitHub main, not at a tag or named commit (lane ruling 2026-09-26).", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatOpenAi/LmChatOpenAi.node.ts:255-260 'Use Responses API' option; chat hub providers carry responsesApiEnabled (packages/@n8n/api-types/src/chat-hub.ts:585)", "open-webui": "source read at v0.11.4, not driven: src/lib/components/AddConnectionModal.svelte:51 apiType '' or 'responses'; backend/open_webui/routers/openai.py:1589 is_responses, :1618-1634 posts to {url}/responses with convert_to_responses_payload Note: discussion still open; the code ships it" }, @@ -7705,14 +7705,14 @@ "nextcloud-assistant": "unknown", "hermes-agent": "yes", "copilot-studio": "unknown", - "dify": "unknown", + "dify": "partial", "n8n": "yes", "open-webui": "partial", "evidence": { "nextcloud-assistant": "not checked: source read at assistant v4.0.0 and context_agent v2.8.0, not driven: source read at these tags could not settle it: no caching in these repos; provider-side caching would be in integration_openai or the provider, not read.", "hermes-agent": "source read at v2026.9.24, not driven: agent/prompt_caching.py:1-5 four cache_control breakpoints set automatically on the system prefix and last messages; hermes_cli/config_defaults.py:675-679 prompt_caching.cache_ttl 5m or 1h for Claude via OpenRouter or the native API; hermes_cli/cli_status_bar_mixin.py:991 status bar shows cache_hit Note: Anthropic-style caching is set by Hermes; other providers cache on their own side.", "copilot-studio": "not checked: docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/prompt-model-settings https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-messages-management not checked: searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"prompt cach|caching\" and found nothing on provider-side prompt caching; billing is per Copilot Credit, so any caching is invisible to customers.", - "dify": "not checked: demand row mined from the open-webui feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'cache_control|prompt_cach|cached_tokens|cache_read' in api/ and dify-agent/src: nothing in core; the official Anthropic model plugin (langgenius/dify-official-plugins models/anthropic/models/llm/llm.py:68-124, GitHub main) adds cache_control only when enable_system_cache is on and the author wraps text in tags Note: Official plugin only and opt-in with markup, not automatic.", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/llms/LMChatAnthropic/LmChatAnthropic.node.ts:531-590 promptCaching option with 5m or 1h lifetime; Agents-module agents set promptCaching per agent (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:75-78, en.json:7904) Note: A switch per model node or agent, not on for every provider (an open request asks for it on OpenRouter).", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/anthropic.py:111 _copy_cache_control passes cache_control through when the caller sets it; searched 'cache_control|prompt.?cach' in utils/payload.py and routers/openai.py: nothing adds cache breakpoints automatically" }, @@ -7735,14 +7735,14 @@ "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "yes", - "dify": "unknown", + "dify": "yes", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the run pauses before a sensitive action and asks Confirm or Cancel, with the option to reply with new instructions (assistant:src/components/ChattyLLM/AgencyConfirmation.vue:10-30,76); free questions end the turn. No suggested-answer buttons.", "hermes-agent": "source read at v2026.9.24, not driven: tools/clarify_tool.py:1-3 'structured multiple-choice / open-ended questions to the user', :9 up to 4 choices plus 'Other', :16 first choice marked (Recommended), registered at :306-307; answered in the CLI, TUI and every gateway (gateway/run_turn_runner_clarify_delivery.py)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-ask-a-question https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-generative-actions generative orchestration generates \"questions to ask the user for missing information\"; Question nodes offer multiple-choice options before continuing.", - "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/layers/ask_human/layer.py:1-60 ask_human deferred tool the model calls mid-run; ask_human/schema.py:21,85 buttons and select options; api/core/workflow/nodes/agent_v2/ask_human_hitl.py:1-7 maps it to a HITL form; api/tasks/app_generate/resume_agent_app_task.py:1-8 resumes the run with the answer Note: The agent tool is in the opt-in Agent v2 (web/env.ts:74). Workflows also have a GA Human Input node with select fields (api/core/workflow/nodes/human_input/enums.py:57).", "n8n": "source read at n8n@2.40.7, not driven: workflows: the Chat node's 'Wait for User Reply' and approval response type pause the run for the person's answer (packages/@n8n/nodes-langchain/nodes/trigger/ChatTrigger/Chat.node.ts:141,172); Agents module: a chat_action card with buttons or radio choices suspends the run until answered (packages/@n8n/api-types/src/agents/types.ts:379, packages/frontend/editor-ui/src/features/agents/components/interactive/InteractiveCard.vue:46-55, en.json:7684 'Waiting on the card above to continue')", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/tools/builtin.py:518 ask_user (1-3 questions with options and free text), resolved via utils/tool_approval.py:13 action 'answer'; src/lib/components/chat/AskUserCard.svelte mounted at chat/MessageInput.svelte:1776; survives reload (CHANGELOG.md:331)" }, @@ -7765,14 +7765,14 @@ "nextcloud-assistant": "partial", "hermes-agent": "no", "copilot-studio": "partial", - "dify": "unknown", + "dify": "yes", "n8n": "partial", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: TaskProcessing task types declare input shapes that the Assistant renders as fields, enums and numbers (assistant:src/components/fields/TaskTypeFields.vue, EnumField.vue, NumberField.vue); the agent chat has no such form.", "hermes-agent": "source read at v2026.9.24, not driven: searched 'form|fields|inputs|variables' in agent/prompt_builder.py, tools/blueprints.py and hermes_cli/web_routers/profiles.py: a profile declares no start-of-chat form; skills can declare required environment variables captured at first use (tools/skills_tool_setup.py:46-56) and blueprints gather slot values conversationally (hermes_cli/blueprint_cmd.py:15-20), neither is a form filled before the conversation", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-ask-with-adaptive-card https://learn.microsoft.com/en-us/microsoft-copilot-studio/configure-bot-greeting an Adaptive Card form in the Conversation Start topic can collect fields at the start; agents do not declare typed start fields natively.", - "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/core/app/app_config/easy_ui_based_app/variables/manager.py:116-153 user_input_form accepts text-input, select, paragraph, number variables; web/app/components/base/chat/chat-with-history/inputs-form/content.tsx:98,114 renders paragraph and select fields; chat-with-history/chat-wrapper.tsx:353 mounts InputsForm before the first message", "n8n": "source read at n8n@2.40.7, not driven: an n8n Form Trigger collects declared fields (text, dropdown and more) before a workflow runs and can hand them to an AI Agent (packages/nodes-base/nodes/Form/FormTrigger.node.ts); chat agents only offer suggested prompts (packages/cli/src/modules/chat-hub/chat-hub-agent.entity.ts:62-63); searched 'formFields|inputFields' in packages/cli/src/modules/chat-hub and nodes/trigger/ChatTrigger: no fields declared by the agent itself Note: Hand-built as a form in front of an agent workflow.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/chat_variables.py:127 get_chat_variables_schema parses fields from the system prompt; routers/models.py:60 add_chat_variables_schema; ModelEditor.svelte:1084 'Chat Variables' (CHANGELOG.md:655)" }, @@ -7794,14 +7794,14 @@ "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "no", - "dify": "unknown", + "dify": "partial", "n8n": "yes", "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: message actions are copy, regenerate and delete (assistant:src/components/ChattyLLM/MessageActions.vue:9-32); searched 'fork|branch' in chat code: none.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:76-77 /branch (alias /fork) clones the current session into a new one, the original stays; gateway/slash_commands_branch_thread.py:1-6 opens the clone as a sibling thread on Discord, Telegram, Slack and Matrix; hermes_cli/commands.py:71 /undo backs up N turns, so a branch followed by /undo reaches an earlier answer Note: Forks at the current end of the session; there is no fork button on an individual answer.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-history searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"fork|branch the conversation|edit.{0,20}message\": nothing.", - "dify": "not checked: demand row mined from the open-webui changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/models/model.py:1496 messages carry parent_message_id, so editing a question or regenerating an answer adds a sibling branch; web/app/components/base/chat/chat/question.tsx:24,113-121 switchSibling to move between branches, :63 edit calls onRegenerate; searched 'fork|duplicate conversation|branch' in web/i18n/en-US share and common: no fork into a separate conversation Note: Branching stays inside the same conversation; the original path is kept and switchable.", "n8n": "source read at n8n@2.40.7, not driven: editing or regenerating a message keeps the original and adds a branch (packages/cli/src/modules/chat-hub/chat-hub-message.entity.ts:103-114 previousMessageId, retryOfMessageId, revisionOfMessageId; chat-hub.controller.ts:224,283 edit and regenerate), and the user flips between branches (packages/frontend/editor-ui/src/features/ai/chatHub/components/ChatMessageActions.vue:119-136 '1/2' alternatives; en.json:658-659) Note: Branches live inside the same conversation rather than as a separate copy.", "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:1672 POST /chats/{id}/fork copies the chat up to a message and records the branch (utils/chat_fork.py:4 build_fork_history); fork button per response src/lib/components/chat/Messages/ResponseMessage.svelte:1528 (CHANGELOG.md:665)" }, @@ -7823,16 +7823,16 @@ "nextcloud-assistant": "no", "hermes-agent": "no", "copilot-studio": "partial", - "dify": "unknown", + "dify": "no", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no flows in either repo (searched 'flow|workflow').", "hermes-agent": "source read at v2026.9.24, not driven: scheduled work is cron jobs and blueprints (tools/blueprints.py:1-7, tools/cronjob_tools.py); searched 'review|approv|reviewer' in cron/ and tools/cronjob*.py: cron prompts are scanned for injection (tools/cronjob_prompt_scan.py) but no named person approves a change before it goes live Note: Hermes has no flows; its nearest equivalent, cron jobs, has no change review.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/power-platform/alm/extend-pipelines https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-solutions-overview Power Platform pipelines with delegated deployment require approval from an authorised identity before a solution (agent or flow) reaches the next stage.", - "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'publish.{0,20}(approv|review)|(approv|review).{0,20}publish|pending_review|reviewer' in api/services, api/controllers, api/models, api/enterprise, web/i18n/en-US: none; publishing a workflow is a direct action; api/core/rbac/entities.py:25 RBAC permissions gate who may act, not a named approver", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/workflow-reviews.ee/workflow-review-publish-guard.service.ts:8-22 blocks publishing while a review is open or changes are requested; reviewers per request in packages/@n8n/db/src/entities/workflow-review-request-reviewer.ee.ts; review inbox in packages/frontend/editor-ui/src/features/workflow-reviews/; licence flag feat:workflowReviews (packages/@n8n/constants/src/index.ts:58). Enterprise-licensed; workflows only, not Agents-module agents.", - "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: searched 'approv|review' in src/lib/i18n/locales/en-US/translation.json: only tool-call approval (:230, :1571, backend/open_webui/utils/tool_approval.py) and model reviews; no flow editor and no named approver for changes to automations, functions or pipelines" }, "note": "Any publish or review gate would live in OpenRegister's flow store, not read here.", "built": { @@ -7853,16 +7853,16 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "partial", - "dify": "unknown", + "dify": "no", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: context_agent logs task input text at INFO, skipping only the conversation token (context_agent:ex_app/lib/main.py:169-178); searched 'redact|mask' in both repos: no policy.", "hermes-agent": "source read at v2026.9.24, not driven: agent/redact.py:1-5 regex secret redaction for logs and tool output; hermes_logging.py:6,234 every log handler uses RedactingFormatter 'so secrets never reach disk'; hermes_cli/config_defaults.py:1739 security.redact_secrets (default true) and :1045 privacy.redact_pii hashes user ids and strips phone numbers from model context; cron/scheduler_diagnostics.py:13-15 run errors redacted too Note: A per-profile setting (one profile is one agent install), masking secrets and PII by pattern.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-sensitive-data https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-transcript-controls per variable \"sensitive data\" keeps values out of transcripts and logs; admins turn transcript saving off per environment or environment group. No instance-wide redaction policy.", - "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'redact|mask_(input|output|sensitive)|hide.?(inputs|outputs)|privacy.?mode|sensitive.?data' in api/configs, api/services, api/core/workflow, api/core/ops, api/enterprise: api/clients/agent_backend/request_builder.py:644-657 only redacts credential keys in the agent backend request copy; api/configs/feature/__init__.py:1622-1624 log retention and cleanup, not hiding Note: Credential masking and retention exist; no policy that hides node inputs and outputs from run logs.", "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/redaction/ (instance-redaction-enforcement.service.ts, redaction-policy.ts) redacts execution data by policy, a default module; redaction-context-hook.ts:53 skips unless isDataRedactionLicensed (feat:dataRedaction, packages/@n8n/constants/src/index.ts:56). Enterprise-licensed.", - "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1236 AUDIT_LOG_LEVEL (NONE, METADATA, REQUEST, REQUEST_RESPONSE, utils/audit.py:53-57) and :1243-1246 AUDIT_EXCLUDED_PATHS default /chats,/chat,/folders set instance-wide by env; utils/audit.py:284-288 masks passwords in logged bodies Note: Instance-wide control over the audit log, by level and path; no field-level hiding of agent inputs and outputs, and chat history itself is not a run log." }, "note": "The instance-wide part is a fixed secret and PII pattern set, always on for run logs; what else to hide is set per organisation, not per instance.", "built": { @@ -7883,16 +7883,16 @@ "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "partial", - "dify": "unknown", + "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the agent keeps its memories and skills under 'Context Agent/' in the user's Assistant folder (context_agent:ex_app/lib/all_tools/memory.py:26, assistant:lib/Service/AgentSkillsService.php:31) and task output files can be saved there (assistant:appinfo/routes.php:35,38); files it creates go wherever it writes in the user's Files. No per-session workspace.", "hermes-agent": "source read at v2026.9.24, not driven: tools/terminal_tool.py:1489-1490 and tools/file_tools.py give the agent a writable working directory in its terminal backend (tools/environments/local.py, docker.py, modal.py, daytona.py); hermes_cli/commands.py:78-80 /worktree creates an isolated git worktree per session; tools/subagent_worktree.py:1-6 one worktree per delegated sub-agent; hermes_cli/web_routers/chat_workspaces.py:1-7 dashboard chats pick their working directory", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/created-files-overview agents create files during a conversation, stored with it so user and agent reference them across turns. Note: Preview, GitHub Copilot harness.", - "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/services/agent/workspace_service.py:1-60 AgentWorkspace and binding lifecycle backed by the dify-agent runtime; api/controllers/console/app/agent_app_sandbox.py:147-239 sandbox info, files list, read and download routes; web/features/agent-v2/agent-detail/configure/components/preview/working-directory-panel.tsx:268-475 working directory file browser Note: Agent v2 is opt-in: web/env.ts:74 NEXT_PUBLIC_ENABLE_AGENT_V2 defaults to false and it needs the agent_backend service (docker/docker-compose.yaml:240,259).", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/workspace/tools/workspace-tools.ts:23-29 workspace_read_file, workspace_write_file, workspace_str_replace_file, workspace_execute_command; attached per agent in packages/cli/src/modules/agents/agent-runtime-reconstruction.service.ts:868-893 (agent-workspace.service.ts:42); only when a sandbox is configured (packages/@n8n/config/src/configs/agents.config.ts:84, default false) and in the opt-in Agents module.", - "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/terminals.py:1-6 proxies admin-configured terminal servers; utils/terminals.py:11-13,63-69 gives each chat or automation its own terminal context id; utils/tools.py:1357 get_terminal_tools exposes the file and shell tools; src/lib/components/chat/Settings/Integrations/Terminals.svelte connects one Note: The workspace lives in the separate Open Terminal server, not in the core release." }, "note": "A per-step scratch checkout inside a flow, not a writable workspace an agent keeps for a session.", "built": { @@ -7913,16 +7913,16 @@ "nextcloud-assistant": "partial", "hermes-agent": "no", "copilot-studio": "partial", - "dify": "unknown", + "dify": "yes", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: multimodal chat passes attached files as file parts by id (context_agent:ex_app/lib/nc_model.py:58-68, agent.py:222-224), so a PDF reaches the provider unconverted; whether the model reads it natively depends on the provider (not read). Text tasks parse files to text first (POST /api/v1/parse-file).", "hermes-agent": "source read at v2026.9.24, not driven: tools/file_tools.py:422,1142 read_file turns PDFs into text ('PDF (text layer)'); agent/image_routing.py:31 'a PDF must never become a vision part'; agent/models_dev.py:74,81 supports_pdf only labels a model's modality in listings, nothing sends a PDF as a document part (searched 'application/pdf|document block|pdf' in agent/transports, agent/anthropic_adapter.py)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-inputs-prompt https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/attachments-overview prompt document input accepts PDF directly; agent attachments extract PDF text (\"Text is extracted for the agent to reason over\").", - "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/core/agent/fc_agent_runner.py:98,523 and api/core/prompt/simple_prompt_transform.py:302-307 pass uploaded files through file_manager.to_prompt_message_content; api/tests/unit_tests/core/agent/test_fc_agent_runner.py:324 a PDF becomes DocumentPromptMessageContent; api/tests/unit_tests/core/workflow/nodes/llm/test_llm_utils.py:884 content is kept or filtered by the model's DOCUMENT feature Note: indirect: package not in the clone. The file-to-content mapping lives in the graphon dependency (api/pyproject.toml:48), read through its tests, not its source.", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:43-48 'Automatically Passthrough Binary PDFs' on the AI Agent node for models with native PDF input, e.g. Gemini; OpenAI Responses API support for it per release 2.28.0.", - "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:1364-1372 passes a 'file' content part through as input_file only on the OpenAI-compatible proxy path, the comment saying Open WebUI attachments go via metadata.files and RAG instead; src/lib/components/workspace/Models/Capabilities.svelte:13-59 has vision, file_upload and file_context but no native-file capability Note: API clients can hand a PDF through; the chat UI extracts attachments to text." }, "built": { "state": "none", @@ -7942,16 +7942,16 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "yes", - "dify": "unknown", + "dify": "partial", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: searched 'browser|playwright|selenium|click' in context_agent:ex_app: only HTTP GET via web_fetch (context_agent:ex_app/lib/all_tools/web.py).", "hermes-agent": "source read at v2026.9.24, not driven: tools/browser_tool.py:469-512 browser_navigate, browser_snapshot, browser_click and browser_type tools, plus tools/browser_cdp_tool.py and browser_dialog_tool.py; local Chromium or cloud providers (tools/browser_tool_cloud.py, browser_camofox.py, browser_lightpanda.py) and the user's real profile (tools/browser_tool_real_profile.py)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/computer-use https://learn.microsoft.com/en-us/microsoft-copilot-studio/whats-new computer use (GA May 2026) lets agents automate web and desktop apps by controlling browsers: open pages, click, fill in forms.", - "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'playwright|browser_use|browser-use|headless|puppeteer' in api/, dify-agent/src, dify-agent-runtime/: nothing in core; api/core/tools/builtin_tool/providers/webscraper only fetches pages; langgenius/dify-official-plugins tools/ (GitHub main) has none; the community repo langgenius/dify-plugins (GitHub main) has browserless, anspire/browser_agent, logicober/browser-use-cloud, hjlarry playwright Note: Community marketplace plugins only, not official or core.", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Airtop/Airtop.node.ts:23 usableAsTool with session, window, interaction, extraction and agent resources (:44-64) driving a cloud browser as an AI Agent tool (needs an Airtop account); n8n's own assistant drives the user's Chrome through packages/@n8n/mcp-browser (README.md:3-6), browser use on by default (packages/@n8n/config/src/configs/instance-ai.config.ts:65-66).", - "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/retrieval/web/utils.py:651 SafePlaywrightURLLoader renders pages for web search and the fetch_url tool (tools/builtin.py:333), wired by config.py:1311 PLAYWRIGHT_WS_URL and docker-compose.playwright.yaml; searched 'browser_use|browser-use|puppeteer|computer.use' in backend/open_webui: no clicking or form filling Note: Opens and reads pages only; interaction needs a community tool or an MCP server." }, "built": { "state": "none", @@ -7971,16 +7971,16 @@ "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "no", - "dify": "unknown", + "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no cap in code; graph.astream runs without a recursion_limit (context_agent:ex_app/lib/agent.py:256), so LangGraph 1.0.1's default recursion limit is the only stop (context_agent:poetry.lock:2043-2050). Note: Needs a live check on the default value.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/config_defaults.py:53-56 agent.max_turns caps iterations per run (default unlimited), agent/iteration_budget.py:1-5 per-agent budget (sub-agents 50); :534-545 tool_loop_guardrails hard-stops after repeated failures or no progress (on by default for gateway and cron) with per-turn ceilings; agent/tool_guardrails.py:80-81 at most 50 web searches and 50 sub-agents per turn Note: The main cap counts model iterations, not individual tool calls; the per-tool ceilings count calls.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-generative-actions https://learn.microsoft.com/en-us/microsoft-copilot-studio/requirements-quotas searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"maximum number of (tool|steps)|step limit|loop\": no maker setting that caps tool calls per run.", - "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/core/app/app_config/easy_ui_based_app/agent/manager.py:82 max_iteration per agent (default 10); api/core/agent/cot_agent_runner.py:82,108-112,197-199 caps at 99 and raises AgentMaxIterationError; web/app/components/app/configuration/config/agent/agent-setting/index.tsx:19 the setting in the agent UI, bounded by web/config/index.ts:289 MAX_ITERATIONS_NUM", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:22-25 maxIterations (default 10) and V3/helpers/checkMaxIterations.ts:6-14 stop the loop after that many iterations; Agents module maxIterations 1-200 (packages/@n8n/api-types/src/agents/agent-json-config.schema.ts:518); a turn with several parallel tool calls counts once, so there is no cap on tool calls as such, which the open request asks for.", - "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/env.py:1084-1096 CHAT_RESPONSE_MAX_TOOL_CALL_ITERATIONS (default 256, old name CHAT_RESPONSE_MAX_TOOL_CALL_RETRIES); utils/middleware.py:5830-5835 the native tool-call loop counts iterations against it; config.py:2040 SUBAGENTS_MAX_ITERATIONS=30 for delegated subagents Note: Instance-wide env setting, not per agent in the UI." }, "note": "A fixed round cap on one provider path, not a number the builder sets and not a count of tool calls.", "built": { @@ -8001,16 +8001,16 @@ "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "partial", - "dify": "unknown", + "dify": "yes", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: tool nodes have a fallback that returns 'Error: ... please fix your mistakes' to the agent as a tool message (context_agent:ex_app/lib/graph.py:22-41), and tools return error objects the agent reads (context_agent:ex_app/lib/all_tools/skills.py:96-113).", "hermes-agent": "source read at v2026.9.24, not driven: tools/registry.py:887-913 dispatch returns every tool exception as {\"error\": 'Tool execution failed: ...'} to the model instead of raising; agent/tool_executor.py:175 invalid arguments come back as an error result; agent/tool_guardrails.py:1-5 repeated failures turn into guidance before any halt", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/harnesses-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-overview the GitHub Copilot harness \"retries and finds alternative paths automatically\"; standard harness follows the authored paths and error topics. Note: GitHub Copilot harness is a production-ready preview.", - "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/core/tools/tool_engine.py:49 agent_invoke, :130-157 catches credential, not-found, parameter and invoke errors and returns 'tool invoke error: ...' as the tool response instead of raising; api/core/agent/fc_agent_runner.py:327 feeds that response back to the model as the tool result so the loop continues; workflow nodes also have fail branches (web/i18n/en-US/workflow.json:465)", "n8n": "source read at n8n@2.40.7, not driven: the Agents-module runtime adds a failed tool call as an error result so the model can self-correct (packages/@n8n/agents/src/runtime/tools/tool-call-executor.ts:686-687); the workflow AI Agent node stops on a tool error unless the node is set to continue on fail (packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/V3/helpers/executeBatch.ts:114-121), which the open request says ends reasoning.", - "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/middleware.py:3378-3386 a raising tool returns {'error': str(e)} as its result, :1466 the same on the native path, then process_tool_result (:1468) hands it back to the model as the tool message so the turn continues; :3011 a failed MCP connection is reported rather than aborting" }, "built": { "state": "built", @@ -8030,16 +8030,16 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "no", - "dify": "unknown", + "dify": "no", "n8n": "partial", - "open-webui": "unknown", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: no provider sign-in in these repos (models via TaskProcessing, context_agent:ex_app/lib/nc_model.py:165-179).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/auth_codex_browser.py:1-6 ChatGPT/Codex sign-in by browser with PKCE (`hermes auth add openai-codex --browser`); hermes_cli/web_routers/oauth.py:1 in-browser device-code login flows in the dashboard; hermes_cli/commands.py:284 /login with a Nous account; provider logins in hermes_cli/auth_nous.py, auth_qwen.py, auth_xai.py, auth_zai_kimi.py", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/authoring-select-external-response-model models come with the Copilot Studio licence; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"subscription.{0,20}(login|sign in)\": no provider account sign-in.", - "dify": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'oauth' in api/controllers/console/workspace/: OAuth exists for tool_providers.py and trigger_providers.py only, none for model providers; langgenius/dify-official-plugins models/ (GitHub main) lists API-key providers, no ChatGPT, Claude or Copilot subscription sign-in", "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/credentials/ holds API-key credentials for every model provider (OpenAiApi, AnthropicApi, MistralCloudApi ...); the only OAuth sign-in is Azure Entra for Azure OpenAI (AzureEntraCognitiveServicesOAuth2Api.credentials.ts); searched 'copilot|chatgpt oauth' in packages/@n8n/nodes-langchain: none.", - "open-webui": "not checked: demand row mined from the n8n feature requests on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/openai.py:183-211 a model connection can authenticate with a bearer key, the user's forwarded session or SSO OAuth token (system_oauth), or a Microsoft Entra ID token for Azure; searched 'codex|chatgpt.com|subscription|copilot|device.?code' in routers/openai.py, routers/configs.py, utils/anthropic.py, config.py: no ChatGPT, Claude or Copilot subscription sign-in Note: Keyless sign-in exists for Azure and SSO-fronted gateways, not for consumer AI subscriptions." }, "note": "Uses a subscription instead of an API key, but the user pastes a subscription token; there is no provider sign-in flow, and only for Claude.", "built": { @@ -8060,16 +8060,16 @@ "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "no", - "dify": "unknown", + "dify": "partial", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: a failed scheduled run posts a fixed error message (assistant:lib/Service/AssignmentsService.php:153-159); searched 'diagnos|fix' in both repos: none.", "hermes-agent": "source read at v2026.9.24, not driven: cron/scheduler.py:287-312 a failed cron run gets a rule-based failure notice with remediation copy (cron/scheduler_failure_copy.py), :2849-2855 or the agent's own diagnosis when it declared the failure; agent/turn_explainers.py explains why a turn ended; the agent can read run output with its own tools when asked. Searched 'investigat|diagnos|suggest.*fix' in cron/ and hermes_cli/commands.py: no action that hands a failed run to an assistant to investigate Note: Classified hints and a capable agent, not a one-step investigate-and-propose-fix.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/flow-manage-monitor https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"Copilot.{0,40}(fix|troubleshoot|diagnos)\": failed runs are inspected by hand; no assistant that proposes a fix.", - "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: api/controllers/console/app/generator.py:327 POST /instruction-generate; api/core/llm_generator/llm_generator.py:826-868,872-890 instruction_modify reads the app's or node's last run (query, answer, error) and passes the error to the model to propose a revised prompt or code; searched 'diagnos|auto.?fix|troubleshoot' in web/i18n/en-US: no whole-run investigation Note: Per node, author-initiated from the prompt or code editor; it does not investigate a failed run across nodes.", "n8n": "source read at n8n@2.40.7, not driven: n8n Assistant (Instance AI, default module at packages/@n8n/backend-common/src/modules/module-registry.ts:79) 'Debug failed executions and suggest fixes' (packages/frontend/@n8n/i18n/src/locales/en.json:5360); failed runs hand off to it from the editor (release 2.28.0 'Investigate failed executions on Instance AI editor hand-offs'); needs a model set up.", - "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/automations.py:14-15,149 automation runs are recorded with their last result; searched 'fix|diagnos|failed run|troubleshoot' in src/lib/i18n/locales/en-US/translation.json and backend/open_webui/routers: no assistant that investigates a failed run or proposes a fix" }, "built": { "state": "none", @@ -8089,16 +8089,16 @@ "nextcloud-assistant": "yes", "hermes-agent": "no", "copilot-studio": "yes", - "dify": "unknown", + "dify": "no", "n8n": "yes", - "open-webui": "unknown", + "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Tables tools create tables, columns and rows and read them back (context_agent:ex_app/lib/all_tools/tables.py:16-378), available when the Nextcloud Tables app is installed (tables.py:410-411).", "hermes-agent": "source read at v2026.9.24, not driven: registered tools (tools/*.py registry.register names) include memory, todo_list, session_search, kanban tools and cronjob_manage, each fixed-purpose; searched 'table|records|sqlite tool|datastore' in tools/: no general table the agent can define and fill; it can reach SQLite only through terminal or execute_code (tools/code_execution_tool.py:924) Note: An agent can build a SQLite file with its shell, which is not a built-in table.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-add-dataverse https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-dataverse every environment has Dataverse; agents read tables as knowledge and create, read and update records (Dataverse connector, Dataverse MCP create_record/read_query). Note: MCP server preview.", - "dify": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending", + "dify": "source read at 1.17.1, not driven: searched 'data.?table|datatable|builtin.?table|structured.?records' in api/core, api/services, api/controllers, dify-agent/src, web/i18n/en-US: no built-in table store; knowledge bases hold documents for retrieval, and database access comes through plugins that connect to an outside DB Note: Chatflow conversation variables keep structured values, but only for one conversation.", "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/DataTable/DataTable.node.ts:27 usableAsTool, so an AI Agent reads and writes rows in n8n's built-in data tables (data-table is a default module, packages/@n8n/backend-common/src/modules/module-registry.ts:51); outside agents read rows through the MCP data table tools (packages/cli/src/modules/mcp/mcp-scopes.ts dataTable:read, dataTable:write).", - "open-webui": "not checked: demand row mined from the n8n changelog on 2026-09-26, back-fill pending" + "open-webui": "source read at v0.11.4, not driven: searched 'datatable|data_table|builtin.?table|spreadsheet|structured.?records' in backend/open_webui: only spreadsheet loaders for RAG; backend/open_webui/models/ has no table store; the agent's writable stores are memories (tools/builtin.py:923), notes (:1286), tasks (:3593) and key-value chat variables (utils/chat_variables.py:8-10), none a table of records" }, "note": "The table is an OpenRegister register and schema, created in OpenRegister, which hermiq requires; no outside database.", "built": { @@ -8119,16 +8119,16 @@ "nextcloud-assistant": "no", "hermes-agent": "yes", "copilot-studio": "no", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "no", + "n8n": "no", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the session list offers one Delete action per conversation (assistant:src/components/ChattyLLM/ChattyLLMInputForm.vue:36-42) and DELETE /chat/delete_session takes one sessionId (assistant:lib/Service/ChatService.php:142); no bulk delete.", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/web_routers/sessions.py:414-428 POST /api/sessions/bulk-delete deletes a list of ids, driven by the selectable rows in web/src/pages/SessionsPage.tsx:1395 via web/src/lib/api.ts:504-505; hermes_cli/subcommands/sessions.py:105-109 `hermes sessions prune` deletes many by age, source or title", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/admin-transcript-controls https://learn.microsoft.com/en-us/microsoft-copilot-studio/analytics-transcripts-powerapps only admins bulk-delete transcript records in Dataverse; searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"delete.{0,40}conversations\": no end-user bulk delete of chats.", - "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: api/controllers/web/conversation.py:101,116, console/app/conversation.py:216,385 and service_api/app/conversation.py:249 delete one conversation by id; searched '(batch|bulk).*conversation|deleteAllConversations|clear_conversations' in api/controllers, api/services, web/app, web/service, web/features: no multi-delete; web/i18n/en-US/share.json:5-6 only a single delete confirm", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/chat-hub/chat-hub.controller.ts:388 DELETE /conversations/:sessionId removes one conversation, called from features/ai/chatHub/components/ChatSidebarContent.vue:108; chat-hub.service.ts:339 deleteAllSessions exists but nothing calls it (searched packages/cli/src); searched 'bulk|deleteMany|delete.*all' in the chat-hub and agents controllers: no multi-delete route Note: A deleteAllSessions service method is written but unreached.", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/chats.py:707 DELETE / removes all of a user's chats, called from src/lib/components/chat/Settings/DataControls.svelte:110-135 'Delete All Chats'; src/lib/i18n/locales/en-US/translation.json:577 'Delete all contents inside this folder' and :209 archive all chats Note: All chats or a whole folder at once; no pick-several selection in the sidebar." }, "built": { "state": "none", @@ -8148,16 +8148,16 @@ "nextcloud-assistant": "partial", "hermes-agent": "partial", "copilot-studio": "yes", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "yes", + "n8n": "yes", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: '{user}' is replaced with the display name in chat user instructions (assistant:lib/Service/ChatService.php:71) and the agent prompt gets today's date (context_agent:ex_app/lib/agent.py:137,186); no other placeholders.", "hermes-agent": "source read at v2026.9.24, not driven: agent/system_prompt.py:488-506 the system prompt always gets a 'Conversation started' and 'Today's date' line; gateway/session_context.py:37-43 the speaker's user name and id are passed as HERMES_SESSION_USER_NAME and _USER_ID to tools; searched 'placeholder|\\{\\{|substitut|template var' in agent/prompt_builder.py and agent/system_prompt.py: no placeholders an author writes into SOUL.md or instructions Note: Date and user are injected automatically; the author cannot place them in the instructions.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-agent-child-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/knowledge-file-groups \"To reference tools, variables, or add Power Fx formulas in your instructions, enter a slash (/)\"; system variables such as User.DisplayName and Power Fx Today()/Now() fill in per user and date.", - "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: api/core/workflow/system_variables.py:23-38 sys.user_id, sys.timestamp, sys.query and more; web/app/components/workflow/constants.ts:51,69 offered in the variable picker; web/app/components/base/prompt-editor/plugins/workflow-variable-block/component.tsx:58 inserts them into prompts; input-form variables become {{name}} placeholders too Note: The user id and a timestamp are automatic; a display name needs an input variable.", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/agents/Agent/agents/ToolsAgent/options.ts:5-18 the agent's System Message is an expression field; packages/workflow/src/workflow-data-proxy.ts:1690-1691 $now and $today, with $json fields for the user's name from the chat trigger; packages/cli/src/modules/chat-hub/chat-hub-workflow.service.ts:668 Chat Hub injects the current date and time", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/task.py:36-96 prompt_template replaces {{CURRENT_DATE}}, {{CURRENT_DATETIME}}, {{USER_NAME}} and more; utils/payload.py:38-41 applies them and custom variables to model and user system prompts; utils/chat_variables.py:9-10 {{chat.variables.x}} and {{user.variables.x}}" }, "built": { "state": "none", @@ -8177,16 +8177,16 @@ "nextcloud-assistant": "partial", "hermes-agent": "no", "copilot-studio": "partial", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "no", + "n8n": "partial", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: outputs of file actions and the new-file image menu get the system tag 'Generated using AI' (assistant:lib/Service/SystemTagService.php:18, lib/Listener/FileActionTaskSuccessfulListener.php:33); files the agent writes with upload_file are not tagged (context_agent:ex_app/lib/all_tools/files.py:148-165).", "hermes-agent": "source read at v2026.9.24, not driven: searched 'ai.generated|generated by|c2pa|watermark|co-authored-by' in agent/, tools/, gateway/, hermes_cli/: files the agent writes (tools/file_tools.py) and images it generates (tools/image_generation_tool.py:894) carry no AI-generated mark", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/add-tools-custom-agent https://learn.microsoft.com/en-us/microsoft-copilot-studio/system-service-card-copilot-studio docs advise makers to \"inform your users that AI generated some of the conversation\" in the start topic; created Word/PowerPoint content inherits sensitivity labels. No automatic AI-generated label on outputs.", - "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: searched 'ai.generated|generated by ai|c2pa|watermark|generatedByAI|disclaimer' in api/, web/app/, web/i18n/en-US/: only a per-app custom disclaimer shown in the text-generation info modal (web/app/components/share/text-generation/info-modal.tsx:59, api/models/model.py:959); no label on produced text or files", + "n8n": "source read at n8n@2.40.7, not driven: packages/nodes-base/nodes/Telegram/GenericFunctions.ts:95-115 and Slack/V2/GenericFunctions.ts:596-600 append 'This message was sent automatically with n8n' (appendAttribution, on by default from Telegram v1.1), also in utils/sendAndWait/utils.ts:55; searched 'ai.generated|generated by ai|c2pa|watermark' in packages/@n8n/nodes-langchain, chat-hub, agents: no AI-specific label Note: Automation attribution on outgoing chat messages, not an AI-generated label and nothing on files.", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/config.py:1729 RESPONSE_WATERMARK, set in src/lib/components/admin/Settings/General.svelte:395-401; src/lib/components/chat/Messages/ResponseMessage.svelte:215-220 appends it only when a response is copied to the clipboard; searched 'c2pa|ai.generated' in backend/open_webui and src/lib: no label on generated files or images Note: Admin text watermark on copied answers only." }, "note": "Notes, contacts and events are marked; chat text and other outputs are not labelled.", "built": { @@ -8207,16 +8207,16 @@ "nextcloud-assistant": "no", "hermes-agent": "partial", "copilot-studio": "partial", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "partial", + "n8n": "no", + "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: every skill's name and description is put in the system prompt (context_agent:ex_app/lib/agent.py:165-177); searched 'search|rag' in skills.py: no skill search.", "hermes-agent": "source read at v2026.9.24, not driven: tools/skills_tool.py:656-690 skills_list takes an optional category filter, then skill_view loads one; agent/prompt_builder.py:1346-1370 the skills index collapses off-context categories to names only instead of dropping them; tools/tool_search.py:1-7 progressive disclosure with tool_search exists for tools, not skills; skills_hub search (tools/skills_hub_search.py) finds skills to install Note: Narrowing by category and a compact index, no query search over installed skills.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/skills-overview skills \"implement a progressive disclosure pattern so agents load only the context they need\"; the runtime picks a skill by its description, but no search over a large skill set is documented. Note: Preview.", - "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: dify-agent/src/dify_agent/layers/config/layer.py:113-127 only skills the author mentions are loaded into the prompt; dify-agent/src/dify_agent/layers/_agent_cli_help.json 'config skills pull' lets the agent pull one or all visible skills into ./.dify_conf/skills and read them with its shell; searched 'search_skill|skill_search|find_skill' in dify-agent/src, api/core, api/services: no query search Note: Agent v2 is opt-in (web/env.ts:74). Discovery by pulling and browsing files, not by a search tool.", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/agents/src/skills/prompt.ts:7-40 renderSkillCatalogPrompt lists every skill's name, description and id in the prompt, then load_skill (skills/types.ts:5) loads one by id; searched 'search' in packages/@n8n/agents/src/skills/: no skill search", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/middleware.py:2777-2902 lists every enabled skill in an manifest; tools/builtin.py:3482 view_skill loads one by id; searched 'search' in utils/skills.py and the skill tools in tools/builtin.py: no skill search, the model reads the full list Note: Scaling relies on attaching fewer skills per model, not on search." }, "note": "Progressive disclosure exists for tools; skills are all loaded.", "built": { @@ -8237,16 +8237,16 @@ "nextcloud-assistant": "partial", "hermes-agent": "yes", "copilot-studio": "partial", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "yes", + "n8n": "yes", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: each unified search provider becomes a tool automatically (context_agent:ex_app/lib/all_tools/search.py:11-30); other tools are fixed modules shipped in all_tools or admin-added MCP servers (context_agent:ex_app/lib/tools.py:19-50).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/plugins.py:6 plugins install as pip packages on the hermes_agent.plugins entry-point group or as directories with plugin.yaml, :456 register_tool adds their tools to the agent; tools/mcp_tool.py connects MCP servers as tool sources; plugins/ ships first-party examples", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-certification https://learn.microsoft.com/en-us/microsoft-copilot-studio/advanced-connectors third parties add tools as certified connectors and certified MCP servers (certification preview) that appear in the tool picker; installed apps do not register tools with an agent on their own.", - "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: api/core/tools/plugin_tool/provider.py:11 PluginToolProviderController registers tools from installed plugins; api/controllers/console/workspace/plugin.py:810,831,858 install from package, GitHub or marketplace; api/core/tools/workflow_as_tool/provider.py:45 and mcp_tool/provider.py:21 also turn published workflows and MCP servers into agent tools", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/community-packages/community-packages.controller.ts:11 POST installs a community node package; packages/workflow/src/interfaces.ts:2828 usableAsTool; packages/cli/src/node-types.ts:132-150 turns any node that declares it into an agent tool via tool-generation/ai-tools.ts:29 convertNodeToAiTool Note: Installed community packages and built-in nodes both become tools; MCP client and workflow tools add more.", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/tools.py:264 load a tool from a URL and :346 create one, loaded by utils/plugin.py:206; config.py:388 TOOL_SERVER_CONNECTIONS registers external OpenAPI and MCP tool servers, fetched by utils/tools.py:1170-1188,1519 and merged into the model's tools at utils/tools.py:267" }, "built": { "state": "built", @@ -8266,16 +8266,16 @@ "nextcloud-assistant": "partial", "hermes-agent": "no", "copilot-studio": "partial", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "partial", + "n8n": "yes", + "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the MCP server forwards the client's Authorization header to /ocs/v2.php/cloud/user to find the user (context_agent:ex_app/lib/mcp_server.py:17-41); searched 'oauth|well-known' in context_agent:ex_app: no OAuth discovery or flow.", "hermes-agent": "source read at v2026.9.24, not driven: mcp_serve.py:1-6 `hermes mcp serve` is a stdio MCP server for a local client launched as a subprocess; searched 'oauth|bearer|token' in mcp_serve.py: no network transport and no OAuth sign-in for outside clients (the OAuth code in tools/mcp_oauth.py is Hermes as a client)", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/mcp-dataverse outside clients such as Claude Desktop sign in with Entra ID to the Dataverse MCP server (preview); there is no MCP server for Copilot Studio agents themselves.", - "dify": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant feature requests on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: api/controllers/mcp/mcp.py:44,87,117-119 each app can be published as an MCP server at /server//mcp, authorised only by the secret server_code in the URL; api/controllers/console/auth/oauth_server.py:120-175 an OAuth provider exists for account sign-in but the MCP endpoint does not check OAuth tokens Note: MCP server yes, OAuth sign-in for it no.", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/mcp/mcp.controller.ts:97,117 the instance MCP server; mcp-server-middleware.service.ts:28,45-61 accepts an API key or an OAuth access token verified for the audience; modules/oauth-server/oauth.controller.ts:177-306 authorization-server and protected-resource metadata, oauth-consent.controller.ts:20,80 consent screen; both are default modules (packages/@n8n/backend-common/src/modules/module-registry.ts:53-54)", + "open-webui": "source read at v0.11.4, not driven: searched 'FastMCP|mcp.server|streamable_http_app|/mcp' in backend/open_webui: Open WebUI is only an MCP client (utils/mcp/client.py, utils/middleware.py:2340 connect_mcp_server); main.py:632-644 registers OAuth 2.1 clients for outgoing MCP tool servers; no MCP server that outside AI clients could sign in to Note: OAuth exists in the opposite direction, Open WebUI signing in to MCP servers." }, "built": { "state": "none", @@ -8295,16 +8295,16 @@ "nextcloud-assistant": "yes", "hermes-agent": "yes", "copilot-studio": "partial", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "yes", + "n8n": "yes", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: reasoning output is stored per message (assistant:lib/Listener/ChattyLLMTaskListener.php:130-131, lib/Migration/Version030500Date20260630083738.php:34) and shown in a 'Reasoning content' popover and while streaming (assistant:src/components/ChattyLLM/Message.vue:36-47,79-80).", "hermes-agent": "source read at v2026.9.24, not driven: hermes_cli/commands.py:190-192 /reasoning show|hide|full; hermes_cli/config_defaults.py:830 display.show_reasoning (default true); agent/reasoning_summaries.py summaries shown beside the answer in CLI, TUI and gateways", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/preview-overview https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/authoring-activity-trace the maker view shows \"the reasoning card within the chat\" and the activity trace shows chain-of-thought steps; end users do not see the reasoning next to answers.", - "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: web/app/components/base/chat/chat/answer/reasoning-panel.tsx:6-28 collapsible panel of streamed reasoning deltas per LLM node, mounted at chat/answer/index.tsx:264 above the answer; web/app/components/base/markdown-blocks/think-block.tsx:3,40 also folds blocks from reasoning models", + "n8n": "source read at n8n@2.40.7, not driven: packages/frontend/editor-ui/src/features/agents/components/AgentChatMessageList.vue:15-24,469,617 renders AiReasoningBlock and AiThinkingBlock with thinking segments and duration beside the answer; @n8n/i18n en.json:7899-7901 per-agent Reasoning toggle; searched 'reasoning|thinking' in features/ai/chatHub/components: none in Chat Hub Note: Opt-in Agents module (N8N_ENABLED_MODULES=agents), counted as shipped per the lane rule; Chat Hub does not show it.", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/utils/middleware.py:2253-2260,3748-3760 captures reasoning_content, reasoning or thinking deltas into a reasoning block; src/lib/components/common/Collapsible.svelte and chat/Messages/Markdown/ConsecutiveDetailsGroup.svelte render it collapsible; translation.json:3218,3241 'Thinking...', 'Thought for {{DURATION}}'" }, "built": { "state": "none", @@ -8322,18 +8322,18 @@ "originUrl": "https://github.com/nextcloud/assistant/pull/601", "hermiq": "partial", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "partial", "copilot-studio": "partial", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "partial", + "n8n": "yes", + "open-webui": "partial", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: the Assistant registers an audio-to-audio translate provider (assistant:lib/TaskProcessing/AudioToAudioTranslateProvider.php:32-43) chaining transcription, translation and speech.", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/run_inbound.py:1505,2043-2074 voice messages are transcribed (tools/transcription_tools.py:512) before the turn; gateway/run_voice.py:291-303 and gateway/run_turn.py:1937-1944 voice mode sends the answer back as TTS audio (tools/tts_tool.py:550); searched 'translat' in tools/ and gateway/: no translation step, the model does it when asked Note: Works as voice in, model translates on request, voice out; no dedicated speech translation feature and only on messaging platforms.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-consent-based-record https://learn.microsoft.com/en-us/microsoft-copilot-studio/multilingual voice channels offer call recording, transcription and real-time translation (Dynamics 365 voice) and multilingual agents; no translation of an uploaded recording played back.", - "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: api/controllers/web/audio.py:62 /audio-to-text and :119 /text-to-audio back the chat's speech-to-text input and read-aloud answers (api/core/app/app_config/features/text_to_speech/manager.py); searched 'translat' in api/controllers and api/core/app: no speech translation step, an app's prompt can translate the transcribed text Note: Composable in an app: speak, the model translates, the answer is read aloud. Not a dedicated feature.", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/index.ts:22-33 'Transcribe a Recording' and 'Translate a Recording' (translate.operation.ts:74 POST /audio/translations), plus 'Generate Audio' (generate.operation.ts) to hear the result; packages/nodes-base/nodes/DeepL/DeepL.node.ts for other target languages Note: Built as a workflow; the one-step Whisper translation targets English only, other languages chain transcribe, translate and generate.", + "open-webui": "source read at v0.11.4, not driven: backend/open_webui/routers/audio.py:1251 /transcriptions and :601 /speech back voice input and read-aloud answers, plus the voice call overlay (src/lib/components/chat/MessageInput.svelte); audio.py:1040-1042 the transcription prompt says 'Do not translate'; translation happens only when the model is asked Note: Speak, the model translates on request, the answer is spoken. No dedicated speech translation." }, "note": "A person can speak, ask the agent to translate and hear the reply; there is no action that translates a recording.", "built": { @@ -8352,18 +8352,18 @@ "originUrl": "https://github.com/nextcloud/assistant/pull/577", "hermiq": "no", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "no", "copilot-studio": "no", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "no", + "n8n": "no", + "open-webui": "no", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: Files action 'Generate subtitles using AI' posts to /api/v1/file-action/{fileId}/core:audio2text:subtitles (assistant:src/files/fileActions.js:164-190) with a notification when ready.", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: searched 'subtitle|\\.srt|webvtt|\\.vtt' in tools/, gateway/, skills/, optional-skills/: only a Teams meeting transcript suffix (plugins/teams_pipeline/meetings.py:198) and file-type lists; tools/transcription_local.py:247 joins segments into plain text and drops timestamps; no transcription tool the agent can call on a file, no Nextcloud Files Note: The terminal tool could script ffmpeg/whisper by hand; nothing ships for it.", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/voice-overview searched the Copilot Studio docs tree (413 pages, 2026-09-26) for \"subtitle|caption|SRT|VTT\": nothing; no subtitle generation for recordings.", - "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: searched 'subtitle|\\.srt|webvtt|\\.vtt' in api/, web/app, web/i18n/en-US: only a transitive webvtt-py lock entry (api/uv.lock:7672) and a template's article 'subtitles'; speech-to-text returns plain text (api/controllers/web/audio.py:62); no subtitle file output, no Nextcloud Files", + "n8n": "source read at n8n@2.40.7, not driven: packages/@n8n/nodes-langchain/nodes/vendors/OpenAi/v2/actions/audio/transcribe.operation.ts:60-95 sends no response_format, so it returns plain JSON text; searched '\\.srt|webvtt|srt|vtt|subtitles' in packages/@n8n/nodes-langchain/nodes and packages/nodes-base/nodes: only the Webex node downloading an existing meeting transcript as VTT (Cisco/Webex/descriptions/MeetingTranscript.ts:87-91) Note: A builder could call a speech API with srt output through the HTTP Request node and store it with the NextCloud node; nothing ships for it.", + "open-webui": "source read at v0.11.4, not driven: searched 'subtitle|\\.srt|webvtt|\\.vtt' in backend/open_webui and src/lib (locales excluded): only a Teams webhook field and docx and pptx preview styling; routers/audio.py:1251 /transcriptions returns text for voice input; no subtitle file output, no Nextcloud Files" }, "note": "Nextcloud-phrased row: hermiq provides transcription to TaskProcessing, not subtitle files from Files.", "built": { @@ -8382,18 +8382,18 @@ "originUrl": "https://github.com/nextcloud/assistant/pull/602", "hermiq": "no", "nextcloud-assistant": "yes", - "hermes-agent": "unknown", + "hermes-agent": "yes", "copilot-studio": "partial", - "dify": "unknown", - "n8n": "unknown", - "open-webui": "unknown", + "dify": "yes", + "n8n": "yes", + "open-webui": "yes", "evidence": { "nextcloud-assistant": "source read at assistant v4.0.0 and context_agent v2.8.0, not driven: attachments go to the multimodal agent as file parts (context_agent:ex_app/lib/nc_model.py:58-68, agent.py:222-224) and output_attachments are saved on the answer (assistant:lib/Listener/ChattyLLMTaskListener.php:135-140, context_agent:ex_app/lib/agent.py:296-297).", - "hermes-agent": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", + "hermes-agent": "source read at v2026.9.24, not driven: gateway/run_turn.py:2115 inbound user images are auto-analysed and passed with their local path; tools/vision_tools.py:787,858 vision_analyze tool; tools/image_generation_tool.py:417,554 image_generate tool; gateway/run_turn.py:2503-2513 images extracted from the answer are sent back with adapter.send_image on the chat platform", "copilot-studio": "docs-only: https://learn.microsoft.com/en-us/microsoft-copilot-studio/image-input-analysis https://learn.microsoft.com/en-us/microsoft-copilot-studio/agents-experience/created-files-overview users send images that vision models analyse; the GitHub Copilot harness can return created files including an image or chart (preview); native image generation is not supported in agents.", - "dify": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "n8n": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending", - "open-webui": "not checked: demand row mined from the nextcloud-assistant changelog on 2026-09-26, back-fill pending" + "dify": "source read at 1.17.1, not driven: api/core/app/app_config/features/file_upload/manager.py:8,21-27 image upload with vision detail setting; web/app/components/base/chat/chat/answer/index.tsx:273-283 answers render generated files and message_files, fed by api/core/app/task_pipeline/message_cycle_manager.py:19,26 message file stream events from image tools or image-output models", + "n8n": "source read at n8n@2.40.7, not driven: packages/cli/src/modules/agents/agent-chat-attachment.service.ts:1-32 stores inbound image attachments, rendered by frontend features/agents/components/AgentChatMessageAttachments.vue:42-57,103; packages/@n8n/agents/src/sdk/provider-tools.ts:131-133 openai.image_generation tool; cli/src/modules/agents/types/components.ts:20 image elements in replies, shown by components/interactive/N8nChatActionCard.vue:207 Note: In the opt-in Agents module (N8N_ENABLED_MODULES=agents); Chat Hub also takes image uploads (chat-hub.types.ts:52).", + "open-webui": "source read at v0.11.4, not driven: src/lib/components/workspace/Models/Capabilities.svelte:13 vision capability for image input; backend/open_webui/routers/images.py:562 /generations and :858 /edit; tools/builtin.py:370 generate_image and :440 edit_image tools return images into the answer" }, "built": { "state": "none",