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
+27
View File
@@ -483,6 +483,33 @@ main {
font-family: var(--font-mono);
}
/* Absorb modal */
.absorb-list {
max-height: 300px;
overflow-y: auto;
}
.absorb-source-item {
display: flex;
align-items: center;
gap: 10px;
padding: 8px 12px;
cursor: pointer;
border-radius: var(--radius);
transition: background 0.1s;
}
.absorb-source-item:hover {
background: var(--bg-hover);
}
.absorb-source-item .entity-body {
font-size: 13px;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
}
/* Responsive */
@media (max-width: 900px) {
main { grid-template-columns: 1fr; }