6.8 KiB
6.8 KiB
v0.19.1 — Active Projects, Project System Prompt, Project Detail Panel
Status: Implementation
Depends on: v0.19.0 Projects/Workspaces
Overview
Three tightly-scoped improvements that make projects genuinely usable for daily workflow rather than just organizational containers:
- Active Project — one-click project activation so new chats auto-assign without drag-drop.
- Project System Prompt — per-project instructions injected into every chat within the project at completion time.
- Project Detail Panel — side panel UI for managing a project's system prompt, KB bindings, and notes.
1. Active Project
State
| Location | Key | Type |
|---|---|---|
App.activeProjectId |
runtime | string | null |
localStorage |
cs-active-project |
string | null |
Behavior
- Click project header's pin icon (or "Set as active" in ⋯ menu) to activate.
- Active project gets a visual indicator: left accent border + subtle background tint using the project's color.
- Creating a new chat (via
sendMessagewhen!App.currentChatId) auto-callsaddChannelToProject(activeProjectId, newChannelId)and setschat.projectIdclient-side. - Only one project can be active at a time. Clicking the pin on an already-active project deactivates it.
- Active state persists across page reloads via
localStorage. - If the active project is deleted,
activeProjectIdis cleared.
Files Changed
| File | Change |
|---|---|
src/js/app.js |
Add activeProjectId: null to App, restore from localStorage on init |
src/js/projects-ui.js |
setActiveProject(id), clearActiveProject(), menu items, pin icon |
src/js/chat.js |
Auto-assign in sendMessage after channel creation |
src/js/ui-core.js |
.active class on project group in renderChatList |
src/css/styles.css |
.project-group.active styling |
2. Project System Prompt
Injection Order
1. Admin system prompt (global policy — no opt-out)
2. Persona OR channel prompt (role/character definition)
3. ▸ PROJECT system prompt (project-specific context) ← NEW
4. KB hint (available knowledge bases)
5. Memory hint (user facts from v0.18.0)
6. Summary / conversation (message history)
The project prompt sits between the role definition and the KB hint. This lets a persona define "you are a coding assistant" while the project adds "this project is the React dashboard for client X."
Backend Flow (completion.go)
In loadConversation, after the persona/channel system prompt block:
// ── Project system prompt (v0.19.1) ──
if h.stores.Projects != nil {
projID, _ := h.stores.Projects.GetProjectIDForChannel(ctx, channelID)
if projID != "" {
proj, err := h.stores.Projects.GetByID(ctx, projID)
if err == nil {
if sp, ok := proj.Settings["system_prompt"].(string); ok && sp != "" {
messages = append(messages, providers.Message{
Role: "system",
Content: sp,
})
}
}
}
}
Storage
Uses existing projects.settings JSONB column. No migration needed.
{
"system_prompt": "You are helping build the Chat Switchboard project..."
}
Files Changed
| File | Change |
|---|---|
server/handlers/completion.go |
Inject project system prompt in loadConversation |
3. Project Detail Panel
Registration
Follows the same PanelRegistry.register() pattern as notes and
preview panels. Registered during app init via _registerProjectPanel().
Panel Layout
┌─────────────────────────────┐
│ Project: <name> [✕] │ ← header (editable name)
├─────────────────────────────┤
│ System Prompt │
│ ┌─────────────────────────┐ │
│ │ textarea (auto-resize) │ │
│ └─────────────────────────┘ │
│ [Save] │
├─────────────────────────────┤
│ Knowledge Bases [+] │
│ ┌─────────────────────────┐ │
│ │ • KB Alpha [✕] │ │
│ │ • KB Beta [✕] │ │
│ └─────────────────────────┘ │
│ (empty: "No KBs bound") │
├─────────────────────────────┤
│ Notes │
│ ┌─────────────────────────┐ │
│ │ • Meeting notes [✕] │ │
│ │ • Design spec [✕] │ │
│ └─────────────────────────┘ │
│ (empty: "No notes") │
├─────────────────────────────┤
│ Color [●] │
│ Archived [ ] │
└─────────────────────────────┘
Interactions
- System prompt: Textarea with debounced save (1s) or explicit Save
button. Writes to
PUT /projects/:idwithsettings: { system_prompt: "..." }. - KB add: [+] opens a dropdown of available KBs (from
GET /knowledge-bases), filtered to exclude already-bound ones. CallsPOST /projects/:id/knowledge-bases. - KB remove: [✕] calls
DELETE /projects/:id/knowledge-bases/:kbId. - Notes: Read-only list with [✕] to unbind. Notes are auto-associated from channel creation (v0.19.0).
- Color: Reuses the invisible color picker pattern from
setProjectColor(). - Open trigger: Click project name in sidebar header, or "Project details" in ⋯ menu.
Files Changed
| File | Change |
|---|---|
src/index.html |
Add #sidePanelProject div inside #sidePanelBody |
src/js/projects-ui.js |
openProjectPanel(id), _registerProjectPanel(), panel rendering, KB/note management |
src/js/app.js |
Call _registerProjectPanel() in init |
src/css/styles.css |
.project-panel-* styles |
Files Summary
| File | Phase | Type |
|---|---|---|
server/handlers/completion.go |
2 | Modified |
src/js/app.js |
1,3 | Modified |
src/js/projects-ui.js |
1,3 | Modified |
src/js/chat.js |
1 | Modified |
src/js/ui-core.js |
1 | Modified |
src/css/styles.css |
1,3 | Modified |
src/index.html |
3 | Modified |
VERSION |
— | Modified (0.19.0 → 0.19.1) |
CHANGELOG.md |
— | Modified |
No new files. No migrations. Backend change is a single injection point in completion.go.