{"version":3,"file":"webhooks-command.mjs","names":[],"sources":["../../../src/commands/webhooks-command.ts"],"sourcesContent":["/**\n * Webhooks command — manage inbound webhook routes.\n *\n * /webhooks              — List all webhook routes and server status\n * /webhooks info <name>  — Show details for a route\n * /webhooks enable <name>  — Enable a route\n * /webhooks disable <name> — Disable a route\n * /webhooks delete <name>  — Delete a route\n */\n\nimport { getWebhookRoutes, type WebhookRoute } from '../services/webhook-routes.js';\nimport { getWebhookServer } from '../services/webhook-server.js';\n\nfunction formatRouteSummary(route: WebhookRoute): string {\n  const status = route.enabled ? 'enabled' : 'disabled';\n  const secured = route.secret ? 'HMAC' : 'open';\n  return `  **${route.name}** (${status}, ${secured}) — ${route.source}\\n    Path: \\`${route.path}\\` | Hits: ${route.hitCount}${route.triggerPlan ? ` | Trigger: ${route.triggerPlan}` : ''}`;\n}\n\nexport const webhooksCommand = {\n  name: 'webhooks',\n  description: 'Manage inbound webhook routes: list, info, enable, disable, delete',\n  acceptsArgs: true,\n  requireAuth: true,\n  handler: async (ctx?: any) => {\n    const rawArgs = (ctx?.args ?? '').trim();\n    const parts = rawArgs.split(/\\s+/);\n    const subcommand = parts[0] || 'list';\n    const arg = parts.slice(1).join(' ');\n\n    const routes = getWebhookRoutes();\n\n    switch (subcommand) {\n      case 'list': {\n        const server = getWebhookServer();\n        const config = server.getConfig();\n        const allRoutes = routes.list();\n\n        const sections: string[] = [];\n\n        // Server status\n        if (server.isRunning()) {\n          sections.push(`**Webhook Server:** Running on ${config.host}:${config.port}`);\n        } else if (config.port > 0) {\n          sections.push(`**Webhook Server:** Configured (port ${config.port}) but not started`);\n        } else {\n          sections.push(\n            '**Webhook Server:** Not configured\\n' +\n            'Set `OPENCLAWNCH_WEBHOOK_PORT` to enable. Default host: `127.0.0.1` (set `OPENCLAWNCH_WEBHOOK_HOST=0.0.0.0` for external).'\n          );\n        }\n\n        if (allRoutes.length === 0) {\n          sections.push('\\n**Routes:** None defined');\n          sections.push('\\nCreate webhook routes via the agent: \"Create a webhook for GitHub push events\"');\n        } else {\n          const enabled = allRoutes.filter(r => r.enabled);\n          const disabled = allRoutes.filter(r => !r.enabled);\n\n          sections.push(`\\n**Routes** (${allRoutes.length} total, ${enabled.length} enabled)`);\n          if (enabled.length > 0) {\n            sections.push(`\\n**Active:**\\n${enabled.map(formatRouteSummary).join('\\n')}`);\n          }\n          if (disabled.length > 0) {\n            sections.push(`\\n**Disabled:**\\n${disabled.map(formatRouteSummary).join('\\n')}`);\n          }\n        }\n\n        sections.push('\\nUse `/webhooks info <name>` for details.');\n        return { text: sections.join('\\n') };\n      }\n\n      case 'info': {\n        if (!arg) return { text: 'Usage: `/webhooks info <route_name>`' };\n        const route = routes.getByName(arg);\n        if (!route) return { text: `No webhook route named \"${arg}\" found.` };\n\n        const server = getWebhookServer();\n        const config = server.getConfig();\n        const baseUrl = server.isRunning()\n          ? `http://${config.host}:${config.port}`\n          : `http://localhost:${config.port || '???'}`;\n\n        const lines = [\n          `**${route.name}** — ${route.source}`,\n          `  Status: ${route.enabled ? 'enabled' : 'disabled'}`,\n          `  Path: \\`${route.path}\\``,\n          `  Full URL: \\`${baseUrl}/webhook${route.path}\\``,\n          `  Security: ${route.secret ? 'HMAC-SHA256 verified' : 'No signature verification (not recommended)'}`,\n          `  Trigger plan: ${route.triggerPlan || 'none (event bus only)'}`,\n          `  Hits: ${route.hitCount}`,\n          `  Created by: ${route.createdBy}`,\n          `  Created: ${new Date(route.createdAt).toLocaleDateString()}`,\n        ];\n        return { text: lines.join('\\n') };\n      }\n\n      case 'enable': {\n        if (!arg) return { text: 'Usage: `/webhooks enable <route_name>`' };\n        const route = routes.getByName(arg);\n        if (!route) return { text: `No webhook route named \"${arg}\" found.` };\n        if (route.enabled) return { text: `Route \"${arg}\" is already enabled.` };\n        routes.update(route.id, { enabled: true });\n        return { text: `Webhook route \"${arg}\" has been enabled.` };\n      }\n\n      case 'disable': {\n        if (!arg) return { text: 'Usage: `/webhooks disable <route_name>`' };\n        const route = routes.getByName(arg);\n        if (!route) return { text: `No webhook route named \"${arg}\" found.` };\n        if (!route.enabled) return { text: `Route \"${arg}\" is already disabled.` };\n        routes.update(route.id, { enabled: false });\n        return { text: `Webhook route \"${arg}\" has been disabled.` };\n      }\n\n      case 'delete': {\n        if (!arg) return { text: 'Usage: `/webhooks delete <route_name>`' };\n        const route = routes.getByName(arg);\n        if (!route) return { text: `No webhook route named \"${arg}\" found.` };\n        routes.delete(route.id);\n        return { text: `Webhook route \"${arg}\" has been permanently deleted.` };\n      }\n\n      default:\n        return {\n          text: `Unknown subcommand: \"${subcommand}\".\\n\\nAvailable: \\`list\\`, \\`info <name>\\`, \\`enable <name>\\`, \\`disable <name>\\`, \\`delete <name>\\``,\n        };\n    }\n  },\n};\n"],"mappings":"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"}