Skip to content

Commit 9716890

Browse files
gcmsgclaude
andcommitted
feat: add platform-aware agent registration with plugin install prompts
Add AI platform selector (OpenClaw/IronClaw/PicoClaw/nanobot) to the claim token flow. The generated prompt now includes platform-specific plugin installation instructions when a platform is selected. - Add platform select dropdown to ClaimTokenSection - Rename claim.prompt to claim.prompt_base in all 8 locales - Add platform-specific prompt templates (en/zh with full content, other 6 locales with UI labels only — technical prompts fallback to en) - Platform is client-side only, no DB/API changes needed Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
1 parent a7c8ade commit 9716890

File tree

9 files changed

+107
-12
lines changed

9 files changed

+107
-12
lines changed

web/app/src/components/provider/ClaimTokenSection.tsx

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export function ClaimTokenSection() {
2020
const { generate } = useGenerateClaimToken()
2121

2222
const [agentName, setAgentName] = useState("")
23+
const [platform, setPlatform] = useState("cli")
2324
const [generatedCode, setGeneratedCode] = useState<string | null>(null)
2425
const [expiresAt, setExpiresAt] = useState<string | null>(null)
2526
const [remaining, setRemaining] = useState<number>(0)
@@ -71,15 +72,19 @@ export function ClaimTokenSection() {
7172
}
7273
}, [agentName, generate, refetch, t])
7374

74-
const buildPrompt = (token: string, name: string) =>
75-
t('claim.prompt', { name, token, origin: window.location.origin })
75+
const buildPrompt = (token: string, name: string, plat: string) => {
76+
const base = t('claim.prompt_base', { name, token, origin: window.location.origin })
77+
if (plat === "cli") return base
78+
const platformPrompt = t(`claim.prompt_${plat}`, { origin: window.location.origin })
79+
return base + platformPrompt
80+
}
7681

7782
const prompt = generatedCode
78-
? buildPrompt(generatedCode, agentName.trim())
83+
? buildPrompt(generatedCode, agentName.trim(), platform)
7984
: ""
8085

8186
const viewPrompt = viewingToken
82-
? buildPrompt(viewingToken.code, viewingToken.agent_name)
87+
? buildPrompt(viewingToken.code, viewingToken.agent_name, "cli")
8388
: ""
8489

8590
const handleCopy = useCallback(() => {
@@ -155,6 +160,24 @@ export function ClaimTokenSection() {
155160
</Button>
156161
</div>
157162

163+
{/* Platform select */}
164+
<div>
165+
<label className="text-sm font-medium mb-1 block">
166+
{t('claim.platformLabel')}
167+
</label>
168+
<select
169+
value={platform}
170+
onChange={(e) => setPlatform(e.target.value)}
171+
className="w-full rounded-lg border border-input bg-background px-3 py-2 text-sm focus:outline-none focus:ring-2 focus:ring-ring"
172+
>
173+
{(["cli", "openclaw", "ironclaw", "picoclaw", "nanobot"] as const).map((p) => (
174+
<option key={p} value={p}>
175+
{t(`claim.platformOptions.${p}`)}
176+
</option>
177+
))}
178+
</select>
179+
</div>
180+
158181
{genError && (
159182
<p className="text-sm text-destructive">{genError}</p>
160183
)}

web/app/src/i18n/locales/ar.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,15 @@
245245
"noTokens": "لم يتم إنشاء رموز بعد. أدخل اسم الوكيل وانقر على \"إنشاء رمز\" لإنشاء رمز إقران.",
246246
"loadingTokens": "جارٍ تحميل الرموز...",
247247
"expired": "منتهي الصلاحية",
248-
"prompt": "يرجى تسجيلي على PeerClaw ({{origin}}) — منصة مفتوحة المصدر للهوية والثقة لوكلاء الذكاء الاصطناعي.\n\n## الخطوة 1: تثبيت واجهة سطر أوامر PeerClaw\n\n```bash\ncurl -fsSL https://peerclaw.ai/install.sh | sh\n```\n\nيقوم هذا بتنزيل ملف `peerclaw` التنفيذي من إصدارات GitHub: https://github.com/peerclaw/peerclaw-cli/releases\nيمكنك فحص السكريبت أولاً: `curl -fsSL https://peerclaw.ai/install.sh`\n\n## الخطوة 2: التسجيل باسم \"{{name}}\"\n\n```bash\nmkdir -p ~/.peerclaw && peerclaw agent claim --token {{token}} --server {{origin}} --keypair ~/.peerclaw/agent.key\n```\n\nسيقوم هذا الأمر بـ:\n- إنشاء زوج مفاتيح Ed25519 (يُحفظ في `~/.peerclaw/agent.key`)\n- توقيع الرمز بمفتاحك الخاص (يثبت ملكية المفتاح)\n- التسجيل على PeerClaw باسم \"{{name}}\" على {{origin}}\n\n\u23f0 تنتهي صلاحية الرمز خلال 30 دقيقة — يرجى التنفيذ فوراً.\n\n## الخطوة 3: تأمين زوج المفاتيح\n\n```bash\nchmod 600 ~/.peerclaw/agent.key\n```\n\nيحفظ أمر الإقران تلقائياً معرّف الوكيل وعنوان الخادم ومسار زوج المفاتيح في `~/.peerclaw/config.yaml`. نفّذ `peerclaw config show` للتحقق.\n\n## الخطوة 4: ابقَ متصلاً\n\nيراقب PeerClaw نشاط الوكلاء عبر نبضات القلب. الوكلاء الذين يصبحون غير متصلين يفقدون نقاط السمعة. خياران:\n\n**الخيار أ (موصى به):** التشغيل كخادم MCP — تُرسل نبضات القلب تلقائياً:\n```bash\npeerclaw mcp serve\n```\n\n**الخيار ب:** إرسال نبضات القلب يدوياً (مثلاً، عبر cron كل 3 دقائق):\n```bash\npeerclaw agent heartbeat <your-agent-id> --status active\n```\n\n## الخطوة 5: استكشف\n\n```bash\npeerclaw agent get <your-agent-id> # التحقق من التسجيل\npeerclaw invoke <other-agent-id> --message \"Hello\" # التحدث مع وكلاء آخرين\n```\n\nالوثائق الكاملة: https://github.com/peerclaw/peerclaw/blob/main/docs/GUIDE.md"
248+
"platformLabel": "منصة الذكاء الاصطناعي",
249+
"platformOptions": {
250+
"cli": "CLI فقط",
251+
"openclaw": "OpenClaw",
252+
"ironclaw": "IronClaw",
253+
"picoclaw": "PicoClaw",
254+
"nanobot": "nanobot"
255+
},
256+
"prompt_base": "يرجى تسجيلي على PeerClaw ({{origin}}) — منصة مفتوحة المصدر للهوية والثقة لوكلاء الذكاء الاصطناعي.\n\n## الخطوة 1: تثبيت واجهة سطر أوامر PeerClaw\n\n```bash\ncurl -fsSL https://peerclaw.ai/install.sh | sh\n```\n\nيقوم هذا بتنزيل ملف `peerclaw` التنفيذي من إصدارات GitHub: https://github.com/peerclaw/peerclaw-cli/releases\nيمكنك فحص السكريبت أولاً: `curl -fsSL https://peerclaw.ai/install.sh`\n\n## الخطوة 2: التسجيل باسم \"{{name}}\"\n\n```bash\nmkdir -p ~/.peerclaw && peerclaw agent claim --token {{token}} --server {{origin}} --keypair ~/.peerclaw/agent.key\n```\n\nسيقوم هذا الأمر بـ:\n- إنشاء زوج مفاتيح Ed25519 (يُحفظ في `~/.peerclaw/agent.key`)\n- توقيع الرمز بمفتاحك الخاص (يثبت ملكية المفتاح)\n- التسجيل على PeerClaw باسم \"{{name}}\" على {{origin}}\n\n⏰ تنتهي صلاحية الرمز خلال 30 دقيقة — يرجى التنفيذ فوراً.\n\n## الخطوة 3: تأمين زوج المفاتيح\n\n```bash\nchmod 600 ~/.peerclaw/agent.key\n```\n\nيحفظ أمر الإقران تلقائياً معرّف الوكيل وعنوان الخادم ومسار زوج المفاتيح في `~/.peerclaw/config.yaml`. نفّذ `peerclaw config show` للتحقق.\n\n## الخطوة 4: ابقَ متصلاً\n\nيراقب PeerClaw نشاط الوكلاء عبر نبضات القلب. الوكلاء الذين يصبحون غير متصلين يفقدون نقاط السمعة. خياران:\n\n**الخيار أ (موصى به):** التشغيل كخادم MCP — تُرسل نبضات القلب تلقائياً:\n```bash\npeerclaw mcp serve\n```\n\n**الخيار ب:** إرسال نبضات القلب يدوياً (مثلاً، عبر cron كل 3 دقائق):\n```bash\npeerclaw agent heartbeat <your-agent-id> --status active\n```\n\n## الخطوة 5: استكشف\n\n```bash\npeerclaw agent get <your-agent-id> # التحقق من التسجيل\npeerclaw invoke <other-agent-id> --message \"Hello\" # التحدث مع وكلاء آخرين\n```\n\nالوثائق الكاملة: https://github.com/peerclaw/peerclaw/blob/main/docs/GUIDE.md"
249257
},
250258
"upgrade": {
251259
"prompt": "يرجى ترقية PeerClaw CLI للوكيل \"{{agent_name}}\" (المعرف: {{agent_id}}).\n\nالإصدار الحالي: {{current_version}}\nأحدث إصدار: {{latest_version}}\nالخادم: {{server_url}}\n\n## الخطوة 1: تحديث CLI\n\n```bash\ncurl -fsSL {{server_url}}/install.sh | sh\n```\n\nأو قم بالتحميل مباشرة من: https://github.com/peerclaw/peerclaw-cli/releases\n\n## الخطوة 2: التحقق من الإصدار الجديد\n\n```bash\npeerclaw version\n```\n\nالمخرج المتوقع: `peerclaw version {{latest_version}}`\n\n## الخطوة 3: إرسال نبضة لتحديث الإصدار على الخادم\n\n```bash\npeerclaw agent heartbeat {{agent_id}} --status online\n```\n\nسيقوم هذا تلقائياً بالإبلاغ عن إصدار SDK الجديد لخادم PeerClaw.",

web/app/src/i18n/locales/en.json

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,19 @@
245245
"noTokens": "No tokens generated yet. Enter an agent name and click \"Generate Token\" to create a pairing code.",
246246
"loadingTokens": "Loading tokens...",
247247
"expired": "expired",
248-
"prompt": "Please register me on PeerClaw ({{origin}}) — an open-source identity & trust platform for AI Agents.\n\n## Step 1: Install the PeerClaw CLI\n\n```bash\ncurl -fsSL https://peerclaw.ai/install.sh | sh\n```\n\nThis downloads the `peerclaw` binary from GitHub releases: https://github.com/peerclaw/peerclaw-cli/releases\nYou can inspect the script first: `curl -fsSL https://peerclaw.ai/install.sh`\n\n## Step 2: Register as \"{{name}}\"\n\n```bash\nmkdir -p ~/.peerclaw && peerclaw agent claim --token {{token}} --server {{origin}} --keypair ~/.peerclaw/agent.key\n```\n\nThis command will:\n- Generate an Ed25519 keypair (saved to `~/.peerclaw/agent.key`)\n- Sign the token with your private key (proves key ownership)\n- Register with PeerClaw as \"{{name}}\" on {{origin}}\n\n⏰ Token expires in 30 minutes — please run immediately.\n\n## Step 3: Secure your keypair\n\n```bash\nchmod 600 ~/.peerclaw/agent.key\n```\n\nThe claim command automatically saves your Agent ID, server URL, and keypair path to `~/.peerclaw/config.yaml`. Run `peerclaw config show` to verify.\n\n## Step 4: Stay online\n\nPeerClaw monitors agent liveness via heartbeats. Agents that go offline lose reputation score. Two options:\n\n**Option A (recommended):** Run as MCP server — heartbeats are sent automatically:\n```bash\npeerclaw mcp serve\n```\n\n**Option B:** Send heartbeats manually (e.g., via cron every 3 minutes):\n```bash\npeerclaw agent heartbeat <your-agent-id> --status active\n```\n\n## Step 5: Explore\n\n```bash\npeerclaw agent get <your-agent-id> # verify registration\npeerclaw invoke <other-agent-id> --message \"Hello\" # talk to other agents\n```\n\nFull documentation: https://github.com/peerclaw/peerclaw/blob/main/docs/GUIDE.md"
248+
"platformLabel": "AI Platform",
249+
"platformOptions": {
250+
"cli": "CLI Only",
251+
"openclaw": "OpenClaw",
252+
"ironclaw": "IronClaw",
253+
"picoclaw": "PicoClaw",
254+
"nanobot": "nanobot"
255+
},
256+
"prompt_base": "Please register me on PeerClaw ({{origin}}) — an open-source identity & trust platform for AI Agents.\n\n## Step 1: Install the PeerClaw CLI\n\n```bash\ncurl -fsSL https://peerclaw.ai/install.sh | sh\n```\n\nThis downloads the `peerclaw` binary from GitHub releases: https://github.com/peerclaw/peerclaw-cli/releases\nYou can inspect the script first: `curl -fsSL https://peerclaw.ai/install.sh`\n\n## Step 2: Register as \"{{name}}\"\n\n```bash\nmkdir -p ~/.peerclaw && peerclaw agent claim --token {{token}} --server {{origin}} --keypair ~/.peerclaw/agent.key\n```\n\nThis command will:\n- Generate an Ed25519 keypair (saved to `~/.peerclaw/agent.key`)\n- Sign the token with your private key (proves key ownership)\n- Register with PeerClaw as \"{{name}}\" on {{origin}}\n\n⏰ Token expires in 30 minutes — please run immediately.\n\n## Step 3: Secure your keypair\n\n```bash\nchmod 600 ~/.peerclaw/agent.key\n```\n\nThe claim command automatically saves your Agent ID, server URL, and keypair path to `~/.peerclaw/config.yaml`. Run `peerclaw config show` to verify.\n\n## Step 4: Stay online\n\nPeerClaw monitors agent liveness via heartbeats. Agents that go offline lose reputation score. Two options:\n\n**Option A (recommended):** Run as MCP server — heartbeats are sent automatically:\n```bash\npeerclaw mcp serve\n```\n\n**Option B:** Send heartbeats manually (e.g., via cron every 3 minutes):\n```bash\npeerclaw agent heartbeat <your-agent-id> --status active\n```\n\n## Step 5: Explore\n\n```bash\npeerclaw agent get <your-agent-id> # verify registration\npeerclaw invoke <other-agent-id> --message \"Hello\" # talk to other agents\n```\n\nFull documentation: https://github.com/peerclaw/peerclaw/blob/main/docs/GUIDE.md",
257+
"prompt_openclaw": "\n\n## Step 6: Connect to OpenClaw\n\nInstall the PeerClaw plugin for OpenClaw:\n\n```bash\nnpm install @peerclaw/openclaw-plugin\n```\n\nAdd to your OpenClaw `config.json`:\n```json\n{\n \"plugins\": [\n {\n \"name\": \"@peerclaw/openclaw-plugin\",\n \"config\": {\n \"peerclaw_server\": \"{{origin}}\",\n \"keypair_path\": \"~/.peerclaw/agent.key\"\n }\n }\n ]\n}\n```\n\nRestart OpenClaw to activate the plugin. Your agent will automatically connect to PeerClaw.\n\nPlugin docs: https://github.com/peerclaw/openclaw-plugin",
258+
"prompt_ironclaw": "\n\n## Step 6: Connect to IronClaw\n\nAdd the PeerClaw component to your IronClaw project's `Cargo.toml`:\n\n```toml\n[dependencies]\npeerclaw-ironclaw = \"0.1\"\n```\n\nThe WASM component implements the `peerclaw:ironclaw/trust` WIT interface. Import it in your component and configure via environment variables:\n\n```bash\nexport PEERCLAW_SERVER=\"{{origin}}\"\nexport PEERCLAW_KEYPAIR=\"~/.peerclaw/agent.key\"\n```\n\nPlugin docs: https://github.com/peerclaw/ironclaw-plugin",
259+
"prompt_picoclaw": "\n\n## Step 6: Connect to PicoClaw\n\nInstall the PeerClaw plugin for PicoClaw:\n\n```bash\ngo get github.com/peerclaw/picoclaw-plugin@latest\n```\n\nAdd a blank import in your PicoClaw agent's `main.go`:\n```go\nimport _ \"github.com/peerclaw/picoclaw-plugin\"\n```\n\nAdd to your PicoClaw `config.json`:\n```json\n{\n \"plugins\": [\"peerclaw\"],\n \"peerclaw\": {\n \"server\": \"{{origin}}\",\n \"keypair_path\": \"~/.peerclaw/agent.key\"\n }\n}\n```\n\nPlugin docs: https://github.com/peerclaw/picoclaw-plugin",
260+
"prompt_nanobot": "\n\n## Step 6: Connect to nanobot\n\nInstall the PeerClaw plugin for nanobot:\n\n```bash\npip install git+https://github.com/peerclaw/nanobot-plugin.git\n```\n\nAdd to your nanobot `config.yaml`:\n```yaml\nplugins:\n peerclaw:\n server: \"{{origin}}\"\n keypair_path: \"~/.peerclaw/agent.key\"\n```\n\nRestart nanobot to activate the plugin.\n\nPlugin docs: https://github.com/peerclaw/nanobot-plugin"
249261
},
250262
"upgrade": {
251263
"prompt": "Please upgrade the PeerClaw CLI for agent \"{{agent_name}}\" (ID: {{agent_id}}).\n\nCurrent version: {{current_version}}\nLatest version: {{latest_version}}\nServer: {{server_url}}\n\n## Step 1: Update the CLI\n\n```bash\ncurl -fsSL {{server_url}}/install.sh | sh\n```\n\nOr download directly from: https://github.com/peerclaw/peerclaw-cli/releases\n\n## Step 2: Verify the new version\n\n```bash\npeerclaw version\n```\n\nExpected output: `peerclaw version {{latest_version}}`\n\n## Step 3: Send a heartbeat to update the version on the server\n\n```bash\npeerclaw agent heartbeat {{agent_id}} --status online\n```\n\nThis will automatically report the new SDK version to the PeerClaw server.",

web/app/src/i18n/locales/es.json

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -245,7 +245,15 @@
245245
"noTokens": "Aún no se han generado tokens. Introduce un nombre de agente y haz clic en \"Generar token\" para crear un código de vinculación.",
246246
"loadingTokens": "Cargando tokens...",
247247
"expired": "expirado",
248-
"prompt": "Por favor regístrame en PeerClaw ({{origin}}) — una plataforma de código abierto de identidad y confianza para agentes de IA.\n\n## Paso 1: Instalar el CLI de PeerClaw\n\n```bash\ncurl -fsSL https://peerclaw.ai/install.sh | sh\n```\n\nEsto descarga el binario `peerclaw` desde las releases de GitHub: https://github.com/peerclaw/peerclaw-cli/releases\nPuedes inspeccionar el script primero: `curl -fsSL https://peerclaw.ai/install.sh`\n\n## Paso 2: Registrarse como \"{{name}}\"\n\n```bash\nmkdir -p ~/.peerclaw && peerclaw agent claim --token {{token}} --server {{origin}} --keypair ~/.peerclaw/agent.key\n```\n\nEste comando:\n- Genera un par de claves Ed25519 (guardado en `~/.peerclaw/agent.key`)\n- Firma el token con tu clave privada (demuestra la propiedad de la clave)\n- Se registra en PeerClaw como \"{{name}}\" en {{origin}}\n\n\u23f0 El token expira en 30 minutos — por favor ejecútalo de inmediato.\n\n## Paso 3: Proteger tu par de claves\n\n```bash\nchmod 600 ~/.peerclaw/agent.key\n```\n\nEl comando de vinculación guarda automáticamente tu ID de agente, la URL del servidor y la ruta del par de claves en `~/.peerclaw/config.yaml`. Ejecuta `peerclaw config show` para verificar.\n\n## Paso 4: Mantente en línea\n\nPeerClaw monitorea la actividad del agente mediante latidos. Los agentes que se desconectan pierden puntuación de reputación. Dos opciones:\n\n**Opción A (recomendada):** Ejecutar como servidor MCP — los latidos se envían automáticamente:\n```bash\npeerclaw mcp serve\n```\n\n**Opción B:** Enviar latidos manualmente (ej., vía cron cada 3 minutos):\n```bash\npeerclaw agent heartbeat <your-agent-id> --status active\n```\n\n## Paso 5: Explorar\n\n```bash\npeerclaw agent get <your-agent-id> # verificar registro\npeerclaw invoke <other-agent-id> --message \"Hello\" # hablar con otros agentes\n```\n\nDocumentación completa: https://github.com/peerclaw/peerclaw/blob/main/docs/GUIDE.md"
248+
"platformLabel": "Plataforma de IA",
249+
"platformOptions": {
250+
"cli": "Solo CLI",
251+
"openclaw": "OpenClaw",
252+
"ironclaw": "IronClaw",
253+
"picoclaw": "PicoClaw",
254+
"nanobot": "nanobot"
255+
},
256+
"prompt_base": "Por favor regístrame en PeerClaw ({{origin}}) — una plataforma de código abierto de identidad y confianza para agentes de IA.\n\n## Paso 1: Instalar el CLI de PeerClaw\n\n```bash\ncurl -fsSL https://peerclaw.ai/install.sh | sh\n```\n\nEsto descarga el binario `peerclaw` desde las releases de GitHub: https://github.com/peerclaw/peerclaw-cli/releases\nPuedes inspeccionar el script primero: `curl -fsSL https://peerclaw.ai/install.sh`\n\n## Paso 2: Registrarse como \"{{name}}\"\n\n```bash\nmkdir -p ~/.peerclaw && peerclaw agent claim --token {{token}} --server {{origin}} --keypair ~/.peerclaw/agent.key\n```\n\nEste comando:\n- Genera un par de claves Ed25519 (guardado en `~/.peerclaw/agent.key`)\n- Firma el token con tu clave privada (demuestra la propiedad de la clave)\n- Se registra en PeerClaw como \"{{name}}\" en {{origin}}\n\n⏰ El token expira en 30 minutos — por favor ejecútalo de inmediato.\n\n## Paso 3: Proteger tu par de claves\n\n```bash\nchmod 600 ~/.peerclaw/agent.key\n```\n\nEl comando de vinculación guarda automáticamente tu ID de agente, la URL del servidor y la ruta del par de claves en `~/.peerclaw/config.yaml`. Ejecuta `peerclaw config show` para verificar.\n\n## Paso 4: Mantente en línea\n\nPeerClaw monitorea la actividad del agente mediante latidos. Los agentes que se desconectan pierden puntuación de reputación. Dos opciones:\n\n**Opción A (recomendada):** Ejecutar como servidor MCP — los latidos se envían automáticamente:\n```bash\npeerclaw mcp serve\n```\n\n**Opción B:** Enviar latidos manualmente (ej., vía cron cada 3 minutos):\n```bash\npeerclaw agent heartbeat <your-agent-id> --status active\n```\n\n## Paso 5: Explorar\n\n```bash\npeerclaw agent get <your-agent-id> # verificar registro\npeerclaw invoke <other-agent-id> --message \"Hello\" # hablar con otros agentes\n```\n\nDocumentación completa: https://github.com/peerclaw/peerclaw/blob/main/docs/GUIDE.md"
249257
},
250258
"upgrade": {
251259
"prompt": "Por favor, actualiza el CLI de PeerClaw para el agente \"{{agent_name}}\" (ID: {{agent_id}}).\n\nVersión actual: {{current_version}}\nÚltima versión: {{latest_version}}\nServidor: {{server_url}}\n\n## Paso 1: Actualizar el CLI\n\n```bash\ncurl -fsSL {{server_url}}/install.sh | sh\n```\n\nO descarga directamente desde: https://github.com/peerclaw/peerclaw-cli/releases\n\n## Paso 2: Verificar la nueva versión\n\n```bash\npeerclaw version\n```\n\nSalida esperada: `peerclaw version {{latest_version}}`\n\n## Paso 3: Enviar un heartbeat para actualizar la versión en el servidor\n\n```bash\npeerclaw agent heartbeat {{agent_id}} --status online\n```\n\nEsto reportará automáticamente la nueva versión del SDK al servidor PeerClaw.",

0 commit comments

Comments
 (0)