[{"data":1,"prerenderedAt":1809},["ShallowReactive",2],{"navigation_docs":3,"-guides-knowledge-graph":412,"-guides-knowledge-graph-surround":1804},[4,38,84,326,386],{"title":5,"icon":6,"path":7,"stem":8,"children":9,"page":37},"Getting started","i-lucide-rocket","\u002Fgetting-started","1.getting-started",[10,15,20,24,28,32],{"title":11,"path":12,"stem":13,"icon":14},"Introduction","\u002Fgetting-started\u002Fintroduction","1.getting-started\u002F1.introduction","i-lucide-book-open",{"title":16,"path":17,"stem":18,"icon":19},"Installation","\u002Fgetting-started\u002Finstallation","1.getting-started\u002F2.installation","i-lucide-download",{"title":21,"path":22,"stem":23,"icon":6},"Quick start: Nuxt","\u002Fgetting-started\u002Fquick-start-nuxt","1.getting-started\u002F3.quick-start-nuxt",{"title":25,"path":26,"stem":27,"icon":6},"Quick start: plain Vue","\u002Fgetting-started\u002Fquick-start-vue","1.getting-started\u002F4.quick-start-vue",{"title":29,"path":30,"stem":31,"icon":6},"Quick start: React","\u002Fgetting-started\u002Fquick-start-react","1.getting-started\u002F5.quick-start-react",{"title":33,"path":34,"stem":35,"icon":36},"Glossary","\u002Fgetting-started\u002Fglossary","1.getting-started\u002F6.glossary","i-lucide-book-a",false,{"title":39,"icon":40,"path":41,"stem":42,"children":43,"page":37},"Tutorial","i-lucide-graduation-cap","\u002Ftutorial","2.tutorial",[44,49,54,59,64,69,74,79],{"title":45,"path":46,"stem":47,"icon":48},"Tutorial: overview","\u002Ftutorial\u002Foverview","2.tutorial\u002F1.overview","i-lucide-map",{"title":50,"path":51,"stem":52,"icon":53},"Chapter 2: A simple editor","\u002Ftutorial\u002Fsimple-editor","2.tutorial\u002F2.simple-editor","i-lucide-pencil",{"title":55,"path":56,"stem":57,"icon":58},"Chapter 3: Compose features","\u002Ftutorial\u002Fcompose-features","2.tutorial\u002F3.compose-features","i-lucide-blocks",{"title":60,"path":61,"stem":62,"icon":63},"Chapter 4: Your own block, path A","\u002Ftutorial\u002Fown-block-path-a","2.tutorial\u002F4.own-block-path-a","i-lucide-square-plus",{"title":65,"path":66,"stem":67,"icon":68},"Chapter 5: Your own feature, path B","\u002Ftutorial\u002Fown-feature-path-b","2.tutorial\u002F5.own-feature-path-b","i-lucide-puzzle",{"title":70,"path":71,"stem":72,"icon":73},"Chapter 6: Backend and collaboration","\u002Ftutorial\u002Fbackend-and-collaboration","2.tutorial\u002F6.backend-and-collaboration","i-lucide-users",{"title":75,"path":76,"stem":77,"icon":78},"Chapter 7: AI","\u002Ftutorial\u002Fai","2.tutorial\u002F7.ai","i-lucide-sparkles",{"title":80,"path":81,"stem":82,"icon":83},"Chapter 8: The React surface","\u002Ftutorial\u002Freact-surface","2.tutorial\u002F8.react-surface","i-lucide-atom",{"title":85,"icon":14,"path":86,"stem":87,"children":88,"page":37},"Guides","\u002Fguides","3.guides",[89,93,98,103,108,112,116,121,126,130,134,139,144,149,154,159,164,169,174,179,184,189,194,199,204,209,213,218,223,228,233,237,242,247,251,256,261,266,271,276,281,286,291,295,302,307,311,316,321],{"title":90,"path":91,"stem":92,"icon":58},"Feature composition and entries","\u002Fguides\u002Fcomposition","3.guides\u002F1.composition",{"title":94,"path":95,"stem":96,"icon":97},"Media, mentions and transcript features","\u002Fguides\u002Fmedia-mentions-transcript","3.guides\u002F10.media-mentions-transcript","i-lucide-image",{"title":99,"path":100,"stem":101,"icon":102},"Authors and comments","\u002Fguides\u002Fauthors-and-comments","3.guides\u002F11.authors-and-comments","i-lucide-message-square-text",{"title":104,"path":105,"stem":106,"icon":107},"Themes (Obsidian)","\u002Fguides\u002Fthemes","3.guides\u002F12.themes","i-lucide-palette",{"title":109,"path":110,"stem":111,"icon":58},"Composites and the settings UI","\u002Fguides\u002Fcomposites","3.guides\u002F13.composites",{"title":113,"path":114,"stem":115,"icon":78},"AI","\u002Fguides\u002Fai","3.guides\u002F14.ai",{"title":117,"path":118,"stem":119,"icon":120},"Document tree","\u002Fguides\u002Fdocument-tree","3.guides\u002F15.document-tree","i-lucide-folder-tree",{"title":122,"path":123,"stem":124,"icon":125},"Markdown and code","\u002Fguides\u002Fmarkdown-and-code","3.guides\u002F16.markdown-and-code","i-lucide-file-code",{"title":127,"path":128,"stem":129,"icon":83},"Advanced editor in React","\u002Fguides\u002Fadvanced-react","3.guides\u002F17.advanced-react",{"title":131,"path":132,"stem":133,"icon":6},"Kitchen sink: learning path","\u002Fguides\u002Fadvanced-nuxt-example","3.guides\u002F18.advanced-nuxt-example",{"title":135,"path":136,"stem":137,"icon":138},"Production","\u002Fguides\u002Fproduction","3.guides\u002F19.production","i-lucide-server",{"title":140,"path":141,"stem":142,"icon":143},"Register the Nuxt module","\u002Fguides\u002Fnuxt-module","3.guides\u002F2.nuxt-module","i-lucide-package",{"title":145,"path":146,"stem":147,"icon":148},"Storage adapters, comment stores, Nitro host","\u002Fguides\u002Fstorage-adapters","3.guides\u002F20.storage-adapters","i-lucide-database",{"title":150,"path":151,"stem":152,"icon":153},"Migrating from #tiptap-editor","\u002Fguides\u002Fmigration","3.guides\u002F21.migration","i-lucide-arrow-right-left",{"title":155,"path":156,"stem":157,"icon":158},"Content tree mechanics","\u002Fguides\u002Fcontent-tree","3.guides\u002F22.content-tree","i-lucide-git-fork",{"title":160,"path":161,"stem":162,"icon":163},"Block capabilities, abilities and actions","\u002Fguides\u002Fblock-capabilities","3.guides\u002F23.block-capabilities","i-lucide-shield-check",{"title":165,"path":166,"stem":167,"icon":168},"Block types in code and JSON","\u002Fguides\u002Fblock-types","3.guides\u002F24.block-types","i-lucide-shapes",{"title":170,"path":171,"stem":172,"icon":173},"Derive methods and the Derivation index","\u002Fguides\u002Fderive-methods","3.guides\u002F25.derive-methods","i-lucide-git-branch-plus",{"title":175,"path":176,"stem":177,"icon":178},"Block properties and Property definitions","\u002Fguides\u002Fblock-properties","3.guides\u002F26.block-properties","i-lucide-sliders-horizontal",{"title":180,"path":181,"stem":182,"icon":183},"Image studio","\u002Fguides\u002Fimage-studio","3.guides\u002F27.image-studio","i-lucide-image-plus",{"title":185,"path":186,"stem":187,"icon":188},"Prüfung and Freigabestatus","\u002Fguides\u002Fpruefung","3.guides\u002F28.pruefung","i-lucide-stamp",{"title":190,"path":191,"stem":192,"icon":193},"Workspace: find, read, reference and embed Blocks across Documents","\u002Fguides\u002Fworkspace","3.guides\u002F29.workspace","i-lucide-network",{"title":195,"path":196,"stem":197,"icon":198},"EditorPorts: auth and storage","\u002Fguides\u002Feditor-ports","3.guides\u002F3.editor-ports","i-lucide-plug",{"title":200,"path":201,"stem":202,"icon":203},"Collections: an ordered list of Blocks","\u002Fguides\u002Fcollections","3.guides\u002F30.collections","i-lucide-list-checks",{"title":205,"path":206,"stem":207,"icon":208},"Data views: a query shown as table, list or board","\u002Fguides\u002Fdata-views","3.guides\u002F31.data-views","i-lucide-table-properties",{"title":210,"path":211,"stem":212,"icon":193},"Explore: backlinks, related Blocks and the trail","\u002Fguides\u002Fexplore","3.guides\u002F32.explore",{"title":214,"path":215,"stem":216,"icon":217},"Render: export a Block or a Document to a file","\u002Fguides\u002Frender","3.guides\u002F33.render","i-lucide-file-output",{"title":219,"path":220,"stem":221,"icon":222},"Importers: what a dropped file becomes","\u002Fguides\u002Fimporters","3.guides\u002F34.importers","i-lucide-file-input",{"title":224,"path":225,"stem":226,"icon":227},"Templates: start a Document from a Dokumentvorlage","\u002Fguides\u002Ftemplates","3.guides\u002F35.templates","i-lucide-file-stack",{"title":229,"path":230,"stem":231,"icon":232},"Citations","\u002Fguides\u002Fcitations","3.guides\u002F36.citations","i-lucide-quote",{"title":234,"path":235,"stem":236,"icon":163},"AI proposals and the export check","\u002Fguides\u002Fexport-check","3.guides\u002F37.export-check",{"title":238,"path":239,"stem":240,"icon":241},"Query: filter, sort, group and total Blocks","\u002Fguides\u002Fquery","3.guides\u002F38.query","i-lucide-list-filter",{"title":243,"path":244,"stem":245,"icon":246},"Edges: backlinks and authored connections","\u002Fguides\u002Fedges","3.guides\u002F39.edges","i-lucide-link-2",{"title":248,"path":249,"stem":250,"icon":163},"Server routes and authentication","\u002Fguides\u002Froutes-and-auth","3.guides\u002F4.routes-and-auth",{"title":252,"path":253,"stem":254,"icon":255},"Speech: text to audio, and subtitle files","\u002Fguides\u002Fspeech","3.guides\u002F41.speech","i-lucide-audio-lines",{"title":257,"path":258,"stem":259,"icon":260},"Graph: the Edges around a Block","\u002Fguides\u002Fgraph","3.guides\u002F42.graph","i-lucide-waypoints",{"title":262,"path":263,"stem":264,"icon":265},"PDF viewer: passages, anchors and quotes","\u002Fguides\u002Fpdf-viewer","3.guides\u002F43.pdf-viewer","i-lucide-file-search",{"title":267,"path":268,"stem":269,"icon":270},"Obsidian: import and export a vault","\u002Fguides\u002Fobsidian","3.guides\u002F44.obsidian","i-lucide-folder-input",{"title":272,"path":273,"stem":274,"icon":275},"Typst: render a Document as a PDF with citations","\u002Fguides\u002Ftypst","3.guides\u002F45.typst","i-lucide-file-text",{"title":277,"path":278,"stem":279,"icon":280},"Audio: read aloud, mixdown and ElevenLabs","\u002Fguides\u002Faudio","3.guides\u002F46.audio","i-lucide-audio-waveform",{"title":282,"path":283,"stem":284,"icon":285},"Slides: decks, slide layouts and exports","\u002Fguides\u002Fslides","3.guides\u002F47.slides","i-lucide-presentation",{"title":287,"path":288,"stem":289,"icon":290},"Knowledge graph: sources and concepts beside the Documents","\u002Fguides\u002Fknowledge-graph","3.guides\u002F49.knowledge-graph","i-lucide-share-2",{"title":292,"path":293,"stem":294,"icon":78},"AI configuration and secrets","\u002Fguides\u002Fai-configuration","3.guides\u002F5.ai-configuration",{"title":296,"path":297,"stem":298,"children":299,"icon":301},"Index on Postgres: typos, meaning and SQL pushdown","\u002Fguides\u002Findex-pg","3.guides\u002F50.index-pg",[300],{"title":296,"path":297,"stem":298,"icon":301},"i-lucide-database-zap",{"title":303,"path":304,"stem":305,"icon":306},"Charts: bar, line, pie and scatter over a query","\u002Fguides\u002Fcharts","3.guides\u002F51.charts","i-lucide-chart-column",{"title":308,"path":309,"stem":310,"icon":73},"Collaboration on the client","\u002Fguides\u002Fcollaboration","3.guides\u002F6.collaboration",{"title":312,"path":313,"stem":314,"icon":315},"Block UI (drag handle, hover actions)","\u002Fguides\u002Fblock-ui","3.guides\u002F7.block-ui","i-lucide-grip-vertical",{"title":317,"path":318,"stem":319,"icon":320},"Settings and app lifetime","\u002Fguides\u002Fsettings","3.guides\u002F8.settings","i-lucide-settings",{"title":322,"path":323,"stem":324,"icon":325},"Language","\u002Fguides\u002Flanguage","3.guides\u002F9.language","i-lucide-languages",{"title":327,"icon":14,"path":328,"stem":329,"children":330,"page":37},"Reference","\u002Freference","4.reference",[331,335,339,344,348,352,356,360,364,368,373,378,382],{"title":332,"path":333,"stem":334,"icon":143},"Public exports","\u002Freference\u002Fexports","4.reference\u002F1.exports",{"title":336,"path":337,"stem":338,"icon":173},"Derive method contract","\u002Freference\u002Fderive-methods","4.reference\u002F10.derive-methods",{"title":340,"path":341,"stem":342,"icon":343},"Changelog","\u002Freference\u002Fchangelog","4.reference\u002F11.changelog","i-lucide-history",{"title":345,"path":346,"stem":347,"icon":217},"Renderer port","\u002Freference\u002Frenderer-port","4.reference\u002F12.renderer-port",{"title":349,"path":350,"stem":351,"icon":255},"Speech port","\u002Freference\u002Fspeech-port","4.reference\u002F13.speech-port",{"title":353,"path":354,"stem":355,"icon":58},"Presets and features","\u002Freference\u002Fpresets-and-features","4.reference\u002F2.presets-and-features",{"title":357,"path":358,"stem":359,"icon":68},"Feature contract","\u002Freference\u002Ffeature-contract","4.reference\u002F3.feature-contract",{"title":361,"path":362,"stem":363,"icon":107},"CSS and UI-provider requirements","\u002Freference\u002Fcss-and-ui","4.reference\u002F4.css-and-ui",{"title":365,"path":366,"stem":367,"icon":148},"Vue-free advanced schema","\u002Freference\u002Fadvanced-schema","4.reference\u002F5.advanced-schema",{"title":369,"path":370,"stem":371,"icon":372},"Dependency rules","\u002Freference\u002Fdependency-rules","4.reference\u002F6.dependency-rules","i-lucide-git-branch",{"title":374,"path":375,"stem":376,"icon":377},"Commands","\u002Freference\u002Fcommands","4.reference\u002F7.commands","i-lucide-terminal",{"title":379,"path":380,"stem":381,"icon":163},"Block capability contract","\u002Freference\u002Fblock-capabilities","4.reference\u002F8.block-capabilities",{"title":383,"path":384,"stem":385,"icon":168},"Block type contract","\u002Freference\u002Fblock-types","4.reference\u002F9.block-types",{"title":387,"path":388,"stem":389,"children":390,"icon":393},"AI agents","\u002Fai-agents","5.ai-agents\u002F1.index",[391,394,398,402,407],{"title":392,"path":388,"stem":389,"icon":393},"Overview","i-lucide-bot",{"title":395,"path":396,"stem":397,"icon":198},"Integrate the editor","\u002Fai-agents\u002Fintegrate","5.ai-agents\u002F2.integrate",{"title":399,"path":400,"stem":401,"icon":68},"Add a block or feature","\u002Fai-agents\u002Fextend","5.ai-agents\u002F3.extend",{"title":403,"path":404,"stem":405,"icon":406},"Pitfalls and invariants","\u002Fai-agents\u002Finvariants","5.ai-agents\u002F4.invariants","i-lucide-shield-alert",{"title":408,"path":409,"stem":410,"icon":411},"Verify","\u002Fai-agents\u002Fverify","5.ai-agents\u002F5.verify","i-lucide-check-check",{"id":413,"title":287,"body":414,"description":1797,"extension":1798,"links":1799,"meta":1800,"navigation":1801,"path":288,"seo":1802,"stem":289,"__hash__":1803},"docs\u002F3.guides\u002F49.knowledge-graph.md",{"type":415,"value":416,"toc":1790},"minimark",[417,440,556,589,594,607,916,977,983,987,1045,1056,1113,1117,1374,1405,1415,1419,1435,1458,1501,1505,1542,1614,1633,1765,1786],[418,419,420,421,425,426,430,431,434,435,439],"p",{},"A ",[422,423,424],"strong",{},"knowledge graph"," is a graph the host keeps outside the Documents: ingested sources, concepts and notes with typed edges between them. The editor does not store it and does not write to it. The host passes one ",[427,428,429],"code",{},"KnowledgeGraph","; the editor adds two read routes, a client call and the ",[422,432,433],{},"Wissensgraph"," tab of the ",[436,437,438],"a",{"href":211},"Explore panel",".",[441,442,443,459],"table",{},[444,445,446],"thead",{},[447,448,449,453,456],"tr",{},[450,451,452],"th",{},"Piece",[450,454,455],{},"What it does",[450,457,458],{},"Port (capability)",[460,461,462,487,505,519,539],"tbody",{},[447,463,464,469,482],{},[465,466,467],"td",{},[427,468,429],{},[465,470,471,474,475,478,479],{},[427,472,473],{},"search(q, user)",", ",[427,476,477],{},"neighbours(id, user)"," and optionally ",[427,480,481],{},"origin(id, user)",[465,483,484],{},[427,485,486],{},"knowledge",[447,488,489,494,501],{},[465,490,491],{},[427,492,493],{},"GET \u002Fapi\u002Feditor\u002Fknowledge\u002Fsearch?q=",[465,495,496,497,500],{},"the nodes ",[427,498,499],{},"q"," finds, best first",[465,502,503],{},[427,504,486],{},[447,506,507,512,515],{},[465,508,509],{},[427,510,511],{},"GET \u002Fapi\u002Feditor\u002Fknowledge\u002Fnodes\u002F:id\u002Fneighbours",[465,513,514],{},"a node, the nodes next to it and the edges between them",[465,516,517],{},[427,518,486],{},[447,520,521,526,535],{},[465,522,523],{},[427,524,525],{},"EditorBackend['knowledge']",[465,527,528,531,532],{},[427,529,530],{},"search(query, signal?)"," and ",[427,533,534],{},"neighbours(id, signal?)",[465,536,537],{},[427,538,486],{},[447,540,541,546,549],{},[465,542,543,544],{},"Explore tab ",[427,545,486],{},[465,547,548],{},"the nodes found for the open Block's title; a click shows the neighbours",[465,550,551,531,554],{},[427,552,553],{},"index",[427,555,486],{},[418,557,558,559,562,563,566,567,570,571,574,575,474,578,581,582,474,585,588],{},"A node is ",[422,560,561],{},"not a Block"," and an edge is ",[422,564,565],{},"not an Edge"," of the ",[436,568,569],{"href":244},"Block index",": the graph's ",[427,572,573],{},"kind"," (",[427,576,577],{},"Source",[427,579,580],{},"Concept",", …) and its edge types (",[427,583,584],{},"References",[427,586,587],{},"DerivedFrom",", …) are its own words, shown as written.",[590,591,593],"h2",{"id":592},"the-port","The port",[418,595,596,574,599,602,603,606],{},[427,597,598],{},"EditorPorts.knowledge",[427,600,601],{},"@skaile\u002Fforge-editor\u002Fserver","), the shapes in ",[427,604,605],{},"@skaile\u002Fforge-editor\u002Fcore",":",[608,609,614],"pre",{"className":610,"code":611,"language":612,"meta":613,"style":613},"language-ts shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","interface KnowledgeGraph {\n  \u002F** The nodes `q` finds, best first. *\u002F\n  search(q: string, user: object): Promise\u003CKnowledgeHit[]>\n  \u002F** The node `id` (first), the nodes next to it, and the edges that join them. An unknown id: both lists empty. *\u002F\n  neighbours(id: string, user: object): Promise\u003CKnowledgeNeighbours>\n  \u002F** Optional: the nodes `id` was made from (its sources). *\u002F\n  origin?(id: string, user: object): Promise\u003CKnowledgeNode[]>\n}\n\ninterface KnowledgeNode { id: string, label: string, kind: string }\ninterface KnowledgeHit extends KnowledgeNode { score: number }\ninterface KnowledgeEdge { from: string, to: string, kind: string }\ninterface KnowledgeNeighbours { nodes: KnowledgeNode[], edges: KnowledgeEdge[] }\n","ts","",[427,615,616,633,640,688,694,728,734,770,776,783,822,847,883],{"__ignoreMap":613},[617,618,621,625,629],"span",{"class":619,"line":620},"line",1,[617,622,624],{"class":623},"spNyl","interface",[617,626,628],{"class":627},"sBMFI"," KnowledgeGraph",[617,630,632],{"class":631},"sMK4o"," {\n",[617,634,636],{"class":619,"line":635},2,[617,637,639],{"class":638},"sHwdD","  \u002F** The nodes `q` finds, best first. *\u002F\n",[617,641,643,647,650,653,655,658,661,664,666,669,672,675,678,681,685],{"class":619,"line":642},3,[617,644,646],{"class":645},"swJcz","  search",[617,648,649],{"class":631},"(",[617,651,499],{"class":652},"sHdIc",[617,654,606],{"class":631},[617,656,657],{"class":627}," string",[617,659,660],{"class":631},",",[617,662,663],{"class":652}," user",[617,665,606],{"class":631},[617,667,668],{"class":627}," object",[617,670,671],{"class":631},"):",[617,673,674],{"class":627}," Promise",[617,676,677],{"class":631},"\u003C",[617,679,680],{"class":627},"KnowledgeHit",[617,682,684],{"class":683},"sTEyZ","[]",[617,686,687],{"class":631},">\n",[617,689,691],{"class":619,"line":690},4,[617,692,693],{"class":638},"  \u002F** The node `id` (first), the nodes next to it, and the edges that join them. An unknown id: both lists empty. *\u002F\n",[617,695,697,700,702,705,707,709,711,713,715,717,719,721,723,726],{"class":619,"line":696},5,[617,698,699],{"class":645},"  neighbours",[617,701,649],{"class":631},[617,703,704],{"class":652},"id",[617,706,606],{"class":631},[617,708,657],{"class":627},[617,710,660],{"class":631},[617,712,663],{"class":652},[617,714,606],{"class":631},[617,716,668],{"class":627},[617,718,671],{"class":631},[617,720,674],{"class":627},[617,722,677],{"class":631},[617,724,725],{"class":627},"KnowledgeNeighbours",[617,727,687],{"class":631},[617,729,731],{"class":619,"line":730},6,[617,732,733],{"class":638},"  \u002F** Optional: the nodes `id` was made from (its sources). *\u002F\n",[617,735,737,740,743,745,747,749,751,753,755,757,759,761,763,766,768],{"class":619,"line":736},7,[617,738,739],{"class":645},"  origin",[617,741,742],{"class":631},"?(",[617,744,704],{"class":652},[617,746,606],{"class":631},[617,748,657],{"class":627},[617,750,660],{"class":631},[617,752,663],{"class":652},[617,754,606],{"class":631},[617,756,668],{"class":627},[617,758,671],{"class":631},[617,760,674],{"class":627},[617,762,677],{"class":631},[617,764,765],{"class":627},"KnowledgeNode",[617,767,684],{"class":683},[617,769,687],{"class":631},[617,771,773],{"class":619,"line":772},8,[617,774,775],{"class":631},"}\n",[617,777,779],{"class":619,"line":778},9,[617,780,782],{"emptyLinePlaceholder":781},true,"\n",[617,784,786,788,791,794,797,799,801,803,806,808,810,812,815,817,819],{"class":619,"line":785},10,[617,787,624],{"class":623},[617,789,790],{"class":627}," KnowledgeNode",[617,792,793],{"class":631}," {",[617,795,796],{"class":645}," id",[617,798,606],{"class":631},[617,800,657],{"class":627},[617,802,660],{"class":631},[617,804,805],{"class":645}," label",[617,807,606],{"class":631},[617,809,657],{"class":627},[617,811,660],{"class":631},[617,813,814],{"class":645}," kind",[617,816,606],{"class":631},[617,818,657],{"class":627},[617,820,821],{"class":631}," }\n",[617,823,825,827,830,833,835,837,840,842,845],{"class":619,"line":824},11,[617,826,624],{"class":623},[617,828,829],{"class":627}," KnowledgeHit",[617,831,832],{"class":623}," extends",[617,834,790],{"class":627},[617,836,793],{"class":631},[617,838,839],{"class":645}," score",[617,841,606],{"class":631},[617,843,844],{"class":627}," number",[617,846,821],{"class":631},[617,848,850,852,855,857,860,862,864,866,869,871,873,875,877,879,881],{"class":619,"line":849},12,[617,851,624],{"class":623},[617,853,854],{"class":627}," KnowledgeEdge",[617,856,793],{"class":631},[617,858,859],{"class":645}," from",[617,861,606],{"class":631},[617,863,657],{"class":627},[617,865,660],{"class":631},[617,867,868],{"class":645}," to",[617,870,606],{"class":631},[617,872,657],{"class":627},[617,874,660],{"class":631},[617,876,814],{"class":645},[617,878,606],{"class":631},[617,880,657],{"class":627},[617,882,821],{"class":631},[617,884,886,888,891,893,896,898,900,902,904,907,909,911,914],{"class":619,"line":885},13,[617,887,624],{"class":623},[617,889,890],{"class":627}," KnowledgeNeighbours",[617,892,793],{"class":631},[617,894,895],{"class":645}," nodes",[617,897,606],{"class":631},[617,899,790],{"class":627},[617,901,684],{"class":683},[617,903,660],{"class":631},[617,905,906],{"class":645}," edges",[617,908,606],{"class":631},[617,910,854],{"class":627},[617,912,913],{"class":683},"[] ",[617,915,775],{"class":631},[441,917,918,928],{},[444,919,920],{},[447,921,922,925],{},[450,923,924],{},"Type",[450,926,927],{},"Meaning",[460,929,930,948,961],{},[447,931,932,936],{},[465,933,934],{},[427,935,765],{},[465,937,938,940,941,944,945,947],{},[427,939,704],{}," is stable; ",[427,942,943],{},"label"," is what the node is called (its id for a node without a title); ",[427,946,573],{}," is what it is, in the graph's words",[447,949,950,954],{},[465,951,952],{},[427,953,680],{},[465,955,956,957,960],{},"a node with the ",[427,958,959],{},"score"," the graph gave it. Higher is better; the scale is the graph's own and only orders the list",[447,962,963,968],{},[465,964,965],{},[427,966,967],{},"KnowledgeEdge",[465,969,970,971,973,974],{},"a directed edge between two node ids; every edge of a ",[427,972,725],{}," has both ends in its ",[427,975,976],{},"nodes",[418,978,979,982],{},[427,980,981],{},"origin"," is not served by a route yet; an add-on or a host reads it from the port.",[590,984,986],{"id":985},"routes","Routes",[441,988,989,1006],{},[444,990,991],{},[447,992,993,1000,1003],{},[450,994,995,996,999],{},"Route (",[427,997,998],{},"API"," key)",[450,1001,1002],{},"Request",[450,1004,1005],{},"Answer",[460,1007,1008,1029],{},[447,1009,1010,1019,1024],{},[465,1011,1012,574,1015,1018],{},[427,1013,1014],{},"GET \u002Fapi\u002Feditor\u002Fknowledge\u002Fsearch",[427,1016,1017],{},"knowledgeSearch",")",[465,1020,1021],{},[427,1022,1023],{},"?q=",[465,1025,1026],{},[427,1027,1028],{},"KnowledgeHit[]",[447,1030,1031,1038,1041],{},[465,1032,1033,574,1035,1018],{},[427,1034,511],{},[427,1036,1037],{},"knowledgeNeighbours",[465,1039,1040],{},"none",[465,1042,1043],{},[427,1044,725],{},[418,1046,1047,1048,1051,1052,1055],{},"Both routes are served only when ",[427,1049,1050],{},"ports.knowledge"," is present, for every signed-in user: the graph is the host's, and the ",[427,1053,1054],{},"user"," the port receives is where a host that keeps per-user access applies it.",[441,1057,1058,1068],{},[444,1059,1060],{},[447,1061,1062,1065],{},[450,1063,1064],{},"Status",[450,1066,1067],{},"When",[460,1069,1070,1090,1100],{},[447,1071,1072,1077],{},[465,1073,1074],{},[427,1075,1076],{},"400",[465,1078,1079,1081,1082,1085,1086,1089],{},[427,1080,499],{}," missing, blank or longer than ",[427,1083,1084],{},"KNOWLEDGE_QUERY_MAX"," (500) characters; an id blank or longer than ",[427,1087,1088],{},"KNOWLEDGE_ID_MAX"," (200)",[447,1091,1092,1097],{},[465,1093,1094],{},[427,1095,1096],{},"401",[465,1098,1099],{},"no user",[447,1101,1102,1107],{},[465,1103,1104],{},[427,1105,1106],{},"501",[465,1108,1109,1110,1112],{},"the host has no ",[427,1111,486],{}," port",[590,1114,1116],{"id":1115},"provide-a-port","Provide a port",[608,1118,1120],{"className":610,"code":1119,"language":612,"meta":613,"style":613},"import { createMemoryKnowledgeGraph } from '@skaile\u002Fforge-editor\u002Fadapters\u002Fknowledge'\nimport type { EditorPorts } from '@skaile\u002Fforge-editor\u002Fserver'\n\n\u002F\u002F Two nodes and one edge, for a test or a demo.\nconst knowledge: NonNullable\u003CEditorPorts['knowledge']> = createMemoryKnowledgeGraph(\n  [\n    { id: 'n1', label: 'Wissensgraph Grundlagen', kind: 'Concept' },\n    { id: 'n2', label: 'Wissensgraph Quelle', kind: 'Source' },\n  ],\n  [{ from: 'n1', to: 'n2', kind: 'DerivedFrom' }],\n)\n",[427,1121,1122,1148,1170,1174,1179,1222,1227,1271,1313,1321,1369],{"__ignoreMap":613},[617,1123,1124,1128,1130,1133,1136,1138,1141,1145],{"class":619,"line":620},[617,1125,1127],{"class":1126},"s7zQu","import",[617,1129,793],{"class":631},[617,1131,1132],{"class":683}," createMemoryKnowledgeGraph",[617,1134,1135],{"class":631}," }",[617,1137,859],{"class":1126},[617,1139,1140],{"class":631}," '",[617,1142,1144],{"class":1143},"sfazB","@skaile\u002Fforge-editor\u002Fadapters\u002Fknowledge",[617,1146,1147],{"class":631},"'\n",[617,1149,1150,1152,1155,1157,1160,1162,1164,1166,1168],{"class":619,"line":635},[617,1151,1127],{"class":1126},[617,1153,1154],{"class":1126}," type",[617,1156,793],{"class":631},[617,1158,1159],{"class":683}," EditorPorts",[617,1161,1135],{"class":631},[617,1163,859],{"class":1126},[617,1165,1140],{"class":631},[617,1167,601],{"class":1143},[617,1169,1147],{"class":631},[617,1171,1172],{"class":619,"line":642},[617,1173,782],{"emptyLinePlaceholder":781},[617,1175,1176],{"class":619,"line":690},[617,1177,1178],{"class":638},"\u002F\u002F Two nodes and one edge, for a test or a demo.\n",[617,1180,1181,1184,1187,1189,1192,1194,1197,1200,1203,1205,1207,1210,1213,1216,1219],{"class":619,"line":696},[617,1182,1183],{"class":623},"const",[617,1185,1186],{"class":683}," knowledge",[617,1188,606],{"class":631},[617,1190,1191],{"class":627}," NonNullable",[617,1193,677],{"class":631},[617,1195,1196],{"class":627},"EditorPorts",[617,1198,1199],{"class":683},"[",[617,1201,1202],{"class":631},"'",[617,1204,486],{"class":1143},[617,1206,1202],{"class":631},[617,1208,1209],{"class":683},"]",[617,1211,1212],{"class":631},">",[617,1214,1215],{"class":631}," =",[617,1217,1132],{"class":1218},"s2Zo4",[617,1220,1221],{"class":683},"(\n",[617,1223,1224],{"class":619,"line":730},[617,1225,1226],{"class":683},"  [\n",[617,1228,1229,1232,1234,1236,1238,1241,1243,1245,1247,1249,1251,1254,1256,1258,1260,1262,1264,1266,1268],{"class":619,"line":736},[617,1230,1231],{"class":631},"    {",[617,1233,796],{"class":645},[617,1235,606],{"class":631},[617,1237,1140],{"class":631},[617,1239,1240],{"class":1143},"n1",[617,1242,1202],{"class":631},[617,1244,660],{"class":631},[617,1246,805],{"class":645},[617,1248,606],{"class":631},[617,1250,1140],{"class":631},[617,1252,1253],{"class":1143},"Wissensgraph Grundlagen",[617,1255,1202],{"class":631},[617,1257,660],{"class":631},[617,1259,814],{"class":645},[617,1261,606],{"class":631},[617,1263,1140],{"class":631},[617,1265,580],{"class":1143},[617,1267,1202],{"class":631},[617,1269,1270],{"class":631}," },\n",[617,1272,1273,1275,1277,1279,1281,1284,1286,1288,1290,1292,1294,1297,1299,1301,1303,1305,1307,1309,1311],{"class":619,"line":772},[617,1274,1231],{"class":631},[617,1276,796],{"class":645},[617,1278,606],{"class":631},[617,1280,1140],{"class":631},[617,1282,1283],{"class":1143},"n2",[617,1285,1202],{"class":631},[617,1287,660],{"class":631},[617,1289,805],{"class":645},[617,1291,606],{"class":631},[617,1293,1140],{"class":631},[617,1295,1296],{"class":1143},"Wissensgraph Quelle",[617,1298,1202],{"class":631},[617,1300,660],{"class":631},[617,1302,814],{"class":645},[617,1304,606],{"class":631},[617,1306,1140],{"class":631},[617,1308,577],{"class":1143},[617,1310,1202],{"class":631},[617,1312,1270],{"class":631},[617,1314,1315,1318],{"class":619,"line":778},[617,1316,1317],{"class":683},"  ]",[617,1319,1320],{"class":631},",\n",[617,1322,1323,1326,1329,1331,1333,1335,1337,1339,1341,1343,1345,1347,1349,1351,1353,1355,1357,1359,1361,1363,1365,1367],{"class":619,"line":785},[617,1324,1325],{"class":683},"  [",[617,1327,1328],{"class":631},"{",[617,1330,859],{"class":645},[617,1332,606],{"class":631},[617,1334,1140],{"class":631},[617,1336,1240],{"class":1143},[617,1338,1202],{"class":631},[617,1340,660],{"class":631},[617,1342,868],{"class":645},[617,1344,606],{"class":631},[617,1346,1140],{"class":631},[617,1348,1283],{"class":1143},[617,1350,1202],{"class":631},[617,1352,660],{"class":631},[617,1354,814],{"class":645},[617,1356,606],{"class":631},[617,1358,1140],{"class":631},[617,1360,587],{"class":1143},[617,1362,1202],{"class":631},[617,1364,1135],{"class":631},[617,1366,1209],{"class":683},[617,1368,1320],{"class":631},[617,1370,1371],{"class":619,"line":824},[617,1372,1373],{"class":683},")\n",[418,1375,1376,1379,1380,1382,1383,1386,1387,1390,1391,1394,1395,1398,1399,1401,1402,1404],{},[427,1377,1378],{},"createMemoryKnowledgeGraph(nodes, edges)"," searches the words of the labels: a node is a hit when a word of its label starts with a word of the query (case and accents ignored), the ",[427,1381,959],{}," is the share of the query's words found (",[427,1384,1385],{},"1"," = all), the best first, at most ",[427,1388,1389],{},"MEMORY_KNOWLEDGE_LIMIT"," (20). ",[427,1392,1393],{},"neighbours"," answers the node, the nodes joined to it in either direction and every edge among them; an edge to a node that is not listed is left out. ",[427,1396,1397],{},"origin(id)"," answers the nodes ",[427,1400,704],{}," has an outgoing ",[427,1403,587],{}," edge to.",[418,1406,1407,1408,1414],{},"A real graph is the host's. The add-on ",[436,1409,1411],{"href":1410},"#the-kgs-add-on",[427,1412,1413],{},"@skaile\u002Fforge-editor-kgs"," wraps the KGS SDK.",[590,1416,1418],{"id":1417},"the-wissensgraph-tab","The Wissensgraph tab",[418,1420,1421,1422,474,1424,1427,1428,1430,1431,1434],{},"With the backend capability ",[427,1423,486],{},[427,1425,1426],{},"exploreTabsOf(backend)"," lists a fourth tab, ",[427,1429,486],{}," („Wissensgraph“ \u002F “Knowledge graph”), after ",[427,1432,1433],{},"trail",". A backend without the capability has no such tab.",[418,1436,1437,1438,1441,1442,1445,1446,1449,1450,1453,1454,1457],{},"The ",[427,1439,1440],{},"ExploreModel"," fills it like the other lists: when the Block changes it reads the Block's title through ",[427,1443,1444],{},"index.blockGet"," and searches the graph for it (",[427,1447,1448],{},"state.query"," is that text; a Block without a title searches nothing and the panel says so). ",[427,1451,1452],{},"state.knowledge"," is ",[427,1455,1456],{},"{ status, items: KnowledgeHit[] }",", and each entry shows its label, its kind and its score.",[418,1459,1460,1461,1464,1465,1468,1469,1472,1473,1476,1477,1480,1481,1484,1485,1488,1489,1492,1493,1496,1497,1500],{},"Choosing a hit calls ",[427,1462,1463],{},"model.focusNode(hit)",": ",[427,1466,1467],{},"state.focus"," is then ",[427,1470,1471],{},"{ node, status, nodes, edges }"," with the neighbours loading (",[427,1474,1475],{},"neighbours(node.id)","). The panel lists the nodes the graph joins to the focus (",[427,1478,1479],{},"exploreKnowledgeLinksOf(focus)",": node, edge type and ",[427,1482,1483],{},"out"," or ",[427,1486,1487],{},"in","); choosing one of them moves the focus there, and „Zurück zu den Treffern“ calls ",[427,1490,1491],{},"focusNode(null)",". A failing search or neighbourhood is ",[427,1494,1495],{},"failed"," and the other tabs stay usable. Opening a Block stays the host's ",[427,1498,1499],{},"open",": knowledge nodes are no Blocks, so choosing one never calls it.",[590,1502,1504],{"id":1503},"the-kgs-add-on","The KGS add-on",[418,1506,1507,1509,1510,1512,1513,1516,1517,1520,1521,1524,1525,1528,1529,474,1532,474,1535,1538,1539,1541],{},[427,1508,1413],{}," is the ",[427,1511,429],{}," over the read side of the KGS SDK (",[427,1514,1515],{},"@kgs\u002Fsdk",", a daemon that holds a corpus of sources and concepts). ",[427,1518,1519],{},"createKgsKnowledgeGraph(client, options?)"," takes a ",[427,1522,1523],{},"KgsReadClient",": the three methods of the SDK's ",[427,1526,1527],{},"Client"," that it calls (",[427,1530,1531],{},"get",[427,1533,1534],{},"search",[427,1536,1537],{},"neighbors","), typed in the add-on. The add-on does not import ",[427,1540,1515],{}," (it is not published on npm); the SDK is an optional peer that the host installs.",[441,1543,1544,1557],{},[444,1545,1546],{},[447,1547,1548,1552,1555],{},[450,1549,1550],{},[427,1551,429],{},[450,1553,1554],{},"KGS call",[450,1556,1005],{},[460,1558,1559,1577,1596],{},[447,1560,1561,1566,1571],{},[465,1562,1563],{},[427,1564,1565],{},"search(q)",[465,1567,1568],{},[427,1569,1570],{},"kgs.search",[465,1572,1573,1576],{},[427,1574,1575],{},"{ id, label, kind, score }",": the node's title, its node type, the daemon's score",[447,1578,1579,1584,1593],{},[465,1580,1581],{},[427,1582,1583],{},"neighbours(id)",[465,1585,1586,531,1589,1592],{},[427,1587,1588],{},"kgs.get",[427,1590,1591],{},"kgs.neighbors"," (both directions)",[465,1594,1595],{},"the node, the nodes next to it and the edges that join them",[447,1597,1598,1602,1609],{},[465,1599,1600],{},[427,1601,1397],{},[465,1603,1604,574,1606,1608],{},[427,1605,1591],{},[427,1607,587],{},", outgoing)",[465,1610,496,1611,1613],{},[427,1612,704],{}," was made from",[418,1615,1616,1617,1620,1621,1624,1625,1628,1629,1632],{},"Deleted nodes never appear. Options: ",[427,1618,1619],{},"mode"," (the daemon's search mode, default ",[427,1622,1623],{},"hybrid","), ",[427,1626,1627],{},"limit"," (hits, default 10), ",[427,1630,1631],{},"scope"," (a zone to search in).",[608,1634,1636],{"className":610,"code":1635,"language":612,"meta":613,"style":613},"import { createKgsKnowledgeGraph } from '@skaile\u002Fforge-editor-kgs'\nimport { Client, TcpTransport } from '@kgs\u002Fsdk'\n\nconst client = await Client.fromTransport(new TcpTransport('127.0.0.1', 7777))\nconst knowledge = createKgsKnowledgeGraph(client, { limit: 10 })\n\u002F\u002F provideEditorServer({ ports: { …, knowledge } })\n",[427,1637,1638,1657,1681,1685,1730,1760],{"__ignoreMap":613},[617,1639,1640,1642,1644,1647,1649,1651,1653,1655],{"class":619,"line":620},[617,1641,1127],{"class":1126},[617,1643,793],{"class":631},[617,1645,1646],{"class":683}," createKgsKnowledgeGraph",[617,1648,1135],{"class":631},[617,1650,859],{"class":1126},[617,1652,1140],{"class":631},[617,1654,1413],{"class":1143},[617,1656,1147],{"class":631},[617,1658,1659,1661,1663,1666,1668,1671,1673,1675,1677,1679],{"class":619,"line":635},[617,1660,1127],{"class":1126},[617,1662,793],{"class":631},[617,1664,1665],{"class":683}," Client",[617,1667,660],{"class":631},[617,1669,1670],{"class":683}," TcpTransport",[617,1672,1135],{"class":631},[617,1674,859],{"class":1126},[617,1676,1140],{"class":631},[617,1678,1515],{"class":1143},[617,1680,1147],{"class":631},[617,1682,1683],{"class":619,"line":642},[617,1684,782],{"emptyLinePlaceholder":781},[617,1686,1687,1689,1692,1695,1698,1700,1702,1705,1707,1710,1712,1714,1716,1719,1721,1723,1727],{"class":619,"line":690},[617,1688,1183],{"class":623},[617,1690,1691],{"class":683}," client ",[617,1693,1694],{"class":631},"=",[617,1696,1697],{"class":1126}," await",[617,1699,1665],{"class":683},[617,1701,439],{"class":631},[617,1703,1704],{"class":1218},"fromTransport",[617,1706,649],{"class":683},[617,1708,1709],{"class":631},"new",[617,1711,1670],{"class":1218},[617,1713,649],{"class":683},[617,1715,1202],{"class":631},[617,1717,1718],{"class":1143},"127.0.0.1",[617,1720,1202],{"class":631},[617,1722,660],{"class":631},[617,1724,1726],{"class":1725},"sbssI"," 7777",[617,1728,1729],{"class":683},"))\n",[617,1731,1732,1734,1737,1739,1741,1744,1746,1748,1751,1753,1756,1758],{"class":619,"line":696},[617,1733,1183],{"class":623},[617,1735,1736],{"class":683}," knowledge ",[617,1738,1694],{"class":631},[617,1740,1646],{"class":1218},[617,1742,1743],{"class":683},"(client",[617,1745,660],{"class":631},[617,1747,793],{"class":631},[617,1749,1750],{"class":645}," limit",[617,1752,606],{"class":631},[617,1754,1755],{"class":1725}," 10",[617,1757,1135],{"class":631},[617,1759,1373],{"class":683},[617,1761,1762],{"class":619,"line":730},[617,1763,1764],{"class":638},"\u002F\u002F provideEditorServer({ ports: { …, knowledge } })\n",[418,1766,1767,1768,1771,1772,1775,1776,574,1779,1484,1782,1785],{},"The repository's document pages (the file-drawer layout, ",[427,1769,1770],{},"app\u002Flayouts\u002Fdefault.vue",", whose Explore panel gets a fourth tab) show it behind ",[427,1773,1774],{},"NUXT_PUBLIC_ADDONS_KGS=1"," with ",[427,1777,1778],{},"KGS_URL",[427,1780,1781],{},"tcp:\u002F\u002Fhost:port",[427,1783,1784],{},"unix:\u002F\u002F\u002Fpath\u002Fto\u002F.kgs\u002Fsocket","); the kitchen sink's standalone pages have no workspace index and show no knowledge graph.",[1787,1788,1789],"style",{},"html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sHwdD, html code.shiki .sHwdD{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sHdIc, html code.shiki .sHdIc{--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .s7zQu, html code.shiki .s7zQu{--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":613,"searchDepth":635,"depth":635,"links":1791},[1792,1793,1794,1795,1796],{"id":592,"depth":635,"text":593},{"id":985,"depth":635,"text":986},{"id":1115,"depth":635,"text":1116},{"id":1417,"depth":635,"text":1418},{"id":1503,"depth":635,"text":1504},"The read-only KnowledgeGraph port with its search and neighbours routes, the Wissensgraph tab of the Explore panel, the memory adapter for tests and the @skaile\u002Fforge-editor-kgs add-on over the KGS SDK.","md",null,{},{"icon":290},{"title":287,"description":1797},"vtTNpYH2x32QpmdELlUbw3l3_Eb-qYL8_W_OB3XOwZY",[1805,1807],{"title":282,"path":283,"stem":284,"description":1806,"icon":285,"children":-1},"The add-on @skaile\u002Fforge-editor-slides: the Block types deck and slide, the pure HTML render contract, the render targets reveal-html, pptx and marp-md, the transfer transforms that turn blocks into slides, and the slide preview in the inspector.",{"title":292,"path":293,"stem":294,"description":1808,"icon":78,"children":-1},"One configuration object for module options, server and browser, the Model presets and Model roles, and why API keys come from the environment only.",1793178236569]