feat: add project_sidebar plugin to index#186
feat: add project_sidebar plugin to index#186mbradaschia wants to merge 1 commit intoagent0ai:mainfrom
Conversation
Plugin submission validation failedERROR: Only files under plugins/ are allowed in plugin PRs: TAGS.md |
a868b2c to
2e26478
Compare
Plugin submission validation failedERROR: Unexpected file in plugin folder: .gitignore |
0db8147 to
cf777bb
Compare
|
Hello @mbradaschia, hope all is well. I went through the plugin's code and I have some review for you. Structure & Purpose Match — 🟡 Warning
class BranchFromEnd(ApiHandler):
"""Branch a chat from its last log entry (convenience wrapper for the sidebar).
Works for both in-memory and on-disk chats — loads from disk if not currently active.
"""Risk: The manifest describes a sidebar/grouping plugin, but this file introduces a backend API that changes server behavior and reads persisted chats from disk. That mismatch expands the trust boundary beyond what an operator would expect from a UI-focused plugin. Let me know if you need help figuring out how to reuse the same contexts without rewriting them, or using a workaround. Remote Communication — 🟡 Warning
// Step 2: directly activate the project on the new chat
await sendJsonData("/projects", {
action: "activate",
context_id: newCtxId,
name: group.name,
});Risk: The plugin is not purely local UI code; it makes backend API requests that create chats, modify project assignments, and invoke its own plugin API. These calls are same-origin and consistent with sidebar actions, but they still expand the network/API surface and depend on the host app’s authorization and CSRF protections. If you look in our Settings, in Agent Settings, we have a flag that lets users decide whether they want new chats to inherit the active project or not, and we should respect that choice. Secrets & Sensitive Data Access — 🔴 Fail
path = persist_chat._get_chat_file_path(context_id)
js = files.read_file(path)
if not js:
return Response("Context not found", 404)
data = json.loads(js)
context = persist_chat._deserialize_context(data)Risk: This code reads serialized chat files from disk and reconstructs full chat context objects in memory. Persisted chat files can contain logs, metadata, and agent state, so this is sensitive-data access that goes beyond the plugin’s declared role as a sidebar presentation enhancement. This goes together with number 1. It should be possible to make this change only through the UI. If you need any help or further info/explanation, let me know. Have a good one, |
Project Sidebar
A frontend-only Agent Zero plugin that replaces the default chats list with a project-grouped sidebar view.
Features
chat_status_markletvisual styledata-chat-id,data-project-name) for other pluginsPlugin Details
Checklist
index.yamlwith required fields (title, description, github)thumbnail.png(4KB square image)nameinplugin.yaml:project_sidebar