agent-webui 2.7.0__tar.gz → 2.8.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {agent_webui-2.7.0 → agent_webui-2.8.0}/PKG-INFO +24 -19
- {agent_webui-2.7.0 → agent_webui-2.8.0}/README.md +19 -17
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_browser_control.py +8 -8
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_oidc_session.py +11 -11
- agent_webui-2.8.0/agent/agent_webui/__tests__/test_run_identity.py +218 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_security_boundaries.py +1 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_served_operations.py +27 -27
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/api_extensions.py +16 -20
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/__init__.py +2 -2
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/router.py +2 -3
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/browser_control.py +11 -11
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/contact_delivery.py +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/AdminView-CLxZUrrN.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/AgentLibraryView-Ag9Aojn6.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/AgentLibraryView-CZyRIfU4.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/ArboraReadinessView-BTsg6Fpb.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/AtlasView-BtiImHa3.js +5 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/Availability-yN_kuNzm.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/Availability-BrYyobNN.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/BrokerView-BNol9w6Q.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/CatalogueView-shPPzvnU.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/CatalogueView-CB5KV7m6.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/ChartPage-C6n1i1q1.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/CodeGraphView-CS0svpOR.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/CodeGraphView-0XqAlYvs.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ConfigurationView-CDjgXtn3.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/ConfigurationView-Ct3GcuZX.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ConsoleConfirmView-Ckzd9Jw9.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/ConsoleConfirmView-I58gtaRX.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ContactPage-Dm-6oGO-.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/ContactPage-Df5Nf_M6.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/CypherReplView-B90s64iv.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/DashboardView-Bq821GJ3.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/DashboardsView-Cawhi2Ib.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/DataAnalystView-Dr2XzApI.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/DataAnalystView-B5w5WNFe.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/EcosystemView-Bkg8UWAG.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/ExploreQueryWorkspace-LtdPd2d7.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ExtractionView-BxmIMrKZ.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/ExtractionView-4djMtTbg.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/FilesView-ZDVKqWlc.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/FleetView-DxlUh1er.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/FleetView-CEVui43g.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/GoalsView-BVpEoIAk.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/GoalsView-DR5C4EET.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/Graph3DLodView-BiX8STys.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/Graph3DView-CHkQLlqf.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/Graph3DView-DUg2qkja.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/GraphCanvas-D5Tfn0o0.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/GraphView-CGxazgvr.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ImportExportModal-8VUb-C_9.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/ImportExportModal-B47Vn5vL.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/IntegrationsView-D5NB1qHT.js +2 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/KnowledgeBaseView-BlW_kxs9.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/KnowledgeBaseView-NCg2M6dz.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/KnowledgeView-DPWInTRP.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/LLMTemplatesView-CiZKNyGY.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/LearnView-D3j-JxlJ.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/LearnView-C41QyeM6.js +2 -2
- agent_webui-2.8.0/agent/agent_webui/dist/assets/LiveDashboardsView-DV3ftpBl.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/MagmaView-DRoXXXku.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/MagmaView-LyoA2b3c.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/MarketsCalendar-6QKahzMR.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/MarketsCalendar-m2jwkM8j.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/MarketsHome-D_yfCf8S.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/MarketsHome-Dp_RXeiT.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/MarketsMenu-W9BPQY9z.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/MarketsMenu-hS7CIyA5.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/MarketsNews-BUSn6A_z.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/MarketsNews-D_aOZixQ.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/MarketsPortfolio-B1n7zsFf.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/MarketsPortfolio-C2wiw20j.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/MarketsShell-9oj-VJzp.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/MarketsShell-Zc2AkZJr.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/McpAppsView-Dix46AWV.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/McpAppsView-DKdvG0_N.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/MemoryView-Chrf2JTU.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/NodeTypeBreakdown-Y3fOgxdQ.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/NodeTypeBreakdown-Bhew4z65.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/NotFoundPage-CHybKkb0.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/Notices-sQ0Ua11R.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/Notices-3oonQvay.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/ObjectExplorerView-CNfy-XSe.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ObjectView-BRD__NZN.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/ObjectView-BG5s55p1.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/ObservabilityView-CUoyLm-2.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/OperateWorkspace-dpSRUomJ.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/OpsPanelView-BxpmxYT-.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/PrivacyPage-ChMvnVOD.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/PromptsView-FmBCUric.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/PublicPageLayout-CHk4A2yh.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/PublicPageLayout-BciWikRQ.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/SDDView-BMi6ZQhI.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/SDDView-DQZMtOwV.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/SchedulingView-D6IhdqFv.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/SchedulingView-BSDgR7Lw.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/SchemaView-D-LgmDSd.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/SchemaView-jq-D6LQZ.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/SessionsView-C_OXIDrS.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/SharePage-DBAuPQMH.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/SharePage-BYM0uX1S.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/SkillsView-DqpuikQo.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/SparqlView-XZqeQ_DV.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/SystemStatusView-CdXpGKS-.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/TableExplorerView-D3RFqPwg.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/TemporalGraphView-bgJHyEhh.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/TermsPage-DMeD_5ME.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/TermsPage-DZPwiIny.js +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ThankYouPage-CupbLv10.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/ThankYouPage-Cjq0FQ5v.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/TrendBadge-DQ4zgWWk.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/UsageView-CEyf-VpZ.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/UserManagementView-Ct4n0QDr.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/VertexView-ClrbQVzt.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/VertexView-DnYc5KSf.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/VizDemoView-PGvBvN2G.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/WorkWorkspace-Drgs9R6s.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/WorkflowEditorView-BazGYxiT.js +7 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/WorkspaceIDEView-BY6TA4da.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/arrow-up-DpBEFU1W.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/circle-dot-In4UilqT.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/identity-Cp486guQ.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/index-CvBBCrBf.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/index-C2uiGu8Z.js +17 -17
- agent_webui-2.8.0/agent/agent_webui/dist/assets/index-UXCYeqCs.css +2 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/loaded-workspace-commands-CXfB1eT-.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/model-CcBWpHSX.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/model-Oxh121Y0.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/queries-Cx8lZa--.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/status-message-eVvQOUJt.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/status-message-CFnPiTvw.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/tabs-aIrzMOIb.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/undo-2-D4EYZLW8.js +1 -0
- agent_webui-2.8.0/agent/agent_webui/dist/assets/uql-H85wtqTc.js +1 -0
- agent_webui-2.7.0/agent/agent_webui/dist/assets/useMutation-IxXdlsmq.js → agent_webui-2.8.0/agent/agent_webui/dist/assets/useMutation-BXe25F6O.js +1 -1
- agent_webui-2.8.0/agent/agent_webui/dist/assets/useQuery-BCV_z3lS.js +1 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/index.html +11 -11
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/og-image-v1.svg +3 -3
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/site.webmanifest +3 -3
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/spa-routes.json +5 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/host.py +22 -22
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/observability.py +2 -2
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/oidc_session.py +3 -3
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/orchestrator_model.py +97 -33
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/server.py +11 -11
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/skills/agent-webui-development/SKILL.md +5 -5
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/skills/kg-webui-admin/SKILL.md +1 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/skills/kg-webui-dashboards/SKILL.md +1 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/skills/kg-webui-extraction/SKILL.md +1 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/skills/kg-webui-graphviz/SKILL.md +1 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/skills/kg-webui-ontology-operator/SKILL.md +1 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/skills/kg-webui-swe/SKILL.md +1 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui.egg-info/PKG-INFO +24 -19
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui.egg-info/SOURCES.txt +88 -78
- {agent_webui-2.7.0 → agent_webui-2.8.0}/pyproject.toml +5 -5
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_identity_boundary.py +1 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_release_publication.py +1 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/AdminView-Cs7hxxlS.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/AtlasView-BNusEspP.js +0 -5
- agent_webui-2.7.0/agent/agent_webui/dist/assets/BrokerView-BRCZAdxA.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ChartPage-CTCzfMHk.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/CypherReplView-B2QzDrb9.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/DashboardView-BkwPaKer.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/EcosystemView-BpZrGFno.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/FilesView-DiD8xn9K.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/Graph3DLodView-vJlLNz_w.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/GraphCanvas-BuECakKk.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/GraphOSReadinessView-CtUmTWrb.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/GraphView-CSvUsYdN.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/IntegrationsView-Ddggu4Bl.js +0 -2
- agent_webui-2.7.0/agent/agent_webui/dist/assets/KnowledgeView-CmJp5V4M.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/LLMTemplatesView-Byu7WJwR.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/LiveDashboardsView-DdZYsTjr.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/MemoryView-B_zuf2qi.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/NotFoundPage-C3OUDkZ6.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ObjectExplorerView-2XFjU1WB.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/ObservabilityView-BSn_K6uW.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/OpsPanelView-DZ1SemuU.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/PrivacyPage-gVB_yGWv.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/PromptsView-CW6bS2tH.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/SessionsView-B85jEvq4.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/SkillsView-ltbBnnOs.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/SparqlView-uiz8nit1.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/SystemStatusView-DeOdQhhd.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/TableExplorerView-B9CIcsWB.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/TemporalGraphView-BL_ULue5.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/TrendBadge-BPuE-pRH.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/UsageView-DdzMku0x.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/UserManagementView-CVpJ2yEt.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/VizDemoView-ad7BvGXc.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/WorkflowEditorView-BdrKmw4Y.js +0 -7
- agent_webui-2.7.0/agent/agent_webui/dist/assets/WorkspaceIDEView-2E-ni7lf.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/identity-DVvTRidn.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/index-BRlMMQsQ.css +0 -2
- agent_webui-2.7.0/agent/agent_webui/dist/assets/queries-D0kNjy2X.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/tabs-CjTe9LxQ.js +0 -1
- agent_webui-2.7.0/agent/agent_webui/dist/assets/useQuery-BGefm_dX.js +0 -1
- {agent_webui-2.7.0 → agent_webui-2.8.0}/LICENSE +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__init__.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/conftest.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_api_extensions.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_bound_sweep_regressions.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_bug_012_github_gitlab_contract.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_chat_resource_routes.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_contact_delivery.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_files_endpoints.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_host.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_markets_app.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_observability.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_parity_contract.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_pydantic_ai_compat.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_rbac.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_spa_http_status.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_workspace_helpers_chokepoint.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/__init__.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/catalog.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/chart.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/gateway.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/scanner.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/series.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/session.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/snapshots.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/apps/markets/timeframes.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/browser_control_canonical.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/apple-touch-icon.png +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/ChartPanel-Cxpkw3a6.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/InterVariable-DiVDrmQJ.woff2 +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/LegalPageContent-BmhwYoKV.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/SessionExpiredNotice-CMttDxWl.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/WorkflowEditorView-DLioOiRN.css +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/activity-DupAOJCR.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/api-jtHn_WxH.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/api-validation-CCoR_LRu.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/app-window-KMAPJoaW.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/badge-nQZ87mVE.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/braces-BNz2iAeD.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/bundle-mjs-DIyOrgL5.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/check-CPVKKX8l.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/chevron-down-DYWnPQti.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/chevron-left-BaGXvfgm.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/chevron-right-gs8WU8XT.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/chevron-up-C-rjGU5C.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/chunk-D32TOXHM-KueescCg.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/circle-alert-ByZ-1ERr.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/contact-C94LhKRg.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/createLucideIcon-DTQSidPf.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-2txhAIHO.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-BHmo3Yb6.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-BKkt828_.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-BLRfKgTy.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-BjAObXUn.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-Bq6o2UDR.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-CWmwEm73.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-DMVqwVuR.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-DcreYulP.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/dist-mp1aFJDC.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/es2015-CgZynitj.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/external-link-Dyd5OsGm.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/eye-D0gCj30e.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/file-text-DqorJKDA.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/folder-open-BrzeUmMg.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/format-DHsGNrOH.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/funnel-Y4IuN8Q7.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/graphology-layout-forceatlas2-CF_uOjtN.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/hard-drive-9fR5RFS9.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/highlighted-body-KQOG7T2V-qSdnQsR5.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/hourglass-1ui486hR.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/layout-grid-B4IFpzLD.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/layout.worker-CnC9u5pP.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/link-2-a9RZxW2S.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/mermaid-MCJ5UELQ-F6vEfdbO.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/play-D3mjq--Q.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/plus-s20KYBeu.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/preload-helper-CRzLMJPS.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/react-dom-DAxA-E-a.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/refresh-cw-BVhl5aJX.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/save-CuEdPPgC.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/scan-search-GrqJngl3.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/scroll-area-srEWz9Q3.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/server-CE-xbAAj.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/sliders-vertical-Cr4E50uY.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/sparkles-Bae0tRI0.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/switch-B9Yml2pU.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/tag-D1RiwxuF.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/theme-colors-DKGWsgC0.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/transport-Din6U5N9.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/unavailable-notice-B7WdWNor.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/upload-DcybBZCN.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/utils-C0okervd.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/wifi-off-Dz91unNp.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/assets/x-BdA_yxUR.js +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/favicon-16x16.png +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/favicon-32x32.png +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/favicon-48x48.png +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/favicon.ico +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/favicon.png +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/favicon.svg +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/icon-192x192.png +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/icon-512x512.png +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/og-image-v1.png +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/robots.txt +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/dist/sitemap.xml +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/icon.png +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/public_shell.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/rbac.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/skills/__init__.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui.egg-info/dependency_links.txt +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui.egg-info/entry_points.txt +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui.egg-info/requires.txt +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui.egg-info/top_level.txt +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/setup.cfg +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_dashboard_entrypoint.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_eslint_hook_contract.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_gate_wrappers.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_graph_visualization.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_health_liveness_endpoint.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_init.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_log_failure_error_code.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_package_author_privacy.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_privacy_boundaries.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_release_concurrency.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_release_gate_order.py +0 -0
- {agent_webui-2.7.0 → agent_webui-2.8.0}/tests/test_startup.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: agent-webui
|
|
3
|
-
Version: 2.
|
|
3
|
+
Version: 2.8.0
|
|
4
4
|
Summary: Agent Web Interface for Pydantic AI Agents
|
|
5
5
|
Author-email: Repository Maintainers <maintainers@knuckles.team>
|
|
6
6
|
License: MIT
|
|
@@ -9,7 +9,10 @@ Classifier: License :: OSI Approved :: MIT License
|
|
|
9
9
|
Classifier: Environment :: Console
|
|
10
10
|
Classifier: Operating System :: POSIX :: Linux
|
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
|
|
12
|
+
Classifier: Programming Language :: Python :: 3.12
|
|
13
|
+
Classifier: Programming Language :: Python :: 3.13
|
|
14
|
+
Classifier: Programming Language :: Python :: 3.14
|
|
15
|
+
Requires-Python: >=3.12
|
|
13
16
|
Description-Content-Type: text/markdown
|
|
14
17
|
License-File: LICENSE
|
|
15
18
|
Requires-Dist: agent-utilities<4.0.0,>=3.0.0
|
|
@@ -41,14 +44,14 @@ Requires-Dist: opentelemetry-instrumentation-fastapi>=0.65b0; extra == "test"
|
|
|
41
44
|
Requires-Dist: opentelemetry-instrumentation-asgi>=0.65b0; extra == "test"
|
|
42
45
|
Dynamic: license-file
|
|
43
46
|
|
|
44
|
-
#
|
|
47
|
+
# Arbora web UI
|
|
45
48
|
|
|
46
49
|
<p align="center">
|
|
47
|
-
<img src="docs/assets/brands/agent-webui-logo-v1.png" alt="
|
|
50
|
+
<img src="docs/assets/brands/agent-webui-logo-v1.png" alt="Arbora Agent Web UI logo" width="160" />
|
|
48
51
|
</p>
|
|
49
52
|
|
|
50
53
|
<p align="center">
|
|
51
|
-
<strong>The browser workspace for governed agents, workflows, and knowledge in
|
|
54
|
+
<strong>The browser workspace for governed agents, workflows, and knowledge in Arbora.</strong><br>
|
|
52
55
|
<sub>Conversations · approvals · workflows · fleet activity · Atlas knowledge views</sub>
|
|
53
56
|
</p>
|
|
54
57
|
|
|
@@ -88,16 +91,16 @@ Dynamic: license-file
|
|
|
88
91
|
|
|
89
92
|
## Overview
|
|
90
93
|
|
|
91
|
-
|
|
94
|
+
Arbora Agent Web UI is the browser workspace composed by Arbora. It brings agent
|
|
92
95
|
conversations, approvals, workflows, fleet activity, and Epistemic Graph
|
|
93
96
|
exploration into one React application. Its FastAPI host keeps privileged
|
|
94
97
|
credentials and gateway delegation on the server side.
|
|
95
98
|
|
|
96
99
|
| Agent Web UI owns | Other components own |
|
|
97
100
|
|---|---|
|
|
98
|
-
| Browser presentation, local interaction state, accessible route composition, and the FastAPI boundary |
|
|
101
|
+
| Browser presentation, local interaction state, accessible route composition, and the FastAPI boundary | Arbora owns public routing, identity, policy, and fleet supervision; Agent Utilities owns agent behavior; Epistemic Graph owns durable knowledge; connector services own external-system effects |
|
|
99
102
|
|
|
100
|
-
Current package Version: 2.
|
|
103
|
+
Current package Version: 2.8.0.
|
|
101
104
|
|
|
102
105
|
## Key capabilities
|
|
103
106
|
|
|
@@ -106,7 +109,7 @@ Current package Version: 2.7.0.
|
|
|
106
109
|
- Explore property graphs, RDF, schemas, objects, tables, documents, code, and memories through Atlas and Epistemic Graph.
|
|
107
110
|
- Discover MCP Apps and connector capabilities without exposing service credentials to the browser.
|
|
108
111
|
- Apply one role-aware navigation and server authorization model across the complete workspace.
|
|
109
|
-
- Run as the
|
|
112
|
+
- Run as the Arbora-hosted browser co-service or as an independently deployed ASGI application.
|
|
110
113
|
|
|
111
114
|
## Documentation
|
|
112
115
|
|
|
@@ -118,20 +121,22 @@ then use the shared platform map to move between components:
|
|
|
118
121
|
| Agent Web UI | Browser operator workspace and Atlas knowledge views | [Docs](https://knuckles-team.github.io/agent-webui/) |
|
|
119
122
|
| Agent Terminal UI | Terminal and headless client; REST operations are available, with no ACP conversational path | [Docs](https://knuckles-team.github.io/agent-terminal-ui/) |
|
|
120
123
|
| Geniusbot | Desktop cockpit for chat, graph, fleet, health, and operator workflows | [Docs](https://knuckles-team.github.io/geniusbot/) |
|
|
121
|
-
|
|
|
122
|
-
|
|
|
124
|
+
| Arbora messaging | Hosts chat and voice entrypoints; Agent Utilities supplies adapter and routing behavior | [Docs](https://knuckles-team.github.io/arbora/) |
|
|
125
|
+
| Arbora | Public MCP, REST, A2A, identity, policy, and runtime composition | [Docs](https://knuckles-team.github.io/arbora/) |
|
|
123
126
|
| Agent Utilities | Agent decisions, workflows, evaluation, and skills | [Docs](https://knuckles-team.github.io/agent-utilities/) |
|
|
124
127
|
| Epistemic Graph | Durable multimodal data, reasoning, provenance, and transactions | [Docs](https://knuckles-team.github.io/epistemic-graph/) |
|
|
125
128
|
| Agent Connector SDK | Typed source adapters, connector serving, and write-back contracts | [Docs](https://knuckles-team.github.io/agent-connector-sdk/) |
|
|
126
129
|
|
|
127
130
|
## Architecture
|
|
128
131
|
|
|
129
|
-
](https://knuckles-team.github.io/.github/architecture/#webui)
|
|
130
133
|
|
|
131
|
-
|
|
134
|
+
[Explore the live architecture](https://knuckles-team.github.io/.github/architecture/#webui)
|
|
135
|
+
|
|
136
|
+
People also enter through Agent Terminal UI and Geniusbot or Arbora-hosted
|
|
132
137
|
messaging; Agent Terminal UI exposes REST operations, with no ACP conversational
|
|
133
138
|
path. External applications connect over MCP, REST, or A2A. The browser talks
|
|
134
|
-
only to its same-origin FastAPI host.
|
|
139
|
+
only to its same-origin FastAPI host. Arbora injects gateway routes and
|
|
135
140
|
verified request context, then delegates agent behavior to Agent Utilities and
|
|
136
141
|
durable knowledge to Epistemic Graph. Source systems connect through Agent
|
|
137
142
|
Connector SDK directly to Epistemic Graph. Agent Web UI renders typed results
|
|
@@ -142,15 +147,15 @@ for the request flow and trust boundaries.
|
|
|
142
147
|
|
|
143
148
|
## Quick start
|
|
144
149
|
|
|
145
|
-
Generate a local profile and start
|
|
150
|
+
Generate a local profile and start Arbora with Agent Web UI enabled:
|
|
146
151
|
|
|
147
152
|
```bash
|
|
148
|
-
uvx --from "
|
|
153
|
+
uvx --from "arbora[webui]" setup-config generate --profile tiny
|
|
149
154
|
export ENABLE_WEB_UI=true
|
|
150
|
-
uvx --from "
|
|
155
|
+
uvx --from "arbora[webui]" arbora --transport streamable-http --host 127.0.0.1 --port 8000
|
|
151
156
|
```
|
|
152
157
|
|
|
153
|
-
Open <http://127.0.0.1:8080>.
|
|
158
|
+
Open <http://127.0.0.1:8080>. Arbora serves MCP on port `8000` and the Agent
|
|
154
159
|
Web UI co-service on port `8080`. The [start guide](https://knuckles-team.github.io/agent-webui/start/)
|
|
155
160
|
covers local source development and deployment profiles.
|
|
156
161
|
|
|
@@ -162,4 +167,4 @@ before opening a pull request.
|
|
|
162
167
|
|
|
163
168
|
## License
|
|
164
169
|
|
|
165
|
-
|
|
170
|
+
Arbora Agent Web UI is available under the [MIT License](LICENSE).
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Arbora web UI
|
|
2
2
|
|
|
3
3
|
<p align="center">
|
|
4
|
-
<img src="docs/assets/brands/agent-webui-logo-v1.png" alt="
|
|
4
|
+
<img src="docs/assets/brands/agent-webui-logo-v1.png" alt="Arbora Agent Web UI logo" width="160" />
|
|
5
5
|
</p>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<strong>The browser workspace for governed agents, workflows, and knowledge in
|
|
8
|
+
<strong>The browser workspace for governed agents, workflows, and knowledge in Arbora.</strong><br>
|
|
9
9
|
<sub>Conversations · approvals · workflows · fleet activity · Atlas knowledge views</sub>
|
|
10
10
|
</p>
|
|
11
11
|
|
|
@@ -45,16 +45,16 @@
|
|
|
45
45
|
|
|
46
46
|
## Overview
|
|
47
47
|
|
|
48
|
-
|
|
48
|
+
Arbora Agent Web UI is the browser workspace composed by Arbora. It brings agent
|
|
49
49
|
conversations, approvals, workflows, fleet activity, and Epistemic Graph
|
|
50
50
|
exploration into one React application. Its FastAPI host keeps privileged
|
|
51
51
|
credentials and gateway delegation on the server side.
|
|
52
52
|
|
|
53
53
|
| Agent Web UI owns | Other components own |
|
|
54
54
|
|---|---|
|
|
55
|
-
| Browser presentation, local interaction state, accessible route composition, and the FastAPI boundary |
|
|
55
|
+
| Browser presentation, local interaction state, accessible route composition, and the FastAPI boundary | Arbora owns public routing, identity, policy, and fleet supervision; Agent Utilities owns agent behavior; Epistemic Graph owns durable knowledge; connector services own external-system effects |
|
|
56
56
|
|
|
57
|
-
Current package Version: 2.
|
|
57
|
+
Current package Version: 2.8.0.
|
|
58
58
|
|
|
59
59
|
## Key capabilities
|
|
60
60
|
|
|
@@ -63,7 +63,7 @@ Current package Version: 2.7.0.
|
|
|
63
63
|
- Explore property graphs, RDF, schemas, objects, tables, documents, code, and memories through Atlas and Epistemic Graph.
|
|
64
64
|
- Discover MCP Apps and connector capabilities without exposing service credentials to the browser.
|
|
65
65
|
- Apply one role-aware navigation and server authorization model across the complete workspace.
|
|
66
|
-
- Run as the
|
|
66
|
+
- Run as the Arbora-hosted browser co-service or as an independently deployed ASGI application.
|
|
67
67
|
|
|
68
68
|
## Documentation
|
|
69
69
|
|
|
@@ -75,20 +75,22 @@ then use the shared platform map to move between components:
|
|
|
75
75
|
| Agent Web UI | Browser operator workspace and Atlas knowledge views | [Docs](https://knuckles-team.github.io/agent-webui/) |
|
|
76
76
|
| Agent Terminal UI | Terminal and headless client; REST operations are available, with no ACP conversational path | [Docs](https://knuckles-team.github.io/agent-terminal-ui/) |
|
|
77
77
|
| Geniusbot | Desktop cockpit for chat, graph, fleet, health, and operator workflows | [Docs](https://knuckles-team.github.io/geniusbot/) |
|
|
78
|
-
|
|
|
79
|
-
|
|
|
78
|
+
| Arbora messaging | Hosts chat and voice entrypoints; Agent Utilities supplies adapter and routing behavior | [Docs](https://knuckles-team.github.io/arbora/) |
|
|
79
|
+
| Arbora | Public MCP, REST, A2A, identity, policy, and runtime composition | [Docs](https://knuckles-team.github.io/arbora/) |
|
|
80
80
|
| Agent Utilities | Agent decisions, workflows, evaluation, and skills | [Docs](https://knuckles-team.github.io/agent-utilities/) |
|
|
81
81
|
| Epistemic Graph | Durable multimodal data, reasoning, provenance, and transactions | [Docs](https://knuckles-team.github.io/epistemic-graph/) |
|
|
82
82
|
| Agent Connector SDK | Typed source adapters, connector serving, and write-back contracts | [Docs](https://knuckles-team.github.io/agent-connector-sdk/) |
|
|
83
83
|
|
|
84
84
|
## Architecture
|
|
85
85
|
|
|
86
|
-
](https://knuckles-team.github.io/.github/architecture/#webui)
|
|
87
87
|
|
|
88
|
-
|
|
88
|
+
[Explore the live architecture](https://knuckles-team.github.io/.github/architecture/#webui)
|
|
89
|
+
|
|
90
|
+
People also enter through Agent Terminal UI and Geniusbot or Arbora-hosted
|
|
89
91
|
messaging; Agent Terminal UI exposes REST operations, with no ACP conversational
|
|
90
92
|
path. External applications connect over MCP, REST, or A2A. The browser talks
|
|
91
|
-
only to its same-origin FastAPI host.
|
|
93
|
+
only to its same-origin FastAPI host. Arbora injects gateway routes and
|
|
92
94
|
verified request context, then delegates agent behavior to Agent Utilities and
|
|
93
95
|
durable knowledge to Epistemic Graph. Source systems connect through Agent
|
|
94
96
|
Connector SDK directly to Epistemic Graph. Agent Web UI renders typed results
|
|
@@ -99,15 +101,15 @@ for the request flow and trust boundaries.
|
|
|
99
101
|
|
|
100
102
|
## Quick start
|
|
101
103
|
|
|
102
|
-
Generate a local profile and start
|
|
104
|
+
Generate a local profile and start Arbora with Agent Web UI enabled:
|
|
103
105
|
|
|
104
106
|
```bash
|
|
105
|
-
uvx --from "
|
|
107
|
+
uvx --from "arbora[webui]" setup-config generate --profile tiny
|
|
106
108
|
export ENABLE_WEB_UI=true
|
|
107
|
-
uvx --from "
|
|
109
|
+
uvx --from "arbora[webui]" arbora --transport streamable-http --host 127.0.0.1 --port 8000
|
|
108
110
|
```
|
|
109
111
|
|
|
110
|
-
Open <http://127.0.0.1:8080>.
|
|
112
|
+
Open <http://127.0.0.1:8080>. Arbora serves MCP on port `8000` and the Agent
|
|
111
113
|
Web UI co-service on port `8080`. The [start guide](https://knuckles-team.github.io/agent-webui/start/)
|
|
112
114
|
covers local source development and deployment profiles.
|
|
113
115
|
|
|
@@ -119,4 +121,4 @@ before opening a pull request.
|
|
|
119
121
|
|
|
120
122
|
## License
|
|
121
123
|
|
|
122
|
-
|
|
124
|
+
Arbora Agent Web UI is available under the [MIT License](LICENSE).
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
"""Live-path and trust-boundary tests for the
|
|
1
|
+
"""Live-path and trust-boundary tests for the Arbora browser channel."""
|
|
2
2
|
|
|
3
3
|
from __future__ import annotations
|
|
4
4
|
|
|
@@ -75,7 +75,7 @@ class RecordingConnection:
|
|
|
75
75
|
self.messages.append(message)
|
|
76
76
|
if message.type == 'catalog.register':
|
|
77
77
|
return {
|
|
78
|
-
'authority': '
|
|
78
|
+
'authority': 'arbora',
|
|
79
79
|
'route_id': message.route_id,
|
|
80
80
|
'registration_generation': message.registration_generation,
|
|
81
81
|
'catalog_digest': message.catalog_digest,
|
|
@@ -130,7 +130,7 @@ class _AuCancel(BaseModel):
|
|
|
130
130
|
|
|
131
131
|
|
|
132
132
|
class RecordingPort:
|
|
133
|
-
authority = '
|
|
133
|
+
authority = 'arbora'
|
|
134
134
|
supports_durable_fences = True
|
|
135
135
|
supports_durable_audit = True
|
|
136
136
|
supports_attended_leases = True
|
|
@@ -174,7 +174,7 @@ class FailingOpenPort(RecordingPort):
|
|
|
174
174
|
|
|
175
175
|
async def open_channel(self, binding: BrowserControlBinding, send: Any) -> Any:
|
|
176
176
|
self.bindings.append(binding)
|
|
177
|
-
raise RuntimeError('synthetic
|
|
177
|
+
raise RuntimeError('synthetic Arbora open failure')
|
|
178
178
|
|
|
179
179
|
async def revoke_attended_arm(self, binding: BrowserControlBinding) -> Any:
|
|
180
180
|
self.revoked.append(binding)
|
|
@@ -482,7 +482,7 @@ def test_structural_au_message_is_validated_and_sent_to_browser(
|
|
|
482
482
|
assert websocket.receive_json() == {
|
|
483
483
|
'protocol': 'webmcp.control.v1',
|
|
484
484
|
'type': 'channel.ready',
|
|
485
|
-
'authority': '
|
|
485
|
+
'authority': 'arbora',
|
|
486
486
|
'route_id': 'knowledge.graph',
|
|
487
487
|
'registration_generation': 7,
|
|
488
488
|
'catalog_digest': _CATALOG_DIGEST,
|
|
@@ -541,7 +541,7 @@ def test_one_injected_connection_handles_every_browser_event_and_outbound_send(
|
|
|
541
541
|
) as websocket:
|
|
542
542
|
websocket.send_json(_OPEN)
|
|
543
543
|
websocket.send_json(_CATALOG)
|
|
544
|
-
assert websocket.receive_json()['authority'] == '
|
|
544
|
+
assert websocket.receive_json()['authority'] == 'arbora'
|
|
545
545
|
for event in events:
|
|
546
546
|
websocket.send_json(event)
|
|
547
547
|
assert websocket.receive_json() == {
|
|
@@ -560,7 +560,7 @@ def test_one_injected_connection_handles_every_browser_event_and_outbound_send(
|
|
|
560
560
|
]
|
|
561
561
|
|
|
562
562
|
|
|
563
|
-
def
|
|
563
|
+
def test_channel_ready_refuses_a_tampered_arbora_catalog_receipt(
|
|
564
564
|
mock_agent: Any,
|
|
565
565
|
monkeypatch: pytest.MonkeyPatch,
|
|
566
566
|
) -> None:
|
|
@@ -852,7 +852,7 @@ def test_duplicate_tool_id_with_a_different_version_is_rejected(
|
|
|
852
852
|
[{**_CATALOG['tools'][0], 'required_roles': ['é']}],
|
|
853
853
|
],
|
|
854
854
|
)
|
|
855
|
-
def
|
|
855
|
+
def test_catalog_descriptor_invariants_fail_before_arbora(
|
|
856
856
|
mock_agent: Any,
|
|
857
857
|
monkeypatch: pytest.MonkeyPatch,
|
|
858
858
|
tools: list[dict[str, Any]],
|
|
@@ -560,8 +560,8 @@ async def test_a_caller_with_its_own_bearer_is_never_given_a_browser_session():
|
|
|
560
560
|
authorization = [v for k, v in seen['headers'] if k.lower() == b'authorization']
|
|
561
561
|
assert authorization == [b'Bearer service-token']
|
|
562
562
|
assert 'browser_login_session_ref' not in seen['state']
|
|
563
|
-
assert seen['state'].get('
|
|
564
|
-
assert '
|
|
563
|
+
assert seen['state'].get('arbora_session_admitted') is not True
|
|
564
|
+
assert 'arbora_console_mfa_at_ms' not in seen['state']
|
|
565
565
|
|
|
566
566
|
|
|
567
567
|
@pytest.mark.anyio
|
|
@@ -591,10 +591,10 @@ async def test_a_valid_session_is_forwarded_as_the_users_own_bearer():
|
|
|
591
591
|
assert login_ref.startswith('login_')
|
|
592
592
|
assert len(login_ref) == 70
|
|
593
593
|
assert 'users-own-token' not in login_ref
|
|
594
|
-
# This is a legacy sealed Keycloak cookie, not a live
|
|
595
|
-
# broker session. Only
|
|
596
|
-
assert seen['state'].get('
|
|
597
|
-
assert '
|
|
594
|
+
# This is a legacy sealed Keycloak cookie, not a live Arbora identity
|
|
595
|
+
# broker session. Only Arbora IdentityGate may set the admission marker.
|
|
596
|
+
assert seen['state'].get('arbora_session_admitted') is not True
|
|
597
|
+
assert 'arbora_console_mfa_at_ms' not in seen['state']
|
|
598
598
|
|
|
599
599
|
|
|
600
600
|
@pytest.mark.anyio
|
|
@@ -1229,7 +1229,7 @@ async def test_finalize_consumes_recent_auth_once_and_mints_exact_arm(monkeypatc
|
|
|
1229
1229
|
revoked: list = []
|
|
1230
1230
|
|
|
1231
1231
|
class Port:
|
|
1232
|
-
authority = '
|
|
1232
|
+
authority = 'arbora'
|
|
1233
1233
|
supports_durable_fences = True
|
|
1234
1234
|
supports_durable_audit = True
|
|
1235
1235
|
supports_attended_leases = True
|
|
@@ -1457,13 +1457,13 @@ def anyio_backend():
|
|
|
1457
1457
|
|
|
1458
1458
|
# --------------------------------------------------- browser session evidence
|
|
1459
1459
|
#
|
|
1460
|
-
#
|
|
1461
|
-
# .
|
|
1462
|
-
# live ``__Host-
|
|
1460
|
+
# arbora's browser identity producer (``arbora.identity.broker
|
|
1461
|
+
# .ArboraBrowserAuthority``) is the real caller of this port: it verifies a
|
|
1462
|
+
# live ``__Host-arbora_session`` cookie, then calls this exact chokepoint to
|
|
1463
1463
|
# turn its own owner-verified evidence into the MFA timestamp its HTTP/MCP
|
|
1464
1464
|
# caller projection needs. These tests exercise the webui side of that
|
|
1465
1465
|
# contract with a synthetic authority fixture standing in for the real
|
|
1466
|
-
# producer, which
|
|
1466
|
+
# producer, which arbora's own suite covers end to end.
|
|
1467
1467
|
|
|
1468
1468
|
_EVIDENCE_ORIGIN = 'https://console.example.test'
|
|
1469
1469
|
_NOW_MS = 2_000_000
|
|
@@ -0,0 +1,218 @@
|
|
|
1
|
+
"""WEBUI-API-R011.2: conversation labels and admitted run identity stay distinct."""
|
|
2
|
+
|
|
3
|
+
# spec: WEBUI-API-R011.2.1
|
|
4
|
+
|
|
5
|
+
import asyncio
|
|
6
|
+
|
|
7
|
+
import pytest
|
|
8
|
+
from agent_webui.orchestrator_model import (
|
|
9
|
+
_conversation_session_id,
|
|
10
|
+
_run_identity,
|
|
11
|
+
build_orchestrator_model,
|
|
12
|
+
)
|
|
13
|
+
from pydantic_ai import Agent
|
|
14
|
+
from pydantic_ai.messages import ModelRequest, UserPromptPart
|
|
15
|
+
|
|
16
|
+
|
|
17
|
+
def request(text='hello', conversation_id=None):
|
|
18
|
+
return ModelRequest(
|
|
19
|
+
parts=[UserPromptPart(content=text)], conversation_id=conversation_id
|
|
20
|
+
)
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
def task_result(task_id, context='owned-context'):
|
|
24
|
+
return {
|
|
25
|
+
'value': {
|
|
26
|
+
'id': task_id,
|
|
27
|
+
'contextId': context,
|
|
28
|
+
'metadata': {
|
|
29
|
+
'arbora': {
|
|
30
|
+
'runId': 'run-' + task_id,
|
|
31
|
+
'runTraceRef': 'opaque-ref-' + task_id,
|
|
32
|
+
}
|
|
33
|
+
},
|
|
34
|
+
'artifacts': [{'parts': [{'kind': 'text', 'text': 'reply-' + task_id}]}],
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
def test_explicit_identity_is_stable_not_content_derived():
|
|
40
|
+
assert _conversation_session_id([request('one', 'c1')]) == 'webui:c1'
|
|
41
|
+
assert _conversation_session_id([request('two', 'c1')]) == 'webui:c1'
|
|
42
|
+
assert _conversation_session_id([request('one', 'c2')]) == 'webui:c2'
|
|
43
|
+
assert _conversation_session_id([request()]) != _conversation_session_id(
|
|
44
|
+
[request()]
|
|
45
|
+
)
|
|
46
|
+
|
|
47
|
+
|
|
48
|
+
def test_conflicting_identity_refused():
|
|
49
|
+
with pytest.raises(ValueError, match='Conflicting'):
|
|
50
|
+
_conversation_session_id(
|
|
51
|
+
[request(conversation_id='a'), request(conversation_id='b')]
|
|
52
|
+
)
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
def test_explicit_references_only_no_guessed_trace():
|
|
56
|
+
metadata = _run_identity(task_result('t1'), 'webui:c1')
|
|
57
|
+
assert metadata is not None
|
|
58
|
+
identity = metadata['arbora_run']
|
|
59
|
+
assert identity == {
|
|
60
|
+
'conversation_context': 'webui:c1',
|
|
61
|
+
'task_id': 't1',
|
|
62
|
+
'context_id': 'owned-context',
|
|
63
|
+
'run_id': 'run-t1',
|
|
64
|
+
'run_trace_ref': 'opaque-ref-t1',
|
|
65
|
+
}
|
|
66
|
+
assert _run_identity({'value': {'status': {}}}, 'webui:c1') is None
|
|
67
|
+
assert _run_identity({'result': task_result('nested')}, 'webui:c1') is None
|
|
68
|
+
assert _run_identity({'value': {'id': 't', 'contextId': 'c'}}, 'webui:c1') == {
|
|
69
|
+
'arbora_run': {
|
|
70
|
+
'conversation_context': 'webui:c1',
|
|
71
|
+
'task_id': 't',
|
|
72
|
+
'context_id': 'c',
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
|
|
77
|
+
@pytest.mark.parametrize(
|
|
78
|
+
'field,value', [('id', 1), ('contextId', ''), ('contextId', ['c'])]
|
|
79
|
+
)
|
|
80
|
+
def test_invalid_returned_identity_refused(field, value):
|
|
81
|
+
result = task_result('t1')
|
|
82
|
+
result['value'][field] = value
|
|
83
|
+
assert _run_identity(result, 'webui:c1') is None
|
|
84
|
+
|
|
85
|
+
|
|
86
|
+
async def test_stream_metadata_is_request_local_and_preserves_exact_refs():
|
|
87
|
+
calls = []
|
|
88
|
+
|
|
89
|
+
async def invoke(op, params, *, idempotency_key):
|
|
90
|
+
context = params['message']['contextId']
|
|
91
|
+
calls.append((context, idempotency_key))
|
|
92
|
+
await asyncio.sleep(0)
|
|
93
|
+
return task_result(context)
|
|
94
|
+
|
|
95
|
+
agent = Agent(build_orchestrator_model(invoke=invoke))
|
|
96
|
+
|
|
97
|
+
async def run(conversation):
|
|
98
|
+
async with agent.run_stream('hello', conversation_id=conversation) as result:
|
|
99
|
+
await result.get_output()
|
|
100
|
+
return result.response
|
|
101
|
+
|
|
102
|
+
one, two = await asyncio.gather(run('one'), run('two'))
|
|
103
|
+
assert one.metadata['arbora_run']['task_id'] == 'webui:one'
|
|
104
|
+
assert two.metadata['arbora_run']['task_id'] == 'webui:two'
|
|
105
|
+
assert one.metadata['arbora_run']['run_trace_ref'] == 'opaque-ref-webui:one'
|
|
106
|
+
from pydantic_ai.ui.vercel_ai import VercelAIAdapter
|
|
107
|
+
|
|
108
|
+
wire = VercelAIAdapter.dump_messages([one])[0]
|
|
109
|
+
assert wire.metadata['arbora_run'] == one.metadata['arbora_run']
|
|
110
|
+
# Repeated turns share conversation identity, not a fabricated task/run ID.
|
|
111
|
+
again = await run('one')
|
|
112
|
+
assert again.metadata['arbora_run']['conversation_context'] == 'webui:one'
|
|
113
|
+
assert calls[0][1] != calls[-1][1]
|
|
114
|
+
assert calls[-1][0] == 'webui:one'
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
async def test_failed_stream_does_not_reuse_previous_identity():
|
|
118
|
+
calls = 0
|
|
119
|
+
|
|
120
|
+
async def invoke(op, params, *, idempotency_key):
|
|
121
|
+
nonlocal calls
|
|
122
|
+
calls += 1
|
|
123
|
+
if calls == 2:
|
|
124
|
+
raise RuntimeError('unavailable')
|
|
125
|
+
return task_result('first' if calls == 1 else 'third')
|
|
126
|
+
|
|
127
|
+
agent = Agent(build_orchestrator_model(invoke=invoke))
|
|
128
|
+
first = await agent.run('first', conversation_id='one')
|
|
129
|
+
assert first.response.metadata['arbora_run']['task_id'] == 'first'
|
|
130
|
+
with pytest.raises(RuntimeError, match='unavailable'):
|
|
131
|
+
async with agent.run_stream('second', conversation_id='two') as result:
|
|
132
|
+
await result.get_output()
|
|
133
|
+
async with agent.run_stream('retry', conversation_id='two') as result:
|
|
134
|
+
await result.get_output()
|
|
135
|
+
assert result.response.metadata['arbora_run']['task_id'] == 'third'
|
|
136
|
+
assert (
|
|
137
|
+
result.response.metadata['arbora_run']['conversation_context']
|
|
138
|
+
== 'webui:two'
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
@pytest.mark.parametrize('malformed', [False, True])
|
|
143
|
+
async def test_real_vercel_stream_propagates_served_identity_without_repeating_effects(
|
|
144
|
+
malformed,
|
|
145
|
+
):
|
|
146
|
+
import json
|
|
147
|
+
|
|
148
|
+
from pydantic_ai.ui.vercel_ai import VercelAIAdapter
|
|
149
|
+
from starlette.requests import Request
|
|
150
|
+
|
|
151
|
+
calls = []
|
|
152
|
+
|
|
153
|
+
async def invoke(op, params, *, idempotency_key):
|
|
154
|
+
calls.append(params)
|
|
155
|
+
result = task_result('wire-task')
|
|
156
|
+
if malformed:
|
|
157
|
+
result['value']['id'] = 42
|
|
158
|
+
return {'ok': True, 'result': result, 'meta': {'registry_digest': 'test'}}
|
|
159
|
+
|
|
160
|
+
payload = json.dumps(
|
|
161
|
+
{
|
|
162
|
+
'id': '/selected',
|
|
163
|
+
'trigger': 'submit-message',
|
|
164
|
+
'messages': [
|
|
165
|
+
{
|
|
166
|
+
'id': 'u1',
|
|
167
|
+
'role': 'user',
|
|
168
|
+
'parts': [{'type': 'text', 'text': 'hello'}],
|
|
169
|
+
}
|
|
170
|
+
],
|
|
171
|
+
}
|
|
172
|
+
).encode()
|
|
173
|
+
|
|
174
|
+
async def receive():
|
|
175
|
+
return {'type': 'http.request', 'body': payload, 'more_body': False}
|
|
176
|
+
|
|
177
|
+
request = Request(
|
|
178
|
+
{
|
|
179
|
+
'type': 'http',
|
|
180
|
+
'method': 'POST',
|
|
181
|
+
'path': '/api/chats/messages',
|
|
182
|
+
'headers': [(b'content-type', b'application/json')],
|
|
183
|
+
},
|
|
184
|
+
receive,
|
|
185
|
+
)
|
|
186
|
+
response = await VercelAIAdapter.dispatch_request(
|
|
187
|
+
request, agent=Agent(build_orchestrator_model(invoke=invoke)), sdk_version=7
|
|
188
|
+
)
|
|
189
|
+
assert hasattr(response, 'body_iterator'), response.body
|
|
190
|
+
chunks = [chunk async for chunk in response.body_iterator]
|
|
191
|
+
body = ''.join(
|
|
192
|
+
chunk.decode() if isinstance(chunk, bytes) else chunk for chunk in chunks
|
|
193
|
+
)
|
|
194
|
+
assert len(calls) == 1
|
|
195
|
+
assert calls[0]['message']['contextId'] == 'webui:/selected'
|
|
196
|
+
assert 'reply-wire-task' in body
|
|
197
|
+
events = [
|
|
198
|
+
json.loads(line[6:])
|
|
199
|
+
for line in body.splitlines()
|
|
200
|
+
if line.startswith('data: ') and line != 'data: [DONE]'
|
|
201
|
+
]
|
|
202
|
+
metadata = [
|
|
203
|
+
event['messageMetadata']
|
|
204
|
+
for event in events
|
|
205
|
+
if event['type'] == 'message-metadata'
|
|
206
|
+
]
|
|
207
|
+
assert len(metadata) == 1
|
|
208
|
+
if malformed:
|
|
209
|
+
assert 'arbora_run' not in metadata[0]
|
|
210
|
+
else:
|
|
211
|
+
assert metadata[0]['arbora_run']['task_id'] == 'wire-task'
|
|
212
|
+
assert metadata[0]['arbora_run']['run_trace_ref'] == 'opaque-ref-wire-task'
|
|
213
|
+
|
|
214
|
+
|
|
215
|
+
def test_error_envelope_cannot_supply_identity():
|
|
216
|
+
assert (
|
|
217
|
+
_run_identity({'ok': False, 'result': task_result('fake')}, 'webui:c') is None
|
|
218
|
+
)
|
{agent_webui-2.7.0 → agent_webui-2.8.0}/agent/agent_webui/__tests__/test_security_boundaries.py
RENAMED
|
@@ -270,7 +270,7 @@ def _run_html_document(body_chunks: list[bytes], policy: str | None = None) -> l
|
|
|
270
270
|
return messages
|
|
271
271
|
|
|
272
272
|
|
|
273
|
-
@pytest.mark.spec('
|
|
273
|
+
@pytest.mark.spec('WEBUI-DESIGN-R009')
|
|
274
274
|
def test_html_documents_carry_a_fresh_style_nonce() -> None:
|
|
275
275
|
chunks = [b'<meta property="csp-nonce" nonce="AGENT_WEBUI_', b'CSP_NONCE">']
|
|
276
276
|
first = _run_html_document(chunks)
|