@echomate/mcp-server 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,32 @@
1
+ type KartenServer = {
2
+ registerResource(name: string, uri: string, metadata: {
3
+ mimeType: string;
4
+ description: string;
5
+ }, lesen: () => Promise<{
6
+ contents: Array<{
7
+ uri: string;
8
+ mimeType?: string;
9
+ text: string;
10
+ _meta?: {
11
+ [x: string]: unknown;
12
+ };
13
+ }>;
14
+ }>): unknown;
15
+ };
16
+ export declare const MIME_KARTE = "text/html;profile=mcp-app";
17
+ export declare const KARTE_QR = "ui://echomate/qr-karte-v4.html";
18
+ export declare const KARTE_TOP = "ui://echomate/top-qr-karte-v3.html";
19
+ export declare const KARTE_AENDERUNG = "ui://echomate/aenderung-karte-v5.html";
20
+ export declare const BILD_SCHLUESSEL = "echomate/bild";
21
+ export declare const BILD_HOECHSTENS = 300000;
22
+ type Texte = Record<"laedt" | "fehler" | "oeffnen" | "scansGesamt" | "ziel" | "kurzlink" | "erklaerung" | "erstellt" | "topTitel" | "analytics" | "keineDaten" | "geaendert" | "vorher" | "jetzt" | "bleibt" | "nichtErlaubt" | "nichtErlaubtText" | "wiederErlauben" | "fehlgeschlagen" | "recht_lesen" | "recht_schreiben" | "recht_loeschen" | "recht_webhooks" | "status" | "aktiv" | "inaktiv" | "unveraendert" | "unveraendertKurz", string>;
23
+ export declare const KARTEN_TEXTE: Record<string, Texte>;
24
+ export declare const KARTEN: Record<string, {
25
+ name: string;
26
+ beschreibung: string;
27
+ html: string;
28
+ }>;
29
+ export declare function registriereKarten(server: KartenServer): void;
30
+ export declare function karteMeta(uri: string): Record<string, unknown>;
31
+ export declare function adminAdresse(shopDomain: string | undefined | null, pfad: string): string | null;
32
+ export {};
package/dist/karten.js ADDED
@@ -0,0 +1,414 @@
1
+ export const MIME_KARTE = "text/html;profile=mcp-app";
2
+ export const KARTE_QR = "ui://echomate/qr-karte-v4.html";
3
+ export const KARTE_TOP = "ui://echomate/top-qr-karte-v3.html";
4
+ export const KARTE_AENDERUNG = "ui://echomate/aenderung-karte-v5.html";
5
+ export const BILD_SCHLUESSEL = "echomate/bild";
6
+ export const BILD_HOECHSTENS = 300_000;
7
+ export const KARTEN_TEXTE = {
8
+ en: {
9
+ laedt: "Loading …", fehler: "This card could not be shown.", oeffnen: "Open in echomate",
10
+ scansGesamt: "Scans total", ziel: "Destination", kurzlink: "Short link", erstellt: "Created",
11
+ erklaerung: "The printed code contains the short link. It counts every scan and forwards to the destination, which you can change anytime.",
12
+ topTitel: "Top QR codes · {tage} days", analytics: "Open Analytics", keineDaten: "No scans in this period yet.",
13
+ geaendert: "QR code changed", vorher: "before", jetzt: "now", bleibt: "The printed code and the short link stay the same.",
14
+ nichtErlaubt: "Not allowed for this connection", nichtErlaubtText: "The store owner limited this connection. Missing right: {recht}. Nothing was changed.",
15
+ wiederErlauben: "To allow it, reconnect echomate in this AI app and approve the right.", fehlgeschlagen: "That did not work. Nothing was changed.",
16
+ recht_lesen: "Read data", recht_schreiben: "Create and change", recht_loeschen: "Delete", recht_webhooks: "Manage webhooks",
17
+ status: "Status", aktiv: "Active", inaktiv: "Inactive",
18
+ unveraendert: "No change needed", unveraendertKurz: "unchanged",
19
+ },
20
+ de: {
21
+ laedt: "Lädt …", fehler: "Diese Karte konnte nicht angezeigt werden.", oeffnen: "In echomate öffnen",
22
+ scansGesamt: "Scans gesamt", ziel: "Ziel", kurzlink: "Short Link", erstellt: "Angelegt",
23
+ erklaerung: "Im gedruckten Code steckt der Short Link. Er zählt jeden Scan und leitet ans Ziel weiter, das du jederzeit ändern kannst.",
24
+ topTitel: "Top-QR-Codes · {tage} Tage", analytics: "Analytics öffnen", keineDaten: "In diesem Zeitraum noch keine Scans.",
25
+ geaendert: "QR-Code geändert", vorher: "vorher", jetzt: "jetzt", bleibt: "Gedruckter Code und Short Link bleiben gleich.",
26
+ nichtErlaubt: "Für diese Verbindung nicht erlaubt", nichtErlaubtText: "Der Ladeninhaber hat diese Verbindung eingeschränkt. Es fehlt das Recht: {recht}. Nichts wurde geändert.",
27
+ wiederErlauben: "Zum Erlauben echomate in dieser KI-App neu verbinden und dem Recht zustimmen.", fehlgeschlagen: "Das hat nicht geklappt. Nichts wurde geändert.",
28
+ recht_lesen: "Daten lesen", recht_schreiben: "Anlegen und ändern", recht_loeschen: "Löschen", recht_webhooks: "Webhooks verwalten",
29
+ status: "Status", aktiv: "Aktiv", inaktiv: "Inaktiv",
30
+ unveraendert: "Keine Änderung nötig", unveraendertKurz: "unverändert",
31
+ },
32
+ da: {
33
+ laedt: "Indlæser …", fehler: "Kortet kunne ikke vises.", oeffnen: "Åbn i echomate",
34
+ scansGesamt: "Scanninger i alt", ziel: "Destination", kurzlink: "Kort link", erstellt: "Oprettet",
35
+ erklaerung: "Den trykte kode indeholder det korte link. Det tæller hver scanning og sender videre til destinationen, som du kan ændre når som helst.",
36
+ topTitel: "Top-QR-koder · {tage} dage", analytics: "Åbn Analytics", keineDaten: "Ingen scanninger i perioden endnu.",
37
+ geaendert: "QR-kode ændret", vorher: "før", jetzt: "nu", bleibt: "Den trykte kode og det korte link forbliver de samme.",
38
+ nichtErlaubt: "Ikke tilladt for denne forbindelse", nichtErlaubtText: "Butiksejeren har begrænset forbindelsen. Manglende rettighed: {recht}. Intet blev ændret.",
39
+ wiederErlauben: "Forbind echomate igen i denne AI-app og godkend rettigheden for at tillade det.", fehlgeschlagen: "Det lykkedes ikke. Intet blev ændret.",
40
+ recht_lesen: "Læse data", recht_schreiben: "Oprette og ændre", recht_loeschen: "Slette", recht_webhooks: "Administrere webhooks",
41
+ status: "Status", aktiv: "Aktiv", inaktiv: "Inaktiv",
42
+ unveraendert: "Ingen ændring nødvendig", unveraendertKurz: "uændret",
43
+ },
44
+ es: {
45
+ laedt: "Cargando …", fehler: "No se pudo mostrar esta tarjeta.", oeffnen: "Abrir en echomate",
46
+ scansGesamt: "Escaneos en total", ziel: "Destino", kurzlink: "Enlace corto", erstellt: "Creado",
47
+ erklaerung: "El código impreso contiene el enlace corto. Cuenta cada escaneo y redirige al destino, que puedes cambiar en cualquier momento.",
48
+ topTitel: "Mejores códigos QR · {tage} días", analytics: "Abrir Analytics", keineDaten: "Aún no hay escaneos en este periodo.",
49
+ geaendert: "Código QR modificado", vorher: "antes", jetzt: "ahora", bleibt: "El código impreso y el enlace corto no cambian.",
50
+ nichtErlaubt: "No permitido para esta conexión", nichtErlaubtText: "El propietario de la tienda limitó esta conexión. Falta el permiso: {recht}. No se cambió nada.",
51
+ wiederErlauben: "Para permitirlo, vuelve a conectar echomate en esta app de IA y aprueba el permiso.", fehlgeschlagen: "No funcionó. No se cambió nada.",
52
+ recht_lesen: "Leer datos", recht_schreiben: "Crear y modificar", recht_loeschen: "Eliminar", recht_webhooks: "Gestionar webhooks",
53
+ status: "Estado", aktiv: "Activo", inaktiv: "Inactivo",
54
+ unveraendert: "No hace falta ningún cambio", unveraendertKurz: "sin cambios",
55
+ },
56
+ fr: {
57
+ laedt: "Chargement …", fehler: "Impossible d’afficher cette carte.", oeffnen: "Ouvrir dans echomate",
58
+ scansGesamt: "Scans au total", ziel: "Destination", kurzlink: "Lien court", erstellt: "Créé",
59
+ erklaerung: "Le code imprimé contient le lien court. Il compte chaque scan et redirige vers la destination, que vous pouvez changer à tout moment.",
60
+ topTitel: "Meilleurs codes QR · {tage} jours", analytics: "Ouvrir Analytics", keineDaten: "Pas encore de scans sur cette période.",
61
+ geaendert: "Code QR modifié", vorher: "avant", jetzt: "maintenant", bleibt: "Le code imprimé et le lien court restent inchangés.",
62
+ nichtErlaubt: "Non autorisé pour cette connexion", nichtErlaubtText: "Le titulaire de la boutique a limité cette connexion. Droit manquant : {recht}. Rien n’a été modifié.",
63
+ wiederErlauben: "Pour l’autoriser, reconnectez echomate dans cette app d’IA et approuvez le droit.", fehlgeschlagen: "Cela n’a pas fonctionné. Rien n’a été modifié.",
64
+ recht_lesen: "Lire les données", recht_schreiben: "Créer et modifier", recht_loeschen: "Supprimer", recht_webhooks: "Gérer les webhooks",
65
+ status: "Statut", aktiv: "Actif", inaktiv: "Inactif",
66
+ unveraendert: "Aucune modification nécessaire", unveraendertKurz: "inchangé",
67
+ },
68
+ it: {
69
+ laedt: "Caricamento …", fehler: "Impossibile mostrare questa scheda.", oeffnen: "Apri in echomate",
70
+ scansGesamt: "Scansioni totali", ziel: "Destinazione", kurzlink: "Link breve", erstellt: "Creato",
71
+ erklaerung: "Il codice stampato contiene il link breve. Conta ogni scansione e inoltra alla destinazione, che puoi cambiare in qualsiasi momento.",
72
+ topTitel: "Codici QR migliori · {tage} giorni", analytics: "Apri Analytics", keineDaten: "Ancora nessuna scansione in questo periodo.",
73
+ geaendert: "Codice QR modificato", vorher: "prima", jetzt: "ora", bleibt: "Il codice stampato e il link breve restano invariati.",
74
+ nichtErlaubt: "Non consentito per questa connessione", nichtErlaubtText: "Il titolare del negozio ha limitato questa connessione. Permesso mancante: {recht}. Non è stato modificato nulla.",
75
+ wiederErlauben: "Per consentirlo, ricollega echomate in questa app di IA e approva il permesso.", fehlgeschlagen: "Non ha funzionato. Non è stato modificato nulla.",
76
+ recht_lesen: "Leggere i dati", recht_schreiben: "Creare e modificare", recht_loeschen: "Eliminare", recht_webhooks: "Gestire i webhook",
77
+ status: "Stato", aktiv: "Attivo", inaktiv: "Inattivo",
78
+ unveraendert: "Nessuna modifica necessaria", unveraendertKurz: "invariato",
79
+ },
80
+ nl: {
81
+ laedt: "Laden …", fehler: "Deze kaart kon niet worden getoond.", oeffnen: "Openen in echomate",
82
+ scansGesamt: "Scans totaal", ziel: "Bestemming", kurzlink: "Korte link", erstellt: "Aangemaakt",
83
+ erklaerung: "De gedrukte code bevat de korte link. Die telt elke scan en stuurt door naar de bestemming, die je altijd kunt wijzigen.",
84
+ topTitel: "Top-QR-codes · {tage} dagen", analytics: "Analytics openen", keineDaten: "Nog geen scans in deze periode.",
85
+ geaendert: "QR-code gewijzigd", vorher: "voor", jetzt: "nu", bleibt: "De gedrukte code en de korte link blijven hetzelfde.",
86
+ nichtErlaubt: "Niet toegestaan voor deze koppeling", nichtErlaubtText: "De winkeleigenaar heeft deze koppeling beperkt. Ontbrekend recht: {recht}. Er is niets gewijzigd.",
87
+ wiederErlauben: "Koppel echomate opnieuw in deze AI-app en keur het recht goed om het toe te staan.", fehlgeschlagen: "Dat is niet gelukt. Er is niets gewijzigd.",
88
+ recht_lesen: "Gegevens lezen", recht_schreiben: "Aanmaken en wijzigen", recht_loeschen: "Verwijderen", recht_webhooks: "Webhooks beheren",
89
+ status: "Status", aktiv: "Actief", inaktiv: "Inactief",
90
+ unveraendert: "Geen wijziging nodig", unveraendertKurz: "ongewijzigd",
91
+ },
92
+ "pt-BR": {
93
+ laedt: "Carregando …", fehler: "Não foi possível mostrar este cartão.", oeffnen: "Abrir no echomate",
94
+ scansGesamt: "Scans no total", ziel: "Destino", kurzlink: "Link curto", erstellt: "Criado",
95
+ erklaerung: "O código impresso contém o link curto. Ele conta cada scan e redireciona para o destino, que você pode mudar a qualquer hora.",
96
+ topTitel: "Melhores códigos QR · {tage} dias", analytics: "Abrir Analytics", keineDaten: "Ainda sem scans neste período.",
97
+ geaendert: "Código QR alterado", vorher: "antes", jetzt: "agora", bleibt: "O código impresso e o link curto continuam iguais.",
98
+ nichtErlaubt: "Não permitido para esta conexão", nichtErlaubtText: "O proprietário da loja limitou esta conexão. Permissão ausente: {recht}. Nada foi alterado.",
99
+ wiederErlauben: "Para permitir, conecte o echomate de novo neste app de IA e aprove a permissão.", fehlgeschlagen: "Não deu certo. Nada foi alterado.",
100
+ recht_lesen: "Ler dados", recht_schreiben: "Criar e alterar", recht_loeschen: "Excluir", recht_webhooks: "Gerenciar webhooks",
101
+ status: "Status", aktiv: "Ativo", inaktiv: "Inativo",
102
+ unveraendert: "Nenhuma alteração necessária", unveraendertKurz: "inalterado",
103
+ },
104
+ sv: {
105
+ laedt: "Laddar …", fehler: "Kortet kunde inte visas.", oeffnen: "Öppna i echomate",
106
+ scansGesamt: "Skanningar totalt", ziel: "Destination", kurzlink: "Kort länk", erstellt: "Skapad",
107
+ erklaerung: "Den tryckta koden innehåller den korta länken. Den räknar varje skanning och skickar vidare till destinationen, som du kan ändra när som helst.",
108
+ topTitel: "Topp-QR-koder · {tage} dagar", analytics: "Öppna Analytics", keineDaten: "Inga skanningar under perioden ännu.",
109
+ geaendert: "QR-kod ändrad", vorher: "före", jetzt: "nu", bleibt: "Den tryckta koden och den korta länken förblir desamma.",
110
+ nichtErlaubt: "Inte tillåtet för den här anslutningen", nichtErlaubtText: "Butiksägaren har begränsat anslutningen. Behörighet saknas: {recht}. Inget ändrades.",
111
+ wiederErlauben: "Anslut echomate igen i den här AI-appen och godkänn behörigheten för att tillåta det.", fehlgeschlagen: "Det gick inte. Inget ändrades.",
112
+ recht_lesen: "Läsa data", recht_schreiben: "Skapa och ändra", recht_loeschen: "Ta bort", recht_webhooks: "Hantera webhooks",
113
+ status: "Status", aktiv: "Aktiv", inaktiv: "Inaktiv",
114
+ unveraendert: "Ingen ändring behövs", unveraendertKurz: "oförändrad",
115
+ },
116
+ "zh-CN": {
117
+ laedt: "加载中 …", fehler: "无法显示此卡片。", oeffnen: "在 echomate 中打开",
118
+ scansGesamt: "扫描总数", ziel: "目标", kurzlink: "短链接", erstellt: "创建于",
119
+ erklaerung: "印好的码里装的是短链接。它统计每次扫描并转到目标,目标随时可以更改。",
120
+ topTitel: "热门 QR 码 · {tage} 天", analytics: "打开 Analytics", keineDaten: "此期间暂无扫描。",
121
+ geaendert: "QR 码已更改", vorher: "之前", jetzt: "现在", bleibt: "已印刷的码和短链接保持不变。",
122
+ nichtErlaubt: "此连接不允许该操作", nichtErlaubtText: "店主限制了此连接。缺少权限:{recht}。未做任何更改。",
123
+ wiederErlauben: "如需允许,请在此 AI 应用中重新连接 echomate 并批准该权限。", fehlgeschlagen: "操作未成功,未做任何更改。",
124
+ recht_lesen: "读取数据", recht_schreiben: "创建和更改", recht_loeschen: "删除", recht_webhooks: "管理 Webhook",
125
+ status: "状态", aktiv: "活跃", inaktiv: "未激活",
126
+ unveraendert: "无需更改", unveraendertKurz: "未更改",
127
+ },
128
+ };
129
+ const BRUECKE = `
130
+ (function () {
131
+ var T = window.__TEXTE || {};
132
+ var sprache = "en";
133
+ function t(k) {
134
+ var s = T[sprache] || T.en || {};
135
+ return s[k] !== undefined ? s[k] : (T.en ? T.en[k] : k);
136
+ }
137
+ var naechste = 1;
138
+ var offen = {};
139
+ function anfrage(method, params) {
140
+ var id = naechste++;
141
+ parent.postMessage({ jsonrpc: "2.0", id: id, method: method, params: params }, "*");
142
+ return new Promise(function (ok, fehl) { offen[id] = { ok: ok, fehl: fehl }; });
143
+ }
144
+ function meldung(method, params) {
145
+ parent.postMessage({ jsonrpc: "2.0", method: method, params: params || {} }, "*");
146
+ }
147
+ function waehleSprache(locale) {
148
+ var l = String(locale || "").toLowerCase();
149
+ if (!l) return;
150
+ if (T[l]) { sprache = l; return; }
151
+ if (l.indexOf("pt") === 0) { sprache = "pt-BR"; return; }
152
+ if (l.indexOf("zh") === 0) { sprache = "zh-CN"; return; }
153
+ var kurz = l.split("-")[0];
154
+ sprache = T[kurz] ? kurz : "en";
155
+ }
156
+ function kontext(k) {
157
+ if (!k) return;
158
+ if (k.theme === "dark" || k.theme === "light") document.documentElement.setAttribute("data-theme", k.theme);
159
+ if (k.locale) { waehleSprache(k.locale); document.documentElement.lang = sprache; }
160
+ var v = k.styles && k.styles.variables;
161
+ if (v) { for (var n in v) { if (Object.prototype.hasOwnProperty.call(v, n) && v[n]) document.documentElement.style.setProperty(n, v[n]); } }
162
+ }
163
+ function groesse() {
164
+ var h = Math.ceil(document.documentElement.getBoundingClientRect().height);
165
+ var w = Math.ceil(document.documentElement.getBoundingClientRect().width);
166
+ meldung("ui/notifications/size-changed", { width: w, height: h });
167
+ }
168
+ function el(tag, klasse, text) {
169
+ var e = document.createElement(tag);
170
+ if (klasse) e.className = klasse;
171
+ if (text !== undefined && text !== null) e.textContent = String(text).replace(/&lt;/g, "<").replace(/&gt;/g, ">");
172
+ return e;
173
+ }
174
+ function oeffne(url) {
175
+ // Zweite Sicherung neben adminAdresse(): nur in den Shopify-Admin.
176
+ if (!/^https:\\/\\/admin\\.shopify\\.com\\//.test(String(url || ""))) return;
177
+ anfrage("ui/open-link", { url: String(url) }).catch(function () {});
178
+ }
179
+ function zeige(ergebnis) {
180
+ var wurzel = document.getElementById("karte");
181
+ wurzel.textContent = "";
182
+ var sc = (ergebnis && ergebnis.structuredContent) || {};
183
+ var meta = (ergebnis && ergebnis._meta) || {};
184
+ try { window.__zeichne(wurzel, sc, { t: t, el: el, oeffne: oeffne, meta: meta }); }
185
+ catch (x) { wurzel.appendChild(el("p", "leise", t("fehler"))); }
186
+ groesse();
187
+ }
188
+ window.addEventListener("message", function (e) {
189
+ // Nur der Host darf sprechen — andere Karten auf derselben Chat-Seite
190
+ // könnten sonst ein gefälschtes Ergebnis samt Knopf unterschieben.
191
+ if (e.source !== window.parent) return;
192
+ var d = e.data;
193
+ if (!d || d.jsonrpc !== "2.0") return;
194
+ if (d.id !== undefined && !d.method && offen[d.id]) {
195
+ var p = offen[d.id]; delete offen[d.id];
196
+ if (d.error) p.fehl(d.error); else p.ok(d.result);
197
+ return;
198
+ }
199
+ if (d.method === "ui/notifications/tool-result") zeige(d.params);
200
+ else if (d.method === "ui/notifications/host-context-changed") kontext(d.params);
201
+ else if (d.method === "ui/resource-teardown" && d.id !== undefined) {
202
+ parent.postMessage({ jsonrpc: "2.0", id: d.id, result: {} }, "*");
203
+ }
204
+ });
205
+ document.getElementById("karte").appendChild(el("p", "leise", t("laedt")));
206
+ anfrage("ui/initialize", {
207
+ appInfo: { name: "echomate", version: "1.0.0" },
208
+ appCapabilities: {},
209
+ protocolVersion: "2026-01-26"
210
+ }).then(function (r) {
211
+ kontext(r && r.hostContext);
212
+ meldung("ui/notifications/initialized", {});
213
+ }).catch(function () { meldung("ui/notifications/initialized", {}); });
214
+ if (window.ResizeObserver) new ResizeObserver(groesse).observe(document.body);
215
+ })();
216
+ `;
217
+ const STIL = `
218
+ :root { color-scheme: light dark;
219
+ --k-bg: #ffffff; --k-bg2: #f5f4ef; --k-tx: #141413; --k-tx2: #5e5d59; --k-rand: #dedcd5;
220
+ --k-akzent: #EC4899; --k-gruen: #1b6e37; --k-gruenbg: #e3f5e8; --k-rot: #a8322f; --k-rotbg: #fbeaea; }
221
+ :root[data-theme="dark"] {
222
+ --k-bg: #262624; --k-bg2: #1f1e1d; --k-tx: #f5f4ef; --k-tx2: #b4b2aa; --k-rand: #45433f;
223
+ --k-gruen: #7ee2a0; --k-gruenbg: #16341f; --k-rot: #f7a1a1; --k-rotbg: #3a1d1d; }
224
+ @media (prefers-color-scheme: dark) { :root:not([data-theme="light"]) {
225
+ --k-bg: #262624; --k-bg2: #1f1e1d; --k-tx: #f5f4ef; --k-tx2: #b4b2aa; --k-rand: #45433f;
226
+ --k-gruen: #7ee2a0; --k-gruenbg: #16341f; --k-rot: #f7a1a1; --k-rotbg: #3a1d1d; } }
227
+ html, body { margin: 0; padding: 0; background: transparent; }
228
+ body { font-family: var(--font-sans, system-ui, -apple-system, "Segoe UI", sans-serif); font-size: 14px; line-height: 1.45;
229
+ color: var(--color-text-primary, var(--k-tx)); }
230
+ #karte { box-sizing: border-box; padding: 16px 18px; border-radius: 14px;
231
+ background: var(--color-background-primary, var(--k-bg)); border: 1px solid var(--color-border-primary, var(--k-rand)); }
232
+ .leise { color: var(--color-text-secondary, var(--k-tx2)); margin: 0; }
233
+ .titel { font-size: 17px; font-weight: 700; margin: 0; }
234
+ .reihe { display: flex; gap: 18px; flex-wrap: wrap; align-items: flex-start; }
235
+ .spalte { display: flex; flex-direction: column; gap: 10px; min-width: 0; flex: 1 1 220px; }
236
+ .bild { width: 156px; height: 156px; flex: 0 0 auto; border-radius: 12px; background: #ffffff; padding: 8px; box-sizing: border-box; }
237
+ .bild img { width: 100%; height: 100%; display: block; }
238
+ .zahl { font-size: 26px; font-weight: 700; margin: 0; }
239
+ .feld { display: grid; grid-template-columns: 84px minmax(0, 1fr); gap: 4px 10px; }
240
+ .feld > div { overflow-wrap: anywhere; }
241
+ .knopf { align-self: flex-start; min-height: 40px; padding: 0 16px; border-radius: 10px; cursor: pointer; font: inherit; font-weight: 600;
242
+ border: 1px solid var(--color-border-primary, var(--k-rand)); background: transparent; color: inherit; }
243
+ .knopf:focus-visible { outline: 2px solid var(--k-akzent); outline-offset: 2px; }
244
+ .kopf { display: flex; align-items: center; gap: 10px; }
245
+ .zeile { display: grid; grid-template-columns: minmax(0, 180px) minmax(0, 1fr) 52px; gap: 12px; align-items: center; }
246
+ .zeile .name { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
247
+ .spur { height: 10px; border-radius: 999px; background: var(--color-background-secondary, var(--k-bg2)); }
248
+ .balken { height: 10px; border-radius: 999px; background: var(--k-akzent); }
249
+ .wert { text-align: right; font-weight: 600; }
250
+ .alt { text-decoration: line-through; color: var(--color-text-secondary, var(--k-tx2)); }
251
+ .ok { color: var(--k-gruen); }
252
+ .abgelehnt { color: var(--k-rot); }
253
+ `;
254
+ function seite(titel, zeichne) {
255
+ return `<!doctype html>
256
+ <html lang="en"><head><meta charset="utf-8"><title>${titel}</title>
257
+ <meta name="viewport" content="width=device-width, initial-scale=1">
258
+ <style>${STIL}</style></head>
259
+ <body><div id="karte" role="region" aria-label="${titel}"></div>
260
+ <script>window.__TEXTE = ${JSON.stringify(KARTEN_TEXTE)};</script>
261
+ <script>${zeichne}</script>
262
+ <script>${BRUECKE}</script>
263
+ </body></html>`;
264
+ }
265
+ const ZEICHNE_QR = `
266
+ window.__zeichne = function (w, sc, h) {
267
+ var t = h.t, el = h.el;
268
+ if (!sc.ok || !sc.daten || !sc.daten.qr) { w.appendChild(el("p", "leise", sc.fehler || t("fehler"))); return; }
269
+ var d = sc.daten, q = d.qr;
270
+ var reihe = el("div", "reihe");
271
+ var bild = h.meta && h.meta["echomate/bild"];
272
+ if (typeof bild === "string" && bild.indexOf("data:image/svg+xml;base64,") === 0) {
273
+ var rahmen = el("div", "bild");
274
+ var img = document.createElement("img");
275
+ img.src = bild; img.alt = q.name || "QR";
276
+ rahmen.appendChild(img); reihe.appendChild(rahmen);
277
+ }
278
+ var sp = el("div", "spalte");
279
+ sp.appendChild(el("p", "titel", q.name));
280
+ var zahl = el("div");
281
+ zahl.appendChild(el("p", "leise", t("scansGesamt")));
282
+ zahl.appendChild(el("p", "zahl", typeof q.scansCount === "number" ? q.scansCount.toLocaleString() : "–"));
283
+ sp.appendChild(zahl);
284
+ var feld = el("div", "feld");
285
+ feld.appendChild(el("div", "leise", t("ziel"))); feld.appendChild(el("div", "", q.targetUrl));
286
+ if (q.shortUrl) { feld.appendChild(el("div", "leise", t("kurzlink"))); feld.appendChild(el("div", "", q.shortUrl)); }
287
+ sp.appendChild(feld);
288
+ if (q.shortUrl) sp.appendChild(el("p", "leise", t("erklaerung")));
289
+ if (d.adminUrl) {
290
+ var k = el("button", "knopf", t("oeffnen"));
291
+ k.type = "button";
292
+ k.addEventListener("click", function () { h.oeffne(d.adminUrl); });
293
+ sp.appendChild(k);
294
+ }
295
+ reihe.appendChild(sp);
296
+ w.appendChild(reihe);
297
+ };
298
+ `;
299
+ const ZEICHNE_TOP = `
300
+ window.__zeichne = function (w, sc, h) {
301
+ var t = h.t, el = h.el;
302
+ if (!sc.ok || !sc.daten) { w.appendChild(el("p", "leise", sc.fehler || t("fehler"))); return; }
303
+ var d = sc.daten, codes = d.codes || [];
304
+ var sp = el("div", "spalte");
305
+ sp.appendChild(el("p", "titel", t("topTitel").replace("{tage}", String(d.tage || 30))));
306
+ if (!codes.length) sp.appendChild(el("p", "leise", t("keineDaten")));
307
+ var max = 0;
308
+ for (var i = 0; i < codes.length; i++) max = Math.max(max, codes[i].scansCount || 0);
309
+ for (var j = 0; j < codes.length; j++) {
310
+ var c = codes[j], z = el("div", "zeile");
311
+ z.appendChild(el("div", "name", c.name));
312
+ var spur = el("div", "spur"), b = el("div", "balken");
313
+ b.style.width = (max > 0 ? Math.max(2, Math.round((c.scansCount || 0) / max * 100)) : 0) + "%";
314
+ spur.appendChild(b); z.appendChild(spur);
315
+ z.appendChild(el("div", "wert", (c.scansCount || 0).toLocaleString()));
316
+ sp.appendChild(z);
317
+ }
318
+ if (d.adminUrl) {
319
+ var k = el("button", "knopf", t("analytics"));
320
+ k.type = "button";
321
+ k.addEventListener("click", function () { h.oeffne(d.adminUrl); });
322
+ sp.appendChild(k);
323
+ }
324
+ w.appendChild(sp);
325
+ };
326
+ `;
327
+ const ZEICHNE_AENDERUNG = `
328
+ window.__zeichne = function (w, sc, h) {
329
+ var t = h.t, el = h.el;
330
+ var sp = el("div", "spalte");
331
+ if (!sc.ok) {
332
+ var kopf = el("div", "kopf");
333
+ if (sc.recht) {
334
+ kopf.appendChild(el("span", "abgelehnt", "\\u2715"));
335
+ kopf.appendChild(el("p", "titel", t("nichtErlaubt")));
336
+ sp.appendChild(kopf);
337
+ sp.appendChild(el("p", "", t("nichtErlaubtText").replace("{recht}", t("recht_" + sc.recht))));
338
+ sp.appendChild(el("p", "leise", t("wiederErlauben")));
339
+ } else {
340
+ kopf.appendChild(el("p", "titel", t("fehlgeschlagen")));
341
+ sp.appendChild(kopf);
342
+ if (sc.fehler) sp.appendChild(el("p", "leise", sc.fehler));
343
+ }
344
+ w.appendChild(sp);
345
+ return;
346
+ }
347
+ var d = sc.daten || {}, neu = (d.data || {}), alt = (d.vorher || {});
348
+ var hatVorher = alt.name !== undefined || alt.targetUrl !== undefined || typeof alt.isActive === "boolean";
349
+ var gleich = hatVorher &&
350
+ (alt.name === undefined || alt.name === neu.name) &&
351
+ (alt.targetUrl === undefined || alt.targetUrl === neu.targetUrl) &&
352
+ (typeof alt.isActive !== "boolean" || alt.isActive === neu.isActive);
353
+ var kopf2 = el("div", "kopf");
354
+ kopf2.appendChild(el("span", "ok", "\\u2713"));
355
+ kopf2.appendChild(el("p", "titel", t(gleich ? "unveraendert" : "geaendert")));
356
+ sp.appendChild(kopf2);
357
+ var feld = el("div", "feld");
358
+ if (alt.name !== undefined && alt.name !== neu.name) {
359
+ feld.appendChild(el("div", "leise", t("vorher"))); feld.appendChild(el("div", "alt", alt.name));
360
+ feld.appendChild(el("div", "leise", t("jetzt"))); feld.appendChild(el("div", "", neu.name));
361
+ } else {
362
+ feld.appendChild(el("div", "leise", "QR")); feld.appendChild(el("div", "", neu.name));
363
+ }
364
+ if (alt.targetUrl !== undefined && alt.targetUrl !== neu.targetUrl) {
365
+ feld.appendChild(el("div", "leise", t("ziel"))); feld.appendChild(el("div", "", neu.targetUrl));
366
+ }
367
+ if (typeof alt.isActive === "boolean" && typeof neu.isActive === "boolean" && alt.isActive !== neu.isActive) {
368
+ feld.appendChild(el("div", "leise", t("status")));
369
+ feld.appendChild(el("div", "", t(alt.isActive ? "aktiv" : "inaktiv") + " \\u2192 " + t(neu.isActive ? "aktiv" : "inaktiv")));
370
+ } else if (gleich && typeof neu.isActive === "boolean") {
371
+ /* Der Auftrag war meist »schalte auf aktiv« — die Karte sagt, dass er es schon war. */
372
+ feld.appendChild(el("div", "leise", t("status")));
373
+ feld.appendChild(el("div", "", t(neu.isActive ? "aktiv" : "inaktiv") + " (" + t("unveraendertKurz") + ")"));
374
+ }
375
+ sp.appendChild(feld);
376
+ sp.appendChild(el("p", "leise", t("bleibt")));
377
+ if (d.adminUrl) {
378
+ var k = el("button", "knopf", t("oeffnen"));
379
+ k.type = "button";
380
+ k.addEventListener("click", function () { h.oeffne(d.adminUrl); });
381
+ sp.appendChild(k);
382
+ }
383
+ w.appendChild(sp);
384
+ };
385
+ `;
386
+ export const KARTEN = {
387
+ [KARTE_QR]: { name: "qr_karte", beschreibung: "QR code card: image, scans, destination, short link", html: seite("echomate · QR", ZEICHNE_QR) },
388
+ [KARTE_TOP]: { name: "top_qr_karte", beschreibung: "Top QR codes by scans", html: seite("echomate · Top QR", ZEICHNE_TOP) },
389
+ [KARTE_AENDERUNG]: { name: "aenderung_karte", beschreibung: "Receipt for a changed QR code, or why it was refused", html: seite("echomate · Change", ZEICHNE_AENDERUNG) },
390
+ };
391
+ export function registriereKarten(server) {
392
+ for (const [uri, karte] of Object.entries(KARTEN)) {
393
+ server.registerResource(karte.name, uri, { mimeType: MIME_KARTE, description: karte.beschreibung }, async () => ({
394
+ contents: [
395
+ {
396
+ uri,
397
+ mimeType: MIME_KARTE,
398
+ text: karte.html,
399
+ _meta: { ui: { prefersBorder: false } },
400
+ },
401
+ ],
402
+ }));
403
+ }
404
+ }
405
+ export function karteMeta(uri) {
406
+ return { ui: { resourceUri: uri }, "openai/outputTemplate": uri };
407
+ }
408
+ export function adminAdresse(shopDomain, pfad) {
409
+ const handle = String(shopDomain || "").replace(/\.myshopify\.com$/i, "");
410
+ if (!/^[a-z0-9][a-z0-9-]*$/i.test(handle))
411
+ return null;
412
+ return `https://admin.shopify.com/store/${handle}/apps/echomate/${pfad.replace(/^\/+/, "")}`;
413
+ }
414
+ //# sourceMappingURL=karten.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"karten.js","sourceRoot":"","sources":["../src/karten.ts"],"names":[],"mappings":"AA4DA,MAAM,CAAC,MAAM,UAAU,GAAG,2BAA2B,CAAC;AAStD,MAAM,CAAC,MAAM,QAAQ,GAAG,gCAAgC,CAAC;AACzD,MAAM,CAAC,MAAM,SAAS,GAAG,oCAAoC,CAAC;AAC9D,MAAM,CAAC,MAAM,eAAe,GAAG,uCAAuC,CAAC;AAGvE,MAAM,CAAC,MAAM,eAAe,GAAG,eAAe,CAAC;AAE/C,MAAM,CAAC,MAAM,eAAe,GAAG,OAAO,CAAC;AA8CvC,MAAM,CAAC,MAAM,YAAY,GAA0B;IACjD,EAAE,EAAE;QACF,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,+BAA+B,EAAE,OAAO,EAAE,kBAAkB;QACxF,WAAW,EAAE,aAAa,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,SAAS;QAC5F,UAAU,EAAE,+HAA+H;QAC3I,QAAQ,EAAE,4BAA4B,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,8BAA8B;QAC/G,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,oDAAoD;QAC1H,YAAY,EAAE,iCAAiC,EAAE,gBAAgB,EAAE,uFAAuF;QAC1J,cAAc,EAAE,uEAAuE,EAAE,cAAc,EAAE,yCAAyC;QAClJ,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,iBAAiB;QAC3H,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU;QACtD,YAAY,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,WAAW;KAChE;IACD,EAAE,EAAE;QACF,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,4CAA4C,EAAE,OAAO,EAAE,oBAAoB;QACpG,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,UAAU;QACvF,UAAU,EAAE,2HAA2H;QACvI,QAAQ,EAAE,4BAA4B,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,sCAAsC;QACzH,SAAS,EAAE,kBAAkB,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,gDAAgD;QACzH,YAAY,EAAE,oCAAoC,EAAE,gBAAgB,EAAE,0GAA0G;QAChL,cAAc,EAAE,+EAA+E,EAAE,cAAc,EAAE,gDAAgD;QACjK,WAAW,EAAE,aAAa,EAAE,eAAe,EAAE,oBAAoB,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,oBAAoB;QAClI,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;QACpD,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa;KACtE;IACD,EAAE,EAAE;QACF,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,gBAAgB;QAClF,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,UAAU;QACjG,UAAU,EAAE,yIAAyI;QACrJ,QAAQ,EAAE,4BAA4B,EAAE,SAAS,EAAE,eAAe,EAAE,UAAU,EAAE,oCAAoC;QACpH,SAAS,EAAE,gBAAgB,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,uDAAuD;QACxH,YAAY,EAAE,oCAAoC,EAAE,gBAAgB,EAAE,2FAA2F;QACjK,cAAc,EAAE,iFAAiF,EAAE,cAAc,EAAE,uCAAuC;QAC1J,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,kBAAkB,EAAE,cAAc,EAAE,QAAQ,EAAE,cAAc,EAAE,uBAAuB;QAChI,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;QACpD,YAAY,EAAE,yBAAyB,EAAE,gBAAgB,EAAE,SAAS;KACrE;IACD,EAAE,EAAE;QACF,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,kCAAkC,EAAE,OAAO,EAAE,mBAAmB;QAC7F,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,QAAQ;QAC/F,UAAU,EAAE,iIAAiI;QAC7I,QAAQ,EAAE,kCAAkC,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,sCAAsC;QAC9H,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,iDAAiD;QAC7H,YAAY,EAAE,iCAAiC,EAAE,gBAAgB,EAAE,iGAAiG;QACpK,cAAc,EAAE,qFAAqF,EAAE,cAAc,EAAE,iCAAiC;QACxJ,WAAW,EAAE,YAAY,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,oBAAoB;QACjI,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU;QACtD,YAAY,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,aAAa;KAC7E;IACD,EAAE,EAAE;QACF,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,oCAAoC,EAAE,OAAO,EAAE,sBAAsB;QACpG,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM;QAC5F,UAAU,EAAE,uIAAuI;QACnJ,QAAQ,EAAE,mCAAmC,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,wCAAwC;QAClI,SAAS,EAAE,iBAAiB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,MAAM,EAAE,qDAAqD;QACjI,YAAY,EAAE,mCAAmC,EAAE,gBAAgB,EAAE,uGAAuG;QAC5K,cAAc,EAAE,mFAAmF,EAAE,cAAc,EAAE,gDAAgD;QACrK,WAAW,EAAE,kBAAkB,EAAE,eAAe,EAAE,mBAAmB,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,oBAAoB;QACxI,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;QACpD,YAAY,EAAE,gCAAgC,EAAE,gBAAgB,EAAE,UAAU;KAC7E;IACD,EAAE,EAAE;QACF,KAAK,EAAE,eAAe,EAAE,MAAM,EAAE,qCAAqC,EAAE,OAAO,EAAE,kBAAkB;QAClG,WAAW,EAAE,kBAAkB,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ;QACjG,UAAU,EAAE,sIAAsI;QAClJ,QAAQ,EAAE,oCAAoC,EAAE,SAAS,EAAE,gBAAgB,EAAE,UAAU,EAAE,6CAA6C;QACtI,SAAS,EAAE,sBAAsB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE,uDAAuD;QACjI,YAAY,EAAE,uCAAuC,EAAE,gBAAgB,EAAE,mHAAmH;QAC5L,cAAc,EAAE,gFAAgF,EAAE,cAAc,EAAE,kDAAkD;QACpK,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,qBAAqB,EAAE,cAAc,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB;QACvI,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU;QACrD,YAAY,EAAE,6BAA6B,EAAE,gBAAgB,EAAE,WAAW;KAC3E;IACD,EAAE,EAAE;QACF,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,qCAAqC,EAAE,OAAO,EAAE,oBAAoB;QAC9F,WAAW,EAAE,cAAc,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,YAAY;QAC/F,UAAU,EAAE,0HAA0H;QACtI,QAAQ,EAAE,6BAA6B,EAAE,SAAS,EAAE,kBAAkB,EAAE,UAAU,EAAE,iCAAiC;QACrH,SAAS,EAAE,mBAAmB,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,sDAAsD;QAC3H,YAAY,EAAE,qCAAqC,EAAE,gBAAgB,EAAE,mGAAmG;QAC1K,cAAc,EAAE,oFAAoF,EAAE,cAAc,EAAE,4CAA4C;QAClK,WAAW,EAAE,gBAAgB,EAAE,eAAe,EAAE,sBAAsB,EAAE,cAAc,EAAE,aAAa,EAAE,cAAc,EAAE,kBAAkB;QACzI,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU;QACtD,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,aAAa;KACtE;IACD,OAAO,EAAE;QACP,KAAK,EAAE,cAAc,EAAE,MAAM,EAAE,uCAAuC,EAAE,OAAO,EAAE,mBAAmB;QACpG,WAAW,EAAE,gBAAgB,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ;QAC1F,UAAU,EAAE,+HAA+H;QAC3I,QAAQ,EAAE,mCAAmC,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,gCAAgC;QACzH,SAAS,EAAE,oBAAoB,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,oDAAoD;QAC9H,YAAY,EAAE,iCAAiC,EAAE,gBAAgB,EAAE,6FAA6F;QAChK,cAAc,EAAE,iFAAiF,EAAE,cAAc,EAAE,mCAAmC;QACtJ,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,oBAAoB;QAC7H,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;QACpD,YAAY,EAAE,8BAA8B,EAAE,gBAAgB,EAAE,YAAY;KAC7E;IACD,EAAE,EAAE;QACF,KAAK,EAAE,UAAU,EAAE,MAAM,EAAE,0BAA0B,EAAE,OAAO,EAAE,kBAAkB;QAClF,WAAW,EAAE,mBAAmB,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ;QAChG,UAAU,EAAE,iJAAiJ;QAC7J,QAAQ,EAAE,8BAA8B,EAAE,SAAS,EAAE,iBAAiB,EAAE,UAAU,EAAE,sCAAsC;QAC1H,SAAS,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,yDAAyD;QAC1H,YAAY,EAAE,wCAAwC,EAAE,gBAAgB,EAAE,sFAAsF;QAChK,cAAc,EAAE,uFAAuF,EAAE,cAAc,EAAE,gCAAgC;QACzJ,WAAW,EAAE,WAAW,EAAE,eAAe,EAAE,iBAAiB,EAAE,cAAc,EAAE,SAAS,EAAE,cAAc,EAAE,kBAAkB;QAC3H,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS;QACpD,YAAY,EAAE,sBAAsB,EAAE,gBAAgB,EAAE,YAAY;KACrE;IACD,OAAO,EAAE;QACP,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,gBAAgB;QAC7D,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK;QACjE,UAAU,EAAE,oCAAoC;QAChD,QAAQ,EAAE,oBAAoB,EAAE,SAAS,EAAE,cAAc,EAAE,UAAU,EAAE,UAAU;QACjF,SAAS,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,MAAM,EAAE,gBAAgB;QACzE,YAAY,EAAE,WAAW,EAAE,gBAAgB,EAAE,+BAA+B;QAC5E,cAAc,EAAE,sCAAsC,EAAE,cAAc,EAAE,eAAe;QACvF,WAAW,EAAE,MAAM,EAAE,eAAe,EAAE,OAAO,EAAE,cAAc,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY;QACjG,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK;QACzC,YAAY,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK;KAC9C;CACF,CAAC;AAkBF,MAAM,OAAO,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuFf,CAAC;AAEF,MAAM,IAAI,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCZ,CAAC;AAEF,SAAS,KAAK,CAAC,KAAa,EAAE,OAAe;IAC3C,OAAO;qDAC4C,KAAK;;SAEjD,IAAI;kDACqC,KAAK;2BAC5B,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;UAC7C,OAAO;UACP,OAAO;eACF,CAAC;AAChB,CAAC;AAID,MAAM,UAAU,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiClB,CAAC;AAEF,MAAM,WAAW,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;CA2BnB,CAAC;AAEF,MAAM,iBAAiB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA0DzB,CAAC;AAEF,MAAM,CAAC,MAAM,MAAM,GAAyE;IAC1F,CAAC,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,YAAY,EAAE,qDAAqD,EAAE,IAAI,EAAE,KAAK,CAAC,eAAe,EAAE,UAAU,CAAC,EAAE;IAC/I,CAAC,SAAS,CAAC,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,YAAY,EAAE,uBAAuB,EAAE,IAAI,EAAE,KAAK,CAAC,mBAAmB,EAAE,WAAW,CAAC,EAAE;IAC3H,CAAC,eAAe,CAAC,EAAE,EAAE,IAAI,EAAE,iBAAiB,EAAE,YAAY,EAAE,sDAAsD,EAAE,IAAI,EAAE,KAAK,CAAC,mBAAmB,EAAE,iBAAiB,CAAC,EAAE;CAC1K,CAAC;AAGF,MAAM,UAAU,iBAAiB,CAAC,MAAoB;IACpD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,MAAM,CAAC,gBAAgB,CACrB,KAAK,CAAC,IAAI,EACV,GAAG,EACH,EAAE,QAAQ,EAAE,UAAU,EAAE,WAAW,EAAE,KAAK,CAAC,YAAY,EAAE,EACzD,KAAK,IAAI,EAAE,CAAC,CAAC;YACX,QAAQ,EAAE;gBACR;oBACE,GAAG;oBACH,QAAQ,EAAE,UAAU;oBACpB,IAAI,EAAE,KAAK,CAAC,IAAI;oBAEhB,KAAK,EAAE,EAAE,EAAE,EAAE,EAAE,aAAa,EAAE,KAAK,EAAE,EAAE;iBACxC;aACF;SACF,CAAC,CACH,CAAC;IACJ,CAAC;AACH,CAAC;AAGD,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,EAAE,EAAE,EAAE,EAAE,WAAW,EAAE,GAAG,EAAE,EAAE,uBAAuB,EAAE,GAAG,EAAE,CAAC;AACpE,CAAC;AAGD,MAAM,UAAU,YAAY,CAAC,UAAqC,EAAE,IAAY;IAC9E,MAAM,MAAM,GAAG,MAAM,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,OAAO,CAAC,oBAAoB,EAAE,EAAE,CAAC,CAAC;IAC1E,IAAI,CAAC,uBAAuB,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO,IAAI,CAAC;IACvD,OAAO,mCAAmC,MAAM,kBAAkB,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,EAAE,CAAC;AAC/F,CAAC"}
@@ -0,0 +1,12 @@
1
+ export declare const SERVER_INFO: {
2
+ name: string;
3
+ title: string;
4
+ version: string;
5
+ description: string;
6
+ websiteUrl: string;
7
+ icons: {
8
+ src: string;
9
+ mimeType: string;
10
+ sizes: string[];
11
+ }[];
12
+ };
@@ -0,0 +1,12 @@
1
+ export const SERVER_INFO = {
2
+ name: "echomate",
3
+ title: "echomate",
4
+ version: "1.0.1",
5
+ description: "QR codes, short links, stamp cards and analytics for your Shopify store",
6
+ websiteUrl: "https://echomate.shop",
7
+ icons: [
8
+ { src: "https://api.echomate.shop/echomate-mark.png", mimeType: "image/png", sizes: ["1200x1200"] },
9
+ { src: "https://api.echomate.shop/echomate-mark.svg", mimeType: "image/svg+xml", sizes: ["any"] },
10
+ ],
11
+ };
12
+ //# sourceMappingURL=server-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server-info.js","sourceRoot":"","sources":["../src/server-info.ts"],"names":[],"mappings":"AAkBA,MAAM,CAAC,MAAM,WAAW,GAAG;IACzB,IAAI,EAAE,UAAU;IAChB,KAAK,EAAE,UAAU;IACjB,OAAO,EAAE,OAAO;IAChB,WAAW,EAAE,yEAAyE;IACtF,UAAU,EAAE,uBAAuB;IACnC,KAAK,EAAE;QACL,EAAE,GAAG,EAAE,6CAA6C,EAAE,QAAQ,EAAE,WAAW,EAAE,KAAK,EAAE,CAAC,WAAW,CAAC,EAAE;QACnG,EAAE,GAAG,EAAE,6CAA6C,EAAE,QAAQ,EAAE,eAAe,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,EAAE;KAClG;CACF,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import type { EchomateClient } from "./client.js";
3
+ export declare function annotationenFuer(name: string): {
4
+ readOnlyHint: boolean;
5
+ destructiveHint: boolean;
6
+ idempotentHint: boolean;
7
+ openWorldHint: boolean;
8
+ };
9
+ export declare const KARTE_FUER_WERKZEUG: Record<string, string>;
10
+ export declare const ANNOTIERTE_WERKZEUGE: string[];
11
+ export declare function registerTools(server: McpServer, { client, readOnly, }: {
12
+ client: EchomateClient;
13
+ readOnly?: boolean;
14
+ }): void;