Contents
8. Importing foreign formats
OpenLoom is the export target; import should accept any loom. Adapters normalize into the OpenLoom model. Canonical mappings:
8.1 socketteer/loom (original Python loom)
Detect: object with nested root node carrying text/children. Also accept
a bare node or bare node array (its loader's leniency, mirrored). Map: nested
children → continuation edges in array order; meta.source
AI|prompt|mixed → model|human|mixed; meta.creation_timestamp →
createdAt; generation.id+index → resolve into tree-level
model_responses for Tier 1/3 provenance; tags (incl. bookmark) →
meta.bookmarked/meta.tags; chapters/summaries/canonical →
extensions["socketteer-loom"]; selected_node_id → currentNodeId.
8.2 Loomsidian (cosmicoptima/loom for Obsidian)
Detect: NoteState shape — object with nodes map whose values carry
parentId + unread, plus current. Map: parentId → continuation edges
(sibling order undefined in source; preserve map insertion order);
bookmarked → meta.bookmarked; no authorship exists → role: "human" for
the root, "model" otherwise is wrong often enough that adapters SHOULD mark
all non-root nodes "mixed" unless better information exists; unread,
collapsed, lastVisited → extensions["loomsidian"].
8.3 MiniLoom (JD-P/minihf)
Detect: object with loomTree.nodeStore or nodes carrying patch +
type: root|user|gen. Nodes are diff-match-patch patches against the
parent's rendered text; adapters MUST materialize each node's full text by
applying the patch chain from the root, storing the result as text content and
the original patch under extensions["miniloom"].patch. type user|gen →
human|model; rating → meta.rating; summary → meta.note.
8.4 General adapter rules
- Never invent provenance: if the source has no generation info, emit none.
- Mint ULIDs for missing/duplicate IDs; keep originals in
extensions["<source>"].originalId. - Timestamps you can't parse → omit, don't guess.
- Anything you parsed but can't map → the source-named extension namespace.
