@lyfie/luthor-headless is a typed extension runtime built on Lexical.
commands and activeStates.createEditorSystem<typeof extensions>().<Provider extensions={extensions}>.useEditor() in UI components.<RichText /> (or your own contenteditable plugin stack).packages/headless/src/core/createEditorSystem.tsx
initPrioritypackages/headless/src/core/createExtension.ts
packages/headless/src/extensions/**
packages/headless/src/core/markdown.ts and html.ts
packages/headless/src/core/metadata-envelope.ts
getCommands(...).getStateQueries(...).activeStates in sync on editor updates.config.position.export.toJSON()import.fromJSON(...)listeners.registerUpdate(...)listeners.registerPaste(...)Each extension follows the Extension interface:
name, category, configregister(editor) => cleanupgetCommands(editor)getStateQueries(editor) (optional)getPlugins()getNodes() (optional)Use createExtension(...) for simple command/plugin additions.
Use BaseExtension for richer lifecycle customization.
extensionsAPI.add/remove/reorder is intentionally read-only at runtime and logs warnings.
To change loaded extensions, pass a new extensions array to <Provider />.
RichText / richTextExtension supports:
classNames and styles for container/content/placeholdernonEditableVisualModeonEditIntent callback (useful for read-first surfaces)Source conversion is JSON-centered:
jsonToMarkdown / markdownToJSONjsonToHTML / htmlToJSONMore detail: Metadata Comment System.
packages/headless/src/extensionspackages/headless/src/extensions/types.tspackages/headless/src/core/createEditorSystem.tsxpackages/headless/src/core/markdown.ts, packages/headless/src/core/html.ts, packages/headless/src/core/metadata-envelope.ts