From 3a76e486f261b61b5a4670db2677cb5cf06b5563 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Tue, 31 Mar 2026 22:38:17 +0200 Subject: [PATCH 01/19] add joai settings warps --- warps/joai/setting-get.json | 35 +++++++++++++++++++++++++ warps/joai/setting-set.json | 52 +++++++++++++++++++++++++++++++++++++ 2 files changed, 87 insertions(+) create mode 100644 warps/joai/setting-get.json create mode 100644 warps/joai/setting-set.json diff --git a/warps/joai/setting-get.json b/warps/joai/setting-get.json new file mode 100644 index 0000000..bd1abc2 --- /dev/null +++ b/warps/joai/setting-get.json @@ -0,0 +1,35 @@ +{ + "protocol": "warp:3.0.0", + "name": "JoAi: Get Agent Setting", + "title": { + "en": "Load a setting", + "de": "Einstellung laden" + }, + "description": { + "en": "Retrieve a previously saved agent setting and pass it to the next warp.", + "de": "Rufe eine gespeicherte Agenteneinstellung ab und übergebe sie an den nächsten Warp." + }, + "bot": "Fetches an agent setting. If 404/VALUE null: tell user to run setup first.", + "vars": { + "AGENT_UUID": "query:agent", + "SETTING_KEY": "query:key" + }, + "actions": [ + { + "type": "collect", + "label": { + "en": "Loading setting...", + "de": "Einstellung wird geladen..." + }, + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{AGENT_UUID}}/settings/{{SETTING_KEY}}", + "method": "GET" + }, + "auto": true + } + ], + "output": { + "VALUE": "out.value" + }, + "messages": {} +} diff --git a/warps/joai/setting-set.json b/warps/joai/setting-set.json new file mode 100644 index 0000000..016aec9 --- /dev/null +++ b/warps/joai/setting-set.json @@ -0,0 +1,52 @@ +{ + "protocol": "warp:3.0.0", + "name": "JoAi: Set Agent Setting", + "title": { + "en": "Save a setting", + "de": "Einstellung speichern" + }, + "description": { + "en": "Save a key-value setting on this agent for use in other warps.", + "de": "Speichere eine Schlüssel-Wert-Einstellung auf diesem Agenten für andere Warps." + }, + "bot": "Saves an unencrypted agent config value.", + "vars": { + "AGENT_UUID": "query:agent" + }, + "actions": [ + { + "type": "collect", + "label": { + "en": "Save setting", + "de": "Einstellung speichern" + }, + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{AGENT_UUID}}/settings", + "method": "POST" + }, + "inputs": [ + { + "name": "key", + "as": "key", + "type": "string", + "source": "query", + "required": true + }, + { + "name": "value", + "as": "value", + "type": "string", + "source": "query", + "required": true + } + ], + "auto": true + } + ], + "messages": { + "success": { + "en": "Setting '{{key}}' saved.", + "de": "Einstellung '{{key}}' gespeichert." + } + } +} From d19597611054bf3c6ef777ee83139523d6e65f35 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Tue, 31 Mar 2026 22:47:27 +0200 Subject: [PATCH 02/19] =?UTF-8?q?feat:=20shop=20loyalty=20warps=20?= =?UTF-8?q?=E2=80=94=20create,=20configure,=20nfc=20setup,=20and=20bot=20t?= =?UTF-8?q?rim?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Add shop-create warp (on-chain shop registration, chains to configure) - Add shop-loyalty-configure warp (split from create to fix mid-warp SHOP_ID bug) - Fix SHOP_ID var source (query: instead of env:) across stamp, redeem, remind - Include SHOP_ID in NFC card URL so register warp can resolve it - Trim all bot messages to be short and token-efficient Co-Authored-By: Claude Sonnet 4.6 --- warps/shop/shop-create.json | 65 ++++++++++++++ warps/shop/shop-loyalty-configure.json | 115 +++++++++++++++++++++++++ warps/shop/shop-loyalty-redeem.json | 7 +- warps/shop/shop-loyalty-register.json | 9 +- warps/shop/shop-loyalty-remind.json | 33 +++++-- warps/shop/shop-loyalty-review.json | 2 +- warps/shop/shop-loyalty-setup.json | 7 +- warps/shop/shop-loyalty-stamp.json | 7 +- warps/shop/shop-loyalty-status.json | 2 +- 9 files changed, 223 insertions(+), 24 deletions(-) create mode 100644 warps/shop/shop-create.json create mode 100644 warps/shop/shop-loyalty-configure.json diff --git a/warps/shop/shop-create.json b/warps/shop/shop-create.json new file mode 100644 index 0000000..99ec44d --- /dev/null +++ b/warps/shop/shop-create.json @@ -0,0 +1,65 @@ +{ + "protocol": "warp:3.0.0", + "name": "Shop: Create", + "title": { + "en": "Create your shop", + "de": "Shop erstellen" + }, + "description": { + "en": "Register your shop on-chain to get a shop ID, then set up your loyalty program.", + "de": "Registriere deinen Shop on-chain, um eine Shop-ID zu erhalten, und richte dann dein Treueprogramm ein." + }, + "bot": "Creates shop on-chain. Chains to configure automatically.", + "chain": "multiversx", + "vars": { + "SC_ADDRESS": "env:SHOP_SC_ADDRESS" + }, + "actions": [ + { + "type": "collect", + "label": { + "en": "Shop name", + "de": "Shop-Name" + }, + "inputs": [ + { + "name": "Shop name", + "as": "shopName", + "description": { + "en": "Your business name (e.g. Joe's Barber)", + "de": "Dein Unternehmensname (z.B. Joes Friseur)" + }, + "bot": "Business name.", + "type": "string", + "source": "field", + "required": true, + "min": 1 + } + ] + }, + { + "type": "contract", + "label": { + "en": "Create shop", + "de": "Shop erstellen" + }, + "address": "{{SC_ADDRESS}}", + "func": "createShop", + "args": [ + "string:{{shopName}}" + ], + "gasLimit": 10000000, + "auto": true + } + ], + "output": { + "SHOP_ID": "out.2" + }, + "messages": { + "success": { + "en": "{{shopName}} created! Setting up loyalty program...", + "de": "{{shopName}} erstellt! Treueprogramm wird eingerichtet..." + } + }, + "next": "shop-loyalty-configure?SHOP_ID={{SHOP_ID}}" +} diff --git a/warps/shop/shop-loyalty-configure.json b/warps/shop/shop-loyalty-configure.json new file mode 100644 index 0000000..3748a6d --- /dev/null +++ b/warps/shop/shop-loyalty-configure.json @@ -0,0 +1,115 @@ +{ + "protocol": "warp:3.0.0", + "name": "Shop: Configure Loyalty", + "title": { + "en": "Configure loyalty program", + "de": "Treueprogramm konfigurieren" + }, + "description": { + "en": "Set up your stamp-based loyalty program — rewards, Google review incentive, and reminder frequency.", + "de": "Richte dein stempelbasiertes Treueprogramm ein — Belohnungen, Google-Bewertungsanreiz und Erinnerungsfrequenz." + }, + "bot": "Configures loyalty for shop at SHOP_ID.", + "chain": "multiversx", + "vars": { + "SHOP_ID": "query:SHOP_ID", + "SC_ADDRESS": "env:SHOP_SC_ADDRESS" + }, + "actions": [ + { + "type": "collect", + "label": { + "en": "Loyalty settings", + "de": "Treue-Einstellungen" + }, + "inputs": [ + { + "name": "Stamps for reward", + "as": "stampsForReward", + "description": { + "en": "How many stamps until a free reward? (e.g. 10)", + "de": "Wie viele Stempel bis zur Belohnung? (z.B. 10)" + }, + "bot": "Stamps needed for reward.", + "type": "uint32", + "source": "field", + "required": true + }, + { + "name": "Reward label", + "as": "rewardLabel", + "description": { + "en": "What is the reward? (e.g. Free Haircut)", + "de": "Was ist die Belohnung? (z.B. Kostenloser Haarschnitt)" + }, + "bot": "Short reward name.", + "type": "string", + "source": "field", + "required": true + }, + { + "name": "Google review URL", + "as": "reviewUrl", + "description": { + "en": "Your Google Maps review link", + "de": "Dein Google Maps-Bewertungslink" + }, + "bot": "Google Maps review URL.", + "type": "string", + "source": "field", + "required": true + }, + { + "name": "Review discount (%)", + "as": "reviewDiscount", + "description": { + "en": "Discount % for leaving a Google review (e.g. 10)", + "de": "Rabatt % für eine Google-Bewertung (z.B. 10)" + }, + "bot": "Discount % for reviewers.", + "type": "uint8", + "source": "field", + "required": true + }, + { + "name": "Reminder after days", + "as": "reminderDays", + "description": { + "en": "Send reminder if customer hasn't visited in X days (e.g. 21)", + "de": "Erinnerung senden, wenn Kunde X Tage nicht da war (z.B. 21)" + }, + "bot": "Inactivity days before reminder.", + "type": "uint32", + "source": "field", + "required": true + } + ] + }, + { + "type": "contract", + "label": { + "en": "Configure loyalty program", + "de": "Treueprogramm konfigurieren" + }, + "address": "{{SC_ADDRESS}}", + "func": "configureLoyalty", + "args": [ + "uint64:{{SHOP_ID}}", + "uint32:{{stampsForReward}}", + "string:{{rewardLabel}}", + "string:{{reviewUrl}}", + "uint8:{{reviewDiscount}}", + "uint32:{{reminderDays}}" + ], + "gasLimit": 10000000, + "auto": true + } + ], + "messages": { + "success": { + "en": "Loyalty program is live! Now program your NFC cards.", + "de": "Treueprogramm ist aktiv! Programmiere jetzt deine NFC-Karten." + } + }, + "next": "joai/setting-set?key=SHOP_ID&value={{SHOP_ID}}" +} diff --git a/warps/shop/shop-loyalty-redeem.json b/warps/shop/shop-loyalty-redeem.json index 9ff030e..8bc8f8a 100644 --- a/warps/shop/shop-loyalty-redeem.json +++ b/warps/shop/shop-loyalty-redeem.json @@ -9,10 +9,10 @@ "en": "Redeem a customer's loyalty reward and reset their stamps.", "de": "Löse die Treuebelohnung eines Kunden ein und setze die Stempel zurück." }, - "bot": "This warp redeems a customer's loyalty reward. After redeeming, the agent should log a redemption activity on the customer's JoAi contact.", + "bot": "Redeems reward via NFC. Log redemption activity on contact after success.", "chain": "multiversx", "vars": { - "SHOP_ID": "env:SHOP_ID", + "SHOP_ID": "query:SHOP_ID", "SC_ADDRESS": "env:SHOP_SC_ADDRESS" }, "actions": [ @@ -60,7 +60,6 @@ "success": { "en": "Reward redeemed for {{NAME}}! Stamps reset to 0.", "de": "Belohnung für {{NAME}} eingelöst! Stempel auf 0 zurückgesetzt." - }, - "bot": "After success, log a reward redemption activity on the customer's JoAi contact." + } } } diff --git a/warps/shop/shop-loyalty-register.json b/warps/shop/shop-loyalty-register.json index 78077cd..6142371 100644 --- a/warps/shop/shop-loyalty-register.json +++ b/warps/shop/shop-loyalty-register.json @@ -9,7 +9,7 @@ "en": "Register your loyalty card and start earning stamps towards free rewards.", "de": "Registriere deine Treuekarte und sammle Stempel für kostenlose Belohnungen." }, - "bot": "Loyalty card registration. The card ID comes from the NFC tag's hardware device ID. Collect the customer's name and email/phone, then register on-chain. If the card is already registered, redirect to status.", + "bot": "Registers NFC card on-chain. If already registered, redirects to status.", "chain": "multiversx", "vars": { "SHOP_ID": "query:shop", @@ -72,9 +72,8 @@ "en": "Your name", "de": "Dein Name" }, - "bot": "The customer's name.", + "bot": "Customer name.", "type": "string", - "position": "arg:1", "source": "field", "required": true, "min": 1 @@ -86,7 +85,7 @@ "en": "Your email address", "de": "Deine E-Mail-Adresse" }, - "bot": "The customer's email address.", + "bot": "Customer email.", "type": "string", "source": "field", "required": true @@ -98,7 +97,7 @@ "en": "Your phone number (optional)", "de": "Deine Telefonnummer (optional)" }, - "bot": "The customer's phone number, if provided.", + "bot": "Optional.", "type": "string", "source": "field", "required": false diff --git a/warps/shop/shop-loyalty-remind.json b/warps/shop/shop-loyalty-remind.json index bfcc1b6..b2dc551 100644 --- a/warps/shop/shop-loyalty-remind.json +++ b/warps/shop/shop-loyalty-remind.json @@ -9,14 +9,27 @@ "en": "Check for customers who haven't visited recently and send them a reminder.", "de": "Prüfe auf Kunden, die kürzlich nicht da waren, und sende eine Erinnerung." }, - "bot": "This is a scheduled warp that runs daily. Query the smart contract for stale customers using getStaleCustomers with a timestamp threshold (current time minus the shop's configured reminder_days). For each stale customer, look up their JoAi contact by name or card ID tag, then send a WhatsApp/SMS reminder via Twilio. Log each reminder as a contact activity.", + "bot": "Daily scheduled. SHOP_ID in query (get from setting-get when scheduling). STALE_SINCE = now - (reminder_days * 86400). For each stale customer: find contact by card_uuid, send WhatsApp/SMS, log activity.", "chain": "multiversx", "schedule": "daily", "vars": { - "SHOP_ID": "env:SHOP_ID", + "SHOP_ID": "query:SHOP_ID", "SC_ADDRESS": "env:SHOP_SC_ADDRESS" }, "actions": [ + { + "type": "query", + "label": { + "en": "Loading loyalty config...", + "de": "Treue-Konfiguration wird geladen..." + }, + "address": "{{SC_ADDRESS}}", + "func": "getLoyaltyConfig", + "args": [ + "uint64:{{SHOP_ID}}" + ], + "auto": true + }, { "type": "query", "label": { @@ -30,13 +43,21 @@ "uint64:{{STALE_SINCE}}", "uint32:50" ], + "inputs": [ + { + "name": "STALE_SINCE", + "type": "uint64", + "position": "arg:2", + "source": "field", + "bot": "Calculate as: current unix timestamp minus (REMINDER_DAYS * 86400)" + } + ], "auto": true } ], "output": { - "STALE_CUSTOMERS": "out" + "REMINDER_DAYS": "out.1.reminder_days", + "STALE_CUSTOMERS": "out.2" }, - "messages": { - "bot": "Calculate STALE_SINCE as: current unix timestamp minus (reminder_days * 86400). The reminder_days value should come from the shop's loyalty config (getLoyaltyConfig). For each stale customer in the result, resolve their contact and send a reminder message." - } + "messages": {} } diff --git a/warps/shop/shop-loyalty-review.json b/warps/shop/shop-loyalty-review.json index 5b36d60..30e90e3 100644 --- a/warps/shop/shop-loyalty-review.json +++ b/warps/shop/shop-loyalty-review.json @@ -9,7 +9,7 @@ "en": "Rate us on Google and get a discount on your next visit.", "de": "Bewerte uns auf Google und erhalte einen Rabatt auf deinen nächsten Besuch." }, - "bot": "This warp prompts the customer to leave a Google review after their first visit. The review URL and discount percentage come from the shop's loyalty config on-chain.", + "bot": "Prompts Google review after first visit. URL and discount from on-chain config.", "chain": "multiversx", "vars": { "SHOP_ID": "query:shop", diff --git a/warps/shop/shop-loyalty-setup.json b/warps/shop/shop-loyalty-setup.json index b6c5878..b183abc 100644 --- a/warps/shop/shop-loyalty-setup.json +++ b/warps/shop/shop-loyalty-setup.json @@ -9,9 +9,10 @@ "en": "Program NFC cards for a shop's loyalty program. All cards get the same agent URL — the NFC chip's hardware ID is the unique card identity.", "de": "Programmiere NFC-Karten für das Treueprogramm eines Shops. Alle Karten bekommen dieselbe Agent-URL — die Hardware-ID des NFC-Chips ist die eindeutige Kartenidentität." }, - "bot": "This warp programs NFC cards for a merchant. All cards get the same URL. The NFC chip's built-in hardware ID serves as the unique card identifier.", + "bot": "Programs NFC cards for merchant. Same URL per card; hardware ID is the unique identity.", "vars": { - "AGENT_UUID": "query:agent" + "AGENT_UUID": "query:agent", + "SHOP_ID": "query:SHOP_ID" }, "actions": [ { @@ -24,7 +25,7 @@ } ], "output": { - "nfc": "INJECT:APP_BASE/a?agent={{AGENT_UUID}}&warp=shop-loyalty-register" + "nfc": "INJECT:APP_BASE/a?agent={{AGENT_UUID}}&warp=shop-loyalty-register&shop={{SHOP_ID}}" }, "messages": { "success": { diff --git a/warps/shop/shop-loyalty-stamp.json b/warps/shop/shop-loyalty-stamp.json index a458691..82c885b 100644 --- a/warps/shop/shop-loyalty-stamp.json +++ b/warps/shop/shop-loyalty-stamp.json @@ -9,10 +9,10 @@ "en": "Scan a customer's loyalty card to add a stamp.", "de": "Scanne die Treuekarte eines Kunden, um einen Stempel hinzuzufügen." }, - "bot": "This warp is used by the merchant to add a loyalty stamp. The card ID comes from NFC scan injection. After stamping, the agent should log a contact activity on the customer's JoAi contact.", + "bot": "Adds stamp via NFC. Log visit activity on contact after success.", "chain": "multiversx", "vars": { - "SHOP_ID": "env:SHOP_ID", + "SHOP_ID": "query:SHOP_ID", "SC_ADDRESS": "env:SHOP_SC_ADDRESS" }, "actions": [ @@ -66,7 +66,6 @@ "success": { "en": "{{NAME}} — {{STAMPS}}/{{NEEDED}} stamps", "de": "{{NAME}} — {{STAMPS}}/{{NEEDED}} Stempel" - }, - "bot": "After success, log a visit activity on the customer's JoAi contact." + } } } diff --git a/warps/shop/shop-loyalty-status.json b/warps/shop/shop-loyalty-status.json index 00c7832..36e48c4 100644 --- a/warps/shop/shop-loyalty-status.json +++ b/warps/shop/shop-loyalty-status.json @@ -9,7 +9,7 @@ "en": "Check your stamp progress and available rewards.", "de": "Überprüfe deinen Stempelfortschritt und verfügbare Belohnungen." }, - "bot": "Show the customer their loyalty stamp progress. Query the smart contract for their current status.", + "bot": "Shows stamp progress.", "chain": "multiversx", "vars": { "SHOP_ID": "query:shop", From 59995c34dfdfd982e12790016570f0739fb0fd70 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Wed, 1 Apr 2026 13:54:32 +0200 Subject: [PATCH 03/19] feat: add agent-publish warp Co-Authored-By: Claude Sonnet 4.6 --- warps/joai/agent-publish.json | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 warps/joai/agent-publish.json diff --git a/warps/joai/agent-publish.json b/warps/joai/agent-publish.json new file mode 100644 index 0000000..511833e --- /dev/null +++ b/warps/joai/agent-publish.json @@ -0,0 +1,32 @@ +{ + "protocol": "warp:3.0.0", + "name": "JoAi: Publish Agent", + "title": { + "en": "Publish agent", + "de": "Agenten veröffentlichen" + }, + "description": { + "en": "Make your agent publicly accessible so anyone can chat with it.", + "de": "Mache deinen Agenten öffentlich zugänglich, damit jeder damit chatten kann." + }, + "actions": [ + { + "type": "collect", + "label": { + "en": "Publish now", + "de": "Jetzt veröffentlichen" + }, + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{JOAI_AGENT_UUID}}/publish", + "method": "POST" + }, + "inputs": [] + } + ], + "messages": { + "success": { + "en": "Your agent is now publicly accessible. Anyone can chat with it.", + "de": "Dein Agent ist jetzt öffentlich zugänglich. Jeder kann damit chatten." + } + } +} From b3cc8847901ab9905ed512f863ac066d00a4e81e Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 00:27:41 +0200 Subject: [PATCH 04/19] feat: appointment configure MCP app Co-Authored-By: Claude Sonnet 4.6 --- .../appointment-configure/BookingRules.tsx | 54 ++++++ .../appointment-configure/OfficeHours.tsx | 79 +++++++++ .../appointment-configure/ServicesList.tsx | 92 +++++++++++ .../appointment-configure/chatapp.dist.html | 113 +++++++++++++ .../appointment-configure/index.tsx | 154 ++++++++++++++++++ .../appointment-configure/warp.json | 32 ++++ .../appointment-configure/warp.types.ts | 29 ++++ .../appointment-upsert-policy.json | 46 ++++++ 8 files changed, 599 insertions(+) create mode 100644 warps/appointments/appointment-configure/BookingRules.tsx create mode 100644 warps/appointments/appointment-configure/OfficeHours.tsx create mode 100644 warps/appointments/appointment-configure/ServicesList.tsx create mode 100644 warps/appointments/appointment-configure/chatapp.dist.html create mode 100644 warps/appointments/appointment-configure/index.tsx create mode 100644 warps/appointments/appointment-configure/warp.json create mode 100644 warps/appointments/appointment-configure/warp.types.ts create mode 100644 warps/appointments/appointment-upsert-policy.json diff --git a/warps/appointments/appointment-configure/BookingRules.tsx b/warps/appointments/appointment-configure/BookingRules.tsx new file mode 100644 index 0000000..7c1ad37 --- /dev/null +++ b/warps/appointments/appointment-configure/BookingRules.tsx @@ -0,0 +1,54 @@ +import { Input } from '@openai/apps-sdk-ui/components/Input' +import React from 'react' +import { AppointmentPolicy } from './warp.types' + +type Props = { + policy: AppointmentPolicy + onChange: (patch: Partial) => void +} + +export function BookingRules({ policy, onChange }: Props) { + return ( +
+

Booking Rules

+
+
+ + onChange({ slotIntervalMinutes: e.target.value ? Number(e.target.value) : null })} + /> +
+
+ + onChange({ bufferMinutes: e.target.value ? Number(e.target.value) : null })} + /> +
+
+ + onChange({ minNoticeMinutes: e.target.value ? Number(e.target.value) : null })} + /> +
+
+ + onChange({ maxDaysAhead: e.target.value ? Number(e.target.value) : null })} + /> +
+
+
+ ) +} diff --git a/warps/appointments/appointment-configure/OfficeHours.tsx b/warps/appointments/appointment-configure/OfficeHours.tsx new file mode 100644 index 0000000..3a3a4c8 --- /dev/null +++ b/warps/appointments/appointment-configure/OfficeHours.tsx @@ -0,0 +1,79 @@ +import { Input } from '@openai/apps-sdk-ui/components/Input' +import { Switch } from '@openai/apps-sdk-ui/components/Switch' +import React from 'react' + +const DAYS = ['monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday', 'sunday'] as const +const DAY_LABELS: Record = { + monday: 'Mon', + tuesday: 'Tue', + wednesday: 'Wed', + thursday: 'Thu', + friday: 'Fri', + saturday: 'Sat', + sunday: 'Sun', +} +const DEFAULT_HOURS = '09:00-17:00' + +function parseTimeRange(range: string): [string, string] { + const parts = range.split('-') + const start = parts[0]?.match(/^\d{2}:\d{2}$/) ? parts[0] : '09:00' + const end = parts[1]?.match(/^\d{2}:\d{2}$/) ? parts[1] : '17:00' + return [start, end] +} + +type Props = { + availability: Record + onChange: (day: string, ranges: string[]) => void +} + +export function OfficeHours({ availability, onChange }: Props) { + const toggleDay = (day: string) => { + const ranges = availability[day] ?? [] + onChange(day, ranges.length > 0 ? [] : [DEFAULT_HOURS]) + } + + const updateDayHours = (day: string, part: 'start' | 'end', value: string) => { + const [start, end] = parseTimeRange(availability[day]?.[0] ?? DEFAULT_HOURS) + const newRange = part === 'start' ? `${value}-${end}` : `${start}-${value}` + onChange(day, [newRange]) + } + + return ( +
+

Office Hours

+
+ {DAYS.map((day) => { + const ranges = availability[day] ?? [] + const enabled = ranges.length > 0 + const [start, end] = parseTimeRange(ranges[0] ?? DEFAULT_HOURS) + + return ( +
+ toggleDay(day)} /> + {DAY_LABELS[day]} + {enabled ? ( +
+ updateDayHours(day, 'start', e.target.value)} + size="sm" + /> + + updateDayHours(day, 'end', e.target.value)} + size="sm" + /> +
+ ) : ( + Closed + )} +
+ ) + })} +
+
+ ) +} diff --git a/warps/appointments/appointment-configure/ServicesList.tsx b/warps/appointments/appointment-configure/ServicesList.tsx new file mode 100644 index 0000000..cd4555d --- /dev/null +++ b/warps/appointments/appointment-configure/ServicesList.tsx @@ -0,0 +1,92 @@ +import { Plus, Trash } from '@openai/apps-sdk-ui/components/Icon' +import { Input } from '@openai/apps-sdk-ui/components/Input' +import React from 'react' +import { AppointmentService } from './warp.types' + +type ServiceEntry = AppointmentService & { _id: string } + +type Props = { + services: ServiceEntry[] + onAdd: () => void + onUpdate: (id: string, updated: AppointmentService) => void + onRemove: (id: string) => void +} + +function ServiceRow({ + service, + onUpdate, + onRemove, +}: { + service: ServiceEntry + onUpdate: (updated: AppointmentService) => void + onRemove: () => void +}) { + return ( +
+
+ onUpdate({ ...service, slug: e.target.value })} + size="sm" + /> + onUpdate({ ...service, name: e.target.value || undefined })} + size="sm" + /> + +
+
+ Duration (min) + onUpdate({ ...service, durationMinutes: e.target.value ? Number(e.target.value) : undefined })} + size="sm" + className="w-24" + /> +
+
+ ) +} + +export function ServicesList({ services, onAdd, onUpdate, onRemove }: Props) { + return ( +
+
+

Services

+ +
+ {services.length > 0 ? ( +
+ {services.map((service) => ( + onUpdate(service._id, updated)} + onRemove={() => onRemove(service._id)} + /> + ))} +
+ ) : ( +

No services configured. Add one to enable service-based booking.

+ )} +
+ ) +} diff --git a/warps/appointments/appointment-configure/chatapp.dist.html b/warps/appointments/appointment-configure/chatapp.dist.html new file mode 100644 index 0000000..69bd437 --- /dev/null +++ b/warps/appointments/appointment-configure/chatapp.dist.html @@ -0,0 +1,113 @@ + + + + + + + + + +
+ + + \ No newline at end of file diff --git a/warps/appointments/appointment-configure/index.tsx b/warps/appointments/appointment-configure/index.tsx new file mode 100644 index 0000000..2e19514 --- /dev/null +++ b/warps/appointments/appointment-configure/index.tsx @@ -0,0 +1,154 @@ +import { Button } from '@openai/apps-sdk-ui/components/Button' +import { CheckCircle } from '@openai/apps-sdk-ui/components/Icon' +import { Input } from '@openai/apps-sdk-ui/components/Input' +import React, { useEffect, useRef, useState } from 'react' +import ReactDOM from 'react-dom/client' +import { App, useAppContext } from '../../../ui/lib/components' +import { EmptyMessageSkeleton } from '../../../ui/lib/skeletons' +import { BookingRules } from './BookingRules' +import { OfficeHours } from './OfficeHours' +import { ServicesList } from './ServicesList' +import { AppointmentConfigureData, AppointmentPolicy, AppointmentService } from './warp.types' + +type ServiceEntry = AppointmentService & { _id: string } + +function withId(service: AppointmentService): ServiceEntry { + return { ...service, _id: crypto.randomUUID() } +} + +function stripId({ _id: _, ...service }: ServiceEntry): AppointmentService { + return service +} + +function emptyPolicy(): AppointmentPolicy { + return { + timezone: null, + availability: {}, + minNoticeMinutes: null, + bufferMinutes: null, + maxDaysAhead: null, + slotIntervalMinutes: null, + blockedDates: [], + holidays: [], + services: [], + } +} + +function Main() { + const { data, executeTool } = useAppContext() + const [policy, setPolicy] = useState(emptyPolicy()) + const [services, setServices] = useState([]) + const [saving, setSaving] = useState(false) + const [saved, setSaved] = useState(false) + const initializedRef = useRef(false) + + useEffect(() => { + if (data?.policy && !initializedRef.current) { + initializedRef.current = true + setPolicy(data.policy) + setServices((data.policy.services ?? []).map(withId)) + } + }, [data]) + + if (!data) { + return + } + + const markDirty = () => setSaved(false) + + const updatePolicy = (patch: Partial) => { + markDirty() + setPolicy((prev) => ({ ...prev, ...patch })) + } + + const handleSave = async () => { + setSaving(true) + setSaved(false) + try { + await executeTool('appointment-upsert-policy', { + policy: JSON.stringify({ + timezone: policy.timezone || null, + availability: policy.availability ?? {}, + minNoticeMinutes: policy.minNoticeMinutes ?? null, + bufferMinutes: policy.bufferMinutes ?? null, + maxDaysAhead: policy.maxDaysAhead ?? null, + slotIntervalMinutes: policy.slotIntervalMinutes ?? null, + blockedDates: policy.blockedDates ?? [], + holidays: policy.holidays ?? [], + services: services.filter((s) => s.slug.trim() !== '').map(stripId), + }), + }) + setSaved(true) + } finally { + setSaving(false) + } + } + + return ( +
+

Appointment Settings

+ +
+

Timezone

+ updatePolicy({ timezone: e.target.value || null })} + /> +
+ + { + markDirty() + setPolicy((prev) => ({ + ...prev, + availability: { ...prev.availability, [day]: ranges }, + })) + }} + /> + + + + { + markDirty() + setServices((prev) => [...prev, withId({ slug: '', name: '' })]) + }} + onUpdate={(id, updated) => { + markDirty() + setServices((prev) => prev.map((s) => (s._id === id ? { ...updated, _id: id } : s))) + }} + onRemove={(id) => { + markDirty() + setServices((prev) => prev.filter((s) => s._id !== id)) + }} + /> + + +
+ ) +} + +const rootElement = document.getElementById('root') +if (rootElement) { + ReactDOM.createRoot(rootElement).render( + + +
+ + + ) +} diff --git a/warps/appointments/appointment-configure/warp.json b/warps/appointments/appointment-configure/warp.json new file mode 100644 index 0000000..bfd662e --- /dev/null +++ b/warps/appointments/appointment-configure/warp.json @@ -0,0 +1,32 @@ +{ + "protocol": "warp:3.0.0", + "name": "Appointments: Configure", + "title": { + "en": "Configure Appointments", + "de": "Termine konfigurieren" + }, + "description": { + "en": "Open and update the appointment configuration for this agent.", + "de": "Termineinstellungen dieses Agenten anzeigen und bearbeiten." + }, + "bot": "Use this when the user wants to configure appointment settings, set office hours, change the timezone, manage services, or update booking rules.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Configure", + "de": "Konfigurieren" + }, + "inputs": [], + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{JOAI_AGENT_UUID}}/appointments/policy", + "method": "GET" + }, + "output": { + "policy": "out.data.policy", + "availableStaff": "out.data.availableStaff" + } + } + ], + "ui": "https://raw.githubusercontent.com/JoAiHQ/warps/main/warps/appointments/appointment-configure/chatapp.dist.html" +} \ No newline at end of file diff --git a/warps/appointments/appointment-configure/warp.types.ts b/warps/appointments/appointment-configure/warp.types.ts new file mode 100644 index 0000000..884edc6 --- /dev/null +++ b/warps/appointments/appointment-configure/warp.types.ts @@ -0,0 +1,29 @@ +export type AppointmentService = { + slug: string + name?: string + durationMinutes?: number + routingMode?: 'direct' | 'round_robin' + staffAgentUuids?: string[] +} + +export type AppointmentPolicy = { + timezone?: string | null + availability?: Record + minNoticeMinutes?: number | null + bufferMinutes?: number | null + maxDaysAhead?: number | null + slotIntervalMinutes?: number | null + blockedDates?: string[] + holidays?: string[] + services?: AppointmentService[] +} + +export type AvailableStaffMember = { + uuid: string + name: string +} + +export type AppointmentConfigureData = { + policy: AppointmentPolicy | null + availableStaff: AvailableStaffMember[] +} diff --git a/warps/appointments/appointment-upsert-policy.json b/warps/appointments/appointment-upsert-policy.json new file mode 100644 index 0000000..429a27e --- /dev/null +++ b/warps/appointments/appointment-upsert-policy.json @@ -0,0 +1,46 @@ +{ + "protocol": "warp:3.0.0", + "name": "Appointments: Upsert Policy", + "title": { + "en": "Update policy", + "de": "Einstellungen speichern" + }, + "description": { + "en": "Save the appointment policy for this agent.", + "de": "Termineinstellungen dieses Agenten speichern." + }, + "bot": "Use this when the user wants to save appointment configuration changes such as timezone, office hours, slot interval, buffer, notice period, or service settings.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Save", + "de": "Speichern" + }, + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{JOAI_AGENT_UUID}}/appointments/policy", + "method": "PUT" + }, + "inputs": [ + { + "name": "Policy", + "as": "policy", + "description": { + "en": "JSON-encoded appointment policy object", + "de": "JSON-kodiertes Terminrichtlinien-Objekt" + }, + "bot": "A JSON string containing the full appointment policy. Include all fields: timezone, availability, minNoticeMinutes, bufferMinutes, maxDaysAhead, slotIntervalMinutes, and services.", + "type": "string", + "source": "field", + "required": true + } + ] + } + ], + "messages": { + "success": { + "en": "Appointment settings saved.", + "de": "Termineinstellungen gespeichert." + } + } +} From 1e3b07f86fc86a60e6d5f564459b8fd1301e7d17 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 12:13:39 +0200 Subject: [PATCH 05/19] add distribution --- scripts/catalog/distribution.ts | 404 +++++++++++++++++++++++++++++++ tsconfig.json | 4 +- warps/distribution.ts | 117 +++++++++ warps/mcp.ts | 17 ++ warps/multiversx/distribution.ts | 19 ++ warps/multiversx/mcp.ts | 7 + warps/types.ts | 95 ++++++++ 7 files changed, 661 insertions(+), 2 deletions(-) create mode 100644 scripts/catalog/distribution.ts create mode 100644 warps/distribution.ts create mode 100644 warps/mcp.ts create mode 100644 warps/multiversx/distribution.ts create mode 100644 warps/multiversx/mcp.ts diff --git a/scripts/catalog/distribution.ts b/scripts/catalog/distribution.ts new file mode 100644 index 0000000..3d26216 --- /dev/null +++ b/scripts/catalog/distribution.ts @@ -0,0 +1,404 @@ +import fs from 'fs' +import path from 'path' +import { pathToFileURL } from 'url' + +import type { SyncNetwork } from './sync-policy.js' +import type { + AppDistributionFactory, + AppDistributionFactoryContext, + AppDistributionManifest, + AppDistributionProvider, + AppDistributionProviderConfig, + AppDistributionProviderStatus, + AppMcpFactory, + AppMcpFactoryContext, + AppMcpManifest, + WarpbaseBrand, + WarpExtras, +} from '../../warps/types.js' +import { createDefaultAppDistribution } from '../../warps/distribution.js' +import { createDefaultAppMcp } from '../../warps/mcp.js' + +type Dict = Record + +type BrandPayload = { + hash: string + slug: string + active: boolean + protocol: string + name: string + description: Dict + logo: string | Dict + urls?: Dict + colors?: Dict +} + +type WarpUpsert = { + key: string + identifier: string + alias: string + chain: string + hash: string + checksum: string + name: string + title: Dict + description: Dict + preview: string | null + creator: string + privileges: string[] + listed: boolean + primaryAddress: string | null + primaryFunc: string | null + brand: BrandPayload | null + warp: Dict + extras: WarpExtras | null +} + +type CatalogManifest = { + schemaVersion: number + source: 'github' + repo: string + branch: string + network: SyncNetwork + commitSha: string + generatedAt: string + warps: WarpUpsert[] +} + +export type DistributionCatalogAction = { + alias: string + identifier: string + chain: string | null + name: string + title: Dict + description: Dict + actionTypes: string[] +} + +export type ResolvedProviderDistribution = { + provider: AppDistributionProvider + enabled: boolean + status: AppDistributionProviderStatus + notes: string[] +} + +export type ResolvedAppDistribution = { + slug: string + name: string + description: Dict + logo: string | Dict + urls: Dict + hash: string + mcpUrl: string + install: AppDistributionManifest['install'] + legal: AppDistributionManifest['legal'] + review: AppDistributionManifest['review'] + mcp: NormalizedMcpConfig + providers: Record + actions: DistributionCatalogAction[] +} + +export type DistributionCatalogManifest = { + schemaVersion: number + source: 'github' + repo: string + branch: string + network: SyncNetwork + commitSha: string + generatedAt: string + apps: ResolvedAppDistribution[] +} + +const PROVIDERS: AppDistributionProvider[] = ['claude', 'codex', 'openai'] + +function toMcpUrl(network: SyncNetwork, slug: string): string { + if (network === 'devnet') return `https://devnet-cortex.joai.ai/mcp/apps/${slug}` + return `https://cortex.joai.ai/mcp/apps/${slug}` +} + +function getBrandDirectory(repoRoot: string, brandName: string): string { + const noAtPath = path.join(repoRoot, 'warps', brandName) + const withAtPath = path.join(repoRoot, 'warps', `@${brandName}`) + return fs.existsSync(noAtPath) ? noAtPath : withAtPath +} + +function normalizeStringList(values: unknown, fallback: string[] = []): string[] { + if (!Array.isArray(values)) return [...fallback] + return [ + ...new Set( + values + .filter((value): value is string => typeof value === 'string' && value.trim().length > 0) + .map((value) => value.trim()), + ), + ] +} + +function normalizeProviderConfig( + provider: AppDistributionProvider, + config: AppDistributionProviderConfig | undefined, + review: AppDistributionManifest['review'], +): ResolvedProviderDistribution { + const enabled = config?.enabled !== false + let status = config?.status + + if (!enabled) { + status = 'disabled' + } else if (!status) { + status = provider === 'openai' + ? (review.screenshots.length > 0 ? 'submission_ready' : 'runtime_ready') + : 'ready' + } + + return { + provider, + enabled, + status, + notes: normalizeStringList(config?.notes), + } +} + +type NormalizedMcpConfig = { + prefersBorder: boolean + csp: { + connectDomains: string[] + resourceDomains: string[] + frameDomains: string[] + baseUriDomains: string[] + } + permissions: NonNullable + domain: string | undefined +} + +function normalizeMcpConfig(manifest: AppMcpManifest): NormalizedMcpConfig { + const csp = manifest.csp ?? {} + + return { + prefersBorder: manifest.prefersBorder !== false, + csp: { + connectDomains: normalizeStringList(csp.connectDomains), + resourceDomains: normalizeStringList(csp.resourceDomains), + frameDomains: normalizeStringList(csp.frameDomains), + baseUriDomains: normalizeStringList(csp.baseUriDomains), + }, + permissions: manifest.permissions ?? {}, + domain: manifest.domain, + } +} + +function normalizeManifest(manifest: AppDistributionManifest): AppDistributionManifest { + return { + install: { + summary: manifest.install.summary.trim(), + examplePrompts: normalizeStringList(manifest.install.examplePrompts), + usageNotes: normalizeStringList(manifest.install.usageNotes), + authPrerequisites: normalizeStringList(manifest.install.authPrerequisites), + }, + legal: { + privacyUrl: manifest.legal.privacyUrl.trim(), + supportUrl: manifest.legal.supportUrl?.trim(), + supportEmail: manifest.legal.supportEmail?.trim(), + termsUrl: manifest.legal.termsUrl?.trim(), + }, + review: { + screenshots: normalizeStringList(manifest.review.screenshots), + reviewerNotes: normalizeStringList(manifest.review.reviewerNotes), + testPrompts: normalizeStringList(manifest.review.testPrompts), + demoFlow: manifest.review.demoFlow?.trim(), + credentialsReference: manifest.review.credentialsReference?.trim(), + }, + providers: manifest.providers ?? {}, + } +} + +async function loadDistributionFactory( + repoRoot: string, + brandName: string, +): Promise { + const brandDir = getBrandDirectory(repoRoot, brandName) + const distributionPath = path.join(brandDir, 'distribution.ts') + + if (!fs.existsSync(distributionPath)) return createDefaultAppDistribution() + + const module = await import(pathToFileURL(distributionPath).href) + const candidate = (module.distribution ?? module.default) as + | AppDistributionFactory + | AppDistributionManifest + | undefined + + if (typeof candidate === 'function') return candidate + if (candidate && typeof candidate === 'object') return () => candidate + + throw new Error(`Distribution manifest not found in ${distributionPath}`) +} + +async function loadMcpFactory( + repoRoot: string, + brandName: string, +): Promise { + const brandDir = getBrandDirectory(repoRoot, brandName) + const mcpPath = path.join(brandDir, 'mcp.ts') + + if (!fs.existsSync(mcpPath)) return createDefaultAppMcp() + + const module = await import(pathToFileURL(mcpPath).href) + const candidate = (module.mcp ?? module.default) as + | AppMcpFactory + | AppMcpManifest + | undefined + + if (typeof candidate === 'function') return candidate + if (candidate && typeof candidate === 'object') return () => candidate + + throw new Error(`MCP manifest not found in ${mcpPath}`) +} + +type ResolvedBrandManifests = { + distribution: AppDistributionManifest + mcp: NormalizedMcpConfig +} + +async function resolveBrandManifests( + repoRoot: string, + brandName: string, + displayName: string, + network: SyncNetwork, + brand: WarpbaseBrand | null, +): Promise { + const context = { env: network, brand, brandName: displayName } + + const [distributionFactory, mcpFactory] = await Promise.all([ + loadDistributionFactory(repoRoot, brandName), + loadMcpFactory(repoRoot, brandName), + ]) + + const [distribution, mcpManifest] = await Promise.all([ + distributionFactory(context as AppDistributionFactoryContext), + mcpFactory(context as AppMcpFactoryContext), + ]) + + return { + distribution: normalizeManifest(distribution), + mcp: normalizeMcpConfig(mcpManifest), + } +} + +function toActionSummary(entry: WarpUpsert): DistributionCatalogAction { + const actionTypes = Array.isArray(entry.warp.actions) + ? entry.warp.actions + .map((action) => (action && typeof action === 'object' && typeof (action as Dict).type === 'string' ? (action as Dict).type as string : null)) + .filter((value): value is string => Boolean(value)) + : [] + + return { + alias: entry.alias, + identifier: entry.identifier, + chain: entry.chain === 'none' ? null : entry.chain, + name: entry.name, + title: entry.title, + description: entry.description, + actionTypes, + } +} + +function getBrandNameFromWarp(entry: WarpUpsert): string | null { + const [head] = entry.alias.split('-') + return head || null +} + +export async function buildDistributionCatalog( + repoRoot: string, + manifest: CatalogManifest, + brandFactoryCache: Map, +): Promise { + const appEntries = new Map() + + for (const entry of manifest.warps) { + if (!entry.listed || !entry.brand || entry.brand.active === false) continue + + const current = appEntries.get(entry.brand.slug) + if (current) { + current.warps.push(entry) + continue + } + + const brandName = getBrandNameFromWarp(entry) + if (!brandName) continue + + appEntries.set(entry.brand.slug, { + brand: entry.brand, + brandName, + warps: [entry], + }) + } + + const apps = await Promise.all( + [...appEntries.values()].map(async ({ brand, brandName, warps }) => { + const { distribution, mcp } = await resolveBrandManifests( + repoRoot, + brandName, + brand.name, + manifest.network, + brandFactoryCache.get(brandName) ?? null, + ) + + const providers = Object.fromEntries( + PROVIDERS.map((provider) => [ + provider, + normalizeProviderConfig(provider, distribution.providers?.[provider], distribution.review), + ]), + ) as Record + + return { + slug: brand.slug, + name: brand.name, + description: brand.description, + logo: brand.logo, + urls: brand.urls ?? {}, + hash: brand.hash, + mcpUrl: toMcpUrl(manifest.network, brand.slug), + install: distribution.install, + legal: distribution.legal, + review: distribution.review, + mcp, + providers, + actions: warps + .slice() + .sort((a, b) => a.alias.localeCompare(b.alias)) + .map((entry) => toActionSummary(entry)), + } satisfies ResolvedAppDistribution + }), + ) + + apps.sort((a, b) => a.slug.localeCompare(b.slug)) + + return { + schemaVersion: 1, + source: manifest.source, + repo: manifest.repo, + branch: manifest.branch, + network: manifest.network, + commitSha: manifest.commitSha, + generatedAt: manifest.generatedAt, + apps, + } +} + +export function validateDistributionCatalog(catalog: DistributionCatalogManifest): string[] { + const errors: string[] = [] + + for (const app of catalog.apps) { + if (!app.install.summary) errors.push(`${app.slug}: missing install.summary`) + if (app.install.examplePrompts.length === 0) errors.push(`${app.slug}: missing install.examplePrompts`) + if (!app.legal.privacyUrl) errors.push(`${app.slug}: missing legal.privacyUrl`) + if (!app.legal.supportUrl && !app.legal.supportEmail) { + errors.push(`${app.slug}: missing legal.supportUrl or legal.supportEmail`) + } + if (app.review.testPrompts.length === 0) errors.push(`${app.slug}: missing review.testPrompts`) + if (!app.mcp.csp) errors.push(`${app.slug}: missing mcp.csp`) + if (app.providers.openai.enabled && app.providers.openai.status === 'submission_ready' && app.review.screenshots.length === 0) { + errors.push(`${app.slug}: openai marked submission_ready without screenshots`) + } + } + + return errors +} diff --git a/tsconfig.json b/tsconfig.json index b5c9503..b3d5b18 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -17,6 +17,6 @@ }, "types": ["node", "vitest/globals"] }, - "include": ["warps/**/*.ts", "warps/**/*.tsx", "ui/**/*.ts", "ui/**/*.tsx"], + "include": ["warps/**/*.ts", "warps/**/*.tsx", "ui/**/*.ts", "ui/**/*.tsx", "scripts/**/*.ts"], "exclude": ["node_modules", "dist"] -} \ No newline at end of file +} diff --git a/warps/distribution.ts b/warps/distribution.ts new file mode 100644 index 0000000..5605deb --- /dev/null +++ b/warps/distribution.ts @@ -0,0 +1,117 @@ +import { + AppDistributionFactory, + AppDistributionManifest, + WarpbaseBrand, +} from './types' + +const JOAI_LEGAL_NOTICE_URL = 'https://legal.vleap.ai/general/legal-notice.html' +const JOAI_PRIVACY_URL = 'https://legal.vleap.ai/policies/privacy.html' +const JOAI_SUPPORT_URL = 'https://joai.ai' +const JOAI_SUPPORT_EMAIL = 'support@joai.ai' + +type DeepPartial = { + [K in keyof T]?: T[K] extends Array + ? U[] + : T[K] extends Record + ? DeepPartial + : T[K] +} + +function mergeDefined>(base: T, overrides?: DeepPartial): T { + if (!overrides) return base + + const next: Record = { ...base } + + for (const [key, value] of Object.entries(overrides)) { + if (value === undefined) continue + + const current = next[key] + if ( + value && + typeof value === 'object' && + !Array.isArray(value) && + current && + typeof current === 'object' && + !Array.isArray(current) + ) { + next[key] = mergeDefined(current as Record, value as DeepPartial>) + continue + } + + next[key] = value + } + + return next as T +} + +function getBrandDisplayName(brandName: string, brand: WarpbaseBrand | null): string { + const runtimeName = brand?.info?.name + if (typeof runtimeName === 'string' && runtimeName.trim()) return runtimeName.trim() + + return brandName + .split(/[-_]/g) + .map((part) => (part ? part[0].toUpperCase() + part.slice(1) : part)) + .join(' ') +} + +function createDefaultManifest(brandName: string, brand: WarpbaseBrand | null): AppDistributionManifest { + const appName = getBrandDisplayName(brandName, brand) + + return { + install: { + summary: `Connect ${appName} to Claude, Codex, and ChatGPT through JoAi's hosted MCP app server.`, + examplePrompts: [ + `List the ${appName} tools available in this app.`, + `Explain what setup or authentication ${appName} needs before I run an action.`, + `Use ${appName} to help me with the task I describe next.`, + ], + usageNotes: [ + 'Every listed action becomes an MCP tool when the app server is connected.', + 'Prefer the generated provider plugin when one is available, and fall back to the raw MCP URL otherwise.', + ], + authPrerequisites: [ + 'Some actions require provider credentials or OAuth on first use.', + ], + }, + legal: { + privacyUrl: JOAI_PRIVACY_URL, + termsUrl: JOAI_LEGAL_NOTICE_URL, + supportUrl: JOAI_SUPPORT_URL, + supportEmail: JOAI_SUPPORT_EMAIL, + }, + review: { + screenshots: [], + reviewerNotes: [ + `This app wraps ${appName}'s public warp actions behind JoAi's hosted MCP app server.`, + 'The generated submission bundle is ready for runtime validation even when marketplace screenshots have not been attached yet.', + ], + testPrompts: [ + `List the ${appName} tools available in this app.`, + `What authentication does ${appName} require before you can use it?`, + `Use the best ${appName} tool for the task I describe next.`, + ], + demoFlow: 'Connect the hosted MCP URL, authenticate if prompted, then call one of the listed app actions.', + credentialsReference: 'Use the same provider credentials or OAuth flow that the underlying warp actions already require.', + }, + providers: { + claude: { + enabled: true, + status: 'ready', + }, + codex: { + enabled: true, + status: 'ready', + }, + openai: { + enabled: true, + status: 'runtime_ready', + }, + }, + } +} + +export function createDefaultAppDistribution( + overrides?: DeepPartial, +): AppDistributionFactory { + return ({ brandName, brand }) => mergeDefined(createDefaultManifest(brandName, brand), overrides) +} diff --git a/warps/mcp.ts b/warps/mcp.ts new file mode 100644 index 0000000..bc37a0b --- /dev/null +++ b/warps/mcp.ts @@ -0,0 +1,17 @@ +import { AppMcpFactory, AppMcpManifest } from './types' + +const DEFAULT_MCP_MANIFEST: AppMcpManifest = { + prefersBorder: true, + csp: { + connectDomains: [], + resourceDomains: [], + frameDomains: [], + baseUriDomains: [], + }, +} + +export function createDefaultAppMcp( + overrides?: Partial, +): AppMcpFactory { + return () => ({ ...DEFAULT_MCP_MANIFEST, ...overrides }) +} diff --git a/warps/multiversx/distribution.ts b/warps/multiversx/distribution.ts new file mode 100644 index 0000000..6d6e1cb --- /dev/null +++ b/warps/multiversx/distribution.ts @@ -0,0 +1,19 @@ +import { createDefaultAppDistribution } from '../distribution' + +export const distribution = createDefaultAppDistribution({ + install: { + summary: 'Connect MultiversX to Claude, Codex, and ChatGPT. Check balances, view transactions, manage staking, and interact with ESDT tokens through natural language.', + examplePrompts: [ + 'What is the EGLD balance of erd1...?', + 'Show my staking delegations.', + 'View details for token WEGLD-bd4d79.', + ], + }, + review: { + testPrompts: [ + 'What is the balance of erd1qqqqqqqqqqqqqpgqhe8t5jewej70zupmh44jurgn29psua5l2jps3ntjj3?', + 'Show staking delegations for erd1qqqqqqqqqqqqqpgqhe8t5jewej70zupmh44jurgn29psua5l2jps3ntjj3.', + 'Get transaction details for a recent transaction hash.', + ], + }, +}) diff --git a/warps/multiversx/mcp.ts b/warps/multiversx/mcp.ts new file mode 100644 index 0000000..c70cf74 --- /dev/null +++ b/warps/multiversx/mcp.ts @@ -0,0 +1,7 @@ +import { createDefaultAppMcp } from '../mcp' + +export const mcp = createDefaultAppMcp({ + csp: { + connectDomains: ['https://api.multiversx.com', 'https://devnet-api.multiversx.com'], + }, +}) diff --git a/warps/types.ts b/warps/types.ts index cea50d1..63cccae 100644 --- a/warps/types.ts +++ b/warps/types.ts @@ -6,3 +6,98 @@ export type WarpbaseBrand = { destinations: Record string> discover?: string[] } + +export type AppDistributionProvider = 'claude' | 'codex' | 'openai' + +export type AppDistributionProviderStatus = + | 'disabled' + | 'planned' + | 'ready' + | 'runtime_ready' + | 'submission_ready' + +export type AppDistributionProviderConfig = { + enabled?: boolean + status?: AppDistributionProviderStatus + notes?: string[] +} + +export type AppMcpUiCsp = { + connectDomains?: string[] + resourceDomains?: string[] + frameDomains?: string[] + baseUriDomains?: string[] +} + +export type AppMcpUiPermissions = { + camera?: Record + microphone?: Record + geolocation?: Record + clipboardWrite?: Record +} + +export type AppMcpManifest = { + prefersBorder?: boolean + csp?: AppMcpUiCsp + permissions?: AppMcpUiPermissions + domain?: string +} + +export type AppMcpFactoryContext = { + env: WarpChainEnv + brand: WarpbaseBrand | null + brandName: string +} + +export type AppMcpFactory = + (context: AppMcpFactoryContext) => + AppMcpManifest | Promise + +export type AppDistributionInstallCopy = { + summary: string + examplePrompts: string[] + usageNotes?: string[] + authPrerequisites?: string[] +} + +export type AppDistributionLegal = { + privacyUrl: string + supportUrl?: string + supportEmail?: string + termsUrl?: string +} + +export type AppDistributionReviewAssets = { + screenshots: string[] + reviewerNotes: string[] + testPrompts: string[] + demoFlow?: string + credentialsReference?: string +} + +export type AppDistributionManifest = { + install: AppDistributionInstallCopy + legal: AppDistributionLegal + review: AppDistributionReviewAssets + providers?: Partial> +} + +export type WarpExtrasFaq = { + question: string + answer: string +} + +export type WarpExtras = { + keywords?: Record + faq?: Record +} + +export type AppDistributionFactoryContext = { + env: WarpChainEnv + brand: WarpbaseBrand | null + brandName: string +} + +export type AppDistributionFactory = + (context: AppDistributionFactoryContext) => + AppDistributionManifest | Promise From 49f098148312ad4d5602e3522a6f5155d20a2f80 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 12:13:55 +0200 Subject: [PATCH 06/19] update gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index dc5d4c8..5c719fd 100644 --- a/.gitignore +++ b/.gitignore @@ -2,3 +2,4 @@ node_modules dist .DS_Store .env +.firecrawl From 5830d38b99f0937fba4a123402817de235990b72 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 13:49:53 +0200 Subject: [PATCH 07/19] feat: add SEO extras (meta.ts) for 21 brands with keywords, use cases, FAQs - Add WarpExtras type (keywords, useCases, category, faq) to warps/types.ts - Update catalog build pipeline to load meta.ts per brand and include extras in manifest - Create meta.ts files for 21 active brands with full EN+DE translations - Add agent guidelines for SEO-optimized warp descriptions and meta.ts requirements Co-Authored-By: Claude Opus 4.6 (1M context) --- agents.md | 59 +++ scripts/catalog/build-catalog.test.ts | 171 ++++++++ scripts/catalog/build-catalog.ts | 101 ++++- warps/anthropic/meta.ts | 163 +++++++ warps/appointments/meta.ts | 151 +++++++ warps/asset/meta.ts | 41 ++ warps/colombia-staking/meta.ts | 90 ++++ warps/eapes/meta.ts | 90 ++++ warps/hatom/meta.ts | 65 +++ warps/inception-network/meta.ts | 90 ++++ warps/joai/meta.ts | 98 +++++ warps/mregld/meta.ts | 90 ++++ warps/multiversx/meta.ts | 586 ++++++++++++++++++++++++++ warps/openai/meta.ts | 163 +++++++ warps/openbond/meta.ts | 103 +++++ warps/peerme/meta.ts | 201 +++++++++ warps/projectx/meta.ts | 90 ++++ warps/resend/meta.ts | 31 ++ warps/shop/meta.ts | 189 +++++++++ warps/typefully/meta.ts | 31 ++ warps/types.ts | 2 + warps/whatsapp/meta.ts | 31 ++ warps/xexchange/meta.ts | 345 +++++++++++++++ warps/xmoney/meta.ts | 31 ++ warps/xoxno/meta.ts | 139 ++++++ 25 files changed, 3133 insertions(+), 18 deletions(-) create mode 100644 warps/anthropic/meta.ts create mode 100644 warps/appointments/meta.ts create mode 100644 warps/asset/meta.ts create mode 100644 warps/colombia-staking/meta.ts create mode 100644 warps/eapes/meta.ts create mode 100644 warps/hatom/meta.ts create mode 100644 warps/inception-network/meta.ts create mode 100644 warps/joai/meta.ts create mode 100644 warps/mregld/meta.ts create mode 100644 warps/multiversx/meta.ts create mode 100644 warps/openai/meta.ts create mode 100644 warps/openbond/meta.ts create mode 100644 warps/peerme/meta.ts create mode 100644 warps/projectx/meta.ts create mode 100644 warps/resend/meta.ts create mode 100644 warps/shop/meta.ts create mode 100644 warps/typefully/meta.ts create mode 100644 warps/whatsapp/meta.ts create mode 100644 warps/xexchange/meta.ts create mode 100644 warps/xmoney/meta.ts create mode 100644 warps/xoxno/meta.ts diff --git a/agents.md b/agents.md index dc7b00f..64713bd 100644 --- a/agents.md +++ b/agents.md @@ -32,3 +32,62 @@ - Never use formal "Sie/Ihre" in German translations. Always use informal "du/dein" (lowercase) or rephrase to avoid the pronoun entirely. - Lowercase "sie/ihre" referring to things (not users) is fine — e.g. "einer Transaktion anhand ihres Hashes" (its hash). + +## When Creating or Updating Warps + +Every warp must meet these requirements before it can be considered complete: + +### 1. Warp JSON — Descriptions + +- The `description` field must be 2-3 sentences, optimized for SEO and LLM search discoverability. +- Include relevant keywords naturally — mention the brand/service name, what the action does, and who benefits. +- If a description is only 1 short sentence, it is not ready — expand it. +- All descriptions must have both `en` and `de` translations. +- German translations must sound natural (informal "du" form, not robotic/literal). See the German Localization section. +- Never expose the internal term "warp" in user-facing text. Users know these as "actions". + +### 2. meta.ts — SEO Extras (Required) + +Every brand that has warps must have a `meta.ts` file in its directory. When adding or updating warps, always update the corresponding `meta.ts`. + +The file exports SEO extras per warp, keyed by warp filename (without `.json`) or subdirectory name: + +```ts +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'warp-name': { + keywords: { + en: ['relevant search term', 'another keyword'], + de: ['relevanter Suchbegriff', 'weiteres Keyword'], + }, + useCases: { + en: ['Specific scenario 1', 'Specific scenario 2', 'Specific scenario 3'], + de: ['Spezifisches Szenario 1', 'Spezifisches Szenario 2', 'Spezifisches Szenario 3'], + }, + category: 'productivity', + faq: { + en: [ + { question: 'A real question users would ask?', answer: 'Concise 1-2 sentence answer.' }, + ], + de: [ + { question: 'Eine echte Frage, die Nutzer stellen würden?', answer: 'Knappe Antwort in 1-2 Sätzen.' }, + ], + }, + }, +} +``` + +**Field requirements:** + +- `keywords`: relevant search terms users would type. Include brand name, action name, and related terms. Both `en` and `de`. +- `useCases`: 3-4 short, specific scenario strings describing who benefits or what can be done. Not generic platitudes — be concrete. Both `en` and `de`. +- `category`: exactly one of: `'productivity'`, `'communication'`, `'developer'`, `'defi'`, `'staking'`, `'nft'`, `'analytics'`, `'commerce'`, `'social'`, `'security'`, `'infrastructure'`. +- `faq`: 2-3 question/answer pairs per warp. Questions should be things users actually search for. Answers must be concise (1-2 sentences). Both `en` and `de`. + +**Content rules:** + +- Never reference internal identifiers, technical names, or the word "warp" in any user-facing text. +- German translations must be natural and fluent — not word-for-word translations. Use informal "du" form. +- Keywords should include terms in the user's language, not just English terms translated literally. German crypto/tech terms often stay in English (e.g. "staken", "swappen", "DEX"). +- FAQ answers should describe what the user can do, not how the system works internally. diff --git a/scripts/catalog/build-catalog.test.ts b/scripts/catalog/build-catalog.test.ts index 64baa0c..4cce8fb 100644 --- a/scripts/catalog/build-catalog.test.ts +++ b/scripts/catalog/build-catalog.test.ts @@ -1,6 +1,13 @@ // @vitest-environment node import { describe, it, expect } from 'vitest' +import path from 'path' +import { fileURLToPath } from 'url' import { isDraftFile, isPrivateFile, getAliasFromFileName } from './build-catalog.js' +import { buildDistributionCatalog, validateDistributionCatalog } from './distribution.js' + +const __filename = fileURLToPath(import.meta.url) +const __dirname = path.dirname(__filename) +const REPO_ROOT = path.resolve(__dirname, '../../') describe('isPrivateFile', () => { it('returns true for #-prefixed filenames', () => { @@ -79,3 +86,167 @@ describe('sync-to-api: listed filtering', () => { expect(filtered).toHaveLength(2) }) }) + +describe('distribution catalog', () => { + it('builds a public app catalog from listed brand warps', async () => { + const catalog = await buildDistributionCatalog( + REPO_ROOT, + { + schemaVersion: 1, + source: 'github', + repo: 'JoAiHQ/warps', + branch: 'main', + network: 'mainnet', + commitSha: 'test', + generatedAt: '2026-04-01T00:00:00.000Z', + warps: [ + { + key: 'multiversx:joai-agent-create', + identifier: '@multiversx:joai-agent-create', + alias: 'joai-agent-create', + chain: 'multiversx', + hash: 'warp-hash-1', + checksum: 'warp-hash-1', + name: 'JoAi: Create Agent', + title: { en: 'Create Agent' }, + description: { en: 'Create a JoAi agent.' }, + preview: null, + creator: 'github:JoAiHQ/warps', + privileges: [], + listed: true, + primaryAddress: null, + primaryFunc: null, + brand: { + hash: 'brand-hash-1', + slug: 'joai', + active: true, + protocol: 'brand:1.0.0', + name: 'JoAi', + description: { en: 'JoAi brand' }, + logo: { default: 'https://example.com/logo.svg' }, + urls: { web: 'https://joai.ai' }, + colors: { primary: '#98FF98' }, + }, + warp: { + actions: [{ type: 'collect' }], + }, + extras: null, + }, + { + key: 'multiversx:joai-private-warp', + identifier: '@multiversx:joai-private-warp', + alias: 'joai-private-warp', + chain: 'multiversx', + hash: 'warp-hash-2', + checksum: 'warp-hash-2', + name: 'JoAi: Private Warp', + title: { en: 'Private Warp' }, + description: { en: 'Private warp' }, + preview: null, + creator: 'github:JoAiHQ/warps', + privileges: [], + listed: false, + primaryAddress: null, + primaryFunc: null, + brand: { + hash: 'brand-hash-1', + slug: 'joai', + active: true, + protocol: 'brand:1.0.0', + name: 'JoAi', + description: { en: 'JoAi brand' }, + logo: { default: 'https://example.com/logo.svg' }, + urls: { web: 'https://joai.ai' }, + colors: { primary: '#98FF98' }, + }, + warp: { + actions: [{ type: 'contract' }], + }, + extras: null, + }, + ], + }, + new Map(), + ) + + expect(catalog.apps).toHaveLength(1) + expect(catalog.apps[0]).toMatchObject({ + slug: 'joai', + mcpUrl: 'https://cortex.joai.ai/mcp/apps/joai', + providers: { + claude: { enabled: true, status: 'ready' }, + codex: { enabled: true, status: 'ready' }, + openai: { enabled: true, status: 'runtime_ready' }, + }, + }) + expect(catalog.apps[0].actions).toEqual([ + { + alias: 'joai-agent-create', + identifier: '@multiversx:joai-agent-create', + chain: 'multiversx', + name: 'JoAi: Create Agent', + title: { en: 'Create Agent' }, + description: { en: 'Create a JoAi agent.' }, + actionTypes: ['collect'], + }, + ]) + expect(validateDistributionCatalog(catalog)).toEqual([]) + }) + + it('requires screenshots only for submission-ready OpenAI apps', () => { + const errors = validateDistributionCatalog({ + schemaVersion: 1, + source: 'github', + repo: 'JoAiHQ/warps', + branch: 'main', + network: 'mainnet', + commitSha: 'test', + generatedAt: '2026-04-01T00:00:00.000Z', + apps: [ + { + slug: 'joai', + name: 'JoAi', + description: { en: 'JoAi' }, + logo: { default: 'https://example.com/logo.svg' }, + urls: { web: 'https://joai.ai' }, + hash: 'brand-hash', + mcpUrl: 'https://cortex.joai.ai/mcp/apps/joai', + install: { + summary: 'summary', + examplePrompts: ['prompt'], + usageNotes: [], + authPrerequisites: [], + }, + legal: { + privacyUrl: 'https://legal.vleap.ai/policies/privacy.html', + supportEmail: 'support@joai.ai', + }, + review: { + screenshots: [], + reviewerNotes: ['note'], + testPrompts: ['prompt'], + }, + ui: { + prefersBorder: true, + csp: { + connectDomains: [], + resourceDomains: [], + frameDomains: [], + baseUriDomains: [], + }, + permissions: {}, + domain: undefined, + }, + providers: { + claude: { provider: 'claude', enabled: true, status: 'ready', notes: [] }, + codex: { provider: 'codex', enabled: true, status: 'ready', notes: [] }, + openai: { provider: 'openai', enabled: true, status: 'submission_ready', notes: [] }, + }, + actions: [], + }, + ], + }) + + expect(errors).toContain('joai: openai marked submission_ready without screenshots') + }) +}) diff --git a/scripts/catalog/build-catalog.ts b/scripts/catalog/build-catalog.ts index 9c93cc8..fdc8fbf 100644 --- a/scripts/catalog/build-catalog.ts +++ b/scripts/catalog/build-catalog.ts @@ -16,6 +16,11 @@ import { SOURCE_REPO, type SyncNetwork, } from './sync-policy.js' +import { + buildDistributionCatalog, + validateDistributionCatalog, +} from './distribution.js' +import type { WarpbaseBrand, WarpExtras } from '../../warps/types.js' type Dict = Record @@ -49,6 +54,7 @@ type WarpUpsert = { primaryFunc: string | null brand: BrandPayload | null warp: Dict + extras: WarpExtras | null } type WarpDelete = { @@ -537,7 +543,7 @@ function listWarpFiles(): Record { async function getBrandFactoryOutput( brandName: string, env: SyncNetwork, -): Promise { +): Promise { const noAtPath = path.join(WARPS_DIR, brandName, 'brand.ts') const withAtPath = path.join(WARPS_DIR, `@${brandName}`, 'brand.ts') const brandPath = fs.existsSync(noAtPath) ? noAtPath : withAtPath @@ -562,7 +568,7 @@ async function getBrandFactoryOutput( return await brandFactory(config) } -function toBrandPayload(brandFactoryOutput: any, active: boolean): BrandPayload { +function toBrandPayload(brandFactoryOutput: WarpbaseBrand, active: boolean): BrandPayload { const info = deepClone((brandFactoryOutput?.info ?? {}) as Dict) delete info.meta @@ -582,6 +588,25 @@ function toBrandPayload(brandFactoryOutput: any, active: boolean): BrandPayload } } +async function loadBrandExtras( + brandName: string, +): Promise | null> { + const noAtPath = path.join(WARPS_DIR, brandName, 'meta.ts') + const withAtPath = path.join(WARPS_DIR, `@${brandName}`, 'meta.ts') + const metaPath = fs.existsSync(noAtPath) ? noAtPath : withAtPath + + if (!fs.existsSync(metaPath)) return null + + const module = await import(pathToFileURL(metaPath).href) + const candidate = module.meta ?? module.default + + if (candidate && typeof candidate === 'object' && !Array.isArray(candidate)) { + return candidate as Record + } + + return null +} + function loadPreviousManifest(network: SyncNetwork): CatalogManifest | null { const filePath = path.join(CATALOG_DIR, network, 'manifest.json') if (!fs.existsSync(filePath)) return null @@ -651,10 +676,16 @@ function writeJson(filePath: string, data: unknown): void { fs.writeFileSync(filePath, `${JSON.stringify(data, null, 2)}\n`) } -async function buildManifest(args: CliArgs, network: SyncNetwork): Promise { +type BuildCatalogResult = { + manifest: CatalogManifest + brandFactoryCache: Map +} + +async function buildManifest(args: CliArgs, network: SyncNetwork): Promise { const files = listWarpFiles() const brandCache = new Map() - const brandFactoryCache = new Map() + const brandFactoryCache = new Map() + const extrasCache = new Map | null>() const warps: WarpUpsert[] = [] for (const [fileName, absolutePath] of Object.entries(files)) { @@ -674,10 +705,15 @@ async function buildManifest(args: CliArgs, network: SyncNetwork): Promise a.key.localeCompare(b.key)) return { - schemaVersion: 1, - source: 'github', - repo: args.repo, - branch: args.branch, - network, - commitSha: args.commitSha, - generatedAt: new Date().toISOString(), - warps, + manifest: { + schemaVersion: 1, + source: 'github', + repo: args.repo, + branch: args.branch, + network, + commitSha: args.commitSha, + generatedAt: new Date().toISOString(), + warps, + }, + brandFactoryCache, } } @@ -776,16 +834,23 @@ async function main() { return } - const manifest = await buildManifest(args, network) + const { manifest, brandFactoryCache } = await buildManifest(args, network) const previousManifest = args.full ? null : loadPreviousManifest(network) const delta = computeDelta(manifest, previousManifest, args.committedAt) + const distribution = await buildDistributionCatalog(REPO_ROOT, manifest, brandFactoryCache) + const distributionErrors = validateDistributionCatalog(distribution) + + if (distributionErrors.length > 0) { + throw new Error(`Distribution catalog validation failed:\n- ${distributionErrors.join('\n- ')}`) + } const networkCatalogDir = path.join(CATALOG_DIR, network) writeJson(path.join(networkCatalogDir, 'manifest.json'), manifest) writeJson(path.join(networkCatalogDir, 'delta.json'), delta) + writeJson(path.join(networkCatalogDir, 'distribution.json'), distribution) console.log( - `Catalog generated for ${network}: ${manifest.warps.length} warps, ${delta.upserts.length} upserts, ${delta.deletes.length} deletes.`, + `Catalog generated for ${network}: ${manifest.warps.length} warps, ${distribution.apps.length} apps, ${delta.upserts.length} upserts, ${delta.deletes.length} deletes.`, ) } diff --git a/warps/anthropic/meta.ts b/warps/anthropic/meta.ts new file mode 100644 index 0000000..8e90503 --- /dev/null +++ b/warps/anthropic/meta.ts @@ -0,0 +1,163 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'launch-task': { + keywords: { + en: ['Claude task', 'launch Claude task', 'Anthropic AI task', 'Claude agent', 'run AI task', 'start Claude job', 'Claude automation'], + de: ['Claude Aufgabe', 'Claude Aufgabe starten', 'Anthropic KI-Aufgabe', 'Claude Agent', 'KI-Aufgabe ausführen', 'Claude Job starten', 'Claude Automatisierung'], + }, + useCases: { + en: ['Delegate a research summary to Claude while you focus on other work', 'Have Claude draft a blog post or report in the background', 'Run complex data analysis tasks without waiting at your desk'], + de: ['Eine Recherche-Zusammenfassung an Claude delegieren, während du dich auf andere Arbeit konzentrierst', 'Claude im Hintergrund einen Blogbeitrag oder Bericht entwerfen lassen', 'Komplexe Datenanalysen ausführen, ohne am Schreibtisch zu warten'], + }, + category: 'developer', + faq: { + en: [ + { + question: 'How do I launch a task with Claude?', + answer: + 'Start a new background task with Claude by providing your instructions. Claude will work on it asynchronously and return results when complete.', + }, + { + question: 'What kind of tasks can Claude handle?', + answer: + 'Claude can handle a wide range of tasks including writing, analysis, research, coding, and more. Tasks run in the background so you can continue with other work.', + }, + ], + de: [ + { + question: 'Wie starte ich eine Aufgabe mit Claude?', + answer: + 'Starte eine neue Hintergrundaufgabe mit Claude, indem du deine Anweisungen eingibst. Claude arbeitet asynchron daran und liefert die Ergebnisse nach Abschluss.', + }, + { + question: 'Welche Aufgaben kann Claude erledigen?', + answer: + 'Claude kann eine Vielzahl von Aufgaben erledigen, darunter Schreiben, Analyse, Recherche, Programmierung und mehr. Aufgaben laufen im Hintergrund, sodass du mit anderer Arbeit fortfahren kannst.', + }, + ], + }, + }, + + 'cancel-task': { + keywords: { + en: ['cancel Claude task', 'stop Claude job', 'abort AI task', 'terminate Claude task'], + de: ['Claude Aufgabe abbrechen', 'Claude Job stoppen', 'KI-Aufgabe abbrechen', 'Claude Aufgabe beenden'], + }, + useCases: { + en: ['Stop a task that was started with incorrect instructions', 'Cancel a long-running job you no longer need results from', 'Free up resources by terminating obsolete background tasks'], + de: ['Eine Aufgabe stoppen, die mit falschen Anweisungen gestartet wurde', 'Einen lang laufenden Job abbrechen, dessen Ergebnisse nicht mehr benötigt werden', 'Ressourcen freigeben durch Beenden veralteter Hintergrundaufgaben'], + }, + category: 'developer', + }, + + 'get-task-status': { + keywords: { + en: ['Claude task status', 'check task progress', 'task result', 'Claude job status'], + de: ['Claude Aufgabenstatus', 'Aufgabenfortschritt prüfen', 'Aufgabenergebnis', 'Claude Job-Status'], + }, + useCases: { + en: ['Check if a background research task has finished', 'Retrieve the completed output of a Claude writing job', 'Monitor progress on a long-running analysis task'], + de: ['Prüfen, ob eine Hintergrund-Rechercheaufgabe abgeschlossen ist', 'Die fertige Ausgabe eines Claude-Schreibauftrags abrufen', 'Den Fortschritt einer lang laufenden Analyseaufgabe überwachen'], + }, + category: 'developer', + }, + + 'add-followup': { + keywords: { + en: ['Claude followup', 'add followup message', 'continue Claude task', 'reply to Claude task'], + de: ['Claude Nachfrage', 'Folgenachricht hinzufügen', 'Claude Aufgabe fortsetzen', 'auf Claude Aufgabe antworten'], + }, + useCases: { + en: ['Ask Claude to revise a draft based on new feedback', 'Provide additional context to improve task output', 'Request a different format or focus for completed results'], + de: ['Claude bitten, einen Entwurf basierend auf neuem Feedback zu überarbeiten', 'Zusätzlichen Kontext liefern, um die Aufgabenausgabe zu verbessern', 'Ein anderes Format oder einen anderen Fokus für fertige Ergebnisse anfordern'], + }, + category: 'developer', + }, + + 'code-launch-task': { + keywords: { + en: ['Claude Code task', 'launch coding task', 'Claude Code agent', 'AI coding job', 'Claude developer task'], + de: ['Claude Code Aufgabe', 'Programmieraufgabe starten', 'Claude Code Agent', 'KI-Programmierauftrag', 'Claude Entwickleraufgabe'], + }, + useCases: { + en: ['Have Claude Code implement a new feature in your codebase', 'Delegate bug fixes and code refactoring to an AI coding agent', 'Automate code reviews and test generation with Claude Code'], + de: ['Claude Code ein neues Feature in der Codebasis implementieren lassen', 'Bug-Fixes und Code-Refactoring an einen KI-Programmieragenten delegieren', 'Code-Reviews und Testgenerierung mit Claude Code automatisieren'], + }, + category: 'developer', + }, + + 'code-cancel-task': { + keywords: { + en: ['cancel Claude Code task', 'stop coding task', 'abort Claude Code job'], + de: ['Claude Code Aufgabe abbrechen', 'Programmieraufgabe stoppen', 'Claude Code Job abbrechen'], + }, + useCases: { + en: ['Stop a coding task when requirements have changed', 'Abort a code generation job that is taking the wrong approach', 'Cancel a Claude Code task to restart with better instructions'], + de: ['Eine Programmieraufgabe stoppen, wenn sich die Anforderungen geändert haben', 'Einen Code-Generierungsjob abbrechen, der den falschen Ansatz verfolgt', 'Eine Claude Code Aufgabe abbrechen, um mit besseren Anweisungen neu zu starten'], + }, + category: 'developer', + }, + + 'code-get-task-status': { + keywords: { + en: ['Claude Code task status', 'coding task progress', 'Claude Code result'], + de: ['Claude Code Aufgabenstatus', 'Programmieraufgabe Fortschritt', 'Claude Code Ergebnis'], + }, + useCases: { + en: ['Check if Claude Code has finished implementing your feature', 'Review the generated code before merging changes', 'Monitor a complex refactoring task in progress'], + de: ['Prüfen, ob Claude Code die Feature-Implementierung abgeschlossen hat', 'Den generierten Code vor dem Zusammenführen überprüfen', 'Eine komplexe Refactoring-Aufgabe im Fortschritt überwachen'], + }, + category: 'developer', + }, + + 'code-add-followup': { + keywords: { + en: ['Claude Code followup', 'continue coding task', 'reply to Claude Code task'], + de: ['Claude Code Nachfrage', 'Programmieraufgabe fortsetzen', 'auf Claude Code Aufgabe antworten'], + }, + useCases: { + en: ['Ask Claude Code to add error handling to generated code', 'Request style or architecture changes mid-implementation', 'Provide clarifying details about edge cases during coding'], + de: ['Claude Code bitten, Fehlerbehandlung zum generierten Code hinzuzufügen', 'Stil- oder Architekturänderungen während der Implementierung anfordern', 'Klärende Details zu Grenzfällen während des Programmierens liefern'], + }, + category: 'developer', + }, + + 'joai-plugin-install': { + keywords: { + en: ['install plugin', 'add Claude plugin', 'Anthropic plugin setup', 'Claude MCP install', 'connect tool to Claude'], + de: ['Plugin installieren', 'Claude Plugin hinzufügen', 'Anthropic Plugin einrichten', 'Claude MCP installieren', 'Tool mit Claude verbinden'], + }, + useCases: { + en: ['Add a blockchain plugin to interact with MultiversX from Claude', 'Install a communication plugin to send emails or messages via Claude', 'Extend Claude with a productivity tool for scheduling or task management'], + de: ['Ein Blockchain-Plugin hinzufügen, um von Claude aus mit MultiversX zu interagieren', 'Ein Kommunikations-Plugin installieren, um E-Mails oder Nachrichten über Claude zu senden', 'Claude mit einem Produktivitäts-Tool für Terminplanung oder Aufgabenverwaltung erweitern'], + }, + category: 'developer', + faq: { + en: [ + { + question: 'How do I install a plugin for Claude?', + answer: + 'Install a new plugin to your Claude setup with just a few steps. The configuration and connection are handled automatically so the plugin is ready to use immediately.', + }, + { + question: 'What plugins are available for Claude?', + answer: + 'A variety of plugins are available covering productivity, development, communication, and blockchain tools. Browse the plugin catalog to see what fits your workflow.', + }, + ], + de: [ + { + question: 'Wie installiere ich ein Plugin für Claude?', + answer: + 'Installiere ein neues Plugin für dein Claude-Setup in wenigen Schritten. Die Konfiguration und Verbindung werden automatisch übernommen, sodass das Plugin sofort einsatzbereit ist.', + }, + { + question: 'Welche Plugins sind für Claude verfügbar?', + answer: + 'Es gibt eine Vielzahl von Plugins für Produktivität, Entwicklung, Kommunikation und Blockchain-Tools. Durchsuche den Plugin-Katalog, um passende für deinen Workflow zu finden.', + }, + ], + }, + }, +} diff --git a/warps/appointments/meta.ts b/warps/appointments/meta.ts new file mode 100644 index 0000000..a2b9f27 --- /dev/null +++ b/warps/appointments/meta.ts @@ -0,0 +1,151 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'appointment-book': { + keywords: { + en: ['book appointment', 'schedule appointment', 'make reservation', 'book meeting', 'schedule visit', 'appointment booking'], + de: ['Termin buchen', 'Termin vereinbaren', 'Reservierung machen', 'Besprechung buchen', 'Besuch planen', 'Terminbuchung'], + }, + useCases: { + en: ['Schedule a consultation with a service provider', 'Book a recurring weekly appointment for a client', 'Reserve a time slot on behalf of someone else'], + de: ['Eine Beratung bei einem Dienstleister vereinbaren', 'Einen wöchentlich wiederkehrenden Termin für einen Kunden buchen', 'Einen Zeitslot im Namen einer anderen Person reservieren'], + }, + category: 'productivity', + faq: { + en: [ + { + question: 'How do I book an appointment?', + answer: + 'Simply select an available time slot and provide your details to book an appointment.', + }, + { + question: 'Can I book an appointment for someone else?', + answer: + 'Yes, you can book on behalf of someone else by providing their contact details during the booking process.', + }, + ], + de: [ + { + question: 'Wie buche ich einen Termin?', + answer: + 'Wähle einfach einen verfügbaren Zeitslot und gib deine Daten ein, um einen Termin zu buchen.', + }, + { + question: 'Kann ich einen Termin für jemand anderen buchen?', + answer: + 'Ja, du kannst im Namen einer anderen Person buchen, indem du deren Kontaktdaten während des Buchungsvorgangs angibst.', + }, + ], + }, + }, + + 'appointment-cancel': { + keywords: { + en: ['cancel appointment', 'remove booking', 'delete appointment', 'unbook slot'], + de: ['Termin absagen', 'Buchung entfernen', 'Termin löschen', 'Zeitslot freigeben'], + }, + useCases: { + en: ['Cancel a meeting you can no longer attend', 'Free up a booked slot due to a scheduling conflict', 'Remove a duplicate or accidental booking'], + de: ['Eine Besprechung absagen, an der du nicht mehr teilnehmen kannst', 'Einen gebuchten Slot wegen eines Terminkonfikts freigeben', 'Eine doppelte oder versehentliche Buchung entfernen'], + }, + category: 'productivity', + }, + + 'appointment-reschedule': { + keywords: { + en: ['reschedule appointment', 'change appointment time', 'move booking', 'update appointment'], + de: ['Termin verschieben', 'Terminzeit ändern', 'Buchung verlegen', 'Termin aktualisieren'], + }, + useCases: { + en: ['Move a client meeting to a later time slot', 'Reschedule an appointment due to an unexpected conflict', 'Shift a recurring booking to a different day of the week'], + de: ['Ein Kundengespräch auf einen späteren Zeitslot verschieben', 'Einen Termin wegen eines unerwarteten Konflikts umplanen', 'Eine wiederkehrende Buchung auf einen anderen Wochentag verlegen'], + }, + category: 'productivity', + }, + + 'appointment-availability': { + keywords: { + en: ['check availability', 'available time slots', 'open appointments', 'free schedule slots'], + de: ['Verfügbarkeit prüfen', 'verfügbare Zeitslots', 'offene Termine', 'freie Terminslots'], + }, + useCases: { + en: ['Browse available slots for next week before booking', 'Check if a specific date and time is still open', 'Find the earliest available appointment slot'], + de: ['Verfügbare Slots für nächste Woche vor der Buchung durchsuchen', 'Prüfen, ob ein bestimmtes Datum und eine bestimmte Uhrzeit noch frei ist', 'Den frühesten verfügbaren Terminslot finden'], + }, + category: 'productivity', + }, + + 'appointment-onboarding': { + keywords: { + en: ['appointment onboarding', 'setup appointments', 'appointment system intro', 'get started appointments'], + de: ['Termin-Onboarding', 'Termine einrichten', 'Terminsystem Einführung', 'mit Terminen starten'], + }, + useCases: { + en: ['Set up an appointment system for a new business', 'Walk through initial configuration of booking rules and hours', 'Onboard a team to start accepting appointment bookings'], + de: ['Ein Terminsystem für ein neues Geschäft einrichten', 'Die Erstkonfiguration von Buchungsregeln und Öffnungszeiten durchgehen', 'Ein Team onboarden, um Terminbuchungen anzunehmen'], + }, + category: 'productivity', + }, + + 'appointment-request-create': { + keywords: { + en: ['request appointment', 'appointment request', 'ask for appointment', 'submit booking request'], + de: ['Termin anfragen', 'Terminanfrage', 'um Termin bitten', 'Buchungsanfrage einreichen'], + }, + useCases: { + en: ['Request a consultation that requires provider approval', 'Submit a booking request for a high-demand time slot', 'Ask for an appointment outside regular booking hours'], + de: ['Eine Beratung anfragen, die eine Genehmigung des Anbieters erfordert', 'Eine Buchungsanfrage für einen stark nachgefragten Zeitslot einreichen', 'Einen Termin außerhalb der regulären Buchungszeiten anfragen'], + }, + category: 'productivity', + }, + + 'appointment-upsert-policy': { + keywords: { + en: ['appointment policy', 'booking policy', 'cancellation policy', 'appointment rules'], + de: ['Terminrichtlinie', 'Buchungsrichtlinie', 'Stornierungsrichtlinie', 'Terminregeln'], + }, + useCases: { + en: ['Set a 24-hour cancellation policy for appointments', 'Define no-show fees to reduce missed bookings', 'Update booking terms to require deposits for premium services'], + de: ['Eine 24-Stunden-Stornierungsrichtlinie für Termine festlegen', 'No-Show-Gebühren definieren, um verpasste Buchungen zu reduzieren', 'Buchungsbedingungen aktualisieren, um Anzahlungen für Premium-Dienste zu verlangen'], + }, + category: 'productivity', + }, + + 'appointment-configure': { + keywords: { + en: ['configure appointments', 'appointment settings', 'setup booking system', 'appointment configuration', 'manage availability'], + de: ['Termine konfigurieren', 'Termineinstellungen', 'Buchungssystem einrichten', 'Terminkonfiguration', 'Verfügbarkeit verwalten'], + }, + useCases: { + en: ['Set different availability hours for each day of the week', 'Configure buffer times between consecutive appointments', 'Adjust notification settings for booking confirmations and reminders'], + de: ['Verschiedene Verfügbarkeitszeiten für jeden Wochentag festlegen', 'Pufferzeiten zwischen aufeinanderfolgenden Terminen konfigurieren', 'Benachrichtigungseinstellungen für Buchungsbestätigungen und Erinnerungen anpassen'], + }, + category: 'productivity', + faq: { + en: [ + { + question: 'How do I configure my appointment system?', + answer: + 'Set up your availability, booking rules, and notification preferences through the configuration action. You can define time slots, buffer times, and cancellation policies.', + }, + { + question: 'Can I set different availability for different days?', + answer: + 'Yes, the configuration allows you to set custom availability per day of the week, including different time slots and blocked-off periods.', + }, + ], + de: [ + { + question: 'Wie konfiguriere ich mein Terminsystem?', + answer: + 'Richte deine Verfügbarkeit, Buchungsregeln und Benachrichtigungseinstellungen über die Konfigurationsaktion ein. Du kannst Zeitslots, Pufferzeiten und Stornierungsrichtlinien festlegen.', + }, + { + question: 'Kann ich verschiedene Verfügbarkeiten für verschiedene Tage festlegen?', + answer: + 'Ja, die Konfiguration ermöglicht es dir, benutzerdefinierte Verfügbarkeiten pro Wochentag festzulegen, einschließlich verschiedener Zeitslots und gesperrter Zeiträume.', + }, + ], + }, + }, +} diff --git a/warps/asset/meta.ts b/warps/asset/meta.ts new file mode 100644 index 0000000..2a63856 --- /dev/null +++ b/warps/asset/meta.ts @@ -0,0 +1,41 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'transfer': { + keywords: { + en: ['transfer assets', 'send tokens', 'MultiversX transfer', 'send EGLD', 'send ESDT', 'token transfer', 'crypto transfer', 'send NFT'], + de: ['Vermögenswerte übertragen', 'Token senden', 'MultiversX Übertragung', 'EGLD senden', 'ESDT senden', 'Token-Transfer', 'Krypto-Transfer', 'NFT senden'], + }, + useCases: { + en: ['Send EGLD to a friend or business partner on MultiversX', 'Transfer ESDT tokens between your own wallets', 'Send an NFT or SFT to a buyer after a sale'], + de: ['EGLD an einen Freund oder Geschäftspartner auf MultiversX senden', 'ESDT-Token zwischen deinen eigenen Wallets übertragen', 'Ein NFT oder SFT nach einem Verkauf an einen Käufer senden'], + }, + category: 'defi', + faq: { + en: [ + { + question: 'How do I transfer assets on MultiversX?', + answer: + 'Send EGLD, ESDT tokens, or NFTs to any MultiversX address by specifying the recipient, token, and amount to execute the transfer.', + }, + { + question: 'What assets can I transfer?', + answer: + 'You can transfer native EGLD, any ESDT fungible token, NFTs, and SFTs on the MultiversX blockchain.', + }, + ], + de: [ + { + question: 'Wie übertrage ich Vermögenswerte auf MultiversX?', + answer: + 'Sende EGLD, ESDT-Token oder NFTs an eine beliebige MultiversX-Adresse, indem du den Empfänger, Token und Betrag angibst, um die Übertragung auszuführen.', + }, + { + question: 'Welche Vermögenswerte kann ich übertragen?', + answer: + 'Du kannst natives EGLD, beliebige fungible ESDT-Token, NFTs und SFTs auf der MultiversX-Blockchain übertragen.', + }, + ], + }, + }, +} diff --git a/warps/colombia-staking/meta.ts b/warps/colombia-staking/meta.ts new file mode 100644 index 0000000..43b7603 --- /dev/null +++ b/warps/colombia-staking/meta.ts @@ -0,0 +1,90 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'stake-egld': { + keywords: { + en: ['stake eGold', 'EGLD staking', 'Colombia Staking', 'MultiversX staking', 'delegate EGLD Colombia'], + de: ['eGold staken', 'EGLD Staking', 'Colombia Staking', 'MultiversX Staking', 'EGLD an Colombia delegieren'], + }, + useCases: { + en: ['Earn passive income on EGLD', 'Delegate eGold to Colombia Staking validators', 'Support MultiversX network security'], + de: ['Passives Einkommen mit EGLD verdienen', 'eGold an Colombia Staking-Validatoren delegieren', 'MultiversX-Netzwerksicherheit unterstutzen'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I stake EGLD with Colombia Staking?', + answer: + 'You can delegate your EGLD to the Colombia Staking provider directly through this action. Your staked EGLD earns rewards automatically.', + }, + { + question: 'Is Colombia Staking a reliable provider?', + answer: + 'Colombia Staking is a MultiversX staking provider that operates validator nodes and distributes rewards to its delegators.', + }, + ], + de: [ + { + question: 'Wie stake ich EGLD mit Colombia Staking?', + answer: + 'Du kannst deine EGLD direkt über diese Aktion an den Colombia Staking-Anbieter delegieren. Deine gestakten EGLD verdienen automatisch Belohnungen.', + }, + { + question: 'Ist Colombia Staking ein zuverlässiger Anbieter?', + answer: + 'Colombia Staking ist ein MultiversX-Staking-Anbieter, der Validator-Knoten betreibt und Belohnungen an seine Delegierer verteilt.', + }, + ], + }, + }, + 'claim-rewards': { + keywords: { + en: ['claim staking rewards', 'Colombia Staking rewards', 'collect EGLD rewards', 'claim Colombia delegation rewards'], + de: ['Staking-Belohnungen einfordern', 'Colombia Staking Belohnungen', 'EGLD Belohnungen einsammeln', 'Colombia Delegationsbelohnungen einfordern'], + }, + useCases: { + en: ['Collect accumulated EGLD staking rewards', 'Withdraw earned eGold from Colombia Staking', 'Manage staking delegations'], + de: ['Angesammelte EGLD-Staking-Belohnungen einsammeln', 'Verdientes eGold von Colombia Staking abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I claim my Colombia Staking rewards?', + answer: + 'Use this action to collect your accumulated EGLD staking rewards from the Colombia Staking provider. Rewards are sent directly to your wallet.', + }, + ], + de: [ + { + question: 'Wie fordere ich meine Colombia Staking-Belohnungen ein?', + answer: + 'Nutze diese Aktion, um deine angesammelten EGLD-Staking-Belohnungen vom Colombia Staking-Anbieter einzusammeln. Die Belohnungen werden direkt an dein Wallet gesendet.', + }, + ], + }, + }, + 'redelegate-egld': { + keywords: { + en: ['redelegate EGLD', 'Colombia Staking redelegate', 'compound staking rewards', 'restake EGLD Colombia'], + de: ['EGLD redelegieren', 'Colombia Staking Redelegation', 'Staking-Belohnungen reinvestieren', 'EGLD bei Colombia restaken'], + }, + useCases: { + en: ['Compound staking rewards automatically', 'Maximize EGLD earnings over time', 'Restake eGold with Colombia Staking'], + de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei Colombia Staking restaken'], + }, + category: 'staking', + }, + 'undelegate-egld': { + keywords: { + en: ['undelegate EGLD', 'unstake Colombia Staking', 'withdraw staked EGLD', 'remove Colombia delegation'], + de: ['EGLD undelegieren', 'Colombia Staking unstaken', 'gestakte EGLD abheben', 'Colombia Delegation entfernen'], + }, + useCases: { + en: ['Unstake EGLD from Colombia Staking', 'Withdraw staked eGold', 'Manage staking delegations'], + de: ['EGLD von Colombia Staking unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + }, +} diff --git a/warps/eapes/meta.ts b/warps/eapes/meta.ts new file mode 100644 index 0000000..76d22ef --- /dev/null +++ b/warps/eapes/meta.ts @@ -0,0 +1,90 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'stake-egld': { + keywords: { + en: ['stake eGold', 'EGLD staking', 'EAPES staking', 'MultiversX staking', 'delegate EGLD EAPES'], + de: ['eGold staken', 'EGLD Staking', 'EAPES Staking', 'MultiversX Staking', 'EGLD an EAPES delegieren'], + }, + useCases: { + en: ['Earn passive income on EGLD', 'Delegate eGold to EAPES validators', 'Support MultiversX network security'], + de: ['Passives Einkommen mit EGLD verdienen', 'eGold an EAPES-Validatoren delegieren', 'MultiversX-Netzwerksicherheit unterstutzen'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I stake EGLD with EAPES?', + answer: + 'You can delegate your EGLD to the EAPES staking provider directly through this action. Your staked EGLD earns rewards automatically.', + }, + { + question: 'What are the rewards for staking with EAPES?', + answer: + 'EAPES distributes staking rewards to delegators based on the MultiversX network APR, minus a small service fee.', + }, + ], + de: [ + { + question: 'Wie stake ich EGLD mit EAPES?', + answer: + 'Du kannst deine EGLD direkt über diese Aktion an den EAPES-Staking-Anbieter delegieren. Deine gestakten EGLD verdienen automatisch Belohnungen.', + }, + { + question: 'Welche Belohnungen gibt es beim Staking mit EAPES?', + answer: + 'EAPES verteilt Staking-Belohnungen an Delegierer basierend auf dem MultiversX-Netzwerk-APR, abzüglich einer kleinen Servicegebühr.', + }, + ], + }, + }, + 'claim-rewards': { + keywords: { + en: ['claim staking rewards', 'EAPES rewards', 'collect EGLD rewards', 'claim EAPES delegation rewards'], + de: ['Staking-Belohnungen einfordern', 'EAPES Belohnungen', 'EGLD Belohnungen einsammeln', 'EAPES Delegationsbelohnungen einfordern'], + }, + useCases: { + en: ['Collect accumulated EGLD staking rewards', 'Withdraw earned eGold from EAPES', 'Manage staking delegations'], + de: ['Angesammelte EGLD-Staking-Belohnungen einsammeln', 'Verdientes eGold von EAPES abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I claim my EAPES staking rewards?', + answer: + 'Use this action to collect your accumulated EGLD staking rewards from the EAPES provider. Rewards are sent directly to your wallet.', + }, + ], + de: [ + { + question: 'Wie fordere ich meine EAPES-Staking-Belohnungen ein?', + answer: + 'Nutze diese Aktion, um deine angesammelten EGLD-Staking-Belohnungen vom EAPES-Anbieter einzusammeln. Die Belohnungen werden direkt an dein Wallet gesendet.', + }, + ], + }, + }, + 'redelegate-egld': { + keywords: { + en: ['redelegate EGLD', 'EAPES redelegate', 'compound staking rewards', 'restake EGLD EAPES'], + de: ['EGLD redelegieren', 'EAPES Redelegation', 'Staking-Belohnungen reinvestieren', 'EGLD bei EAPES restaken'], + }, + useCases: { + en: ['Compound staking rewards automatically', 'Maximize EGLD earnings over time', 'Restake eGold with EAPES'], + de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei EAPES restaken'], + }, + category: 'staking', + }, + 'undelegate-egld': { + keywords: { + en: ['undelegate EGLD', 'unstake EAPES', 'withdraw staked EGLD', 'remove EAPES delegation'], + de: ['EGLD undelegieren', 'EAPES unstaken', 'gestakte EGLD abheben', 'EAPES Delegation entfernen'], + }, + useCases: { + en: ['Unstake EGLD from EAPES', 'Withdraw staked eGold', 'Manage staking delegations'], + de: ['EGLD von EAPES unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + }, +} diff --git a/warps/hatom/meta.ts b/warps/hatom/meta.ts new file mode 100644 index 0000000..34fe8ee --- /dev/null +++ b/warps/hatom/meta.ts @@ -0,0 +1,65 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'liquid-stake': { + keywords: { + en: ['liquid staking', 'stake EGLD', 'Hatom stake', 'sEGLD', 'MultiversX liquid staking', 'Hatom protocol', 'earn staking rewards'], + de: ['Liquid Staking', 'EGLD staken', 'Hatom Staking', 'sEGLD', 'MultiversX Liquid Staking', 'Hatom Protokoll', 'Staking-Belohnungen verdienen'], + }, + useCases: { + en: ['Stake EGLD on Hatom to earn sEGLD rewards passively', 'Get liquid staking tokens to use as collateral in DeFi protocols', 'Earn staking yield without locking up your EGLD'], + de: ['EGLD auf Hatom staken, um passiv sEGLD-Belohnungen zu verdienen', 'Liquid-Staking-Token erhalten, um sie als Sicherheit in DeFi-Protokollen zu verwenden', 'Staking-Rendite verdienen, ohne dein EGLD zu sperren'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How does liquid staking with Hatom work?', + answer: + 'You stake EGLD through Hatom and receive sEGLD in return, a liquid staking token that accrues staking rewards while remaining transferable and usable in DeFi.', + }, + { + question: 'What are the benefits of liquid staking over regular staking?', + answer: + 'Liquid staking gives you sEGLD which earns staking rewards while staying liquid. You can use sEGLD in DeFi protocols for additional yield, unlike regular staked EGLD which is locked.', + }, + ], + de: [ + { + question: 'Wie funktioniert Liquid Staking mit Hatom?', + answer: + 'Du stakest EGLD über Hatom und erhältst im Gegenzug sEGLD, einen Liquid-Staking-Token, der Staking-Belohnungen ansammelt und dabei übertragbar und in DeFi nutzbar bleibt.', + }, + { + question: 'Welche Vorteile hat Liquid Staking gegenüber normalem Staking?', + answer: + 'Liquid Staking gibt dir sEGLD, das Staking-Belohnungen verdient und dabei liquide bleibt. Du kannst sEGLD in DeFi-Protokollen für zusätzliche Rendite nutzen, im Gegensatz zu regulär gestaktem EGLD, das gesperrt ist.', + }, + ], + }, + }, + + 'liquid-unstake': { + keywords: { + en: ['unstake EGLD', 'Hatom unstake', 'redeem sEGLD', 'liquid unstaking', 'withdraw staked EGLD'], + de: ['EGLD entstaken', 'Hatom Entstaking', 'sEGLD einlösen', 'Liquid Entstaking', 'gestaktes EGLD abheben'], + }, + useCases: { + en: ['Convert sEGLD back to EGLD when you need liquidity', 'Unstake after earning sufficient staking rewards on Hatom', 'Begin the withdrawal process to reclaim your original EGLD'], + de: ['sEGLD zurück in EGLD umwandeln, wenn du Liquidität benötigst', 'Entstaken, nachdem du ausreichende Staking-Belohnungen auf Hatom verdient hast', 'Den Abhebungsprozess starten, um dein ursprüngliches EGLD zurückzufordern'], + }, + category: 'staking', + }, + + 'liquid-withdraw': { + keywords: { + en: ['withdraw EGLD', 'Hatom withdraw', 'claim unstaked EGLD', 'collect staking withdrawal'], + de: ['EGLD abheben', 'Hatom Abhebung', 'entstaktes EGLD beanspruchen', 'Staking-Abhebung einsammeln'], + }, + useCases: { + en: ['Claim EGLD after the unstaking cooldown period ends', 'Collect your withdrawn staking funds into your wallet', 'Finalize the exit from Hatom liquid staking'], + de: ['EGLD nach Ablauf der Entstaking-Abklingzeit beanspruchen', 'Deine abgehobenen Staking-Mittel in dein Wallet einsammeln', 'Den Ausstieg aus dem Hatom Liquid Staking abschließen'], + }, + category: 'staking', + }, +} diff --git a/warps/inception-network/meta.ts b/warps/inception-network/meta.ts new file mode 100644 index 0000000..538f01d --- /dev/null +++ b/warps/inception-network/meta.ts @@ -0,0 +1,90 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'stake-egld': { + keywords: { + en: ['stake eGold', 'EGLD staking', 'Inception Network staking', 'MultiversX staking', 'delegate EGLD Inception'], + de: ['eGold staken', 'EGLD Staking', 'Inception Network Staking', 'MultiversX Staking', 'EGLD an Inception delegieren'], + }, + useCases: { + en: ['Earn passive income on EGLD', 'Delegate eGold to Inception Network validators', 'Support MultiversX network security'], + de: ['Passives Einkommen mit EGLD verdienen', 'eGold an Inception Network-Validatoren delegieren', 'MultiversX-Netzwerksicherheit unterstutzen'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I stake EGLD with Inception Network?', + answer: + 'You can delegate your EGLD to the Inception Network staking provider directly through this action. Your staked EGLD earns rewards automatically.', + }, + { + question: 'What makes Inception Network different as a staking provider?', + answer: + 'Inception Network operates MultiversX validator nodes and distributes staking rewards to delegators based on the network APR.', + }, + ], + de: [ + { + question: 'Wie stake ich EGLD mit Inception Network?', + answer: + 'Du kannst deine EGLD direkt über diese Aktion an den Inception Network-Staking-Anbieter delegieren. Deine gestakten EGLD verdienen automatisch Belohnungen.', + }, + { + question: 'Was unterscheidet Inception Network als Staking-Anbieter?', + answer: + 'Inception Network betreibt MultiversX-Validator-Knoten und verteilt Staking-Belohnungen an Delegierer basierend auf dem Netzwerk-APR.', + }, + ], + }, + }, + 'claim-rewards': { + keywords: { + en: ['claim staking rewards', 'Inception Network rewards', 'collect EGLD rewards', 'claim Inception delegation rewards'], + de: ['Staking-Belohnungen einfordern', 'Inception Network Belohnungen', 'EGLD Belohnungen einsammeln', 'Inception Delegationsbelohnungen einfordern'], + }, + useCases: { + en: ['Collect accumulated EGLD staking rewards', 'Withdraw earned eGold from Inception Network', 'Manage staking delegations'], + de: ['Angesammelte EGLD-Staking-Belohnungen einsammeln', 'Verdientes eGold von Inception Network abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I claim my Inception Network staking rewards?', + answer: + 'Use this action to collect your accumulated EGLD staking rewards from Inception Network. Rewards are sent directly to your wallet.', + }, + ], + de: [ + { + question: 'Wie fordere ich meine Inception Network-Staking-Belohnungen ein?', + answer: + 'Nutze diese Aktion, um deine angesammelten EGLD-Staking-Belohnungen von Inception Network einzusammeln. Die Belohnungen werden direkt an dein Wallet gesendet.', + }, + ], + }, + }, + 'redelegate-egld': { + keywords: { + en: ['redelegate EGLD', 'Inception Network redelegate', 'compound staking rewards', 'restake EGLD Inception'], + de: ['EGLD redelegieren', 'Inception Network Redelegation', 'Staking-Belohnungen reinvestieren', 'EGLD bei Inception restaken'], + }, + useCases: { + en: ['Compound staking rewards automatically', 'Maximize EGLD earnings over time', 'Restake eGold with Inception Network'], + de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei Inception Network restaken'], + }, + category: 'staking', + }, + 'undelegate-egld': { + keywords: { + en: ['undelegate EGLD', 'unstake Inception Network', 'withdraw staked EGLD', 'remove Inception delegation'], + de: ['EGLD undelegieren', 'Inception Network unstaken', 'gestakte EGLD abheben', 'Inception Delegation entfernen'], + }, + useCases: { + en: ['Unstake EGLD from Inception Network', 'Withdraw staked eGold', 'Manage staking delegations'], + de: ['EGLD von Inception Network unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + }, +} diff --git a/warps/joai/meta.ts b/warps/joai/meta.ts new file mode 100644 index 0000000..cd7d3ae --- /dev/null +++ b/warps/joai/meta.ts @@ -0,0 +1,98 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'meeting-start': { + keywords: { + en: ['AI meeting recorder', 'meeting transcription', 'automated meeting notes', 'voice recording AI', 'meeting summary'], + de: ['KI Meeting Aufnahme', 'Meeting Transkription', 'automatische Meetingnotizen', 'KI Sprachaufnahme', 'Meeting Zusammenfassung'], + }, + useCases: { + en: [ + 'Record team standup meetings with automatic transcription', + 'Generate meeting summaries and action items automatically', + 'Capture client calls and create follow-up notes', + 'Document brainstorming sessions without manual note-taking', + ], + de: [ + 'Team-Standups mit automatischer Transkription aufzeichnen', + 'Meeting-Zusammenfassungen und Aufgaben automatisch erstellen', + 'Kundengespräche aufnehmen und Follow-up-Notizen erstellen', + 'Brainstorming-Sitzungen ohne manuelles Mitschreiben dokumentieren', + ], + }, + category: 'productivity', + faq: { + en: [ + { + question: 'How does the AI meeting recorder work?', + answer: + 'Simply start a meeting with your AI agent. It automatically records and transcribes the conversation in real-time, generating notes and summaries you can review afterwards.', + }, + { + question: 'What languages are supported for transcription?', + answer: + 'The meeting transcription supports multiple languages including English and German, with automatic language detection.', + }, + { + question: 'Is the meeting recording stored securely?', + answer: + 'Yes, all meeting recordings and transcriptions are securely stored and only accessible to you and your team.', + }, + ], + de: [ + { + question: 'Wie funktioniert die KI-Meeting-Aufnahme?', + answer: + 'Starte einfach ein Meeting mit deinem KI-Agenten. Er nimmt das Gespräch automatisch auf und transkribiert es in Echtzeit.', + }, + { + question: 'Welche Sprachen werden für die Transkription unterstützt?', + answer: + 'Die Meeting-Transkription unterstützt mehrere Sprachen, darunter Englisch und Deutsch, mit automatischer Spracherkennung.', + }, + { + question: 'Wird die Meeting-Aufnahme sicher gespeichert?', + answer: + 'Ja, alle Meeting-Aufnahmen und Transkriptionen werden sicher gespeichert und sind nur für dich und dein Team zugänglich.', + }, + ], + }, + }, + 'memory-create': { + keywords: { + en: ['AI memory', 'agent knowledge base', 'save information AI', 'persistent AI context'], + de: ['KI Gedächtnis', 'Agenten Wissensbasis', 'Informationen speichern KI', 'persistenter KI-Kontext'], + }, + useCases: { + en: [ + 'Save project-specific context for your AI agent to remember', + 'Store personal preferences and working style instructions', + 'Build a knowledge base of recurring tasks and workflows', + 'Persist important decisions and background information across chats', + ], + de: [ + 'Projektspezifischen Kontext für deinen KI-Agenten speichern', + 'Persönliche Präferenzen und Arbeitsstil-Anweisungen hinterlegen', + 'Eine Wissensbasis für wiederkehrende Aufgaben und Workflows aufbauen', + 'Wichtige Entscheidungen und Hintergrundinformationen über Chats hinweg bewahren', + ], + }, + category: 'productivity', + faq: { + en: [ + { + question: 'What is an AI agent memory?', + answer: + 'An AI agent memory is a piece of information saved to your agent\'s knowledge base, allowing it to remember context across conversations.', + }, + ], + de: [ + { + question: 'Was ist ein KI-Agenten-Gedächtnis?', + answer: + 'Ein KI-Agenten-Gedächtnis ist eine Information, die in der Wissensbasis deines Agenten gespeichert wird, sodass er sich über Gespräche hinweg an den Kontext erinnern kann.', + }, + ], + }, + }, +} diff --git a/warps/mregld/meta.ts b/warps/mregld/meta.ts new file mode 100644 index 0000000..06ee7f2 --- /dev/null +++ b/warps/mregld/meta.ts @@ -0,0 +1,90 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'stake-egld': { + keywords: { + en: ['stake eGold', 'EGLD staking', 'MrEGLD staking', 'MultiversX staking', 'delegate EGLD MrEGLD'], + de: ['eGold staken', 'EGLD Staking', 'MrEGLD Staking', 'MultiversX Staking', 'EGLD an MrEGLD delegieren'], + }, + useCases: { + en: ['Earn passive income on EGLD', 'Delegate eGold to MrEGLD validators', 'Support MultiversX network security'], + de: ['Passives Einkommen mit EGLD verdienen', 'eGold an MrEGLD-Validatoren delegieren', 'MultiversX-Netzwerksicherheit unterstutzen'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I stake EGLD with MrEGLD?', + answer: + 'You can delegate your EGLD to the MrEGLD staking provider directly through this action. Your staked EGLD earns rewards automatically.', + }, + { + question: 'What are the rewards for staking with MrEGLD?', + answer: + 'MrEGLD distributes staking rewards to delegators based on the MultiversX network APR, minus a small service fee.', + }, + ], + de: [ + { + question: 'Wie stake ich EGLD mit MrEGLD?', + answer: + 'Du kannst deine EGLD direkt über diese Aktion an den MrEGLD-Staking-Anbieter delegieren. Deine gestakten EGLD verdienen automatisch Belohnungen.', + }, + { + question: 'Welche Belohnungen gibt es beim Staking mit MrEGLD?', + answer: + 'MrEGLD verteilt Staking-Belohnungen an Delegierer basierend auf dem MultiversX-Netzwerk-APR, abzüglich einer kleinen Servicegebühr.', + }, + ], + }, + }, + 'claim-rewards': { + keywords: { + en: ['claim staking rewards', 'MrEGLD rewards', 'collect EGLD rewards', 'claim MrEGLD delegation rewards'], + de: ['Staking-Belohnungen einfordern', 'MrEGLD Belohnungen', 'EGLD Belohnungen einsammeln', 'MrEGLD Delegationsbelohnungen einfordern'], + }, + useCases: { + en: ['Collect accumulated EGLD staking rewards', 'Withdraw earned eGold from MrEGLD', 'Manage staking delegations'], + de: ['Angesammelte EGLD-Staking-Belohnungen einsammeln', 'Verdientes eGold von MrEGLD abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I claim my MrEGLD staking rewards?', + answer: + 'Use this action to collect your accumulated EGLD staking rewards from MrEGLD. Rewards are sent directly to your wallet.', + }, + ], + de: [ + { + question: 'Wie fordere ich meine MrEGLD-Staking-Belohnungen ein?', + answer: + 'Nutze diese Aktion, um deine angesammelten EGLD-Staking-Belohnungen von MrEGLD einzusammeln. Die Belohnungen werden direkt an dein Wallet gesendet.', + }, + ], + }, + }, + 'redelegate-egld': { + keywords: { + en: ['redelegate EGLD', 'MrEGLD redelegate', 'compound staking rewards', 'restake EGLD MrEGLD'], + de: ['EGLD redelegieren', 'MrEGLD Redelegation', 'Staking-Belohnungen reinvestieren', 'EGLD bei MrEGLD restaken'], + }, + useCases: { + en: ['Compound staking rewards automatically', 'Maximize EGLD earnings over time', 'Restake eGold with MrEGLD'], + de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei MrEGLD restaken'], + }, + category: 'staking', + }, + 'undelegate-egld': { + keywords: { + en: ['undelegate EGLD', 'unstake MrEGLD', 'withdraw staked EGLD', 'remove MrEGLD delegation'], + de: ['EGLD undelegieren', 'MrEGLD unstaken', 'gestakte EGLD abheben', 'MrEGLD Delegation entfernen'], + }, + useCases: { + en: ['Unstake EGLD from MrEGLD', 'Withdraw staked eGold', 'Manage staking delegations'], + de: ['EGLD von MrEGLD unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + }, +} diff --git a/warps/multiversx/meta.ts b/warps/multiversx/meta.ts new file mode 100644 index 0000000..6191df6 --- /dev/null +++ b/warps/multiversx/meta.ts @@ -0,0 +1,586 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'account-info': { + keywords: { + en: ['MultiversX account info', 'EGLD wallet balance', 'MultiversX address lookup', 'eGold account details', 'MultiversX wallet viewer'], + de: ['MultiversX Kontoinformationen', 'EGLD Wallet-Guthaben', 'MultiversX Adressabfrage', 'eGold Kontodetails', 'MultiversX Wallet-Anzeige'], + }, + useCases: { + en: ['Check EGLD balance for any MultiversX wallet address', 'Verify account shard assignment and nonce', 'Audit on-chain account properties before transactions', 'Monitor wallet status for portfolio tracking'], + de: ['EGLD-Guthaben fuer jede MultiversX-Wallet-Adresse pruefen', 'Shard-Zuweisung und Nonce des Kontos verifizieren', 'On-Chain-Kontoeigenschaften vor Transaktionen pruefen', 'Wallet-Status fuer Portfolio-Tracking ueberwachen'], + }, + category: 'analytics', + faq: { + en: [ + { + question: 'What information can I see about a MultiversX account?', + answer: + 'You can view the account balance, nonce, shard assignment, and other on-chain details associated with any MultiversX address.', + }, + { + question: 'Do I need to connect a wallet to view account information?', + answer: + 'No, you can look up any public MultiversX address. Connecting a wallet is only needed if you want to view your own account quickly.', + }, + ], + de: [ + { + question: 'Welche Informationen kann ich zu einem MultiversX-Konto einsehen?', + answer: + 'Du kannst den Kontostand, die Nonce, die Shard-Zuweisung und weitere On-Chain-Details zu jeder MultiversX-Adresse einsehen.', + }, + { + question: 'Muss ich eine Wallet verbinden, um Kontoinformationen anzuzeigen?', + answer: + 'Nein, du kannst jede öffentliche MultiversX-Adresse nachschlagen. Eine Wallet-Verbindung ist nur nötig, wenn du dein eigenes Konto schnell einsehen möchtest.', + }, + ], + }, + }, + 'account-tokens': { + keywords: { + en: ['MultiversX token balance', 'ESDT tokens list', 'MultiversX wallet tokens', 'eGold token portfolio', 'MultiversX token viewer'], + de: ['MultiversX Token-Guthaben', 'ESDT Token-Liste', 'MultiversX Wallet-Token', 'eGold Token-Portfolio', 'MultiversX Token-Anzeige'], + }, + useCases: { + en: ['Review ESDT token holdings for any MultiversX address', 'Track token portfolio balances across wallets', 'Verify token receipts after trades or transfers', 'Analyze token distribution for research purposes'], + de: ['ESDT-Token-Bestaende fuer jede MultiversX-Adresse einsehen', 'Token-Portfolio-Guthaben ueber Wallets hinweg verfolgen', 'Token-Eingaenge nach Trades oder Transfers verifizieren', 'Token-Verteilung fuer Recherchezwecke analysieren'], + }, + category: 'analytics', + faq: { + en: [ + { + question: 'What tokens will I see for a MultiversX account?', + answer: + 'You will see all ESDT fungible tokens held by the account, including their balances and token identifiers.', + }, + { + question: 'Can I view tokens for any MultiversX address?', + answer: + 'Yes, token holdings are public on-chain data and can be viewed for any valid MultiversX address.', + }, + ], + de: [ + { + question: 'Welche Token werden mir für ein MultiversX-Konto angezeigt?', + answer: + 'Du siehst alle fungiblen ESDT-Token des Kontos, einschließlich ihrer Guthaben und Token-Bezeichner.', + }, + { + question: 'Kann ich die Token jeder MultiversX-Adresse einsehen?', + answer: + 'Ja, Token-Bestände sind öffentliche On-Chain-Daten und können für jede gültige MultiversX-Adresse eingesehen werden.', + }, + ], + }, + }, + 'account-nfts': { + keywords: { + en: ['MultiversX NFTs', 'ESDT NFT collection', 'MultiversX NFT viewer', 'eGold NFT portfolio', 'view MultiversX NFTs'], + de: ['MultiversX NFTs', 'ESDT NFT-Sammlung', 'MultiversX NFT-Anzeige', 'eGold NFT-Portfolio', 'MultiversX NFTs anzeigen'], + }, + useCases: { + en: ['View NFT and SFT collections for any MultiversX address', 'Verify NFT ownership and metadata on-chain', 'Track NFT portfolio value and holdings', 'Explore collection attributes and rarity data'], + de: ['NFT- und SFT-Sammlungen fuer jede MultiversX-Adresse anzeigen', 'NFT-Eigentumsrechte und Metadaten on-chain verifizieren', 'NFT-Portfolio-Wert und Bestaende verfolgen', 'Sammlungsattribute und Seltenheitsdaten erkunden'], + }, + category: 'analytics', + faq: { + en: [ + { + question: 'What types of NFTs does this show?', + answer: + 'It displays all non-fungible and semi-fungible ESDT tokens (NFTs and SFTs) held by the account, including their metadata and collection info.', + }, + { + question: 'Can I see NFT images and attributes?', + answer: + 'Yes, the viewer shows available metadata such as name, image, and attributes for each NFT in the account.', + }, + ], + de: [ + { + question: 'Welche Arten von NFTs werden hier angezeigt?', + answer: + 'Es werden alle nicht-fungiblen und semi-fungiblen ESDT-Token (NFTs und SFTs) des Kontos angezeigt, einschließlich ihrer Metadaten und Sammlungsinformationen.', + }, + { + question: 'Kann ich NFT-Bilder und Attribute sehen?', + answer: + 'Ja, die Anzeige zeigt verfügbare Metadaten wie Name, Bild und Attribute für jedes NFT im Konto.', + }, + ], + }, + }, + 'account-transactions': { + keywords: { + en: ['MultiversX transaction history', 'EGLD transactions', 'MultiversX address transactions', 'eGold transfer history', 'MultiversX activity log'], + de: ['MultiversX Transaktionsverlauf', 'EGLD Transaktionen', 'MultiversX Adress-Transaktionen', 'eGold Überweisungsverlauf', 'MultiversX Aktivitätsprotokoll'], + }, + useCases: { + en: ['Audit full transaction history for any MultiversX address', 'Track EGLD and token transfers over time', 'Monitor smart contract interactions and staking activity', 'Investigate suspicious or failed transactions'], + de: ['Vollstaendigen Transaktionsverlauf fuer jede MultiversX-Adresse pruefen', 'EGLD- und Token-Transfers ueber die Zeit verfolgen', 'Smart-Contract-Interaktionen und Staking-Aktivitaeten ueberwachen', 'Verdaechtige oder fehlgeschlagene Transaktionen untersuchen'], + }, + category: 'analytics', + faq: { + en: [ + { + question: 'How far back can I see transaction history?', + answer: + 'You can browse the full on-chain transaction history for any MultiversX address, going back to the first transaction on the account.', + }, + { + question: 'Does this show smart contract interactions?', + answer: + 'Yes, the transaction history includes all types of transactions such as transfers, staking operations, and smart contract calls.', + }, + ], + de: [ + { + question: 'Wie weit reicht der Transaktionsverlauf zurück?', + answer: + 'Du kannst den gesamten On-Chain-Transaktionsverlauf jeder MultiversX-Adresse durchsuchen, bis zur ersten Transaktion des Kontos.', + }, + { + question: 'Werden auch Smart-Contract-Interaktionen angezeigt?', + answer: + 'Ja, der Transaktionsverlauf umfasst alle Arten von Transaktionen wie Überweisungen, Staking-Vorgänge und Smart-Contract-Aufrufe.', + }, + ], + }, + }, + 'staking-claim-all': { + keywords: { + en: ['claim EGLD staking rewards', 'MultiversX staking claim', 'eGold staking rewards', 'claim all staking rewards MultiversX', 'EGLD delegation rewards'], + de: ['EGLD Staking-Belohnungen einfordern', 'MultiversX Staking-Auszahlung', 'eGold Staking-Belohnungen', 'alle Staking-Belohnungen einfordern MultiversX', 'EGLD Delegations-Belohnungen'], + }, + useCases: { + en: ['Collect EGLD staking rewards from all providers at once', 'Simplify reward management for multi-provider delegations', 'Harvest staking earnings to reinvest or trade', 'Automate periodic reward claiming for staking portfolios'], + de: ['EGLD-Staking-Belohnungen von allen Anbietern auf einmal einfordern', 'Belohnungsverwaltung fuer Multi-Anbieter-Delegationen vereinfachen', 'Staking-Einnahmen zur Reinvestition oder zum Handel ernten', 'Periodisches Einfordern von Belohnungen fuer Staking-Portfolios automatisieren'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'What does claiming all staking rewards do?', + answer: + 'It collects your accumulated eGold staking rewards from all staking providers in a single transaction, sending them to your wallet.', + }, + { + question: 'How often should I claim my staking rewards?', + answer: + 'You can claim at any time. Rewards accumulate continuously, so the frequency is up to you based on your preference and transaction fee considerations.', + }, + { + question: 'Do I need to unstake to claim my rewards?', + answer: + 'No, claiming rewards does not affect your staked eGold. Your delegation remains active while you collect the earned rewards.', + }, + ], + de: [ + { + question: 'Was bewirkt das Einfordern aller Staking-Belohnungen?', + answer: + 'Es sammelt deine angesammelten eGold-Staking-Belohnungen von allen Staking-Anbietern in einer einzigen Transaktion und sendet sie an deine Wallet.', + }, + { + question: 'Wie oft sollte ich meine Staking-Belohnungen einfordern?', + answer: + 'Du kannst jederzeit einfordern. Belohnungen sammeln sich fortlaufend an, daher liegt die Häufigkeit bei dir, abhängig von deinen Präferenzen und den Transaktionsgebühren.', + }, + { + question: 'Muss ich mein Staking auflösen, um Belohnungen einzufordern?', + answer: + 'Nein, das Einfordern von Belohnungen hat keinen Einfluss auf dein gestaktes eGold. Deine Delegation bleibt aktiv, während du die verdienten Belohnungen erhältst.', + }, + ], + }, + }, + 'staking-delegations': { + keywords: { + en: ['MultiversX staking delegations', 'EGLD staking positions', 'eGold delegation overview', 'MultiversX staking providers', 'view EGLD stake'], + de: ['MultiversX Staking-Delegationen', 'EGLD Staking-Positionen', 'eGold Delegationsübersicht', 'MultiversX Staking-Anbieter', 'EGLD Stake anzeigen'], + }, + useCases: { + en: ['Review staking positions across all MultiversX providers', 'Monitor claimable rewards for each delegation', 'Compare delegation amounts between staking providers', 'Track staking portfolio performance over time'], + de: ['Staking-Positionen bei allen MultiversX-Anbietern ueberpruefen', 'Einforderbare Belohnungen fuer jede Delegation ueberwachen', 'Delegationsbetraege zwischen Staking-Anbietern vergleichen', 'Staking-Portfolio-Performance ueber die Zeit verfolgen'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'What information does the delegations view show?', + answer: + 'It shows all your active staking positions, including the staking provider, delegated amount, and claimable rewards for each.', + }, + { + question: 'Can I see delegations for any address?', + answer: + 'Yes, staking delegations are on-chain data and can be viewed for any MultiversX address.', + }, + ], + de: [ + { + question: 'Welche Informationen zeigt die Delegationsansicht?', + answer: + 'Sie zeigt alle deine aktiven Staking-Positionen, einschließlich des Staking-Anbieters, des delegierten Betrags und der einforderbaren Belohnungen für jede Position.', + }, + { + question: 'Kann ich Delegationen für jede Adresse einsehen?', + answer: + 'Ja, Staking-Delegationen sind On-Chain-Daten und können für jede MultiversX-Adresse eingesehen werden.', + }, + ], + }, + }, + 'esdt-issue-fungible': { + keywords: { + en: ['create token MultiversX', 'issue ESDT token', 'MultiversX fungible token', 'launch token eGold', 'mint ESDT MultiversX'], + de: ['Token erstellen MultiversX', 'ESDT Token ausgeben', 'MultiversX fungibler Token', 'Token launchen eGold', 'ESDT prägen MultiversX'], + }, + useCases: { + en: ['Launch a new fungible token for a DeFi project on MultiversX', 'Create a community or governance token with custom supply', 'Issue reward tokens for loyalty or gaming platforms', 'Prototype tokenomics with configurable mint and burn properties'], + de: ['Einen neuen fungiblen Token fuer ein DeFi-Projekt auf MultiversX starten', 'Einen Community- oder Governance-Token mit benutzerdefinierter Menge erstellen', 'Belohnungstoken fuer Treue- oder Gaming-Plattformen ausgeben', 'Tokenomics mit konfigurierbaren Praege- und Burn-Eigenschaften prototypisieren'], + }, + category: 'defi', + faq: { + en: [ + { + question: 'What is an ESDT fungible token?', + answer: + 'ESDT (eStandard Digital Token) is the MultiversX token standard. A fungible ESDT token is interchangeable, similar to ERC-20 tokens on Ethereum.', + }, + { + question: 'What do I need to issue a fungible token on MultiversX?', + answer: + 'You need a MultiversX wallet with a small amount of EGLD to cover the issuance cost (0.05 EGLD) and transaction fees.', + }, + { + question: 'Can I configure token properties like supply and decimals?', + answer: + 'Yes, you can set the token name, ticker, initial supply, number of decimals, and properties such as mintable, burnable, and pausable.', + }, + ], + de: [ + { + question: 'Was ist ein fungibler ESDT-Token?', + answer: + 'ESDT (eStandard Digital Token) ist der MultiversX-Token-Standard. Ein fungibler ESDT-Token ist austauschbar, ähnlich wie ERC-20-Token auf Ethereum.', + }, + { + question: 'Was brauche ich, um einen fungiblen Token auf MultiversX auszugeben?', + answer: + 'Du benötigst eine MultiversX-Wallet mit einem kleinen Betrag an EGLD, um die Ausgabekosten (0,05 EGLD) und Transaktionsgebühren zu decken.', + }, + { + question: 'Kann ich Token-Eigenschaften wie Gesamtmenge und Dezimalstellen konfigurieren?', + answer: + 'Ja, du kannst den Token-Namen, das Kürzel, die anfängliche Gesamtmenge, die Anzahl der Dezimalstellen und Eigenschaften wie prägbar, burnable und pausierbar festlegen.', + }, + ], + }, + }, + 'esdt-nft-create': { + keywords: { + en: ['mint NFT MultiversX', 'create NFT eGold', 'ESDT NFT mint', 'MultiversX NFT creator', 'issue NFT MultiversX blockchain'], + de: ['NFT prägen MultiversX', 'NFT erstellen eGold', 'ESDT NFT prägen', 'MultiversX NFT-Ersteller', 'NFT ausgeben MultiversX Blockchain'], + }, + useCases: { + en: ['Mint individual NFTs within an existing MultiversX collection', 'Create digital art with custom royalties and metadata', 'Issue event tickets or membership passes as NFTs', 'Build NFT-based gaming assets with on-chain attributes'], + de: ['Einzelne NFTs innerhalb einer bestehenden MultiversX-Sammlung praegen', 'Digitale Kunst mit individuellen Lizenzgebuehren und Metadaten erstellen', 'Event-Tickets oder Mitgliedsausweise als NFTs ausgeben', 'NFT-basierte Gaming-Assets mit On-Chain-Attributen erstellen'], + }, + category: 'nft', + faq: { + en: [ + { + question: 'How do I mint an NFT on MultiversX?', + answer: + 'You need an existing NFT collection with the NFT create role assigned to your address. Then you can mint by providing the name, royalties, media, and attributes.', + }, + { + question: 'What media formats are supported for MultiversX NFTs?', + answer: + 'MultiversX NFTs support various media types including images, videos, and audio. The media is typically stored on IPFS or a similar decentralized storage.', + }, + ], + de: [ + { + question: 'Wie präge ich ein NFT auf MultiversX?', + answer: + 'Du brauchst eine bestehende NFT-Sammlung, bei der die NFT-Erstellungsrolle deiner Adresse zugewiesen ist. Dann kannst du prägen, indem du Name, Lizenzgebühren, Medien und Attribute angibst.', + }, + { + question: 'Welche Medienformate werden für MultiversX-NFTs unterstützt?', + answer: + 'MultiversX-NFTs unterstützen verschiedene Medientypen wie Bilder, Videos und Audio. Die Medien werden typischerweise auf IPFS oder einem ähnlichen dezentralen Speicher abgelegt.', + }, + ], + }, + }, + 'esdt-issue-nft-collection': { + keywords: { + en: ['create NFT collection MultiversX', 'issue NFT collection eGold', 'ESDT NFT collection', 'MultiversX NFT project', 'launch NFT collection MultiversX'], + de: ['NFT-Sammlung erstellen MultiversX', 'NFT-Sammlung ausgeben eGold', 'ESDT NFT-Sammlung', 'MultiversX NFT-Projekt', 'NFT-Sammlung starten MultiversX'], + }, + useCases: { + en: ['Launch a new NFT collection or project on MultiversX', 'Set up an on-chain container for minting digital art', 'Create branded NFT collections for communities or events', 'Establish a collection before assigning minting roles and creating NFTs'], + de: ['Eine neue NFT-Sammlung oder ein Projekt auf MultiversX starten', 'Einen On-Chain-Container fuer das Praegen digitaler Kunst einrichten', 'Marken-NFT-Sammlungen fuer Communities oder Events erstellen', 'Eine Sammlung einrichten, bevor Praegerollen zugewiesen und NFTs erstellt werden'], + }, + category: 'nft', + faq: { + en: [ + { + question: 'What is an NFT collection on MultiversX?', + answer: + 'An NFT collection is a registered token type on-chain under which individual NFTs can be minted. It acts as a container with a unique collection ticker.', + }, + { + question: 'How much does it cost to issue an NFT collection?', + answer: + 'Issuing an NFT collection on MultiversX costs 0.05 EGLD plus a small transaction fee.', + }, + { + question: 'What happens after I issue the collection?', + answer: + 'After issuing, you need to assign the NFT create role to your address before you can start minting individual NFTs within the collection.', + }, + ], + de: [ + { + question: 'Was ist eine NFT-Sammlung auf MultiversX?', + answer: + 'Eine NFT-Sammlung ist ein registrierter Token-Typ auf der Blockchain, unter dem einzelne NFTs geprägt werden können. Sie fungiert als Container mit einem einzigartigen Sammlungskürzel.', + }, + { + question: 'Wie viel kostet es, eine NFT-Sammlung auszugeben?', + answer: + 'Die Ausgabe einer NFT-Sammlung auf MultiversX kostet 0,05 EGLD zuzüglich einer kleinen Transaktionsgebühr.', + }, + { + question: 'Was passiert, nachdem ich die Sammlung ausgegeben habe?', + answer: + 'Nach der Ausgabe musst du die NFT-Erstellungsrolle deiner Adresse zuweisen, bevor du einzelne NFTs innerhalb der Sammlung prägen kannst.', + }, + ], + }, + }, + 'wrap-egld': { + keywords: { + en: ['wrap EGLD', 'WEGLD MultiversX', 'convert EGLD to WEGLD', 'wrapped eGold', 'EGLD wrapping'], + de: ['EGLD wrappen', 'WEGLD MultiversX', 'EGLD in WEGLD umwandeln', 'gewrapptes eGold', 'EGLD Wrapping'], + }, + useCases: { + en: ['Prepare EGLD for use in DeFi protocols and DEX trading', 'Convert to WEGLD for liquidity pool participation', 'Enable smart contract interactions that require ESDT tokens', 'Wrap EGLD before swapping on MultiversX decentralized exchanges'], + de: ['EGLD fuer die Nutzung in DeFi-Protokollen und DEX-Handel vorbereiten', 'In WEGLD fuer die Teilnahme an Liquiditaetspools umwandeln', 'Smart-Contract-Interaktionen ermoeglichen, die ESDT-Token erfordern', 'EGLD vor dem Tausch auf MultiversX-dezentralen Boersen wrappen'], + }, + category: 'defi', + faq: { + en: [ + { + question: 'Why do I need to wrap EGLD?', + answer: + 'Wrapped EGLD (WEGLD) is an ESDT token required by many MultiversX DeFi protocols and decentralized exchanges, since native EGLD cannot be used directly in smart contracts that expect ESDT tokens.', + }, + { + question: 'Is wrapping EGLD reversible?', + answer: + 'Yes, you can unwrap WEGLD back to native EGLD at any time at a 1:1 ratio with no loss of value.', + }, + ], + de: [ + { + question: 'Warum muss ich EGLD wrappen?', + answer: + 'Wrapped EGLD (WEGLD) ist ein ESDT-Token, der von vielen MultiversX-DeFi-Protokollen und dezentralen Börsen benötigt wird, da natives EGLD nicht direkt in Smart Contracts verwendet werden kann, die ESDT-Token erwarten.', + }, + { + question: 'Ist das Wrapping von EGLD umkehrbar?', + answer: + 'Ja, du kannst WEGLD jederzeit im Verhältnis 1:1 ohne Wertverlust zurück in natives EGLD unwrappen.', + }, + ], + }, + }, + 'unwrap-egld': { + keywords: { + en: ['unwrap WEGLD', 'WEGLD to EGLD', 'convert WEGLD', 'unwrap eGold', 'WEGLD unwrapping MultiversX'], + de: ['WEGLD unwrappen', 'WEGLD zu EGLD', 'WEGLD umwandeln', 'eGold unwrappen', 'WEGLD Unwrapping MultiversX'], + }, + useCases: { + en: ['Convert WEGLD back to native EGLD after DeFi trading', 'Reclaim native eGold from liquidity pool exits', 'Unwrap WEGLD for staking or direct transfers', 'Simplify wallet holdings by converting wrapped tokens back'], + de: ['WEGLD nach DeFi-Handel zurueck in natives EGLD umwandeln', 'Natives eGold nach Austritt aus Liquiditaetspools zurueckerhalten', 'WEGLD fuer Staking oder direkte Transfers unwrappen', 'Wallet-Bestaende durch Rueckumwandlung gewrappter Token vereinfachen'], + }, + category: 'defi', + faq: { + en: [ + { + question: 'How does unwrapping WEGLD work?', + answer: + 'Unwrapping converts your WEGLD ESDT token back to native EGLD at a 1:1 ratio through the official wrapping smart contract.', + }, + { + question: 'Are there any fees for unwrapping?', + answer: + 'There is no fee beyond the standard MultiversX transaction cost, which is very low.', + }, + ], + de: [ + { + question: 'Wie funktioniert das Unwrapping von WEGLD?', + answer: + 'Beim Unwrapping wird dein WEGLD-ESDT-Token über den offiziellen Wrapping-Smart-Contract im Verhältnis 1:1 zurück in natives EGLD umgewandelt.', + }, + { + question: 'Fallen Gebühren für das Unwrapping an?', + answer: + 'Es fallen keine Gebühren an, abgesehen von den standardmäßigen MultiversX-Transaktionskosten, die sehr gering sind.', + }, + ], + }, + }, + + // Keywords only + 'account-transaction-count': { + keywords: { + en: ['MultiversX transaction count', 'EGLD account nonce', 'MultiversX address activity', 'eGold transaction number'], + de: ['MultiversX Transaktionsanzahl', 'EGLD Konto-Nonce', 'MultiversX Adressaktivität', 'eGold Transaktionsnummer'], + }, + useCases: { + en: ['Check how active a MultiversX address has been', 'Verify account nonce before submitting transactions', 'Analyze address activity for research or compliance', 'Monitor account usage patterns over time'], + de: ['Pruefen, wie aktiv eine MultiversX-Adresse war', 'Konto-Nonce vor dem Einreichen von Transaktionen verifizieren', 'Adressaktivitaet fuer Recherche oder Compliance analysieren', 'Kontonutzungsmuster ueber die Zeit ueberwachen'], + }, + category: 'analytics', + }, + 'account-guardian-data': { + keywords: { + en: ['MultiversX guardian', 'EGLD account guardian', 'MultiversX 2FA', 'eGold account security', 'MultiversX account protection'], + de: ['MultiversX Guardian', 'EGLD Konto-Guardian', 'MultiversX 2FA', 'eGold Kontosicherheit', 'MultiversX Kontoschutz'], + }, + useCases: { + en: ['Verify if a MultiversX account has guardian protection enabled', 'Check 2FA security status for wallet auditing', 'Confirm guardian address configuration before sensitive operations', 'Assess account security posture for compliance reviews'], + de: ['Pruefen, ob ein MultiversX-Konto Guardian-Schutz aktiviert hat', '2FA-Sicherheitsstatus fuer Wallet-Audits ueberpruefen', 'Guardian-Adresskonfiguration vor sensiblen Vorgaengen bestaetigen', 'Kontosicherheitsstatus fuer Compliance-Pruefungen bewerten'], + }, + category: 'analytics', + }, + 'network-economics': { + keywords: { + en: ['MultiversX economics', 'EGLD supply', 'MultiversX staking APR', 'eGold market data', 'MultiversX network stats'], + de: ['MultiversX Wirtschaftsdaten', 'EGLD Gesamtmenge', 'MultiversX Staking-APR', 'eGold Marktdaten', 'MultiversX Netzwerkstatistiken'], + }, + useCases: { + en: ['Monitor EGLD supply and inflation metrics in real time', 'Track current staking APR for investment decisions', 'Analyze MultiversX market capitalization and economic health', 'Integrate network economics data into dashboards or reports'], + de: ['EGLD-Angebots- und Inflationskennzahlen in Echtzeit ueberwachen', 'Aktuellen Staking-APR fuer Investitionsentscheidungen verfolgen', 'MultiversX-Marktkapitalisierung und wirtschaftliche Gesundheit analysieren', 'Netzwerkoekonomie-Daten in Dashboards oder Berichte integrieren'], + }, + category: 'infrastructure', + }, + 'network-status': { + keywords: { + en: ['MultiversX network status', 'EGLD network health', 'MultiversX block height', 'eGold chain status', 'MultiversX uptime'], + de: ['MultiversX Netzwerkstatus', 'EGLD Netzwerkzustand', 'MultiversX Blockhöhe', 'eGold Chain-Status', 'MultiversX Verfügbarkeit'], + }, + useCases: { + en: ['Verify MultiversX network health before submitting transactions', 'Monitor block height and epoch progression', 'Check chain uptime and round information for validators', 'Integrate network status checks into automated workflows'], + de: ['MultiversX-Netzwerkzustand vor dem Einreichen von Transaktionen verifizieren', 'Blockhoehe und Epochenfortschritt ueberwachen', 'Chain-Verfuegbarkeit und Rundeninformationen fuer Validatoren pruefen', 'Netzwerkstatus-Pruefungen in automatisierte Workflows integrieren'], + }, + category: 'infrastructure', + }, + 'staking-claimable-rewards': { + keywords: { + en: ['MultiversX claimable rewards', 'EGLD staking rewards balance', 'check eGold staking earnings', 'MultiversX pending rewards'], + de: ['MultiversX einforderbare Belohnungen', 'EGLD Staking-Belohnungsguthaben', 'eGold Staking-Einnahmen prüfen', 'MultiversX ausstehende Belohnungen'], + }, + useCases: { + en: ['Check pending staking rewards before claiming', 'Monitor reward accumulation across staking providers', 'Plan optimal claim timing based on reward balance', 'Track staking yield performance for portfolio management'], + de: ['Ausstehende Staking-Belohnungen vor dem Einfordern pruefen', 'Belohnungsansammlung ueber Staking-Anbieter hinweg ueberwachen', 'Optimalen Einfordern-Zeitpunkt basierend auf Belohnungsguthaben planen', 'Staking-Rendite-Performance fuer Portfolio-Management verfolgen'], + }, + category: 'staking', + }, + 'staking-redelegate-all': { + keywords: { + en: ['redelegate EGLD', 'MultiversX redelegate staking', 'eGold restake rewards', 'MultiversX compound staking'], + de: ['EGLD redelegieren', 'MultiversX Staking redelegieren', 'eGold Belohnungen restaken', 'MultiversX Zinseszins-Staking'], + }, + useCases: { + en: ['Compound staking rewards automatically across all providers', 'Maximize EGLD staking yield through redelegation', 'Simplify reward reinvestment with one-click restaking', 'Grow staking positions over time without manual management'], + de: ['Staking-Belohnungen automatisch ueber alle Anbieter compoundieren', 'EGLD-Staking-Rendite durch Redelegation maximieren', 'Belohnungs-Reinvestition mit Ein-Klick-Restaking vereinfachen', 'Staking-Positionen ueber die Zeit ohne manuelle Verwaltung wachsen lassen'], + }, + category: 'staking', + }, + 'staking-claim': { + keywords: { + en: ['claim EGLD rewards', 'MultiversX staking claim provider', 'eGold delegation claim', 'MultiversX single provider claim'], + de: ['EGLD Belohnungen einfordern', 'MultiversX Staking-Auszahlung Anbieter', 'eGold Delegations-Auszahlung', 'MultiversX Einzelanbieter-Auszahlung'], + }, + useCases: { + en: ['Claim rewards from a specific staking provider selectively', 'Manage reward collection per delegation for tax tracking', 'Test reward claiming with a single provider before claiming all', 'Maintain separate reward schedules across different validators'], + de: ['Belohnungen selektiv von einem bestimmten Staking-Anbieter einfordern', 'Belohnungseinholung pro Delegation fuer Steuerverfolgung verwalten', 'Belohnungseinfordern mit einem einzelnen Anbieter testen, bevor alles eingefordert wird', 'Separate Belohnungszeitplaene ueber verschiedene Validatoren beibehalten'], + }, + category: 'staking', + }, + 'transaction-details': { + keywords: { + en: ['MultiversX transaction details', 'EGLD tx lookup', 'MultiversX transaction explorer', 'eGold transaction info'], + de: ['MultiversX Transaktionsdetails', 'EGLD Transaktionssuche', 'MultiversX Transaktions-Explorer', 'eGold Transaktionsinformationen'], + }, + useCases: { + en: ['Inspect transaction details by hash for debugging or verification', 'Review smart contract call results and gas consumption', 'Verify transfer amounts and recipients for auditing', 'Investigate failed transactions to understand error causes'], + de: ['Transaktionsdetails anhand des Hashs fuer Debugging oder Verifizierung pruefen', 'Smart-Contract-Aufrufergebnisse und Gasverbrauch ueberpruefen', 'Transferbetraege und Empfaenger fuer Audits verifizieren', 'Fehlgeschlagene Transaktionen untersuchen, um Fehlerursachen zu verstehen'], + }, + category: 'analytics', + }, + 'transaction-status': { + keywords: { + en: ['MultiversX transaction status', 'EGLD tx status check', 'MultiversX pending transaction', 'eGold transaction confirmation'], + de: ['MultiversX Transaktionsstatus', 'EGLD Transaktionsstatus prüfen', 'MultiversX ausstehende Transaktion', 'eGold Transaktionsbestätigung'], + }, + useCases: { + en: ['Confirm whether a transaction completed successfully', 'Monitor pending transactions until finality', 'Troubleshoot failed or stuck transactions', 'Verify transaction confirmation for payment processing'], + de: ['Bestaetigen, ob eine Transaktion erfolgreich abgeschlossen wurde', 'Ausstehende Transaktionen bis zur Finalitaet ueberwachen', 'Fehlgeschlagene oder haengende Transaktionen beheben', 'Transaktionsbestaetigung fuer Zahlungsabwicklung verifizieren'], + }, + category: 'analytics', + }, + 'token-details': { + keywords: { + en: ['MultiversX token details', 'ESDT token info', 'MultiversX token properties', 'eGold token lookup'], + de: ['MultiversX Token-Details', 'ESDT Token-Informationen', 'MultiversX Token-Eigenschaften', 'eGold Token-Suche'], + }, + useCases: { + en: ['Verify ESDT token properties before trading or investing', 'Look up token supply, decimals, and owner information', 'Check token configuration flags like mintable and burnable', 'Research token details for DeFi integration or analysis'], + de: ['ESDT-Token-Eigenschaften vor dem Handel oder der Investition verifizieren', 'Token-Angebot, Dezimalstellen und Eigentuemerinformationen nachschlagen', 'Token-Konfigurationsflags wie praegbar und brennbar pruefen', 'Token-Details fuer DeFi-Integration oder Analyse recherchieren'], + }, + category: 'defi', + }, + 'esdt-set-nft-create-role': { + keywords: { + en: ['NFT create role MultiversX', 'ESDT role assignment', 'MultiversX NFT permissions', 'assign NFT minting role eGold'], + de: ['NFT-Erstellungsrolle MultiversX', 'ESDT Rollenzuweisung', 'MultiversX NFT-Berechtigungen', 'NFT-Prägerolle zuweisen eGold'], + }, + useCases: { + en: ['Enable NFT minting permissions for a collection owner', 'Assign create roles to collaborators for shared NFT projects', 'Set up minting access after issuing a new NFT collection', 'Manage role-based access control for NFT creation workflows'], + de: ['NFT-Praegeberechtigungen fuer einen Sammlungseigentuemer aktivieren', 'Erstellungsrollen an Mitarbeiter fuer gemeinsame NFT-Projekte zuweisen', 'Praegezugang nach Ausgabe einer neuen NFT-Sammlung einrichten', 'Rollenbasierte Zugriffskontrolle fuer NFT-Erstellungs-Workflows verwalten'], + }, + category: 'nft', + }, + 'esdt-issue-sft-collection': { + keywords: { + en: ['SFT collection MultiversX', 'issue semi-fungible token', 'MultiversX SFT', 'create SFT collection eGold'], + de: ['SFT-Sammlung MultiversX', 'semi-fungiblen Token ausgeben', 'MultiversX SFT', 'SFT-Sammlung erstellen eGold'], + }, + useCases: { + en: ['Create SFT collections for event tickets or limited editions', 'Launch gaming item collections with multiple copies per token', 'Issue membership passes or vouchers as semi-fungible tokens', 'Build fractionalized asset representations on MultiversX'], + de: ['SFT-Sammlungen fuer Event-Tickets oder limitierte Editionen erstellen', 'Gaming-Item-Sammlungen mit mehreren Kopien pro Token starten', 'Mitgliedsausweise oder Gutscheine als semi-fungible Token ausgeben', 'Fraktionalisierte Asset-Darstellungen auf MultiversX erstellen'], + }, + category: 'nft', + }, + 'esdt-nft-view': { + keywords: { + en: ['view NFT MultiversX', 'ESDT NFT details', 'MultiversX NFT metadata', 'eGold NFT viewer'], + de: ['NFT anzeigen MultiversX', 'ESDT NFT-Details', 'MultiversX NFT-Metadaten', 'eGold NFT-Anzeige'], + }, + useCases: { + en: ['Inspect NFT metadata including royalties and attributes', 'Verify NFT authenticity and creator information', 'View media URIs and on-chain properties for individual tokens', 'Research NFT details before purchasing or trading'], + de: ['NFT-Metadaten einschliesslich Lizenzgebuehren und Attribute inspizieren', 'NFT-Authentizitaet und Erstellerinformationen verifizieren', 'Medien-URIs und On-Chain-Eigenschaften fuer einzelne Token anzeigen', 'NFT-Details vor dem Kauf oder Handel recherchieren'], + }, + category: 'nft', + }, +} diff --git a/warps/openai/meta.ts b/warps/openai/meta.ts new file mode 100644 index 0000000..256a475 --- /dev/null +++ b/warps/openai/meta.ts @@ -0,0 +1,163 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'launch-task': { + keywords: { + en: ['OpenAI task', 'launch GPT task', 'ChatGPT task', 'run OpenAI job', 'start AI task', 'GPT automation'], + de: ['OpenAI Aufgabe', 'GPT Aufgabe starten', 'ChatGPT Aufgabe', 'OpenAI Job ausführen', 'KI-Aufgabe starten', 'GPT Automatisierung'], + }, + useCases: { + en: ['Delegate a research summary to GPT while you focus on other work', 'Have OpenAI draft content or reports in the background', 'Run complex analysis tasks with GPT without waiting at your desk'], + de: ['Eine Recherche-Zusammenfassung an GPT delegieren, während du dich auf andere Arbeit konzentrierst', 'OpenAI im Hintergrund Inhalte oder Berichte entwerfen lassen', 'Komplexe Analyseaufgaben mit GPT ausführen, ohne am Schreibtisch zu warten'], + }, + category: 'developer', + faq: { + en: [ + { + question: 'How do I launch a task with OpenAI?', + answer: + 'Start a new background task with OpenAI by providing your instructions. The model will work on it asynchronously and return results when complete.', + }, + { + question: 'What tasks can I run through OpenAI?', + answer: + 'You can run writing, analysis, research, coding, and other tasks. They execute in the background so you can continue working while waiting for results.', + }, + ], + de: [ + { + question: 'Wie starte ich eine Aufgabe mit OpenAI?', + answer: + 'Starte eine neue Hintergrundaufgabe mit OpenAI, indem du deine Anweisungen eingibst. Das Modell arbeitet asynchron daran und liefert die Ergebnisse nach Abschluss.', + }, + { + question: 'Welche Aufgaben kann ich über OpenAI ausführen?', + answer: + 'Du kannst Schreib-, Analyse-, Recherche-, Programmier- und andere Aufgaben ausführen. Sie laufen im Hintergrund, sodass du weiterarbeiten kannst, während du auf Ergebnisse wartest.', + }, + ], + }, + }, + + 'cancel-task': { + keywords: { + en: ['cancel OpenAI task', 'stop GPT job', 'abort OpenAI task', 'terminate AI task'], + de: ['OpenAI Aufgabe abbrechen', 'GPT Job stoppen', 'OpenAI Aufgabe abbrechen', 'KI-Aufgabe beenden'], + }, + useCases: { + en: ['Stop a GPT task started with incorrect instructions', 'Cancel a long-running OpenAI job you no longer need', 'Free up resources by terminating obsolete background tasks'], + de: ['Eine GPT-Aufgabe stoppen, die mit falschen Anweisungen gestartet wurde', 'Einen lang laufenden OpenAI-Job abbrechen, der nicht mehr benötigt wird', 'Ressourcen freigeben durch Beenden veralteter Hintergrundaufgaben'], + }, + category: 'developer', + }, + + 'get-task-status': { + keywords: { + en: ['OpenAI task status', 'check GPT task progress', 'task result', 'OpenAI job status'], + de: ['OpenAI Aufgabenstatus', 'GPT Aufgabenfortschritt prüfen', 'Aufgabenergebnis', 'OpenAI Job-Status'], + }, + useCases: { + en: ['Check if a background GPT research task has finished', 'Retrieve the completed output of an OpenAI writing job', 'Monitor progress on a long-running analysis task'], + de: ['Prüfen, ob eine GPT-Hintergrund-Rechercheaufgabe abgeschlossen ist', 'Die fertige Ausgabe eines OpenAI-Schreibauftrags abrufen', 'Den Fortschritt einer lang laufenden Analyseaufgabe überwachen'], + }, + category: 'developer', + }, + + 'add-followup': { + keywords: { + en: ['OpenAI followup', 'add followup message', 'continue GPT task', 'reply to OpenAI task'], + de: ['OpenAI Nachfrage', 'Folgenachricht hinzufügen', 'GPT Aufgabe fortsetzen', 'auf OpenAI Aufgabe antworten'], + }, + useCases: { + en: ['Ask GPT to revise a draft based on new feedback', 'Provide additional context to improve task output', 'Request a different format or focus for completed results'], + de: ['GPT bitten, einen Entwurf basierend auf neuem Feedback zu überarbeiten', 'Zusätzlichen Kontext liefern, um die Aufgabenausgabe zu verbessern', 'Ein anderes Format oder einen anderen Fokus für fertige Ergebnisse anfordern'], + }, + category: 'developer', + }, + + 'codex-launch-task': { + keywords: { + en: ['Codex task', 'launch Codex coding task', 'OpenAI Codex agent', 'AI coding job', 'Codex developer task'], + de: ['Codex Aufgabe', 'Codex Programmieraufgabe starten', 'OpenAI Codex Agent', 'KI-Programmierauftrag', 'Codex Entwickleraufgabe'], + }, + useCases: { + en: ['Have Codex implement a new feature in your codebase', 'Delegate bug fixes and code refactoring to OpenAI Codex', 'Automate code reviews and test generation with Codex'], + de: ['Codex ein neues Feature in der Codebasis implementieren lassen', 'Bug-Fixes und Code-Refactoring an OpenAI Codex delegieren', 'Code-Reviews und Testgenerierung mit Codex automatisieren'], + }, + category: 'developer', + }, + + 'codex-cancel-task': { + keywords: { + en: ['cancel Codex task', 'stop Codex job', 'abort Codex coding task'], + de: ['Codex Aufgabe abbrechen', 'Codex Job stoppen', 'Codex Programmieraufgabe abbrechen'], + }, + useCases: { + en: ['Stop a Codex task when requirements have changed', 'Abort a code generation job taking the wrong approach', 'Cancel a Codex task to restart with better instructions'], + de: ['Eine Codex-Aufgabe stoppen, wenn sich die Anforderungen geändert haben', 'Einen Code-Generierungsjob abbrechen, der den falschen Ansatz verfolgt', 'Eine Codex-Aufgabe abbrechen, um mit besseren Anweisungen neu zu starten'], + }, + category: 'developer', + }, + + 'codex-get-task-status': { + keywords: { + en: ['Codex task status', 'coding task progress', 'Codex result', 'Codex job status'], + de: ['Codex Aufgabenstatus', 'Programmieraufgabe Fortschritt', 'Codex Ergebnis', 'Codex Job-Status'], + }, + useCases: { + en: ['Check if Codex has finished implementing your feature', 'Review generated code before merging changes', 'Monitor a complex refactoring task in progress'], + de: ['Prüfen, ob Codex die Feature-Implementierung abgeschlossen hat', 'Den generierten Code vor dem Zusammenführen überprüfen', 'Eine komplexe Refactoring-Aufgabe im Fortschritt überwachen'], + }, + category: 'developer', + }, + + 'codex-add-followup': { + keywords: { + en: ['Codex followup', 'continue Codex task', 'reply to Codex coding task'], + de: ['Codex Nachfrage', 'Codex Aufgabe fortsetzen', 'auf Codex Programmieraufgabe antworten'], + }, + useCases: { + en: ['Ask Codex to add error handling to generated code', 'Request style or architecture changes mid-implementation', 'Provide clarifying details about edge cases during coding'], + de: ['Codex bitten, Fehlerbehandlung zum generierten Code hinzuzufügen', 'Stil- oder Architekturänderungen während der Implementierung anfordern', 'Klärende Details zu Grenzfällen während des Programmierens liefern'], + }, + category: 'developer', + }, + + 'joai-plugin-install': { + keywords: { + en: ['install plugin', 'add OpenAI plugin', 'GPT plugin setup', 'connect tool to ChatGPT', 'OpenAI MCP install'], + de: ['Plugin installieren', 'OpenAI Plugin hinzufügen', 'GPT Plugin einrichten', 'Tool mit ChatGPT verbinden', 'OpenAI MCP installieren'], + }, + useCases: { + en: ['Add a blockchain plugin to interact with MultiversX from ChatGPT', 'Install a communication plugin to send emails or messages via GPT', 'Extend OpenAI with a productivity tool for scheduling or task management'], + de: ['Ein Blockchain-Plugin hinzufügen, um von ChatGPT aus mit MultiversX zu interagieren', 'Ein Kommunikations-Plugin installieren, um E-Mails oder Nachrichten über GPT zu senden', 'OpenAI mit einem Produktivitäts-Tool für Terminplanung oder Aufgabenverwaltung erweitern'], + }, + category: 'developer', + faq: { + en: [ + { + question: 'How do I install a plugin for OpenAI?', + answer: + 'Install a new plugin to your OpenAI setup with just a few steps. The configuration and connection are handled automatically so the plugin is ready to use right away.', + }, + { + question: 'What plugins can I add to OpenAI?', + answer: + 'Many plugins are available covering productivity, development, communication, and blockchain tools. Browse the plugin catalog to find ones that fit your workflow.', + }, + ], + de: [ + { + question: 'Wie installiere ich ein Plugin für OpenAI?', + answer: + 'Installiere ein neues Plugin für dein OpenAI-Setup in wenigen Schritten. Die Konfiguration und Verbindung werden automatisch übernommen, sodass das Plugin sofort einsatzbereit ist.', + }, + { + question: 'Welche Plugins kann ich zu OpenAI hinzufügen?', + answer: + 'Viele Plugins sind verfügbar, die Produktivität, Entwicklung, Kommunikation und Blockchain-Tools abdecken. Durchsuche den Plugin-Katalog, um passende für deinen Workflow zu finden.', + }, + ], + }, + }, +} diff --git a/warps/openbond/meta.ts b/warps/openbond/meta.ts new file mode 100644 index 0000000..7ba3eb2 --- /dev/null +++ b/warps/openbond/meta.ts @@ -0,0 +1,103 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'bond': { + keywords: { + en: ['bond agent', 'OpenBond bond', 'agent bonding', 'bond AI agent', 'MultiversX bonding', 'autonomous agent bond'], + de: ['Agent bonden', 'OpenBond Bond', 'Agent-Bonding', 'KI-Agent bonden', 'MultiversX Bonding', 'autonomer Agent Bond'], + }, + useCases: { + en: ['Back a promising AI agent by bonding tokens on OpenBond', 'Invest in an autonomous agent through the bonding curve', 'Support an agent and earn bond tokens as a reward for your stake'], + de: ['Einen vielversprechenden KI-Agenten durch Token-Bonding auf OpenBond unterstützen', 'In einen autonomen Agenten über die Bonding-Kurve investieren', 'Einen Agenten unterstützen und Bond-Token als Belohnung für deinen Einsatz verdienen'], + }, + category: 'defi', + faq: { + en: [ + { + question: 'What does it mean to bond an agent on OpenBond?', + answer: + 'Bonding an agent on OpenBond means staking tokens to back an autonomous agent on MultiversX. This creates an economic bond that aligns incentives between the agent and its supporters.', + }, + { + question: 'How do I bond an agent?', + answer: + 'Select an agent and specify the amount you want to bond. Your tokens are locked in the bonding curve and you receive bond tokens in return.', + }, + ], + de: [ + { + question: 'Was bedeutet es, einen Agenten auf OpenBond zu bonden?', + answer: + 'Einen Agenten auf OpenBond zu bonden bedeutet, Token zu staken, um einen autonomen Agenten auf MultiversX zu unterstützen. Dies schafft eine wirtschaftliche Bindung, die die Anreize zwischen dem Agenten und seinen Unterstützern ausrichtet.', + }, + { + question: 'Wie bonde ich einen Agenten?', + answer: + 'Wähle einen Agenten aus und lege den Betrag fest, den du bonden möchtest. Deine Token werden in der Bonding-Kurve gesperrt und du erhältst im Gegenzug Bond-Token.', + }, + ], + }, + }, + + 'register-agent': { + keywords: { + en: ['register agent', 'OpenBond register', 'create autonomous agent', 'deploy agent', 'list agent on OpenBond'], + de: ['Agent registrieren', 'OpenBond registrieren', 'autonomen Agenten erstellen', 'Agenten deployen', 'Agent auf OpenBond listen'], + }, + useCases: { + en: ['Deploy your AI agent to the OpenBond marketplace for others to bond', 'Register an autonomous trading agent on MultiversX', 'List a new agent on OpenBond to attract community supporters'], + de: ['Deinen KI-Agenten auf dem OpenBond-Marktplatz bereitstellen, damit andere bonden können', 'Einen autonomen Handelsagenten auf MultiversX registrieren', 'Einen neuen Agenten auf OpenBond listen, um Community-Unterstützer zu gewinnen'], + }, + category: 'defi', + faq: { + en: [ + { + question: 'How do I register a new agent on OpenBond?', + answer: + 'Deploy your autonomous agent on the OpenBond network by providing the agent details and configuration to make it available for bonding.', + }, + { + question: 'What do I need to register an agent?', + answer: + 'You need your agent metadata and configuration details. Once registered, other users can discover and bond your agent on the OpenBond network.', + }, + ], + de: [ + { + question: 'Wie registriere ich einen neuen Agenten auf OpenBond?', + answer: + 'Stelle deinen autonomen Agenten im OpenBond-Netzwerk bereit, indem du die Agentendetails und Konfiguration angibst, um ihn für Bonding verfügbar zu machen.', + }, + { + question: 'Was brauche ich, um einen Agenten zu registrieren?', + answer: + 'Du benötigst die Metadaten und Konfigurationsdetails deines Agenten. Nach der Registrierung können andere Nutzer deinen Agenten im OpenBond-Netzwerk entdecken und bonden.', + }, + ], + }, + }, + + 'emit-signal': { + keywords: { + en: ['emit signal', 'agent signal', 'OpenBond signal', 'broadcast signal', 'agent communication'], + de: ['Signal senden', 'Agenten-Signal', 'OpenBond Signal', 'Signal übertragen', 'Agenten-Kommunikation'], + }, + useCases: { + en: ['Broadcast a market signal from your trading agent to bonders', 'Trigger an automated workflow between connected agents', 'Emit a status update signal for agent health monitoring'], + de: ['Ein Marktsignal von deinem Handelsagenten an Bonder senden', 'Einen automatisierten Workflow zwischen verbundenen Agenten auslösen', 'Ein Statusupdate-Signal für die Agentenüberwachung senden'], + }, + category: 'defi', + }, + + 'network-overview': { + keywords: { + en: ['OpenBond overview', 'network stats', 'bonding network', 'agent network', 'OpenBond dashboard'], + de: ['OpenBond Übersicht', 'Netzwerkstatistiken', 'Bonding-Netzwerk', 'Agenten-Netzwerk', 'OpenBond Dashboard'], + }, + useCases: { + en: ['Check total value locked across all agents on OpenBond', 'Discover trending agents with the highest bonding activity', 'Monitor network health and agent performance metrics'], + de: ['Den gesamten gesperrten Wert aller Agenten auf OpenBond prüfen', 'Trendagenten mit der höchsten Bonding-Aktivität entdecken', 'Netzwerkgesundheit und Agenten-Leistungsmetriken überwachen'], + }, + category: 'defi', + }, +} diff --git a/warps/peerme/meta.ts b/warps/peerme/meta.ts new file mode 100644 index 0000000..89a77cf --- /dev/null +++ b/warps/peerme/meta.ts @@ -0,0 +1,201 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'multisig-overview': { + keywords: { + en: ['multisig overview', 'PeerMe multisig', 'DAO wallet', 'multi-signature wallet', 'MultiversX multisig', 'team wallet'], + de: ['Multisig Übersicht', 'PeerMe Multisig', 'DAO Wallet', 'Multi-Signatur Wallet', 'MultiversX Multisig', 'Team-Wallet'], + }, + useCases: { + en: ['Review your DAO treasury balance and recent activity', 'Check pending multisig transactions awaiting approval', 'Monitor your team wallet signers and permissions'], + de: ['Das DAO-Treasury-Guthaben und letzte Aktivitäten überprüfen', 'Ausstehende Multisig-Transaktionen prüfen, die auf Genehmigung warten', 'Die Unterzeichner und Berechtigungen deines Team-Wallets überwachen'], + }, + category: 'security', + faq: { + en: [ + { + question: 'What is a PeerMe multisig wallet?', + answer: + 'A PeerMe multisig is a multi-signature wallet on MultiversX that requires multiple signers to approve transactions. It is ideal for DAOs, teams, and shared treasuries.', + }, + { + question: 'How do I view my multisig wallet details?', + answer: + 'Simply open your multisig overview to see your wallet balance, pending actions, signers, and recent activity at a glance.', + }, + ], + de: [ + { + question: 'Was ist ein PeerMe Multisig Wallet?', + answer: + 'Ein PeerMe Multisig ist ein Multi-Signatur Wallet auf MultiversX, das mehrere Unterzeichner zur Genehmigung von Transaktionen erfordert. Es ist ideal für DAOs, Teams und gemeinsame Treasuries.', + }, + { + question: 'Wie sehe ich die Details meines Multisig Wallets?', + answer: + 'Öffne einfach deine Multisig-Übersicht, um dein Wallet-Guthaben, ausstehende Aktionen, Unterzeichner und letzte Aktivitäten auf einen Blick zu sehen.', + }, + ], + }, + }, + + 'earn-stake-peerme-dao': { + keywords: { + en: ['stake PeerMe', 'PeerMe DAO staking', 'stake PEER token', 'earn PEER rewards', 'PeerMe staking'], + de: ['PeerMe staken', 'PeerMe DAO Staking', 'PEER Token staken', 'PEER Belohnungen verdienen', 'PeerMe Staking'], + }, + useCases: { + en: ['Stake PEER tokens to earn passive rewards from the DAO pool', 'Support PeerMe governance while generating yield on your tokens', 'Lock PEER tokens for long-term staking to maximize rewards'], + de: ['PEER-Token staken, um passive Belohnungen aus dem DAO-Pool zu verdienen', 'PeerMe-Governance unterstützen und gleichzeitig Rendite auf deine Token erzielen', 'PEER-Token für langfristiges Staking sperren, um Belohnungen zu maximieren'], + }, + category: 'security', + faq: { + en: [ + { + question: 'How do I stake in the PeerMe DAO?', + answer: + 'Stake your PEER tokens in the PeerMe DAO to earn staking rewards over time while supporting the DAO governance.', + }, + { + question: 'What rewards do I earn from staking?', + answer: + 'Staking rewards are distributed based on the DAO staking pool configuration. The longer you stake, the more rewards you accumulate.', + }, + ], + de: [ + { + question: 'Wie stake ich in der PeerMe DAO?', + answer: + 'Stake deine PEER-Token in der PeerMe DAO, um Staking-Belohnungen im Laufe der Zeit zu verdienen und gleichzeitig die DAO-Governance zu unterstützen.', + }, + { + question: 'Welche Belohnungen erhalte ich durch Staking?', + answer: + 'Staking-Belohnungen werden basierend auf der Konfiguration des DAO-Staking-Pools verteilt. Je länger du stakest, desto mehr Belohnungen sammelst du an.', + }, + ], + }, + }, + + 'multisig-sign-action': { + keywords: { + en: ['sign multisig action', 'approve transaction', 'multisig signature', 'confirm multisig', 'PeerMe sign'], + de: ['Multisig-Aktion unterschreiben', 'Transaktion genehmigen', 'Multisig-Signatur', 'Multisig bestätigen', 'PeerMe unterschreiben'], + }, + useCases: { + en: ['Approve a DAO treasury payment as one of the required signers', 'Sign a multisig transaction to release funds for a team expense', 'Confirm a pending smart contract interaction from your multisig wallet'], + de: ['Eine DAO-Treasury-Zahlung als einer der erforderlichen Unterzeichner genehmigen', 'Eine Multisig-Transaktion unterschreiben, um Mittel für eine Teamausgabe freizugeben', 'Eine ausstehende Smart-Contract-Interaktion aus deinem Multisig-Wallet bestätigen'], + }, + category: 'security', + faq: { + en: [ + { + question: 'How do I sign a pending multisig action?', + answer: + 'Select the pending transaction you want to approve and confirm your signature. Once enough signers approve, the action is executed automatically.', + }, + { + question: 'What happens after I sign an action?', + answer: + 'Your signature is recorded on-chain. When the required number of signatures is reached, the action executes. If more signatures are still needed, it remains pending.', + }, + ], + de: [ + { + question: 'Wie unterschreibe ich eine ausstehende Multisig-Aktion?', + answer: + 'Wähle die ausstehende Transaktion aus, die du genehmigen möchtest, und bestätige deine Signatur. Sobald genügend Unterzeichner zustimmen, wird die Aktion automatisch ausgeführt.', + }, + { + question: 'Was passiert, nachdem ich eine Aktion unterschrieben habe?', + answer: + 'Deine Signatur wird On-Chain aufgezeichnet. Wenn die erforderliche Anzahl an Signaturen erreicht ist, wird die Aktion ausgeführt. Wenn noch weitere Signaturen benötigt werden, bleibt sie ausstehend.', + }, + ], + }, + }, + + 'multisig-deposit': { + keywords: { + en: ['deposit to multisig', 'fund multisig wallet', 'send to DAO wallet', 'multisig funding'], + de: ['Einzahlung ins Multisig', 'Multisig Wallet aufladen', 'an DAO Wallet senden', 'Multisig-Finanzierung'], + }, + useCases: { + en: ['Fund your DAO treasury with EGLD for upcoming expenses', 'Deposit tokens into a team multisig wallet for project funding', 'Contribute to a shared multisig wallet for a group investment'], + de: ['Dein DAO-Treasury mit EGLD für anstehende Ausgaben aufladen', 'Token in ein Team-Multisig-Wallet für Projektfinanzierung einzahlen', 'Zu einem gemeinsamen Multisig-Wallet für eine Gruppeninvestition beitragen'], + }, + category: 'security', + }, + + 'multisig-get-pending-actions': { + keywords: { + en: ['pending multisig actions', 'view pending transactions', 'multisig queue', 'awaiting signatures'], + de: ['ausstehende Multisig-Aktionen', 'ausstehende Transaktionen anzeigen', 'Multisig-Warteschlange', 'auf Signaturen wartend'], + }, + useCases: { + en: ['Check which multisig transactions need your signature', 'Review pending DAO proposals before signing', 'Monitor the approval queue for team wallet transactions'], + de: ['Prüfen, welche Multisig-Transaktionen deine Signatur benötigen', 'Ausstehende DAO-Vorschläge vor dem Unterschreiben überprüfen', 'Die Genehmigungswarteschlange für Team-Wallet-Transaktionen überwachen'], + }, + category: 'security', + }, + + 'earn-claim-peerme-dao': { + keywords: { + en: ['claim PeerMe rewards', 'collect staking rewards', 'PeerMe DAO claim', 'harvest PEER rewards'], + de: ['PeerMe Belohnungen beanspruchen', 'Staking-Belohnungen einsammeln', 'PeerMe DAO Anspruch', 'PEER Belohnungen ernten'], + }, + useCases: { + en: ['Harvest accumulated PEER staking rewards into your wallet', 'Claim DAO rewards before compounding them back into staking', 'Collect earned staking yield without withdrawing your stake'], + de: ['Angesammelte PEER-Staking-Belohnungen in dein Wallet ernten', 'DAO-Belohnungen beanspruchen, bevor du sie wieder ins Staking reinvestierst', 'Verdiente Staking-Rendite einsammeln, ohne deinen Stake abzuheben'], + }, + category: 'security', + }, + + 'earn-withdraw-peerme-dao': { + keywords: { + en: ['withdraw PeerMe stake', 'unstake PEER', 'PeerMe DAO withdraw', 'remove stake'], + de: ['PeerMe Stake abheben', 'PEER entstaken', 'PeerMe DAO Abhebung', 'Stake entfernen'], + }, + useCases: { + en: ['Unstake PEER tokens to use them in a different protocol', 'Withdraw your stake to sell or transfer your PEER tokens', 'Remove staked tokens after achieving your target reward amount'], + de: ['PEER-Token entstaken, um sie in einem anderen Protokoll zu verwenden', 'Deinen Stake abheben, um deine PEER-Token zu verkaufen oder zu übertragen', 'Gestakte Token abheben, nachdem du deinen Ziel-Belohnungsbetrag erreicht hast'], + }, + category: 'security', + }, + + 'identity-burn-for-trust': { + keywords: { + en: ['burn for trust', 'PeerMe trust score', 'identity trust', 'burn tokens trust', 'reputation score'], + de: ['Verbrennen für Vertrauen', 'PeerMe Vertrauenswert', 'Identitätsvertrauen', 'Token für Vertrauen verbrennen', 'Reputationswert'], + }, + useCases: { + en: ['Boost your on-chain trust score to gain credibility in DAOs', 'Burn tokens to qualify as a trusted signer on multisig wallets', 'Build reputation to unlock governance privileges in the PeerMe ecosystem'], + de: ['Deinen On-Chain-Vertrauenswert erhöhen, um Glaubwürdigkeit in DAOs zu gewinnen', 'Token verbrennen, um als vertrauenswürdiger Unterzeichner auf Multisig-Wallets qualifiziert zu werden', 'Reputation aufbauen, um Governance-Privilegien im PeerMe-Ökosystem freizuschalten'], + }, + category: 'security', + }, + + 'multisig-propose-transfer-execute-egld': { + keywords: { + en: ['propose EGLD transfer', 'multisig send EGLD', 'DAO transfer EGLD', 'propose multisig payment'], + de: ['EGLD-Überweisung vorschlagen', 'Multisig EGLD senden', 'DAO EGLD übertragen', 'Multisig-Zahlung vorschlagen'], + }, + useCases: { + en: ['Propose a DAO payment to a contractor or service provider', 'Submit an EGLD transfer for team salary payments from multisig', 'Initiate a multisig treasury withdrawal for operational expenses'], + de: ['Eine DAO-Zahlung an einen Auftragnehmer oder Dienstleister vorschlagen', 'Eine EGLD-Überweisung für Team-Gehaltszahlungen aus dem Multisig einreichen', 'Eine Multisig-Treasury-Abhebung für Betriebskosten initiieren'], + }, + category: 'security', + }, + + 'multisig-registry-list': { + keywords: { + en: ['multisig registry', 'list multisig wallets', 'PeerMe registry', 'browse DAOs', 'discover multisig'], + de: ['Multisig-Verzeichnis', 'Multisig Wallets auflisten', 'PeerMe Verzeichnis', 'DAOs durchsuchen', 'Multisig entdecken'], + }, + useCases: { + en: ['Browse active DAOs on MultiversX to find communities to join', 'Discover team wallets and their governance structures', 'Search the registry for a specific multisig wallet or DAO'], + de: ['Aktive DAOs auf MultiversX durchsuchen, um Communities zum Beitreten zu finden', 'Team-Wallets und ihre Governance-Strukturen entdecken', 'Das Verzeichnis nach einem bestimmten Multisig-Wallet oder DAO durchsuchen'], + }, + category: 'security', + }, +} diff --git a/warps/projectx/meta.ts b/warps/projectx/meta.ts new file mode 100644 index 0000000..26f8e85 --- /dev/null +++ b/warps/projectx/meta.ts @@ -0,0 +1,90 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'stake-egld': { + keywords: { + en: ['stake eGold', 'EGLD staking', 'ProjectX staking', 'MultiversX staking', 'delegate EGLD ProjectX'], + de: ['eGold staken', 'EGLD Staking', 'ProjectX Staking', 'MultiversX Staking', 'EGLD an ProjectX delegieren'], + }, + useCases: { + en: ['Earn passive income on EGLD', 'Delegate eGold to ProjectX validators', 'Support MultiversX network security'], + de: ['Passives Einkommen mit EGLD verdienen', 'eGold an ProjectX-Validatoren delegieren', 'MultiversX-Netzwerksicherheit unterstutzen'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I stake EGLD with ProjectX?', + answer: + 'You can delegate your EGLD to the ProjectX staking provider directly through this action. Your staked EGLD earns rewards automatically.', + }, + { + question: 'What are the rewards for staking with ProjectX?', + answer: + 'ProjectX distributes staking rewards to delegators based on the MultiversX network APR, minus a small service fee.', + }, + ], + de: [ + { + question: 'Wie stake ich EGLD mit ProjectX?', + answer: + 'Du kannst deine EGLD direkt über diese Aktion an den ProjectX-Staking-Anbieter delegieren. Deine gestakten EGLD verdienen automatisch Belohnungen.', + }, + { + question: 'Welche Belohnungen gibt es beim Staking mit ProjectX?', + answer: + 'ProjectX verteilt Staking-Belohnungen an Delegierer basierend auf dem MultiversX-Netzwerk-APR, abzüglich einer kleinen Servicegebühr.', + }, + ], + }, + }, + 'claim-rewards': { + keywords: { + en: ['claim staking rewards', 'ProjectX rewards', 'collect EGLD rewards', 'claim ProjectX delegation rewards'], + de: ['Staking-Belohnungen einfordern', 'ProjectX Belohnungen', 'EGLD Belohnungen einsammeln', 'ProjectX Delegationsbelohnungen einfordern'], + }, + useCases: { + en: ['Collect accumulated EGLD staking rewards', 'Withdraw earned eGold from ProjectX', 'Manage staking delegations'], + de: ['Angesammelte EGLD-Staking-Belohnungen einsammeln', 'Verdientes eGold von ProjectX abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I claim my ProjectX staking rewards?', + answer: + 'Use this action to collect your accumulated EGLD staking rewards from ProjectX. Rewards are sent directly to your wallet.', + }, + ], + de: [ + { + question: 'Wie fordere ich meine ProjectX-Staking-Belohnungen ein?', + answer: + 'Nutze diese Aktion, um deine angesammelten EGLD-Staking-Belohnungen von ProjectX einzusammeln. Die Belohnungen werden direkt an dein Wallet gesendet.', + }, + ], + }, + }, + 'redelegate-egld': { + keywords: { + en: ['redelegate EGLD', 'ProjectX redelegate', 'compound staking rewards', 'restake EGLD ProjectX'], + de: ['EGLD redelegieren', 'ProjectX Redelegation', 'Staking-Belohnungen reinvestieren', 'EGLD bei ProjectX restaken'], + }, + useCases: { + en: ['Compound staking rewards automatically', 'Maximize EGLD earnings over time', 'Restake eGold with ProjectX'], + de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei ProjectX restaken'], + }, + category: 'staking', + }, + 'undelegate-egld': { + keywords: { + en: ['undelegate EGLD', 'unstake ProjectX', 'withdraw staked EGLD', 'remove ProjectX delegation'], + de: ['EGLD undelegieren', 'ProjectX unstaken', 'gestakte EGLD abheben', 'ProjectX Delegation entfernen'], + }, + useCases: { + en: ['Unstake EGLD from ProjectX', 'Withdraw staked eGold', 'Manage staking delegations'], + de: ['EGLD von ProjectX unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + }, +} diff --git a/warps/resend/meta.ts b/warps/resend/meta.ts new file mode 100644 index 0000000..a5a7e8e --- /dev/null +++ b/warps/resend/meta.ts @@ -0,0 +1,31 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'send-email': { + keywords: { + en: ['send email', 'Resend email', 'email API', 'transactional email', 'deliver email', 'compose email'], + de: ['E-Mail senden', 'Resend E-Mail', 'E-Mail-API', 'Transaktions-E-Mail', 'E-Mail zustellen', 'E-Mail verfassen'], + }, + useCases: { + en: ['Send a transactional email notification to a customer', 'Deliver a welcome email to a new user via Resend', 'Compose and send a marketing update to your mailing list'], + de: ['Eine transaktionale E-Mail-Benachrichtigung an einen Kunden senden', 'Eine Willkommens-E-Mail an einen neuen Nutzer über Resend zustellen', 'Ein Marketing-Update an deine Mailingliste verfassen und senden'], + }, + category: 'communication', + faq: { + en: [ + { + question: 'How do I send an email via Resend?', + answer: + 'Compose and send an email through the Resend API by providing the recipient, subject, and body to deliver your message.', + }, + ], + de: [ + { + question: 'Wie sende ich eine E-Mail über Resend?', + answer: + 'Verfasse und sende eine E-Mail über die Resend-API, indem du den Empfänger, Betreff und Inhalt angibst, um deine Nachricht zuzustellen.', + }, + ], + }, + }, +} diff --git a/warps/shop/meta.ts b/warps/shop/meta.ts new file mode 100644 index 0000000..39faf82 --- /dev/null +++ b/warps/shop/meta.ts @@ -0,0 +1,189 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'shop-create': { + keywords: { + en: ['create shop', 'new online store', 'setup shop', 'launch store', 'e-commerce setup', 'start selling online'], + de: ['Shop erstellen', 'neuer Online-Shop', 'Shop einrichten', 'Shop starten', 'E-Commerce einrichten', 'online verkaufen starten'], + }, + useCases: { + en: ['Launch an online store for your small business or side project', 'Set up a shop with built-in loyalty rewards for repeat customers', 'Create a storefront to sell products with integrated payment processing'], + de: ['Einen Online-Shop für dein Kleinunternehmen oder Nebenprojekt starten', 'Einen Shop mit integrierten Treueprämien für Stammkunden einrichten', 'Einen Laden erstellen, um Produkte mit integrierter Zahlungsabwicklung zu verkaufen'], + }, + category: 'commerce', + faq: { + en: [ + { + question: 'How do I create a new shop?', + answer: + 'Set up a new online store by providing your shop details. It will be created and ready for configuration immediately.', + }, + { + question: 'What do I need to get started with a shop?', + answer: + 'You just need a name and basic details for your shop. You can configure loyalty programs, products, and other features after creation.', + }, + ], + de: [ + { + question: 'Wie erstelle ich einen neuen Shop?', + answer: + 'Richte einen neuen Online-Shop ein, indem du deine Shop-Details angibst. Er wird sofort erstellt und ist bereit zur Konfiguration.', + }, + { + question: 'Was brauche ich, um mit einem Shop zu starten?', + answer: + 'Du brauchst nur einen Namen und grundlegende Angaben für deinen Shop. Treueprogramme, Produkte und andere Funktionen kannst du nach der Erstellung konfigurieren.', + }, + ], + }, + }, + + 'shop-loyalty-configure': { + keywords: { + en: ['configure loyalty program', 'loyalty settings', 'stamp card setup', 'rewards program config'], + de: ['Treueprogramm konfigurieren', 'Treue-Einstellungen', 'Stempelkarte einrichten', 'Bonusprogramm konfigurieren'], + }, + useCases: { + en: ['Set how many stamps customers need for a free reward', 'Configure cashback percentages for loyal shoppers', 'Adjust loyalty program rules based on seasonal promotions'], + de: ['Festlegen, wie viele Stempel Kunden für eine Gratisprämie benötigen', 'Cashback-Prozentsätze für treue Käufer konfigurieren', 'Treueprogramm-Regeln basierend auf saisonalen Aktionen anpassen'], + }, + category: 'commerce', + }, + + 'shop-loyalty-register': { + keywords: { + en: ['join loyalty program', 'register loyalty card', 'sign up rewards', 'loyalty membership', 'enroll loyalty'], + de: ['Treueprogramm beitreten', 'Treuekarte registrieren', 'für Bonusprogramm anmelden', 'Treue-Mitgliedschaft', 'Treueprogramm Anmeldung'], + }, + useCases: { + en: ['Sign up for a coffee shop stamp card to earn a free drink', 'Join a store loyalty program to receive exclusive discounts', 'Register for rewards to get cashback on regular purchases'], + de: ['Sich für eine Café-Stempelkarte anmelden, um ein Gratisgetränk zu verdienen', 'Einem Shop-Treueprogramm beitreten, um exklusive Rabatte zu erhalten', 'Sich für Prämien registrieren, um Cashback bei regelmäßigen Einkäufen zu erhalten'], + }, + category: 'commerce', + faq: { + en: [ + { + question: 'How do I register for a shop loyalty program?', + answer: + 'Sign up for a loyalty program by providing your details. Once registered, you can start earning stamps and redeeming rewards at the shop.', + }, + { + question: 'Is there a cost to join a loyalty program?', + answer: + 'No, joining a loyalty program is free. You simply register and start collecting stamps with your purchases.', + }, + ], + de: [ + { + question: 'Wie registriere ich mich für ein Shop-Treueprogramm?', + answer: + 'Melde dich für ein Treueprogramm an, indem du deine Daten angibst. Nach der Registrierung kannst du Stempel sammeln und Prämien im Shop einlösen.', + }, + { + question: 'Kostet die Teilnahme am Treueprogramm etwas?', + answer: + 'Nein, die Teilnahme am Treueprogramm ist kostenlos. Du registrierst dich einfach und beginnst mit deinen Einkäufen Stempel zu sammeln.', + }, + ], + }, + }, + + 'shop-loyalty-stamp': { + keywords: { + en: ['add loyalty stamp', 'collect stamp', 'loyalty punch', 'earn stamp', 'stamp card'], + de: ['Treuestempel hinzufügen', 'Stempel sammeln', 'Treuepunkt', 'Stempel verdienen', 'Stempelkarte'], + }, + useCases: { + en: ['Stamp a customer card after they make a purchase at your shop', 'Award bonus stamps during a promotional event', 'Track customer progress toward their next loyalty reward'], + de: ['Eine Kundenkarte nach einem Einkauf in deinem Shop abstempeln', 'Bonusstempel während einer Werbeaktion vergeben', 'Den Kundenfortschritt zur nächsten Treueprämie verfolgen'], + }, + category: 'commerce', + }, + + 'shop-loyalty-redeem': { + keywords: { + en: ['redeem loyalty reward', 'claim reward', 'use loyalty points', 'redeem stamps', 'loyalty cashback'], + de: ['Treueprämie einlösen', 'Prämie beanspruchen', 'Treuepunkte einlösen', 'Stempel einlösen', 'Treue-Cashback'], + }, + useCases: { + en: ['Claim a free coffee after collecting enough stamps', 'Redeem loyalty points for a discount on your next purchase', 'Use accumulated stamps to receive cashback rewards'], + de: ['Einen Gratis-Kaffee nach dem Sammeln genügender Stempel beanspruchen', 'Treuepunkte für einen Rabatt beim nächsten Einkauf einlösen', 'Angesammelte Stempel für Cashback-Prämien verwenden'], + }, + category: 'commerce', + faq: { + en: [ + { + question: 'How do I redeem my loyalty rewards?', + answer: + 'Redeem your rewards once you have enough stamps collected. Your reward will be applied automatically based on the shop\'s loyalty program rules.', + }, + { + question: 'When can I redeem my stamps?', + answer: + 'You can redeem once you reach the required number of stamps set by the shop. Check your loyalty status to see how close you are to a reward.', + }, + ], + de: [ + { + question: 'Wie löse ich meine Treueprämien ein?', + answer: + 'Löse deine Prämien ein, sobald du genügend Stempel gesammelt hast. Deine Prämie wird automatisch basierend auf den Regeln des Shop-Treueprogramms angewendet.', + }, + { + question: 'Wann kann ich meine Stempel einlösen?', + answer: + 'Du kannst einlösen, sobald du die vom Shop festgelegte Anzahl an Stempeln erreicht hast. Überprüfe deinen Treuestatus, um zu sehen, wie nah du an einer Prämie bist.', + }, + ], + }, + }, + + 'shop-loyalty-status': { + keywords: { + en: ['loyalty status', 'check stamps', 'loyalty balance', 'reward progress', 'stamp count'], + de: ['Treuestatus', 'Stempel prüfen', 'Treue-Guthaben', 'Prämienfortschritt', 'Stempelanzahl'], + }, + useCases: { + en: ['See how many more stamps you need for a free reward', 'Check your loyalty balance before making a purchase', 'Track your reward progress across multiple visits'], + de: ['Sehen, wie viele Stempel du noch für eine Gratisprämie brauchst', 'Dein Treue-Guthaben vor einem Einkauf prüfen', 'Deinen Prämienfortschritt über mehrere Besuche verfolgen'], + }, + category: 'commerce', + }, + + 'shop-loyalty-review': { + keywords: { + en: ['loyalty review', 'review loyalty program', 'loyalty analytics', 'program performance'], + de: ['Treue-Überprüfung', 'Treueprogramm überprüfen', 'Treue-Analysen', 'Programmleistung'], + }, + useCases: { + en: ['Analyze how many customers are actively using the loyalty program', 'Review redemption rates to evaluate reward attractiveness', 'Identify trends in stamp collection to plan promotions'], + de: ['Analysieren, wie viele Kunden das Treueprogramm aktiv nutzen', 'Einlösequoten überprüfen, um die Attraktivität der Prämien zu bewerten', 'Trends bei der Stempelsammlung erkennen, um Aktionen zu planen'], + }, + category: 'commerce', + }, + + 'shop-loyalty-remind': { + keywords: { + en: ['loyalty reminder', 'remind customers', 'loyalty notification', 'stamp reminder'], + de: ['Treue-Erinnerung', 'Kunden erinnern', 'Treue-Benachrichtigung', 'Stempel-Erinnerung'], + }, + useCases: { + en: ['Notify customers who are one stamp away from a reward', 'Re-engage inactive loyalty members with a reminder', 'Send promotional reminders about expiring loyalty rewards'], + de: ['Kunden benachrichtigen, die nur einen Stempel von einer Prämie entfernt sind', 'Inaktive Treuemitglieder mit einer Erinnerung reaktivieren', 'Werbe-Erinnerungen über ablaufende Treueprämien senden'], + }, + category: 'commerce', + }, + + 'shop-loyalty-setup': { + keywords: { + en: ['setup loyalty program', 'create loyalty program', 'initialize loyalty', 'loyalty onboarding'], + de: ['Treueprogramm einrichten', 'Treueprogramm erstellen', 'Treue initialisieren', 'Treue-Onboarding'], + }, + useCases: { + en: ['Create a stamp card loyalty program for a new coffee shop', 'Initialize a rewards program with cashback for an online store', 'Set up a points-based loyalty system for a retail business'], + de: ['Ein Stempelkarten-Treueprogramm für ein neues Café erstellen', 'Ein Prämienprogramm mit Cashback für einen Online-Shop initialisieren', 'Ein punktebasiertes Treuesystem für ein Einzelhandelsgeschäft einrichten'], + }, + category: 'commerce', + }, +} diff --git a/warps/typefully/meta.ts b/warps/typefully/meta.ts new file mode 100644 index 0000000..e47ccb6 --- /dev/null +++ b/warps/typefully/meta.ts @@ -0,0 +1,31 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'create-draft': { + keywords: { + en: ['create draft', 'Typefully draft', 'schedule post', 'social media draft', 'Twitter draft', 'X post draft', 'schedule tweet'], + de: ['Entwurf erstellen', 'Typefully Entwurf', 'Beitrag planen', 'Social-Media-Entwurf', 'Twitter Entwurf', 'X Beitrag Entwurf', 'Tweet planen'], + }, + useCases: { + en: ['Draft a tweet thread and schedule it for peak engagement hours', 'Publish a LinkedIn post immediately through Typefully', 'Queue up a week of social media content in advance'], + de: ['Einen Tweet-Thread entwerfen und für Spitzeninteraktionszeiten planen', 'Einen LinkedIn-Beitrag sofort über Typefully veröffentlichen', 'Eine Woche Social-Media-Inhalte im Voraus einreihen'], + }, + category: 'social', + faq: { + en: [ + { + question: 'How do I create or schedule a post on Typefully?', + answer: + 'Write a new draft post on Typefully and either publish it immediately or schedule it for a specific time.', + }, + ], + de: [ + { + question: 'Wie erstelle oder plane ich einen Beitrag auf Typefully?', + answer: + 'Schreibe einen neuen Entwurf auf Typefully und veröffentliche ihn sofort oder plane ihn für einen bestimmten Zeitpunkt.', + }, + ], + }, + }, +} diff --git a/warps/types.ts b/warps/types.ts index 63cccae..c4a4191 100644 --- a/warps/types.ts +++ b/warps/types.ts @@ -89,6 +89,8 @@ export type WarpExtrasFaq = { export type WarpExtras = { keywords?: Record + useCases?: Record + category?: string faq?: Record } diff --git a/warps/whatsapp/meta.ts b/warps/whatsapp/meta.ts new file mode 100644 index 0000000..af13062 --- /dev/null +++ b/warps/whatsapp/meta.ts @@ -0,0 +1,31 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'send-text': { + keywords: { + en: ['send WhatsApp message', 'WhatsApp text', 'message on WhatsApp', 'WhatsApp API', 'send WhatsApp'], + de: ['WhatsApp Nachricht senden', 'WhatsApp Text', 'Nachricht auf WhatsApp', 'WhatsApp API', 'WhatsApp senden'], + }, + useCases: { + en: ['Send an order confirmation to a customer via WhatsApp', 'Deliver appointment reminders through WhatsApp messages', 'Notify team members about urgent updates on WhatsApp'], + de: ['Eine Bestellbestätigung an einen Kunden über WhatsApp senden', 'Terminerinnerungen über WhatsApp-Nachrichten zustellen', 'Teammitglieder über dringende Updates auf WhatsApp benachrichtigen'], + }, + category: 'communication', + faq: { + en: [ + { + question: 'How do I send a WhatsApp message?', + answer: + 'Send a text message via WhatsApp by providing the recipient phone number and your message content to deliver it instantly.', + }, + ], + de: [ + { + question: 'Wie sende ich eine WhatsApp-Nachricht?', + answer: + 'Sende eine Textnachricht über WhatsApp, indem du die Telefonnummer des Empfängers und deinen Nachrichteninhalt angibst, um sie sofort zuzustellen.', + }, + ], + }, + }, +} diff --git a/warps/xexchange/meta.ts b/warps/xexchange/meta.ts new file mode 100644 index 0000000..db402e3 --- /dev/null +++ b/warps/xexchange/meta.ts @@ -0,0 +1,345 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + // --- Key swap pairs with full keywords + FAQs --- + + 'swap-egld-to-mex': { + keywords: { + en: ['swap EGLD to MEX', 'WEGLD MEX exchange', 'buy MEX token', 'xExchange swap', 'MultiversX DEX', 'MEX token', 'EGLD to MEX'], + de: ['EGLD in MEX tauschen', 'WEGLD MEX Börse', 'MEX Token kaufen', 'xExchange Tausch', 'MultiversX DEX', 'MEX Token', 'EGLD zu MEX'], + }, + useCases: { + en: [ + 'Acquire MEX governance tokens to vote on xExchange proposals', + 'Buy MEX to provide liquidity and earn trading fees', + 'Convert EGLD holdings to MEX for yield farming on xExchange', + ], + de: [ + 'MEX-Governance-Token erwerben, um über xExchange-Vorschläge abzustimmen', + 'MEX kaufen, um Liquidität bereitzustellen und Handelsgebühren zu verdienen', + 'EGLD-Bestände in MEX umwandeln für Yield Farming auf xExchange', + ], + }, + category: 'defi', + faq: { + en: [ + { + question: 'How do I swap EGLD to MEX on xExchange?', + answer: + 'You can swap EGLD to MEX directly through this action. Your EGLD is automatically wrapped to WEGLD and swapped for MEX on xExchange, the main decentralized exchange on MultiversX.', + }, + { + question: 'What is MEX and why would I swap EGLD for it?', + answer: + 'MEX is the governance and utility token of xExchange (formerly Maiar Exchange). Holding MEX allows you to participate in governance, provide liquidity, and earn rewards on the xExchange DEX.', + }, + ], + de: [ + { + question: 'Wie tausche ich EGLD in MEX auf xExchange?', + answer: + 'Du kannst EGLD direkt über diese Aktion in MEX tauschen. Dein EGLD wird automatisch in WEGLD gewrappt und auf xExchange, der wichtigsten dezentralen Börse auf MultiversX, gegen MEX getauscht.', + }, + { + question: 'Was ist MEX und warum sollte ich EGLD dafür tauschen?', + answer: + 'MEX ist der Governance- und Utility-Token von xExchange (ehemals Maiar Exchange). Mit MEX kannst du an der Governance teilnehmen, Liquidität bereitstellen und Belohnungen auf der xExchange DEX verdienen.', + }, + ], + }, + }, + + 'swap-usdc-to-wegld': { + keywords: { + en: ['swap USDC to WEGLD', 'buy EGLD with USDC', 'USDC WEGLD exchange', 'xExchange swap', 'MultiversX DEX', 'stablecoin to EGLD'], + de: ['USDC in WEGLD tauschen', 'EGLD mit USDC kaufen', 'USDC WEGLD Börse', 'xExchange Tausch', 'MultiversX DEX', 'Stablecoin zu EGLD'], + }, + useCases: { + en: [ + 'Convert stablecoins to EGLD for staking and earning rewards', + 'Enter the MultiversX ecosystem from USDC holdings', + 'Buy WEGLD at market price to participate in DeFi protocols', + ], + de: [ + 'Stablecoins in EGLD umwandeln für Staking und Belohnungen', + 'Mit USDC-Beständen in das MultiversX-Ökosystem einsteigen', + 'WEGLD zum Marktpreis kaufen, um an DeFi-Protokollen teilzunehmen', + ], + }, + category: 'defi', + faq: { + en: [ + { + question: 'Can I buy EGLD with USDC on xExchange?', + answer: + 'Yes. This action swaps your USDC for WEGLD (Wrapped EGLD) on xExchange. You can then unwrap WEGLD to native EGLD if needed.', + }, + { + question: 'What slippage should I expect when swapping USDC to WEGLD?', + answer: + 'Slippage depends on the liquidity available in the USDC/WEGLD pool and your trade size. For most trades the default slippage tolerance works well, but for larger amounts you may want to adjust it to avoid price impact.', + }, + ], + de: [ + { + question: 'Kann ich EGLD mit USDC auf xExchange kaufen?', + answer: + 'Ja. Diese Aktion tauscht dein USDC auf xExchange gegen WEGLD (Wrapped EGLD). Du kannst WEGLD anschließend bei Bedarf in natives EGLD unwrappen.', + }, + { + question: 'Mit welcher Slippage muss ich beim Tausch von USDC zu WEGLD rechnen?', + answer: + 'Die Slippage hängt von der verfügbaren Liquidität im USDC/WEGLD-Pool und deiner Handelsgröße ab. Für die meisten Trades funktioniert die Standard-Slippage-Toleranz gut, bei größeren Beträgen solltest du sie jedoch anpassen, um Preisauswirkungen zu vermeiden.', + }, + ], + }, + }, + + 'swap-wegld-to-usdc': { + keywords: { + en: ['swap WEGLD to USDC', 'sell EGLD for USDC', 'WEGLD USDC exchange', 'xExchange swap', 'MultiversX DEX', 'EGLD to stablecoin'], + de: ['WEGLD in USDC tauschen', 'EGLD für USDC verkaufen', 'WEGLD USDC Börse', 'xExchange Tausch', 'MultiversX DEX', 'EGLD zu Stablecoin'], + }, + useCases: { + en: [ + 'Lock in profits by converting EGLD to a stable USD-pegged asset', + 'Reduce portfolio volatility by moving to USDC', + 'Prepare funds for bridging out of the MultiversX ecosystem', + ], + de: [ + 'Gewinne sichern durch Umwandlung von EGLD in einen stabilen USD-gebundenen Vermögenswert', + 'Portfolio-Volatilität reduzieren durch Wechsel zu USDC', + 'Mittel für das Bridging aus dem MultiversX-Ökosystem vorbereiten', + ], + }, + category: 'defi', + faq: { + en: [ + { + question: 'How do I convert EGLD to USDC?', + answer: + 'Swap WEGLD for USDC on xExchange. If you hold native EGLD, wrap it to WEGLD first, then swap it for USDC in a single action.', + }, + { + question: 'Is USDC on MultiversX the same as USDC on Ethereum?', + answer: + 'USDC on MultiversX is a bridged version of the same USD-pegged stablecoin. It maintains its peg and can be bridged back to other chains through the MultiversX bridge.', + }, + ], + de: [ + { + question: 'Wie wandle ich EGLD in USDC um?', + answer: + 'Tausche WEGLD auf xExchange gegen USDC. Wenn du natives EGLD besitzt, wrappe es zuerst zu WEGLD und tausche es dann in einer einzigen Aktion gegen USDC.', + }, + { + question: 'Ist USDC auf MultiversX dasselbe wie USDC auf Ethereum?', + answer: + 'USDC auf MultiversX ist eine gebridgte Version desselben USD-gebundenen Stablecoins. Es behält seine Bindung bei und kann über die MultiversX-Bridge zurück zu anderen Chains gebridgt werden.', + }, + ], + }, + }, + + // --- Popular pairs with keywords only --- + + 'swap-wegld-to-usdt': { + keywords: { + en: ['swap WEGLD to USDT', 'sell EGLD for USDT', 'xExchange swap', 'MultiversX DEX', 'EGLD to stablecoin', 'USDT'], + de: ['WEGLD in USDT tauschen', 'EGLD für USDT verkaufen', 'xExchange Tausch', 'MultiversX DEX', 'EGLD zu Stablecoin', 'USDT'], + }, + useCases: { + en: [ + 'Hedge EGLD positions by swapping to USDT stablecoin', + 'Convert WEGLD to USDT for cross-chain transfers', + 'Secure trading profits in a dollar-pegged stablecoin on MultiversX', + ], + de: [ + 'EGLD-Positionen absichern durch Tausch in den USDT-Stablecoin', + 'WEGLD in USDT umwandeln für Cross-Chain-Transfers', + 'Handelsgewinne in einem dollargebundenen Stablecoin auf MultiversX sichern', + ], + }, + category: 'defi', + }, + + 'swap-usdt-to-wegld': { + keywords: { + en: ['swap USDT to WEGLD', 'buy EGLD with USDT', 'xExchange swap', 'MultiversX DEX', 'stablecoin to EGLD', 'USDT'], + de: ['USDT in WEGLD tauschen', 'EGLD mit USDT kaufen', 'xExchange Tausch', 'MultiversX DEX', 'Stablecoin zu EGLD', 'USDT'], + }, + useCases: { + en: [ + 'Buy EGLD with USDT to start staking on MultiversX', + 'Enter MultiversX DeFi protocols using Tether stablecoins', + 'Convert idle USDT into WEGLD for yield opportunities on xExchange', + ], + de: [ + 'EGLD mit USDT kaufen, um mit Staking auf MultiversX zu beginnen', + 'In MultiversX-DeFi-Protokolle einsteigen mit Tether-Stablecoins', + 'Ungenutztes USDT in WEGLD umwandeln für Ertragsmöglichkeiten auf xExchange', + ], + }, + category: 'defi', + }, + + 'swap-wegld-to-wbtc': { + keywords: { + en: ['swap WEGLD to WBTC', 'EGLD to Bitcoin', 'xExchange swap', 'MultiversX DEX', 'WBTC', 'Wrapped Bitcoin'], + de: ['WEGLD in WBTC tauschen', 'EGLD zu Bitcoin', 'xExchange Tausch', 'MultiversX DEX', 'WBTC', 'Wrapped Bitcoin'], + }, + useCases: { + en: [ + 'Diversify EGLD holdings into Bitcoin on MultiversX', + 'Gain BTC exposure without leaving the MultiversX ecosystem', + 'Trade WEGLD for Wrapped Bitcoin to hedge against altcoin volatility', + ], + de: [ + 'EGLD-Bestände in Bitcoin auf MultiversX diversifizieren', + 'BTC-Exposure erhalten, ohne das MultiversX-Ökosystem zu verlassen', + 'WEGLD gegen Wrapped Bitcoin tauschen, um sich gegen Altcoin-Volatilität abzusichern', + ], + }, + category: 'defi', + }, + + 'swap-wbtc-to-wegld': { + keywords: { + en: ['swap WBTC to WEGLD', 'Bitcoin to EGLD', 'xExchange swap', 'MultiversX DEX', 'WBTC', 'Wrapped Bitcoin'], + de: ['WBTC in WEGLD tauschen', 'Bitcoin zu EGLD', 'xExchange Tausch', 'MultiversX DEX', 'WBTC', 'Wrapped Bitcoin'], + }, + useCases: { + en: [ + 'Convert Bitcoin holdings to EGLD for MultiversX staking rewards', + 'Move BTC value into WEGLD to participate in xExchange liquidity pools', + 'Swap Wrapped Bitcoin for EGLD to use MultiversX dApps and services', + ], + de: [ + 'Bitcoin-Bestände in EGLD umwandeln für MultiversX-Staking-Belohnungen', + 'BTC-Wert in WEGLD transferieren, um an xExchange-Liquiditätspools teilzunehmen', + 'Wrapped Bitcoin gegen EGLD tauschen, um MultiversX-dApps und -Dienste zu nutzen', + ], + }, + category: 'defi', + }, + + 'swap-wegld-to-weth': { + keywords: { + en: ['swap WEGLD to WETH', 'EGLD to Ethereum', 'xExchange swap', 'MultiversX DEX', 'WETH', 'Wrapped Ether'], + de: ['WEGLD in WETH tauschen', 'EGLD zu Ethereum', 'xExchange Tausch', 'MultiversX DEX', 'WETH', 'Wrapped Ether'], + }, + useCases: { + en: [ + 'Diversify EGLD holdings into Ethereum on MultiversX', + 'Gain ETH exposure without bridging to the Ethereum network', + 'Trade WEGLD for Wrapped Ether to balance portfolio across major assets', + ], + de: [ + 'EGLD-Bestände in Ethereum auf MultiversX diversifizieren', + 'ETH-Exposure erhalten, ohne zum Ethereum-Netzwerk zu bridgen', + 'WEGLD gegen Wrapped Ether tauschen, um das Portfolio über große Assets auszubalancieren', + ], + }, + category: 'defi', + }, + + 'swap-weth-to-wegld': { + keywords: { + en: ['swap WETH to WEGLD', 'Ethereum to EGLD', 'xExchange swap', 'MultiversX DEX', 'WETH', 'Wrapped Ether'], + de: ['WETH in WEGLD tauschen', 'Ethereum zu EGLD', 'xExchange Tausch', 'MultiversX DEX', 'WETH', 'Wrapped Ether'], + }, + useCases: { + en: [ + 'Convert Ethereum holdings to EGLD for MultiversX staking', + 'Move ETH value into WEGLD to join xExchange liquidity pools', + 'Swap Wrapped Ether for EGLD to explore MultiversX dApps', + ], + de: [ + 'Ethereum-Bestände in EGLD umwandeln für MultiversX-Staking', + 'ETH-Wert in WEGLD transferieren, um xExchange-Liquiditätspools beizutreten', + 'Wrapped Ether gegen EGLD tauschen, um MultiversX-dApps zu erkunden', + ], + }, + category: 'defi', + }, + + 'swap-mex-to-usdc': { + keywords: { + en: ['swap MEX to USDC', 'sell MEX', 'MEX stablecoin', 'xExchange swap', 'MultiversX DEX', 'MEX token'], + de: ['MEX in USDC tauschen', 'MEX verkaufen', 'MEX Stablecoin', 'xExchange Tausch', 'MultiversX DEX', 'MEX Token'], + }, + useCases: { + en: [ + 'Realize MEX farming rewards by converting to USDC', + 'Take profits from MEX governance token holdings', + 'Move from volatile MEX positions into stable USDC on MultiversX', + ], + de: [ + 'MEX-Farming-Belohnungen durch Umwandlung in USDC realisieren', + 'Gewinne aus MEX-Governance-Token-Beständen mitnehmen', + 'Von volatilen MEX-Positionen in stabiles USDC auf MultiversX wechseln', + ], + }, + category: 'defi', + }, + + 'swap-usdc-to-mex': { + keywords: { + en: ['swap USDC to MEX', 'buy MEX with USDC', 'xExchange swap', 'MultiversX DEX', 'MEX token'], + de: ['USDC in MEX tauschen', 'MEX mit USDC kaufen', 'xExchange Tausch', 'MultiversX DEX', 'MEX Token'], + }, + useCases: { + en: [ + 'Buy MEX governance tokens with stablecoins to vote on xExchange proposals', + 'Acquire MEX with USDC for liquidity farming on xExchange', + 'Trade stablecoins for MEX to earn xExchange ecosystem rewards', + ], + de: [ + 'MEX-Governance-Token mit Stablecoins kaufen, um über xExchange-Vorschläge abzustimmen', + 'MEX mit USDC erwerben für Liquidity Farming auf xExchange', + 'Stablecoins gegen MEX tauschen, um xExchange-Ökosystem-Belohnungen zu verdienen', + ], + }, + category: 'defi', + }, + + 'swap-htm-to-wegld': { + keywords: { + en: ['swap HTM to WEGLD', 'Hatom to EGLD', 'xExchange swap', 'MultiversX DEX', 'HTM token', 'Hatom'], + de: ['HTM in WEGLD tauschen', 'Hatom zu EGLD', 'xExchange Tausch', 'MultiversX DEX', 'HTM Token', 'Hatom'], + }, + useCases: { + en: [ + 'Convert Hatom tokens to EGLD for staking on MultiversX', + 'Realize HTM token gains by swapping to WEGLD', + 'Move from Hatom lending positions into the native MultiversX asset', + ], + de: [ + 'Hatom-Token in EGLD umwandeln für Staking auf MultiversX', + 'HTM-Token-Gewinne durch Tausch in WEGLD realisieren', + 'Von Hatom-Lending-Positionen in den nativen MultiversX-Vermögenswert wechseln', + ], + }, + category: 'defi', + }, + + 'swap-wegld-to-htm': { + keywords: { + en: ['swap WEGLD to HTM', 'buy Hatom', 'EGLD to HTM', 'xExchange swap', 'MultiversX DEX', 'HTM token', 'Hatom'], + de: ['WEGLD in HTM tauschen', 'Hatom kaufen', 'EGLD zu HTM', 'xExchange Tausch', 'MultiversX DEX', 'HTM Token', 'Hatom'], + }, + useCases: { + en: [ + 'Buy Hatom tokens to participate in lending protocol governance', + 'Acquire HTM with EGLD to access Hatom liquid staking features', + 'Swap WEGLD for HTM to diversify into MultiversX DeFi lending', + ], + de: [ + 'Hatom-Token kaufen, um an der Lending-Protokoll-Governance teilzunehmen', + 'HTM mit EGLD erwerben, um Hatom-Liquid-Staking-Funktionen zu nutzen', + 'WEGLD gegen HTM tauschen, um in MultiversX-DeFi-Lending zu diversifizieren', + ], + }, + category: 'defi', + }, +} diff --git a/warps/xmoney/meta.ts b/warps/xmoney/meta.ts new file mode 100644 index 0000000..94f3d1e --- /dev/null +++ b/warps/xmoney/meta.ts @@ -0,0 +1,31 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'payment-link-create': { + keywords: { + en: ['create payment link', 'xMoney payment', 'payment URL', 'accept payments', 'payment gateway', 'crypto payment link'], + de: ['Zahlungslink erstellen', 'xMoney Zahlung', 'Zahlungs-URL', 'Zahlungen akzeptieren', 'Zahlungs-Gateway', 'Krypto-Zahlungslink'], + }, + useCases: { + en: ['Generate a payment link for a freelance invoice', 'Create a crypto checkout link for an online product sale', 'Share a payment URL with a client to collect a service fee'], + de: ['Einen Zahlungslink für eine Freelancer-Rechnung generieren', 'Einen Krypto-Checkout-Link für einen Online-Produktverkauf erstellen', 'Eine Zahlungs-URL mit einem Kunden teilen, um eine Servicegebühr einzuziehen'], + }, + category: 'commerce', + faq: { + en: [ + { + question: 'How do I create a payment link with xMoney?', + answer: + 'Generate a payment link via xMoney by specifying the amount and currency, then share the link with your customer to collect payment.', + }, + ], + de: [ + { + question: 'Wie erstelle ich einen Zahlungslink mit xMoney?', + answer: + 'Generiere einen Zahlungslink über xMoney, indem du den Betrag und die Währung angibst, und teile den Link mit deinem Kunden, um die Zahlung einzuziehen.', + }, + ], + }, + }, +} diff --git a/warps/xoxno/meta.ts b/warps/xoxno/meta.ts new file mode 100644 index 0000000..e186be7 --- /dev/null +++ b/warps/xoxno/meta.ts @@ -0,0 +1,139 @@ +import type { WarpExtras } from '../types' + +export const meta: Record = { + 'stake-egld': { + keywords: { + en: ['stake eGold', 'EGLD staking', 'XOXNO staking', 'MultiversX staking', 'delegate EGLD XOXNO'], + de: ['eGold staken', 'EGLD Staking', 'XOXNO Staking', 'MultiversX Staking', 'EGLD an XOXNO delegieren'], + }, + useCases: { + en: ['Earn passive income on EGLD', 'Delegate eGold to XOXNO validators', 'Support MultiversX network security'], + de: ['Passives Einkommen mit EGLD verdienen', 'eGold an XOXNO-Validatoren delegieren', 'MultiversX-Netzwerksicherheit unterstutzen'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I stake EGLD with XOXNO?', + answer: + 'You can delegate your EGLD to the XOXNO staking provider directly through this action. Your staked EGLD earns rewards automatically.', + }, + { + question: 'What are the rewards for staking with XOXNO?', + answer: + 'XOXNO distributes staking rewards to delegators based on the MultiversX network APR, minus a small service fee.', + }, + ], + de: [ + { + question: 'Wie stake ich EGLD mit XOXNO?', + answer: + 'Du kannst deine EGLD direkt über diese Aktion an den XOXNO-Staking-Anbieter delegieren. Deine gestakten EGLD verdienen automatisch Belohnungen.', + }, + { + question: 'Welche Belohnungen gibt es beim Staking mit XOXNO?', + answer: + 'XOXNO verteilt Staking-Belohnungen an Delegierer basierend auf dem MultiversX-Netzwerk-APR, abzüglich einer kleinen Servicegebühr.', + }, + ], + }, + }, + 'claim-rewards': { + keywords: { + en: ['claim staking rewards', 'XOXNO rewards', 'collect EGLD rewards', 'claim XOXNO delegation rewards'], + de: ['Staking-Belohnungen einfordern', 'XOXNO Belohnungen', 'EGLD Belohnungen einsammeln', 'XOXNO Delegationsbelohnungen einfordern'], + }, + useCases: { + en: ['Collect accumulated EGLD staking rewards', 'Withdraw earned eGold from XOXNO', 'Manage staking delegations'], + de: ['Angesammelte EGLD-Staking-Belohnungen einsammeln', 'Verdientes eGold von XOXNO abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'How do I claim my XOXNO staking rewards?', + answer: + 'Use this action to collect your accumulated EGLD staking rewards from XOXNO. Rewards are sent directly to your wallet.', + }, + ], + de: [ + { + question: 'Wie fordere ich meine XOXNO-Staking-Belohnungen ein?', + answer: + 'Nutze diese Aktion, um deine angesammelten EGLD-Staking-Belohnungen von XOXNO einzusammeln. Die Belohnungen werden direkt an dein Wallet gesendet.', + }, + ], + }, + }, + 'redelegate-egld': { + keywords: { + en: ['redelegate EGLD', 'XOXNO redelegate', 'compound staking rewards', 'restake EGLD XOXNO'], + de: ['EGLD redelegieren', 'XOXNO Redelegation', 'Staking-Belohnungen reinvestieren', 'EGLD bei XOXNO restaken'], + }, + useCases: { + en: ['Compound staking rewards automatically', 'Maximize EGLD earnings over time', 'Restake eGold with XOXNO'], + de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei XOXNO restaken'], + }, + category: 'staking', + }, + 'undelegate-egld': { + keywords: { + en: ['undelegate EGLD', 'unstake XOXNO', 'withdraw staked EGLD', 'remove XOXNO delegation'], + de: ['EGLD undelegieren', 'XOXNO unstaken', 'gestakte EGLD abheben', 'XOXNO Delegation entfernen'], + }, + useCases: { + en: ['Unstake EGLD from XOXNO', 'Withdraw staked eGold', 'Manage staking delegations'], + de: ['EGLD von XOXNO unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], + }, + category: 'staking', + }, + 'liquid-stake': { + keywords: { + en: ['liquid staking EGLD', 'XOXNO liquid stake', 'liquid EGLD staking', 'MultiversX liquid staking'], + de: ['Liquid Staking EGLD', 'XOXNO Liquid Stake', 'liquides EGLD Staking', 'MultiversX Liquid Staking'], + }, + useCases: { + en: ['Earn staking rewards while maintaining liquidity', 'Use liquid staked EGLD in DeFi', 'Stake eGold without locking assets'], + de: ['Staking-Belohnungen verdienen und Liquiditat behalten', 'Liquid gestakte EGLD in DeFi nutzen', 'eGold staken ohne Vermogenswerte zu sperren'], + }, + category: 'staking', + faq: { + en: [ + { + question: 'What is XOXNO liquid staking?', + answer: + 'XOXNO liquid staking lets you stake EGLD and receive a liquid token in return, so you can earn staking rewards while keeping your assets usable in DeFi.', + }, + ], + de: [ + { + question: 'Was ist XOXNO Liquid Staking?', + answer: + 'Mit XOXNO Liquid Staking kannst du EGLD staken und erhältst dafür einen liquiden Token, sodass du Staking-Belohnungen verdienst und deine Vermögenswerte gleichzeitig in DeFi nutzen kannst.', + }, + ], + }, + }, + 'liquid-unstake': { + keywords: { + en: ['liquid unstake EGLD', 'XOXNO liquid unstake', 'redeem liquid staked EGLD', 'unstake liquid XOXNO'], + de: ['EGLD Liquid Unstake', 'XOXNO Liquid Unstake', 'liquid gestakte EGLD einlösen', 'XOXNO Liquid unstaken'], + }, + useCases: { + en: ['Redeem liquid staked EGLD tokens', 'Exit XOXNO liquid staking position', 'Begin eGold withdrawal process'], + de: ['Liquid gestakte EGLD-Token einlosen', 'XOXNO Liquid-Staking-Position verlassen', 'eGold-Auszahlungsprozess starten'], + }, + category: 'staking', + }, + 'liquid-withdraw': { + keywords: { + en: ['liquid withdraw EGLD', 'XOXNO liquid withdraw', 'withdraw liquid staked EGLD', 'claim liquid unstake XOXNO'], + de: ['EGLD Liquid Auszahlung', 'XOXNO Liquid Auszahlung', 'liquid gestakte EGLD abheben', 'XOXNO Liquid Unstake einfordern'], + }, + useCases: { + en: ['Complete EGLD liquid unstaking withdrawal', 'Claim eGold after unbonding period', 'Finalize XOXNO liquid staking exit'], + de: ['EGLD Liquid-Unstaking-Auszahlung abschliessen', 'eGold nach Unbonding-Periode einfordern', 'XOXNO Liquid-Staking-Ausstieg abschliessen'], + }, + category: 'staking', + }, +} From 1d86a7627fb6311db1aee97dbb80ae1e3ea3436d Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 13:53:02 +0200 Subject: [PATCH 08/19] =?UTF-8?q?fix:=20improve=20warp=20descriptions=20fo?= =?UTF-8?q?r=20SEO=20=E2=80=94=20expand=20short=20descriptions,=20remove?= =?UTF-8?q?=20internal=20terminology?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Expand 36 warp descriptions from 1 sentence to 2-3 sentences with natural keywords - Make staking descriptions unique per provider instead of generic - Remove internal terms (API names, "wacli", "Message Batches") from user-facing text - Add missing German translations where absent - Mention brand names, supported features, and use cases in descriptions Co-Authored-By: Claude Opus 4.6 (1M context) --- warps/anthropic/cancel-task.json | 3 +- warps/anthropic/get-task-status.json | 3 +- warps/anthropic/joai-plugin-install.json | 3 +- warps/anthropic/launch-task.json | 3 +- warps/appointments/appointment-cancel.json | 63 +++++++++++++++++++ .../appointment-upsert-policy.json | 4 +- warps/asset/transfer.json | 4 +- warps/colombia-staking/stake-egld/warp.json | 4 +- warps/eapes/stake-egld/warp.json | 4 +- warps/hatom/liquid-stake/warp.json | 4 +- warps/inception-network/stake-egld/warp.json | 4 +- warps/joai/agent-create.json | 4 +- warps/joai/agent-name-update.json | 4 +- warps/joai/agent-publish.json | 4 +- warps/joai/contact-create.json | 4 +- warps/joai/contact-delete.json | 4 +- warps/joai/contact-update.json | 4 +- warps/joai/document-create.json | 4 +- warps/joai/goal-create.json | 4 +- warps/joai/item-create.json | 4 +- warps/joai/reminder-create.json | 4 +- warps/joai/user-name-update.json | 4 +- warps/joai/wallet-create.json | 4 +- warps/mregld/stake-egld/warp.json | 4 +- warps/multiversx/staking-redelegate-all.json | 4 +- warps/openai/cancel-task.json | 3 +- warps/openai/get-task-status.json | 3 +- warps/openai/joai-plugin-install.json | 3 +- warps/openai/launch-task.json | 3 +- warps/projectx/stake-egld/warp.json | 4 +- warps/resend/send-email.json | 4 +- warps/shop/shop-loyalty-stamp.json | 4 +- warps/typefully/create-draft.json | 4 +- warps/whatsapp/send-text.json | 4 +- warps/xmoney/payment-link-create.json | 4 +- warps/xoxno/stake-egld/warp.json | 4 +- 36 files changed, 133 insertions(+), 62 deletions(-) create mode 100644 warps/appointments/appointment-cancel.json diff --git a/warps/anthropic/cancel-task.json b/warps/anthropic/cancel-task.json index e9a6eb8..be7dbe6 100644 --- a/warps/anthropic/cancel-task.json +++ b/warps/anthropic/cancel-task.json @@ -5,7 +5,8 @@ "en": "Cancel task" }, "description": { - "en": "Cancel an Anthropic Message Batch run." + "en": "Cancel a running Claude background task. Stop an in-progress job to save resources or correct instructions before it completes.", + "de": "Brich eine laufende Claude-Hintergrundaufgabe ab. Stoppe einen laufenden Job, um Ressourcen zu sparen oder Anweisungen zu korrigieren, bevor er abgeschlossen wird." }, "vars": { "API_KEY": "env:ANTHROPIC_API_KEY|Anthropic API key" diff --git a/warps/anthropic/get-task-status.json b/warps/anthropic/get-task-status.json index c3c7e0e..fb35715 100644 --- a/warps/anthropic/get-task-status.json +++ b/warps/anthropic/get-task-status.json @@ -5,7 +5,8 @@ "en": "Get task status" }, "description": { - "en": "Get status for an Anthropic Message Batch run." + "en": "Check the progress of a Claude background task. See whether your job is queued, processing, or completed, and review the results when ready.", + "de": "Prüfe den Fortschritt einer Claude-Hintergrundaufgabe. Sieh nach, ob dein Job in der Warteschlange steht, verarbeitet wird oder abgeschlossen ist, und rufe die Ergebnisse ab." }, "vars": { "API_KEY": "env:ANTHROPIC_API_KEY|Anthropic API key" diff --git a/warps/anthropic/joai-plugin-install.json b/warps/anthropic/joai-plugin-install.json index e42f4c8..b8c2e14 100644 --- a/warps/anthropic/joai-plugin-install.json +++ b/warps/anthropic/joai-plugin-install.json @@ -5,7 +5,8 @@ "en": "Install JoAi plugin for Claude" }, "description": { - "en": "Connects your Claude to a JoAi agent via MCP." + "en": "Connect Claude to your JoAi agent as a plugin. This gives Claude direct access to your agent's skills, knowledge, and automations so you can use them from within Claude.", + "de": "Verbinde Claude mit deinem JoAi-Agenten als Plugin. So erhält Claude direkten Zugriff auf die Skills, das Wissen und die Automatisierungen deines Agenten, die du direkt in Claude nutzen kannst." }, "actions": [ { diff --git a/warps/anthropic/launch-task.json b/warps/anthropic/launch-task.json index cb41a62..d5d62a2 100644 --- a/warps/anthropic/launch-task.json +++ b/warps/anthropic/launch-task.json @@ -5,7 +5,8 @@ "en": "Launch task" }, "description": { - "en": "Launch a new task run through Anthropic Message Batches." + "en": "Launch a new background task powered by Claude. Send instructions to be processed asynchronously, ideal for long-running AI jobs like content generation, data analysis, or batch processing.", + "de": "Starte eine neue Hintergrundaufgabe mit Claude. Sende Anweisungen zur asynchronen Verarbeitung, ideal für langwierige KI-Aufgaben wie Content-Erstellung, Datenanalyse oder Batch-Verarbeitung." }, "vars": { "API_KEY": "env:ANTHROPIC_API_KEY|Anthropic API key" diff --git a/warps/appointments/appointment-cancel.json b/warps/appointments/appointment-cancel.json new file mode 100644 index 0000000..9c98e2f --- /dev/null +++ b/warps/appointments/appointment-cancel.json @@ -0,0 +1,63 @@ +{ + "protocol": "warp:3.0.0", + "name": "Appointments: Cancel", + "title": { + "en": "Cancel appointment", + "de": "Termin absagen" + }, + "description": { + "en": "Cancel an existing booked appointment and optionally provide a reason. Frees up the time slot so it becomes available for new bookings again.", + "de": "Sage einen bestehenden gebuchten Termin ab und gib optional einen Grund an. Der Zeitslot wird wieder freigegeben und steht für neue Buchungen zur Verfügung." + }, + "bot": "Use this when the user wants to cancel an already booked appointment. Collect the meeting id and an optional cancellation reason.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Cancel appointment", + "de": "Termin absagen" + }, + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{JOAI_AGENT_UUID}}/appointments/{{meetingId}}/cancel", + "method": "POST" + }, + "inputs": [ + { + "name": "Meeting ID", + "as": "meetingId", + "description": { + "en": "Booked appointment meeting id", + "de": "Meeting-ID des gebuchten Termins" + }, + "bot": "The booked meeting id returned by appointment-book.", + "type": "string", + "position": "arg:1", + "source": "field", + "required": true + }, + { + "name": "Reason", + "as": "reason", + "description": { + "en": "Optional cancellation reason", + "de": "Optionaler Absagegrund" + }, + "bot": "Optional short reason for the cancellation.", + "type": "string", + "source": "field", + "required": false + } + ] + } + ], + "output": { + "MEETING_ID": "out.data.id", + "STATUS": "out.data.status" + }, + "messages": { + "success": { + "en": "Appointment cancelled.", + "de": "Termin abgesagt." + } + } +} diff --git a/warps/appointments/appointment-upsert-policy.json b/warps/appointments/appointment-upsert-policy.json index 429a27e..1b65758 100644 --- a/warps/appointments/appointment-upsert-policy.json +++ b/warps/appointments/appointment-upsert-policy.json @@ -6,8 +6,8 @@ "de": "Einstellungen speichern" }, "description": { - "en": "Save the appointment policy for this agent.", - "de": "Termineinstellungen dieses Agenten speichern." + "en": "Save the appointment booking policy for your agent. Configure timezone, office hours, slot intervals, buffer times, minimum notice periods, and available services.", + "de": "Speichere die Terminbuchungsrichtlinie für deinen Agenten. Konfiguriere Zeitzone, Geschäftszeiten, Slot-Intervalle, Pufferzeiten, Mindestvorlaufzeiten und verfügbare Dienstleistungen." }, "bot": "Use this when the user wants to save appointment configuration changes such as timezone, office hours, slot interval, buffer, notice period, or service settings.", "actions": [ diff --git a/warps/asset/transfer.json b/warps/asset/transfer.json index 0e29c37..cae5f79 100644 --- a/warps/asset/transfer.json +++ b/warps/asset/transfer.json @@ -6,8 +6,8 @@ "de": "Assets übertragen" }, "description": { - "en": "Transfer a blockchain asset from one account to another.", - "de": "Übertrage einen Blockchain-Asset von einem Konto auf ein anderes." + "en": "Transfer EGLD, ESDT tokens, or NFTs on MultiversX from one wallet to another. Send any blockchain asset quickly and securely to any recipient address on the network.", + "de": "Uebertrage EGLD, ESDT-Token oder NFTs auf MultiversX von einer Wallet zur anderen. Sende jedes Blockchain-Asset schnell und sicher an jede Empfaengeradresse im Netzwerk." }, "actions": [ { diff --git a/warps/colombia-staking/stake-egld/warp.json b/warps/colombia-staking/stake-egld/warp.json index 6c4a5dc..7c3056d 100644 --- a/warps/colombia-staking/stake-egld/warp.json +++ b/warps/colombia-staking/stake-egld/warp.json @@ -7,8 +7,8 @@ "de": "eGold bei Colombia Staking staken" }, "description": { - "en": "Stake eGold to secure the network and earn rewards.", - "de": "Stake eGold, um das Netzwerk zu sichern und Belohnungen zu verdienen." + "en": "Delegate your EGLD to Colombia Staking and earn staking rewards on the MultiversX network. Colombia Staking helps secure the blockchain while giving you a reliable way to grow your eGold holdings through delegation.", + "de": "Delegiere dein EGLD an Colombia Staking und verdiene Staking-Belohnungen im MultiversX-Netzwerk. Colombia Staking hilft, die Blockchain zu sichern, und bietet dir eine zuverlaessige Moeglichkeit, deine eGold-Bestaende durch Delegation zu vermehren." }, "actions": [ { diff --git a/warps/eapes/stake-egld/warp.json b/warps/eapes/stake-egld/warp.json index ce77c6e..0a4ccf0 100644 --- a/warps/eapes/stake-egld/warp.json +++ b/warps/eapes/stake-egld/warp.json @@ -7,8 +7,8 @@ "de": "eGold bei EAPES staken" }, "description": { - "en": "Where capital meets culture, we power the chain and strengthen the tribe. Stake eGold to secure the network and earn rewards.", - "de": "Wo Kapital auf Kultur trifft, sichern wir die Blockchain und stärken den Stamm. Stake eGold, um das Netzwerk zu sichern und Belohnungen zu verdienen." + "en": "Stake your EGLD with EAPES, where capital meets culture on MultiversX. Earn staking rewards while supporting a community-driven validator that powers the chain and strengthens the tribe.", + "de": "Stake dein EGLD bei EAPES, wo Kapital auf Kultur im MultiversX-Netzwerk trifft. Verdiene Staking-Belohnungen und unterstuetze einen community-getriebenen Validator, der die Blockchain antreibt und den Stamm staerkt." }, "actions": [ { diff --git a/warps/hatom/liquid-stake/warp.json b/warps/hatom/liquid-stake/warp.json index f1803bc..a041f21 100644 --- a/warps/hatom/liquid-stake/warp.json +++ b/warps/hatom/liquid-stake/warp.json @@ -7,8 +7,8 @@ "de": "eGold mit Hatom Liquid Stake staken" }, "description": { - "en": "Stake eGold to secure the network and earn rewards using Hatom Liquid Stake.", - "de": "Stake eGold mit Hatom Liquid Stake, um das Netzwerk zu sichern und Belohnungen zu verdienen." + "en": "Liquid-stake your EGLD through Hatom Protocol on MultiversX and receive sEGLD in return. Earn staking rewards while keeping your assets liquid for use across DeFi lending, borrowing, and yield farming.", + "de": "Liquid-stake dein EGLD ueber das Hatom-Protokoll auf MultiversX und erhalte sEGLD zurueck. Verdiene Staking-Belohnungen und behalte gleichzeitig die Liquiditaet deiner Assets fuer DeFi-Lending, Borrowing und Yield Farming." }, "actions": [ { diff --git a/warps/inception-network/stake-egld/warp.json b/warps/inception-network/stake-egld/warp.json index 6af5cd3..be1e33f 100644 --- a/warps/inception-network/stake-egld/warp.json +++ b/warps/inception-network/stake-egld/warp.json @@ -7,8 +7,8 @@ "de": "eGold bei Inception Network staken" }, "description": { - "en": "Stake eGold to secure the network and earn rewards.", - "de": "Stake eGold, um das Netzwerk zu sichern und Belohnungen zu verdienen." + "en": "Delegate your EGLD to Inception Network and earn staking rewards on MultiversX. Inception Network provides reliable validator infrastructure, helping you grow your eGold while securing the blockchain.", + "de": "Delegiere dein EGLD an Inception Network und verdiene Staking-Belohnungen auf MultiversX. Inception Network bietet zuverlaessige Validator-Infrastruktur, damit du dein eGold vermehren und gleichzeitig die Blockchain sichern kannst." }, "actions": [ { diff --git a/warps/joai/agent-create.json b/warps/joai/agent-create.json index c63e4f5..b98cc1c 100644 --- a/warps/joai/agent-create.json +++ b/warps/joai/agent-create.json @@ -6,8 +6,8 @@ "de": "Agent erstellen" }, "description": { - "en": "Create a new agent in your team.", - "de": "Erstelle einen neuen Agenten in deinem Team." + "en": "Create a new AI assistant agent in your team that can chat, manage tasks, and automate workflows on your behalf. Give it a name and start customizing its skills, knowledge, and personality to fit your needs.", + "de": "Erstelle einen neuen KI-Assistenten in deinem Team, der chatten, Aufgaben verwalten und Abläufe automatisieren kann. Gib ihm einen Namen und passe seine Fähigkeiten, sein Wissen und seine Persönlichkeit an deine Bedürfnisse an." }, "actions": [ { diff --git a/warps/joai/agent-name-update.json b/warps/joai/agent-name-update.json index 3cd10a6..033067b 100644 --- a/warps/joai/agent-name-update.json +++ b/warps/joai/agent-name-update.json @@ -6,8 +6,8 @@ "de": "Agentenname aktualisieren" }, "description": { - "en": "Update the name of your agent.", - "de": "Aktualisiere den Namen deines Agenten." + "en": "Rename your AI agent to better reflect its purpose or brand identity. The updated name will appear across all conversations and shared links.", + "de": "Benenne deinen KI-Agenten um, damit er besser zu seinem Zweck oder deiner Marke passt. Der neue Name wird in allen Unterhaltungen und geteilten Links angezeigt." }, "actions": [ { diff --git a/warps/joai/agent-publish.json b/warps/joai/agent-publish.json index 511833e..17b92e3 100644 --- a/warps/joai/agent-publish.json +++ b/warps/joai/agent-publish.json @@ -6,8 +6,8 @@ "de": "Agenten veröffentlichen" }, "description": { - "en": "Make your agent publicly accessible so anyone can chat with it.", - "de": "Mache deinen Agenten öffentlich zugänglich, damit jeder damit chatten kann." + "en": "Publish your AI agent so anyone can discover and chat with it via a shareable link. Once public, your agent becomes accessible to the world while you keep full control over its configuration and knowledge.", + "de": "Veröffentliche deinen KI-Agenten, damit jeder ihn über einen teilbaren Link entdecken und mit ihm chatten kann. Du behältst dabei die volle Kontrolle über seine Konfiguration und sein Wissen." }, "actions": [ { diff --git a/warps/joai/contact-create.json b/warps/joai/contact-create.json index cae7621..90bd9ca 100644 --- a/warps/joai/contact-create.json +++ b/warps/joai/contact-create.json @@ -6,8 +6,8 @@ "de": "Kontakt hinzufügen" }, "description": { - "en": "Save a new contact to your address book.", - "de": "Einen neuen Kontakt in deinem Adressbuch speichern." + "en": "Add a new contact to your AI-managed address book with details like name, email, phone, company, and tags. Your agent uses your contacts as a built-in CRM to remember relationships and personalize interactions.", + "de": "Füge einen neuen Kontakt zu deinem KI-gestützten Adressbuch hinzu — mit Name, E-Mail, Telefon, Firma und Tags. Dein Agent nutzt deine Kontakte als integriertes CRM, um Beziehungen zu merken und Interaktionen zu personalisieren." }, "bot": "Help the user add a contact. Extract whatever info is available — at minimum a name. Don't force the user to provide all fields.", "actions": [ diff --git a/warps/joai/contact-delete.json b/warps/joai/contact-delete.json index 7cb0a19..74b9d45 100644 --- a/warps/joai/contact-delete.json +++ b/warps/joai/contact-delete.json @@ -6,8 +6,8 @@ "de": "Kontakt löschen" }, "description": { - "en": "Remove a contact from your address book.", - "de": "Einen Kontakt aus deinem Adressbuch entfernen." + "en": "Permanently remove a contact from your address book. This deletes all stored details for that person, including notes and tags, and your agent will no longer reference them.", + "de": "Entferne einen Kontakt dauerhaft aus deinem Adressbuch. Alle gespeicherten Details wie Notizen und Tags werden gelöscht und dein Agent wird diese Person nicht mehr referenzieren." }, "bot": "Help the user delete a contact. If the user refers to a contact by name, list contacts first to find the matching ID.", "actions": [ diff --git a/warps/joai/contact-update.json b/warps/joai/contact-update.json index df0a823..4300af6 100644 --- a/warps/joai/contact-update.json +++ b/warps/joai/contact-update.json @@ -6,8 +6,8 @@ "de": "Kontakt aktualisieren" }, "description": { - "en": "Update an existing contact's information.", - "de": "Informationen eines bestehenden Kontakts aktualisieren." + "en": "Edit an existing contact's details such as name, email, phone, company, or tags. Keep your address book up to date so your AI agent always has the latest information for personalized communication.", + "de": "Bearbeite die Details eines bestehenden Kontakts wie Name, E-Mail, Telefon, Firma oder Tags. Halte dein Adressbuch aktuell, damit dein KI-Agent immer die neuesten Infos für personalisierte Kommunikation hat." }, "bot": "Help the user update a contact's details. If the user refers to a contact by name, list contacts first to find the matching ID.", "actions": [ diff --git a/warps/joai/document-create.json b/warps/joai/document-create.json index aa219f3..07e6984 100644 --- a/warps/joai/document-create.json +++ b/warps/joai/document-create.json @@ -6,8 +6,8 @@ "de": "Dokument speichern" }, "description": { - "en": "Save a document with a title and content for your agent.", - "de": "Speichere ein Dokument mit Titel und Inhalt für deinen Agenten." + "en": "Save a document to your agent's knowledge base so it can reference the content in future conversations. Use this to store notes, articles, guidelines, or any reference material your AI assistant should know about.", + "de": "Speichere ein Dokument in der Wissensdatenbank deines Agenten, damit er den Inhalt in zukünftigen Unterhaltungen nutzen kann. Ideal für Notizen, Artikel, Richtlinien oder anderes Referenzmaterial, das dein KI-Assistent kennen soll." }, "bot": "Use this when the user shares a piece of content that should be saved as a document, such as an article, note, or reference material.", "actions": [ diff --git a/warps/joai/goal-create.json b/warps/joai/goal-create.json index f93748a..b62dcfd 100644 --- a/warps/joai/goal-create.json +++ b/warps/joai/goal-create.json @@ -6,8 +6,8 @@ "de": "Ziel erstellen" }, "description": { - "en": "Set a goal for your agent to proactively work toward.", - "de": "Setze ein Ziel, auf das dein Agent proaktiv hinarbeitet." + "en": "Define a goal for your AI agent to proactively work toward, such as growing revenue, launching a product, or building an audience. Your agent will track progress and suggest next steps to keep you on course.", + "de": "Definiere ein Ziel, auf das dein KI-Agent proaktiv hinarbeitet — zum Beispiel Umsatz steigern, ein Produkt launchen oder eine Community aufbauen. Dein Agent verfolgt den Fortschritt und schlägt nächste Schritte vor." }, "bot": "Help the user define a clear, actionable goal. If they give a vague idea, help them refine it into a specific goal title. Ask about priority only if it seems relevant — most goals are normal priority.", "actions": [ diff --git a/warps/joai/item-create.json b/warps/joai/item-create.json index 5bbbd5a..bb7ecec 100644 --- a/warps/joai/item-create.json +++ b/warps/joai/item-create.json @@ -6,8 +6,8 @@ "de": "Aufgabe erstellen" }, "description": { - "en": "Create a trackable action item or task for your agent.", - "de": "Erstelle eine verfolgbare Aufgabe für deinen Agenten." + "en": "Create a trackable task or to-do item that your AI agent will remember and follow up on. Set a title, priority, and optional due date to stay organized and never miss a deadline.", + "de": "Erstelle eine verfolgbare Aufgabe oder ein To-do, das dein KI-Agent sich merkt und nachverfolgt. Lege Titel, Priorität und optional ein Fälligkeitsdatum fest, um organisiert zu bleiben und keine Deadline zu verpassen." }, "bot": "Use this when the user mentions a task, to-do, or action item. Extract a clear title and optional details.", "actions": [ diff --git a/warps/joai/reminder-create.json b/warps/joai/reminder-create.json index 4b47675..bf8616e 100644 --- a/warps/joai/reminder-create.json +++ b/warps/joai/reminder-create.json @@ -6,8 +6,8 @@ "de": "Erinnerung setzen" }, "description": { - "en": "Set a timed reminder for your agent to notify you.", - "de": "Setze eine zeitgesteuerte Erinnerung, damit dein Agent dich benachrichtigt." + "en": "Schedule a reminder so your AI agent notifies you at the right time. Whether it's a meeting, a follow-up, or a personal errand, your agent will send you a timely notification so nothing slips through the cracks.", + "de": "Plane eine Erinnerung, damit dein KI-Agent dich zur richtigen Zeit benachrichtigt. Egal ob Meeting, Follow-up oder persönliche Erledigung — dein Agent schickt dir rechtzeitig eine Benachrichtigung, damit nichts untergeht." }, "bot": "Use this when the user wants to be reminded of something at a specific time. Extract the reminder text and when they want to be reminded.", "actions": [ diff --git a/warps/joai/user-name-update.json b/warps/joai/user-name-update.json index 94da450..3451707 100644 --- a/warps/joai/user-name-update.json +++ b/warps/joai/user-name-update.json @@ -6,8 +6,8 @@ "de": "Aktualisiere deinen Namen" }, "description": { - "en": "Update the name on your profile.", - "de": "Aktualisiere den Namen in deinem Profil." + "en": "Change the display name on your JoAi profile. Your name is how your AI agent and other team members identify you in conversations and notifications.", + "de": "Ändere den Anzeigenamen in deinem JoAi-Profil. Dein Name wird von deinem KI-Agenten und anderen Teammitgliedern in Unterhaltungen und Benachrichtigungen verwendet." }, "actions": [ { diff --git a/warps/joai/wallet-create.json b/warps/joai/wallet-create.json index d4b4956..62efa69 100644 --- a/warps/joai/wallet-create.json +++ b/warps/joai/wallet-create.json @@ -6,8 +6,8 @@ "de": "Wallet erstellen" }, "description": { - "en": "Create a new cloud wallet for a specific blockchain.", - "de": "Erstelle ein neues Cloud-Wallet für eine bestimmte Blockchain." + "en": "Create a secure cloud wallet for a supported blockchain like MultiversX or Solana. Your agent can use the wallet to send and receive tokens, interact with smart contracts, and manage on-chain assets on your behalf.", + "de": "Erstelle ein sicheres Cloud-Wallet für eine unterstützte Blockchain wie MultiversX oder Solana. Dein Agent kann damit Token senden und empfangen, mit Smart Contracts interagieren und On-Chain-Assets für dich verwalten." }, "actions": [ { diff --git a/warps/mregld/stake-egld/warp.json b/warps/mregld/stake-egld/warp.json index e6008f0..e0c6abd 100644 --- a/warps/mregld/stake-egld/warp.json +++ b/warps/mregld/stake-egld/warp.json @@ -7,8 +7,8 @@ "de": "Stake eGold mit MrEGLD" }, "description": { - "en": "Stake eGold to secure the network and earn rewards.", - "de": "Stake eGold, um das Netzwerk zu sichern und Belohnungen zu verdienen." + "en": "Stake your EGLD with MrEGLD, a trusted staking provider on the MultiversX network. Earn consistent delegation rewards while helping secure the blockchain with one of the ecosystem's dedicated validators.", + "de": "Stake dein EGLD bei MrEGLD, einem vertrauenswuerdigen Staking-Anbieter im MultiversX-Netzwerk. Verdiene zuverlaessige Delegations-Belohnungen und hilf, die Blockchain mit einem der engagiertesten Validatoren des Oekosystems zu sichern." }, "actions": [ { diff --git a/warps/multiversx/staking-redelegate-all.json b/warps/multiversx/staking-redelegate-all.json index 897896e..bb76791 100644 --- a/warps/multiversx/staking-redelegate-all.json +++ b/warps/multiversx/staking-redelegate-all.json @@ -7,8 +7,8 @@ "de": "Redelegate alle deine MultiversX eGold Stake-Positionen" }, "description": { - "en": "Redelegate all your MultiversX eGold (EGLD) staking positions.", - "de": "Redelegate alle deine MultiversX eGold (EGLD) Staking-Positionen." + "en": "Redelegate all your MultiversX eGold (EGLD) staking positions in one step. Automatically compounds your pending rewards across all delegation providers to maximize your staking yield.", + "de": "Delegiere alle deine MultiversX eGold (EGLD) Staking-Positionen in einem Schritt neu. Deine ausstehenden Belohnungen werden automatisch bei allen Delegation-Anbietern reinvestiert, um deinen Staking-Ertrag zu maximieren." }, "actions": [ { diff --git a/warps/openai/cancel-task.json b/warps/openai/cancel-task.json index 6d7e5b2..6bc1f7a 100644 --- a/warps/openai/cancel-task.json +++ b/warps/openai/cancel-task.json @@ -5,7 +5,8 @@ "en": "Cancel task" }, "description": { - "en": "Cancel an in-progress OpenAI run." + "en": "Cancel a running OpenAI background task. Stop an in-progress job to save resources or correct instructions before it completes.", + "de": "Brich eine laufende OpenAI-Hintergrundaufgabe ab. Stoppe einen laufenden Job, um Ressourcen zu sparen oder Anweisungen zu korrigieren, bevor er abgeschlossen wird." }, "vars": { "API_KEY": "env:OPENAI_API_KEY|OpenAI API key" diff --git a/warps/openai/get-task-status.json b/warps/openai/get-task-status.json index 06ac479..65746a6 100644 --- a/warps/openai/get-task-status.json +++ b/warps/openai/get-task-status.json @@ -5,7 +5,8 @@ "en": "Get task status" }, "description": { - "en": "Get status for an OpenAI task run." + "en": "Check the progress of an OpenAI background task. See whether your job is queued, processing, or completed, and review the results when ready.", + "de": "Prüfe den Fortschritt einer OpenAI-Hintergrundaufgabe. Sieh nach, ob dein Job in der Warteschlange steht, verarbeitet wird oder abgeschlossen ist, und rufe die Ergebnisse ab." }, "vars": { "API_KEY": "env:OPENAI_API_KEY|OpenAI API key" diff --git a/warps/openai/joai-plugin-install.json b/warps/openai/joai-plugin-install.json index 16584cd..d3b34ac 100644 --- a/warps/openai/joai-plugin-install.json +++ b/warps/openai/joai-plugin-install.json @@ -5,7 +5,8 @@ "en": "Install JoAi plugin for Codex" }, "description": { - "en": "Connects your Codex to a JoAi agent via MCP." + "en": "Connect Codex to your JoAi agent as a plugin. This gives Codex direct access to your agent's skills, knowledge, and automations so you can use them from within Codex.", + "de": "Verbinde Codex mit deinem JoAi-Agenten als Plugin. So erhält Codex direkten Zugriff auf die Skills, das Wissen und die Automatisierungen deines Agenten, die du direkt in Codex nutzen kannst." }, "actions": [ { diff --git a/warps/openai/launch-task.json b/warps/openai/launch-task.json index 99c410f..b8ac597 100644 --- a/warps/openai/launch-task.json +++ b/warps/openai/launch-task.json @@ -5,7 +5,8 @@ "en": "Launch task" }, "description": { - "en": "Launch a new background task run using the OpenAI Responses API." + "en": "Launch a new background task powered by OpenAI. Send instructions to be processed asynchronously, ideal for long-running AI jobs like content generation, data analysis, or batch processing.", + "de": "Starte eine neue Hintergrundaufgabe mit OpenAI. Sende Anweisungen zur asynchronen Verarbeitung, ideal für langwierige KI-Aufgaben wie Content-Erstellung, Datenanalyse oder Batch-Verarbeitung." }, "vars": { "API_KEY": "env:OPENAI_API_KEY|OpenAI API key" diff --git a/warps/projectx/stake-egld/warp.json b/warps/projectx/stake-egld/warp.json index c8949f9..8ecc82e 100644 --- a/warps/projectx/stake-egld/warp.json +++ b/warps/projectx/stake-egld/warp.json @@ -7,8 +7,8 @@ "de": "Stake eGold mit ProjectX" }, "description": { - "en": "Stake eGold to secure the network and earn rewards.", - "de": "Stake eGold, um das Netzwerk zu sichern und Belohnungen zu verdienen." + "en": "Delegate your EGLD to ProjectX and earn staking rewards on the MultiversX blockchain. ProjectX offers a high-performance validator node, giving you a seamless way to grow your eGold through secure delegation.", + "de": "Delegiere dein EGLD an ProjectX und verdiene Staking-Belohnungen auf der MultiversX-Blockchain. ProjectX betreibt einen leistungsstarken Validator-Node und bietet dir eine einfache Moeglichkeit, dein eGold durch sichere Delegation zu vermehren." }, "actions": [ { diff --git a/warps/resend/send-email.json b/warps/resend/send-email.json index 0909292..43ff6f0 100644 --- a/warps/resend/send-email.json +++ b/warps/resend/send-email.json @@ -6,8 +6,8 @@ "de": "Eine E-Mail senden" }, "description": { - "en": "Send an email using Resend's email API. Supports HTML, plain text, attachments, and custom headers.", - "de": "Sende eine E-Mail über die Resend E-Mail-API. Unterstützt HTML, Plain-Text, Anhänge und benutzerdefinierte Header." + "en": "Send transactional or marketing emails with full HTML and plain text support. Includes CC, BCC, reply-to, and custom headers for newsletters, notifications, and automated email workflows.", + "de": "Versende transaktionale oder Marketing-E-Mails mit vollständiger HTML- und Plain-Text-Unterstützung. Mit CC, BCC, Antwortadresse und benutzerdefinierten Headern für Newsletter, Benachrichtigungen und automatisierte E-Mail-Workflows." }, "vars": { "API_KEY": "env:RESEND_API_KEY|Get your API key from the Resend.com Dashboard at https://resend.com/api-keys" diff --git a/warps/shop/shop-loyalty-stamp.json b/warps/shop/shop-loyalty-stamp.json index 82c885b..dac889c 100644 --- a/warps/shop/shop-loyalty-stamp.json +++ b/warps/shop/shop-loyalty-stamp.json @@ -6,8 +6,8 @@ "de": "Stempel hinzufügen" }, "description": { - "en": "Scan a customer's loyalty card to add a stamp.", - "de": "Scanne die Treuekarte eines Kunden, um einen Stempel hinzuzufügen." + "en": "Scan a customer's loyalty card to add a stamp and track their reward progress. Automatically shows the current stamp count and notifies when a reward is ready to be redeemed.", + "de": "Scanne die Treuekarte eines Kunden, um einen Stempel hinzuzufügen und den Prämienfortschritt zu verfolgen. Zeigt automatisch den aktuellen Stempelstand an und informiert, wenn eine Prämie eingelöst werden kann." }, "bot": "Adds stamp via NFC. Log visit activity on contact after success.", "chain": "multiversx", diff --git a/warps/typefully/create-draft.json b/warps/typefully/create-draft.json index d256baa..b8c4ac7 100644 --- a/warps/typefully/create-draft.json +++ b/warps/typefully/create-draft.json @@ -6,8 +6,8 @@ "de": "Entwurf erstellen oder planen" }, "description": { - "en": "Create a draft post given some text content and schedule it for a later date.", - "de": "Erstelle einen Entwurf anhand von Textinhalt und plane ihn für ein späteres Datum." + "en": "Create and schedule social media posts for Twitter/X and LinkedIn via Typefully. Draft content, auto-split threads, and queue posts for optimal publishing times.", + "de": "Erstelle und plane Social-Media-Beiträge für Twitter/X und LinkedIn über Typefully. Verfasse Inhalte, teile Threads automatisch auf und reihe Posts für optimale Veröffentlichungszeiten ein." }, "vars": { "API_KEY": "env:TYPEFULLY_API_KEY|Get your API key in the Dashboard of Typefully.com" diff --git a/warps/whatsapp/send-text.json b/warps/whatsapp/send-text.json index 6fe0eda..9d98136 100644 --- a/warps/whatsapp/send-text.json +++ b/warps/whatsapp/send-text.json @@ -6,8 +6,8 @@ "de": "WhatsApp-Nachricht senden" }, "description": { - "en": "Send a text message via WhatsApp using wacli.", - "de": "Eine Textnachricht über WhatsApp mit wacli senden." + "en": "Send a text message to any phone number via WhatsApp. Perfect for customer notifications, order updates, reminders, or quick personal messages directly from your agent.", + "de": "Sende eine Textnachricht an beliebige Telefonnummern über WhatsApp. Ideal für Kundenbenachrichtigungen, Bestellupdates, Erinnerungen oder schnelle persönliche Nachrichten direkt von deinem Agenten." }, "actions": [ { diff --git a/warps/xmoney/payment-link-create.json b/warps/xmoney/payment-link-create.json index 44b7bc9..c841c8a 100644 --- a/warps/xmoney/payment-link-create.json +++ b/warps/xmoney/payment-link-create.json @@ -6,8 +6,8 @@ "de": "Einen Zahlungslink erstellen" }, "description": { - "en": "Create a crypto payment link using xMoney.", - "de": "Erstelle einen Zahlungslink für Kryptowährungen mit xMoney." + "en": "Create a crypto payment link with xMoney to accept payments for invoices, products, or services. Share the link with customers to collect cryptocurrency payments quickly and securely through the xMoney merchant platform.", + "de": "Erstelle einen Krypto-Zahlungslink mit xMoney, um Zahlungen fuer Rechnungen, Produkte oder Dienstleistungen zu akzeptieren. Teile den Link mit Kunden, um Kryptozahlungen schnell und sicher ueber die xMoney-Haendlerplattform einzuziehen." }, "vars": { "API_KEY": "env:XMONEY_API_KEY|Get your API key from the xMoney Merchant Dashboard" diff --git a/warps/xoxno/stake-egld/warp.json b/warps/xoxno/stake-egld/warp.json index 5bcf224..eaf4a04 100644 --- a/warps/xoxno/stake-egld/warp.json +++ b/warps/xoxno/stake-egld/warp.json @@ -7,8 +7,8 @@ "de": "Stake eGold mit XOXNO" }, "description": { - "en": "Stake eGold to secure the network and earn rewards.", - "de": "Stake eGold, um das Netzwerk zu sichern und Belohnungen zu verdienen." + "en": "Stake your EGLD with XOXNO, a leading NFT marketplace and validator on MultiversX. Earn staking rewards while supporting the team behind one of the blockchain's most active ecosystem projects.", + "de": "Stake dein EGLD bei XOXNO, einem fuehrenden NFT-Marktplatz und Validator auf MultiversX. Verdiene Staking-Belohnungen und unterstuetze das Team hinter einem der aktivsten Oekosystem-Projekte der Blockchain." }, "actions": [ { From 8bfeb593f35ba73b6a8d295f050203851b2d71a6 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 13:53:45 +0200 Subject: [PATCH 09/19] add appointments --- .../appointment-availability.json | 167 ++++++++++++++++ warps/appointments/appointment-book.json | 179 ++++++++++++++++++ .../appointments/appointment-onboarding.json | 31 +++ .../appointment-request-create.json | 157 +++++++++++++++ .../appointments/appointment-reschedule.json | 89 +++++++++ warps/appointments/brand.ts | 27 +++ 6 files changed, 650 insertions(+) create mode 100644 warps/appointments/appointment-availability.json create mode 100644 warps/appointments/appointment-book.json create mode 100644 warps/appointments/appointment-onboarding.json create mode 100644 warps/appointments/appointment-request-create.json create mode 100644 warps/appointments/appointment-reschedule.json create mode 100644 warps/appointments/brand.ts diff --git a/warps/appointments/appointment-availability.json b/warps/appointments/appointment-availability.json new file mode 100644 index 0000000..286cfe1 --- /dev/null +++ b/warps/appointments/appointment-availability.json @@ -0,0 +1,167 @@ +{ + "protocol": "warp:3.0.0", + "name": "Appointments: Availability", + "title": { + "en": "Appointment availability", + "de": "Terminverfuegbarkeit" + }, + "description": { + "en": "Collect booking details and return appointment availability from the current agent calendar.", + "de": "Sammelt Buchungsdetails und liefert Terminverfuegbarkeit aus dem Kalender des aktuellen Agenten." + }, + "bot": "Use this when the user wants to book an appointment, schedule a call, or find available meeting times. Collect the purpose, requested time window, timezone, duration, and attendee details. Ask only for missing fields. Convert relative dates like tomorrow or next Friday into exact ISO datetimes before submitting.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Check availability", + "de": "Verfuegbarkeit pruefen" + }, + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{JOAI_AGENT_UUID}}/appointments/availability", + "method": "POST" + }, + "inputs": [ + { + "name": "Appointment Title", + "as": "title", + "description": { + "en": "The purpose of the appointment", + "de": "Der Zweck des Termins" + }, + "bot": "Short title describing the appointment, such as 'Intro Call', 'Product Demo', or 'Support Session'.", + "type": "string", + "position": "arg:1", + "source": "field", + "required": true, + "min": 3 + }, + { + "name": "Window Start", + "as": "windowStart", + "description": { + "en": "The earliest acceptable start time in ISO format", + "de": "Die frueheste moegliche Startzeit im ISO-Format" + }, + "bot": "Earliest acceptable appointment start in ISO 8601 format, for example 2026-04-03T09:00:00Z.", + "type": "string", + "position": "arg:2", + "source": "field", + "required": true + }, + { + "name": "Window End", + "as": "windowEnd", + "description": { + "en": "The latest acceptable end of the scheduling window in ISO format", + "de": "Das spaeteste Ende des Zeitfensters im ISO-Format" + }, + "bot": "End of the acceptable scheduling window in ISO 8601 format, for example 2026-04-03T17:00:00Z.", + "type": "string", + "position": "arg:3", + "source": "field", + "required": true + }, + { + "name": "Duration Minutes", + "as": "durationMinutes", + "description": { + "en": "Appointment length in minutes", + "de": "Terminlaenge in Minuten" + }, + "bot": "Meeting duration in minutes. Use 30 unless the user asks for a different length.", + "type": "number", + "source": "field", + "required": true, + "default": 30 + }, + { + "name": "Timezone", + "as": "timezone", + "description": { + "en": "User timezone such as Europe/Vienna or America/New_York", + "de": "Zeitzone wie Europe/Vienna oder America/New_York" + }, + "bot": "Timezone identifier like Europe/Vienna, America/New_York, or UTC. Use the user's stated timezone if available.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Service Slug", + "as": "serviceSlug", + "description": { + "en": "Optional configured service identifier", + "de": "Optionaler Bezeichner fuer einen konfigurierten Service" + }, + "bot": "If the business uses named services like cleaning, consultation, or implant-consult, pass the configured service slug.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Attendee Name", + "as": "attendeeName", + "description": { + "en": "The attendee or requester name", + "de": "Name des Teilnehmers oder Anfragenden" + }, + "bot": "The name of the person requesting or attending the appointment.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Attendee Email", + "as": "attendeeEmail", + "description": { + "en": "The attendee or requester email", + "de": "E-Mail des Teilnehmers oder Anfragenden" + }, + "bot": "The email address of the attendee if known.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Notes", + "as": "description", + "description": { + "en": "Optional notes or agenda", + "de": "Optionale Notizen oder Agenda" + }, + "bot": "Optional notes, context, or agenda for the appointment.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Limit", + "as": "limit", + "description": { + "en": "Maximum number of slot suggestions", + "de": "Maximale Anzahl an Vorschlaegen" + }, + "bot": "How many slot suggestions to return. Use 3 unless the user explicitly asks for more or fewer.", + "type": "number", + "source": "field", + "required": false, + "default": 3 + } + ] + } + ], + "output": { + "CONNECTED": "out.data.connected", + "TIMEZONE": "out.data.timezone", + "SERVICE": "out.data.service", + "SLOTS": "out.data.slots", + "SLOT_COUNT": "out.data.slots.length" + }, + "messages": { + "success": { + "en": "Found {{SLOT_COUNT}} appointment slot(s).", + "de": "{{SLOT_COUNT}} Terminvorschlaege gefunden." + } + } +} diff --git a/warps/appointments/appointment-book.json b/warps/appointments/appointment-book.json new file mode 100644 index 0000000..c8c563b --- /dev/null +++ b/warps/appointments/appointment-book.json @@ -0,0 +1,179 @@ +{ + "protocol": "warp:3.0.0", + "name": "Appointments: Book", + "title": { + "en": "Book appointment", + "de": "Termin buchen" + }, + "description": { + "en": "Book a confirmed appointment slot for the current agent.", + "de": "Bucht einen bestaetigten Termin fuer den aktuellen Agenten." + }, + "bot": "Use this only after the user has chosen a specific appointment slot. Collect the title, exact scheduled start and end times, timezone, attendee information, and optional notes. If the user wants a video link, set conferenceProvider to google_meet or zoom. Otherwise leave it empty.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Book now", + "de": "Jetzt buchen" + }, + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{JOAI_AGENT_UUID}}/appointments/book", + "method": "POST" + }, + "inputs": [ + { + "name": "Appointment Title", + "as": "title", + "description": { + "en": "The appointment title", + "de": "Der Titel des Termins" + }, + "bot": "Short title describing the booked appointment.", + "type": "string", + "position": "arg:1", + "source": "field", + "required": true, + "min": 3 + }, + { + "name": "Scheduled At", + "as": "scheduledAt", + "description": { + "en": "Exact appointment start in ISO format", + "de": "Exakter Startzeitpunkt im ISO-Format" + }, + "bot": "Exact confirmed appointment start in ISO 8601 format.", + "type": "string", + "position": "arg:2", + "source": "field", + "required": true + }, + { + "name": "End At", + "as": "endAt", + "description": { + "en": "Exact appointment end in ISO format", + "de": "Exaktes Ende im ISO-Format" + }, + "bot": "Exact confirmed appointment end in ISO 8601 format.", + "type": "string", + "position": "arg:3", + "source": "field", + "required": true + }, + { + "name": "Timezone", + "as": "timezone", + "description": { + "en": "Appointment timezone", + "de": "Zeitzone des Termins" + }, + "bot": "Timezone identifier like Europe/Vienna, America/New_York, or UTC.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Service Slug", + "as": "serviceSlug", + "description": { + "en": "Optional configured service identifier", + "de": "Optionaler Bezeichner fuer einen konfigurierten Service" + }, + "bot": "If the booking belongs to a configured service, pass the same service slug used for availability.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Routed Agent UUID", + "as": "routedAgentUuid", + "description": { + "en": "Optional staff agent UUID for routed bookings", + "de": "Optionale UUID des Mitarbeiter-Agenten fuer geroutete Buchungen" + }, + "bot": "If appointment availability returned a specific agentUuid for the selected slot, pass it here unchanged.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Appointment Request ID", + "as": "appointmentRequestId", + "description": { + "en": "Optional linked appointment request id", + "de": "Optionale verknuepfte Terminanfrage-ID" + }, + "bot": "If this booking is fulfilling a previously created appointment request, pass that request id.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Attendee Name", + "as": "attendeeName", + "description": { + "en": "The attendee name", + "de": "Name des Teilnehmers" + }, + "bot": "Name of the main attendee if known.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Attendee Email", + "as": "attendeeEmail", + "description": { + "en": "The attendee email", + "de": "E-Mail des Teilnehmers" + }, + "bot": "Email address of the main attendee if known.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Notes", + "as": "description", + "description": { + "en": "Optional notes or agenda", + "de": "Optionale Notizen oder Agenda" + }, + "bot": "Optional notes, context, or agenda to include with the appointment.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Conference Provider", + "as": "conferenceProvider", + "description": { + "en": "Optional remote meeting provider", + "de": "Optionaler Anbieter fuer Videotermine" + }, + "bot": "Use 'google_meet' or 'zoom' only if the user explicitly wants a remote meeting link. Otherwise leave empty.", + "type": "string", + "source": "field", + "required": false, + "options": { + "google_meet": "Google Meet", + "zoom": "Zoom" + } + } + ] + } + ], + "output": { + "MEETING_ID": "out.data.id", + "MEETING_URL": "out.data.inviteUrl", + "CALENDAR_EVENT_ID": "out.data.calendarEventId" + }, + "messages": { + "success": { + "en": "Appointment booked successfully.", + "de": "Termin erfolgreich gebucht." + } + } +} diff --git a/warps/appointments/appointment-onboarding.json b/warps/appointments/appointment-onboarding.json new file mode 100644 index 0000000..a8bf2af --- /dev/null +++ b/warps/appointments/appointment-onboarding.json @@ -0,0 +1,31 @@ +{ + "protocol": "warp:3.0.0", + "name": "Appointments: Onboarding", + "title": { + "en": "Set up appointments", + "de": "Termine einrichten" + }, + "description": { + "en": "Start appointment onboarding by opening calendar integration setup for this agent.", + "de": "Starte das Termin-Onboarding, indem die Kalender-Integration für diesen Agenten geöffnet wird." + }, + "bot": "Use this when the user wants to set up appointment booking for the first time. This opens the calendar integration setup so the agent can book real appointments.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Start setup", + "de": "Setup starten" + }, + "inputs": [], + "auto": true + } + ], + "messages": { + "success": { + "en": "Opening calendar setup for appointments...", + "de": "Kalender-Setup für Termine wird geöffnet..." + } + }, + "next": "@joai-settings-integration-open?integration=calendar" +} diff --git a/warps/appointments/appointment-request-create.json b/warps/appointments/appointment-request-create.json new file mode 100644 index 0000000..11c9034 --- /dev/null +++ b/warps/appointments/appointment-request-create.json @@ -0,0 +1,157 @@ +{ + "protocol": "warp:3.0.0", + "name": "Appointments: Create Request", + "title": { + "en": "Create appointment request", + "de": "Terminanfrage erstellen" + }, + "description": { + "en": "Create an appointment request when an appointment cannot be booked natively.", + "de": "Erstellt eine Terminanfrage, wenn ein Termin nicht direkt gebucht werden kann." + }, + "bot": "Use this when booking cannot be completed because there is no connected calendar, no suitable slots were found, or the user wants manual follow-up. Create a clear appointment request with the requester, preferred time window, duration, timezone, failure reason, and notes.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Create request", + "de": "Anfrage erstellen" + }, + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{JOAI_AGENT_UUID}}/appointment-requests", + "method": "POST" + }, + "inputs": [ + { + "name": "Title", + "as": "title", + "description": { + "en": "Title for the appointment request", + "de": "Titel fuer die Terminanfrage" + }, + "bot": "Use a title like 'Appointment request: Intro Call'.", + "type": "string", + "position": "arg:1", + "source": "field", + "required": true, + "min": 3 + }, + { + "name": "Service Slug", + "as": "serviceSlug", + "description": { + "en": "Optional configured service identifier", + "de": "Optionaler Bezeichner fuer einen konfigurierten Service" + }, + "bot": "If the request belongs to a configured service, pass the service slug.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Requester Name", + "as": "requesterName", + "description": { + "en": "Name of the requester", + "de": "Name des Anfragenden" + }, + "bot": "Name of the requester if known.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Requester Email", + "as": "requesterEmail", + "description": { + "en": "Email of the requester", + "de": "E-Mail des Anfragenden" + }, + "bot": "Email address of the requester if known.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Window Start", + "as": "windowStart", + "description": { + "en": "Preferred scheduling window start in ISO format", + "de": "Beginn des bevorzugten Zeitfensters im ISO-Format" + }, + "bot": "Earliest preferred time in ISO 8601 format.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Window End", + "as": "windowEnd", + "description": { + "en": "Preferred scheduling window end in ISO format", + "de": "Ende des bevorzugten Zeitfensters im ISO-Format" + }, + "bot": "Latest preferred time in ISO 8601 format.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Duration Minutes", + "as": "durationMinutes", + "description": { + "en": "Requested appointment duration", + "de": "Gewuenschte Termindauer" + }, + "bot": "Requested appointment duration in minutes.", + "type": "number", + "source": "field", + "required": false + }, + { + "name": "Timezone", + "as": "timezone", + "description": { + "en": "Requester timezone", + "de": "Zeitzone des Anfragenden" + }, + "bot": "Timezone identifier such as Europe/Vienna or America/New_York.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Failure Reason", + "as": "failureReason", + "description": { + "en": "Why direct booking could not complete", + "de": "Warum die direkte Buchung nicht abgeschlossen werden konnte" + }, + "bot": "Use a compact machine-readable reason like no_calendar_integration, no_suitable_slots, or stale_slot.", + "type": "string", + "source": "field", + "required": false + }, + { + "name": "Notes", + "as": "notes", + "description": { + "en": "Optional request notes", + "de": "Optionale Notizen zur Anfrage" + }, + "bot": "Optional notes or context for manual follow-up.", + "type": "string", + "position": "arg:2", + "source": "field", + "required": false + } + ] + } + ], + "messages": { + "success": { + "en": "Appointment request captured for follow-up.", + "de": "Terminanfrage fuer die Nachverfolgung erfasst." + } + } +} diff --git a/warps/appointments/appointment-reschedule.json b/warps/appointments/appointment-reschedule.json new file mode 100644 index 0000000..3d466f7 --- /dev/null +++ b/warps/appointments/appointment-reschedule.json @@ -0,0 +1,89 @@ +{ + "protocol": "warp:3.0.0", + "name": "Appointments: Reschedule", + "title": { + "en": "Reschedule appointment", + "de": "Termin verschieben" + }, + "description": { + "en": "Reschedule an existing booked appointment to a new confirmed slot.", + "de": "Verschiebt einen bestehenden gebuchten Termin auf einen neuen bestaetigten Slot." + }, + "bot": "Use this only after the user has chosen a new specific slot for an existing appointment. Collect the booked meeting id plus the exact new start and end times. If the new slot is rejected, offer fresh availability.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Reschedule", + "de": "Verschieben" + }, + "destination": { + "url": "INJECT:API_BASE/v1/agents/{{JOAI_AGENT_UUID}}/appointments/{{meetingId}}/reschedule", + "method": "POST" + }, + "inputs": [ + { + "name": "Meeting ID", + "as": "meetingId", + "description": { + "en": "Booked appointment meeting id", + "de": "Meeting-ID des gebuchten Termins" + }, + "bot": "The booked meeting id returned by appointment-book.", + "type": "string", + "position": "arg:1", + "source": "field", + "required": true + }, + { + "name": "Scheduled At", + "as": "scheduledAt", + "description": { + "en": "New exact appointment start in ISO format", + "de": "Neuer exakter Startzeitpunkt im ISO-Format" + }, + "bot": "Exact confirmed appointment start in ISO 8601 format.", + "type": "string", + "position": "arg:2", + "source": "field", + "required": true + }, + { + "name": "End At", + "as": "endAt", + "description": { + "en": "New exact appointment end in ISO format", + "de": "Neues exaktes Ende im ISO-Format" + }, + "bot": "Exact confirmed appointment end in ISO 8601 format.", + "type": "string", + "position": "arg:3", + "source": "field", + "required": true + }, + { + "name": "Timezone", + "as": "timezone", + "description": { + "en": "Appointment timezone", + "de": "Zeitzone des Termins" + }, + "bot": "Timezone identifier like Europe/Vienna, America/New_York, or UTC.", + "type": "string", + "source": "field", + "required": false + } + ] + } + ], + "output": { + "MEETING_ID": "out.data.id", + "SCHEDULED_AT": "out.data.scheduledAt" + }, + "messages": { + "success": { + "en": "Appointment rescheduled successfully.", + "de": "Termin erfolgreich verschoben." + } + } +} diff --git a/warps/appointments/brand.ts b/warps/appointments/brand.ts new file mode 100644 index 0000000..ae8caf9 --- /dev/null +++ b/warps/appointments/brand.ts @@ -0,0 +1,27 @@ +import { WarpBrandBuilder, WarpChainEnv, WarpClientConfig } from '@joai/warps' +import { WarpbaseBrand } from '../types' + +export const brand = async (config: WarpClientConfig): Promise => ({ + info: await new WarpBrandBuilder(config) + .setName('Appointments') + .setDescription({ + en: 'Appointment booking and intake flows for service businesses.', + de: 'Terminbuchung und Intake-Abläufe für Dienstleistungsunternehmen.', + }) + .setLogo('https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/apps/logos/joai.svg') + .setUrls({ web: 'https://joai.ai' }) + .build(), + contracts: {}, + destinations: { + API_BASE: (env: WarpChainEnv) => { + if (env === 'devnet') return 'https://devnet-api.joai.ai' + if (env === 'testnet') return 'https://testnet-api.joai.ai' + return 'https://api.joai.ai' + }, + APP_BASE: (env: WarpChainEnv) => { + if (env === 'devnet') return 'https://devnet.joai.ai' + if (env === 'testnet') return 'https://testnet.joai.ai' + return 'https://joai.ai' + }, + }, +}) From ef7c418c4c66d1126f1cd1be445930ee9e61ac14 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 13:53:50 +0200 Subject: [PATCH 10/19] add joai hook --- warps/joai/hook-respond.json | 63 ++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 warps/joai/hook-respond.json diff --git a/warps/joai/hook-respond.json b/warps/joai/hook-respond.json new file mode 100644 index 0000000..75a332b --- /dev/null +++ b/warps/joai/hook-respond.json @@ -0,0 +1,63 @@ +{ + "protocol": "warp:3.0.0", + "name": "JoAi: Respond to Hook", + "title": { + "en": "Respond to hook request", + "de": "Auf Hook-Anfrage antworten" + }, + "description": { + "en": "Approve or deny an external runtime hook request (e.g. a tool permission request from Claude Code).", + "de": "Genehmige oder verweigere eine externe Laufzeitanfrage (z.B. eine Werkzeugberechtigung von Claude Code)." + }, + "bot": "Responds to a pending hook approval request. Used internally when the user approves or denies a permission request from an external runtime like Claude Code.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Respond", + "de": "Antworten" + }, + "destination": { + "url": "INJECT:API_BASE/v1/hooks/respond", + "method": "POST" + }, + "inputs": [ + { + "name": "requestId", + "as": "requestId", + "type": "string", + "source": "query", + "required": true + }, + { + "name": "decision", + "as": "decision", + "type": "string", + "source": "query", + "required": true + }, + { + "name": "toolName", + "as": "toolName", + "type": "string", + "source": "query", + "required": false + }, + { + "name": "autoApprove", + "as": "autoApprove", + "type": "boolean", + "source": "query", + "required": false + } + ], + "auto": true + } + ], + "messages": { + "success": { + "en": "Hook request {{decision}}.", + "de": "Hook-Anfrage {{decision}}." + } + } +} From 1e3ce063d0230881afb0f91bdc7f7119c25ae312 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 13:53:59 +0200 Subject: [PATCH 11/19] add joai integration settings open --- warps/joai/settings-integration-open.json | 45 +++++++++++++++++++++++ 1 file changed, 45 insertions(+) create mode 100644 warps/joai/settings-integration-open.json diff --git a/warps/joai/settings-integration-open.json b/warps/joai/settings-integration-open.json new file mode 100644 index 0000000..0fbbe2f --- /dev/null +++ b/warps/joai/settings-integration-open.json @@ -0,0 +1,45 @@ +{ + "protocol": "warp:3.0.0", + "name": "JoAi: Open Integration Settings", + "title": { + "en": "Open integration settings", + "de": "Integrations-Einstellungen öffnen" + }, + "description": { + "en": "Open the agent integration settings for a specific integration such as calendar.", + "de": "Öffne die Agent-Integrations-Einstellungen für eine bestimmte Integration wie Kalender." + }, + "bot": "Use this when the user wants to connect or configure a specific integration. For calendar setup, pass integration=calendar.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Open integration settings", + "de": "Integrations-Einstellungen öffnen" + }, + "inputs": [ + { + "name": "Integration", + "as": "integration", + "description": { + "en": "Integration slug such as calendar", + "de": "Integrations-Slug wie calendar" + }, + "bot": "Integration slug to open. Use calendar for appointment setup.", + "type": "string", + "position": "arg:1", + "source": "field", + "required": true, + "default": "calendar" + } + ], + "auto": true + } + ], + "messages": { + "success": { + "en": "Opening {{integration}} settings now...", + "de": "{{integration}}-Einstellungen werden jetzt geöffnet..." + } + } +} From a8d6cbd8146ab7f62336ee09d7f9fcccb65e48e0 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 13:54:08 +0200 Subject: [PATCH 12/19] update shop --- warps/shop/brand.ts | 1 + warps/shop/shop-loyalty-register.json | 8 ++++++++ warps/shop/shop-loyalty-remind.json | 2 +- 3 files changed, 10 insertions(+), 1 deletion(-) diff --git a/warps/shop/brand.ts b/warps/shop/brand.ts index fb1c70a..ae3d17a 100644 --- a/warps/shop/brand.ts +++ b/warps/shop/brand.ts @@ -8,6 +8,7 @@ export const brand = async (config: WarpClientConfig): Promise => en: 'Loyalty and customer management for local service businesses.', de: 'Treue- und Kundenverwaltung für lokale Dienstleistungsunternehmen.', }) + .setLogo('https://raw.githubusercontent.com/JoAiHQ/assets/refs/heads/main/apps/logos/joai.svg') .setUrls({ web: 'https://joai.ai' }) .build(), contracts: { diff --git a/warps/shop/shop-loyalty-register.json b/warps/shop/shop-loyalty-register.json index 6142371..3334dc9 100644 --- a/warps/shop/shop-loyalty-register.json +++ b/warps/shop/shop-loyalty-register.json @@ -101,6 +101,14 @@ "type": "string", "source": "field", "required": false + }, + { + "name": "Card", + "as": "card", + "type": "string", + "source": "hidden", + "default": "{{JOAI_TAG_ID}}", + "position": "payload:props" } ] }, diff --git a/warps/shop/shop-loyalty-remind.json b/warps/shop/shop-loyalty-remind.json index b2dc551..4896d07 100644 --- a/warps/shop/shop-loyalty-remind.json +++ b/warps/shop/shop-loyalty-remind.json @@ -9,7 +9,7 @@ "en": "Check for customers who haven't visited recently and send them a reminder.", "de": "Prüfe auf Kunden, die kürzlich nicht da waren, und sende eine Erinnerung." }, - "bot": "Daily scheduled. SHOP_ID in query (get from setting-get when scheduling). STALE_SINCE = now - (reminder_days * 86400). For each stale customer: find contact by card_uuid, send WhatsApp/SMS, log activity.", + "bot": "Daily scheduled. SHOP_ID in query (get from setting-get when scheduling). STALE_SINCE = now - (reminder_days * 86400). For each stale customer card ID: GET /v1/contacts?propKey=card&propValue={cardId} to find the JoAi contact, get their phone, send WhatsApp reminder via POST /social/send, log activity.", "chain": "multiversx", "schedule": "daily", "vars": { From ec494f59b2d7324e0a065b3b10a0b5fe04c13a84 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 13:54:35 +0200 Subject: [PATCH 13/19] add auto plugin sync --- .github/workflows/sync-catalog.yml | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/.github/workflows/sync-catalog.yml b/.github/workflows/sync-catalog.yml index 7810913..2883e85 100644 --- a/.github/workflows/sync-catalog.yml +++ b/.github/workflows/sync-catalog.yml @@ -60,3 +60,13 @@ jobs: env: WARP_GITHUB_SYNC_TOKEN: ${{ secrets.WARP_GITHUB_SYNC_TOKEN }} run: node --import tsx scripts/catalog/sync-to-api.ts --branch "${GITHUB_REF_NAME}" --commit "${GITHUB_SHA}" --repo "${GITHUB_REPOSITORY}" + + - name: Dispatch plugin sync + if: ${{ secrets.JOAI_PLUGIN_SYNC_TOKEN != '' }} + uses: peter-evans/repository-dispatch@v3 + with: + token: ${{ secrets.JOAI_PLUGIN_SYNC_TOKEN }} + repository: JoAiHQ/joai--plugins + event-type: warps_catalog_updated + client-payload: >- + {"warps_ref":"${{ github.ref_name }}","warps_sha":"${{ github.sha }}"} From fd405242fb98a723f7c48fff3a33c9e8677e6041 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 13:56:15 +0200 Subject: [PATCH 14/19] fix: correct ASCII umlaut transliterations in multiversx/meta.ts Co-Authored-By: Claude Opus 4.6 (1M context) --- warps/multiversx/meta.ts | 48 ++++++++++++++++++++-------------------- 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/warps/multiversx/meta.ts b/warps/multiversx/meta.ts index 6191df6..e8caa85 100644 --- a/warps/multiversx/meta.ts +++ b/warps/multiversx/meta.ts @@ -8,7 +8,7 @@ export const meta: Record = { }, useCases: { en: ['Check EGLD balance for any MultiversX wallet address', 'Verify account shard assignment and nonce', 'Audit on-chain account properties before transactions', 'Monitor wallet status for portfolio tracking'], - de: ['EGLD-Guthaben fuer jede MultiversX-Wallet-Adresse pruefen', 'Shard-Zuweisung und Nonce des Kontos verifizieren', 'On-Chain-Kontoeigenschaften vor Transaktionen pruefen', 'Wallet-Status fuer Portfolio-Tracking ueberwachen'], + de: ['EGLD-Guthaben für jede MultiversX-Wallet-Adresse prüfen', 'Shard-Zuweisung und Nonce des Kontos verifizieren', 'On-Chain-Kontoeigenschaften vor Transaktionen prüfen', 'Wallet-Status für Portfolio-Tracking überwachen'], }, category: 'analytics', faq: { @@ -45,7 +45,7 @@ export const meta: Record = { }, useCases: { en: ['Review ESDT token holdings for any MultiversX address', 'Track token portfolio balances across wallets', 'Verify token receipts after trades or transfers', 'Analyze token distribution for research purposes'], - de: ['ESDT-Token-Bestaende fuer jede MultiversX-Adresse einsehen', 'Token-Portfolio-Guthaben ueber Wallets hinweg verfolgen', 'Token-Eingaenge nach Trades oder Transfers verifizieren', 'Token-Verteilung fuer Recherchezwecke analysieren'], + de: ['ESDT-Token-Bestände für jede MultiversX-Adresse einsehen', 'Token-Portfolio-Guthaben über Wallets hinweg verfolgen', 'Token-Eingänge nach Trades oder Transfers verifizieren', 'Token-Verteilung für Recherchezwecke analysieren'], }, category: 'analytics', faq: { @@ -82,7 +82,7 @@ export const meta: Record = { }, useCases: { en: ['View NFT and SFT collections for any MultiversX address', 'Verify NFT ownership and metadata on-chain', 'Track NFT portfolio value and holdings', 'Explore collection attributes and rarity data'], - de: ['NFT- und SFT-Sammlungen fuer jede MultiversX-Adresse anzeigen', 'NFT-Eigentumsrechte und Metadaten on-chain verifizieren', 'NFT-Portfolio-Wert und Bestaende verfolgen', 'Sammlungsattribute und Seltenheitsdaten erkunden'], + de: ['NFT- und SFT-Sammlungen für jede MultiversX-Adresse anzeigen', 'NFT-Eigentumsrechte und Metadaten on-chain verifizieren', 'NFT-Portfolio-Wert und Bestände verfolgen', 'Sammlungsattribute und Seltenheitsdaten erkunden'], }, category: 'analytics', faq: { @@ -119,7 +119,7 @@ export const meta: Record = { }, useCases: { en: ['Audit full transaction history for any MultiversX address', 'Track EGLD and token transfers over time', 'Monitor smart contract interactions and staking activity', 'Investigate suspicious or failed transactions'], - de: ['Vollstaendigen Transaktionsverlauf fuer jede MultiversX-Adresse pruefen', 'EGLD- und Token-Transfers ueber die Zeit verfolgen', 'Smart-Contract-Interaktionen und Staking-Aktivitaeten ueberwachen', 'Verdaechtige oder fehlgeschlagene Transaktionen untersuchen'], + de: ['Vollständigen Transaktionsverlauf für jede MultiversX-Adresse prüfen', 'EGLD- und Token-Transfers über die Zeit verfolgen', 'Smart-Contract-Interaktionen und Staking-Aktivitäten überwachen', 'Verdächtige oder fehlgeschlagene Transaktionen untersuchen'], }, category: 'analytics', faq: { @@ -156,7 +156,7 @@ export const meta: Record = { }, useCases: { en: ['Collect EGLD staking rewards from all providers at once', 'Simplify reward management for multi-provider delegations', 'Harvest staking earnings to reinvest or trade', 'Automate periodic reward claiming for staking portfolios'], - de: ['EGLD-Staking-Belohnungen von allen Anbietern auf einmal einfordern', 'Belohnungsverwaltung fuer Multi-Anbieter-Delegationen vereinfachen', 'Staking-Einnahmen zur Reinvestition oder zum Handel ernten', 'Periodisches Einfordern von Belohnungen fuer Staking-Portfolios automatisieren'], + de: ['EGLD-Staking-Belohnungen von allen Anbietern auf einmal einfordern', 'Belohnungsverwaltung für Multi-Anbieter-Delegationen vereinfachen', 'Staking-Einnahmen zur Reinvestition oder zum Handel ernten', 'Periodisches Einfordern von Belohnungen für Staking-Portfolios automatisieren'], }, category: 'staking', faq: { @@ -203,7 +203,7 @@ export const meta: Record = { }, useCases: { en: ['Review staking positions across all MultiversX providers', 'Monitor claimable rewards for each delegation', 'Compare delegation amounts between staking providers', 'Track staking portfolio performance over time'], - de: ['Staking-Positionen bei allen MultiversX-Anbietern ueberpruefen', 'Einforderbare Belohnungen fuer jede Delegation ueberwachen', 'Delegationsbetraege zwischen Staking-Anbietern vergleichen', 'Staking-Portfolio-Performance ueber die Zeit verfolgen'], + de: ['Staking-Positionen bei allen MultiversX-Anbietern überprüfen', 'Einforderbare Belohnungen für jede Delegation überwachen', 'Delegationsbetraege zwischen Staking-Anbietern vergleichen', 'Staking-Portfolio-Performance über die Zeit verfolgen'], }, category: 'staking', faq: { @@ -240,7 +240,7 @@ export const meta: Record = { }, useCases: { en: ['Launch a new fungible token for a DeFi project on MultiversX', 'Create a community or governance token with custom supply', 'Issue reward tokens for loyalty or gaming platforms', 'Prototype tokenomics with configurable mint and burn properties'], - de: ['Einen neuen fungiblen Token fuer ein DeFi-Projekt auf MultiversX starten', 'Einen Community- oder Governance-Token mit benutzerdefinierter Menge erstellen', 'Belohnungstoken fuer Treue- oder Gaming-Plattformen ausgeben', 'Tokenomics mit konfigurierbaren Praege- und Burn-Eigenschaften prototypisieren'], + de: ['Einen neuen fungiblen Token für ein DeFi-Projekt auf MultiversX starten', 'Einen Community- oder Governance-Token mit benutzerdefinierter Menge erstellen', 'Belohnungstoken für Treue- oder Gaming-Plattformen ausgeben', 'Tokenomics mit konfigurierbaren Präge- und Burn-Eigenschaften prototypisieren'], }, category: 'defi', faq: { @@ -287,7 +287,7 @@ export const meta: Record = { }, useCases: { en: ['Mint individual NFTs within an existing MultiversX collection', 'Create digital art with custom royalties and metadata', 'Issue event tickets or membership passes as NFTs', 'Build NFT-based gaming assets with on-chain attributes'], - de: ['Einzelne NFTs innerhalb einer bestehenden MultiversX-Sammlung praegen', 'Digitale Kunst mit individuellen Lizenzgebuehren und Metadaten erstellen', 'Event-Tickets oder Mitgliedsausweise als NFTs ausgeben', 'NFT-basierte Gaming-Assets mit On-Chain-Attributen erstellen'], + de: ['Einzelne NFTs innerhalb einer bestehenden MultiversX-Sammlung prägen', 'Digitale Kunst mit individuellen Lizenzgebühren und Metadaten erstellen', 'Event-Tickets oder Mitgliedsausweise als NFTs ausgeben', 'NFT-basierte Gaming-Assets mit On-Chain-Attributen erstellen'], }, category: 'nft', faq: { @@ -324,7 +324,7 @@ export const meta: Record = { }, useCases: { en: ['Launch a new NFT collection or project on MultiversX', 'Set up an on-chain container for minting digital art', 'Create branded NFT collections for communities or events', 'Establish a collection before assigning minting roles and creating NFTs'], - de: ['Eine neue NFT-Sammlung oder ein Projekt auf MultiversX starten', 'Einen On-Chain-Container fuer das Praegen digitaler Kunst einrichten', 'Marken-NFT-Sammlungen fuer Communities oder Events erstellen', 'Eine Sammlung einrichten, bevor Praegerollen zugewiesen und NFTs erstellt werden'], + de: ['Eine neue NFT-Sammlung oder ein Projekt auf MultiversX starten', 'Einen On-Chain-Container für das Prägen digitaler Kunst einrichten', 'Marken-NFT-Sammlungen für Communities oder Events erstellen', 'Eine Sammlung einrichten, bevor Prägerollen zugewiesen und NFTs erstellt werden'], }, category: 'nft', faq: { @@ -371,7 +371,7 @@ export const meta: Record = { }, useCases: { en: ['Prepare EGLD for use in DeFi protocols and DEX trading', 'Convert to WEGLD for liquidity pool participation', 'Enable smart contract interactions that require ESDT tokens', 'Wrap EGLD before swapping on MultiversX decentralized exchanges'], - de: ['EGLD fuer die Nutzung in DeFi-Protokollen und DEX-Handel vorbereiten', 'In WEGLD fuer die Teilnahme an Liquiditaetspools umwandeln', 'Smart-Contract-Interaktionen ermoeglichen, die ESDT-Token erfordern', 'EGLD vor dem Tausch auf MultiversX-dezentralen Boersen wrappen'], + de: ['EGLD für die Nutzung in DeFi-Protokollen und DEX-Handel vorbereiten', 'In WEGLD für die Teilnahme an Liquiditaetspools umwandeln', 'Smart-Contract-Interaktionen ermoeglichen, die ESDT-Token erfordern', 'EGLD vor dem Tausch auf MultiversX-dezentralen Boersen wrappen'], }, category: 'defi', faq: { @@ -408,7 +408,7 @@ export const meta: Record = { }, useCases: { en: ['Convert WEGLD back to native EGLD after DeFi trading', 'Reclaim native eGold from liquidity pool exits', 'Unwrap WEGLD for staking or direct transfers', 'Simplify wallet holdings by converting wrapped tokens back'], - de: ['WEGLD nach DeFi-Handel zurueck in natives EGLD umwandeln', 'Natives eGold nach Austritt aus Liquiditaetspools zurueckerhalten', 'WEGLD fuer Staking oder direkte Transfers unwrappen', 'Wallet-Bestaende durch Rueckumwandlung gewrappter Token vereinfachen'], + de: ['WEGLD nach DeFi-Handel zurück in natives EGLD umwandeln', 'Natives eGold nach Austritt aus Liquiditaetspools zurückerhalten', 'WEGLD für Staking oder direkte Transfers unwrappen', 'Wallet-Bestände durch Rueckumwandlung gewrappter Token vereinfachen'], }, category: 'defi', faq: { @@ -447,7 +447,7 @@ export const meta: Record = { }, useCases: { en: ['Check how active a MultiversX address has been', 'Verify account nonce before submitting transactions', 'Analyze address activity for research or compliance', 'Monitor account usage patterns over time'], - de: ['Pruefen, wie aktiv eine MultiversX-Adresse war', 'Konto-Nonce vor dem Einreichen von Transaktionen verifizieren', 'Adressaktivitaet fuer Recherche oder Compliance analysieren', 'Kontonutzungsmuster ueber die Zeit ueberwachen'], + de: ['Prüfen, wie aktiv eine MultiversX-Adresse war', 'Konto-Nonce vor dem Einreichen von Transaktionen verifizieren', 'Adressaktivitaet für Recherche oder Compliance analysieren', 'Kontonutzungsmuster über die Zeit überwachen'], }, category: 'analytics', }, @@ -458,7 +458,7 @@ export const meta: Record = { }, useCases: { en: ['Verify if a MultiversX account has guardian protection enabled', 'Check 2FA security status for wallet auditing', 'Confirm guardian address configuration before sensitive operations', 'Assess account security posture for compliance reviews'], - de: ['Pruefen, ob ein MultiversX-Konto Guardian-Schutz aktiviert hat', '2FA-Sicherheitsstatus fuer Wallet-Audits ueberpruefen', 'Guardian-Adresskonfiguration vor sensiblen Vorgaengen bestaetigen', 'Kontosicherheitsstatus fuer Compliance-Pruefungen bewerten'], + de: ['Prüfen, ob ein MultiversX-Konto Guardian-Schutz aktiviert hat', '2FA-Sicherheitsstatus für Wallet-Audits überprüfen', 'Guardian-Adresskonfiguration vor sensiblen Vorgaengen bestaetigen', 'Kontosicherheitsstatus für Compliance-Pruefungen bewerten'], }, category: 'analytics', }, @@ -469,7 +469,7 @@ export const meta: Record = { }, useCases: { en: ['Monitor EGLD supply and inflation metrics in real time', 'Track current staking APR for investment decisions', 'Analyze MultiversX market capitalization and economic health', 'Integrate network economics data into dashboards or reports'], - de: ['EGLD-Angebots- und Inflationskennzahlen in Echtzeit ueberwachen', 'Aktuellen Staking-APR fuer Investitionsentscheidungen verfolgen', 'MultiversX-Marktkapitalisierung und wirtschaftliche Gesundheit analysieren', 'Netzwerkoekonomie-Daten in Dashboards oder Berichte integrieren'], + de: ['EGLD-Angebots- und Inflationskennzahlen in Echtzeit überwachen', 'Aktuellen Staking-APR für Investitionsentscheidungen verfolgen', 'MultiversX-Marktkapitalisierung und wirtschaftliche Gesundheit analysieren', 'Netzwerkoekonomie-Daten in Dashboards oder Berichte integrieren'], }, category: 'infrastructure', }, @@ -480,7 +480,7 @@ export const meta: Record = { }, useCases: { en: ['Verify MultiversX network health before submitting transactions', 'Monitor block height and epoch progression', 'Check chain uptime and round information for validators', 'Integrate network status checks into automated workflows'], - de: ['MultiversX-Netzwerkzustand vor dem Einreichen von Transaktionen verifizieren', 'Blockhoehe und Epochenfortschritt ueberwachen', 'Chain-Verfuegbarkeit und Rundeninformationen fuer Validatoren pruefen', 'Netzwerkstatus-Pruefungen in automatisierte Workflows integrieren'], + de: ['MultiversX-Netzwerkzustand vor dem Einreichen von Transaktionen verifizieren', 'Blockhoehe und Epochenfortschritt überwachen', 'Chain-Verfügbarkeit und Rundeninformationen für Validatoren prüfen', 'Netzwerkstatus-Pruefungen in automatisierte Workflows integrieren'], }, category: 'infrastructure', }, @@ -491,7 +491,7 @@ export const meta: Record = { }, useCases: { en: ['Check pending staking rewards before claiming', 'Monitor reward accumulation across staking providers', 'Plan optimal claim timing based on reward balance', 'Track staking yield performance for portfolio management'], - de: ['Ausstehende Staking-Belohnungen vor dem Einfordern pruefen', 'Belohnungsansammlung ueber Staking-Anbieter hinweg ueberwachen', 'Optimalen Einfordern-Zeitpunkt basierend auf Belohnungsguthaben planen', 'Staking-Rendite-Performance fuer Portfolio-Management verfolgen'], + de: ['Ausstehende Staking-Belohnungen vor dem Einfordern prüfen', 'Belohnungsansammlung über Staking-Anbieter hinweg überwachen', 'Optimalen Einfordern-Zeitpunkt basierend auf Belohnungsguthaben planen', 'Staking-Rendite-Performance für Portfolio-Management verfolgen'], }, category: 'staking', }, @@ -502,7 +502,7 @@ export const meta: Record = { }, useCases: { en: ['Compound staking rewards automatically across all providers', 'Maximize EGLD staking yield through redelegation', 'Simplify reward reinvestment with one-click restaking', 'Grow staking positions over time without manual management'], - de: ['Staking-Belohnungen automatisch ueber alle Anbieter compoundieren', 'EGLD-Staking-Rendite durch Redelegation maximieren', 'Belohnungs-Reinvestition mit Ein-Klick-Restaking vereinfachen', 'Staking-Positionen ueber die Zeit ohne manuelle Verwaltung wachsen lassen'], + de: ['Staking-Belohnungen automatisch über alle Anbieter compoundieren', 'EGLD-Staking-Rendite durch Redelegation maximieren', 'Belohnungs-Reinvestition mit Ein-Klick-Restaking vereinfachen', 'Staking-Positionen über die Zeit ohne manuelle Verwaltung wachsen lassen'], }, category: 'staking', }, @@ -513,7 +513,7 @@ export const meta: Record = { }, useCases: { en: ['Claim rewards from a specific staking provider selectively', 'Manage reward collection per delegation for tax tracking', 'Test reward claiming with a single provider before claiming all', 'Maintain separate reward schedules across different validators'], - de: ['Belohnungen selektiv von einem bestimmten Staking-Anbieter einfordern', 'Belohnungseinholung pro Delegation fuer Steuerverfolgung verwalten', 'Belohnungseinfordern mit einem einzelnen Anbieter testen, bevor alles eingefordert wird', 'Separate Belohnungszeitplaene ueber verschiedene Validatoren beibehalten'], + de: ['Belohnungen selektiv von einem bestimmten Staking-Anbieter einfordern', 'Belohnungseinholung pro Delegation für Steuerverfolgung verwalten', 'Belohnungseinfordern mit einem einzelnen Anbieter testen, bevor alles eingefordert wird', 'Separate Belohnungszeitplaene über verschiedene Validatoren beibehalten'], }, category: 'staking', }, @@ -524,7 +524,7 @@ export const meta: Record = { }, useCases: { en: ['Inspect transaction details by hash for debugging or verification', 'Review smart contract call results and gas consumption', 'Verify transfer amounts and recipients for auditing', 'Investigate failed transactions to understand error causes'], - de: ['Transaktionsdetails anhand des Hashs fuer Debugging oder Verifizierung pruefen', 'Smart-Contract-Aufrufergebnisse und Gasverbrauch ueberpruefen', 'Transferbetraege und Empfaenger fuer Audits verifizieren', 'Fehlgeschlagene Transaktionen untersuchen, um Fehlerursachen zu verstehen'], + de: ['Transaktionsdetails anhand des Hashs für Debugging oder Verifizierung prüfen', 'Smart-Contract-Aufrufergebnisse und Gasverbrauch überprüfen', 'Transferbetraege und Empfaenger für Audits verifizieren', 'Fehlgeschlagene Transaktionen untersuchen, um Fehlerursachen zu verstehen'], }, category: 'analytics', }, @@ -535,7 +535,7 @@ export const meta: Record = { }, useCases: { en: ['Confirm whether a transaction completed successfully', 'Monitor pending transactions until finality', 'Troubleshoot failed or stuck transactions', 'Verify transaction confirmation for payment processing'], - de: ['Bestaetigen, ob eine Transaktion erfolgreich abgeschlossen wurde', 'Ausstehende Transaktionen bis zur Finalitaet ueberwachen', 'Fehlgeschlagene oder haengende Transaktionen beheben', 'Transaktionsbestaetigung fuer Zahlungsabwicklung verifizieren'], + de: ['Bestaetigen, ob eine Transaktion erfolgreich abgeschlossen wurde', 'Ausstehende Transaktionen bis zur Finalitaet überwachen', 'Fehlgeschlagene oder haengende Transaktionen beheben', 'Transaktionsbestaetigung für Zahlungsabwicklung verifizieren'], }, category: 'analytics', }, @@ -546,7 +546,7 @@ export const meta: Record = { }, useCases: { en: ['Verify ESDT token properties before trading or investing', 'Look up token supply, decimals, and owner information', 'Check token configuration flags like mintable and burnable', 'Research token details for DeFi integration or analysis'], - de: ['ESDT-Token-Eigenschaften vor dem Handel oder der Investition verifizieren', 'Token-Angebot, Dezimalstellen und Eigentuemerinformationen nachschlagen', 'Token-Konfigurationsflags wie praegbar und brennbar pruefen', 'Token-Details fuer DeFi-Integration oder Analyse recherchieren'], + de: ['ESDT-Token-Eigenschaften vor dem Handel oder der Investition verifizieren', 'Token-Angebot, Dezimalstellen und Eigentuemerinformationen nachschlagen', 'Token-Konfigurationsflags wie praegbar und brennbar prüfen', 'Token-Details für DeFi-Integration oder Analyse recherchieren'], }, category: 'defi', }, @@ -557,7 +557,7 @@ export const meta: Record = { }, useCases: { en: ['Enable NFT minting permissions for a collection owner', 'Assign create roles to collaborators for shared NFT projects', 'Set up minting access after issuing a new NFT collection', 'Manage role-based access control for NFT creation workflows'], - de: ['NFT-Praegeberechtigungen fuer einen Sammlungseigentuemer aktivieren', 'Erstellungsrollen an Mitarbeiter fuer gemeinsame NFT-Projekte zuweisen', 'Praegezugang nach Ausgabe einer neuen NFT-Sammlung einrichten', 'Rollenbasierte Zugriffskontrolle fuer NFT-Erstellungs-Workflows verwalten'], + de: ['NFT-Prägeberechtigungen für einen Sammlungseigentuemer aktivieren', 'Erstellungsrollen an Mitarbeiter für gemeinsame NFT-Projekte zuweisen', 'Prägezugang nach Ausgabe einer neuen NFT-Sammlung einrichten', 'Rollenbasierte Zugriffskontrolle für NFT-Erstellungs-Workflows verwalten'], }, category: 'nft', }, @@ -568,7 +568,7 @@ export const meta: Record = { }, useCases: { en: ['Create SFT collections for event tickets or limited editions', 'Launch gaming item collections with multiple copies per token', 'Issue membership passes or vouchers as semi-fungible tokens', 'Build fractionalized asset representations on MultiversX'], - de: ['SFT-Sammlungen fuer Event-Tickets oder limitierte Editionen erstellen', 'Gaming-Item-Sammlungen mit mehreren Kopien pro Token starten', 'Mitgliedsausweise oder Gutscheine als semi-fungible Token ausgeben', 'Fraktionalisierte Asset-Darstellungen auf MultiversX erstellen'], + de: ['SFT-Sammlungen für Event-Tickets oder limitierte Editionen erstellen', 'Gaming-Item-Sammlungen mit mehreren Kopien pro Token starten', 'Mitgliedsausweise oder Gutscheine als semi-fungible Token ausgeben', 'Fraktionalisierte Asset-Darstellungen auf MultiversX erstellen'], }, category: 'nft', }, @@ -579,7 +579,7 @@ export const meta: Record = { }, useCases: { en: ['Inspect NFT metadata including royalties and attributes', 'Verify NFT authenticity and creator information', 'View media URIs and on-chain properties for individual tokens', 'Research NFT details before purchasing or trading'], - de: ['NFT-Metadaten einschliesslich Lizenzgebuehren und Attribute inspizieren', 'NFT-Authentizitaet und Erstellerinformationen verifizieren', 'Medien-URIs und On-Chain-Eigenschaften fuer einzelne Token anzeigen', 'NFT-Details vor dem Kauf oder Handel recherchieren'], + de: ['NFT-Metadaten einschliesslich Lizenzgebühren und Attribute inspizieren', 'NFT-Authentizitaet und Erstellerinformationen verifizieren', 'Medien-URIs und On-Chain-Eigenschaften für einzelne Token anzeigen', 'NFT-Details vor dem Kauf oder Handel recherchieren'], }, category: 'nft', }, From ef4f7f32821998e03062a2dc700cd76e7a153cf5 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 14:00:10 +0200 Subject: [PATCH 15/19] update shop --- warps/shop/shop-loyalty-configure.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/warps/shop/shop-loyalty-configure.json b/warps/shop/shop-loyalty-configure.json index 3748a6d..c9cb00f 100644 --- a/warps/shop/shop-loyalty-configure.json +++ b/warps/shop/shop-loyalty-configure.json @@ -111,5 +111,5 @@ "de": "Treueprogramm ist aktiv! Programmiere jetzt deine NFC-Karten." } }, - "next": "joai/setting-set?key=SHOP_ID&value={{SHOP_ID}}" + "next": "joai/team-setting-set?key=SHOP_ID&value={{SHOP_ID}}" } From d8eb397e045d3620e1765eafceea195d7dc50a17 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 14:00:21 +0200 Subject: [PATCH 16/19] add team settings --- warps/joai/team-setting-set.json | 49 ++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) create mode 100644 warps/joai/team-setting-set.json diff --git a/warps/joai/team-setting-set.json b/warps/joai/team-setting-set.json new file mode 100644 index 0000000..fd6abd1 --- /dev/null +++ b/warps/joai/team-setting-set.json @@ -0,0 +1,49 @@ +{ + "protocol": "warp:3.0.0", + "name": "JoAi: Set Team Setting", + "title": { + "en": "Save a team setting", + "de": "Team-Einstellung speichern" + }, + "description": { + "en": "Save a key-value setting on the team for use across all agents.", + "de": "Speichere eine Schlüssel-Wert-Einstellung auf dem Team für alle Agenten." + }, + "bot": "Saves an unencrypted team-level config value. Agents inherit team settings as defaults.", + "actions": [ + { + "type": "collect", + "label": { + "en": "Save setting", + "de": "Einstellung speichern" + }, + "destination": { + "url": "INJECT:API_BASE/v1/settings", + "method": "POST" + }, + "inputs": [ + { + "name": "key", + "as": "key", + "type": "string", + "source": "query", + "required": true + }, + { + "name": "value", + "as": "value", + "type": "string", + "source": "query", + "required": true + } + ], + "auto": true + } + ], + "messages": { + "success": { + "en": "Team setting '{{key}}' saved.", + "de": "Team-Einstellung '{{key}}' gespeichert." + } + } +} From 5c14cb00a8b20a87f55b0787419ceecdc6bc8117 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 14:13:45 +0200 Subject: [PATCH 17/19] feat: add cursor provider type, colors to distribution catalog Co-Authored-By: Claude Opus 4.6 (1M context) --- scripts/catalog/distribution.ts | 4 +++- warps/distribution.ts | 4 ++++ warps/types.ts | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/scripts/catalog/distribution.ts b/scripts/catalog/distribution.ts index 3d26216..f39311f 100644 --- a/scripts/catalog/distribution.ts +++ b/scripts/catalog/distribution.ts @@ -87,6 +87,7 @@ export type ResolvedAppDistribution = { name: string description: Dict logo: string | Dict + colors: Dict urls: Dict hash: string mcpUrl: string @@ -109,7 +110,7 @@ export type DistributionCatalogManifest = { apps: ResolvedAppDistribution[] } -const PROVIDERS: AppDistributionProvider[] = ['claude', 'codex', 'openai'] +const PROVIDERS: AppDistributionProvider[] = ['claude', 'codex', 'cursor', 'openai'] function toMcpUrl(network: SyncNetwork, slug: string): string { if (network === 'devnet') return `https://devnet-cortex.joai.ai/mcp/apps/${slug}` @@ -353,6 +354,7 @@ export async function buildDistributionCatalog( name: brand.name, description: brand.description, logo: brand.logo, + colors: brand.colors ?? {}, urls: brand.urls ?? {}, hash: brand.hash, mcpUrl: toMcpUrl(manifest.network, brand.slug), diff --git a/warps/distribution.ts b/warps/distribution.ts index 5605deb..cd43b3f 100644 --- a/warps/distribution.ts +++ b/warps/distribution.ts @@ -102,6 +102,10 @@ function createDefaultManifest(brandName: string, brand: WarpbaseBrand | null): enabled: true, status: 'ready', }, + cursor: { + enabled: true, + status: 'ready', + }, openai: { enabled: true, status: 'runtime_ready', diff --git a/warps/types.ts b/warps/types.ts index c4a4191..74efcf4 100644 --- a/warps/types.ts +++ b/warps/types.ts @@ -7,7 +7,7 @@ export type WarpbaseBrand = { discover?: string[] } -export type AppDistributionProvider = 'claude' | 'codex' | 'openai' +export type AppDistributionProvider = 'claude' | 'codex' | 'cursor' | 'openai' export type AppDistributionProviderStatus = | 'disabled' From c86ed7ccf197f8a0fc7126547a01760ce7371d48 Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 14:20:21 +0200 Subject: [PATCH 18/19] update metas --- warps/anthropic/meta.ts | 132 ++++++++++++++++++ warps/appointments/meta.ts | 156 ++++++++++++++++++++++ warps/colombia-staking/meta.ts | 32 +++++ warps/eapes/meta.ts | 32 +++++ warps/hatom/meta.ts | 32 +++++ warps/inception-network/meta.ts | 32 +++++ warps/mregld/meta.ts | 32 +++++ warps/multiversx/meta.ts | 228 ++++++++++++++++++++++++++++++++ warps/openai/meta.ts | 132 ++++++++++++++++++ warps/projectx/meta.ts | 32 +++++ warps/xexchange/meta.ts | 160 ++++++++++++++++++++++ warps/xoxno/meta.ts | 64 +++++++++ 12 files changed, 1064 insertions(+) diff --git a/warps/anthropic/meta.ts b/warps/anthropic/meta.ts index 8e90503..217bd4f 100644 --- a/warps/anthropic/meta.ts +++ b/warps/anthropic/meta.ts @@ -49,6 +49,32 @@ export const meta: Record = { de: ['Eine Aufgabe stoppen, die mit falschen Anweisungen gestartet wurde', 'Einen lang laufenden Job abbrechen, dessen Ergebnisse nicht mehr benötigt werden', 'Ressourcen freigeben durch Beenden veralteter Hintergrundaufgaben'], }, category: 'developer', + faq: { + en: [ + { + question: 'How do I cancel a running Claude task?', + answer: + 'Provide the task ID to cancel it immediately. Any partial results generated before cancellation are discarded and cannot be retrieved.', + }, + { + question: 'What happens to partial results when I cancel a Claude task?', + answer: + 'Partial output is not preserved after cancellation. If you need intermediate results, check the task status before cancelling to retrieve any available output.', + }, + ], + de: [ + { + question: 'Wie breche ich eine laufende Claude-Aufgabe ab?', + answer: + 'Gib die Aufgaben-ID an, um sie sofort abzubrechen. Teilergebnisse, die vor dem Abbruch erzeugt wurden, werden verworfen und können nicht abgerufen werden.', + }, + { + question: 'Was passiert mit Teilergebnissen, wenn ich eine Claude-Aufgabe abbreche?', + answer: + 'Teilausgaben werden nach dem Abbruch nicht gespeichert. Wenn du Zwischenergebnisse brauchst, prüfe den Aufgabenstatus vor dem Abbrechen, um verfügbare Ausgaben abzurufen.', + }, + ], + }, }, 'get-task-status': { @@ -61,6 +87,32 @@ export const meta: Record = { de: ['Prüfen, ob eine Hintergrund-Rechercheaufgabe abgeschlossen ist', 'Die fertige Ausgabe eines Claude-Schreibauftrags abrufen', 'Den Fortschritt einer lang laufenden Analyseaufgabe überwachen'], }, category: 'developer', + faq: { + en: [ + { + question: 'What are the possible statuses of a Claude task?', + answer: + 'Tasks can be pending, in progress, completed, failed, or cancelled. Checking the status also returns any output generated so far.', + }, + { + question: 'How do I check the progress of my Claude task?', + answer: + 'Query the task status using the task ID. You will see the current state and, once completed, the full result.', + }, + ], + de: [ + { + question: 'Welche Status kann eine Claude-Aufgabe haben?', + answer: + 'Aufgaben können ausstehend, in Bearbeitung, abgeschlossen, fehlgeschlagen oder abgebrochen sein. Die Statusabfrage liefert auch bisher erzeugte Ausgaben.', + }, + { + question: 'Wie prüfe ich den Fortschritt meiner Claude-Aufgabe?', + answer: + 'Frage den Aufgabenstatus mit der Aufgaben-ID ab. Du siehst den aktuellen Zustand und nach Abschluss das vollständige Ergebnis.', + }, + ], + }, }, 'add-followup': { @@ -73,6 +125,22 @@ export const meta: Record = { de: ['Claude bitten, einen Entwurf basierend auf neuem Feedback zu überarbeiten', 'Zusätzlichen Kontext liefern, um die Aufgabenausgabe zu verbessern', 'Ein anderes Format oder einen anderen Fokus für fertige Ergebnisse anfordern'], }, category: 'developer', + faq: { + en: [ + { + question: 'Can I add more context to a Claude task after it started?', + answer: + 'Yes, send a follow-up message with additional instructions or context. Claude incorporates the new information and continues working on the task.', + }, + ], + de: [ + { + question: 'Kann ich einer laufenden Claude-Aufgabe nachträglich Kontext hinzufügen?', + answer: + 'Ja, sende eine Folgenachricht mit zusätzlichen Anweisungen oder Kontext. Claude berücksichtigt die neuen Informationen und arbeitet an der Aufgabe weiter.', + }, + ], + }, }, 'code-launch-task': { @@ -85,6 +153,22 @@ export const meta: Record = { de: ['Claude Code ein neues Feature in der Codebasis implementieren lassen', 'Bug-Fixes und Code-Refactoring an einen KI-Programmieragenten delegieren', 'Code-Reviews und Testgenerierung mit Claude Code automatisieren'], }, category: 'developer', + faq: { + en: [ + { + question: 'How do I launch a coding task with Claude Code from the CLI?', + answer: + 'Use the Claude Code CLI to submit your coding instructions. The task runs in a sandboxed environment with access to your codebase and returns code changes when complete.', + }, + ], + de: [ + { + question: 'Wie starte ich eine Programmieraufgabe mit Claude Code über die CLI?', + answer: + 'Nutze die Claude Code CLI, um deine Programmieranweisungen einzureichen. Die Aufgabe läuft in einer Sandbox-Umgebung mit Zugriff auf deine Codebasis und liefert Codeänderungen nach Abschluss.', + }, + ], + }, }, 'code-cancel-task': { @@ -97,6 +181,22 @@ export const meta: Record = { de: ['Eine Programmieraufgabe stoppen, wenn sich die Anforderungen geändert haben', 'Einen Code-Generierungsjob abbrechen, der den falschen Ansatz verfolgt', 'Eine Claude Code Aufgabe abbrechen, um mit besseren Anweisungen neu zu starten'], }, category: 'developer', + faq: { + en: [ + { + question: 'Can I cancel a Claude Code task that is modifying files?', + answer: + 'Yes, cancelling stops the task immediately. Any file changes already written remain in your working directory, so review and revert them if needed.', + }, + ], + de: [ + { + question: 'Kann ich eine Claude Code Aufgabe abbrechen, die gerade Dateien ändert?', + answer: + 'Ja, das Abbrechen stoppt die Aufgabe sofort. Bereits geschriebene Dateiänderungen bleiben in deinem Arbeitsverzeichnis, also prüfe und setze sie bei Bedarf zurück.', + }, + ], + }, }, 'code-get-task-status': { @@ -109,6 +209,22 @@ export const meta: Record = { de: ['Prüfen, ob Claude Code die Feature-Implementierung abgeschlossen hat', 'Den generierten Code vor dem Zusammenführen überprüfen', 'Eine komplexe Refactoring-Aufgabe im Fortschritt überwachen'], }, category: 'developer', + faq: { + en: [ + { + question: 'How do I check if Claude Code finished implementing my feature?', + answer: + 'Query the task status with the task ID to see whether it is still running or completed, along with a summary of files changed.', + }, + ], + de: [ + { + question: 'Wie prüfe ich, ob Claude Code mein Feature fertig implementiert hat?', + answer: + 'Frage den Aufgabenstatus mit der Aufgaben-ID ab, um zu sehen, ob die Aufgabe noch läuft oder abgeschlossen ist, samt einer Zusammenfassung der geänderten Dateien.', + }, + ], + }, }, 'code-add-followup': { @@ -121,6 +237,22 @@ export const meta: Record = { de: ['Claude Code bitten, Fehlerbehandlung zum generierten Code hinzuzufügen', 'Stil- oder Architekturänderungen während der Implementierung anfordern', 'Klärende Details zu Grenzfällen während des Programmierens liefern'], }, category: 'developer', + faq: { + en: [ + { + question: 'Can I send follow-up instructions to a Claude Code task via CLI?', + answer: + 'Yes, add a follow-up message referencing the task ID. Claude Code incorporates your feedback and continues modifying code accordingly.', + }, + ], + de: [ + { + question: 'Kann ich einer Claude Code Aufgabe über die CLI Folgeanweisungen senden?', + answer: + 'Ja, sende eine Folgenachricht mit der Aufgaben-ID. Claude Code berücksichtigt dein Feedback und ändert den Code entsprechend weiter.', + }, + ], + }, }, 'joai-plugin-install': { diff --git a/warps/appointments/meta.ts b/warps/appointments/meta.ts index a2b9f27..1ef3563 100644 --- a/warps/appointments/meta.ts +++ b/warps/appointments/meta.ts @@ -49,6 +49,32 @@ export const meta: Record = { de: ['Eine Besprechung absagen, an der du nicht mehr teilnehmen kannst', 'Einen gebuchten Slot wegen eines Terminkonfikts freigeben', 'Eine doppelte oder versehentliche Buchung entfernen'], }, category: 'productivity', + faq: { + en: [ + { + question: 'Can I cancel an appointment at any time?', + answer: + 'You can cancel anytime before the appointment, but the provider may enforce a cancellation policy with a minimum notice period or a cancellation fee.', + }, + { + question: 'Is there a cancellation fee for appointments?', + answer: + 'It depends on the provider\'s policy. Some require 24-hour notice for free cancellation, while others may charge a fee for late cancellations or no-shows.', + }, + ], + de: [ + { + question: 'Kann ich einen Termin jederzeit absagen?', + answer: + 'Du kannst jederzeit vor dem Termin absagen, aber der Anbieter kann eine Stornierungsrichtlinie mit Mindestfrist oder Stornogebühr haben.', + }, + { + question: 'Gibt es eine Stornogebühr für Termine?', + answer: + 'Das hängt von der Richtlinie des Anbieters ab. Manche verlangen eine 24-Stunden-Frist für kostenlose Stornierung, andere berechnen eine Gebühr bei kurzfristiger Absage oder Nichterscheinen.', + }, + ], + }, }, 'appointment-reschedule': { @@ -61,6 +87,32 @@ export const meta: Record = { de: ['Ein Kundengespräch auf einen späteren Zeitslot verschieben', 'Einen Termin wegen eines unerwarteten Konflikts umplanen', 'Eine wiederkehrende Buchung auf einen anderen Wochentag verlegen'], }, category: 'productivity', + faq: { + en: [ + { + question: 'How do I reschedule an existing appointment?', + answer: + 'Select your booked appointment and choose a new available time slot. The original slot is freed up automatically once you confirm the new time.', + }, + { + question: 'Are there restrictions on rescheduling appointments?', + answer: + 'Rescheduling may be limited by the provider\'s policy, such as a minimum notice period or a maximum number of changes per booking.', + }, + ], + de: [ + { + question: 'Wie verschiebe ich einen bestehenden Termin?', + answer: + 'Wähle deinen gebuchten Termin und suche einen neuen verfügbaren Zeitslot aus. Der ursprüngliche Slot wird automatisch freigegeben, sobald du die neue Zeit bestätigst.', + }, + { + question: 'Gibt es Einschränkungen beim Verschieben von Terminen?', + answer: + 'Das Verschieben kann durch die Richtlinie des Anbieters eingeschränkt sein, z. B. durch eine Mindestfrist oder eine maximale Anzahl an Änderungen pro Buchung.', + }, + ], + }, }, 'appointment-availability': { @@ -73,6 +125,32 @@ export const meta: Record = { de: ['Verfügbare Slots für nächste Woche vor der Buchung durchsuchen', 'Prüfen, ob ein bestimmtes Datum und eine bestimmte Uhrzeit noch frei ist', 'Den frühesten verfügbaren Terminslot finden'], }, category: 'productivity', + faq: { + en: [ + { + question: 'How are available appointment slots determined?', + answer: + 'Available slots are based on the provider\'s configured working hours, existing bookings, and buffer times between appointments. Only genuinely open slots are shown.', + }, + { + question: 'Can I check availability for a specific date?', + answer: + 'Yes, specify a date to see all open time slots for that day. You can also browse multiple days to find the most convenient option.', + }, + ], + de: [ + { + question: 'Wie werden verfügbare Terminslots ermittelt?', + answer: + 'Verfügbare Slots basieren auf den konfigurierten Arbeitszeiten des Anbieters, bestehenden Buchungen und Pufferzeiten zwischen Terminen. Es werden nur tatsächlich freie Slots angezeigt.', + }, + { + question: 'Kann ich die Verfügbarkeit für ein bestimmtes Datum prüfen?', + answer: + 'Ja, gib ein Datum an, um alle offenen Zeitslots für diesen Tag zu sehen. Du kannst auch mehrere Tage durchsuchen, um die passendste Option zu finden.', + }, + ], + }, }, 'appointment-onboarding': { @@ -85,6 +163,32 @@ export const meta: Record = { de: ['Ein Terminsystem für ein neues Geschäft einrichten', 'Die Erstkonfiguration von Buchungsregeln und Öffnungszeiten durchgehen', 'Ein Team onboarden, um Terminbuchungen anzunehmen'], }, category: 'productivity', + faq: { + en: [ + { + question: 'What do I need to set up an appointment system?', + answer: + 'You need to define your available hours, appointment duration, and basic booking rules. The onboarding walks you through each step so your system is ready to accept bookings.', + }, + { + question: 'How long does appointment onboarding take?', + answer: + 'The initial setup takes just a few minutes. You configure your schedule, set policies, and can start accepting bookings immediately afterward.', + }, + ], + de: [ + { + question: 'Was brauche ich, um ein Terminsystem einzurichten?', + answer: + 'Du musst deine verfügbaren Zeiten, die Termindauer und grundlegende Buchungsregeln festlegen. Das Onboarding führt dich durch jeden Schritt, damit dein System bereit ist, Buchungen anzunehmen.', + }, + { + question: 'Wie lange dauert das Termin-Onboarding?', + answer: + 'Die Ersteinrichtung dauert nur wenige Minuten. Du konfigurierst deinen Zeitplan, legst Richtlinien fest und kannst danach sofort Buchungen annehmen.', + }, + ], + }, }, 'appointment-request-create': { @@ -97,6 +201,32 @@ export const meta: Record = { de: ['Eine Beratung anfragen, die eine Genehmigung des Anbieters erfordert', 'Eine Buchungsanfrage für einen stark nachgefragten Zeitslot einreichen', 'Einen Termin außerhalb der regulären Buchungszeiten anfragen'], }, category: 'productivity', + faq: { + en: [ + { + question: 'When should I use an appointment request instead of direct booking?', + answer: + 'Use a request when the provider needs to manually approve bookings, such as for high-demand slots, consultations requiring preparation, or appointments outside regular hours.', + }, + { + question: 'What happens after I submit an appointment request?', + answer: + 'The provider receives your request and can approve or decline it. You are notified once a decision is made, and the slot is reserved only upon approval.', + }, + ], + de: [ + { + question: 'Wann sollte ich eine Terminanfrage statt einer direkten Buchung verwenden?', + answer: + 'Nutze eine Anfrage, wenn der Anbieter Buchungen manuell genehmigen muss, z. B. bei stark nachgefragten Slots, Beratungen mit Vorbereitung oder Terminen außerhalb der regulären Zeiten.', + }, + { + question: 'Was passiert, nachdem ich eine Terminanfrage eingereicht habe?', + answer: + 'Der Anbieter erhält deine Anfrage und kann sie annehmen oder ablehnen. Du wirst benachrichtigt, sobald eine Entscheidung getroffen wurde, und der Slot wird erst bei Genehmigung reserviert.', + }, + ], + }, }, 'appointment-upsert-policy': { @@ -109,6 +239,32 @@ export const meta: Record = { de: ['Eine 24-Stunden-Stornierungsrichtlinie für Termine festlegen', 'No-Show-Gebühren definieren, um verpasste Buchungen zu reduzieren', 'Buchungsbedingungen aktualisieren, um Anzahlungen für Premium-Dienste zu verlangen'], }, category: 'productivity', + faq: { + en: [ + { + question: 'What policies can I configure for my appointments?', + answer: + 'You can set cancellation deadlines, no-show fees, required deposits, rescheduling limits, and minimum notice periods. Policies are enforced automatically on every booking.', + }, + { + question: 'Can I update my appointment policy after it is created?', + answer: + 'Yes, you can update your policy at any time. Changes apply to new bookings immediately; existing bookings follow the policy that was active when they were made.', + }, + ], + de: [ + { + question: 'Welche Richtlinien kann ich für meine Termine konfigurieren?', + answer: + 'Du kannst Stornierungsfristen, No-Show-Gebühren, Anzahlungen, Umbuchungslimits und Mindestvorlaufzeiten festlegen. Richtlinien werden automatisch bei jeder Buchung durchgesetzt.', + }, + { + question: 'Kann ich meine Terminrichtlinie nachträglich ändern?', + answer: + 'Ja, du kannst deine Richtlinie jederzeit aktualisieren. Änderungen gelten sofort für neue Buchungen; bestehende Buchungen behalten die zum Buchungszeitpunkt gültige Richtlinie.', + }, + ], + }, }, 'appointment-configure': { diff --git a/warps/colombia-staking/meta.ts b/warps/colombia-staking/meta.ts index 43b7603..0037c42 100644 --- a/warps/colombia-staking/meta.ts +++ b/warps/colombia-staking/meta.ts @@ -75,6 +75,22 @@ export const meta: Record = { de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei Colombia Staking restaken'], }, category: 'staking', + faq: { + en: [ + { + question: 'What does redelegating EGLD do?', + answer: + 'Redelegating automatically restakes your earned rewards with Colombia Staking, compounding your returns over time instead of letting them sit idle.', + }, + ], + de: [ + { + question: 'Was bewirkt das Redelegieren von EGLD?', + answer: + 'Beim Redelegieren werden deine verdienten Belohnungen automatisch bei Colombia Staking erneut gestakt, sodass sich deine Erträge über die Zeit hinweg verzinsen, anstatt ungenutzt zu bleiben.', + }, + ], + }, }, 'undelegate-egld': { keywords: { @@ -86,5 +102,21 @@ export const meta: Record = { de: ['EGLD von Colombia Staking unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], }, category: 'staking', + faq: { + en: [ + { + question: 'How long does it take to undelegate EGLD?', + answer: + 'After undelegating, your EGLD goes through a 10-day unbonding period before it becomes available for withdrawal to your wallet.', + }, + ], + de: [ + { + question: 'Wie lange dauert es, EGLD zu undelegieren?', + answer: + 'Nach dem Undelegieren durchläuft dein EGLD eine 10-tägige Unbonding-Periode, bevor es zur Auszahlung in dein Wallet verfügbar wird.', + }, + ], + }, }, } diff --git a/warps/eapes/meta.ts b/warps/eapes/meta.ts index 76d22ef..4490743 100644 --- a/warps/eapes/meta.ts +++ b/warps/eapes/meta.ts @@ -75,6 +75,22 @@ export const meta: Record = { de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei EAPES restaken'], }, category: 'staking', + faq: { + en: [ + { + question: 'What does redelegating EGLD do?', + answer: + 'Redelegating automatically restakes your earned rewards with EAPES, compounding your returns over time instead of letting them sit idle.', + }, + ], + de: [ + { + question: 'Was bewirkt das Redelegieren von EGLD?', + answer: + 'Beim Redelegieren werden deine verdienten Belohnungen automatisch bei EAPES erneut gestakt, sodass sich deine Erträge über die Zeit hinweg verzinsen, anstatt ungenutzt zu bleiben.', + }, + ], + }, }, 'undelegate-egld': { keywords: { @@ -86,5 +102,21 @@ export const meta: Record = { de: ['EGLD von EAPES unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], }, category: 'staking', + faq: { + en: [ + { + question: 'How long does it take to undelegate EGLD?', + answer: + 'After undelegating, your EGLD goes through a 10-day unbonding period before it becomes available for withdrawal to your wallet.', + }, + ], + de: [ + { + question: 'Wie lange dauert es, EGLD zu undelegieren?', + answer: + 'Nach dem Undelegieren durchläuft dein EGLD eine 10-tägige Unbonding-Periode, bevor es zur Auszahlung in dein Wallet verfügbar wird.', + }, + ], + }, }, } diff --git a/warps/hatom/meta.ts b/warps/hatom/meta.ts index 34fe8ee..b207700 100644 --- a/warps/hatom/meta.ts +++ b/warps/hatom/meta.ts @@ -49,6 +49,22 @@ export const meta: Record = { de: ['sEGLD zurück in EGLD umwandeln, wenn du Liquidität benötigst', 'Entstaken, nachdem du ausreichende Staking-Belohnungen auf Hatom verdient hast', 'Den Abhebungsprozess starten, um dein ursprüngliches EGLD zurückzufordern'], }, category: 'staking', + faq: { + en: [ + { + question: 'When do I receive my EGLD back after liquid unstaking?', + answer: + 'After unstaking sEGLD on Hatom, your EGLD enters an unbonding period. Once it completes, you can withdraw your EGLD using the withdraw action.', + }, + ], + de: [ + { + question: 'Wann erhalte ich mein EGLD nach dem Liquid Unstaking zurück?', + answer: + 'Nach dem Entstaken von sEGLD auf Hatom durchläuft dein EGLD eine Unbonding-Periode. Sobald diese abgeschlossen ist, kannst du dein EGLD über die Withdraw-Aktion abheben.', + }, + ], + }, }, 'liquid-withdraw': { @@ -61,5 +77,21 @@ export const meta: Record = { de: ['EGLD nach Ablauf der Entstaking-Abklingzeit beanspruchen', 'Deine abgehobenen Staking-Mittel in dein Wallet einsammeln', 'Den Ausstieg aus dem Hatom Liquid Staking abschließen'], }, category: 'staking', + faq: { + en: [ + { + question: 'When can I withdraw my EGLD after unstaking on Hatom?', + answer: + 'You can withdraw once the unbonding period has ended. This action transfers your EGLD back to your wallet.', + }, + ], + de: [ + { + question: 'Wann kann ich mein EGLD nach dem Entstaken auf Hatom abheben?', + answer: + 'Du kannst abheben, sobald die Unbonding-Periode abgelaufen ist. Diese Aktion überträgt dein EGLD zurück in dein Wallet.', + }, + ], + }, }, } diff --git a/warps/inception-network/meta.ts b/warps/inception-network/meta.ts index 538f01d..40a8d24 100644 --- a/warps/inception-network/meta.ts +++ b/warps/inception-network/meta.ts @@ -75,6 +75,22 @@ export const meta: Record = { de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei Inception Network restaken'], }, category: 'staking', + faq: { + en: [ + { + question: 'What does redelegating EGLD do?', + answer: + 'Redelegating automatically restakes your earned rewards with Inception Network, compounding your returns over time instead of letting them sit idle.', + }, + ], + de: [ + { + question: 'Was bewirkt das Redelegieren von EGLD?', + answer: + 'Beim Redelegieren werden deine verdienten Belohnungen automatisch bei Inception Network erneut gestakt, sodass sich deine Erträge über die Zeit hinweg verzinsen, anstatt ungenutzt zu bleiben.', + }, + ], + }, }, 'undelegate-egld': { keywords: { @@ -86,5 +102,21 @@ export const meta: Record = { de: ['EGLD von Inception Network unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], }, category: 'staking', + faq: { + en: [ + { + question: 'How long does it take to undelegate EGLD?', + answer: + 'After undelegating, your EGLD goes through a 10-day unbonding period before it becomes available for withdrawal to your wallet.', + }, + ], + de: [ + { + question: 'Wie lange dauert es, EGLD zu undelegieren?', + answer: + 'Nach dem Undelegieren durchläuft dein EGLD eine 10-tägige Unbonding-Periode, bevor es zur Auszahlung in dein Wallet verfügbar wird.', + }, + ], + }, }, } diff --git a/warps/mregld/meta.ts b/warps/mregld/meta.ts index 06ee7f2..fddf747 100644 --- a/warps/mregld/meta.ts +++ b/warps/mregld/meta.ts @@ -75,6 +75,22 @@ export const meta: Record = { de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei MrEGLD restaken'], }, category: 'staking', + faq: { + en: [ + { + question: 'What does redelegating EGLD do?', + answer: + 'Redelegating automatically restakes your earned rewards with MrEGLD, compounding your returns over time instead of letting them sit idle.', + }, + ], + de: [ + { + question: 'Was bewirkt das Redelegieren von EGLD?', + answer: + 'Beim Redelegieren werden deine verdienten Belohnungen automatisch bei MrEGLD erneut gestakt, sodass sich deine Erträge über die Zeit hinweg verzinsen, anstatt ungenutzt zu bleiben.', + }, + ], + }, }, 'undelegate-egld': { keywords: { @@ -86,5 +102,21 @@ export const meta: Record = { de: ['EGLD von MrEGLD unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], }, category: 'staking', + faq: { + en: [ + { + question: 'How long does it take to undelegate EGLD?', + answer: + 'After undelegating, your EGLD goes through a 10-day unbonding period before it becomes available for withdrawal to your wallet.', + }, + ], + de: [ + { + question: 'Wie lange dauert es, EGLD zu undelegieren?', + answer: + 'Nach dem Undelegieren durchläuft dein EGLD eine 10-tägige Unbonding-Periode, bevor es zur Auszahlung in dein Wallet verfügbar wird.', + }, + ], + }, }, } diff --git a/warps/multiversx/meta.ts b/warps/multiversx/meta.ts index e8caa85..dde8abf 100644 --- a/warps/multiversx/meta.ts +++ b/warps/multiversx/meta.ts @@ -450,6 +450,22 @@ export const meta: Record = { de: ['Prüfen, wie aktiv eine MultiversX-Adresse war', 'Konto-Nonce vor dem Einreichen von Transaktionen verifizieren', 'Adressaktivitaet für Recherche oder Compliance analysieren', 'Kontonutzungsmuster über die Zeit überwachen'], }, category: 'analytics', + faq: { + en: [ + { + question: 'How is the transaction count different from a balance check?', + answer: + 'The transaction count shows how many transactions an address has sent, which reflects account activity. It does not show any balance or token information.', + }, + ], + de: [ + { + question: 'Wie unterscheidet sich die Transaktionsanzahl von einer Guthabenabfrage?', + answer: + 'Die Transaktionsanzahl zeigt, wie viele Transaktionen eine Adresse gesendet hat, und spiegelt die Kontoaktivität wider. Sie zeigt keine Guthaben- oder Token-Informationen an.', + }, + ], + }, }, 'account-guardian-data': { keywords: { @@ -461,6 +477,22 @@ export const meta: Record = { de: ['Prüfen, ob ein MultiversX-Konto Guardian-Schutz aktiviert hat', '2FA-Sicherheitsstatus für Wallet-Audits überprüfen', 'Guardian-Adresskonfiguration vor sensiblen Vorgaengen bestaetigen', 'Kontosicherheitsstatus für Compliance-Pruefungen bewerten'], }, category: 'analytics', + faq: { + en: [ + { + question: 'What is a guardian on MultiversX?', + answer: + 'A guardian is a second address that acts as a co-signer for transactions, adding an extra layer of security similar to two-factor authentication.', + }, + ], + de: [ + { + question: 'Was ist ein Guardian bei MultiversX?', + answer: + 'Ein Guardian ist eine zweite Adresse, die als Mitunterzeichner für Transaktionen fungiert und eine zusätzliche Sicherheitsebene ähnlich einer Zwei-Faktor-Authentifizierung bietet.', + }, + ], + }, }, 'network-economics': { keywords: { @@ -472,6 +504,32 @@ export const meta: Record = { de: ['EGLD-Angebots- und Inflationskennzahlen in Echtzeit überwachen', 'Aktuellen Staking-APR für Investitionsentscheidungen verfolgen', 'MultiversX-Marktkapitalisierung und wirtschaftliche Gesundheit analysieren', 'Netzwerkoekonomie-Daten in Dashboards oder Berichte integrieren'], }, category: 'infrastructure', + faq: { + en: [ + { + question: 'What economic data can I see for the MultiversX network?', + answer: + 'You can view metrics like total EGLD supply, circulating supply, current staking APR, market capitalization, and inflation rate.', + }, + { + question: 'How often is the network economics data updated?', + answer: + 'The data reflects the current on-chain state and is updated with each epoch, typically every 24 hours.', + }, + ], + de: [ + { + question: 'Welche Wirtschaftsdaten kann ich zum MultiversX-Netzwerk einsehen?', + answer: + 'Du kannst Kennzahlen wie Gesamtmenge an EGLD, Umlaufmenge, aktuellen Staking-APR, Marktkapitalisierung und Inflationsrate einsehen.', + }, + { + question: 'Wie oft werden die Netzwerk-Wirtschaftsdaten aktualisiert?', + answer: + 'Die Daten spiegeln den aktuellen On-Chain-Zustand wider und werden mit jeder Epoche aktualisiert, typischerweise alle 24 Stunden.', + }, + ], + }, }, 'network-status': { keywords: { @@ -483,6 +541,22 @@ export const meta: Record = { de: ['MultiversX-Netzwerkzustand vor dem Einreichen von Transaktionen verifizieren', 'Blockhoehe und Epochenfortschritt überwachen', 'Chain-Verfügbarkeit und Rundeninformationen für Validatoren prüfen', 'Netzwerkstatus-Pruefungen in automatisierte Workflows integrieren'], }, category: 'infrastructure', + faq: { + en: [ + { + question: 'What does the network status tell me?', + answer: + 'It shows the current block height, epoch number, round information, and overall chain health so you can verify the network is operating normally.', + }, + ], + de: [ + { + question: 'Was sagt mir der Netzwerkstatus?', + answer: + 'Er zeigt die aktuelle Blockhöhe, Epochennummer, Rundeninformationen und den allgemeinen Chain-Zustand, damit du überprüfen kannst, ob das Netzwerk normal arbeitet.', + }, + ], + }, }, 'staking-claimable-rewards': { keywords: { @@ -494,6 +568,22 @@ export const meta: Record = { de: ['Ausstehende Staking-Belohnungen vor dem Einfordern prüfen', 'Belohnungsansammlung über Staking-Anbieter hinweg überwachen', 'Optimalen Einfordern-Zeitpunkt basierend auf Belohnungsguthaben planen', 'Staking-Rendite-Performance für Portfolio-Management verfolgen'], }, category: 'staking', + faq: { + en: [ + { + question: 'Can I check my claimable rewards without actually claiming them?', + answer: + 'Yes, this action only shows your pending reward balance across staking providers. No transaction is sent and nothing is claimed.', + }, + ], + de: [ + { + question: 'Kann ich meine einforderbaren Belohnungen prüfen, ohne sie tatsächlich einzufordern?', + answer: + 'Ja, diese Aktion zeigt nur dein ausstehendes Belohnungsguthaben über alle Staking-Anbieter hinweg. Es wird keine Transaktion gesendet und nichts eingefordert.', + }, + ], + }, }, 'staking-redelegate-all': { keywords: { @@ -505,6 +595,32 @@ export const meta: Record = { de: ['Staking-Belohnungen automatisch über alle Anbieter compoundieren', 'EGLD-Staking-Rendite durch Redelegation maximieren', 'Belohnungs-Reinvestition mit Ein-Klick-Restaking vereinfachen', 'Staking-Positionen über die Zeit ohne manuelle Verwaltung wachsen lassen'], }, category: 'staking', + faq: { + en: [ + { + question: 'What does redelegating do with my staking rewards?', + answer: + 'Redelegating takes your accumulated rewards and stakes them back with your providers automatically, compounding your earnings without manual steps.', + }, + { + question: 'Does redelegating affect my existing staked amount?', + answer: + 'No, your existing delegation stays untouched. Only the pending rewards are added on top as a new delegation.', + }, + ], + de: [ + { + question: 'Was passiert mit meinen Staking-Belohnungen beim Redelegieren?', + answer: + 'Beim Redelegieren werden deine angesammelten Belohnungen automatisch bei deinen Anbietern erneut gestakt, sodass deine Erträge ohne manuelle Schritte verzinst werden.', + }, + { + question: 'Beeinflusst das Redelegieren meinen bestehenden gestakten Betrag?', + answer: + 'Nein, deine bestehende Delegation bleibt unberührt. Nur die ausstehenden Belohnungen werden als neue Delegation hinzugefügt.', + }, + ], + }, }, 'staking-claim': { keywords: { @@ -516,6 +632,22 @@ export const meta: Record = { de: ['Belohnungen selektiv von einem bestimmten Staking-Anbieter einfordern', 'Belohnungseinholung pro Delegation für Steuerverfolgung verwalten', 'Belohnungseinfordern mit einem einzelnen Anbieter testen, bevor alles eingefordert wird', 'Separate Belohnungszeitplaene über verschiedene Validatoren beibehalten'], }, category: 'staking', + faq: { + en: [ + { + question: 'What is the difference between claiming from one provider vs. claiming all?', + answer: + 'Claiming from one provider lets you collect rewards from a specific validator only, while claiming all collects from every provider at once in a single transaction.', + }, + ], + de: [ + { + question: 'Was ist der Unterschied zwischen dem Einfordern von einem Anbieter und dem Einfordern aller?', + answer: + 'Beim Einfordern von einem Anbieter erhältst du nur die Belohnungen eines bestimmten Validators, während beim Einfordern aller die Belohnungen aller Anbieter in einer einzigen Transaktion gesammelt werden.', + }, + ], + }, }, 'transaction-details': { keywords: { @@ -527,6 +659,22 @@ export const meta: Record = { de: ['Transaktionsdetails anhand des Hashs für Debugging oder Verifizierung prüfen', 'Smart-Contract-Aufrufergebnisse und Gasverbrauch überprüfen', 'Transferbetraege und Empfaenger für Audits verifizieren', 'Fehlgeschlagene Transaktionen untersuchen, um Fehlerursachen zu verstehen'], }, category: 'analytics', + faq: { + en: [ + { + question: 'What do I need to look up a transaction?', + answer: + 'You need the transaction hash, which is a unique identifier returned when a transaction is submitted to the network.', + }, + ], + de: [ + { + question: 'Was brauche ich, um eine Transaktion nachzuschlagen?', + answer: + 'Du benötigst den Transaktions-Hash, eine eindeutige Kennung, die beim Einreichen einer Transaktion an das Netzwerk zurückgegeben wird.', + }, + ], + }, }, 'transaction-status': { keywords: { @@ -538,6 +686,22 @@ export const meta: Record = { de: ['Bestaetigen, ob eine Transaktion erfolgreich abgeschlossen wurde', 'Ausstehende Transaktionen bis zur Finalitaet überwachen', 'Fehlgeschlagene oder haengende Transaktionen beheben', 'Transaktionsbestaetigung für Zahlungsabwicklung verifizieren'], }, category: 'analytics', + faq: { + en: [ + { + question: 'What transaction statuses can I expect?', + answer: + 'A transaction can be pending, successful, failed, or invalid. This action shows you the current status so you know if it went through.', + }, + ], + de: [ + { + question: 'Welche Transaktionsstatus gibt es?', + answer: + 'Eine Transaktion kann ausstehend, erfolgreich, fehlgeschlagen oder ungültig sein. Diese Aktion zeigt dir den aktuellen Status, damit du weißt, ob sie durchgegangen ist.', + }, + ], + }, }, 'token-details': { keywords: { @@ -549,6 +713,22 @@ export const meta: Record = { de: ['ESDT-Token-Eigenschaften vor dem Handel oder der Investition verifizieren', 'Token-Angebot, Dezimalstellen und Eigentuemerinformationen nachschlagen', 'Token-Konfigurationsflags wie praegbar und brennbar prüfen', 'Token-Details für DeFi-Integration oder Analyse recherchieren'], }, category: 'defi', + faq: { + en: [ + { + question: 'What information does the token details view show?', + answer: + 'It shows the token name, ticker, supply, decimals, owner address, and configuration properties like whether the token is mintable or burnable.', + }, + ], + de: [ + { + question: 'Welche Informationen zeigt die Token-Detailansicht?', + answer: + 'Sie zeigt den Token-Namen, das Kürzel, die Gesamtmenge, Dezimalstellen, die Eigentümeradresse und Konfigurationseigenschaften wie Prägbarkeit oder Brennbarkeit.', + }, + ], + }, }, 'esdt-set-nft-create-role': { keywords: { @@ -560,6 +740,22 @@ export const meta: Record = { de: ['NFT-Prägeberechtigungen für einen Sammlungseigentuemer aktivieren', 'Erstellungsrollen an Mitarbeiter für gemeinsame NFT-Projekte zuweisen', 'Prägezugang nach Ausgabe einer neuen NFT-Sammlung einrichten', 'Rollenbasierte Zugriffskontrolle für NFT-Erstellungs-Workflows verwalten'], }, category: 'nft', + faq: { + en: [ + { + question: 'Who can assign the NFT create role?', + answer: + 'Only the collection owner (the address that issued the collection) can assign the NFT create role to themselves or other addresses.', + }, + ], + de: [ + { + question: 'Wer kann die NFT-Erstellungsrolle zuweisen?', + answer: + 'Nur der Sammlungseigentümer (die Adresse, die die Sammlung ausgegeben hat) kann die NFT-Erstellungsrolle sich selbst oder anderen Adressen zuweisen.', + }, + ], + }, }, 'esdt-issue-sft-collection': { keywords: { @@ -571,6 +767,22 @@ export const meta: Record = { de: ['SFT-Sammlungen für Event-Tickets oder limitierte Editionen erstellen', 'Gaming-Item-Sammlungen mit mehreren Kopien pro Token starten', 'Mitgliedsausweise oder Gutscheine als semi-fungible Token ausgeben', 'Fraktionalisierte Asset-Darstellungen auf MultiversX erstellen'], }, category: 'nft', + faq: { + en: [ + { + question: 'What is the difference between an SFT and an NFT collection?', + answer: + 'An SFT (semi-fungible token) collection allows multiple copies of the same token, while an NFT collection contains unique one-of-a-kind tokens.', + }, + ], + de: [ + { + question: 'Was ist der Unterschied zwischen einer SFT- und einer NFT-Sammlung?', + answer: + 'Eine SFT-Sammlung (semi-fungibler Token) erlaubt mehrere Kopien desselben Tokens, während eine NFT-Sammlung einzigartige Einzelstücke enthält.', + }, + ], + }, }, 'esdt-nft-view': { keywords: { @@ -582,5 +794,21 @@ export const meta: Record = { de: ['NFT-Metadaten einschliesslich Lizenzgebühren und Attribute inspizieren', 'NFT-Authentizitaet und Erstellerinformationen verifizieren', 'Medien-URIs und On-Chain-Eigenschaften für einzelne Token anzeigen', 'NFT-Details vor dem Kauf oder Handel recherchieren'], }, category: 'nft', + faq: { + en: [ + { + question: 'Can I view any NFT on MultiversX?', + answer: + 'Yes, you can look up any NFT by its collection ticker and nonce. All NFT data is public on-chain.', + }, + ], + de: [ + { + question: 'Kann ich jedes NFT auf MultiversX ansehen?', + answer: + 'Ja, du kannst jedes NFT anhand seines Sammlungskürzels und seiner Nonce nachschlagen. Alle NFT-Daten sind öffentlich auf der Blockchain.', + }, + ], + }, }, } diff --git a/warps/openai/meta.ts b/warps/openai/meta.ts index 256a475..c692ab1 100644 --- a/warps/openai/meta.ts +++ b/warps/openai/meta.ts @@ -49,6 +49,32 @@ export const meta: Record = { de: ['Eine GPT-Aufgabe stoppen, die mit falschen Anweisungen gestartet wurde', 'Einen lang laufenden OpenAI-Job abbrechen, der nicht mehr benötigt wird', 'Ressourcen freigeben durch Beenden veralteter Hintergrundaufgaben'], }, category: 'developer', + faq: { + en: [ + { + question: 'How do I cancel a running OpenAI task?', + answer: + 'Provide the task ID to cancel it immediately. Partial results generated before cancellation are not preserved.', + }, + { + question: 'What happens when I cancel an OpenAI task?', + answer: + 'The task stops processing and is marked as cancelled. If you need any output produced so far, check the task status before cancelling.', + }, + ], + de: [ + { + question: 'Wie breche ich eine laufende OpenAI-Aufgabe ab?', + answer: + 'Gib die Aufgaben-ID an, um sie sofort abzubrechen. Teilergebnisse, die vor dem Abbruch erzeugt wurden, werden nicht gespeichert.', + }, + { + question: 'Was passiert, wenn ich eine OpenAI-Aufgabe abbreche?', + answer: + 'Die Aufgabe wird gestoppt und als abgebrochen markiert. Wenn du bisherige Ausgaben brauchst, prüfe den Aufgabenstatus vor dem Abbrechen.', + }, + ], + }, }, 'get-task-status': { @@ -61,6 +87,32 @@ export const meta: Record = { de: ['Prüfen, ob eine GPT-Hintergrund-Rechercheaufgabe abgeschlossen ist', 'Die fertige Ausgabe eines OpenAI-Schreibauftrags abrufen', 'Den Fortschritt einer lang laufenden Analyseaufgabe überwachen'], }, category: 'developer', + faq: { + en: [ + { + question: 'What statuses can an OpenAI task have?', + answer: + 'Tasks can be queued, in progress, completed, failed, or cancelled. The status response includes any output generated so far.', + }, + { + question: 'How do I check if my OpenAI task is finished?', + answer: + 'Query the task status with the task ID. A completed status means results are ready for retrieval.', + }, + ], + de: [ + { + question: 'Welche Status kann eine OpenAI-Aufgabe haben?', + answer: + 'Aufgaben können in Warteschlange, in Bearbeitung, abgeschlossen, fehlgeschlagen oder abgebrochen sein. Die Statusantwort enthält alle bisher erzeugten Ausgaben.', + }, + { + question: 'Wie prüfe ich, ob meine OpenAI-Aufgabe fertig ist?', + answer: + 'Frage den Aufgabenstatus mit der Aufgaben-ID ab. Der Status "abgeschlossen" bedeutet, dass die Ergebnisse bereitstehen.', + }, + ], + }, }, 'add-followup': { @@ -73,6 +125,22 @@ export const meta: Record = { de: ['GPT bitten, einen Entwurf basierend auf neuem Feedback zu überarbeiten', 'Zusätzlichen Kontext liefern, um die Aufgabenausgabe zu verbessern', 'Ein anderes Format oder einen anderen Fokus für fertige Ergebnisse anfordern'], }, category: 'developer', + faq: { + en: [ + { + question: 'Can I send additional instructions to an OpenAI task after it started?', + answer: + 'Yes, add a follow-up message with new context or revised instructions. The model incorporates the update and continues processing.', + }, + ], + de: [ + { + question: 'Kann ich einer laufenden OpenAI-Aufgabe nachträglich Anweisungen senden?', + answer: + 'Ja, sende eine Folgenachricht mit neuem Kontext oder überarbeiteten Anweisungen. Das Modell berücksichtigt die Aktualisierung und arbeitet weiter.', + }, + ], + }, }, 'codex-launch-task': { @@ -85,6 +153,22 @@ export const meta: Record = { de: ['Codex ein neues Feature in der Codebasis implementieren lassen', 'Bug-Fixes und Code-Refactoring an OpenAI Codex delegieren', 'Code-Reviews und Testgenerierung mit Codex automatisieren'], }, category: 'developer', + faq: { + en: [ + { + question: 'How do I start a coding task with Codex?', + answer: + 'Submit your coding instructions through the Codex CLI. The task runs in a cloud sandbox with access to your repository and delivers code changes when done.', + }, + ], + de: [ + { + question: 'Wie starte ich eine Programmieraufgabe mit Codex?', + answer: + 'Reiche deine Programmieranweisungen über die Codex CLI ein. Die Aufgabe läuft in einer Cloud-Sandbox mit Zugriff auf dein Repository und liefert Codeänderungen nach Abschluss.', + }, + ], + }, }, 'codex-cancel-task': { @@ -97,6 +181,22 @@ export const meta: Record = { de: ['Eine Codex-Aufgabe stoppen, wenn sich die Anforderungen geändert haben', 'Einen Code-Generierungsjob abbrechen, der den falschen Ansatz verfolgt', 'Eine Codex-Aufgabe abbrechen, um mit besseren Anweisungen neu zu starten'], }, category: 'developer', + faq: { + en: [ + { + question: 'Can I cancel a Codex task that is already writing code?', + answer: + 'Yes, cancelling stops the task immediately. Incomplete code changes may remain in the sandbox, so review the output before applying anything.', + }, + ], + de: [ + { + question: 'Kann ich eine Codex-Aufgabe abbrechen, die bereits Code schreibt?', + answer: + 'Ja, das Abbrechen stoppt die Aufgabe sofort. Unvollständige Codeänderungen können in der Sandbox verbleiben, also prüfe die Ausgabe, bevor du etwas übernimmst.', + }, + ], + }, }, 'codex-get-task-status': { @@ -109,6 +209,22 @@ export const meta: Record = { de: ['Prüfen, ob Codex die Feature-Implementierung abgeschlossen hat', 'Den generierten Code vor dem Zusammenführen überprüfen', 'Eine komplexe Refactoring-Aufgabe im Fortschritt überwachen'], }, category: 'developer', + faq: { + en: [ + { + question: 'How do I check whether my Codex coding task is done?', + answer: + 'Query the task status using the task ID. A completed status means the code changes are ready for review and can be applied to your repository.', + }, + ], + de: [ + { + question: 'Wie prüfe ich, ob meine Codex-Programmieraufgabe fertig ist?', + answer: + 'Frage den Aufgabenstatus mit der Aufgaben-ID ab. Der Status "abgeschlossen" bedeutet, dass die Codeänderungen zur Überprüfung bereitstehen und auf dein Repository angewendet werden können.', + }, + ], + }, }, 'codex-add-followup': { @@ -121,6 +237,22 @@ export const meta: Record = { de: ['Codex bitten, Fehlerbehandlung zum generierten Code hinzuzufügen', 'Stil- oder Architekturänderungen während der Implementierung anfordern', 'Klärende Details zu Grenzfällen während des Programmierens liefern'], }, category: 'developer', + faq: { + en: [ + { + question: 'Can I send follow-up instructions to a running Codex task?', + answer: + 'Yes, add a follow-up with the task ID to provide new context or request changes. Codex adjusts its approach based on your updated instructions.', + }, + ], + de: [ + { + question: 'Kann ich einer laufenden Codex-Aufgabe Folgeanweisungen senden?', + answer: + 'Ja, sende eine Folgenachricht mit der Aufgaben-ID, um neuen Kontext bereitzustellen oder Änderungen anzufordern. Codex passt seinen Ansatz basierend auf deinen aktualisierten Anweisungen an.', + }, + ], + }, }, 'joai-plugin-install': { diff --git a/warps/projectx/meta.ts b/warps/projectx/meta.ts index 26f8e85..4fa2e2f 100644 --- a/warps/projectx/meta.ts +++ b/warps/projectx/meta.ts @@ -75,6 +75,22 @@ export const meta: Record = { de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei ProjectX restaken'], }, category: 'staking', + faq: { + en: [ + { + question: 'What does redelegating EGLD do?', + answer: + 'Redelegating automatically restakes your earned rewards with ProjectX, compounding your returns over time instead of letting them sit idle.', + }, + ], + de: [ + { + question: 'Was bewirkt das Redelegieren von EGLD?', + answer: + 'Beim Redelegieren werden deine verdienten Belohnungen automatisch bei ProjectX erneut gestakt, sodass sich deine Erträge über die Zeit hinweg verzinsen, anstatt ungenutzt zu bleiben.', + }, + ], + }, }, 'undelegate-egld': { keywords: { @@ -86,5 +102,21 @@ export const meta: Record = { de: ['EGLD von ProjectX unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], }, category: 'staking', + faq: { + en: [ + { + question: 'How long does it take to undelegate EGLD?', + answer: + 'After undelegating, your EGLD goes through a 10-day unbonding period before it becomes available for withdrawal to your wallet.', + }, + ], + de: [ + { + question: 'Wie lange dauert es, EGLD zu undelegieren?', + answer: + 'Nach dem Undelegieren durchläuft dein EGLD eine 10-tägige Unbonding-Periode, bevor es zur Auszahlung in dein Wallet verfügbar wird.', + }, + ], + }, }, } diff --git a/warps/xexchange/meta.ts b/warps/xexchange/meta.ts index db402e3..945c9a8 100644 --- a/warps/xexchange/meta.ts +++ b/warps/xexchange/meta.ts @@ -161,6 +161,22 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'What is the difference between USDT and USDC when swapping from WEGLD?', + answer: + 'Both are USD-pegged stablecoins on MultiversX. USDT (Tether) and USDC (Circle) maintain a 1:1 dollar peg, but they differ in issuer and reserve backing. Choose based on which stablecoin you prefer to hold or need for further transfers.', + }, + ], + de: [ + { + question: 'Was ist der Unterschied zwischen USDT und USDC beim Tausch von WEGLD?', + answer: + 'Beide sind USD-gebundene Stablecoins auf MultiversX. USDT (Tether) und USDC (Circle) halten eine 1:1-Dollar-Bindung, unterscheiden sich aber in Herausgeber und Reservedeckung. Wähle je nachdem, welchen Stablecoin du bevorzugst oder für weitere Transfers benötigst.', + }, + ], + }, }, 'swap-usdt-to-wegld': { @@ -181,6 +197,22 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'Can I use Tether (USDT) to buy EGLD on xExchange?', + answer: + 'Yes, you can swap USDT for WEGLD directly on xExchange. USDT on MultiversX is a bridged version of Tether, and the swap gives you WEGLD which can be unwrapped to native EGLD.', + }, + ], + de: [ + { + question: 'Kann ich mit Tether (USDT) EGLD auf xExchange kaufen?', + answer: + 'Ja, du kannst USDT direkt auf xExchange gegen WEGLD tauschen. USDT auf MultiversX ist eine gebridgte Version von Tether, und der Tausch liefert dir WEGLD, das du in natives EGLD unwrappen kannst.', + }, + ], + }, }, 'swap-wegld-to-wbtc': { @@ -201,6 +233,22 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'Is WBTC on MultiversX the same as holding real Bitcoin?', + answer: + 'WBTC (Wrapped Bitcoin) is a bridged token that represents Bitcoin on MultiversX. It tracks the BTC price 1:1 and lets you gain Bitcoin exposure while staying within the MultiversX DeFi ecosystem.', + }, + ], + de: [ + { + question: 'Ist WBTC auf MultiversX dasselbe wie echtes Bitcoin?', + answer: + 'WBTC (Wrapped Bitcoin) ist ein gebridgter Token, der Bitcoin auf MultiversX repräsentiert. Er bildet den BTC-Preis 1:1 ab und ermöglicht dir Bitcoin-Exposure, ohne das MultiversX-DeFi-Ökosystem verlassen zu müssen.', + }, + ], + }, }, 'swap-wbtc-to-wegld': { @@ -221,6 +269,22 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'Why would I swap my Wrapped Bitcoin for WEGLD instead of holding BTC?', + answer: + 'Swapping WBTC to WEGLD lets you stake EGLD for network rewards, participate in MultiversX DeFi protocols, and use native dApps -- opportunities not available while holding a bridged Bitcoin token.', + }, + ], + de: [ + { + question: 'Warum sollte ich mein Wrapped Bitcoin gegen WEGLD tauschen, statt BTC zu halten?', + answer: + 'Der Tausch von WBTC zu WEGLD ermöglicht dir, EGLD zu staken und Netzwerk-Belohnungen zu erhalten, an MultiversX-DeFi-Protokollen teilzunehmen und native dApps zu nutzen -- Möglichkeiten, die mit einem gebridgten Bitcoin-Token nicht verfügbar sind.', + }, + ], + }, }, 'swap-wegld-to-weth': { @@ -241,6 +305,22 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'What is WETH on MultiversX and how does it relate to Ethereum?', + answer: + 'WETH (Wrapped Ether) is a bridged version of Ethereum\'s native ETH token available on MultiversX. It tracks the ETH price and lets you hold Ethereum exposure without leaving the MultiversX network.', + }, + ], + de: [ + { + question: 'Was ist WETH auf MultiversX und wie hängt es mit Ethereum zusammen?', + answer: + 'WETH (Wrapped Ether) ist eine gebridgte Version von Ethereums nativem ETH-Token auf MultiversX. Er bildet den ETH-Preis ab und ermöglicht dir Ethereum-Exposure, ohne das MultiversX-Netzwerk verlassen zu müssen.', + }, + ], + }, }, 'swap-weth-to-wegld': { @@ -261,6 +341,22 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'Can I convert my bridged Ethereum to EGLD for staking?', + answer: + 'Yes, you can swap WETH (Wrapped Ether) to WEGLD on xExchange and then unwrap it to native EGLD. This lets you move from a bridged Ethereum position directly into EGLD staking on MultiversX.', + }, + ], + de: [ + { + question: 'Kann ich mein gebridgtes Ethereum in EGLD zum Staken umwandeln?', + answer: + 'Ja, du kannst WETH (Wrapped Ether) auf xExchange gegen WEGLD tauschen und es dann in natives EGLD unwrappen. So wechselst du direkt von einer gebridgten Ethereum-Position ins EGLD-Staking auf MultiversX.', + }, + ], + }, }, 'swap-mex-to-usdc': { @@ -281,6 +377,22 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'How do I cash out my MEX governance token rewards to a stablecoin?', + answer: + 'You can swap MEX directly to USDC on xExchange. This converts your xExchange governance token earnings into a dollar-pegged stablecoin, locking in the value of your rewards.', + }, + ], + de: [ + { + question: 'Wie löse ich meine MEX-Governance-Token-Belohnungen in einen Stablecoin ein?', + answer: + 'Du kannst MEX direkt auf xExchange gegen USDC tauschen. Damit wandelst du deine xExchange-Governance-Token-Erträge in einen dollargebundenen Stablecoin um und sicherst den Wert deiner Belohnungen.', + }, + ], + }, }, 'swap-usdc-to-mex': { @@ -301,6 +413,22 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'Why would I buy MEX with USDC instead of with EGLD?', + answer: + 'Buying MEX with USDC lets you acquire the xExchange governance token from a stable-value position without selling your EGLD holdings. This is useful if you want to keep your EGLD staked while still participating in xExchange governance.', + }, + ], + de: [ + { + question: 'Warum sollte ich MEX mit USDC statt mit EGLD kaufen?', + answer: + 'Der Kauf von MEX mit USDC ermöglicht dir, den xExchange-Governance-Token aus einer wertstabilen Position heraus zu erwerben, ohne deine EGLD-Bestände zu verkaufen. Das ist praktisch, wenn du dein EGLD weiter staken und trotzdem an der xExchange-Governance teilnehmen möchtest.', + }, + ], + }, }, 'swap-htm-to-wegld': { @@ -321,6 +449,22 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'What is HTM and why would I swap it for WEGLD?', + answer: + 'HTM is the governance token of Hatom, the leading lending and liquid staking protocol on MultiversX. Swapping HTM to WEGLD lets you convert your Hatom protocol position into the native MultiversX asset for staking or other DeFi uses.', + }, + ], + de: [ + { + question: 'Was ist HTM und warum sollte ich es gegen WEGLD tauschen?', + answer: + 'HTM ist der Governance-Token von Hatom, dem führenden Lending- und Liquid-Staking-Protokoll auf MultiversX. Der Tausch von HTM zu WEGLD ermöglicht dir, deine Hatom-Position in den nativen MultiversX-Vermögenswert umzuwandeln -- zum Staken oder für andere DeFi-Nutzungen.', + }, + ], + }, }, 'swap-wegld-to-htm': { @@ -341,5 +485,21 @@ export const meta: Record = { ], }, category: 'defi', + faq: { + en: [ + { + question: 'What can I do with HTM tokens after swapping from WEGLD?', + answer: + 'HTM gives you governance rights in the Hatom lending and liquid staking protocol on MultiversX. You can vote on protocol proposals, provide liquidity in HTM pairs, or hold it to benefit from the growth of the Hatom ecosystem.', + }, + ], + de: [ + { + question: 'Was kann ich mit HTM-Token machen, nachdem ich von WEGLD getauscht habe?', + answer: + 'HTM gibt dir Governance-Rechte im Hatom-Lending- und Liquid-Staking-Protokoll auf MultiversX. Du kannst über Protokoll-Vorschläge abstimmen, Liquidität in HTM-Paaren bereitstellen oder HTM halten, um vom Wachstum des Hatom-Ökosystems zu profitieren.', + }, + ], + }, }, } diff --git a/warps/xoxno/meta.ts b/warps/xoxno/meta.ts index e186be7..a5e271b 100644 --- a/warps/xoxno/meta.ts +++ b/warps/xoxno/meta.ts @@ -75,6 +75,22 @@ export const meta: Record = { de: ['Staking-Belohnungen automatisch reinvestieren', 'EGLD-Ertrage langfristig maximieren', 'eGold bei XOXNO restaken'], }, category: 'staking', + faq: { + en: [ + { + question: 'What does redelegating EGLD do?', + answer: + 'Redelegating automatically restakes your earned rewards with XOXNO, compounding your returns over time instead of letting them sit idle.', + }, + ], + de: [ + { + question: 'Was bewirkt das Redelegieren von EGLD?', + answer: + 'Beim Redelegieren werden deine verdienten Belohnungen automatisch bei XOXNO erneut gestakt, sodass sich deine Erträge über die Zeit hinweg verzinsen, anstatt ungenutzt zu bleiben.', + }, + ], + }, }, 'undelegate-egld': { keywords: { @@ -86,6 +102,22 @@ export const meta: Record = { de: ['EGLD von XOXNO unstaken', 'Gestaktes eGold abheben', 'Staking-Delegationen verwalten'], }, category: 'staking', + faq: { + en: [ + { + question: 'How long does it take to undelegate EGLD?', + answer: + 'After undelegating, your EGLD goes through a 10-day unbonding period before it becomes available for withdrawal to your wallet.', + }, + ], + de: [ + { + question: 'Wie lange dauert es, EGLD zu undelegieren?', + answer: + 'Nach dem Undelegieren durchläuft dein EGLD eine 10-tägige Unbonding-Periode, bevor es zur Auszahlung in dein Wallet verfügbar wird.', + }, + ], + }, }, 'liquid-stake': { keywords: { @@ -124,6 +156,22 @@ export const meta: Record = { de: ['Liquid gestakte EGLD-Token einlosen', 'XOXNO Liquid-Staking-Position verlassen', 'eGold-Auszahlungsprozess starten'], }, category: 'staking', + faq: { + en: [ + { + question: 'When do I receive my EGLD back after liquid unstaking?', + answer: + 'After liquid unstaking, your tokens enter an unbonding period. Once it completes, you can withdraw your EGLD using the liquid withdraw action.', + }, + ], + de: [ + { + question: 'Wann erhalte ich mein EGLD nach dem Liquid Unstaking zurück?', + answer: + 'Nach dem Liquid Unstaking durchlaufen deine Token eine Unbonding-Periode. Sobald diese abgeschlossen ist, kannst du dein EGLD über die Liquid-Withdraw-Aktion abheben.', + }, + ], + }, }, 'liquid-withdraw': { keywords: { @@ -135,5 +183,21 @@ export const meta: Record = { de: ['EGLD Liquid-Unstaking-Auszahlung abschliessen', 'eGold nach Unbonding-Periode einfordern', 'XOXNO Liquid-Staking-Ausstieg abschliessen'], }, category: 'staking', + faq: { + en: [ + { + question: 'When can I withdraw my EGLD after liquid unstaking?', + answer: + 'You can withdraw once the unbonding period has ended. This action transfers your EGLD back to your wallet.', + }, + ], + de: [ + { + question: 'Wann kann ich mein EGLD nach dem Liquid Unstaking abheben?', + answer: + 'Du kannst abheben, sobald die Unbonding-Periode abgelaufen ist. Diese Aktion überträgt dein EGLD zurück in dein Wallet.', + }, + ], + }, }, } From b9d21fa8c0c072b39fc84d984298cc00a22cee2c Mon Sep 17 00:00:00 2001 From: Micha Vie Date: Thu, 2 Apr 2026 14:32:16 +0200 Subject: [PATCH 19/19] fix: avoid secrets in workflow condition --- .github/workflows/sync-catalog.yml | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/.github/workflows/sync-catalog.yml b/.github/workflows/sync-catalog.yml index 2883e85..a6cc7ab 100644 --- a/.github/workflows/sync-catalog.yml +++ b/.github/workflows/sync-catalog.yml @@ -62,10 +62,12 @@ jobs: run: node --import tsx scripts/catalog/sync-to-api.ts --branch "${GITHUB_REF_NAME}" --commit "${GITHUB_SHA}" --repo "${GITHUB_REPOSITORY}" - name: Dispatch plugin sync - if: ${{ secrets.JOAI_PLUGIN_SYNC_TOKEN != '' }} + env: + JOAI_PLUGIN_SYNC_TOKEN: ${{ secrets.JOAI_PLUGIN_SYNC_TOKEN }} + if: ${{ env.JOAI_PLUGIN_SYNC_TOKEN != '' }} uses: peter-evans/repository-dispatch@v3 with: - token: ${{ secrets.JOAI_PLUGIN_SYNC_TOKEN }} + token: ${{ env.JOAI_PLUGIN_SYNC_TOKEN }} repository: JoAiHQ/joai--plugins event-type: warps_catalog_updated client-payload: >-