Skip to content

feat: add project_sidebar plugin to index#186

Open
mbradaschia wants to merge 1 commit intoagent0ai:mainfrom
mbradaschia:add/project_sidebar
Open

feat: add project_sidebar plugin to index#186
mbradaschia wants to merge 1 commit intoagent0ai:mainfrom
mbradaschia:add/project_sidebar

Conversation

@mbradaschia
Copy link
Copy Markdown
Contributor

Project Sidebar

A frontend-only Agent Zero plugin that replaces the default chats list with a project-grouped sidebar view.

Features

  • Collapsible project groups sorted by most recent chat activity
  • Persistent collapse state via localStorage
  • Edit shortcut on hover linking to project settings
  • No Project group for unassigned chats
  • Status indicators matching chat_status_marklet visual style
  • Interoperability data attributes (data-chat-id, data-project-name) for other plugins

Plugin Details

Checklist

  • index.yaml with required fields (title, description, github)
  • thumbnail.png (4KB square image)
  • Plugin folder name matches name in plugin.yaml: project_sidebar
  • Tags from TAGS.md (≤ 5)
  • Description ≤ 500 characters
  • LICENSE at repo root
  • README.md at repo root
  • Adds exactly one new plugin folder

@a0-bot
Copy link
Copy Markdown

a0-bot bot commented Apr 2, 2026

Plugin submission validation failed

ERROR: Only files under plugins/ are allowed in plugin PRs: TAGS.md

@mbradaschia mbradaschia force-pushed the add/project_sidebar branch 2 times, most recently from a868b2c to 2e26478 Compare April 2, 2026 12:02
@a0-bot
Copy link
Copy Markdown

a0-bot bot commented Apr 3, 2026

Plugin submission validation failed

ERROR: Unexpected file in plugin folder: .gitignore

@mbradaschia mbradaschia force-pushed the add/project_sidebar branch from 0db8147 to cf777bb Compare April 3, 2026 21:35
@3clyp50
Copy link
Copy Markdown
Collaborator

3clyp50 commented Apr 7, 2026

Hello @mbradaschia, hope all is well.

I went through the plugin's code and I have some review for you.

Structure & Purpose Match — 🟡 Warning

File: api/branch_from_end.py → lines 13–17

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

File: webui/project-sidebar-store.js → lines 304–309

      // 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

File: api/branch_from_end.py → lines 31–36

                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,
Alessandro

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants