@workspace-platform/ui 0.5.0 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../src/admin/WorkspaceTypesPage.tsx","../src/admin/WorkspaceAgentsPage.tsx","../src/admin/constants.ts","../src/admin/WorkspaceWebhooksPage.tsx"],"sourcesContent":["'use client';\n\nimport { useCallback, useEffect, useState } from 'react';\nimport {\n Plus,\n Pencil,\n Trash2,\n Tag,\n Loader2,\n Clock,\n User,\n X,\n ArrowLeft,\n Lock,\n Unlock,\n} from 'lucide-react';\nimport { format } from 'date-fns';\nimport { fr } from 'date-fns/locale';\nimport { useWorkspaceApi } from '../hooks/useWorkspaceApi';\nimport type { WorkspaceType, EntityWithSecret } from '../types';\nimport { ConfirmModal } from '../components/ui/ConfirmModal';\n\nexport interface WorkspaceTypesPageProps {\n /** Called when the user clicks the back arrow. If omitted, the back button is hidden. */\n onBack?: () => void;\n}\n\nexport function WorkspaceTypesPage({ onBack }: WorkspaceTypesPageProps) {\n const { workspaceTypeApi } = useWorkspaceApi();\n const [types, setTypes] = useState<WorkspaceType[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n\n // Create / Edit form\n const [showForm, setShowForm] = useState(false);\n const [editTarget, setEditTarget] = useState<WorkspaceType | null>(null);\n const [formName, setFormName] = useState('');\n const [formEntities, setFormEntities] = useState<\n { key: string; value: string; isSecret: boolean }[]\n >([]);\n const [saving, setSaving] = useState(false);\n const [selectedId, setSelectedId] = useState<string | null>(null);\n const [deleteId, setDeleteId] = useState<string | null>(null);\n\n const load = useCallback(async () => {\n try {\n setLoading(true);\n setTypes(await workspaceTypeApi.list());\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [workspaceTypeApi]);\n\n useEffect(() => {\n load();\n }, [load]);\n\n const toFormEntities = (\n t: WorkspaceType,\n ): { key: string; value: string; isSecret: boolean }[] => {\n if (t.entitiesWithSecrets && t.entitiesWithSecrets.length > 0) {\n return t.entitiesWithSecrets.map((e) => ({\n key: e.key,\n value: e.value,\n isSecret: e.isSecret,\n }));\n }\n return [];\n };\n\n const openCreate = () => {\n setEditTarget(null);\n setFormName('');\n setFormEntities([]);\n setShowForm(true);\n };\n\n const openEdit = (t: WorkspaceType) => {\n setEditTarget(t);\n setFormName(t.name);\n setFormEntities(toFormEntities(t));\n setShowForm(true);\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!formName.trim()) return;\n try {\n setSaving(true);\n\n const entitiesWithSecrets: EntityWithSecret[] = formEntities\n .filter((ent) => ent.key.trim())\n .map((ent) => ({\n key: ent.key.trim(),\n value: ent.value,\n isSecret: ent.isSecret,\n }));\n\n if (editTarget) {\n await workspaceTypeApi.update(editTarget._id, {\n name: formName.trim(),\n entitiesWithSecrets,\n });\n } else {\n await workspaceTypeApi.create({\n name: formName.trim(),\n entitiesWithSecrets:\n entitiesWithSecrets.length > 0 ? entitiesWithSecrets : undefined,\n });\n }\n setShowForm(false);\n load();\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setSaving(false);\n }\n };\n\n const confirmDelete = (id: string) => setDeleteId(id);\n\n const executeDelete = async () => {\n if (!deleteId) return;\n try {\n await workspaceTypeApi.delete(deleteId);\n load();\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const getDisplayEntities = (\n t: WorkspaceType,\n ): { key: string; value: string; isSecret: boolean }[] => {\n return t.entitiesWithSecrets ?? [];\n };\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Header */}\n <div className=\"bg-surface border-border flex shrink-0 items-center gap-4 border-b px-6 py-4\">\n {onBack && (\n <button\n type=\"button\"\n onClick={() => onBack()}\n className=\"text-text-muted hover:text-text hover:bg-bg rounded-lg p-1.5 transition\"\n >\n <ArrowLeft size={20} />\n </button>\n )}\n <div className=\"bg-primary-light text-primary flex h-10 w-10 shrink-0 items-center justify-center rounded-lg\">\n <Tag size={24} />\n </div>\n <div className=\"flex-1\">\n <h1 className=\"text-text text-xl font-semibold\">\n Types de Workspace\n </h1>\n <p className=\"text-text-secondary text-sm\">\n Gérez les catégories d&apos;espaces de travail\n </p>\n </div>\n <button\n type=\"button\"\n onClick={openCreate}\n className=\"bg-primary hover:bg-primary-hover flex items-center gap-2 rounded-xl px-4 py-2.5 text-sm font-medium text-white transition\"\n >\n <Plus size={16} /> Nouveau type\n </button>\n </div>\n\n {error && (\n <div className=\"border-danger/30 bg-danger-light text-danger mx-6 mt-3 rounded-xl border px-4 py-3 text-sm\">\n {error}\n <button type=\"button\" onClick={() => setError('')} className=\"ml-2 underline\">\n ×\n </button>\n </div>\n )}\n\n <ConfirmModal\n open={!!deleteId}\n onClose={() => setDeleteId(null)}\n onConfirm={executeDelete}\n title=\"Supprimer ce type\"\n description=\"Voulez-vous vraiment supprimer ce type de workspace ?\"\n danger\n />\n\n {/* Modal Form */}\n {showForm && (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-black/40 p-4 backdrop-blur-sm\">\n <div className=\"bg-surface border-border w-full max-w-xl overflow-x-hidden overflow-y-auto rounded-2xl border p-6 shadow-2xl\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-text text-lg font-semibold\">\n {editTarget ? 'Modifier le type' : 'Créer un type'}\n </h2>\n <button\n type=\"button\"\n onClick={() => setShowForm(false)}\n className=\"text-text-muted hover:text-text transition\"\n >\n <X size={20} />\n </button>\n </div>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div>\n <label className=\"text-text-secondary mb-1.5 block text-sm\">\n Nom\n </label>\n <input\n value={formName}\n onChange={(e) => setFormName(e.target.value)}\n placeholder=\"ex: incident, projet, client...\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n autoFocus\n />\n </div>\n\n {/* Entities key-value editor with isSecret toggle */}\n <div>\n <label className=\"text-text-secondary mb-1.5 block text-sm\">\n Entités\n </label>\n <div className=\"space-y-2\">\n {formEntities.map((ent, idx) => (\n <div key={idx} className=\"flex items-center gap-2\">\n <input\n value={ent.key}\n onChange={(e) => {\n const updated = [...formEntities];\n updated[idx].key = e.target.value;\n setFormEntities(updated);\n }}\n placeholder=\"Clé\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary flex-[1] rounded-xl border px-3 py-2 text-sm focus:ring-2 focus:outline-none\"\n />\n <input\n value={ent.value}\n onChange={(e) => {\n const updated = [...formEntities];\n updated[idx].value = e.target.value;\n setFormEntities(updated);\n }}\n placeholder=\"Ex: noemie-service\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary flex-[2] rounded-xl border px-3 py-2 text-sm focus:ring-2 focus:outline-none\"\n />\n <button\n type=\"button\"\n onClick={() => {\n const updated = [...formEntities];\n updated[idx].isSecret = !updated[idx].isSecret;\n setFormEntities(updated);\n }}\n className={`rounded-lg p-2 transition ${\n ent.isSecret\n ? 'bg-warning/15 text-warning'\n : 'text-text-muted hover:text-text hover:bg-bg'\n }`}\n title={\n ent.isSecret\n ? 'Secret (cliquer pour rendre public)'\n : 'Public (cliquer pour rendre secret)'\n }\n >\n {ent.isSecret ? (\n <Lock size={16} />\n ) : (\n <Unlock size={16} />\n )}\n </button>\n <button\n type=\"button\"\n onClick={() =>\n setFormEntities((prev) =>\n prev.filter((_, i) => i !== idx),\n )\n }\n className=\"text-text-muted hover:text-danger p-2 transition\"\n >\n <Trash2 size={16} />\n </button>\n </div>\n ))}\n <button\n type=\"button\"\n onClick={() =>\n setFormEntities((prev) => [\n ...prev,\n { key: '', value: '', isSecret: false },\n ])\n }\n className=\"text-primary hover:text-primary-hover flex items-center gap-1 text-sm transition\"\n >\n <Plus size={14} /> Ajouter une entité\n </button>\n </div>\n </div>\n\n <div className=\"flex gap-3 pt-1\">\n <button\n type=\"submit\"\n disabled={saving}\n className=\"bg-primary hover:bg-primary-hover flex flex-1 items-center justify-center gap-2 rounded-xl py-2.5 text-sm font-medium text-white transition disabled:opacity-50\"\n >\n {saving && <Loader2 size={16} className=\"animate-spin\" />}\n {editTarget ? 'Enregistrer' : 'Créer'}\n </button>\n <button\n type=\"button\"\n onClick={() => setShowForm(false)}\n className=\"bg-bg text-text hover:bg-border-light flex-1 rounded-xl py-2.5 text-sm font-medium transition\"\n >\n Annuler\n </button>\n </div>\n </form>\n </div>\n </div>\n )}\n\n {/* Content */}\n <div className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-3xl\">\n {loading ? (\n <div className=\"flex items-center justify-center py-20\">\n <Loader2 size={32} className=\"text-primary animate-spin\" />\n </div>\n ) : types.length === 0 ? (\n <div className=\"text-text-muted py-20 text-center\">\n <Tag size={40} className=\"mx-auto mb-3 opacity-30\" />\n <p>Aucun type de workspace créé.</p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {types.map((t) => {\n const displayEntities = getDisplayEntities(t);\n return (\n <div\n key={t._id}\n className=\"bg-surface border-border group overflow-hidden rounded-xl border transition hover:shadow-md\"\n >\n <div\n className=\"flex cursor-pointer items-center justify-between px-5 py-4\"\n onClick={() =>\n setSelectedId(selectedId === t._id ? null : t._id)\n }\n >\n <div className=\"flex items-center gap-3\">\n <span className=\"bg-primary h-2 w-2 rounded-full\" />\n <span className=\"text-text font-medium\">{t.name}</span>\n {displayEntities.length > 0 && (\n <span className=\"text-text-muted text-xs\">\n {displayEntities.length} entité\n {displayEntities.length !== 1 ? 's' : ''}\n </span>\n )}\n </div>\n <div className=\"flex gap-2 opacity-0 transition group-hover:opacity-100\">\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n openEdit(t);\n }}\n className=\"text-text-muted hover:text-primary hover:bg-primary-light rounded-lg p-2 transition\"\n title=\"Modifier\"\n >\n <Pencil size={16} />\n </button>\n <button\n type=\"button\"\n onClick={(e) => {\n e.stopPropagation();\n confirmDelete(t._id);\n }}\n className=\"text-text-muted hover:text-danger hover:bg-danger-light rounded-lg p-2 transition\"\n title=\"Supprimer\"\n >\n <Trash2 size={16} />\n </button>\n </div>\n </div>\n {selectedId === t._id && (\n <div className=\"border-border-light space-y-2 border-t px-5 pt-0 pb-4\">\n {/* Entities */}\n {displayEntities.length > 0 && (\n <div className=\"pt-2\">\n <p className=\"text-text-muted mb-1.5 text-xs\">\n Entités\n </p>\n <div className=\"flex flex-wrap gap-1.5\">\n {displayEntities.map((ent) => (\n <span\n key={ent.key}\n className=\"bg-bg text-text-secondary inline-flex items-center gap-1.5 rounded-lg px-2 py-1 text-xs\"\n >\n {ent.isSecret && (\n <Lock\n size={10}\n className=\"text-warning shrink-0\"\n />\n )}\n <span className=\"text-text font-medium\">\n {ent.key}:\n </span>\n <span>\n {ent.isSecret ? '••••••' : ent.value}\n </span>\n </span>\n ))}\n </div>\n </div>\n )}\n <div className=\"text-text-muted flex items-center gap-2 pt-1 text-xs\">\n <Clock size={12} />\n <span>\n Créé le{' '}\n {format(\n new Date(t.createdAt),\n 'dd MMM yyyy à HH:mm',\n { locale: fr },\n )}\n </span>\n </div>\n {t.createdBy && (\n <div className=\"text-text-muted flex items-center gap-2 text-xs\">\n <User size={12} />\n <span>Créé par {t.createdBy}</span>\n </div>\n )}\n </div>\n )}\n </div>\n );\n })}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","'use client';\n\nimport { useEffect, useState, useCallback, useId } from 'react';\nimport {\n Plus,\n Pencil,\n Trash2,\n Loader2,\n X,\n Bot,\n Check,\n Search,\n ArrowLeft,\n Webhook,\n AlertTriangle,\n CircleCheck,\n CircleX,\n ExternalLink,\n} from 'lucide-react';\nimport { formatDistanceToNow } from 'date-fns';\nimport { fr } from 'date-fns/locale';\nimport { useWorkspaceApi } from '../hooks/useWorkspaceApi';\nimport type {\n WorkspaceAgent,\n WebhookSubscription,\n AgentDeleteInfo,\n} from '../types';\nimport { ConfirmModal } from '../components/ui/ConfirmModal';\nimport { Modal } from '../components/ui/Modal';\nimport { AVAILABLE_WEBHOOK_EVENTS } from './constants';\n\n// ─── Webhook Dialog Component ─────────────────────────────────────────────────\n\ninterface WebhookDialogProps {\n agent: WorkspaceAgent;\n open: boolean;\n onClose: () => void;\n}\n\nfunction WebhookDialog({ agent, open, onClose }: WebhookDialogProps) {\n const { webhookApi } = useWorkspaceApi();\n const webhookDialogTitleId = useId();\n const [webhooks, setWebhooks] = useState<WebhookSubscription[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [showForm, setShowForm] = useState(false);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [saving, setSaving] = useState(false);\n const [deleteId, setDeleteId] = useState<string | null>(null);\n const [form, setForm] = useState({\n name: '',\n targetUrl: '',\n secretKey: 'x-api-key',\n secretValue: '',\n eventTypes: ['*'] as string[],\n active: true,\n });\n\n const loadWebhooks = useCallback(async () => {\n try {\n setLoading(true);\n const data = await webhookApi.list({ agentId: agent.agentId });\n setWebhooks(data);\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [agent.agentId, webhookApi]);\n\n useEffect(() => {\n if (open) loadWebhooks();\n }, [open, loadWebhooks]);\n\n const resetForm = () => {\n setForm({\n name: '',\n targetUrl: '',\n secretKey: 'x-api-key',\n secretValue: '',\n eventTypes: ['*'],\n active: true,\n });\n setEditingId(null);\n setShowForm(false);\n };\n\n const openCreateForm = () => {\n resetForm();\n setShowForm(true);\n };\n\n const openEditForm = (sub: WebhookSubscription) => {\n setForm({\n name: sub.name,\n targetUrl: sub.targetUrl,\n secretKey: sub.secretKey,\n secretValue: '',\n eventTypes: [...sub.eventTypes],\n active: sub.active,\n });\n setEditingId(sub._id);\n setShowForm(true);\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!form.name.trim() || !form.targetUrl.trim()) return;\n try {\n setSaving(true);\n if (editingId) {\n await webhookApi.update(editingId, {\n name: form.name,\n targetUrl: form.targetUrl,\n secretKey: form.secretKey,\n eventTypes: form.eventTypes,\n active: form.active,\n isAgent: true,\n agentId: agent.agentId,\n ...(form.secretValue.trim()\n ? { secretValue: form.secretValue }\n : {}),\n });\n } else {\n await webhookApi.create({\n name: form.name,\n targetUrl: form.targetUrl,\n secretKey: form.secretKey,\n secretValue: form.secretValue,\n eventTypes: form.eventTypes,\n active: form.active,\n isAgent: true,\n agentId: agent.agentId,\n });\n }\n resetForm();\n await loadWebhooks();\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setSaving(false);\n }\n };\n\n const toggleActive = async (sub: WebhookSubscription) => {\n try {\n await webhookApi.update(sub._id, { active: !sub.active });\n setWebhooks((prev) =>\n prev.map((s) => (s._id === sub._id ? { ...s, active: !s.active } : s)),\n );\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const executeDelete = async () => {\n if (!deleteId) return;\n try {\n await webhookApi.delete(deleteId);\n setWebhooks((prev) => prev.filter((s) => s._id !== deleteId));\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const toggleEvent = (event: string) => {\n setForm((prev) => {\n if (event === '*') {\n return { ...prev, eventTypes: ['*'] };\n }\n const without = prev.eventTypes.filter((e) => e !== '*' && e !== event);\n if (prev.eventTypes.includes(event)) {\n return { ...prev, eventTypes: without.length ? without : ['*'] };\n }\n return { ...prev, eventTypes: [...without, event] };\n });\n };\n\n return (\n <Modal\n open={open}\n onClose={onClose}\n zIndexClass=\"z-[100]\"\n backdropClassName=\"bg-black/40 backdrop-blur-sm\"\n size=\"2xl\"\n panelClassName=\"border-border bg-surface flex max-h-[85vh] w-full flex-col overflow-hidden rounded-2xl border shadow-xl\"\n className=\"p-4\"\n closeOnBackdropClick\n closeOnEscape={!saving}\n headingId={webhookDialogTitleId}\n ariaLabelledBy={webhookDialogTitleId}\n title={`Webhooks — ${agent.agentName}`}\n description={\n <p className=\"text-text-muted mt-1 font-mono text-xs\">\n {agent.agentId}\n </p>\n }\n titleClassName=\"text-base font-semibold\"\n titleIcon={\n <div className=\"bg-primary-light text-primary flex h-9 w-9 shrink-0 items-center justify-center rounded-lg\">\n <Webhook size={18} />\n </div>\n }\n headerTrailing={\n <div className=\"flex shrink-0 items-center gap-2\">\n <button\n type=\"button\"\n onClick={openCreateForm}\n className=\"bg-primary hover:bg-primary-hover flex items-center gap-1.5 rounded-xl px-3 py-2 text-xs font-medium text-white transition\"\n >\n <Plus size={14} /> Nouveau\n </button>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"text-text-muted hover:text-text transition\"\n aria-label=\"Fermer\"\n >\n <X size={20} />\n </button>\n </div>\n }\n headerClassName=\"items-center\"\n >\n {/* Dialog Body */}\n <div className=\"min-h-0 flex-1 overflow-y-auto p-6\">\n {error && (\n <div className=\"border-danger/30 bg-danger-light text-danger mb-4 rounded-xl border px-4 py-3 text-sm\">\n {error}\n <button type=\"button\" onClick={() => setError('')} className=\"ml-2 underline\">\n ×\n </button>\n </div>\n )}\n\n <ConfirmModal\n open={!!deleteId}\n onClose={() => setDeleteId(null)}\n onConfirm={executeDelete}\n title=\"Supprimer ce webhook\"\n description=\"Voulez-vous vraiment supprimer ce webhook ?\"\n danger\n />\n\n {/* Inline Form */}\n {showForm && (\n <div className=\"bg-bg border-border mb-4 rounded-xl border p-5\">\n <div className=\"mb-3 flex items-center justify-between\">\n <h3 className=\"text-text text-sm font-semibold\">\n {editingId ? 'Modifier le webhook' : 'Nouveau webhook'}\n </h3>\n <button\n type=\"button\"\n onClick={resetForm}\n className=\"text-text-muted hover:text-text transition\"\n >\n <X size={16} />\n </button>\n </div>\n <form onSubmit={handleSubmit} className=\"space-y-3\">\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Nom\n </label>\n <input\n value={form.name}\n onChange={(e) =>\n setForm({ ...form, name: e.target.value })\n }\n required\n placeholder=\"Mon webhook agent\"\n className=\"bg-surface border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-3 py-2 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n URL cible\n </label>\n <input\n value={form.targetUrl}\n onChange={(e) =>\n setForm({ ...form, targetUrl: e.target.value })\n }\n required\n placeholder=\"https://api.example.com/webhooks\"\n className=\"bg-surface border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-3 py-2 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Clé du header\n </label>\n <input\n value={form.secretKey}\n onChange={(e) =>\n setForm({ ...form, secretKey: e.target.value })\n }\n required\n placeholder=\"x-api-key\"\n className=\"bg-surface border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-3 py-2 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Secret{' '}\n {editingId && (\n <span className=\"text-text-muted\">\n (vide = inchangé)\n </span>\n )}\n </label>\n <input\n value={form.secretValue}\n onChange={(e) =>\n setForm({ ...form, secretValue: e.target.value })\n }\n required={!editingId}\n type=\"password\"\n placeholder=\"••••••••\"\n className=\"bg-surface border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-3 py-2 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n </div>\n\n {/* Events */}\n <div>\n <label className=\"text-text-secondary mb-1.5 block text-xs\">\n Événements\n </label>\n <div className=\"flex flex-wrap gap-1.5\">\n {AVAILABLE_WEBHOOK_EVENTS.map((evt) => (\n <button\n key={evt}\n type=\"button\"\n onClick={() => toggleEvent(evt)}\n className={`rounded-full px-2.5 py-1 text-xs font-medium transition ${\n form.eventTypes.includes(evt)\n ? 'bg-primary text-white'\n : 'bg-surface border-border text-text-secondary hover:text-text hover:bg-border-light border'\n }`}\n >\n {evt === '*' ? 'Tous (*)' : evt}\n </button>\n ))}\n </div>\n </div>\n\n {/* Active toggle */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => setForm({ ...form, active: !form.active })}\n className={`relative h-5 w-10 rounded-full transition ${\n form.active ? 'bg-primary' : 'bg-border'\n }`}\n >\n <span\n className={`absolute top-0.5 left-0.5 h-4 w-4 rounded-full bg-white shadow transition-transform ${\n form.active ? 'translate-x-5' : ''\n }`}\n />\n </button>\n <span className=\"text-text text-sm\">\n {form.active ? 'Active' : 'Inactive'}\n </span>\n </div>\n\n <div className=\"flex gap-2 pt-1\">\n <button\n type=\"submit\"\n disabled={saving}\n className=\"bg-primary hover:bg-primary-hover flex items-center gap-1.5 rounded-xl px-4 py-2 text-sm font-medium text-white transition disabled:opacity-50\"\n >\n {saving && <Loader2 size={14} className=\"animate-spin\" />}\n {editingId ? 'Enregistrer' : 'Créer'}\n </button>\n <button\n type=\"button\"\n onClick={resetForm}\n className=\"bg-bg text-text hover:bg-border-light rounded-xl px-4 py-2 text-sm font-medium transition\"\n >\n Annuler\n </button>\n </div>\n </form>\n </div>\n )}\n\n {/* Webhook List */}\n {loading ? (\n <div className=\"flex justify-center py-10\">\n <Loader2 size={20} className=\"text-primary animate-spin\" />\n </div>\n ) : webhooks.length === 0 ? (\n <div className=\"text-text-muted py-12 text-center\">\n <Webhook size={32} className=\"mx-auto mb-2 opacity-30\" />\n <p className=\"text-sm\">\n Aucun webhook branché à cet agent.\n </p>\n <p className=\"text-text-muted mt-1 text-xs\">\n Créez un webhook pour que l&apos;agent puisse recevoir les événements.\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {webhooks.map((sub) => (\n <div\n key={sub._id}\n className=\"bg-bg border-border group rounded-xl border px-4 py-3 transition hover:shadow-sm\"\n >\n <div className=\"flex items-start justify-between gap-3\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-1 flex items-center gap-2\">\n <h4 className=\"text-text truncate text-sm font-medium\">\n {sub.name}\n </h4>\n {sub.active ? (\n <span className=\"bg-success-light text-success ring-success/30 inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs ring-1\">\n <CircleCheck size={10} />\n Active\n </span>\n ) : (\n <span className=\"text-text-muted bg-bg border-border inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs\">\n <CircleX size={10} />\n Inactive\n </span>\n )}\n </div>\n <div className=\"text-text-muted mb-1.5 flex items-center gap-1 text-xs\">\n <ExternalLink size={10} className=\"shrink-0\" />\n <span className=\"truncate\">{sub.targetUrl}</span>\n </div>\n <div className=\"flex flex-wrap gap-1\">\n {sub.eventTypes.map((evt) => (\n <span\n key={evt}\n className=\"bg-surface text-text-secondary rounded px-1.5 py-0.5 text-xs\"\n >\n {evt === '*' ? 'Tous' : evt}\n </span>\n ))}\n </div>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => toggleActive(sub)}\n className={`rounded-lg p-1.5 transition ${\n sub.active\n ? 'text-success hover:bg-success-light'\n : 'text-text-muted hover:bg-bg'\n }`}\n title={sub.active ? 'Désactiver' : 'Activer'}\n >\n {sub.active ? (\n <CircleCheck size={14} />\n ) : (\n <CircleX size={14} />\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => openEditForm(sub)}\n className=\"text-text-muted hover:text-primary hover:bg-primary-light rounded-lg p-1.5 transition\"\n title=\"Modifier\"\n >\n <Pencil size={14} />\n </button>\n <button\n type=\"button\"\n onClick={() => setDeleteId(sub._id)}\n className=\"text-text-muted hover:text-danger hover:bg-danger-light rounded-lg p-1.5 opacity-0 transition group-hover:opacity-100\"\n title=\"Supprimer\"\n >\n <Trash2 size={14} />\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </Modal>\n );\n}\n\n// ─── Main Agents Page ─────────────────────────────────────────────────────────\n\nexport interface WorkspaceAgentsPageProps {\n /** Called when the user clicks the back arrow. If omitted, the back button is hidden. */\n onBack?: () => void;\n}\n\nexport function WorkspaceAgentsPage({ onBack }: WorkspaceAgentsPageProps) {\n const { agentApi, webhookApi } = useWorkspaceApi();\n const [agents, setAgents] = useState<WorkspaceAgent[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [search, setSearch] = useState('');\n\n // Form state\n const [showForm, setShowForm] = useState(false);\n const [editingAgent, setEditingAgent] = useState<WorkspaceAgent | null>(null);\n const [saving, setSaving] = useState(false);\n const [form, setForm] = useState({ agentId: '', agentName: '' });\n\n // Webhook fields embedded in the creation form\n const [webhookForm, setWebhookForm] = useState({\n name: '',\n targetUrl: '',\n secretKey: 'x-api-key',\n secretValue: '',\n eventTypes: ['*'] as string[],\n active: true,\n });\n // Tracks whether the user manually edited the webhook name\n const [webhookNameTouched, setWebhookNameTouched] = useState(false);\n\n // Delete state\n const [deleteAgent, setDeleteAgent] = useState<WorkspaceAgent | null>(null);\n const [deleteInfo, setDeleteInfo] = useState<AgentDeleteInfo | null>(null);\n const [loadingDeleteInfo, setLoadingDeleteInfo] = useState(false);\n\n // Webhook dialog\n const [webhookDialogAgent, setWebhookDialogAgent] =\n useState<WorkspaceAgent | null>(null);\n\n const load = useCallback(async () => {\n try {\n setLoading(true);\n const data = await agentApi.list(search.trim() || undefined);\n setAgents(data);\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [search, agentApi]);\n\n useEffect(() => {\n const t = setTimeout(() => load(), 300);\n return () => clearTimeout(t);\n }, [load]);\n\n const resetForm = () => {\n setForm({ agentId: '', agentName: '' });\n setWebhookForm({\n name: '',\n targetUrl: '',\n secretKey: 'x-api-key',\n secretValue: '',\n eventTypes: ['*'],\n active: true,\n });\n setWebhookNameTouched(false);\n setEditingAgent(null);\n setShowForm(false);\n };\n\n const openCreate = () => {\n setForm({ agentId: '', agentName: '' });\n setEditingAgent(null);\n setShowForm(true);\n };\n\n const openEdit = (agent: WorkspaceAgent) => {\n setForm({ agentId: agent.agentId, agentName: agent.agentName });\n setEditingAgent(agent);\n setShowForm(true);\n };\n\n const toggleCreateEvent = (event: string) => {\n setWebhookForm((prev) => {\n if (event === '*') {\n return { ...prev, eventTypes: ['*'] };\n }\n const without = prev.eventTypes.filter((e) => e !== '*' && e !== event);\n if (prev.eventTypes.includes(event)) {\n return { ...prev, eventTypes: without.length ? without : ['*'] };\n }\n return { ...prev, eventTypes: [...without, event] };\n });\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!form.agentName.trim()) return;\n if (!editingAgent && !form.agentId.trim()) return;\n // For creation, webhook fields are required\n if (\n !editingAgent &&\n (!webhookForm.name.trim() ||\n !webhookForm.targetUrl.trim() ||\n !webhookForm.secretValue.trim())\n )\n return;\n try {\n setSaving(true);\n if (editingAgent) {\n await agentApi.update(editingAgent._id, {\n agentName: form.agentName,\n });\n resetForm();\n await load();\n } else {\n // 1. Create the agent\n const created = await agentApi.create({\n agentId: form.agentId.trim(),\n agentName: form.agentName.trim(),\n });\n // 2. Create the webhook linked to the new agent\n await webhookApi.create({\n name: webhookForm.name.trim(),\n targetUrl: webhookForm.targetUrl.trim(),\n secretKey: webhookForm.secretKey.trim(),\n secretValue: webhookForm.secretValue.trim(),\n eventTypes: webhookForm.eventTypes,\n active: webhookForm.active,\n isAgent: true,\n agentId: created.agentId,\n });\n resetForm();\n await load();\n }\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setSaving(false);\n }\n };\n\n const requestDelete = async (agent: WorkspaceAgent) => {\n setDeleteAgent(agent);\n setDeleteInfo(null);\n setLoadingDeleteInfo(true);\n try {\n const info = await agentApi.getDeleteInfo(agent._id);\n setDeleteInfo(info);\n } catch {\n setDeleteInfo({ webhookCount: 0, memberCount: 0 });\n } finally {\n setLoadingDeleteInfo(false);\n }\n };\n\n const handleDelete = async () => {\n if (!deleteAgent) return;\n try {\n await agentApi.delete(deleteAgent._id);\n setAgents((prev) => prev.filter((a) => a._id !== deleteAgent._id));\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const buildDeleteDescription = () => {\n if (loadingDeleteInfo) {\n return (\n <span className=\"flex items-center gap-2\">\n <Loader2 size={14} className=\"animate-spin\" />\n Chargement des informations...\n </span>\n );\n }\n if (!deleteInfo) return 'Voulez-vous vraiment supprimer cet agent ?';\n\n const parts: string[] = [];\n if (deleteInfo.webhookCount > 0) {\n parts.push(\n `${deleteInfo.webhookCount} webhook${deleteInfo.webhookCount > 1 ? 's' : ''}`,\n );\n }\n if (deleteInfo.memberCount > 0) {\n parts.push(\n `membre de ${deleteInfo.memberCount} workspace${deleteInfo.memberCount > 1 ? 's' : ''}`,\n );\n }\n\n if (parts.length === 0) {\n return `Voulez-vous vraiment supprimer l'agent \"${deleteAgent?.agentName}\" ?`;\n }\n\n return (\n <>\n Voulez-vous vraiment supprimer l&apos;agent &quot;\n <strong>{deleteAgent?.agentName}</strong>&quot; ? Cela supprimera\n également :{' '}\n <span className=\"text-danger font-medium\">\n {parts.join(' et ')}\n </span>\n .\n </>\n );\n };\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Header */}\n <div className=\"bg-surface border-border flex shrink-0 items-center gap-4 border-b px-6 py-4\">\n {onBack && (\n <button\n type=\"button\"\n onClick={() => onBack()}\n className=\"text-text-muted hover:text-text hover:bg-bg rounded-lg p-1.5 transition\"\n >\n <ArrowLeft size={20} />\n </button>\n )}\n <div className=\"bg-primary-light text-primary flex h-10 w-10 shrink-0 items-center justify-center rounded-lg\">\n <Bot size={24} />\n </div>\n <div className=\"flex-1\">\n <h1 className=\"text-text text-xl font-semibold\">Agents Workspace</h1>\n <p className=\"text-text-secondary text-sm\">\n Gérer les agents disponibles pour les workspaces\n </p>\n </div>\n <button\n type=\"button\"\n onClick={openCreate}\n className=\"bg-primary hover:bg-primary-hover flex items-center gap-2 rounded-xl px-4 py-2.5 text-sm font-medium text-white transition\"\n >\n <Plus size={16} /> Nouvel agent\n </button>\n </div>\n\n {error && (\n <div className=\"border-danger/30 bg-danger-light text-danger mx-6 mt-3 rounded-xl border px-4 py-3 text-sm\">\n {error}\n <button type=\"button\" onClick={() => setError('')} className=\"ml-2 underline\">\n ×\n </button>\n </div>\n )}\n\n {/* Delete confirm modal with details */}\n <ConfirmModal\n open={!!deleteAgent}\n onClose={() => setDeleteAgent(null)}\n onConfirm={handleDelete}\n title=\"Supprimer cet agent\"\n description={buildDeleteDescription()}\n danger\n />\n\n {/* Webhook dialog */}\n {webhookDialogAgent && (\n <WebhookDialog\n agent={webhookDialogAgent}\n open={true}\n onClose={() => setWebhookDialogAgent(null)}\n />\n )}\n\n <div className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-3xl\">\n {/* Inline Create / Edit Form */}\n {showForm && (\n <div className=\"bg-surface border-border mb-6 rounded-2xl border p-6 shadow-sm\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-text text-base font-semibold\">\n {editingAgent ? \"Modifier l'agent\" : 'Nouvel agent'}\n </h2>\n <button\n type=\"button\"\n onClick={resetForm}\n className=\"text-text-muted hover:text-text transition\"\n >\n <X size={20} />\n </button>\n </div>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Agent ID{' '}\n {editingAgent && (\n <span className=\"text-text-muted\">\n (non modifiable)\n </span>\n )}\n </label>\n <input\n value={form.agentId}\n onChange={(e) =>\n setForm({ ...form, agentId: e.target.value })\n }\n required={!editingAgent}\n disabled={!!editingAgent}\n placeholder=\"ex: james-agent\"\n pattern=\"^[a-z0-9-]+$\"\n title=\"Uniquement lettres minuscules, chiffres et tirets\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none disabled:cursor-not-allowed disabled:opacity-50\"\n />\n </div>\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Nom d&apos;affichage\n </label>\n <input\n value={form.agentName}\n onChange={(e) => {\n const newName = e.target.value;\n setForm({ ...form, agentName: newName });\n // Auto-sync webhook name when not manually edited\n if (!editingAgent && !webhookNameTouched) {\n setWebhookForm((prev) => ({\n ...prev,\n name: newName.trim()\n ? `Webhook ${newName.trim()}`\n : '',\n }));\n }\n }}\n required\n autoFocus={!!editingAgent}\n placeholder=\"ex: James\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n </div>\n {editingAgent && (\n <p className=\"text-warning text-xs\">\n ⚠ La modification du nom sera propagée à tous les membres de\n workspace ayant cet agent.\n </p>\n )}\n\n {/* ── Webhook section (only for creation) ── */}\n {!editingAgent && (\n <>\n <div className=\"border-border mt-2 border-t pt-4\">\n <div className=\"mb-3 flex items-center gap-2\">\n <div className=\"bg-primary-light text-primary flex h-7 w-7 shrink-0 items-center justify-center rounded-lg\">\n <Webhook size={14} />\n </div>\n <h3 className=\"text-text text-sm font-semibold\">\n Webhook de l&apos;agent\n </h3>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Nom du webhook\n </label>\n <input\n value={webhookForm.name}\n onChange={(e) => {\n setWebhookNameTouched(true);\n setWebhookForm({\n ...webhookForm,\n name: e.target.value,\n });\n }}\n required\n placeholder=\"ex: Webhook James\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n URL cible\n </label>\n <input\n value={webhookForm.targetUrl}\n onChange={(e) =>\n setWebhookForm({\n ...webhookForm,\n targetUrl: e.target.value,\n })\n }\n required\n placeholder=\"https://api.example.com/webhooks\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n </div>\n <div className=\"mt-3 grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Clé du header\n </label>\n <input\n value={webhookForm.secretKey}\n onChange={(e) =>\n setWebhookForm({\n ...webhookForm,\n secretKey: e.target.value,\n })\n }\n required\n placeholder=\"x-api-key\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Secret\n </label>\n <input\n value={webhookForm.secretValue}\n onChange={(e) =>\n setWebhookForm({\n ...webhookForm,\n secretValue: e.target.value,\n })\n }\n required\n type=\"password\"\n placeholder=\"••••••••\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n </div>\n\n {/* Events */}\n <div className=\"mt-3\">\n <label className=\"text-text-secondary mb-1.5 block text-xs\">\n Événements\n </label>\n <div className=\"flex flex-wrap gap-1.5\">\n {AVAILABLE_WEBHOOK_EVENTS.map((evt) => (\n <button\n key={evt}\n type=\"button\"\n onClick={() => toggleCreateEvent(evt)}\n className={`rounded-full px-2.5 py-1 text-xs font-medium transition ${\n webhookForm.eventTypes.includes(evt)\n ? 'bg-primary text-white'\n : 'bg-bg border-border text-text-secondary hover:text-text hover:bg-border-light border'\n }`}\n >\n {evt === '*' ? 'Tous (*)' : evt}\n </button>\n ))}\n </div>\n </div>\n\n {/* Active toggle */}\n <div className=\"mt-3 flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() =>\n setWebhookForm({\n ...webhookForm,\n active: !webhookForm.active,\n })\n }\n className={`relative h-5 w-10 rounded-full transition ${\n webhookForm.active ? 'bg-primary' : 'bg-border'\n }`}\n >\n <span\n className={`absolute top-0.5 left-0.5 h-4 w-4 rounded-full bg-white shadow transition-transform ${\n webhookForm.active ? 'translate-x-5' : ''\n }`}\n />\n </button>\n <span className=\"text-text text-sm\">\n {webhookForm.active\n ? 'Webhook actif'\n : 'Webhook inactif'}\n </span>\n </div>\n </div>\n </>\n )}\n\n <div className=\"flex gap-3 pt-1\">\n <button\n type=\"submit\"\n disabled={saving}\n className=\"bg-primary hover:bg-primary-hover flex items-center gap-2 rounded-xl px-5 py-2 text-sm font-medium text-white transition disabled:opacity-50\"\n >\n {saving ? (\n <Loader2 size={16} className=\"animate-spin\" />\n ) : (\n <Check size={16} />\n )}\n {editingAgent ? 'Enregistrer' : \"Créer l'agent + webhook\"}\n </button>\n <button\n type=\"button\"\n onClick={resetForm}\n className=\"bg-bg text-text hover:bg-border-light rounded-xl px-5 py-2 text-sm font-medium transition\"\n >\n Annuler\n </button>\n </div>\n </form>\n </div>\n )}\n\n {/* Search bar */}\n <div className=\"relative mb-4\">\n <Search\n size={16}\n className=\"text-text-muted absolute top-1/2 left-3 -translate-y-1/2\"\n />\n <input\n value={search}\n onChange={(e) => setSearch(e.target.value)}\n placeholder=\"Rechercher un agent...\"\n className=\"bg-surface border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full max-w-md rounded-xl border py-2 pr-4 pl-10 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n\n {/* List */}\n {loading ? (\n <div className=\"flex justify-center py-10\">\n <Loader2 size={24} className=\"text-primary animate-spin\" />\n </div>\n ) : agents.length === 0 ? (\n <div className=\"text-text-muted py-20 text-center\">\n <Bot size={40} className=\"mx-auto mb-3 opacity-30\" />\n <p className=\"text-sm\">Aucun agent trouvé.</p>\n <p className=\"text-text-muted mt-1 text-xs\">\n Créez un agent pour le rendre disponible dans les workspaces.\n </p>\n </div>\n ) : (\n <div className=\"space-y-2\">\n {agents.map((agent) => (\n <div\n key={agent._id}\n className=\"bg-surface border-border group flex items-center gap-4 rounded-xl border px-5 py-4 transition hover:shadow-md\"\n >\n <div className=\"bg-primary-light text-primary flex h-9 w-9 shrink-0 items-center justify-center rounded-full\">\n <Bot size={16} />\n </div>\n <div className=\"min-w-0 flex-1\">\n <div className=\"flex items-center gap-2\">\n <span className=\"text-text text-sm font-medium\">\n {agent.agentName}\n </span>\n {/* Webhook count badge or warning */}\n {agent.webhookCount > 0 ? (\n <button\n type=\"button\"\n onClick={() => setWebhookDialogAgent(agent)}\n className=\"bg-primary-light text-primary ring-primary/30 hover:bg-primary/15 inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium ring-1 transition\"\n >\n <Webhook size={10} />\n {agent.webhookCount} webhook\n {agent.webhookCount > 1 ? 's' : ''}\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => setWebhookDialogAgent(agent)}\n className=\"bg-warning/10 text-warning ring-warning/30 hover:bg-warning/15 inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs font-medium ring-1 transition\"\n title=\"Aucun webhook branché — cliquez pour en ajouter\"\n >\n <AlertTriangle size={10} />\n Aucun webhook\n </button>\n )}\n </div>\n <div className=\"text-text-muted font-mono text-xs\">\n {agent.agentId}\n </div>\n </div>\n <div className=\"text-text-muted shrink-0 text-xs\">\n {formatDistanceToNow(new Date(agent.createdAt), {\n addSuffix: true,\n locale: fr,\n })}\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => setWebhookDialogAgent(agent)}\n className=\"text-text-muted hover:text-primary hover:bg-primary-light rounded-lg p-2 transition\"\n title=\"Gérer les webhooks\"\n >\n <Webhook size={16} />\n </button>\n <button\n type=\"button\"\n onClick={() => openEdit(agent)}\n className=\"text-text-muted hover:text-primary hover:bg-primary-light rounded-lg p-2 transition\"\n title=\"Modifier\"\n >\n <Pencil size={16} />\n </button>\n <button\n type=\"button\"\n onClick={() => requestDelete(agent)}\n className=\"text-text-muted hover:text-danger hover:bg-danger-light rounded-lg p-2 opacity-0 transition group-hover:opacity-100\"\n title=\"Supprimer\"\n >\n <Trash2 size={16} />\n </button>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n","/** Shared webhook event types for admin pages (types / agents / webhooks). */\nexport const AVAILABLE_WEBHOOK_EVENTS = [\n '*',\n 'workspace.created',\n 'workspace.updated',\n 'workspace.deleted',\n 'workspace.statusChanged',\n 'workspace.member.added',\n 'workspace.member.updated',\n 'workspace.member.removed',\n 'workspace.message.created',\n 'workspace.message.updated',\n 'workspace.message.deleted',\n 'workspace.member.user.mentioned',\n 'workspace.member.agent.mentioned',\n 'workspace.member.user.message.replied',\n 'workspace.member.agent.message.replied',\n 'workspace.message.reaction.created',\n 'workspace.message.reaction.deleted',\n 'private.workspace.created',\n 'private.workspace.message.created',\n 'private.workspace.member.added',\n] as const;\n","'use client';\n\nimport { useEffect, useState, useCallback } from 'react';\nimport {\n Plus,\n Pencil,\n Trash2,\n Loader2,\n X,\n Webhook,\n CircleCheck,\n CircleX,\n ExternalLink,\n ArrowLeft,\n Search,\n} from 'lucide-react';\nimport { formatDistanceToNow } from 'date-fns';\nimport { fr } from 'date-fns/locale';\nimport { useWorkspaceApi } from '../hooks/useWorkspaceApi';\nimport type { WebhookSubscription, WorkspaceAgent } from '../types';\nimport { ConfirmModal } from '../components/ui/ConfirmModal';\nimport { AVAILABLE_WEBHOOK_EVENTS } from './constants';\n\ntype WebhookTypeFilter = 'all' | 'standard' | 'agent';\n\nexport interface WorkspaceWebhooksPageProps {\n /** Called when the user clicks the back arrow. If omitted, the back button is hidden. */\n onBack?: () => void;\n}\n\nexport function WorkspaceWebhooksPage({ onBack }: WorkspaceWebhooksPageProps) {\n const { webhookApi, agentApi } = useWorkspaceApi();\n const [subscriptions, setSubscriptions] = useState<WebhookSubscription[]>([]);\n const [agents, setAgents] = useState<WorkspaceAgent[]>([]);\n const [loading, setLoading] = useState(true);\n const [error, setError] = useState('');\n const [deleteId, setDeleteId] = useState<string | null>(null);\n\n // Filters\n const [searchFilter, setSearchFilter] = useState('');\n const [typeFilter, setTypeFilter] = useState<WebhookTypeFilter>('all');\n\n // Form state\n const [showForm, setShowForm] = useState(false);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [saving, setSaving] = useState(false);\n const [form, setForm] = useState({\n name: '',\n targetUrl: '',\n secretKey: 'x-api-key',\n secretValue: '',\n eventTypes: ['*'] as string[],\n active: true,\n isAgent: false,\n agentId: '',\n });\n\n const load = useCallback(async () => {\n try {\n setLoading(true);\n const params: { search?: string; isAgent?: string } = {};\n if (searchFilter.trim()) params.search = searchFilter.trim();\n if (typeFilter === 'agent') params.isAgent = 'true';\n else if (typeFilter === 'standard') params.isAgent = 'false';\n\n const [data, agentsData] = await Promise.all([\n webhookApi.list(params),\n agentApi.list(),\n ]);\n setSubscriptions(data);\n setAgents(agentsData);\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setLoading(false);\n }\n }, [searchFilter, typeFilter, webhookApi, agentApi]);\n\n useEffect(() => {\n const t = setTimeout(() => load(), 300);\n return () => clearTimeout(t);\n }, [load]);\n\n const resetForm = () => {\n setForm({\n name: '',\n targetUrl: '',\n secretKey: 'x-api-key',\n secretValue: '',\n eventTypes: ['*'],\n active: true,\n isAgent: false,\n agentId: '',\n });\n setEditingId(null);\n setShowForm(false);\n };\n\n const openCreateForm = () => {\n resetForm();\n setShowForm(true);\n };\n\n const openEditForm = (sub: WebhookSubscription) => {\n setForm({\n name: sub.name,\n targetUrl: sub.targetUrl,\n secretKey: sub.secretKey,\n secretValue: '',\n eventTypes: [...sub.eventTypes],\n active: sub.active,\n isAgent: sub.isAgent ?? false,\n agentId: sub.agentId ?? '',\n });\n setEditingId(sub._id);\n setShowForm(true);\n };\n\n const handleSubmit = async (e: React.FormEvent) => {\n e.preventDefault();\n if (!form.name.trim() || !form.targetUrl.trim()) return;\n try {\n setSaving(true);\n if (editingId) {\n await webhookApi.update(editingId, {\n name: form.name,\n targetUrl: form.targetUrl,\n secretKey: form.secretKey,\n eventTypes: form.eventTypes,\n active: form.active,\n isAgent: form.isAgent,\n ...(form.isAgent && form.agentId ? { agentId: form.agentId } : {}),\n ...(form.secretValue.trim()\n ? { secretValue: form.secretValue }\n : {}),\n });\n } else {\n await webhookApi.create({\n name: form.name,\n targetUrl: form.targetUrl,\n secretKey: form.secretKey,\n secretValue: form.secretValue,\n eventTypes: form.eventTypes,\n active: form.active,\n isAgent: form.isAgent,\n agentId: form.isAgent ? form.agentId : undefined,\n });\n }\n resetForm();\n await load();\n } catch (e) {\n setError((e as Error).message);\n } finally {\n setSaving(false);\n }\n };\n\n const toggleActive = async (sub: WebhookSubscription) => {\n try {\n await webhookApi.update(sub._id, { active: !sub.active });\n setSubscriptions((prev) =>\n prev.map((s) => (s._id === sub._id ? { ...s, active: !s.active } : s)),\n );\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const confirmDelete = (id: string) => setDeleteId(id);\n\n const executeDelete = async () => {\n if (!deleteId) return;\n try {\n await webhookApi.delete(deleteId);\n setSubscriptions((prev) => prev.filter((s) => s._id !== deleteId));\n } catch (e) {\n setError((e as Error).message);\n }\n };\n\n const toggleEvent = (event: string) => {\n setForm((prev) => {\n if (event === '*') {\n return { ...prev, eventTypes: ['*'] };\n }\n const without = prev.eventTypes.filter((e) => e !== '*' && e !== event);\n if (prev.eventTypes.includes(event)) {\n return { ...prev, eventTypes: without.length ? without : ['*'] };\n }\n return { ...prev, eventTypes: [...without, event] };\n });\n };\n\n if (loading && subscriptions.length === 0) {\n return (\n <div className=\"flex h-full items-center justify-center\">\n <Loader2 size={32} className=\"text-primary animate-spin\" />\n </div>\n );\n }\n\n return (\n <div className=\"flex h-full flex-col\">\n {/* Header */}\n <div className=\"bg-surface border-border flex shrink-0 items-center gap-4 border-b px-6 py-4\">\n {onBack && (\n <button\n type=\"button\"\n onClick={() => onBack()}\n className=\"text-text-muted hover:text-text hover:bg-bg rounded-lg p-1.5 transition\"\n >\n <ArrowLeft size={20} />\n </button>\n )}\n <div className=\"bg-primary-light text-primary flex h-10 w-10 shrink-0 items-center justify-center rounded-lg\">\n <Webhook size={24} />\n </div>\n <div className=\"flex-1\">\n <h1 className=\"text-text text-xl font-semibold\">\n Webhook Subscriptions\n </h1>\n <p className=\"text-text-secondary text-sm\">\n Gérer les souscriptions pour la distribution d&apos;événements\n </p>\n </div>\n <button\n type=\"button\"\n onClick={openCreateForm}\n className=\"bg-primary hover:bg-primary-hover flex items-center gap-2 rounded-xl px-4 py-2.5 text-sm font-medium text-white transition\"\n >\n <Plus size={16} /> Nouvelle souscription\n </button>\n </div>\n\n {error && (\n <div className=\"border-danger/30 bg-danger-light text-danger mx-6 mt-3 rounded-xl border px-4 py-3 text-sm\">\n {error}\n <button type=\"button\" onClick={() => setError('')} className=\"ml-2 underline\">\n ×\n </button>\n </div>\n )}\n\n <ConfirmModal\n open={!!deleteId}\n onClose={() => setDeleteId(null)}\n onConfirm={executeDelete}\n title=\"Supprimer ce webhook\"\n description=\"Voulez-vous vraiment supprimer ce webhook ?\"\n danger\n />\n\n <div className=\"flex-1 overflow-y-auto p-6\">\n <div className=\"mx-auto max-w-4xl\">\n {/* Filters bar */}\n <div className=\"mb-4 flex flex-wrap items-center gap-3\">\n {/* Search */}\n <div className=\"relative\">\n <Search\n size={16}\n className=\"text-text-muted absolute top-1/2 left-3 -translate-y-1/2\"\n />\n <input\n value={searchFilter}\n onChange={(e) => setSearchFilter(e.target.value)}\n placeholder=\"Rechercher par nom ou URL...\"\n className=\"bg-surface border-border text-text placeholder:text-text-placeholder focus:ring-primary w-72 rounded-xl border py-2 pr-4 pl-10 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n\n {/* Type filter pills */}\n <div className=\"flex items-center gap-1.5\">\n {(\n [\n { key: 'all', label: 'Tous' },\n { key: 'standard', label: 'Standard' },\n { key: 'agent', label: 'Agent' },\n ] as const\n ).map(({ key, label }) => (\n <button\n key={key}\n type=\"button\"\n onClick={() => setTypeFilter(key)}\n className={`rounded-full px-3 py-1.5 text-xs font-medium transition ${\n typeFilter === key\n ? 'bg-primary text-white'\n : 'bg-bg border-border text-text-secondary hover:text-text hover:bg-border-light border'\n }`}\n >\n {label}\n </button>\n ))}\n </div>\n\n {/* Result count */}\n {!loading && (\n <span className=\"text-text-muted text-xs\">\n {subscriptions.length} résultat\n {subscriptions.length > 1 ? 's' : ''}\n </span>\n )}\n </div>\n\n {/* Form */}\n {showForm && (\n <div className=\"bg-surface border-border mb-6 rounded-2xl border p-6 shadow-sm\">\n <div className=\"mb-4 flex items-center justify-between\">\n <h2 className=\"text-text text-base font-semibold\">\n {editingId\n ? 'Modifier la souscription'\n : 'Nouvelle souscription'}\n </h2>\n <button\n type=\"button\"\n onClick={resetForm}\n className=\"text-text-muted hover:text-text transition\"\n >\n <X size={20} />\n </button>\n </div>\n <form onSubmit={handleSubmit} className=\"space-y-4\">\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Nom\n </label>\n <input\n value={form.name}\n onChange={(e) =>\n setForm({ ...form, name: e.target.value })\n }\n required\n placeholder=\"Garfield Production\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n URL cible\n </label>\n <input\n value={form.targetUrl}\n onChange={(e) =>\n setForm({ ...form, targetUrl: e.target.value })\n }\n required\n placeholder=\"https://api.example.com/webhooks\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n </div>\n <div className=\"grid grid-cols-2 gap-4\">\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Clé du header d&apos;authentification\n </label>\n <input\n value={form.secretKey}\n onChange={(e) =>\n setForm({ ...form, secretKey: e.target.value })\n }\n required\n placeholder=\"x-api-key\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Valeur du secret\n {editingId && (\n <span className=\"text-text-muted ml-1\">\n (laisser vide pour ne pas modifier)\n </span>\n )}\n </label>\n <input\n value={form.secretValue}\n onChange={(e) =>\n setForm({ ...form, secretValue: e.target.value })\n }\n required={!editingId}\n type=\"password\"\n placeholder=\"••••••••\"\n className=\"bg-bg border-border text-text placeholder:text-text-placeholder focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n />\n </div>\n </div>\n\n {/* Event types */}\n <div>\n <label className=\"text-text-secondary mb-2 block text-xs\">\n Événements\n </label>\n <div className=\"flex flex-wrap gap-2\">\n {AVAILABLE_WEBHOOK_EVENTS.map((evt) => (\n <button\n key={evt}\n type=\"button\"\n onClick={() => toggleEvent(evt)}\n className={`rounded-full px-3 py-1.5 text-xs font-medium transition ${\n form.eventTypes.includes(evt)\n ? 'bg-primary text-white'\n : 'bg-bg border-border text-text-secondary hover:text-text hover:bg-border-light border'\n }`}\n >\n {evt === '*' ? 'Tous (*)' : evt}\n </button>\n ))}\n </div>\n </div>\n\n {/* Active toggle */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => setForm({ ...form, active: !form.active })}\n className={`relative h-5 w-10 rounded-full transition ${\n form.active ? 'bg-primary' : 'bg-border'\n }`}\n >\n <span\n className={`absolute top-0.5 left-0.5 h-4 w-4 rounded-full bg-white shadow transition-transform ${\n form.active ? 'translate-x-5' : ''\n }`}\n />\n </button>\n <span className=\"text-text text-sm\">\n {form.active ? 'Active' : 'Inactive'}\n </span>\n </div>\n\n {/* Agent toggle */}\n <div className=\"flex items-center gap-3\">\n <button\n type=\"button\"\n onClick={() => setForm({ ...form, isAgent: !form.isAgent })}\n className={`relative h-5 w-10 rounded-full transition ${\n form.isAgent ? 'bg-primary' : 'bg-border'\n }`}\n >\n <span\n className={`absolute top-0.5 left-0.5 h-4 w-4 rounded-full bg-white shadow transition-transform ${\n form.isAgent ? 'translate-x-5' : ''\n }`}\n />\n </button>\n <span className=\"text-text text-sm\">\n {form.isAgent ? 'Webhook Agent' : 'Webhook standard'}\n </span>\n </div>\n\n {/* Agent ID select (shown only when isAgent) */}\n {form.isAgent && (\n <div>\n <label className=\"text-text-secondary mb-1 block text-xs\">\n Agent\n </label>\n {agents.length === 0 ? (\n <p className=\"text-warning py-1 text-xs\">\n Aucun agent disponible. Créez d&apos;abord un agent dans\n la section Agents.\n </p>\n ) : (\n <select\n value={form.agentId}\n onChange={(e) =>\n setForm({ ...form, agentId: e.target.value })\n }\n required\n className=\"bg-bg border-border text-text focus:ring-primary w-full rounded-xl border px-4 py-2.5 text-sm focus:ring-2 focus:outline-none\"\n >\n <option value=\"\">-- Sélectionner un agent --</option>\n {agents.map((a) => (\n <option key={a._id} value={a.agentId}>\n {a.agentName} ({a.agentId})\n </option>\n ))}\n </select>\n )}\n </div>\n )}\n\n {/* Actions */}\n <div className=\"flex gap-3 pt-1\">\n <button\n type=\"submit\"\n disabled={saving}\n className=\"bg-primary hover:bg-primary-hover flex items-center gap-2 rounded-xl px-5 py-2 text-sm font-medium text-white transition disabled:opacity-50\"\n >\n {saving && <Loader2 size={16} className=\"animate-spin\" />}\n {editingId ? 'Enregistrer' : 'Créer'}\n </button>\n <button\n type=\"button\"\n onClick={resetForm}\n className=\"bg-bg text-text hover:bg-border-light rounded-xl px-5 py-2 text-sm font-medium transition\"\n >\n Annuler\n </button>\n </div>\n </form>\n </div>\n )}\n\n {/* List */}\n {subscriptions.length === 0 ? (\n <div className=\"text-text-muted py-20 text-center\">\n <Webhook size={40} className=\"mx-auto mb-3 opacity-30\" />\n <p className=\"text-sm\">Aucune souscription webhook.</p>\n <p className=\"text-text-muted mt-1 text-xs\">\n Créez une souscription pour recevoir les événements workspace.\n </p>\n </div>\n ) : (\n <div className=\"space-y-3\">\n {subscriptions.map((sub) => (\n <div\n key={sub._id}\n className=\"bg-surface border-border group rounded-xl border px-5 py-4 transition hover:shadow-md\"\n >\n <div className=\"flex items-start justify-between gap-4\">\n <div className=\"min-w-0 flex-1\">\n <div className=\"mb-1 flex items-center gap-2\">\n <h3 className=\"text-text truncate text-sm font-semibold\">\n {sub.name}\n </h3>\n {sub.active ? (\n <span className=\"bg-success-light text-success ring-success/30 inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs ring-1\">\n <CircleCheck size={12} />\n Active\n </span>\n ) : (\n <span className=\"text-text-muted bg-bg border-border inline-flex items-center gap-1 rounded-full border px-2 py-0.5 text-xs\">\n <CircleX size={12} />\n Inactive\n </span>\n )}\n {sub.isAgent && (\n <span className=\"bg-primary-light text-primary ring-primary/30 inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-xs ring-1\">\n Agent\n </span>\n )}\n </div>\n <div className=\"text-text-muted mb-2 flex items-center gap-1.5 text-xs\">\n <ExternalLink size={12} className=\"shrink-0\" />\n <span className=\"truncate\">{sub.targetUrl}</span>\n </div>\n <div className=\"flex flex-wrap gap-1.5\">\n {sub.eventTypes.map((evt) => (\n <span\n key={evt}\n className=\"bg-bg text-text-secondary rounded-md px-2 py-0.5 text-xs\"\n >\n {evt === '*' ? 'Tous' : evt}\n </span>\n ))}\n </div>\n <p className=\"text-text-muted mt-2 text-xs\">\n Authentification : {sub.secretKey}\n {sub.isAgent && sub.agentId && (\n <> • Agent: {sub.agentId}</>\n )}{' '}\n •{' '}\n {formatDistanceToNow(new Date(sub.createdAt), {\n addSuffix: true,\n locale: fr,\n })}\n </p>\n </div>\n <div className=\"flex shrink-0 items-center gap-1\">\n <button\n type=\"button\"\n onClick={() => toggleActive(sub)}\n className={`rounded-lg p-2 transition ${\n sub.active\n ? 'text-success hover:bg-success-light'\n : 'text-text-muted hover:bg-bg'\n }`}\n title={sub.active ? 'Désactiver' : 'Activer'}\n >\n {sub.active ? (\n <CircleCheck size={16} />\n ) : (\n <CircleX size={16} />\n )}\n </button>\n <button\n type=\"button\"\n onClick={() => openEditForm(sub)}\n className=\"text-text-muted hover:text-primary hover:bg-primary-light rounded-lg p-2 transition\"\n title=\"Modifier\"\n >\n <Pencil size={16} />\n </button>\n <button\n type=\"button\"\n onClick={() => confirmDelete(sub._id)}\n className=\"text-text-muted hover:text-danger hover:bg-danger-light rounded-lg p-2 opacity-0 transition group-hover:opacity-100\"\n title=\"Supprimer\"\n >\n <Trash2 size={16} />\n </button>\n </div>\n </div>\n </div>\n ))}\n </div>\n )}\n </div>\n </div>\n </div>\n );\n}\n"],"mappings":"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","names":["e","useEffect","useState","useCallback","Plus","Pencil","Trash2","Loader2","X","ArrowLeft","fr","jsx","jsxs","useState","useCallback","useEffect","e","Plus","X","Loader2","Pencil","Trash2","ArrowLeft","fr","useEffect","useState","useCallback","Plus","Pencil","Trash2","Loader2","X","Webhook","CircleCheck","CircleX","ExternalLink","ArrowLeft","Search","formatDistanceToNow","fr","Fragment","jsx","jsxs","useState","useCallback","useEffect","e","Loader2","ArrowLeft","Webhook","Plus","Search","X","CircleCheck","CircleX","ExternalLink","formatDistanceToNow","fr","Pencil","Trash2"]}