[{"data":1,"prerenderedAt":698},["ShallowReactive",2],{"search-de":3,"content-de-developer\u002Fplugin-platform":4,"surround-de-\u002Fdeveloper\u002Fplugin-platform":691},[],{"id":5,"title":6,"body":7,"description":684,"extension":685,"meta":686,"navigation":282,"path":687,"seo":688,"stem":689,"__hash__":690},"content_de\u002F3.developer\u002F40.plugin-platform.md","Plugin-Plattform",{"type":8,"value":9,"toc":677},"minimark",[10,24,27,62,76,81,172,175,234,241,245,373,487,491,526,536,540,620,624,670,673],[11,12,13,14,18,19,23],"p",{},"Die Variationspunkte von Owlat — Versandtransporte, Agentenschritte, Entwurfsstrategien, Autonomie-Gates, Automatisierungen, Webhook-Events, Import-Provider, Crons, Navigation, Einstellungen — sind alle über ",[15,16,17],"strong",{},"Plugins"," erreichbar. Ein Plugin ist ein npm-Paket, das ein validiertes Manifest exportiert und optional statische Module hinter den Verträgen aus ",[20,21,22],"code",{},"@owlat\u002Fplugin-kit",".",[11,25,26],{},"Die Plattform hat drei bewusst gewählte Eigenschaften:",[28,29,30,41,56],"ol",{},[31,32,33,36,37,40],"li",{},[15,34,35],{},"Ein Manifest."," Alles, was der Host braucht, um ein Plugin zusammenzusetzen, zu berechtigen, per Flag zu steuern, zu budgetieren und darzustellen, sind Daten in ",[20,38,39],{},"definePlugin(...)",". Die Validierung ruft niemals Plugin-Code auf.",[31,42,43,46,47,51,52,55],{},[15,44,45],{},"Deklaration ist keine Befugnis."," Ein Manifest ",[48,49,50],"em",{},"fordert"," Capabilities an. Ein Betreiber ",[48,53,54],{},"gewährt"," sie. Beides wird zum Zeitpunkt jeder vom Host durchgeführten Operation erneut geprüft.",[31,57,58,61],{},[15,59,60],{},"Kein beliebiger Laufzeitcode."," Nichts lädt zur Laufzeit JavaScript in Convex oder in den Browser. Gebündelter Code wird zur Build-Zeit komponiert; nicht vertrauenswürdiger Code läuft außerhalb des Prozesses (eine verbundene App) oder hinter einer Betriebssystemgrenze (ein Sandbox-Worker-Job).",[63,64,67],"callout",{"title":65,"type":66},"Wo die Verträge liegen","info",[11,68,69,71,72,75],{},[20,70,22],{}," ist die öffentliche Kompatibilitätsgrenze und das einzige Paket, das ein Plugin-Autor importiert. Seine ",[15,73,74],{},"Major-Version"," ist die Kompatibilitätslinie — einzelne Contribution-Schnittstellen tragen keine eigenen Versionen. Vor 1.0 folgt es der Version des Owlat-Repositorys, und Verträge können sich zusammen mit der Anwendung brechend ändern.",[77,78,80],"h2",{"id":79},"die-drei-stufen","Die drei Stufen",[82,83,84,103],"table",{},[85,86,87],"thead",{},[88,89,90,94,97,100],"tr",{},[91,92,93],"th",{},"Stufe",[91,95,96],{},"Was es ist",[91,98,99],{},"Installation",[91,101,102],{},"Vertrauen",[104,105,106,131,152],"tbody",{},[88,107,108,114,121,124],{},[109,110,111],"td",{},[15,112,113],{},"1 — Gebündeltes Plugin",[109,115,116,117,120],{},"Ein npm-Paket, das in ",[20,118,119],{},"plugins.config.ts"," gelistet und in die Convex- und Nuxt-Builds komponiert wird",[109,122,123],{},"Konfiguration bearbeiten → Codegen → Rebuild → Deployment",[109,125,126,127,130],{},"Dasselbe Vertrauen wie der eigene deployte Code des Betreibers. Capabilities und Flags ",[48,128,129],{},"reduzieren"," die Befugnis; sie sind keine Sandbox",[88,132,133,138,146,149],{},[109,134,135],{},[15,136,137],{},"2 — Verbundene App",[109,139,140,141],{},"Ein externer HTTPS-Dienst mit plugin-gebundenen API-Keys und Webhooks, dazu ein spezifiziertes signiertes synchrones Hook-Protokoll, dessen Laufzeit-Adapter nicht mitgeliefert wird — siehe ",[142,143,145],"a",{"href":144},"\u002Fdeveloper\u002Fplugin-connected-apps","Verbundene Apps",[109,147,148],{},"Im Dashboard registrieren; sofort wirksam, ohne Rebuild",[109,150,151],{},"Nicht vertrauenswürdiger Netzwerk-Peer. Jede Antwort wird strikt validiert, bereinigt, geklemmt und begrenzt",[88,153,154,159,166,169],{},[109,155,156],{},[15,157,158],{},"3 — Sandbox-Worker-Job",[109,160,161,162,165],{},"Ein spezifiziertes Worker-Protokoll hinter der ",[20,163,164],{},"code-worker","-Betriebssystemgrenze; ein hostseitiger Enqueue-Adapter wird nicht mitgeliefert",[109,167,168],{},"Reserviert",[109,170,171],{},"Nicht vertrauenswürdiger Prozess. Keine ambienten Zugangsdaten, harte Obergrenzen für CPU\u002FSpeicher\u002FZeit, vom Host kontrolliertes Kommando",[11,173,174],{},"Für jede Stufe gibt es ein gepflegtes Referenz-Plugin:",[82,176,177,189],{},[85,178,179],{},[88,180,181,183,186],{},[91,182,93],{},[91,184,185],{},"Referenz",[91,187,188],{},"Was es beisteuert",[104,190,191,204,217],{},[88,192,193,196,201],{},[109,194,195],{},"1",[109,197,198],{},[20,199,200],{},"examples\u002Fplugins\u002Fescalation-guard",[109,202,203],{},"Einen Agentenschritt, eine Entwurfsstrategie, alle drei Automatisierungs-Registries, ein Webhook-Event sowie Navigations- und Einstellungseinträge — alles im selben Prozess",[88,205,206,209,214],{},[109,207,208],{},"2",[109,210,211],{},[20,212,213],{},"examples\u002Fplugins\u002Fslack-approvals",[109,215,216],{},"Ein rein einschränkendes Hold-Gate, das außerhalb des Prozesses über das signierte Hook-Protokoll bedient wird; überhaupt keine In-Process-Beiträge",[88,218,219,222,227],{},[109,220,221],{},"3",[109,223,224],{},[20,225,226],{},"examples\u002Fplugins\u002Fdeliverability-lab",[109,228,229,230,233],{},"Einen Seed-List-Job auf der Sandbox-Queue, dazu ein Tier-1-Versand-Gate, Cron- und UI-Einträge sowie ",[20,231,232],{},"llm:invoke"," für host-vermittelte Generierung",[11,235,236,237,240],{},"Ein Plugin kann mehrere Stufen gleichzeitig nutzen, so wie es das Deliverability Lab tut. ",[20,238,239],{},"examples\u002Fconformance"," treibt bei jedem Testlauf alle drei durch den echten Host, das Codegen und das CLI.",[77,242,244],{"id":243},"anatomie-eines-plugins","Anatomie eines Plugins",[246,247,252],"pre",{"className":248,"code":249,"language":250,"meta":251,"style":251},"language-ts shiki shiki-themes github-light github-dark-dimmed","import { definePlugin } from '@owlat\u002Fplugin-kit';\n\nexport const helloPlugin = definePlugin({\n    id: 'hello-owlat',\n    version: '0.1.0',\n    capabilities: ['plugin-storage:read', 'plugin-storage:write'],\n    \u002F\u002F Storage capabilities REQUIRE a flag: access must be revocable at runtime.\n    flag: { default: false },\n});\n","ts","",[20,253,254,277,284,307,319,330,348,355,367],{"__ignoreMap":251},[255,256,259,263,267,270,274],"span",{"class":257,"line":258},"line",1,[255,260,262],{"class":261},"s7YZ4","import",[255,264,266],{"class":265},"sYgZi"," { definePlugin } ",[255,268,269],{"class":261},"from",[255,271,273],{"class":272},"s-HuK"," '@owlat\u002Fplugin-kit'",[255,275,276],{"class":265},";\n",[255,278,280],{"class":257,"line":279},2,[255,281,283],{"emptyLinePlaceholder":282},true,"\n",[255,285,287,290,293,297,300,304],{"class":257,"line":286},3,[255,288,289],{"class":261},"export",[255,291,292],{"class":261}," const",[255,294,296],{"class":295},"sviXB"," helloPlugin",[255,298,299],{"class":261}," =",[255,301,303],{"class":302},"sPO5f"," definePlugin",[255,305,306],{"class":265},"({\n",[255,308,310,313,316],{"class":257,"line":309},4,[255,311,312],{"class":265},"    id: ",[255,314,315],{"class":272},"'hello-owlat'",[255,317,318],{"class":265},",\n",[255,320,322,325,328],{"class":257,"line":321},5,[255,323,324],{"class":265},"    version: ",[255,326,327],{"class":272},"'0.1.0'",[255,329,318],{"class":265},[255,331,333,336,339,342,345],{"class":257,"line":332},6,[255,334,335],{"class":265},"    capabilities: [",[255,337,338],{"class":272},"'plugin-storage:read'",[255,340,341],{"class":265},", ",[255,343,344],{"class":272},"'plugin-storage:write'",[255,346,347],{"class":265},"],\n",[255,349,351],{"class":257,"line":350},7,[255,352,354],{"class":353},"sDN9O","    \u002F\u002F Storage capabilities REQUIRE a flag: access must be revocable at runtime.\n",[255,356,358,361,364],{"class":257,"line":357},8,[255,359,360],{"class":265},"    flag: { default: ",[255,362,363],{"class":295},"false",[255,365,366],{"class":265}," },\n",[255,368,370],{"class":257,"line":369},9,[255,371,372],{"class":265},"});\n",[82,374,375,385],{},[85,376,377],{},[88,378,379,382],{},[91,380,381],{},"Feld",[91,383,384],{},"Bedeutung",[104,386,387,397,407,421,431,447,463,477],{},[88,388,389,394],{},[109,390,391],{},[20,392,393],{},"id",[109,395,396],{},"Kleingeschriebenes Kebab-Case, ≤ 64 Zeichen. Bildet den Namensraum für Flags, Storage, Ausgaben, Audit-Zuordnung und jede beigesteuerte Art",[88,398,399,404],{},[109,400,401],{},[20,402,403],{},"version",[109,405,406],{},"Semantische Version",[88,408,409,414],{},[109,410,411],{},[20,412,413],{},"capabilities",[109,415,416,417,420],{},"Angeforderte Host-Operationen, ",[20,418,419],{},"domain:action",", exakte Übereinstimmung, höchstens 64",[88,422,423,428],{},[109,424,425],{},[20,426,427],{},"contributes",[109,429,430],{},"Reine Datendeskriptoren je Contribution-Bucket, höchstens 256 pro Bucket",[88,432,433,438],{},[109,434,435],{},[20,436,437],{},"flag",[109,439,440,443,444,446],{},[20,441,442],{},"{ default, requiredEnvVars? }",". Erforderlich, sobald das Plugin irgendetwas beisteuert, Plugin-Storage anfordert oder ",[20,445,232],{}," anfordert",[88,448,449,454],{},[109,450,451],{},[20,452,453],{},"llmBudget",[109,455,456,459,460,462],{},[20,457,458],{},"{ dailyUsd }",". Zusammen mit ",[20,461,232],{}," erforderlich; eine harte Obergrenze pro UTC-Tag",[88,464,465,470],{},[109,466,467],{},[20,468,469],{},"component",[109,471,472,473,476],{},"Ein bedingungsunabhängiger Convex-Component-Export, installiert unter einem injektiven ",[20,474,475],{},"plugin_\u003Cid>","-Namensraum",[88,478,479,484],{},[109,480,481],{},[20,482,483],{},"settingsSchema",[109,485,486],{},"Deklaratives Betreiberformular; der Host rendert, validiert und redigiert es",[77,488,490],{"id":489},"wie-ein-gebündeltes-plugin-in-die-produktion-gelangt","Wie ein gebündeltes Plugin in die Produktion gelangt",[28,492,493,499,513,520],{},[31,494,495,496,498],{},"Der Paketname wird der eingecheckten ",[20,497,119],{}," im Wurzelverzeichnis hinzugefügt.",[31,500,501,504,505,508,509,512],{},[20,502,503],{},"bun run plugins:codegen"," (oder ",[20,506,507],{},"owlat-plugins codegen",") prüft Identität, Lockfile-Integrität und Realpath-Eingrenzung des installierten Pakets, importiert ",[15,510,511],{},"ausschließlich"," dessen Manifest-Einstiegspunkt, validiert einen unveränderlichen Snapshot und schreibt die eingecheckten Convex- und Nuxt-Kompositionsdateien, sortiert nach Manifest-ID.",[31,514,515,516,519],{},"Builds und CI führen ",[20,517,518],{},"bun run plugins:check"," aus, sodass eine veraltete oder ungültige Komposition den Build fail-closed scheitern lässt.",[31,521,522,523,525],{},"Das Deployment wird neu gebaut. Das Feature-Flag des Plugins startet mit seinem deklarierten Standardwert — normalerweise ",[20,524,363],{}," —, sodass nichts läuft, bis ein Betreiber es aktiviert und Capabilities gewährt.",[63,527,530],{"title":528,"type":529},"Ein Manifest ist keine Sandbox","warning",[11,531,532,533,535],{},"Der Code eines gebündelten Plugins läuft in Owlats eigenen Prozessen. Capability-Deklarationen, Gewährungen, Flags und host-vermittelte Dienste ",[48,534,129],{},", was ein gebündeltes Plugin erreichen kann, und machen seine Aktionen zuordenbar — sie schließen feindlichen Code nicht ein. Alles, dem Sie nicht vollständig vertrauen, gehört in eine verbundene App (Stufe 2) oder einen Sandbox-Job (Stufe 3).",[77,537,539],{"id":538},"paketübersicht","Paketübersicht",[82,541,542,552],{},[85,543,544],{},[88,545,546,549],{},[91,547,548],{},"Paket",[91,550,551],{},"Rolle",[104,553,554,568,578,588,601,611],{},[88,555,556,561],{},[109,557,558],{},[20,559,560],{},"packages\u002Fplugin-kit",[109,562,563,564,567],{},"Öffentliche Verträge: ",[20,565,566],{},"definePlugin",", Capability-Konstanten, jeder Contribution-Typ. Das einzige Paket, das ein Plugin importiert",[88,569,570,575],{},[109,571,572],{},[20,573,574],{},"packages\u002Fplugin-host",[109,576,577],{},"Privater, laufzeitneutraler Durchsetzungskern, den sich Convex und Nuxt teilen: Capability-Prüfungen, Flags, Reihenfolge, Gate-Ergebnisse, Policy für nicht vertrauenswürdigen Text",[88,579,580,585],{},[109,581,582],{},[20,583,584],{},"packages\u002Fplugin-codegen",[109,586,587],{},"Build-Werkzeug, dem der einzige Kompositionspunkt und die generierten Kataloge\u002FRegistries gehören",[88,589,590,595],{},[109,591,592],{},[20,593,594],{},"packages\u002Fplugin-cli",[109,596,597,600],{},[20,598,599],{},"owlat-plugins"," — create, add, remove, codegen, dev",[88,602,603,608],{},[109,604,605],{},[20,606,607],{},"examples\u002Fplugins\u002F*",[109,609,610],{},"Gepflegte Referenz-Plugins, die die echten Contribution-Punkte durchspielen",[88,612,613,617],{},[109,614,615],{},[20,616,239],{},[109,618,619],{},"Die Konformitätsgalerie: Lifecycle-Suites (install\u002Fadd\u002Fremove\u002Fdisable\u002Fupgrade) und Full-Pipeline-Replay-Suites über diesen Referenzen, dazu der Paritätsnachweis für Plugin-Provider — ein Fixture-ESP-Bundle, das durch die ausgelieferten Module für Routing, Dispatch, Messung, Return-Path und Zugangsdatenformulare getrieben wird",[77,621,623],{"id":622},"weiterlesen","Weiterlesen",[625,626,627,634,641,648,655,664],"ul",{},[31,628,629,633],{},[142,630,632],{"href":631},"\u002Fdeveloper\u002Fplugin-authoring","Ein Plugin bauen"," — Gerüst, Manifest, Module, Tests, Ausliefern",[31,635,636,640],{},[142,637,639],{"href":638},"\u002Fdeveloper\u002Fplugin-contributions","Contribution-Referenz"," — jeder Bucket, seine Capability und seine Host-Semantik",[31,642,643,647],{},[142,644,646],{"href":645},"\u002Fdeveloper\u002Fplugin-capabilities","Capabilities & Vertrauen"," — das Berechtigungsmodell und die Invarianten, die ein Plugin niemals aufweichen kann",[31,649,650,654],{},[142,651,653],{"href":652},"\u002Fdeveloper\u002Fplugin-operations","Installieren & Betreiben"," — der Lebenszyklus aus Betreibersicht",[31,656,657,659,660],{},[142,658,145],{"href":144}," und ",[142,661,663],{"href":662},"\u002Fdeveloper\u002Fplugin-sandboxed-jobs","Sandbox-Jobs",[31,665,666],{},[142,667,669],{"href":668},"\u002Fdeveloper\u002Fplugin-troubleshooting","Fehlerbehebung",[11,671,672],{},"Architekturentscheidungen: ADR-0049 (Plattformvertrag), ADR-0050 (Entwurfsstrategien), ADR-0051 (geordnete Autonomie-Gates), ADR-0052 (verbundene Apps und signierte Hooks), ADR-0053 (Sandbox-Plugin-Jobs).",[674,675,676],"style",{},"html pre.shiki code .s7YZ4, html code.shiki .s7YZ4{--shiki-default:#D73A49;--shiki-dark:#F47067}html pre.shiki code .sYgZi, html code.shiki .sYgZi{--shiki-default:#24292E;--shiki-dark:#ADBAC7}html pre.shiki code .s-HuK, html code.shiki .s-HuK{--shiki-default:#032F62;--shiki-dark:#96D0FF}html pre.shiki code .sviXB, html code.shiki .sviXB{--shiki-default:#005CC5;--shiki-dark:#6CB6FF}html pre.shiki code .sPO5f, html code.shiki .sPO5f{--shiki-default:#6F42C1;--shiki-dark:#DCBDFB}html pre.shiki code .sDN9O, html code.shiki .sDN9O{--shiki-default:#6A737D;--shiki-dark:#768390}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);}",{"title":251,"searchDepth":279,"depth":279,"links":678},[679,680,681,682,683],{"id":79,"depth":279,"text":80},{"id":243,"depth":279,"text":244},{"id":489,"depth":279,"text":490},{"id":538,"depth":279,"text":539},{"id":622,"depth":279,"text":623},"Wie Owlat erweitert wird: ein validiertes Manifest, ein Capability-Modell und drei Ausführungsstufen.","md",{},"\u002Fdeveloper\u002Fplugin-platform",{"title":6,"description":684},"3.developer\u002F40.plugin-platform","TITjWlKlzBuF21-M3ZXwpJ-b7jL-ou8OyH6vWK8hsJc",[692,696],{"title":693,"path":694,"stem":695,"children":-1},"Convex-Backend","\u002Fdeveloper\u002Fconvex","3.developer\u002F4.convex",{"title":632,"path":631,"stem":697,"children":-1},"3.developer\u002F41.plugin-authoring",1786915109125]