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
+9
View File
@@ -59,6 +59,15 @@
</div>
</div>
<div id="absorb-modal" class="modal hidden">
<div class="modal-backdrop"></div>
<div class="modal-content">
<h3>absorb source into target</h3>
<div id="absorb-source-list" class="absorb-list"></div>
<button class="modal-close">esc to cancel</button>
</div>
</div>
<script src="/app.js"></script>
</body>
</html>