# saya-ch/sayacode architecture

> Architecture diagram of the GitHub repository saya-ch/sayacode, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-28). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/saya-ch/sayacode
- Repository: https://github.com/saya-ch/sayacode

## Overview

SAYACODE is a local coding-agent workbench: a user submits a task in the browser, the local API routes it through a workspace host into an assembled LangGraph agent, and the workbench presents the run, approvals, collaboration, and delivery. The CLI also supports headless single-run tasks. The README documents the major capabilities and state boundaries; sampled source confirms the web/API and host/app ownership, while some feature wiring below follows README descriptions rather than inspected implementation excerpts.

Main entry points: [`src/sayacode/application.py`](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/application.py) (App Assembly), [`src/sayacode/host/application.py`](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/host/application.py) (Workspace Host), [`src/sayacode/web/app.py`](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/web/app.py) (FastAPI API), [`src/sayacode/agent/runtime.py`](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/agent/runtime.py) (Agent And Graph)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_workbench["Web Workbench"]
  node_frontend["React Workbench<br/>[App.tsx]"]
  node_frontend_state["Workspace State<br/>[useWorkspace.ts]"]
  node_api_client["API Client<br/>[client.ts]"]
  node_web_api["FastAPI API<br/>[app.py]"]
  node_host["Workspace Host<br/>[application.py]"]
  node_cli["CLI Entry<br/>[main.py]"]
end

subgraph group_runtime["Agent Runtime"]
  node_app["App Assembly<br/>[application.py]"]
  node_agent["Agent And Graph<br/>[runtime.py]"]
  node_approvals["Trust And Approval<br/>[middleware.py]"]
end

subgraph group_collaboration["Tasks And Delivery"]
  node_tasks["Subagent Tasks<br/>[manager.py]"]
  node_delivery["Worktree Delivery<br/>[worktree.py]"]
end

subgraph group_capabilities["Agent Capabilities"]
  node_tools["Coding Tools<br/>[catalog.py]"]
  node_extensions["MCP Skills Hooks<br/>[mcp.py]"]
  node_memory["Long-Term Memory<br/>[service.py]"]
  node_diagnostics["Diagnostics<br/>[diagnostics.py]"]
end

subgraph group_state["State And Persistence"]
  node_sessions["Sessions And Workspaces<br/>[workspaces.py]"]
  node_runtime_store[("Checkpoints And Store<br/>[runtime.py]")]
end

node_user(("Developer"))
node_model_provider(("Configured Model Endpoint"))

node_user -->|"submits task"| node_frontend
node_frontend -->|"manages view"| node_frontend_state
node_frontend_state -->|"requests data"| node_api_client
node_api_client -->|"HTTP and SSE"| node_web_api
node_web_api -->|"dispatches requests"| node_host
node_host -->|"assembles workspace"| node_app
node_cli -->|"creates app"| node_app
node_app -->|"runs agent"| node_agent
node_agent -->|"requests model"| node_model_provider
node_app -->|"applies trust policy"| node_approvals
node_app -->|"provides tools"| node_tools
node_app -->|"loads extensions"| node_extensions
node_app -->|"uses memory"| node_memory
node_app -->|"dispatches tasks"| node_tasks
node_tasks -->|"inspects and applies"| node_delivery
node_host -->|"manages workspace sessions"| node_sessions
node_agent -->|"saves run state"| node_runtime_store
node_memory -->|"stores memory"| node_runtime_store
node_host -->|"serves diagnostics"| node_diagnostics
node_host -->|"publishes events"| node_web_api
node_web_api -->|"streams run events"| node_frontend_state

click node_frontend "https://github.com/saya-ch/sayacode/blob/main/frontend/src/App.tsx"
click node_frontend_state "https://github.com/saya-ch/sayacode/blob/main/frontend/src/state/useWorkspace.ts"
click node_api_client "https://github.com/saya-ch/sayacode/blob/main/frontend/src/api/client.ts"
click node_web_api "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/web/app.py"
click node_host "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/host/application.py"
click node_cli "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/cli/main.py"
click node_app "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/application.py"
click node_agent "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/agent/runtime.py"
click node_approvals "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/approvals/middleware.py"
click node_tools "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/tools/catalog.py"
click node_extensions "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/extensions/mcp.py"
click node_memory "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/memory/service.py"
click node_diagnostics "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/diagnostics.py"
click node_tasks "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/tasks/manager.py"
click node_delivery "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/tasks/worktree.py"
click node_sessions "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/host/workspaces.py"
click node_runtime_store "https://github.com/saya-ch/sayacode/blob/main/src/sayacode/agent/runtime.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_frontend,node_frontend_state,node_api_client,node_web_api,node_host,node_cli toneBlue
class node_app,node_agent,node_approvals toneAmber
class node_tasks,node_delivery toneMint
class node_tools,node_extensions,node_memory,node_diagnostics toneRose
class node_sessions,node_runtime_store,node_user,node_model_provider toneIndigo
```

## Components

### Web Workbench

- [React Workbench](https://github.com/saya-ch/sayacode/blob/main/frontend/src/App.tsx): `frontend/src/App.tsx`
- [Workspace State](https://github.com/saya-ch/sayacode/blob/main/frontend/src/state/useWorkspace.ts): `frontend/src/state/useWorkspace.ts`
- [API Client](https://github.com/saya-ch/sayacode/blob/main/frontend/src/api/client.ts): `frontend/src/api/client.ts`
- [FastAPI API](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/web/app.py): `src/sayacode/web/app.py`
- [Workspace Host](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/host/application.py): `src/sayacode/host/application.py`
- [CLI Entry](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/cli/main.py): `src/sayacode/cli/main.py`

### Agent Runtime

- [App Assembly](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/application.py): `src/sayacode/application.py`
- [Agent And Graph](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/agent/runtime.py): `src/sayacode/agent/runtime.py`
- [Trust And Approval](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/approvals/middleware.py): `src/sayacode/approvals/middleware.py`

### Tasks And Delivery

- [Subagent Tasks](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/tasks/manager.py): `src/sayacode/tasks/manager.py`
- [Worktree Delivery](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/tasks/worktree.py): `src/sayacode/tasks/worktree.py`

### Agent Capabilities

- [Coding Tools](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/tools/catalog.py): `src/sayacode/tools/catalog.py`
- [MCP Skills Hooks](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/extensions/mcp.py): `src/sayacode/extensions/mcp.py`
- [Long-Term Memory](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/memory/service.py): `src/sayacode/memory/service.py`
- [Diagnostics](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/diagnostics.py): `src/sayacode/diagnostics.py`

### State And Persistence

- [Sessions And Workspaces](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/host/workspaces.py): `src/sayacode/host/workspaces.py`
- [Checkpoints And Store](https://github.com/saya-ch/sayacode/blob/main/src/sayacode/agent/runtime.py): `src/sayacode/agent/runtime.py`

### Other components

- **Developer**
- **Configured Model Endpoint**

## Connections

- Developer → React Workbench: submits task
- React Workbench → Workspace State: manages view
- Workspace State → API Client: requests data
- API Client → FastAPI API: HTTP and SSE
- FastAPI API → Workspace Host: dispatches requests
- Workspace Host → App Assembly: assembles workspace
- CLI Entry → App Assembly: creates app
- App Assembly → Agent And Graph: runs agent
- Agent And Graph → Configured Model Endpoint: requests model
- App Assembly → Trust And Approval: applies trust policy
- App Assembly → Coding Tools: provides tools
- App Assembly → MCP Skills Hooks: loads extensions
- App Assembly → Long-Term Memory: uses memory
- App Assembly → Subagent Tasks: dispatches tasks
- Subagent Tasks → Worktree Delivery: inspects and applies
- Workspace Host → Sessions And Workspaces: manages workspace sessions
- Agent And Graph → Checkpoints And Store: saves run state
- Long-Term Memory → Checkpoints And Store: stores memory
- Workspace Host → Diagnostics: serves diagnostics
- Workspace Host → FastAPI API: publishes events
- FastAPI API → Workspace State: streams run events
