[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"public-branding":3,"category-de-api":8},{"siteName":4,"primaryColor":5,"accentColor":6,"faviconUrl":7,"logoUrl":7},"KiroCloud","#ffffff","#888888","",[9,445,3404,3836],{"id":10,"title":11,"author":12,"body":13,"category":435,"description":436,"extension":437,"lastUpdated":12,"meta":438,"navigation":326,"order":440,"path":441,"readTime":12,"seo":442,"stem":443,"__hash__":444},"docs\u002Fdocs\u002Fde\u002Fapi-keys.md","API Keys",null,{"type":14,"value":15,"toc":424},"minimark",[16,21,25,30,33,78,88,92,100,123,127,130,163,178,182,187,244,248,306,310,366,370,420],[17,18,20],"h1",{"id":19},"api-automatisierung","API & Automatisierung",[22,23,24],"p",{},"KiroCloud bietet eine moderne, REST-basierte API an, mit der du externe Tools, Bots oder CI\u002FCD-Pipelines an dein Dashboard anbinden kannst. Alle Anfragen erfordern eine sichere Authentifizierung via API-Schlüssel.",[26,27,29],"h2",{"id":28},"_1-api-schlüssel-erstellen","1. API-Schlüssel erstellen",[22,31,32],{},"API-Schlüssel werden direkt in deinem Benutzer-Dashboard generiert:",[34,35,36,45,51,54,61,68],"ol",{},[37,38,39,40,44],"li",{},"Navigiere im Dashboard zu ",[41,42,43],"strong",{},"Einstellungen > Entwickler & API-Schlüssel",".",[37,46,47,48,44],{},"Klicke auf ",[41,49,50],{},"Neuen API-Schlüssel erstellen",[37,52,53],{},"Vergib einen eindeutigen Namen (z. B. \"GitHub Actions Deployment\").",[37,55,56,57,60],{},"Bestimme die ",[41,58,59],{},"Gültigkeitsdauer"," (in Tagen).",[37,62,63,64,67],{},"Wähle die benötigten ",[41,65,66],{},"Berechtigungen (Scopes)",". Vergib stets nur die Rechte, die für den jeweiligen Anwendungsfall zwingend nötig sind (Prinzip der geringsten Privilegien \u002F Least Privilege).",[37,69,47,70,73,74,77],{},[41,71,72],{},"Erstellen"," und ",[41,75,76],{},"kopiere den Token sofort",". Er wird dir danach nie wieder im Klartext angezeigt!",[79,80,81],"blockquote",{},[22,82,83,87],{},[84,85,86],"span",{},"!WARNING","\nTeile deinen API-Schlüssel niemals öffentlich. Sollte ein Schlüssel kompromittiert werden, lösche (revoke) ihn umgehend im Dashboard.",[26,89,91],{"id":90},"_2-authentifizierung","2. Authentifizierung",[22,93,94,95,99],{},"Um sich bei der KiroCloud-API zu authentifizieren, musst du den API-Schlüssel im ",[96,97,98],"code",{},"Authorization","-Header als Bearer-Token mitsenden.",[101,102,106],"pre",{"className":103,"code":104,"language":105,"meta":7,"style":7},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Authorization: Bearer kiro_sec_DEIN_SCHLUESSEL\n","bash",[96,107,108],{"__ignoreMap":7},[84,109,112,116,120],{"class":110,"line":111},"line",1,[84,113,115],{"class":114},"sBMFI","Authorization:",[84,117,119],{"class":118},"sfazB"," Bearer",[84,121,122],{"class":118}," kiro_sec_DEIN_SCHLUESSEL\n",[26,124,126],{"id":125},"_3-berechtigungen-scopes","3. Berechtigungen (Scopes)",[22,128,129],{},"Je nachdem, was du automatisieren willst, benötigt dein API-Schlüssel spezifische Scopes:",[131,132,133,139,145,151,157],"ul",{},[37,134,135,138],{},[96,136,137],{},"bots:read"," - Erlaubt das Auslesen des Status und der Metriken deiner eigenen Discord Bots.",[37,140,141,144],{},[96,142,143],{},"bots:write"," - Erlaubt Steuerungsbefehle (Starten, Stoppen, Neustarten) und das Senden von Embeds.",[37,146,147,150],{},[96,148,149],{},"tickets:read"," - Erlaubt das Einsehen deiner eigenen Support-Tickets.",[37,152,153,156],{},[96,154,155],{},"tickets:write"," - Erlaubt das Eröffnen neuer Support-Tickets und Antworten.",[37,158,159,162],{},[96,160,161],{},"servers:read"," - Erlaubt die Abfrage des Serverstatus für verknüpfte Minecraft-Server.",[79,164,165],{},[22,166,167,170,171,173,174,177],{},[84,168,169],{},"!TIP","\nEin API Key mit dem Scope ",[96,172,143],{}," kann beispielsweise nach einem erfolgreichen GitHub Actions Build automatisch einen Neustart des Bots über ",[96,175,176],{},"POST \u002Fapi\u002Fv1\u002Fbots\u002F:id\u002Frestart"," auslösen.",[26,179,181],{"id":180},"_4-beispiel-aufrufe","4. Beispiel-Aufrufe",[183,184,186],"h3",{"id":185},"curl","cURL",[101,188,190],{"className":103,"code":189,"language":105,"meta":7,"style":7},"curl -X GET \"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1\u002Fbots\" \\\n  -H \"Authorization: Bearer kiro_sec_YOUR_API_KEY\" \\\n  -H \"Accept: application\u002Fjson\"\n",[96,191,192,216,231],{"__ignoreMap":7},[84,193,194,196,199,202,206,209,212],{"class":110,"line":111},[84,195,185],{"class":114},[84,197,198],{"class":118}," -X",[84,200,201],{"class":118}," GET",[84,203,205],{"class":204},"sMK4o"," \"",[84,207,208],{"class":118},"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1\u002Fbots",[84,210,211],{"class":204},"\"",[84,213,215],{"class":214},"sTEyZ"," \\\n",[84,217,219,222,224,227,229],{"class":110,"line":218},2,[84,220,221],{"class":118},"  -H",[84,223,205],{"class":204},[84,225,226],{"class":118},"Authorization: Bearer kiro_sec_YOUR_API_KEY",[84,228,211],{"class":204},[84,230,215],{"class":214},[84,232,234,236,238,241],{"class":110,"line":233},3,[84,235,221],{"class":118},[84,237,205],{"class":204},[84,239,240],{"class":118},"Accept: application\u002Fjson",[84,242,243],{"class":204},"\"\n",[183,245,247],{"id":246},"nodejs-javascript-fetch","Node.js \u002F JavaScript (Fetch)",[101,249,253],{"className":250,"code":251,"language":252,"meta":7,"style":7},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","const response = await fetch(\"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1\u002Fbots\", {\n  method: \"GET\",\n  headers: {\n    \"Authorization\": \"Bearer kiro_sec_YOUR_API_KEY\",\n    \"Content-Type\": \"application\u002Fjson\"\n  }\n});\nconst data = await response.json();\nconsole.log(data);\n","javascript",[96,254,255,260,265,270,276,282,288,294,300],{"__ignoreMap":7},[84,256,257],{"class":110,"line":111},[84,258,259],{},"const response = await fetch(\"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1\u002Fbots\", {\n",[84,261,262],{"class":110,"line":218},[84,263,264],{},"  method: \"GET\",\n",[84,266,267],{"class":110,"line":233},[84,268,269],{},"  headers: {\n",[84,271,273],{"class":110,"line":272},4,[84,274,275],{},"    \"Authorization\": \"Bearer kiro_sec_YOUR_API_KEY\",\n",[84,277,279],{"class":110,"line":278},5,[84,280,281],{},"    \"Content-Type\": \"application\u002Fjson\"\n",[84,283,285],{"class":110,"line":284},6,[84,286,287],{},"  }\n",[84,289,291],{"class":110,"line":290},7,[84,292,293],{},"});\n",[84,295,297],{"class":110,"line":296},8,[84,298,299],{},"const data = await response.json();\n",[84,301,303],{"class":110,"line":302},9,[84,304,305],{},"console.log(data);\n",[183,307,309],{"id":308},"python-requests","Python (Requests)",[101,311,315],{"className":312,"code":313,"language":314,"meta":7,"style":7},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import requests\n\nurl = \"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1\u002Fbots\"\nheaders = {\n    \"Authorization\": \"Bearer kiro_sec_YOUR_API_KEY\",\n    \"Content-Type\": \"application\u002Fjson\"\n}\n\nresponse = requests.get(url, headers=headers)\nprint(response.json())\n","python",[96,316,317,322,328,333,338,342,346,351,355,360],{"__ignoreMap":7},[84,318,319],{"class":110,"line":111},[84,320,321],{},"import requests\n",[84,323,324],{"class":110,"line":218},[84,325,327],{"emptyLinePlaceholder":326},true,"\n",[84,329,330],{"class":110,"line":233},[84,331,332],{},"url = \"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1\u002Fbots\"\n",[84,334,335],{"class":110,"line":272},[84,336,337],{},"headers = {\n",[84,339,340],{"class":110,"line":278},[84,341,275],{},[84,343,344],{"class":110,"line":284},[84,345,281],{},[84,347,348],{"class":110,"line":290},[84,349,350],{},"}\n",[84,352,353],{"class":110,"line":296},[84,354,327],{"emptyLinePlaceholder":326},[84,356,357],{"class":110,"line":302},[84,358,359],{},"response = requests.get(url, headers=headers)\n",[84,361,363],{"class":110,"line":362},10,[84,364,365],{},"print(response.json())\n",[26,367,369],{"id":368},"_5-fehlerbehebung","5. Fehlerbehebung",[371,372,373,386],"table",{},[374,375,376],"thead",{},[377,378,379,383],"tr",{},[380,381,382],"th",{},"Status Code",[380,384,385],{},"Möglicher Grund",[387,388,389,400,410],"tbody",{},[377,390,391,397],{},[392,393,394],"td",{},[96,395,396],{},"401 Unauthorized",[392,398,399],{},"API-Schlüssel fehlt, ist ungültig oder abgelaufen.",[377,401,402,407],{},[392,403,404],{},[96,405,406],{},"403 Forbidden",[392,408,409],{},"Der API-Schlüssel hat nicht den erforderlichen Scope für diesen Endpunkt.",[377,411,412,417],{},[392,413,414],{},[96,415,416],{},"429 Too Many Requests",[392,418,419],{},"Rate-Limit überschritten.",[421,422,423],"style",{},"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 .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}",{"title":7,"searchDepth":218,"depth":218,"links":425},[426,427,428,429,434],{"id":28,"depth":218,"text":29},{"id":90,"depth":218,"text":91},{"id":125,"depth":218,"text":126},{"id":180,"depth":218,"text":181,"children":430},[431,432,433],{"id":185,"depth":233,"text":186},{"id":246,"depth":233,"text":247},{"id":308,"depth":233,"text":309},{"id":368,"depth":218,"text":369},"api","Verwalte und nutze KiroCloud API-Schlüssel für die Automatisierung","md",{"icon":439},"i-lucide-key",0,"\u002Fdocs\u002Fde\u002Fapi-keys",{"title":11,"description":436},"docs\u002Fde\u002Fapi-keys","cvpaNNLdXuHptlZr8Cn6t2obzr_HccjR_pACQL58ky0",{"id":446,"title":447,"author":12,"body":448,"category":435,"description":3397,"extension":437,"lastUpdated":12,"meta":3398,"navigation":326,"order":440,"path":3400,"readTime":12,"seo":3401,"stem":3402,"__hash__":3403},"docs\u002Fdocs\u002Fde\u002Frest-endpoints.md","KiroCloud REST API Referenz",{"type":14,"value":449,"toc":3381},[450,454,457,465,468,472,478,482,504,511,513,517,520,524,527,2272,2274,2278,2284,2495,2497,2501,2504,2706,2708,2712,2716,2724,2727,2744,2904,2910,2913,2919,2921,2925,2931,2934,2948,2954,2957,2965,2972,2975,2991,2997,3004,3012,3018,3021,3029,3035,3038,3051,3155,3157,3161,3167,3170,3178,3183,3186,3198,3268,3270,3274,3277,3378],[17,451,453],{"id":452},"kirocloud-rest-api-sdk-dokumentation","KiroCloud REST API & SDK Dokumentation",[22,455,456],{},"Herzlich willkommen zur offiziellen KiroCloud REST API-Referenz für Entwickler und Bot-Betreiber.\nDiese Dokumentation bietet alle notwendigen Spezifikationen, Endpunkte und SDK-Beispiele, um KiroCloud in eigene Anwendungen, Überwachungs-Tools oder CI\u002FCD-Pipelines zu integrieren.",[79,458,459],{},[22,460,461,464],{},[84,462,463],{},"!IMPORTANT","\nAlle Anfragen an authentifizierte Endpunkte erfordern einen gültigen API-Schlüssel, der im HTTP-Header mitgesendet werden muss. Teile deinen API-Schlüssel niemals öffentlich (z. B. in GitHub-Repositories oder Client-seitigem Frontend-Code).",[466,467],"hr",{},[26,469,471],{"id":470},"_1-authentifizierung","1. Authentifizierung",[22,473,474,475,477],{},"Um Anfragen an die API zu senden, übergibst du deinen API-Schlüssel im ",[96,476,98],{},"-Header als Bearer Token.",[183,479,481],{"id":480},"header-format","Header-Format",[101,483,487],{"className":484,"code":485,"language":486,"meta":7,"style":7},"language-http shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","Authorization: Bearer kiro_sec_DEIN_API_SCHLUESSEL\nContent-Type: application\u002Fjson\nAccept: application\u002Fjson\n","http",[96,488,489,494,499],{"__ignoreMap":7},[84,490,491],{"class":110,"line":111},[84,492,493],{},"Authorization: Bearer kiro_sec_DEIN_API_SCHLUESSEL\n",[84,495,496],{"class":110,"line":218},[84,497,498],{},"Content-Type: application\u002Fjson\n",[84,500,501],{"class":110,"line":233},[84,502,503],{},"Accept: application\u002Fjson\n",[22,505,506,507,510],{},"API-Schlüssel können direkt im KiroCloud Dashboard unter den ",[41,508,509],{},"Entwickler-Einstellungen"," erstellt und mit spezifischen Berechtigungen (Scopes) versehen werden.",[466,512],{},[26,514,516],{"id":515},"_2-fertige-sdk-wrapper-für-deine-projekte","2. Fertige SDK-Wrapper für deine Projekte",[22,518,519],{},"Damit du nicht jeden HTTP-Request manuell implementieren musst, findest du hier produktionsreife Client-Klassen für Node.js \u002F TypeScript, Python und Bash.",[183,521,523],{"id":522},"_21-nodejs-typescript-native-fetch-api","2.1 Node.js \u002F TypeScript (Native Fetch API)",[22,525,526],{},"Optimiert für moderne Node.js-Umgebungen (ab v18) und Edge-Runtimes:",[101,528,532],{"className":529,"code":530,"language":531,"meta":7,"style":7},"language-typescript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u002F\u002F kiroClient.ts\nexport interface BotStatusResponse {\n  success: boolean;\n  data: {\n    id: string;\n    name: string;\n    status: 'online' | 'offline' | 'starting' | 'error';\n    runtimeExpiresAt: string;\n    uptimeSeconds: number;\n  };\n}\n\nexport class KiroClient {\n  private baseUrl: string;\n  private apiKey: string;\n\n  constructor(apiKey: string, baseUrl = 'https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1') {\n    this.apiKey = apiKey;\n    this.baseUrl = baseUrl;\n  }\n\n  private async request\u003CT>(method: string, endpoint: string, body?: unknown): Promise\u003CT> {\n    const headers: Record\u003Cstring, string> = {\n      'Authorization': `Bearer ${this.apiKey}`,\n      'Content-Type': 'application\u002Fjson',\n      'Accept': 'application\u002Fjson',\n    };\n\n    const response = await fetch(`${this.baseUrl}${endpoint}`, {\n      method,\n      headers,\n      body: body ? JSON.stringify(body) : undefined,\n    });\n\n    if (!response.ok) {\n      const errorData = await response.json().catch(() => ({}));\n      throw new Error(`KiroCloud API Error [${response.status}]: ${errorData.message || response.statusText}`);\n    }\n\n    return response.json() as Promise\u003CT>;\n  }\n\n  \u002F\u002F --- Public Status & Platform Health ---\n\n  async getPlatformStatus() {\n    return this.request\u003C{ success: boolean; data: Record\u003Cstring, unknown> }>('GET', '\u002Fpublic\u002Fstatus');\n  }\n\n  async getPlatformStats() {\n    return this.request\u003C{ success: boolean; data: { activeBots: number; activeServers: number; uptime: number } }>('GET', '\u002Fpublic\u002Fstats');\n  }\n\n  \u002F\u002F --- Bot Management (Scope: bots:read, bots:write) ---\n\n  async listBots() {\n    return this.request\u003C{ success: boolean; data: Array\u003C{ id: string; name: string; status: string }> }>('GET', '\u002Fbots');\n  }\n\n  async getBot(botId: string) {\n    return this.request\u003CBotStatusResponse>('GET', `\u002Fbots\u002F${botId}`);\n  }\n\n  async startBot(botId: string) {\n    return this.request\u003C{ success: boolean; message: string }>('POST', `\u002Fbots\u002F${botId}\u002Fstart`);\n  }\n\n  async stopBot(botId: string) {\n    return this.request\u003C{ success: boolean; message: string }>('POST', `\u002Fbots\u002F${botId}\u002Fstop`);\n  }\n\n  async restartBot(botId: string) {\n    return this.request\u003C{ success: boolean; message: string }>('POST', `\u002Fbots\u002F${botId}\u002Frestart`);\n  }\n\n  async sendEmbed(botId: string, payload: { channelId: string; embed: Record\u003Cstring, unknown> }) {\n    return this.request\u003C{ success: boolean; messageId: string }>('POST', `\u002Fbots\u002F${botId}\u002Fsend-embed`, payload);\n  }\n\n  \u002F\u002F --- Support Tickets (Scope: tickets:read, tickets:write) ---\n\n  async listTickets() {\n    return this.request\u003C{ success: boolean; data: Array\u003C{ id: string; subject: string; status: string }> }>('GET', '\u002Ftickets');\n  }\n\n  async createTicket(payload: { subject: string; message: string; priority?: 'low' | 'normal' | 'high' }) {\n    return this.request\u003C{ success: boolean; ticketId: string }>('POST', '\u002Ftickets', payload);\n  }\n}\n","typescript",[96,533,534,540,556,571,580,592,603,649,660,672,677,682,687,700,715,729,734,771,785,799,804,809,871,900,932,953,973,979,984,1022,1030,1038,1072,1082,1087,1112,1157,1218,1224,1229,1256,1261,1266,1272,1277,1290,1356,1361,1366,1378,1455,1460,1465,1471,1476,1488,1566,1571,1576,1597,1638,1643,1648,1668,1726,1731,1736,1756,1812,1817,1822,1842,1898,1903,1908,1964,2025,2030,2035,2041,2046,2058,2133,2138,2143,2210,2262,2267],{"__ignoreMap":7},[84,535,536],{"class":110,"line":111},[84,537,539],{"class":538},"sHwdD","\u002F\u002F kiroClient.ts\n",[84,541,542,546,550,553],{"class":110,"line":218},[84,543,545],{"class":544},"s7zQu","export",[84,547,549],{"class":548},"spNyl"," interface",[84,551,552],{"class":114}," BotStatusResponse",[84,554,555],{"class":204}," {\n",[84,557,558,562,565,568],{"class":110,"line":233},[84,559,561],{"class":560},"swJcz","  success",[84,563,564],{"class":204},":",[84,566,567],{"class":114}," boolean",[84,569,570],{"class":204},";\n",[84,572,573,576,578],{"class":110,"line":272},[84,574,575],{"class":560},"  data",[84,577,564],{"class":204},[84,579,555],{"class":204},[84,581,582,585,587,590],{"class":110,"line":278},[84,583,584],{"class":560},"    id",[84,586,564],{"class":204},[84,588,589],{"class":114}," string",[84,591,570],{"class":204},[84,593,594,597,599,601],{"class":110,"line":284},[84,595,596],{"class":560},"    name",[84,598,564],{"class":204},[84,600,589],{"class":114},[84,602,570],{"class":204},[84,604,605,608,610,613,616,619,622,624,627,629,631,633,636,638,640,642,645,647],{"class":110,"line":290},[84,606,607],{"class":560},"    status",[84,609,564],{"class":204},[84,611,612],{"class":204}," '",[84,614,615],{"class":118},"online",[84,617,618],{"class":204},"'",[84,620,621],{"class":204}," |",[84,623,612],{"class":204},[84,625,626],{"class":118},"offline",[84,628,618],{"class":204},[84,630,621],{"class":204},[84,632,612],{"class":204},[84,634,635],{"class":118},"starting",[84,637,618],{"class":204},[84,639,621],{"class":204},[84,641,612],{"class":204},[84,643,644],{"class":118},"error",[84,646,618],{"class":204},[84,648,570],{"class":204},[84,650,651,654,656,658],{"class":110,"line":296},[84,652,653],{"class":560},"    runtimeExpiresAt",[84,655,564],{"class":204},[84,657,589],{"class":114},[84,659,570],{"class":204},[84,661,662,665,667,670],{"class":110,"line":302},[84,663,664],{"class":560},"    uptimeSeconds",[84,666,564],{"class":204},[84,668,669],{"class":114}," number",[84,671,570],{"class":204},[84,673,674],{"class":110,"line":362},[84,675,676],{"class":204},"  };\n",[84,678,680],{"class":110,"line":679},11,[84,681,350],{"class":204},[84,683,685],{"class":110,"line":684},12,[84,686,327],{"emptyLinePlaceholder":326},[84,688,690,692,695,698],{"class":110,"line":689},13,[84,691,545],{"class":544},[84,693,694],{"class":548}," class",[84,696,697],{"class":114}," KiroClient",[84,699,555],{"class":204},[84,701,703,706,709,711,713],{"class":110,"line":702},14,[84,704,705],{"class":548},"  private",[84,707,708],{"class":560}," baseUrl",[84,710,564],{"class":204},[84,712,589],{"class":114},[84,714,570],{"class":204},[84,716,718,720,723,725,727],{"class":110,"line":717},15,[84,719,705],{"class":548},[84,721,722],{"class":560}," apiKey",[84,724,564],{"class":204},[84,726,589],{"class":114},[84,728,570],{"class":204},[84,730,732],{"class":110,"line":731},16,[84,733,327],{"emptyLinePlaceholder":326},[84,735,737,740,743,747,749,751,754,756,759,761,764,766,769],{"class":110,"line":736},17,[84,738,739],{"class":548},"  constructor",[84,741,742],{"class":204},"(",[84,744,746],{"class":745},"sHdIc","apiKey",[84,748,564],{"class":204},[84,750,589],{"class":114},[84,752,753],{"class":204},",",[84,755,708],{"class":745},[84,757,758],{"class":204}," =",[84,760,612],{"class":204},[84,762,763],{"class":118},"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1",[84,765,618],{"class":204},[84,767,768],{"class":204},")",[84,770,555],{"class":204},[84,772,774,777,779,781,783],{"class":110,"line":773},18,[84,775,776],{"class":204},"    this.",[84,778,746],{"class":214},[84,780,758],{"class":204},[84,782,722],{"class":214},[84,784,570],{"class":204},[84,786,788,790,793,795,797],{"class":110,"line":787},19,[84,789,776],{"class":204},[84,791,792],{"class":214},"baseUrl",[84,794,758],{"class":204},[84,796,708],{"class":214},[84,798,570],{"class":204},[84,800,802],{"class":110,"line":801},20,[84,803,287],{"class":204},[84,805,807],{"class":110,"line":806},21,[84,808,327],{"emptyLinePlaceholder":326},[84,810,812,814,817,820,823,826,829,832,834,836,838,841,843,845,847,850,853,856,859,862,864,866,869],{"class":110,"line":811},22,[84,813,705],{"class":548},[84,815,816],{"class":548}," async",[84,818,819],{"class":560}," request",[84,821,822],{"class":204},"\u003C",[84,824,825],{"class":114},"T",[84,827,828],{"class":204},">(",[84,830,831],{"class":745},"method",[84,833,564],{"class":204},[84,835,589],{"class":114},[84,837,753],{"class":204},[84,839,840],{"class":745}," endpoint",[84,842,564],{"class":204},[84,844,589],{"class":114},[84,846,753],{"class":204},[84,848,849],{"class":745}," body",[84,851,852],{"class":204},"?:",[84,854,855],{"class":114}," unknown",[84,857,858],{"class":204},"):",[84,860,861],{"class":114}," Promise",[84,863,822],{"class":204},[84,865,825],{"class":114},[84,867,868],{"class":204},">",[84,870,555],{"class":204},[84,872,874,877,880,882,885,887,890,892,894,896,898],{"class":110,"line":873},23,[84,875,876],{"class":548},"    const",[84,878,879],{"class":214}," headers",[84,881,564],{"class":204},[84,883,884],{"class":114}," Record",[84,886,822],{"class":204},[84,888,889],{"class":114},"string",[84,891,753],{"class":204},[84,893,589],{"class":114},[84,895,868],{"class":204},[84,897,758],{"class":204},[84,899,555],{"class":204},[84,901,903,906,908,910,912,915,918,921,924,926,929],{"class":110,"line":902},24,[84,904,905],{"class":204},"      '",[84,907,98],{"class":560},[84,909,618],{"class":204},[84,911,564],{"class":204},[84,913,914],{"class":204}," `",[84,916,917],{"class":118},"Bearer ",[84,919,920],{"class":204},"${",[84,922,923],{"class":204},"this.",[84,925,746],{"class":214},[84,927,928],{"class":204},"}`",[84,930,931],{"class":204},",\n",[84,933,935,937,940,942,944,946,949,951],{"class":110,"line":934},25,[84,936,905],{"class":204},[84,938,939],{"class":560},"Content-Type",[84,941,618],{"class":204},[84,943,564],{"class":204},[84,945,612],{"class":204},[84,947,948],{"class":118},"application\u002Fjson",[84,950,618],{"class":204},[84,952,931],{"class":204},[84,954,956,958,961,963,965,967,969,971],{"class":110,"line":955},26,[84,957,905],{"class":204},[84,959,960],{"class":560},"Accept",[84,962,618],{"class":204},[84,964,564],{"class":204},[84,966,612],{"class":204},[84,968,948],{"class":118},[84,970,618],{"class":204},[84,972,931],{"class":204},[84,974,976],{"class":110,"line":975},27,[84,977,978],{"class":204},"    };\n",[84,980,982],{"class":110,"line":981},28,[84,983,327],{"emptyLinePlaceholder":326},[84,985,987,989,992,994,997,1001,1003,1006,1008,1010,1013,1016,1018,1020],{"class":110,"line":986},29,[84,988,876],{"class":548},[84,990,991],{"class":214}," response",[84,993,758],{"class":204},[84,995,996],{"class":544}," await",[84,998,1000],{"class":999},"s2Zo4"," fetch",[84,1002,742],{"class":560},[84,1004,1005],{"class":204},"`${",[84,1007,923],{"class":204},[84,1009,792],{"class":214},[84,1011,1012],{"class":204},"}${",[84,1014,1015],{"class":214},"endpoint",[84,1017,928],{"class":204},[84,1019,753],{"class":204},[84,1021,555],{"class":204},[84,1023,1025,1028],{"class":110,"line":1024},30,[84,1026,1027],{"class":214},"      method",[84,1029,931],{"class":204},[84,1031,1033,1036],{"class":110,"line":1032},31,[84,1034,1035],{"class":214},"      headers",[84,1037,931],{"class":204},[84,1039,1041,1044,1046,1048,1051,1054,1056,1059,1061,1064,1067,1069],{"class":110,"line":1040},32,[84,1042,1043],{"class":560},"      body",[84,1045,564],{"class":204},[84,1047,849],{"class":214},[84,1049,1050],{"class":204}," ?",[84,1052,1053],{"class":214}," JSON",[84,1055,44],{"class":204},[84,1057,1058],{"class":999},"stringify",[84,1060,742],{"class":560},[84,1062,1063],{"class":214},"body",[84,1065,1066],{"class":560},") ",[84,1068,564],{"class":204},[84,1070,1071],{"class":204}," undefined,\n",[84,1073,1075,1078,1080],{"class":110,"line":1074},33,[84,1076,1077],{"class":204},"    }",[84,1079,768],{"class":560},[84,1081,570],{"class":204},[84,1083,1085],{"class":110,"line":1084},34,[84,1086,327],{"emptyLinePlaceholder":326},[84,1088,1090,1093,1096,1099,1102,1104,1107,1109],{"class":110,"line":1089},35,[84,1091,1092],{"class":544},"    if",[84,1094,1095],{"class":560}," (",[84,1097,1098],{"class":204},"!",[84,1100,1101],{"class":214},"response",[84,1103,44],{"class":204},[84,1105,1106],{"class":214},"ok",[84,1108,1066],{"class":560},[84,1110,1111],{"class":204},"{\n",[84,1113,1115,1118,1121,1123,1125,1127,1129,1132,1135,1137,1140,1142,1144,1147,1149,1152,1155],{"class":110,"line":1114},36,[84,1116,1117],{"class":548},"      const",[84,1119,1120],{"class":214}," errorData",[84,1122,758],{"class":204},[84,1124,996],{"class":544},[84,1126,991],{"class":214},[84,1128,44],{"class":204},[84,1130,1131],{"class":999},"json",[84,1133,1134],{"class":560},"()",[84,1136,44],{"class":204},[84,1138,1139],{"class":999},"catch",[84,1141,742],{"class":560},[84,1143,1134],{"class":204},[84,1145,1146],{"class":548}," =>",[84,1148,1095],{"class":560},[84,1150,1151],{"class":204},"{}",[84,1153,1154],{"class":560},"))",[84,1156,570],{"class":204},[84,1158,1160,1163,1166,1169,1171,1174,1177,1179,1181,1183,1186,1189,1192,1194,1197,1199,1202,1205,1207,1209,1212,1214,1216],{"class":110,"line":1159},37,[84,1161,1162],{"class":544},"      throw",[84,1164,1165],{"class":204}," new",[84,1167,1168],{"class":999}," Error",[84,1170,742],{"class":560},[84,1172,1173],{"class":204},"`",[84,1175,1176],{"class":118},"KiroCloud API Error [",[84,1178,920],{"class":204},[84,1180,1101],{"class":214},[84,1182,44],{"class":204},[84,1184,1185],{"class":214},"status",[84,1187,1188],{"class":204},"}",[84,1190,1191],{"class":118},"]: ",[84,1193,920],{"class":204},[84,1195,1196],{"class":214},"errorData",[84,1198,44],{"class":204},[84,1200,1201],{"class":214},"message ",[84,1203,1204],{"class":204},"||",[84,1206,991],{"class":214},[84,1208,44],{"class":204},[84,1210,1211],{"class":214},"statusText",[84,1213,928],{"class":204},[84,1215,768],{"class":560},[84,1217,570],{"class":204},[84,1219,1221],{"class":110,"line":1220},38,[84,1222,1223],{"class":204},"    }\n",[84,1225,1227],{"class":110,"line":1226},39,[84,1228,327],{"emptyLinePlaceholder":326},[84,1230,1232,1235,1237,1239,1241,1244,1247,1249,1251,1253],{"class":110,"line":1231},40,[84,1233,1234],{"class":544},"    return",[84,1236,991],{"class":214},[84,1238,44],{"class":204},[84,1240,1131],{"class":999},[84,1242,1243],{"class":560},"() ",[84,1245,1246],{"class":544},"as",[84,1248,861],{"class":114},[84,1250,822],{"class":204},[84,1252,825],{"class":114},[84,1254,1255],{"class":204},">;\n",[84,1257,1259],{"class":110,"line":1258},41,[84,1260,287],{"class":204},[84,1262,1264],{"class":110,"line":1263},42,[84,1265,327],{"emptyLinePlaceholder":326},[84,1267,1269],{"class":110,"line":1268},43,[84,1270,1271],{"class":538},"  \u002F\u002F --- Public Status & Platform Health ---\n",[84,1273,1275],{"class":110,"line":1274},44,[84,1276,327],{"emptyLinePlaceholder":326},[84,1278,1280,1283,1286,1288],{"class":110,"line":1279},45,[84,1281,1282],{"class":548},"  async",[84,1284,1285],{"class":560}," getPlatformStatus",[84,1287,1134],{"class":204},[84,1289,555],{"class":204},[84,1291,1293,1295,1298,1301,1304,1307,1309,1311,1314,1317,1319,1321,1323,1325,1327,1329,1331,1334,1336,1338,1341,1343,1345,1347,1350,1352,1354],{"class":110,"line":1292},46,[84,1294,1234],{"class":544},[84,1296,1297],{"class":204}," this.",[84,1299,1300],{"class":999},"request",[84,1302,1303],{"class":204},"\u003C{",[84,1305,1306],{"class":560}," success",[84,1308,564],{"class":204},[84,1310,567],{"class":114},[84,1312,1313],{"class":204},";",[84,1315,1316],{"class":560}," data",[84,1318,564],{"class":204},[84,1320,884],{"class":114},[84,1322,822],{"class":204},[84,1324,889],{"class":114},[84,1326,753],{"class":204},[84,1328,855],{"class":114},[84,1330,868],{"class":204},[84,1332,1333],{"class":204}," }>",[84,1335,742],{"class":560},[84,1337,618],{"class":204},[84,1339,1340],{"class":118},"GET",[84,1342,618],{"class":204},[84,1344,753],{"class":204},[84,1346,612],{"class":204},[84,1348,1349],{"class":118},"\u002Fpublic\u002Fstatus",[84,1351,618],{"class":204},[84,1353,768],{"class":560},[84,1355,570],{"class":204},[84,1357,1359],{"class":110,"line":1358},47,[84,1360,287],{"class":204},[84,1362,1364],{"class":110,"line":1363},48,[84,1365,327],{"emptyLinePlaceholder":326},[84,1367,1369,1371,1374,1376],{"class":110,"line":1368},49,[84,1370,1282],{"class":548},[84,1372,1373],{"class":560}," getPlatformStats",[84,1375,1134],{"class":204},[84,1377,555],{"class":204},[84,1379,1381,1383,1385,1387,1389,1391,1393,1395,1397,1399,1401,1404,1407,1409,1411,1413,1416,1418,1420,1422,1425,1427,1429,1432,1434,1436,1438,1440,1442,1444,1446,1449,1451,1453],{"class":110,"line":1380},50,[84,1382,1234],{"class":544},[84,1384,1297],{"class":204},[84,1386,1300],{"class":999},[84,1388,1303],{"class":204},[84,1390,1306],{"class":560},[84,1392,564],{"class":204},[84,1394,567],{"class":114},[84,1396,1313],{"class":204},[84,1398,1316],{"class":560},[84,1400,564],{"class":204},[84,1402,1403],{"class":204}," {",[84,1405,1406],{"class":560}," activeBots",[84,1408,564],{"class":204},[84,1410,669],{"class":114},[84,1412,1313],{"class":204},[84,1414,1415],{"class":560}," activeServers",[84,1417,564],{"class":204},[84,1419,669],{"class":114},[84,1421,1313],{"class":204},[84,1423,1424],{"class":560}," uptime",[84,1426,564],{"class":204},[84,1428,669],{"class":114},[84,1430,1431],{"class":204}," }",[84,1433,1333],{"class":204},[84,1435,742],{"class":560},[84,1437,618],{"class":204},[84,1439,1340],{"class":118},[84,1441,618],{"class":204},[84,1443,753],{"class":204},[84,1445,612],{"class":204},[84,1447,1448],{"class":118},"\u002Fpublic\u002Fstats",[84,1450,618],{"class":204},[84,1452,768],{"class":560},[84,1454,570],{"class":204},[84,1456,1458],{"class":110,"line":1457},51,[84,1459,287],{"class":204},[84,1461,1463],{"class":110,"line":1462},52,[84,1464,327],{"emptyLinePlaceholder":326},[84,1466,1468],{"class":110,"line":1467},53,[84,1469,1470],{"class":538},"  \u002F\u002F --- Bot Management (Scope: bots:read, bots:write) ---\n",[84,1472,1474],{"class":110,"line":1473},54,[84,1475,327],{"emptyLinePlaceholder":326},[84,1477,1479,1481,1484,1486],{"class":110,"line":1478},55,[84,1480,1282],{"class":548},[84,1482,1483],{"class":560}," listBots",[84,1485,1134],{"class":204},[84,1487,555],{"class":204},[84,1489,1491,1493,1495,1497,1499,1501,1503,1505,1507,1509,1511,1514,1516,1519,1521,1523,1525,1528,1530,1532,1534,1537,1539,1541,1543,1545,1547,1549,1551,1553,1555,1557,1560,1562,1564],{"class":110,"line":1490},56,[84,1492,1234],{"class":544},[84,1494,1297],{"class":204},[84,1496,1300],{"class":999},[84,1498,1303],{"class":204},[84,1500,1306],{"class":560},[84,1502,564],{"class":204},[84,1504,567],{"class":114},[84,1506,1313],{"class":204},[84,1508,1316],{"class":560},[84,1510,564],{"class":204},[84,1512,1513],{"class":114}," Array",[84,1515,1303],{"class":204},[84,1517,1518],{"class":560}," id",[84,1520,564],{"class":204},[84,1522,589],{"class":114},[84,1524,1313],{"class":204},[84,1526,1527],{"class":560}," name",[84,1529,564],{"class":204},[84,1531,589],{"class":114},[84,1533,1313],{"class":204},[84,1535,1536],{"class":560}," status",[84,1538,564],{"class":204},[84,1540,589],{"class":114},[84,1542,1333],{"class":204},[84,1544,1333],{"class":204},[84,1546,742],{"class":560},[84,1548,618],{"class":204},[84,1550,1340],{"class":118},[84,1552,618],{"class":204},[84,1554,753],{"class":204},[84,1556,612],{"class":204},[84,1558,1559],{"class":118},"\u002Fbots",[84,1561,618],{"class":204},[84,1563,768],{"class":560},[84,1565,570],{"class":204},[84,1567,1569],{"class":110,"line":1568},57,[84,1570,287],{"class":204},[84,1572,1574],{"class":110,"line":1573},58,[84,1575,327],{"emptyLinePlaceholder":326},[84,1577,1579,1581,1584,1586,1589,1591,1593,1595],{"class":110,"line":1578},59,[84,1580,1282],{"class":548},[84,1582,1583],{"class":560}," getBot",[84,1585,742],{"class":204},[84,1587,1588],{"class":745},"botId",[84,1590,564],{"class":204},[84,1592,589],{"class":114},[84,1594,768],{"class":204},[84,1596,555],{"class":204},[84,1598,1600,1602,1604,1606,1608,1611,1613,1615,1617,1619,1621,1623,1625,1628,1630,1632,1634,1636],{"class":110,"line":1599},60,[84,1601,1234],{"class":544},[84,1603,1297],{"class":204},[84,1605,1300],{"class":999},[84,1607,822],{"class":204},[84,1609,1610],{"class":114},"BotStatusResponse",[84,1612,868],{"class":204},[84,1614,742],{"class":560},[84,1616,618],{"class":204},[84,1618,1340],{"class":118},[84,1620,618],{"class":204},[84,1622,753],{"class":204},[84,1624,914],{"class":204},[84,1626,1627],{"class":118},"\u002Fbots\u002F",[84,1629,920],{"class":204},[84,1631,1588],{"class":214},[84,1633,928],{"class":204},[84,1635,768],{"class":560},[84,1637,570],{"class":204},[84,1639,1641],{"class":110,"line":1640},61,[84,1642,287],{"class":204},[84,1644,1646],{"class":110,"line":1645},62,[84,1647,327],{"emptyLinePlaceholder":326},[84,1649,1651,1653,1656,1658,1660,1662,1664,1666],{"class":110,"line":1650},63,[84,1652,1282],{"class":548},[84,1654,1655],{"class":560}," startBot",[84,1657,742],{"class":204},[84,1659,1588],{"class":745},[84,1661,564],{"class":204},[84,1663,589],{"class":114},[84,1665,768],{"class":204},[84,1667,555],{"class":204},[84,1669,1671,1673,1675,1677,1679,1681,1683,1685,1687,1690,1692,1694,1696,1698,1700,1703,1705,1707,1709,1711,1713,1715,1717,1720,1722,1724],{"class":110,"line":1670},64,[84,1672,1234],{"class":544},[84,1674,1297],{"class":204},[84,1676,1300],{"class":999},[84,1678,1303],{"class":204},[84,1680,1306],{"class":560},[84,1682,564],{"class":204},[84,1684,567],{"class":114},[84,1686,1313],{"class":204},[84,1688,1689],{"class":560}," message",[84,1691,564],{"class":204},[84,1693,589],{"class":114},[84,1695,1333],{"class":204},[84,1697,742],{"class":560},[84,1699,618],{"class":204},[84,1701,1702],{"class":118},"POST",[84,1704,618],{"class":204},[84,1706,753],{"class":204},[84,1708,914],{"class":204},[84,1710,1627],{"class":118},[84,1712,920],{"class":204},[84,1714,1588],{"class":214},[84,1716,1188],{"class":204},[84,1718,1719],{"class":118},"\u002Fstart",[84,1721,1173],{"class":204},[84,1723,768],{"class":560},[84,1725,570],{"class":204},[84,1727,1729],{"class":110,"line":1728},65,[84,1730,287],{"class":204},[84,1732,1734],{"class":110,"line":1733},66,[84,1735,327],{"emptyLinePlaceholder":326},[84,1737,1739,1741,1744,1746,1748,1750,1752,1754],{"class":110,"line":1738},67,[84,1740,1282],{"class":548},[84,1742,1743],{"class":560}," stopBot",[84,1745,742],{"class":204},[84,1747,1588],{"class":745},[84,1749,564],{"class":204},[84,1751,589],{"class":114},[84,1753,768],{"class":204},[84,1755,555],{"class":204},[84,1757,1759,1761,1763,1765,1767,1769,1771,1773,1775,1777,1779,1781,1783,1785,1787,1789,1791,1793,1795,1797,1799,1801,1803,1806,1808,1810],{"class":110,"line":1758},68,[84,1760,1234],{"class":544},[84,1762,1297],{"class":204},[84,1764,1300],{"class":999},[84,1766,1303],{"class":204},[84,1768,1306],{"class":560},[84,1770,564],{"class":204},[84,1772,567],{"class":114},[84,1774,1313],{"class":204},[84,1776,1689],{"class":560},[84,1778,564],{"class":204},[84,1780,589],{"class":114},[84,1782,1333],{"class":204},[84,1784,742],{"class":560},[84,1786,618],{"class":204},[84,1788,1702],{"class":118},[84,1790,618],{"class":204},[84,1792,753],{"class":204},[84,1794,914],{"class":204},[84,1796,1627],{"class":118},[84,1798,920],{"class":204},[84,1800,1588],{"class":214},[84,1802,1188],{"class":204},[84,1804,1805],{"class":118},"\u002Fstop",[84,1807,1173],{"class":204},[84,1809,768],{"class":560},[84,1811,570],{"class":204},[84,1813,1815],{"class":110,"line":1814},69,[84,1816,287],{"class":204},[84,1818,1820],{"class":110,"line":1819},70,[84,1821,327],{"emptyLinePlaceholder":326},[84,1823,1825,1827,1830,1832,1834,1836,1838,1840],{"class":110,"line":1824},71,[84,1826,1282],{"class":548},[84,1828,1829],{"class":560}," restartBot",[84,1831,742],{"class":204},[84,1833,1588],{"class":745},[84,1835,564],{"class":204},[84,1837,589],{"class":114},[84,1839,768],{"class":204},[84,1841,555],{"class":204},[84,1843,1845,1847,1849,1851,1853,1855,1857,1859,1861,1863,1865,1867,1869,1871,1873,1875,1877,1879,1881,1883,1885,1887,1889,1892,1894,1896],{"class":110,"line":1844},72,[84,1846,1234],{"class":544},[84,1848,1297],{"class":204},[84,1850,1300],{"class":999},[84,1852,1303],{"class":204},[84,1854,1306],{"class":560},[84,1856,564],{"class":204},[84,1858,567],{"class":114},[84,1860,1313],{"class":204},[84,1862,1689],{"class":560},[84,1864,564],{"class":204},[84,1866,589],{"class":114},[84,1868,1333],{"class":204},[84,1870,742],{"class":560},[84,1872,618],{"class":204},[84,1874,1702],{"class":118},[84,1876,618],{"class":204},[84,1878,753],{"class":204},[84,1880,914],{"class":204},[84,1882,1627],{"class":118},[84,1884,920],{"class":204},[84,1886,1588],{"class":214},[84,1888,1188],{"class":204},[84,1890,1891],{"class":118},"\u002Frestart",[84,1893,1173],{"class":204},[84,1895,768],{"class":560},[84,1897,570],{"class":204},[84,1899,1901],{"class":110,"line":1900},73,[84,1902,287],{"class":204},[84,1904,1906],{"class":110,"line":1905},74,[84,1907,327],{"emptyLinePlaceholder":326},[84,1909,1911,1913,1916,1918,1920,1922,1924,1926,1929,1931,1933,1936,1938,1940,1942,1945,1947,1949,1951,1953,1955,1957,1959,1962],{"class":110,"line":1910},75,[84,1912,1282],{"class":548},[84,1914,1915],{"class":560}," sendEmbed",[84,1917,742],{"class":204},[84,1919,1588],{"class":745},[84,1921,564],{"class":204},[84,1923,589],{"class":114},[84,1925,753],{"class":204},[84,1927,1928],{"class":745}," payload",[84,1930,564],{"class":204},[84,1932,1403],{"class":204},[84,1934,1935],{"class":560}," channelId",[84,1937,564],{"class":204},[84,1939,589],{"class":114},[84,1941,1313],{"class":204},[84,1943,1944],{"class":560}," embed",[84,1946,564],{"class":204},[84,1948,884],{"class":114},[84,1950,822],{"class":204},[84,1952,889],{"class":114},[84,1954,753],{"class":204},[84,1956,855],{"class":114},[84,1958,868],{"class":204},[84,1960,1961],{"class":204}," })",[84,1963,555],{"class":204},[84,1965,1967,1969,1971,1973,1975,1977,1979,1981,1983,1986,1988,1990,1992,1994,1996,1998,2000,2002,2004,2006,2008,2010,2012,2015,2017,2019,2021,2023],{"class":110,"line":1966},76,[84,1968,1234],{"class":544},[84,1970,1297],{"class":204},[84,1972,1300],{"class":999},[84,1974,1303],{"class":204},[84,1976,1306],{"class":560},[84,1978,564],{"class":204},[84,1980,567],{"class":114},[84,1982,1313],{"class":204},[84,1984,1985],{"class":560}," messageId",[84,1987,564],{"class":204},[84,1989,589],{"class":114},[84,1991,1333],{"class":204},[84,1993,742],{"class":560},[84,1995,618],{"class":204},[84,1997,1702],{"class":118},[84,1999,618],{"class":204},[84,2001,753],{"class":204},[84,2003,914],{"class":204},[84,2005,1627],{"class":118},[84,2007,920],{"class":204},[84,2009,1588],{"class":214},[84,2011,1188],{"class":204},[84,2013,2014],{"class":118},"\u002Fsend-embed",[84,2016,1173],{"class":204},[84,2018,753],{"class":204},[84,2020,1928],{"class":214},[84,2022,768],{"class":560},[84,2024,570],{"class":204},[84,2026,2028],{"class":110,"line":2027},77,[84,2029,287],{"class":204},[84,2031,2033],{"class":110,"line":2032},78,[84,2034,327],{"emptyLinePlaceholder":326},[84,2036,2038],{"class":110,"line":2037},79,[84,2039,2040],{"class":538},"  \u002F\u002F --- Support Tickets (Scope: tickets:read, tickets:write) ---\n",[84,2042,2044],{"class":110,"line":2043},80,[84,2045,327],{"emptyLinePlaceholder":326},[84,2047,2049,2051,2054,2056],{"class":110,"line":2048},81,[84,2050,1282],{"class":548},[84,2052,2053],{"class":560}," listTickets",[84,2055,1134],{"class":204},[84,2057,555],{"class":204},[84,2059,2061,2063,2065,2067,2069,2071,2073,2075,2077,2079,2081,2083,2085,2087,2089,2091,2093,2096,2098,2100,2102,2104,2106,2108,2110,2112,2114,2116,2118,2120,2122,2124,2127,2129,2131],{"class":110,"line":2060},82,[84,2062,1234],{"class":544},[84,2064,1297],{"class":204},[84,2066,1300],{"class":999},[84,2068,1303],{"class":204},[84,2070,1306],{"class":560},[84,2072,564],{"class":204},[84,2074,567],{"class":114},[84,2076,1313],{"class":204},[84,2078,1316],{"class":560},[84,2080,564],{"class":204},[84,2082,1513],{"class":114},[84,2084,1303],{"class":204},[84,2086,1518],{"class":560},[84,2088,564],{"class":204},[84,2090,589],{"class":114},[84,2092,1313],{"class":204},[84,2094,2095],{"class":560}," subject",[84,2097,564],{"class":204},[84,2099,589],{"class":114},[84,2101,1313],{"class":204},[84,2103,1536],{"class":560},[84,2105,564],{"class":204},[84,2107,589],{"class":114},[84,2109,1333],{"class":204},[84,2111,1333],{"class":204},[84,2113,742],{"class":560},[84,2115,618],{"class":204},[84,2117,1340],{"class":118},[84,2119,618],{"class":204},[84,2121,753],{"class":204},[84,2123,612],{"class":204},[84,2125,2126],{"class":118},"\u002Ftickets",[84,2128,618],{"class":204},[84,2130,768],{"class":560},[84,2132,570],{"class":204},[84,2134,2136],{"class":110,"line":2135},83,[84,2137,287],{"class":204},[84,2139,2141],{"class":110,"line":2140},84,[84,2142,327],{"emptyLinePlaceholder":326},[84,2144,2146,2148,2151,2153,2156,2158,2160,2162,2164,2166,2168,2170,2172,2174,2176,2179,2181,2183,2186,2188,2190,2192,2195,2197,2199,2201,2204,2206,2208],{"class":110,"line":2145},85,[84,2147,1282],{"class":548},[84,2149,2150],{"class":560}," createTicket",[84,2152,742],{"class":204},[84,2154,2155],{"class":745},"payload",[84,2157,564],{"class":204},[84,2159,1403],{"class":204},[84,2161,2095],{"class":560},[84,2163,564],{"class":204},[84,2165,589],{"class":114},[84,2167,1313],{"class":204},[84,2169,1689],{"class":560},[84,2171,564],{"class":204},[84,2173,589],{"class":114},[84,2175,1313],{"class":204},[84,2177,2178],{"class":560}," priority",[84,2180,852],{"class":204},[84,2182,612],{"class":204},[84,2184,2185],{"class":118},"low",[84,2187,618],{"class":204},[84,2189,621],{"class":204},[84,2191,612],{"class":204},[84,2193,2194],{"class":118},"normal",[84,2196,618],{"class":204},[84,2198,621],{"class":204},[84,2200,612],{"class":204},[84,2202,2203],{"class":118},"high",[84,2205,618],{"class":204},[84,2207,1961],{"class":204},[84,2209,555],{"class":204},[84,2211,2213,2215,2217,2219,2221,2223,2225,2227,2229,2232,2234,2236,2238,2240,2242,2244,2246,2248,2250,2252,2254,2256,2258,2260],{"class":110,"line":2212},86,[84,2214,1234],{"class":544},[84,2216,1297],{"class":204},[84,2218,1300],{"class":999},[84,2220,1303],{"class":204},[84,2222,1306],{"class":560},[84,2224,564],{"class":204},[84,2226,567],{"class":114},[84,2228,1313],{"class":204},[84,2230,2231],{"class":560}," ticketId",[84,2233,564],{"class":204},[84,2235,589],{"class":114},[84,2237,1333],{"class":204},[84,2239,742],{"class":560},[84,2241,618],{"class":204},[84,2243,1702],{"class":118},[84,2245,618],{"class":204},[84,2247,753],{"class":204},[84,2249,612],{"class":204},[84,2251,2126],{"class":118},[84,2253,618],{"class":204},[84,2255,753],{"class":204},[84,2257,1928],{"class":214},[84,2259,768],{"class":560},[84,2261,570],{"class":204},[84,2263,2265],{"class":110,"line":2264},87,[84,2266,287],{"class":204},[84,2268,2270],{"class":110,"line":2269},88,[84,2271,350],{"class":204},[466,2273],{},[183,2275,2277],{"id":2276},"_22-python-requests","2.2 Python (Requests)",[22,2279,2280,2281,858],{},"Für Python-basierte Bots, Automatisierungen oder CLI-Werkzeuge (",[96,2282,2283],{},"pip install requests",[101,2285,2287],{"className":312,"code":2286,"language":314,"meta":7,"style":7},"# kiro_client.py\nimport requests\nfrom typing import Optional, Dict, Any, List\n\nclass KiroClient:\n    def __init__(self, api_key: str, base_url: str = \"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1\"):\n        self.api_key = api_key\n        self.base_url = base_url\n        self.headers = {\n            \"Authorization\": f\"Bearer {api_key}\",\n            \"Content-Type\": \"application\u002Fjson\",\n            \"Accept\": \"application\u002Fjson\",\n        }\n\n    def _request(self, method: str, endpoint: str, data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:\n        url = f\"{self.base_url}{endpoint}\"\n        resp = requests.request(method, url, headers=self.headers, json=data, timeout=10)\n        if not resp.ok:\n            raise Exception(f\"KiroCloud API Error [{resp.status_code}]: {resp.text}\")\n        return resp.json()\n\n    # --- System Status ---\n    def get_status(self) -> Dict[str, Any]:\n        return self._request(\"GET\", \"\u002Fpublic\u002Fstatus\")\n\n    def get_stats(self) -> Dict[str, Any]:\n        return self._request(\"GET\", \"\u002Fpublic\u002Fstats\")\n\n    # --- Bots ---\n    def list_bots(self) -> List[Dict[str, Any]]:\n        return self._request(\"GET\", \"\u002Fbots\").get(\"data\", [])\n\n    def get_bot(self, bot_id: str) -> Dict[str, Any]:\n        return self._request(\"GET\", f\"\u002Fbots\u002F{bot_id}\")\n\n    def restart_bot(self, bot_id: str) -> Dict[str, Any]:\n        return self._request(\"POST\", f\"\u002Fbots\u002F{bot_id}\u002Frestart\")\n\n    def send_embed(self, bot_id: str, channel_id: str, embed_data: Dict[str, Any]) -> Dict[str, Any]:\n        return self._request(\"POST\", f\"\u002Fbots\u002F{bot_id}\u002Fsend-embed\", {\n            \"channelId\": channel_id,\n            \"embed\": embed_data,\n        })\n",[96,2288,2289,2294,2298,2303,2307,2312,2317,2322,2327,2332,2337,2342,2347,2352,2356,2361,2366,2371,2376,2381,2386,2390,2395,2400,2405,2409,2414,2419,2423,2428,2433,2438,2442,2447,2452,2456,2461,2466,2470,2475,2480,2485,2490],{"__ignoreMap":7},[84,2290,2291],{"class":110,"line":111},[84,2292,2293],{},"# kiro_client.py\n",[84,2295,2296],{"class":110,"line":218},[84,2297,321],{},[84,2299,2300],{"class":110,"line":233},[84,2301,2302],{},"from typing import Optional, Dict, Any, List\n",[84,2304,2305],{"class":110,"line":272},[84,2306,327],{"emptyLinePlaceholder":326},[84,2308,2309],{"class":110,"line":278},[84,2310,2311],{},"class KiroClient:\n",[84,2313,2314],{"class":110,"line":284},[84,2315,2316],{},"    def __init__(self, api_key: str, base_url: str = \"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1\"):\n",[84,2318,2319],{"class":110,"line":290},[84,2320,2321],{},"        self.api_key = api_key\n",[84,2323,2324],{"class":110,"line":296},[84,2325,2326],{},"        self.base_url = base_url\n",[84,2328,2329],{"class":110,"line":302},[84,2330,2331],{},"        self.headers = {\n",[84,2333,2334],{"class":110,"line":362},[84,2335,2336],{},"            \"Authorization\": f\"Bearer {api_key}\",\n",[84,2338,2339],{"class":110,"line":679},[84,2340,2341],{},"            \"Content-Type\": \"application\u002Fjson\",\n",[84,2343,2344],{"class":110,"line":684},[84,2345,2346],{},"            \"Accept\": \"application\u002Fjson\",\n",[84,2348,2349],{"class":110,"line":689},[84,2350,2351],{},"        }\n",[84,2353,2354],{"class":110,"line":702},[84,2355,327],{"emptyLinePlaceholder":326},[84,2357,2358],{"class":110,"line":717},[84,2359,2360],{},"    def _request(self, method: str, endpoint: str, data: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:\n",[84,2362,2363],{"class":110,"line":731},[84,2364,2365],{},"        url = f\"{self.base_url}{endpoint}\"\n",[84,2367,2368],{"class":110,"line":736},[84,2369,2370],{},"        resp = requests.request(method, url, headers=self.headers, json=data, timeout=10)\n",[84,2372,2373],{"class":110,"line":773},[84,2374,2375],{},"        if not resp.ok:\n",[84,2377,2378],{"class":110,"line":787},[84,2379,2380],{},"            raise Exception(f\"KiroCloud API Error [{resp.status_code}]: {resp.text}\")\n",[84,2382,2383],{"class":110,"line":801},[84,2384,2385],{},"        return resp.json()\n",[84,2387,2388],{"class":110,"line":806},[84,2389,327],{"emptyLinePlaceholder":326},[84,2391,2392],{"class":110,"line":811},[84,2393,2394],{},"    # --- System Status ---\n",[84,2396,2397],{"class":110,"line":873},[84,2398,2399],{},"    def get_status(self) -> Dict[str, Any]:\n",[84,2401,2402],{"class":110,"line":902},[84,2403,2404],{},"        return self._request(\"GET\", \"\u002Fpublic\u002Fstatus\")\n",[84,2406,2407],{"class":110,"line":934},[84,2408,327],{"emptyLinePlaceholder":326},[84,2410,2411],{"class":110,"line":955},[84,2412,2413],{},"    def get_stats(self) -> Dict[str, Any]:\n",[84,2415,2416],{"class":110,"line":975},[84,2417,2418],{},"        return self._request(\"GET\", \"\u002Fpublic\u002Fstats\")\n",[84,2420,2421],{"class":110,"line":981},[84,2422,327],{"emptyLinePlaceholder":326},[84,2424,2425],{"class":110,"line":986},[84,2426,2427],{},"    # --- Bots ---\n",[84,2429,2430],{"class":110,"line":1024},[84,2431,2432],{},"    def list_bots(self) -> List[Dict[str, Any]]:\n",[84,2434,2435],{"class":110,"line":1032},[84,2436,2437],{},"        return self._request(\"GET\", \"\u002Fbots\").get(\"data\", [])\n",[84,2439,2440],{"class":110,"line":1040},[84,2441,327],{"emptyLinePlaceholder":326},[84,2443,2444],{"class":110,"line":1074},[84,2445,2446],{},"    def get_bot(self, bot_id: str) -> Dict[str, Any]:\n",[84,2448,2449],{"class":110,"line":1084},[84,2450,2451],{},"        return self._request(\"GET\", f\"\u002Fbots\u002F{bot_id}\")\n",[84,2453,2454],{"class":110,"line":1089},[84,2455,327],{"emptyLinePlaceholder":326},[84,2457,2458],{"class":110,"line":1114},[84,2459,2460],{},"    def restart_bot(self, bot_id: str) -> Dict[str, Any]:\n",[84,2462,2463],{"class":110,"line":1159},[84,2464,2465],{},"        return self._request(\"POST\", f\"\u002Fbots\u002F{bot_id}\u002Frestart\")\n",[84,2467,2468],{"class":110,"line":1220},[84,2469,327],{"emptyLinePlaceholder":326},[84,2471,2472],{"class":110,"line":1226},[84,2473,2474],{},"    def send_embed(self, bot_id: str, channel_id: str, embed_data: Dict[str, Any]) -> Dict[str, Any]:\n",[84,2476,2477],{"class":110,"line":1231},[84,2478,2479],{},"        return self._request(\"POST\", f\"\u002Fbots\u002F{bot_id}\u002Fsend-embed\", {\n",[84,2481,2482],{"class":110,"line":1258},[84,2483,2484],{},"            \"channelId\": channel_id,\n",[84,2486,2487],{"class":110,"line":1263},[84,2488,2489],{},"            \"embed\": embed_data,\n",[84,2491,2492],{"class":110,"line":1268},[84,2493,2494],{},"        })\n",[466,2496],{},[183,2498,2500],{"id":2499},"_23-shell-curl-cicd-automatisierung","2.3 Shell \u002F cURL (CI\u002FCD Automatisierung)",[22,2502,2503],{},"Für Deployment-Skripte oder automatisierte Neustarts nach GitHub Actions Builds:",[101,2505,2507],{"className":103,"code":2506,"language":105,"meta":7,"style":7},"#!\u002Fbin\u002Fbash\nset -euo pipefail\n\nAPI_KEY=\"kiro_sec_YOUR_API_KEY_HERE\"\nBASE_URL=\"https:\u002F\u002Fapi.kirocloud.de\u002Fapi\u002Fv1\"\nBOT_ID=\"00000000-0000-0000-0000-000000000000\"\n\necho \"Checking platform health...\"\ncurl -s -f -X GET \"$BASE_URL\u002Fpublic\u002Fstatus\" \\\n  -H \"Accept: application\u002Fjson\" | jq .\n\necho \"Restarting bot instance after deployment...\"\ncurl -s -f -X POST \"$BASE_URL\u002Fbots\u002F$BOT_ID\u002Frestart\" \\\n  -H \"Authorization: Bearer $API_KEY\" \\\n  -H \"Content-Type: application\u002Fjson\" | jq .\n",[96,2508,2509,2514,2525,2529,2544,2557,2571,2575,2587,2612,2630,2634,2645,2673,2689],{"__ignoreMap":7},[84,2510,2511],{"class":110,"line":111},[84,2512,2513],{"class":538},"#!\u002Fbin\u002Fbash\n",[84,2515,2516,2519,2522],{"class":110,"line":218},[84,2517,2518],{"class":999},"set",[84,2520,2521],{"class":118}," -euo",[84,2523,2524],{"class":118}," pipefail\n",[84,2526,2527],{"class":110,"line":233},[84,2528,327],{"emptyLinePlaceholder":326},[84,2530,2531,2534,2537,2539,2542],{"class":110,"line":272},[84,2532,2533],{"class":214},"API_KEY",[84,2535,2536],{"class":204},"=",[84,2538,211],{"class":204},[84,2540,2541],{"class":118},"kiro_sec_YOUR_API_KEY_HERE",[84,2543,243],{"class":204},[84,2545,2546,2549,2551,2553,2555],{"class":110,"line":278},[84,2547,2548],{"class":214},"BASE_URL",[84,2550,2536],{"class":204},[84,2552,211],{"class":204},[84,2554,763],{"class":118},[84,2556,243],{"class":204},[84,2558,2559,2562,2564,2566,2569],{"class":110,"line":284},[84,2560,2561],{"class":214},"BOT_ID",[84,2563,2536],{"class":204},[84,2565,211],{"class":204},[84,2567,2568],{"class":118},"00000000-0000-0000-0000-000000000000",[84,2570,243],{"class":204},[84,2572,2573],{"class":110,"line":290},[84,2574,327],{"emptyLinePlaceholder":326},[84,2576,2577,2580,2582,2585],{"class":110,"line":296},[84,2578,2579],{"class":999},"echo",[84,2581,205],{"class":204},[84,2583,2584],{"class":118},"Checking platform health...",[84,2586,243],{"class":204},[84,2588,2589,2591,2594,2597,2599,2601,2603,2606,2608,2610],{"class":110,"line":302},[84,2590,185],{"class":114},[84,2592,2593],{"class":118}," -s",[84,2595,2596],{"class":118}," -f",[84,2598,198],{"class":118},[84,2600,201],{"class":118},[84,2602,205],{"class":204},[84,2604,2605],{"class":214},"$BASE_URL",[84,2607,1349],{"class":118},[84,2609,211],{"class":204},[84,2611,215],{"class":214},[84,2613,2614,2616,2618,2620,2622,2624,2627],{"class":110,"line":362},[84,2615,221],{"class":118},[84,2617,205],{"class":204},[84,2619,240],{"class":118},[84,2621,211],{"class":204},[84,2623,621],{"class":204},[84,2625,2626],{"class":114}," jq",[84,2628,2629],{"class":118}," .\n",[84,2631,2632],{"class":110,"line":679},[84,2633,327],{"emptyLinePlaceholder":326},[84,2635,2636,2638,2640,2643],{"class":110,"line":684},[84,2637,2579],{"class":999},[84,2639,205],{"class":204},[84,2641,2642],{"class":118},"Restarting bot instance after deployment...",[84,2644,243],{"class":204},[84,2646,2647,2649,2651,2653,2655,2658,2660,2662,2664,2667,2669,2671],{"class":110,"line":689},[84,2648,185],{"class":114},[84,2650,2593],{"class":118},[84,2652,2596],{"class":118},[84,2654,198],{"class":118},[84,2656,2657],{"class":118}," POST",[84,2659,205],{"class":204},[84,2661,2605],{"class":214},[84,2663,1627],{"class":118},[84,2665,2666],{"class":214},"$BOT_ID",[84,2668,1891],{"class":118},[84,2670,211],{"class":204},[84,2672,215],{"class":214},[84,2674,2675,2677,2679,2682,2685,2687],{"class":110,"line":702},[84,2676,221],{"class":118},[84,2678,205],{"class":204},[84,2680,2681],{"class":118},"Authorization: Bearer ",[84,2683,2684],{"class":214},"$API_KEY",[84,2686,211],{"class":204},[84,2688,215],{"class":214},[84,2690,2691,2693,2695,2698,2700,2702,2704],{"class":110,"line":717},[84,2692,221],{"class":118},[84,2694,205],{"class":204},[84,2696,2697],{"class":118},"Content-Type: application\u002Fjson",[84,2699,211],{"class":204},[84,2701,621],{"class":204},[84,2703,2626],{"class":114},[84,2705,2629],{"class":118},[466,2707],{},[26,2709,2711],{"id":2710},"_3-endpunkt-spezifikation","3. Endpunkt-Spezifikation",[183,2713,2715],{"id":2714},"_31-plattform-status-metriken-öffentlich","3.1 Plattform-Status & Metriken (Öffentlich)",[2717,2718,2720,2721],"h4",{"id":2719},"get-apiv1publicstatus","GET ",[96,2722,2723],{},"\u002Fapi\u002Fv1\u002Fpublic\u002Fstatus",[22,2725,2726],{},"Liefert den aktuellen Betriebszustand aller KiroCloud-Komponenten (Discord Gateway Proxies, Rechenknoten, Datenbank).",[131,2728,2729,2735],{},[37,2730,2731,2734],{},[41,2732,2733],{},"Authentifizierung:"," Keine erforderlich",[37,2736,2737,2740,2741],{},[41,2738,2739],{},"Antwort:"," ",[96,2742,2743],{},"200 OK",[101,2745,2748],{"className":2746,"code":2747,"language":1131,"meta":7,"style":7},"language-json shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","{\n  \"success\": true,\n  \"data\": {\n    \"overall\": \"operational\",\n    \"services\": {\n      \"database\": \"operational\",\n      \"botEngine\": \"operational\",\n      \"minecraftNodes\": \"operational\"\n    },\n    \"timestamp\": \"2026-10-09T00:00:00.000Z\"\n  }\n}\n",[96,2749,2750,2754,2769,2782,2803,2816,2837,2856,2873,2878,2896,2900],{"__ignoreMap":7},[84,2751,2752],{"class":110,"line":111},[84,2753,1111],{"class":204},[84,2755,2756,2759,2762,2764,2766],{"class":110,"line":218},[84,2757,2758],{"class":204},"  \"",[84,2760,2761],{"class":548},"success",[84,2763,211],{"class":204},[84,2765,564],{"class":204},[84,2767,2768],{"class":204}," true,\n",[84,2770,2771,2773,2776,2778,2780],{"class":110,"line":233},[84,2772,2758],{"class":204},[84,2774,2775],{"class":548},"data",[84,2777,211],{"class":204},[84,2779,564],{"class":204},[84,2781,555],{"class":204},[84,2783,2784,2787,2790,2792,2794,2796,2799,2801],{"class":110,"line":272},[84,2785,2786],{"class":204},"    \"",[84,2788,2789],{"class":114},"overall",[84,2791,211],{"class":204},[84,2793,564],{"class":204},[84,2795,205],{"class":204},[84,2797,2798],{"class":118},"operational",[84,2800,211],{"class":204},[84,2802,931],{"class":204},[84,2804,2805,2807,2810,2812,2814],{"class":110,"line":278},[84,2806,2786],{"class":204},[84,2808,2809],{"class":114},"services",[84,2811,211],{"class":204},[84,2813,564],{"class":204},[84,2815,555],{"class":204},[84,2817,2818,2821,2825,2827,2829,2831,2833,2835],{"class":110,"line":284},[84,2819,2820],{"class":204},"      \"",[84,2822,2824],{"class":2823},"sbssI","database",[84,2826,211],{"class":204},[84,2828,564],{"class":204},[84,2830,205],{"class":204},[84,2832,2798],{"class":118},[84,2834,211],{"class":204},[84,2836,931],{"class":204},[84,2838,2839,2841,2844,2846,2848,2850,2852,2854],{"class":110,"line":290},[84,2840,2820],{"class":204},[84,2842,2843],{"class":2823},"botEngine",[84,2845,211],{"class":204},[84,2847,564],{"class":204},[84,2849,205],{"class":204},[84,2851,2798],{"class":118},[84,2853,211],{"class":204},[84,2855,931],{"class":204},[84,2857,2858,2860,2863,2865,2867,2869,2871],{"class":110,"line":296},[84,2859,2820],{"class":204},[84,2861,2862],{"class":2823},"minecraftNodes",[84,2864,211],{"class":204},[84,2866,564],{"class":204},[84,2868,205],{"class":204},[84,2870,2798],{"class":118},[84,2872,243],{"class":204},[84,2874,2875],{"class":110,"line":302},[84,2876,2877],{"class":204},"    },\n",[84,2879,2880,2882,2885,2887,2889,2891,2894],{"class":110,"line":362},[84,2881,2786],{"class":204},[84,2883,2884],{"class":114},"timestamp",[84,2886,211],{"class":204},[84,2888,564],{"class":204},[84,2890,205],{"class":204},[84,2892,2893],{"class":118},"2026-10-09T00:00:00.000Z",[84,2895,243],{"class":204},[84,2897,2898],{"class":110,"line":679},[84,2899,287],{"class":204},[84,2901,2902],{"class":110,"line":684},[84,2903,350],{"class":204},[2717,2905,2720,2907],{"id":2906},"get-apiv1publicstats",[96,2908,2909],{},"\u002Fapi\u002Fv1\u002Fpublic\u002Fstats",[22,2911,2912],{},"Aggregierte Echtzeit-Statistiken über die Gesamtlaufzeit und aktive Instanzen.",[131,2914,2915],{},[37,2916,2917,2734],{},[41,2918,2733],{},[466,2920],{},[183,2922,2924],{"id":2923},"_32-bot-steuerung-instanz-lifecycle","3.2 Bot-Steuerung & Instanz-Lifecycle",[2717,2926,2720,2928],{"id":2927},"get-apiv1bots",[96,2929,2930],{},"\u002Fapi\u002Fv1\u002Fbots",[22,2932,2933],{},"Gibt alle Bots zurück, die dem authentifizierten Benutzer-Account zugeordnet sind.",[131,2935,2936,2943],{},[37,2937,2938,2740,2941],{},[41,2939,2940],{},"Scope:",[96,2942,137],{},[37,2944,2945,2947],{},[41,2946,2739],{}," Array von Bot-Metadaten (Name, Status, Laufzeitverfallsdatum).",[2717,2949,2720,2951],{"id":2950},"get-apiv1botsid",[96,2952,2953],{},"\u002Fapi\u002Fv1\u002Fbots\u002F:id",[22,2955,2956],{},"Ruft detaillierte Laufzeitdaten und Systemmetriken einer spezifischen Bot-Instanz ab.",[131,2958,2959],{},[37,2960,2961,2740,2963],{},[41,2962,2940],{},[96,2964,137],{},[2717,2966,2968,2969],{"id":2967},"post-apiv1botsidstart","POST ",[96,2970,2971],{},"\u002Fapi\u002Fv1\u002Fbots\u002F:id\u002Fstart",[22,2973,2974],{},"Startet die isolierte Bot-Laufzeitumgebung in einer sicheren cgroups-Sandbox.",[131,2976,2977,2983],{},[37,2978,2979,2740,2981],{},[41,2980,2940],{},[96,2982,143],{},[37,2984,2985,2740,2988,2990],{},[41,2986,2987],{},"Rückgabe:",[96,2989,2743],{}," bei erfolgreicher Initialisierung.",[2717,2992,2968,2994],{"id":2993},"post-apiv1botsidstop",[96,2995,2996],{},"\u002Fapi\u002Fv1\u002Fbots\u002F:id\u002Fstop",[22,2998,2999,3000,3003],{},"Fährt den laufenden Node.js-Prozess des Bots kontrolliert über ",[96,3001,3002],{},"SIGTERM"," herunter.",[131,3005,3006],{},[37,3007,3008,2740,3010],{},[41,3009,2940],{},[96,3011,143],{},[2717,3013,2968,3015],{"id":3014},"post-apiv1botsidrestart",[96,3016,3017],{},"\u002Fapi\u002Fv1\u002Fbots\u002F:id\u002Frestart",[22,3019,3020],{},"Führt einen kontrollierten Neustart der Instanz aus. Ideal nach dem Aktualisieren von Bot-Modulen oder Umgebungsvariablen.",[131,3022,3023],{},[37,3024,3025,2740,3027],{},[41,3026,2940],{},[96,3028,143],{},[2717,3030,2968,3032],{"id":3031},"post-apiv1botsidsend-embed",[96,3033,3034],{},"\u002Fapi\u002Fv1\u002Fbots\u002F:id\u002Fsend-embed",[22,3036,3037],{},"Sendet ein gestaltetes Discord-Embed über den authentifizierten Bot in einen Zielkanal.",[131,3039,3040,3046],{},[37,3041,3042,2740,3044],{},[41,3043,2940],{},[96,3045,143],{},[37,3047,3048],{},[41,3049,3050],{},"Payload:",[101,3052,3054],{"className":2746,"code":3053,"language":1131,"meta":7,"style":7},"{\n  \"channelId\": \"123456789012345678\",\n  \"embed\": {\n    \"title\": \"Wartungsarbeiten abgeschlossen\",\n    \"description\": \"Alle Systeme laufen wieder mit voller Leistung.\",\n    \"color\": 3447003\n  }\n}\n",[96,3055,3056,3060,3080,3093,3113,3133,3147,3151],{"__ignoreMap":7},[84,3057,3058],{"class":110,"line":111},[84,3059,1111],{"class":204},[84,3061,3062,3064,3067,3069,3071,3073,3076,3078],{"class":110,"line":218},[84,3063,2758],{"class":204},[84,3065,3066],{"class":548},"channelId",[84,3068,211],{"class":204},[84,3070,564],{"class":204},[84,3072,205],{"class":204},[84,3074,3075],{"class":118},"123456789012345678",[84,3077,211],{"class":204},[84,3079,931],{"class":204},[84,3081,3082,3084,3087,3089,3091],{"class":110,"line":233},[84,3083,2758],{"class":204},[84,3085,3086],{"class":548},"embed",[84,3088,211],{"class":204},[84,3090,564],{"class":204},[84,3092,555],{"class":204},[84,3094,3095,3097,3100,3102,3104,3106,3109,3111],{"class":110,"line":272},[84,3096,2786],{"class":204},[84,3098,3099],{"class":114},"title",[84,3101,211],{"class":204},[84,3103,564],{"class":204},[84,3105,205],{"class":204},[84,3107,3108],{"class":118},"Wartungsarbeiten abgeschlossen",[84,3110,211],{"class":204},[84,3112,931],{"class":204},[84,3114,3115,3117,3120,3122,3124,3126,3129,3131],{"class":110,"line":278},[84,3116,2786],{"class":204},[84,3118,3119],{"class":114},"description",[84,3121,211],{"class":204},[84,3123,564],{"class":204},[84,3125,205],{"class":204},[84,3127,3128],{"class":118},"Alle Systeme laufen wieder mit voller Leistung.",[84,3130,211],{"class":204},[84,3132,931],{"class":204},[84,3134,3135,3137,3140,3142,3144],{"class":110,"line":284},[84,3136,2786],{"class":204},[84,3138,3139],{"class":114},"color",[84,3141,211],{"class":204},[84,3143,564],{"class":204},[84,3145,3146],{"class":2823}," 3447003\n",[84,3148,3149],{"class":110,"line":290},[84,3150,287],{"class":204},[84,3152,3153],{"class":110,"line":296},[84,3154,350],{"class":204},[466,3156],{},[183,3158,3160],{"id":3159},"_33-support-ticket-api","3.3 Support-Ticket API",[2717,3162,2720,3164],{"id":3163},"get-apiv1tickets",[96,3165,3166],{},"\u002Fapi\u002Fv1\u002Ftickets",[22,3168,3169],{},"Listet alle eigenen Support-Tickets inklusive aktuellem Bearbeitungsstatus auf.",[131,3171,3172],{},[37,3173,3174,2740,3176],{},[41,3175,2940],{},[96,3177,149],{},[2717,3179,2968,3181],{"id":3180},"post-apiv1tickets",[96,3182,3166],{},[22,3184,3185],{},"Eröffnet ein neues Support-Ticket im KiroCloud Helpdesk.",[131,3187,3188,3194],{},[37,3189,3190,2740,3192],{},[41,3191,2940],{},[96,3193,155],{},[37,3195,3196],{},[41,3197,3050],{},[101,3199,3201],{"className":2746,"code":3200,"language":1131,"meta":7,"style":7},"{\n  \"subject\": \"Frage zur Bot-Skalierung\",\n  \"message\": \"Wie kann ich die Shard-Anzahl für meinen Bot dynamisch anpassen?\",\n  \"priority\": \"normal\"\n}\n",[96,3202,3203,3207,3227,3247,3264],{"__ignoreMap":7},[84,3204,3205],{"class":110,"line":111},[84,3206,1111],{"class":204},[84,3208,3209,3211,3214,3216,3218,3220,3223,3225],{"class":110,"line":218},[84,3210,2758],{"class":204},[84,3212,3213],{"class":548},"subject",[84,3215,211],{"class":204},[84,3217,564],{"class":204},[84,3219,205],{"class":204},[84,3221,3222],{"class":118},"Frage zur Bot-Skalierung",[84,3224,211],{"class":204},[84,3226,931],{"class":204},[84,3228,3229,3231,3234,3236,3238,3240,3243,3245],{"class":110,"line":233},[84,3230,2758],{"class":204},[84,3232,3233],{"class":548},"message",[84,3235,211],{"class":204},[84,3237,564],{"class":204},[84,3239,205],{"class":204},[84,3241,3242],{"class":118},"Wie kann ich die Shard-Anzahl für meinen Bot dynamisch anpassen?",[84,3244,211],{"class":204},[84,3246,931],{"class":204},[84,3248,3249,3251,3254,3256,3258,3260,3262],{"class":110,"line":272},[84,3250,2758],{"class":204},[84,3252,3253],{"class":548},"priority",[84,3255,211],{"class":204},[84,3257,564],{"class":204},[84,3259,205],{"class":204},[84,3261,2194],{"class":118},[84,3263,243],{"class":204},[84,3265,3266],{"class":110,"line":278},[84,3267,350],{"class":204},[466,3269],{},[26,3271,3273],{"id":3272},"_4-http-statuscodes-fehlerbehandlung","4. HTTP-Statuscodes & Fehlerbehandlung",[22,3275,3276],{},"Die KiroCloud-API antwortet bei Fehlern stets mit standardisierten RFC-7807-konformen JSON-Objekten:",[371,3278,3279,3293],{},[374,3280,3281],{},[377,3282,3283,3287,3290],{},[380,3284,3286],{"align":3285},"left","Statuscode",[380,3288,3289],{"align":3285},"Fehler-Code",[380,3291,3292],{"align":3285},"Ursache & Empfohlene Maßnahme",[387,3294,3295,3313,3330,3345,3363],{},[377,3296,3297,3301,3306],{},[392,3298,3299],{"align":3285},[96,3300,396],{},[392,3302,3303],{"align":3285},[96,3304,3305],{},"UNAUTHORIZED",[392,3307,3308,3309,3312],{"align":3285},"Der API-Schlüssel fehlt, ist ungültig oder abgelaufen. Prüfe den ",[96,3310,3311],{},"Authorization: Bearer","-Header.",[377,3314,3315,3319,3324],{},[392,3316,3317],{"align":3285},[96,3318,406],{},[392,3320,3321],{"align":3285},[96,3322,3323],{},"FORBIDDEN_SCOPE",[392,3325,3326,3327,3329],{"align":3285},"Dem Schlüssel fehlt die erforderliche Berechtigung (z. B. ",[96,3328,143],{}," für Neustarts).",[377,3331,3332,3337,3342],{},[392,3333,3334],{"align":3285},[96,3335,3336],{},"404 Not Found",[392,3338,3339],{"align":3285},[96,3340,3341],{},"NOT_FOUND",[392,3343,3344],{"align":3285},"Die angefragte Ressource (Bot-ID oder Ticket) existiert nicht oder gehört einem anderen Account.",[377,3346,3347,3351,3356],{},[392,3348,3349],{"align":3285},[96,3350,416],{},[392,3352,3353],{"align":3285},[96,3354,3355],{},"RATE_LIMITED",[392,3357,3358,3359,3362],{"align":3285},"Anfragelimit erreicht. Implementiere einen exponentiellen Backoff (",[96,3360,3361],{},"Retry-After","-Header beachten).",[377,3364,3365,3370,3375],{},[392,3366,3367],{"align":3285},[96,3368,3369],{},"500 Internal Error",[392,3371,3372],{"align":3285},[96,3373,3374],{},"INTERNAL_ERROR",[392,3376,3377],{"align":3285},"Vorübergehender Serverfehler. Bitte an den Support wenden oder nach 5 Sekunden erneut versuchen.",[421,3379,3380],{},"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 .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 .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 .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 .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}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 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":7,"searchDepth":218,"depth":218,"links":3382},[3383,3386,3391,3396],{"id":470,"depth":218,"text":471,"children":3384},[3385],{"id":480,"depth":233,"text":481},{"id":515,"depth":218,"text":516,"children":3387},[3388,3389,3390],{"id":522,"depth":233,"text":523},{"id":2276,"depth":233,"text":2277},{"id":2499,"depth":233,"text":2500},{"id":2710,"depth":218,"text":2711,"children":3392},[3393,3394,3395],{"id":2714,"depth":233,"text":2715},{"id":2923,"depth":233,"text":2924},{"id":3159,"depth":233,"text":3160},{"id":3272,"depth":218,"text":3273},"Offizielle REST-API-Referenz zur programmatischen Steuerung von Discord Bots, Tickets und Systemmetriken.",{"icon":3399},"i-lucide-code-2","\u002Fdocs\u002Fde\u002Frest-endpoints",{"title":447,"description":3397},"docs\u002Fde\u002Frest-endpoints","7eq9LoeJn9at-f0zpuNsivdZsbyJ8Uk46Ygxf9fOm-U",{"id":3405,"title":3406,"author":12,"body":3407,"category":435,"description":3829,"extension":437,"lastUpdated":12,"meta":3830,"navigation":326,"order":440,"path":3832,"readTime":12,"seo":3833,"stem":3834,"__hash__":3835},"docs\u002Fdocs\u002Fde\u002Fwebhooks.md","Webhooks",{"type":14,"value":3408,"toc":3820},[3409,3413,3416,3420,3423,3464,3468,3471,3496,3500,3506,3644,3648,3651,3660,3664,3787,3791,3817],[17,3410,3412],{"id":3411},"webhooks-event-streams","Webhooks & Event Streams",[22,3414,3415],{},"Mit Webhooks kannst du externe Systeme (z. B. deinen eigenen Bot-Monitoring-Dienst, Alerting-Tools oder interne Statusseiten) automatisch benachrichtigen lassen, sobald relevante Ereignisse für deine Instanzen in KiroCloud eintreten. Dies ermöglicht dir, auf Events in Echtzeit zu reagieren, ohne die REST-API wiederholt abfragen zu müssen (Polling).",[26,3417,3419],{"id":3418},"_1-webhook-registrieren","1. Webhook registrieren",[22,3421,3422],{},"Webhooks werden direkt in deinem Benutzer-Dashboard konfiguriert:",[34,3424,3425,3431,3436,3442,3448,3458],{},[37,3426,3427,3428,44],{},"Gehe im Dashboard zu ",[41,3429,3430],{},"Einstellungen > Webhooks & Benachrichtigungen",[37,3432,47,3433,44],{},[41,3434,3435],{},"Webhook hinzufügen",[37,3437,3438,3441],{},[41,3439,3440],{},"Name",": Eine eindeutige Bezeichnung (z. B. \"Discord Alerting Service\").",[37,3443,3444,3447],{},[41,3445,3446],{},"Ziel-URL",": Die HTTPS-Adresse deines Servers, an die KiroCloud die POST-Requests senden soll.",[37,3449,3450,3453,3454,3457],{},[41,3451,3452],{},"Subscribed Events",": Wähle die Ereignisse aus, über die du benachrichtigt werden möchtest (z. B. ",[96,3455,3456],{},"bot.crashed",").",[37,3459,3460,3463],{},[41,3461,3462],{},"Signing Secret"," (Empfohlen): Ein geheimer Schlüssel, mit dem KiroCloud die Payload signiert. So validierst du, dass die Anfrage authentisch ist.",[26,3465,3467],{"id":3466},"_2-verfügbare-ereignisse","2. Verfügbare Ereignisse",[22,3469,3470],{},"KiroCloud bietet folgende Event-Typen für deine verwalteten Instanzen:",[131,3472,3473,3478,3484,3490],{},[37,3474,3475,3477],{},[96,3476,3456],{}," - Wird ausgelöst, wenn ein von dir gehosteter Discord-Bot unerwartet beendet wird oder wegen Speichermangels stoppt.",[37,3479,3480,3483],{},[96,3481,3482],{},"bot.started"," - Wird ausgelöst, wenn ein Discord-Bot erfolgreich gestartet wurde.",[37,3485,3486,3489],{},[96,3487,3488],{},"ticket.created"," - Wird ausgelöst, wenn ein neues Support-Ticket zu deinem Account erstellt wird.",[37,3491,3492,3495],{},[96,3493,3494],{},"ticket.updated"," - Wird ausgelöst, wenn ein Support-Ticket beantwortet oder aktualisiert wird.",[26,3497,3499],{"id":3498},"_3-payload-struktur","3. Payload-Struktur",[22,3501,3502,3503,3505],{},"Wenn ein abonniertes Ereignis eintritt, sendet KiroCloud einen HTTP ",[96,3504,1702],{},"-Request an deine Ziel-URL. Der Body ist als JSON-Objekt formatiert:",[101,3507,3509],{"className":2746,"code":3508,"language":1131,"meta":7,"style":7},"{\n  \"event\": \"bot.crashed\",\n  \"timestamp\": \"2026-10-09T00:00:00.000Z\",\n  \"data\": {\n    \"botId\": \"00000000-0000-0000-0000-000000000000\",\n    \"name\": \"MyCommunityBot\",\n    \"exitCode\": 1,\n    \"reason\": \"Process exited with code 1\"\n  }\n}\n",[96,3510,3511,3515,3534,3552,3564,3582,3602,3618,3636,3640],{"__ignoreMap":7},[84,3512,3513],{"class":110,"line":111},[84,3514,1111],{"class":204},[84,3516,3517,3519,3522,3524,3526,3528,3530,3532],{"class":110,"line":218},[84,3518,2758],{"class":204},[84,3520,3521],{"class":548},"event",[84,3523,211],{"class":204},[84,3525,564],{"class":204},[84,3527,205],{"class":204},[84,3529,3456],{"class":118},[84,3531,211],{"class":204},[84,3533,931],{"class":204},[84,3535,3536,3538,3540,3542,3544,3546,3548,3550],{"class":110,"line":233},[84,3537,2758],{"class":204},[84,3539,2884],{"class":548},[84,3541,211],{"class":204},[84,3543,564],{"class":204},[84,3545,205],{"class":204},[84,3547,2893],{"class":118},[84,3549,211],{"class":204},[84,3551,931],{"class":204},[84,3553,3554,3556,3558,3560,3562],{"class":110,"line":272},[84,3555,2758],{"class":204},[84,3557,2775],{"class":548},[84,3559,211],{"class":204},[84,3561,564],{"class":204},[84,3563,555],{"class":204},[84,3565,3566,3568,3570,3572,3574,3576,3578,3580],{"class":110,"line":278},[84,3567,2786],{"class":204},[84,3569,1588],{"class":114},[84,3571,211],{"class":204},[84,3573,564],{"class":204},[84,3575,205],{"class":204},[84,3577,2568],{"class":118},[84,3579,211],{"class":204},[84,3581,931],{"class":204},[84,3583,3584,3586,3589,3591,3593,3595,3598,3600],{"class":110,"line":284},[84,3585,2786],{"class":204},[84,3587,3588],{"class":114},"name",[84,3590,211],{"class":204},[84,3592,564],{"class":204},[84,3594,205],{"class":204},[84,3596,3597],{"class":118},"MyCommunityBot",[84,3599,211],{"class":204},[84,3601,931],{"class":204},[84,3603,3604,3606,3609,3611,3613,3616],{"class":110,"line":290},[84,3605,2786],{"class":204},[84,3607,3608],{"class":114},"exitCode",[84,3610,211],{"class":204},[84,3612,564],{"class":204},[84,3614,3615],{"class":2823}," 1",[84,3617,931],{"class":204},[84,3619,3620,3622,3625,3627,3629,3631,3634],{"class":110,"line":296},[84,3621,2786],{"class":204},[84,3623,3624],{"class":114},"reason",[84,3626,211],{"class":204},[84,3628,564],{"class":204},[84,3630,205],{"class":204},[84,3632,3633],{"class":118},"Process exited with code 1",[84,3635,243],{"class":204},[84,3637,3638],{"class":110,"line":302},[84,3639,287],{"class":204},[84,3641,3642],{"class":110,"line":362},[84,3643,350],{"class":204},[26,3645,3647],{"id":3646},"_4-sicherheit-signaturprüfung-hmac-sha256","4. Sicherheit & Signaturprüfung (HMAC-SHA256)",[22,3649,3650],{},"Um Man-in-the-Middle-Angriffe oder gefälschte Requests zu verhindern, signiert KiroCloud jede Webhook-Anfrage im HTTP-Header:",[101,3652,3654],{"className":484,"code":3653,"language":486,"meta":7,"style":7},"X-Kiro-Signature: sha256=a1b2c3d4e5f6...\n",[96,3655,3656],{"__ignoreMap":7},[84,3657,3658],{"class":110,"line":111},[84,3659,3653],{},[183,3661,3663],{"id":3662},"validierungsbeispiel-in-nodejs-express","Validierungsbeispiel in Node.js \u002F Express:",[101,3665,3667],{"className":250,"code":3666,"language":252,"meta":7,"style":7},"import crypto from 'node:crypto';\nimport express from 'express';\n\nconst app = express();\nconst WEBHOOK_SECRET = 'dein_signing_secret';\n\n\u002F\u002F Der rohe Request-Body wird für die Signaturprüfung benötigt\napp.post('\u002Fwebhook', express.json({ verify: (req, res, buf) => { req.rawBody = buf; }}), (req, res) => {\n  const signature = req.headers['x-kiro-signature'];\n  if (!signature) {\n    return res.status(401).send('Missing signature');\n  }\n\n  const hash = crypto.createHmac('sha256', WEBHOOK_SECRET)\n                     .update(req.rawBody)\n                     .digest('hex');\n  const expectedSignature = `sha256=${hash}`;\n\n  if (crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature))) {\n    console.log('Webhook verifiziert! Event:', req.body.event);\n    res.status(200).send('OK');\n  } else {\n    res.status(401).send('Invalid signature');\n  }\n});\n",[96,3668,3669,3674,3679,3683,3688,3693,3697,3702,3707,3712,3717,3722,3726,3730,3735,3740,3745,3750,3754,3759,3764,3769,3774,3779,3783],{"__ignoreMap":7},[84,3670,3671],{"class":110,"line":111},[84,3672,3673],{},"import crypto from 'node:crypto';\n",[84,3675,3676],{"class":110,"line":218},[84,3677,3678],{},"import express from 'express';\n",[84,3680,3681],{"class":110,"line":233},[84,3682,327],{"emptyLinePlaceholder":326},[84,3684,3685],{"class":110,"line":272},[84,3686,3687],{},"const app = express();\n",[84,3689,3690],{"class":110,"line":278},[84,3691,3692],{},"const WEBHOOK_SECRET = 'dein_signing_secret';\n",[84,3694,3695],{"class":110,"line":284},[84,3696,327],{"emptyLinePlaceholder":326},[84,3698,3699],{"class":110,"line":290},[84,3700,3701],{},"\u002F\u002F Der rohe Request-Body wird für die Signaturprüfung benötigt\n",[84,3703,3704],{"class":110,"line":296},[84,3705,3706],{},"app.post('\u002Fwebhook', express.json({ verify: (req, res, buf) => { req.rawBody = buf; }}), (req, res) => {\n",[84,3708,3709],{"class":110,"line":302},[84,3710,3711],{},"  const signature = req.headers['x-kiro-signature'];\n",[84,3713,3714],{"class":110,"line":362},[84,3715,3716],{},"  if (!signature) {\n",[84,3718,3719],{"class":110,"line":679},[84,3720,3721],{},"    return res.status(401).send('Missing signature');\n",[84,3723,3724],{"class":110,"line":684},[84,3725,287],{},[84,3727,3728],{"class":110,"line":689},[84,3729,327],{"emptyLinePlaceholder":326},[84,3731,3732],{"class":110,"line":702},[84,3733,3734],{},"  const hash = crypto.createHmac('sha256', WEBHOOK_SECRET)\n",[84,3736,3737],{"class":110,"line":717},[84,3738,3739],{},"                     .update(req.rawBody)\n",[84,3741,3742],{"class":110,"line":731},[84,3743,3744],{},"                     .digest('hex');\n",[84,3746,3747],{"class":110,"line":736},[84,3748,3749],{},"  const expectedSignature = `sha256=${hash}`;\n",[84,3751,3752],{"class":110,"line":773},[84,3753,327],{"emptyLinePlaceholder":326},[84,3755,3756],{"class":110,"line":787},[84,3757,3758],{},"  if (crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expectedSignature))) {\n",[84,3760,3761],{"class":110,"line":801},[84,3762,3763],{},"    console.log('Webhook verifiziert! Event:', req.body.event);\n",[84,3765,3766],{"class":110,"line":806},[84,3767,3768],{},"    res.status(200).send('OK');\n",[84,3770,3771],{"class":110,"line":811},[84,3772,3773],{},"  } else {\n",[84,3775,3776],{"class":110,"line":873},[84,3777,3778],{},"    res.status(401).send('Invalid signature');\n",[84,3780,3781],{"class":110,"line":902},[84,3782,287],{},[84,3784,3785],{"class":110,"line":934},[84,3786,293],{},[26,3788,3790],{"id":3789},"_5-fehlertoleranz-retry-verhalten","5. Fehlertoleranz & Retry-Verhalten",[131,3792,3793,3803,3810],{},[37,3794,3795,3796,3799,3800,3802],{},"KiroCloud erwartet einen HTTP-Statuscode im Bereich ",[96,3797,3798],{},"2xx"," (z. B. ",[96,3801,2743],{},") innerhalb von 5 Sekunden.",[37,3804,3805,3806,3809],{},"Antwortet dein Endpunkt mit ",[96,3807,3808],{},"5xx"," oder läuft in ein Timeout, unternimmt das System automatische Wiederholungsversuche mit exponentiellem Backoff (bis zu 3 Versuche).",[37,3811,3812,3813,3816],{},"Im Dashboard kannst du über die Schaltfläche ",[41,3814,3815],{},"„Test-Ping senden“"," jederzeit die Erreichbarkeit deines Endpunkts überprüfen.",[421,3818,3819],{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}",{"title":7,"searchDepth":218,"depth":218,"links":3821},[3822,3823,3824,3825,3828],{"id":3418,"depth":218,"text":3419},{"id":3466,"depth":218,"text":3467},{"id":3498,"depth":218,"text":3499},{"id":3646,"depth":218,"text":3647,"children":3826},[3827],{"id":3662,"depth":233,"text":3663},{"id":3789,"depth":218,"text":3790},"Erhalte HTTP-Benachrichtigungen über deine Bot- und Ticket-Ereignisse in Echtzeit",{"icon":3831},"i-lucide-webhook","\u002Fdocs\u002Fde\u002Fwebhooks",{"title":3406,"description":3829},"docs\u002Fde\u002Fwebhooks","7PEWWY6Id8WCOgbfzdREFvwm9qI9wRTdqk2K1ZIfhKY",{"id":3837,"title":3838,"author":12,"body":3839,"category":435,"description":5161,"extension":437,"lastUpdated":12,"meta":5162,"navigation":326,"order":440,"path":5164,"readTime":12,"seo":5165,"stem":5166,"__hash__":5167},"docs\u002Fdocs\u002Fde\u002Fwebsocket.md","Websocket Events",{"type":14,"value":3840,"toc":5151},[3841,3845,3852,3863,3865,3869,3872,3880,3884,3891,3917,3921,4937,4939,4941,4945,4951,4957,4961,5106,5108,5112,5115,5148],[17,3842,3844],{"id":3843},"websocket-events-telemetrie","WebSocket Events & Telemetrie",[22,3846,3847,3848,3851],{},"Neben den klassischen Webhooks für serverseitige Benachrichtigungen bietet KiroCloud native ",[41,3849,3850],{},"WebSocket","-Verbindungen an. Diese sind ideal, um auf einer Website oder in einem Dashboard Live-Updates (wie CPU-Auslastung oder Konsolenausgaben eines Bots) in Echtzeit darzustellen.",[22,3853,3854,3855,3858,3859,3862],{},"Die WebSocket-API ist direkt unter ",[96,3856,3857],{},"\u002Fws\u002F"," verfügbar. Im Gegensatz zur HTTP-API wird zur Authentifizierung der JWT-Token im Query-String ",[96,3860,3861],{},"?token=..."," oder per Cookie übergeben.",[466,3864],{},[26,3866,3868],{"id":3867},"_1-dashboard-websocket-bot-telemetrie","1. Dashboard WebSocket (Bot-Telemetrie)",[22,3870,3871],{},"Dieser Endpunkt liefert Live-Daten für einen spezifischen Bot. Das ist nützlich, wenn du ein eigenes Web-Interface für deine Discord Bots bauen möchtest, in dem die User die Live-Konsole ihres Bots sehen können.",[22,3873,3874,3877],{},[41,3875,3876],{},"Endpunkt:",[96,3878,3879],{},"wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=DEINE_BOT_ID&token=DEIN_API_TOKEN",[183,3881,3883],{"id":3882},"unterstützte-events","Unterstützte Events",[22,3885,3886,3887,3890],{},"Wenn du dich verbindest, erhältst du sofort ein ",[96,3888,3889],{},"subscribed"," Event sowie die Log-Historie (falls vorhanden). Danach pusht der Server bei Änderungen folgende Events:",[131,3892,3893,3899,3905,3911],{},[37,3894,3895,3898],{},[96,3896,3897],{},"bot:status"," - Wird gesendet, wenn der Bot online, offline oder abgestürzt ist.",[37,3900,3901,3904],{},[96,3902,3903],{},"bot:log"," - Jede neue Konsolenausgabe (stdout\u002Fstderr) des Bots.",[37,3906,3907,3910],{},[96,3908,3909],{},"bot:stats"," - Echtzeit CPU- und RAM-Auslastung des Bots (wird i.d.R. im Sekundentakt gepusht).",[37,3912,3913,3916],{},[96,3914,3915],{},"bot:log_history"," - Ein Array der letzten Log-Einträge, direkt nach der Verbindung gesendet.",[183,3918,3920],{"id":3919},"beispiel-implementierung-im-frontend-javascript","Beispiel: Implementierung im Frontend (JavaScript)",[101,3922,3926],{"className":3923,"code":3924,"language":3925,"meta":7,"style":7},"language-html shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","\u003C!DOCTYPE html>\n\u003Chtml lang=\"de\">\n\u003Chead>\n  \u003Cmeta charset=\"UTF-8\">\n  \u003Ctitle>KiroBot Live Konsole\u003C\u002Ftitle>\n  \u003Cstyle>\n    body { background: #111; color: #0f0; font-family: monospace; padding: 20px; }\n    #console { white-space: pre-wrap; }\n  \u003C\u002Fstyle>\n\u003C\u002Fhead>\n\u003Cbody>\n  \u003Ch2>Live Konsole\u003C\u002Fh2>\n  \u003Cdiv id=\"console\">\u003C\u002Fdiv>\n\n  \u003Cscript>\n    const BOT_ID = '1234567890';\n    \u002F\u002F HINWEIS: Niemals den API-Key dauerhaft im Frontend hardcoden!\n    \u002F\u002F Nutze Cookies oder einen Backend-Proxy in Produktion.\n    const TOKEN = 'DEIN_API_KEY'; \n\n    const ws = new WebSocket(`wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=${BOT_ID}&token=${TOKEN}`);\n\n    const consoleDiv = document.getElementById('console');\n\n    ws.onmessage = (event) => {\n      try {\n        const payload = JSON.parse(event.data);\n        \n        switch (payload.event) {\n          case 'subscribed':\n            console.log('Erfolgreich mit dem Websocket verbunden!');\n            break;\n\n          case 'bot:log_history':\n            \u002F\u002F Initialer Log-Dump\n            payload.data.forEach(logLine => {\n              consoleDiv.textContent += logLine + '\\n';\n            });\n            break;\n\n          case 'bot:log':\n            \u002F\u002F Neue, einzelne Log-Zeile\n            consoleDiv.textContent += payload.data + '\\n';\n            window.scrollTo(0, document.body.scrollHeight);\n            break;\n\n          case 'bot:status':\n            consoleDiv.textContent += `[SYSTEM] Bot Status geändert zu: ${payload.data.status}\\n`;\n            break;\n\n          case 'bot:stats':\n            \u002F\u002F payload.data enthält z.B. { cpu: 2.5, memory: 120 }\n            document.title = `RAM: ${payload.data.memory}MB`;\n            break;\n        }\n      } catch (err) {\n        \u002F\u002F Fallback falls die Daten mal kein JSON sind\n        consoleDiv.textContent += event.data + '\\n';\n      }\n    };\n\n    ws.onerror = (error) => {\n      console.error('WebSocket Error:', error);\n      consoleDiv.textContent += `[WS ERROR] Verbindung fehlgeschlagen.\\n`;\n    };\n\n    ws.onclose = () => {\n      consoleDiv.textContent += `[WS CLOSED] Verbindung getrennt.\\n`;\n    };\n  \u003C\u002Fscript>\n\u003C\u002Fbody>\n\u003C\u002Fhtml>\n","html",[96,3927,3928,3942,3962,3971,3993,4011,4019,4075,4097,4106,4114,4122,4139,4163,4167,4176,4194,4199,4204,4225,4229,4270,4274,4303,4307,4329,4336,4364,4369,4386,4400,4423,4430,4434,4446,4451,4474,4502,4511,4517,4521,4533,4538,4565,4597,4603,4607,4619,4654,4660,4664,4676,4681,4719,4725,4729,4746,4751,4779,4784,4788,4792,4813,4840,4862,4866,4870,4888,4909,4913,4921,4929],{"__ignoreMap":7},[84,3929,3930,3933,3936,3939],{"class":110,"line":111},[84,3931,3932],{"class":204},"\u003C!",[84,3934,3935],{"class":560},"DOCTYPE",[84,3937,3938],{"class":548}," html",[84,3940,3941],{"class":204},">\n",[84,3943,3944,3946,3948,3951,3953,3955,3958,3960],{"class":110,"line":218},[84,3945,822],{"class":204},[84,3947,3925],{"class":560},[84,3949,3950],{"class":548}," lang",[84,3952,2536],{"class":204},[84,3954,211],{"class":204},[84,3956,3957],{"class":118},"de",[84,3959,211],{"class":204},[84,3961,3941],{"class":204},[84,3963,3964,3966,3969],{"class":110,"line":233},[84,3965,822],{"class":204},[84,3967,3968],{"class":560},"head",[84,3970,3941],{"class":204},[84,3972,3973,3976,3979,3982,3984,3986,3989,3991],{"class":110,"line":272},[84,3974,3975],{"class":204},"  \u003C",[84,3977,3978],{"class":560},"meta",[84,3980,3981],{"class":548}," charset",[84,3983,2536],{"class":204},[84,3985,211],{"class":204},[84,3987,3988],{"class":118},"UTF-8",[84,3990,211],{"class":204},[84,3992,3941],{"class":204},[84,3994,3995,3997,3999,4001,4004,4007,4009],{"class":110,"line":278},[84,3996,3975],{"class":204},[84,3998,3099],{"class":560},[84,4000,868],{"class":204},[84,4002,4003],{"class":214},"KiroBot Live Konsole",[84,4005,4006],{"class":204},"\u003C\u002F",[84,4008,3099],{"class":560},[84,4010,3941],{"class":204},[84,4012,4013,4015,4017],{"class":110,"line":284},[84,4014,3975],{"class":204},[84,4016,421],{"class":560},[84,4018,3941],{"class":204},[84,4020,4021,4024,4026,4030,4032,4035,4038,4040,4043,4045,4047,4050,4052,4055,4057,4060,4062,4065,4067,4070,4072],{"class":110,"line":290},[84,4022,4023],{"class":114},"    body",[84,4025,1403],{"class":204},[84,4027,4029],{"class":4028},"sqsOY"," background",[84,4031,564],{"class":204},[84,4033,4034],{"class":204}," #",[84,4036,4037],{"class":214},"111",[84,4039,1313],{"class":204},[84,4041,4042],{"class":4028}," color",[84,4044,564],{"class":204},[84,4046,4034],{"class":204},[84,4048,4049],{"class":214},"0f0",[84,4051,1313],{"class":204},[84,4053,4054],{"class":4028}," font-family",[84,4056,564],{"class":204},[84,4058,4059],{"class":214}," monospace",[84,4061,1313],{"class":204},[84,4063,4064],{"class":4028}," padding",[84,4066,564],{"class":204},[84,4068,4069],{"class":2823}," 20px",[84,4071,1313],{"class":204},[84,4073,4074],{"class":204}," }\n",[84,4076,4077,4080,4083,4085,4088,4090,4093,4095],{"class":110,"line":296},[84,4078,4079],{"class":204},"    #",[84,4081,4082],{"class":2823},"console",[84,4084,1403],{"class":204},[84,4086,4087],{"class":4028}," white-space",[84,4089,564],{"class":204},[84,4091,4092],{"class":214}," pre-wrap",[84,4094,1313],{"class":204},[84,4096,4074],{"class":204},[84,4098,4099,4102,4104],{"class":110,"line":302},[84,4100,4101],{"class":204},"  \u003C\u002F",[84,4103,421],{"class":560},[84,4105,3941],{"class":204},[84,4107,4108,4110,4112],{"class":110,"line":362},[84,4109,4006],{"class":204},[84,4111,3968],{"class":560},[84,4113,3941],{"class":204},[84,4115,4116,4118,4120],{"class":110,"line":679},[84,4117,822],{"class":204},[84,4119,1063],{"class":560},[84,4121,3941],{"class":204},[84,4123,4124,4126,4128,4130,4133,4135,4137],{"class":110,"line":684},[84,4125,3975],{"class":204},[84,4127,26],{"class":560},[84,4129,868],{"class":204},[84,4131,4132],{"class":214},"Live Konsole",[84,4134,4006],{"class":204},[84,4136,26],{"class":560},[84,4138,3941],{"class":204},[84,4140,4141,4143,4146,4148,4150,4152,4154,4156,4159,4161],{"class":110,"line":689},[84,4142,3975],{"class":204},[84,4144,4145],{"class":560},"div",[84,4147,1518],{"class":548},[84,4149,2536],{"class":204},[84,4151,211],{"class":204},[84,4153,4082],{"class":118},[84,4155,211],{"class":204},[84,4157,4158],{"class":204},">\u003C\u002F",[84,4160,4145],{"class":560},[84,4162,3941],{"class":204},[84,4164,4165],{"class":110,"line":702},[84,4166,327],{"emptyLinePlaceholder":326},[84,4168,4169,4171,4174],{"class":110,"line":717},[84,4170,3975],{"class":204},[84,4172,4173],{"class":560},"script",[84,4175,3941],{"class":204},[84,4177,4178,4180,4183,4185,4187,4190,4192],{"class":110,"line":731},[84,4179,876],{"class":548},[84,4181,4182],{"class":214}," BOT_ID ",[84,4184,2536],{"class":204},[84,4186,612],{"class":204},[84,4188,4189],{"class":118},"1234567890",[84,4191,618],{"class":204},[84,4193,570],{"class":204},[84,4195,4196],{"class":110,"line":736},[84,4197,4198],{"class":538},"    \u002F\u002F HINWEIS: Niemals den API-Key dauerhaft im Frontend hardcoden!\n",[84,4200,4201],{"class":110,"line":773},[84,4202,4203],{"class":538},"    \u002F\u002F Nutze Cookies oder einen Backend-Proxy in Produktion.\n",[84,4205,4206,4208,4211,4213,4215,4218,4220,4222],{"class":110,"line":787},[84,4207,876],{"class":548},[84,4209,4210],{"class":214}," TOKEN ",[84,4212,2536],{"class":204},[84,4214,612],{"class":204},[84,4216,4217],{"class":118},"DEIN_API_KEY",[84,4219,618],{"class":204},[84,4221,1313],{"class":204},[84,4223,4224],{"class":214}," \n",[84,4226,4227],{"class":110,"line":801},[84,4228,327],{"emptyLinePlaceholder":326},[84,4230,4231,4233,4236,4238,4240,4243,4245,4247,4250,4252,4254,4256,4259,4261,4264,4266,4268],{"class":110,"line":806},[84,4232,876],{"class":548},[84,4234,4235],{"class":214}," ws ",[84,4237,2536],{"class":204},[84,4239,1165],{"class":204},[84,4241,4242],{"class":999}," WebSocket",[84,4244,742],{"class":214},[84,4246,1173],{"class":204},[84,4248,4249],{"class":118},"wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=",[84,4251,920],{"class":204},[84,4253,2561],{"class":214},[84,4255,1188],{"class":204},[84,4257,4258],{"class":118},"&token=",[84,4260,920],{"class":204},[84,4262,4263],{"class":214},"TOKEN",[84,4265,928],{"class":204},[84,4267,768],{"class":214},[84,4269,570],{"class":204},[84,4271,4272],{"class":110,"line":811},[84,4273,327],{"emptyLinePlaceholder":326},[84,4275,4276,4278,4281,4283,4286,4288,4291,4293,4295,4297,4299,4301],{"class":110,"line":873},[84,4277,876],{"class":548},[84,4279,4280],{"class":214}," consoleDiv ",[84,4282,2536],{"class":204},[84,4284,4285],{"class":214}," document",[84,4287,44],{"class":204},[84,4289,4290],{"class":999},"getElementById",[84,4292,742],{"class":214},[84,4294,618],{"class":204},[84,4296,4082],{"class":118},[84,4298,618],{"class":204},[84,4300,768],{"class":214},[84,4302,570],{"class":204},[84,4304,4305],{"class":110,"line":902},[84,4306,327],{"emptyLinePlaceholder":326},[84,4308,4309,4312,4314,4317,4319,4321,4323,4325,4327],{"class":110,"line":934},[84,4310,4311],{"class":214},"    ws",[84,4313,44],{"class":204},[84,4315,4316],{"class":999},"onmessage",[84,4318,758],{"class":204},[84,4320,1095],{"class":204},[84,4322,3521],{"class":745},[84,4324,768],{"class":204},[84,4326,1146],{"class":548},[84,4328,555],{"class":204},[84,4330,4331,4334],{"class":110,"line":955},[84,4332,4333],{"class":544},"      try",[84,4335,555],{"class":204},[84,4337,4338,4341,4343,4345,4347,4349,4352,4354,4356,4358,4360,4362],{"class":110,"line":975},[84,4339,4340],{"class":548},"        const",[84,4342,1928],{"class":214},[84,4344,758],{"class":204},[84,4346,1053],{"class":214},[84,4348,44],{"class":204},[84,4350,4351],{"class":999},"parse",[84,4353,742],{"class":560},[84,4355,3521],{"class":214},[84,4357,44],{"class":204},[84,4359,2775],{"class":214},[84,4361,768],{"class":560},[84,4363,570],{"class":204},[84,4365,4366],{"class":110,"line":981},[84,4367,4368],{"class":560},"        \n",[84,4370,4371,4374,4376,4378,4380,4382,4384],{"class":110,"line":986},[84,4372,4373],{"class":544},"        switch",[84,4375,1095],{"class":560},[84,4377,2155],{"class":214},[84,4379,44],{"class":204},[84,4381,3521],{"class":214},[84,4383,1066],{"class":560},[84,4385,1111],{"class":204},[84,4387,4388,4391,4393,4395,4397],{"class":110,"line":1024},[84,4389,4390],{"class":544},"          case",[84,4392,612],{"class":204},[84,4394,3889],{"class":118},[84,4396,618],{"class":204},[84,4398,4399],{"class":204},":\n",[84,4401,4402,4405,4407,4410,4412,4414,4417,4419,4421],{"class":110,"line":1032},[84,4403,4404],{"class":214},"            console",[84,4406,44],{"class":204},[84,4408,4409],{"class":999},"log",[84,4411,742],{"class":560},[84,4413,618],{"class":204},[84,4415,4416],{"class":118},"Erfolgreich mit dem Websocket verbunden!",[84,4418,618],{"class":204},[84,4420,768],{"class":560},[84,4422,570],{"class":204},[84,4424,4425,4428],{"class":110,"line":1040},[84,4426,4427],{"class":544},"            break",[84,4429,570],{"class":204},[84,4431,4432],{"class":110,"line":1074},[84,4433,327],{"emptyLinePlaceholder":326},[84,4435,4436,4438,4440,4442,4444],{"class":110,"line":1084},[84,4437,4390],{"class":544},[84,4439,612],{"class":204},[84,4441,3915],{"class":118},[84,4443,618],{"class":204},[84,4445,4399],{"class":204},[84,4447,4448],{"class":110,"line":1089},[84,4449,4450],{"class":538},"            \u002F\u002F Initialer Log-Dump\n",[84,4452,4453,4456,4458,4460,4462,4465,4467,4470,4472],{"class":110,"line":1114},[84,4454,4455],{"class":214},"            payload",[84,4457,44],{"class":204},[84,4459,2775],{"class":214},[84,4461,44],{"class":204},[84,4463,4464],{"class":999},"forEach",[84,4466,742],{"class":560},[84,4468,4469],{"class":745},"logLine",[84,4471,1146],{"class":548},[84,4473,555],{"class":204},[84,4475,4476,4479,4481,4484,4487,4490,4493,4495,4498,4500],{"class":110,"line":1159},[84,4477,4478],{"class":214},"              consoleDiv",[84,4480,44],{"class":204},[84,4482,4483],{"class":214},"textContent",[84,4485,4486],{"class":204}," +=",[84,4488,4489],{"class":214}," logLine",[84,4491,4492],{"class":204}," +",[84,4494,612],{"class":204},[84,4496,4497],{"class":214},"\\n",[84,4499,618],{"class":204},[84,4501,570],{"class":204},[84,4503,4504,4507,4509],{"class":110,"line":1220},[84,4505,4506],{"class":204},"            }",[84,4508,768],{"class":560},[84,4510,570],{"class":204},[84,4512,4513,4515],{"class":110,"line":1226},[84,4514,4427],{"class":544},[84,4516,570],{"class":204},[84,4518,4519],{"class":110,"line":1231},[84,4520,327],{"emptyLinePlaceholder":326},[84,4522,4523,4525,4527,4529,4531],{"class":110,"line":1258},[84,4524,4390],{"class":544},[84,4526,612],{"class":204},[84,4528,3903],{"class":118},[84,4530,618],{"class":204},[84,4532,4399],{"class":204},[84,4534,4535],{"class":110,"line":1263},[84,4536,4537],{"class":538},"            \u002F\u002F Neue, einzelne Log-Zeile\n",[84,4539,4540,4543,4545,4547,4549,4551,4553,4555,4557,4559,4561,4563],{"class":110,"line":1268},[84,4541,4542],{"class":214},"            consoleDiv",[84,4544,44],{"class":204},[84,4546,4483],{"class":214},[84,4548,4486],{"class":204},[84,4550,1928],{"class":214},[84,4552,44],{"class":204},[84,4554,2775],{"class":214},[84,4556,4492],{"class":204},[84,4558,612],{"class":204},[84,4560,4497],{"class":214},[84,4562,618],{"class":204},[84,4564,570],{"class":204},[84,4566,4567,4570,4572,4575,4577,4580,4582,4584,4586,4588,4590,4593,4595],{"class":110,"line":1274},[84,4568,4569],{"class":214},"            window",[84,4571,44],{"class":204},[84,4573,4574],{"class":999},"scrollTo",[84,4576,742],{"class":560},[84,4578,4579],{"class":2823},"0",[84,4581,753],{"class":204},[84,4583,4285],{"class":214},[84,4585,44],{"class":204},[84,4587,1063],{"class":214},[84,4589,44],{"class":204},[84,4591,4592],{"class":214},"scrollHeight",[84,4594,768],{"class":560},[84,4596,570],{"class":204},[84,4598,4599,4601],{"class":110,"line":1279},[84,4600,4427],{"class":544},[84,4602,570],{"class":204},[84,4604,4605],{"class":110,"line":1292},[84,4606,327],{"emptyLinePlaceholder":326},[84,4608,4609,4611,4613,4615,4617],{"class":110,"line":1358},[84,4610,4390],{"class":544},[84,4612,612],{"class":204},[84,4614,3897],{"class":118},[84,4616,618],{"class":204},[84,4618,4399],{"class":204},[84,4620,4621,4623,4625,4627,4629,4631,4634,4636,4638,4640,4642,4644,4646,4648,4650,4652],{"class":110,"line":1363},[84,4622,4542],{"class":214},[84,4624,44],{"class":204},[84,4626,4483],{"class":214},[84,4628,4486],{"class":204},[84,4630,914],{"class":204},[84,4632,4633],{"class":118},"[SYSTEM] Bot Status geändert zu: ",[84,4635,920],{"class":204},[84,4637,2155],{"class":214},[84,4639,44],{"class":204},[84,4641,2775],{"class":214},[84,4643,44],{"class":204},[84,4645,1185],{"class":214},[84,4647,1188],{"class":204},[84,4649,4497],{"class":214},[84,4651,1173],{"class":204},[84,4653,570],{"class":204},[84,4655,4656,4658],{"class":110,"line":1368},[84,4657,4427],{"class":544},[84,4659,570],{"class":204},[84,4661,4662],{"class":110,"line":1380},[84,4663,327],{"emptyLinePlaceholder":326},[84,4665,4666,4668,4670,4672,4674],{"class":110,"line":1457},[84,4667,4390],{"class":544},[84,4669,612],{"class":204},[84,4671,3909],{"class":118},[84,4673,618],{"class":204},[84,4675,4399],{"class":204},[84,4677,4678],{"class":110,"line":1462},[84,4679,4680],{"class":538},"            \u002F\u002F payload.data enthält z.B. { cpu: 2.5, memory: 120 }\n",[84,4682,4683,4686,4688,4690,4692,4694,4697,4699,4701,4703,4705,4707,4710,4712,4715,4717],{"class":110,"line":1467},[84,4684,4685],{"class":214},"            document",[84,4687,44],{"class":204},[84,4689,3099],{"class":214},[84,4691,758],{"class":204},[84,4693,914],{"class":204},[84,4695,4696],{"class":118},"RAM: ",[84,4698,920],{"class":204},[84,4700,2155],{"class":214},[84,4702,44],{"class":204},[84,4704,2775],{"class":214},[84,4706,44],{"class":204},[84,4708,4709],{"class":214},"memory",[84,4711,1188],{"class":204},[84,4713,4714],{"class":118},"MB",[84,4716,1173],{"class":204},[84,4718,570],{"class":204},[84,4720,4721,4723],{"class":110,"line":1473},[84,4722,4427],{"class":544},[84,4724,570],{"class":204},[84,4726,4727],{"class":110,"line":1478},[84,4728,2351],{"class":204},[84,4730,4731,4734,4737,4739,4742,4744],{"class":110,"line":1490},[84,4732,4733],{"class":204},"      }",[84,4735,4736],{"class":544}," catch",[84,4738,1095],{"class":560},[84,4740,4741],{"class":214},"err",[84,4743,1066],{"class":560},[84,4745,1111],{"class":204},[84,4747,4748],{"class":110,"line":1568},[84,4749,4750],{"class":538},"        \u002F\u002F Fallback falls die Daten mal kein JSON sind\n",[84,4752,4753,4756,4758,4760,4762,4765,4767,4769,4771,4773,4775,4777],{"class":110,"line":1573},[84,4754,4755],{"class":214},"        consoleDiv",[84,4757,44],{"class":204},[84,4759,4483],{"class":214},[84,4761,4486],{"class":204},[84,4763,4764],{"class":214}," event",[84,4766,44],{"class":204},[84,4768,2775],{"class":214},[84,4770,4492],{"class":204},[84,4772,612],{"class":204},[84,4774,4497],{"class":214},[84,4776,618],{"class":204},[84,4778,570],{"class":204},[84,4780,4781],{"class":110,"line":1578},[84,4782,4783],{"class":204},"      }\n",[84,4785,4786],{"class":110,"line":1599},[84,4787,978],{"class":204},[84,4789,4790],{"class":110,"line":1640},[84,4791,327],{"emptyLinePlaceholder":326},[84,4793,4794,4796,4798,4801,4803,4805,4807,4809,4811],{"class":110,"line":1645},[84,4795,4311],{"class":214},[84,4797,44],{"class":204},[84,4799,4800],{"class":999},"onerror",[84,4802,758],{"class":204},[84,4804,1095],{"class":204},[84,4806,644],{"class":745},[84,4808,768],{"class":204},[84,4810,1146],{"class":548},[84,4812,555],{"class":204},[84,4814,4815,4818,4820,4822,4824,4826,4829,4831,4833,4836,4838],{"class":110,"line":1650},[84,4816,4817],{"class":214},"      console",[84,4819,44],{"class":204},[84,4821,644],{"class":999},[84,4823,742],{"class":560},[84,4825,618],{"class":204},[84,4827,4828],{"class":118},"WebSocket Error:",[84,4830,618],{"class":204},[84,4832,753],{"class":204},[84,4834,4835],{"class":214}," error",[84,4837,768],{"class":560},[84,4839,570],{"class":204},[84,4841,4842,4845,4847,4849,4851,4853,4856,4858,4860],{"class":110,"line":1670},[84,4843,4844],{"class":214},"      consoleDiv",[84,4846,44],{"class":204},[84,4848,4483],{"class":214},[84,4850,4486],{"class":204},[84,4852,914],{"class":204},[84,4854,4855],{"class":118},"[WS ERROR] Verbindung fehlgeschlagen.",[84,4857,4497],{"class":214},[84,4859,1173],{"class":204},[84,4861,570],{"class":204},[84,4863,4864],{"class":110,"line":1728},[84,4865,978],{"class":204},[84,4867,4868],{"class":110,"line":1733},[84,4869,327],{"emptyLinePlaceholder":326},[84,4871,4872,4874,4876,4879,4881,4884,4886],{"class":110,"line":1738},[84,4873,4311],{"class":214},[84,4875,44],{"class":204},[84,4877,4878],{"class":999},"onclose",[84,4880,758],{"class":204},[84,4882,4883],{"class":204}," ()",[84,4885,1146],{"class":548},[84,4887,555],{"class":204},[84,4889,4890,4892,4894,4896,4898,4900,4903,4905,4907],{"class":110,"line":1758},[84,4891,4844],{"class":214},[84,4893,44],{"class":204},[84,4895,4483],{"class":214},[84,4897,4486],{"class":204},[84,4899,914],{"class":204},[84,4901,4902],{"class":118},"[WS CLOSED] Verbindung getrennt.",[84,4904,4497],{"class":214},[84,4906,1173],{"class":204},[84,4908,570],{"class":204},[84,4910,4911],{"class":110,"line":1814},[84,4912,978],{"class":204},[84,4914,4915,4917,4919],{"class":110,"line":1819},[84,4916,4101],{"class":204},[84,4918,4173],{"class":560},[84,4920,3941],{"class":204},[84,4922,4923,4925,4927],{"class":110,"line":1824},[84,4924,4006],{"class":204},[84,4926,1063],{"class":560},[84,4928,3941],{"class":204},[84,4930,4931,4933,4935],{"class":110,"line":1844},[84,4932,4006],{"class":204},[84,4934,3925],{"class":560},[84,4936,3941],{"class":204},[466,4938],{},[466,4940],{},[26,4942,4944],{"id":4943},"_2-bot-telemetrie-performance-stream-nodejs-client","2. Bot Telemetrie & Performance Stream (Node.js Client)",[22,4946,4947,4948,44],{},"Für Backend-Dienste, Überwachungstools oder Daemon-Skripte kannst du den WebSocket auch direkt in Node.js konsumieren. Hierfür eignet sich die Standard-Bibliothek ",[96,4949,4950],{},"ws",[22,4952,4953,4955],{},[41,4954,3876],{},[96,4956,3879],{},[183,4958,4960],{"id":4959},"implementierung-im-backend-nodejs","Implementierung im Backend (Node.js)",[101,4962,4964],{"className":250,"code":4963,"language":252,"meta":7,"style":7},"\u002F\u002F npm install ws\nimport WebSocket from 'ws';\n\nconst BOT_ID = '00000000-0000-0000-0000-000000000000';\nconst API_TOKEN = 'kiro_sec_DEIN_API_SCHLUESSEL';\nconst ws = new WebSocket(`wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=${BOT_ID}&token=${API_TOKEN}`);\n\nws.on('open', () => {\n  console.log('Mit KiroCloud Telemetrie-Stream verbunden!');\n});\n\nws.on('message', (data) => {\n  const payload = JSON.parse(data.toString());\n  \n  if (payload.event === 'subscribed') {\n    console.log('Abonnement für Bot-Telemetrie aktiv.');\n  } else if (payload.event === 'bot:stats') {\n    console.log(`[BOT STATS] CPU: ${payload.data.cpu}% | RAM: ${payload.data.memory}MB`);\n  } else if (payload.event === 'bot:status') {\n    console.log(`[BOT STATUS] Neuer Status: ${payload.data.status}`);\n  }\n});\n\nws.on('close', (code, reason) => {\n  console.log(`Verbindung geschlossen (${code}):`, reason.toString());\n});\n\nws.on('error', (err) => {\n  console.error('WebSocket Fehler:', err.message);\n});\n",[96,4965,4966,4971,4976,4980,4985,4990,4995,4999,5004,5009,5013,5017,5022,5027,5032,5037,5042,5047,5052,5057,5062,5066,5070,5074,5079,5084,5088,5092,5097,5102],{"__ignoreMap":7},[84,4967,4968],{"class":110,"line":111},[84,4969,4970],{},"\u002F\u002F npm install ws\n",[84,4972,4973],{"class":110,"line":218},[84,4974,4975],{},"import WebSocket from 'ws';\n",[84,4977,4978],{"class":110,"line":233},[84,4979,327],{"emptyLinePlaceholder":326},[84,4981,4982],{"class":110,"line":272},[84,4983,4984],{},"const BOT_ID = '00000000-0000-0000-0000-000000000000';\n",[84,4986,4987],{"class":110,"line":278},[84,4988,4989],{},"const API_TOKEN = 'kiro_sec_DEIN_API_SCHLUESSEL';\n",[84,4991,4992],{"class":110,"line":284},[84,4993,4994],{},"const ws = new WebSocket(`wss:\u002F\u002Fapi.kirocloud.de\u002Fws\u002Fdashboard?botId=${BOT_ID}&token=${API_TOKEN}`);\n",[84,4996,4997],{"class":110,"line":290},[84,4998,327],{"emptyLinePlaceholder":326},[84,5000,5001],{"class":110,"line":296},[84,5002,5003],{},"ws.on('open', () => {\n",[84,5005,5006],{"class":110,"line":302},[84,5007,5008],{},"  console.log('Mit KiroCloud Telemetrie-Stream verbunden!');\n",[84,5010,5011],{"class":110,"line":362},[84,5012,293],{},[84,5014,5015],{"class":110,"line":679},[84,5016,327],{"emptyLinePlaceholder":326},[84,5018,5019],{"class":110,"line":684},[84,5020,5021],{},"ws.on('message', (data) => {\n",[84,5023,5024],{"class":110,"line":689},[84,5025,5026],{},"  const payload = JSON.parse(data.toString());\n",[84,5028,5029],{"class":110,"line":702},[84,5030,5031],{},"  \n",[84,5033,5034],{"class":110,"line":717},[84,5035,5036],{},"  if (payload.event === 'subscribed') {\n",[84,5038,5039],{"class":110,"line":731},[84,5040,5041],{},"    console.log('Abonnement für Bot-Telemetrie aktiv.');\n",[84,5043,5044],{"class":110,"line":736},[84,5045,5046],{},"  } else if (payload.event === 'bot:stats') {\n",[84,5048,5049],{"class":110,"line":773},[84,5050,5051],{},"    console.log(`[BOT STATS] CPU: ${payload.data.cpu}% | RAM: ${payload.data.memory}MB`);\n",[84,5053,5054],{"class":110,"line":787},[84,5055,5056],{},"  } else if (payload.event === 'bot:status') {\n",[84,5058,5059],{"class":110,"line":801},[84,5060,5061],{},"    console.log(`[BOT STATUS] Neuer Status: ${payload.data.status}`);\n",[84,5063,5064],{"class":110,"line":806},[84,5065,287],{},[84,5067,5068],{"class":110,"line":811},[84,5069,293],{},[84,5071,5072],{"class":110,"line":873},[84,5073,327],{"emptyLinePlaceholder":326},[84,5075,5076],{"class":110,"line":902},[84,5077,5078],{},"ws.on('close', (code, reason) => {\n",[84,5080,5081],{"class":110,"line":934},[84,5082,5083],{},"  console.log(`Verbindung geschlossen (${code}):`, reason.toString());\n",[84,5085,5086],{"class":110,"line":955},[84,5087,293],{},[84,5089,5090],{"class":110,"line":975},[84,5091,327],{"emptyLinePlaceholder":326},[84,5093,5094],{"class":110,"line":981},[84,5095,5096],{},"ws.on('error', (err) => {\n",[84,5098,5099],{"class":110,"line":986},[84,5100,5101],{},"  console.error('WebSocket Fehler:', err.message);\n",[84,5103,5104],{"class":110,"line":1024},[84,5105,293],{},[466,5107],{},[26,5109,5111],{"id":5110},"_3-fehlerbehebung-statuscodes","3. Fehlerbehebung & Statuscodes",[22,5113,5114],{},"Sollte die WebSocket-Verbindung sofort nach dem Öffnen wieder getrennt werden, liefert der WebSocket Close Code die Ursache:",[131,5116,5117,5127,5142],{},[37,5118,5119,5122,5123,5126],{},[96,5120,5121],{},"1008 Policy Violation"," mit ",[96,5124,5125],{},"invalid token",": Der übergebene API-Schlüssel ist ungültig, abgelaufen oder hat keinen Zugriff auf die angeforderte Bot-Instanz.",[37,5128,5129,5122,5131,5134,5135,5137,5138,5141],{},[96,5130,5121],{},[96,5132,5133],{},"token+botId required",": Der Pflichtparameter ",[96,5136,1588],{}," oder ",[96,5139,5140],{},"token"," fehlt in der Verbindungs-URL.",[37,5143,5144,5147],{},[96,5145,5146],{},"1001 Going Away",": Die Bot-Instanz wurde neu gestartet; der Client sollte nach 2 Sekunden eine automatische Wiederverbindung versuchen.",[421,5149,5150],{},"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 .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .swJcz, html code.shiki .swJcz{--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178}html pre.shiki code .spNyl, html code.shiki .spNyl{--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sqsOY, html code.shiki .sqsOY{--shiki-light:#8796B0;--shiki-default:#B2CCD6;--shiki-dark:#B2CCD6}html pre.shiki code .sbssI, html code.shiki .sbssI{--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C}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 .s2Zo4, html code.shiki .s2Zo4{--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF}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 .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}",{"title":7,"searchDepth":218,"depth":218,"links":5152},[5153,5157,5160],{"id":3867,"depth":218,"text":3868,"children":5154},[5155,5156],{"id":3882,"depth":233,"text":3883},{"id":3919,"depth":233,"text":3920},{"id":4943,"depth":218,"text":4944,"children":5158},[5159],{"id":4959,"depth":233,"text":4960},{"id":5110,"depth":218,"text":5111},"Verbinde dich mit den KiroCloud WebSockets für Echtzeit-Telemetrie und Live-Logs.",{"icon":5163},"i-lucide-radio","\u002Fdocs\u002Fde\u002Fwebsocket",{"title":3838,"description":5161},"docs\u002Fde\u002Fwebsocket","NgWPgRygjzTPay-3tP1LRZCPOBmOaPatYnut4JBJkVY"]