117 lines
3.2 KiB
Markdown
117 lines
3.2 KiB
Markdown
# v0.19.2 — Project Persona Default, Archive Toggle, Channel Reorder
|
|
|
|
**Status:** Implementation
|
|
**Depends on:** v0.19.1
|
|
|
|
---
|
|
|
|
## 1. Project-level Persona Default
|
|
|
|
### Concept
|
|
|
|
Bind a persona to a project so all chats inherit model, system prompt,
|
|
and parameters without selecting it each time. The persona acts as a
|
|
fallback when no explicit preset is chosen per-message.
|
|
|
|
### Resolution Chain (completion.go)
|
|
|
|
```
|
|
1. Explicit req.PresetID → highest priority
|
|
2. Project persona default → fallback when no explicit preset ← NEW
|
|
3. No persona → bare model, no persona context
|
|
```
|
|
|
|
### Storage
|
|
|
|
`projects.settings` JSONB:
|
|
```json
|
|
{ "persona_id": "uuid-here", "system_prompt": "..." }
|
|
```
|
|
|
|
### Backend Changes
|
|
|
|
In `completion.go`, after the explicit preset block, before
|
|
`resolveConfig`:
|
|
|
|
```go
|
|
// ── Project persona fallback (v0.19.2) ──
|
|
if req.PresetID == "" && h.stores.Projects != nil {
|
|
projID, _ := h.stores.Projects.GetProjectIDForChannel(ctx, channelID)
|
|
if projID != "" {
|
|
proj, _ := h.stores.Projects.GetByID(ctx, projID)
|
|
if proj != nil {
|
|
if pid, ok := proj.Settings["persona_id"].(string); ok && pid != "" {
|
|
preset := ResolvePreset(h.stores, pid, userID)
|
|
if preset != nil {
|
|
personaID = preset.ID
|
|
if req.Model == "" { req.Model = preset.BaseModelID }
|
|
// ... same defaults as explicit preset
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
```
|
|
|
|
### Frontend Changes
|
|
|
|
Project detail panel: persona picker dropdown below system prompt.
|
|
Lists available personas, saves to `settings.persona_id`.
|
|
|
|
---
|
|
|
|
## 2. Project Archive Toggle
|
|
|
|
### Behavior
|
|
|
|
- Toggle in project detail panel (checkbox)
|
|
- Archived projects hidden from sidebar by default
|
|
- "Show archived" toggle at bottom of sidebar (or in panel)
|
|
- Uses existing `is_archived` column — no migration needed
|
|
|
|
### Files Changed
|
|
|
|
- `src/js/projects-ui.js` — archive toggle in panel, sidebar filter
|
|
- `src/js/ui-core.js` — filter archived in renderChatList
|
|
- `src/css/styles.css` — dimmed style for archived
|
|
|
|
---
|
|
|
|
## 3. Channel Reorder Within Project
|
|
|
|
### Behavior
|
|
|
|
- Dragging a chat within the same project group reorders it
|
|
- Drop between chats inserts at that position
|
|
- Calls `PUT /projects/:id/channels/reorder` with new order
|
|
- Position persisted server-side, respected on next load
|
|
|
|
### Implementation
|
|
|
|
- `onProjectDrop` detects same-project reorder vs cross-project move
|
|
- Compute new channel order from DOM after drop
|
|
- Channels within project sorted by position from
|
|
`project_channels.position` (loaded alongside projects)
|
|
|
|
### Files Changed
|
|
|
|
- `src/js/projects-ui.js` — reorder logic
|
|
- `src/js/ui-core.js` — sort projChats by position
|
|
- `src/js/app.js` — store project channel positions
|
|
|
|
---
|
|
|
|
## Files Summary
|
|
|
|
| File | Change |
|
|
|------|--------|
|
|
| `server/handlers/completion.go` | Project persona fallback |
|
|
| `src/js/projects-ui.js` | Persona picker, archive toggle, reorder |
|
|
| `src/js/ui-core.js` | Archive filter, position sort |
|
|
| `src/js/app.js` | Channel positions state |
|
|
| `src/css/styles.css` | Archive styles |
|
|
| `VERSION` | 0.19.1 → 0.19.2 |
|
|
| `CHANGELOG.md` | New entry |
|
|
|
|
No migrations. No new files.
|