feat: add absorb command — merge source entity into target

DB: Absorb() merges body (newline-separated), unions tags, demotes
crystallized sources, soft-deletes source. Rejects crystallized targets.

API: POST /api/entities/:id/absorb { source_id }

CLI: nib absorb <target> <source> with prefix ID resolution

Web: absorb button on fluid entities, 'a' keyboard shortcut,
source picker modal
This commit is contained in:
2026-05-14 13:47:08 -04:00
parent 702caae1af
commit 7711240d68
9 changed files with 341 additions and 9 deletions
+1
View File
@@ -31,6 +31,7 @@ func NewRouter(store *db.Store, devMode bool, webFS ...fs.FS) chi.Router {
r.Post("/entities/{id}/promote", promoteEntity(store))
r.Post("/entities/{id}/demote", demoteEntity(store))
r.Post("/entities/{id}/use", useEntity(store))
r.Post("/entities/{id}/absorb", absorbEntity(store))
r.Get("/tags", listTags(store))
})