Changeset 0.19.2 (#84)
This commit is contained in:
116
docs/DESIGN-0.19.2.md
Normal file
116
docs/DESIGN-0.19.2.md
Normal file
@@ -0,0 +1,116 @@
|
||||
# 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.
|
||||
@@ -72,6 +72,10 @@ v0.18.1 Side Panel Architecture ✅ (single-slot, ctx.ui primitives, mermaid ref
|
||||
│
|
||||
v0.19.0 Projects / Workspaces ✅ (project groups, KB resolution, drag-drop sidebar)
|
||||
│
|
||||
v0.19.1 Active Project + System Prompt + Detail Panel ✅
|
||||
│
|
||||
v0.19.2 Project Persona Default + Archive + Reorder ✅
|
||||
│
|
||||
v0.20.0 Notifications + @mention Routing + Multi-model
|
||||
│
|
||||
v0.21.0 Extension Surfaces + Modes (depends on CM6 from v0.17.2)
|
||||
@@ -527,15 +531,76 @@ Depends on: user groups (v0.16.0), knowledge bases (v0.14.0).
|
||||
|
||||
**Deferred to later versions:**
|
||||
- Project creation dialog (name, description, default Persona, default KBs) — using prompt() for now
|
||||
- Project detail panel (KB + note management within a project)
|
||||
- Project-level Persona default
|
||||
- ~~Project detail panel (KB + note management within a project)~~ → v0.19.1
|
||||
- ~~Project-level Persona default~~ → v0.19.2
|
||||
- Folders within projects
|
||||
- Project templates
|
||||
- Admin-level team/global project management
|
||||
- Project-specific files (full project-level upload — deferred for proper architecture)
|
||||
- Notifications (moved to v0.20.0)
|
||||
|
||||
---
|
||||
|
||||
## ✅ v0.19.1 — Active Project + Project System Prompt + Detail Panel
|
||||
|
||||
Quality-of-life improvements making projects usable for daily workflow.
|
||||
No migrations.
|
||||
|
||||
Depends on: v0.19.0 Projects/Workspaces.
|
||||
|
||||
**Active Project**
|
||||
- [x] Pin a project as active — new chats auto-assign via `addChannelToProject` after channel creation
|
||||
- [x] `App.activeProjectId` persisted in `localStorage('cs-active-project')`
|
||||
- [x] Visual indicator: `.project-group.active` accent border + 📌 icon
|
||||
- [x] Toggle from project ⋯ menu ("Pin as active" / "Unpin project")
|
||||
- [x] Cleared on project delete
|
||||
|
||||
**Project System Prompt**
|
||||
- [x] Per-project instructions in `projects.settings` JSONB (`system_prompt` key)
|
||||
- [x] Injected in `loadConversation` between persona/channel prompt and KB hint
|
||||
- [x] Merge semantics on update: reads existing JSONB, overlays patch keys, writes back
|
||||
- [x] Both Postgres and SQLite stores updated
|
||||
|
||||
**Project Detail Panel**
|
||||
- [x] Registered with `PanelRegistry` (same pattern as Notes, Preview)
|
||||
- [x] System prompt textarea with Save button
|
||||
- [x] KB management: list with names (LEFT JOIN), [+ Add] picker dropdown, [✕] remove
|
||||
- [x] Notes list with titles (LEFT JOIN), [✕] unbind
|
||||
- [x] Accessible from project ⋯ menu → "Project settings"
|
||||
|
||||
**Bug Fixes**
|
||||
- [x] `renderChatList` early return prevented project groups from rendering when zero chats
|
||||
- [x] Recent section drop target: "Drop chats here to unassign" hint with `min-height: 40px`
|
||||
|
||||
---
|
||||
|
||||
## ✅ v0.19.2 — Project Persona Default + Archive + Channel Reorder
|
||||
|
||||
Completes the project management feature set. No migrations.
|
||||
|
||||
Depends on: v0.19.1.
|
||||
|
||||
**Project Persona Default**
|
||||
- [x] Bind a persona to a project via detail panel dropdown
|
||||
- [x] Stored in `projects.settings.persona_id`
|
||||
- [x] Resolution chain: explicit `req.PresetID` → project persona → none
|
||||
- [x] Inherits model, provider config, temperature, max tokens, system prompt as defaults
|
||||
|
||||
**Project Archive Toggle**
|
||||
- [x] Checkbox in project detail panel
|
||||
- [x] Archived projects hidden from sidebar by default
|
||||
- [x] "▸ Show archived (N)" toggle button below project list
|
||||
- [x] Chats in hidden-archived projects spill into Recent section (never vanish)
|
||||
- [x] Dimmed + italic visual treatment for archived groups
|
||||
|
||||
**Channel Reorder**
|
||||
- [x] `loadProjectChannelPositions()` fetches server-persisted positions on startup
|
||||
- [x] `_getReorderedProjectChats()` sorts project chats by stored position
|
||||
- [x] Right-click context menu: ↑ Move up / ↓ Move down (optimistic swap + API call)
|
||||
- [x] Order maintained across add/remove/move operations
|
||||
|
||||
---
|
||||
|
||||
## v0.20.0 — Notifications + @mention Routing + Multi-model
|
||||
|
||||
Notification infrastructure that makes collaboration real-time, plus
|
||||
@@ -778,6 +843,13 @@ based on need.
|
||||
- "Group" scope badge on model selector / KB list: show access-source annotation so users see _why_ they have access (global, team, group grant). Requires backend to include `access_source` in list responses.
|
||||
- Per-provider model preferences: `user_model_settings` unique key is `(user_id, model_id)` — same model from different providers shares one visibility toggle. Needs `provider_config_id` dimension in DB constraint, store, API, and frontend `hiddenModels` keying. Frontend composite key (`configId:modelId`) already exists in `App.models[].id`.
|
||||
|
||||
**Projects — Future**
|
||||
- Project-specific files: full project-level upload (own endpoint, storage path, UI surface — not just channel attachment re-linking)
|
||||
- Project templates: create new projects from predefined configurations (persona, KBs, system prompt)
|
||||
- Project creation dialog: replace `prompt()` with proper modal (name, description, persona, KB picker)
|
||||
- Admin-level project management: cross-instance visibility, reassign ownership, enforce team policies (scope: enterprise only, BYOK personal projects stay private)
|
||||
- Sub-projects / nested hierarchy: child inherits parent KBs, system prompt, persona (deferred until usage patterns clarify need vs tags/labels)
|
||||
|
||||
**Knowledge Bases — Future**
|
||||
- KB auto-injection: top-K chunk prepend to system prompt, context budget aware, per-channel toggle (latency budgeting required)
|
||||
- Hybrid search: combine vector similarity with full-text `tsvector`, re-rank
|
||||
|
||||
Reference in New Issue
Block a user