3.3 KiB
v0.15.0 Phase 1 — Changeset Notes
Files included in this zip (new or fully replaced)
server/treepath/path.go NEW — PathMessage, GetActivePath, etc.
server/treepath/summary.go NEW — IsSummaryMessage, FindSummaryBoundary
server/treepath/cursor.go NEW — UpdateCursor, NextSiblingIndex
server/treepath/siblings.go NEW — GetSiblingCount, GetSiblings, FindLeafFromMessage
server/compaction/compaction.go NEW — Service, Compact, CheckRateLimit
server/handlers/tree.go REPLACED — thin wrappers delegating to treepath
server/handlers/summarize.go REPLACED — thin HTTP wrapper using compaction.Service
src/js/settings-handlers.js REPLACED — bug fixes for display name + role config
Surgical edits needed in existing files
1. server/handlers/completion.go
Delete the isSummaryMessage function (lines ~832–841). It is now
defined in treepath/summary.go and aliased in handlers/tree.go.
Without this deletion, the build fails with a duplicate function error.
// DELETE this entire function from completion.go:
// isSummaryMessage checks if a PathMessage has summary metadata.
func isSummaryMessage(m *PathMessage) bool {
if m.Metadata == nil {
return false
}
var meta map[string]interface{}
if err := json.Unmarshal(*m.Metadata, &meta); err != nil {
return false
}
return meta["type"] == "summary"
}
No other changes needed in completion.go — the isSummaryMessage calls
throughout the file now resolve via the alias in handlers/tree.go.
2. server/main.go
Change the summarize handler wiring (~line 252). Old constructor
takes (stores, roleResolver), new one takes (*compaction.Service).
// ── BEFORE ──
// Summarize & Continue
summarize := handlers.NewSummarizeHandler(stores, roleResolver)
protected.POST("/channels/:id/summarize", summarize.Summarize)
// ── AFTER ──
// Compaction service (shared by manual summarize handler + future auto-scanner)
compactionSvc := compaction.NewService(stores, roleResolver)
// Summarize & Continue (manual compaction via HTTP)
summarize := handlers.NewSummarizeHandler(compactionSvc)
protected.POST("/channels/:id/summarize", summarize.Summarize)
Add import at top of main.go:
"git.gobha.me/xcaliber/chat-switchboard/compaction"
Bug fixes included
Display Name not saved or used
handleSaveSettings() now also saves display_name and email via
API.updateProfile(). Updates API.user and calls UI.updateUser() so
the sidebar reflects the change immediately.
User utility model role not displayed after save
_initUserRolePrimitive() → fetchModels callback now calls the
global fetchModels() (which refreshes App.models from the server)
before returning the model list. This ensures recently added personal
provider models appear in the role config dropdown after tab switch or
save-refresh.
Verification
After applying all changes:
cd server && go build .— should compile cleanly- Existing integration tests should pass (no behavior change)
- Manual test: Settings → Profile → change display name → Save → verify sidebar updates and value persists on reload
- Manual test: Settings → Model Roles → pick personal provider + model → Save → verify dropdown shows saved values after refresh