Intrinsic Labs

OpenLoom

A protocol for loom interfaces

Current Version: 2.0 (draft)

← Aspen Grove

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.