@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.
- package/dist/admin.d.mts +23 -1
- package/dist/admin.d.ts +23 -1
- package/dist/admin.js +2385 -0
- package/dist/admin.js.map +1 -1
- package/dist/admin.mjs +1857 -0
- package/dist/admin.mjs.map +1 -1
- package/dist/chunk-4UDSYAAD.mjs +735 -0
- package/dist/chunk-4UDSYAAD.mjs.map +1 -0
- package/dist/index.mjs +1147 -1849
- package/dist/index.mjs.map +1 -1
- package/dist/styles.css +1 -1
- package/package.json +1 -1
package/dist/admin.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/admin.ts"],"sourcesContent":["// ─── @workspace-platform/ui/admin ─────────────────────────────────────────────\n// Secondary entry point for admin components (agents, types, webhooks pages).\n// These will be implemented in a later phase.\n\nexport {};\n"],"mappings":";;;;;;;;;;;;;;;;AAAA;AAAA;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/admin.ts","../src/admin/WorkspaceTypesPage.tsx","../src/hooks/useWorkspaceApi.ts","../src/api/index.ts","../src/provider.tsx","../src/socket/client.ts","../src/theme-context.tsx","../src/styling.ts","../src/components/ui/cn.ts","../src/components/ui/ConfirmModal.tsx","../src/components/ui/Modal.tsx","../src/components/ui/Button.tsx","../src/admin/WorkspaceAgentsPage.tsx","../src/admin/constants.ts","../src/admin/WorkspaceWebhooksPage.tsx"],"sourcesContent":["// ─── @workspace-platform/ui/admin ─────────────────────────────────────────────\n// Secondary entry point for admin components (agents, types, webhooks pages).\n\nexport { WorkspaceTypesPage } from './admin/WorkspaceTypesPage';\nexport type { WorkspaceTypesPageProps } from './admin/WorkspaceTypesPage';\nexport { WorkspaceAgentsPage } from './admin/WorkspaceAgentsPage';\nexport type { WorkspaceAgentsPageProps } from './admin/WorkspaceAgentsPage';\nexport { WorkspaceWebhooksPage } from './admin/WorkspaceWebhooksPage';\nexport type { WorkspaceWebhooksPageProps } from './admin/WorkspaceWebhooksPage';\nexport { AVAILABLE_WEBHOOK_EVENTS } from './admin/constants';\n","'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'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","import { useMemo } from 'react';\nimport { createWorkspaceApis, type WorkspaceApis } from '../api';\nimport { useWorkspaceContext } from '../provider';\n\n/**\n * Hook to access all workspace API modules within a WorkspaceProvider.\n * The APIs are memoized and only recreated when the client changes.\n */\nexport function useWorkspaceApi(): WorkspaceApis {\n const { apiClient } = useWorkspaceContext();\n return useMemo(() => createWorkspaceApis(apiClient), [apiClient]);\n}\n","import type { WorkspaceClient } from './client';\nimport type {\n Workspace,\n WorkspaceType,\n WorkspaceMember,\n WorkspaceMessage,\n WorkspaceArtefact,\n WorkspaceMessageReaction,\n MessageWithArtefacts,\n PaginatedResponse,\n CreateWorkspacePayload,\n SendMessagePayload,\n UpdateMessagePayload,\n WebhookSubscription,\n WorkspaceStatus,\n MemberRole,\n MemberType,\n ArtefactType,\n WorkspaceAgent,\n AgentDeleteInfo,\n EntityWithSecret,\n WorkspaceSummary,\n LatestSummaryResponse,\n} from '../types';\n\n// ─── Sync types (co-located with API for convenience) ─────────────────────────\n\nexport interface SyncLink {\n provider: string;\n externalId: string;\n externalName?: string;\n externalTeamId?: string;\n active: boolean;\n createdAt: string;\n updatedAt: string;\n}\n\nexport interface SyncStatus {\n syncWithSlack: boolean;\n syncProviders?: string[];\n links: SyncLink[];\n}\n\nexport interface SyncProviderInfo {\n id: string;\n enabled: boolean;\n}\n\nexport interface ToggleReactionResponse {\n action: 'created' | 'deleted';\n reaction: WorkspaceMessageReaction | null;\n}\n\n// ─── API factory ──────────────────────────────────────────────────────────────\n// Each API object uses the injected client (from WorkspaceProvider).\n\nexport function createWorkspaceApis(client: WorkspaceClient) {\n // ── Workspace Types ──\n const workspaceTypeApi = {\n list: () => client.get<WorkspaceType[]>('/workspace-types'),\n get: (id: string) => client.get<WorkspaceType>(`/workspace-types/${id}`),\n create: (payload: { name: string; entitiesWithSecrets?: EntityWithSecret[] }) =>\n client.post<WorkspaceType>('/workspace-types', payload),\n update: (id: string, payload: { name?: string; entitiesWithSecrets?: EntityWithSecret[] }) =>\n client.patch<WorkspaceType>(`/workspace-types/${id}`, payload),\n delete: (id: string) => client.delete<void>(`/workspace-types/${id}`),\n };\n\n // ── Workspaces ──\n const workspaceApi = {\n list: (params?: {\n search?: string;\n status?: string;\n type?: string;\n isPrivate?: boolean;\n limit?: number;\n skip?: number;\n }) => {\n const cleanParams = Object.fromEntries(\n Object.entries(params || {})\n .filter(([, v]) => v != null && v !== '' && v !== 'all')\n .map(([k, v]) => [k, String(v)])\n );\n const qs =\n Object.keys(cleanParams).length > 0\n ? '?' + new URLSearchParams(cleanParams as Record<string, string>).toString()\n : '';\n return client.get<PaginatedResponse<Workspace>>(`/workspaces${qs}`);\n },\n get: (id: string) => client.get<Workspace>(`/workspaces/${id}`),\n create: (payload: CreateWorkspacePayload) =>\n client.post<Workspace>('/workspaces', payload),\n update: (id: string, payload: Partial<Omit<CreateWorkspacePayload, 'members'>>) =>\n client.patch<Workspace>(`/workspaces/${id}`, payload),\n updateStatus: (id: string, status: WorkspaceStatus) =>\n client.patch<Workspace>(`/workspaces/${id}/status`, { status }),\n delete: (id: string) => client.delete<void>(`/workspaces/${id}`),\n startTyping: (id: string) => client.post<void>(`/workspaces/${id}/writing/start`, {}),\n stopTyping: (id: string) => client.post<void>(`/workspaces/${id}/writing/stop`, {}),\n timeline: (\n workspaceId: string,\n params?: { limit?: number; offset?: number; entityType?: string }\n ) => {\n const qs = params\n ? '?' +\n new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString()\n : '';\n return client.get<PaginatedResponse<any>>(`/workspaces/${workspaceId}/timeline${qs}`);\n },\n };\n\n // ── Members ──\n const memberApi = {\n list: (workspaceId: string) =>\n client.get<WorkspaceMember[]>(`/workspaces/${workspaceId}/members`),\n add: (\n workspaceId: string,\n payload: { memberId: string; memberName: string; memberType?: MemberType; role?: MemberRole }\n ) => client.post<WorkspaceMember>(`/workspaces/${workspaceId}/members`, payload),\n updateRole: (workspaceId: string, memberId: string, role: MemberRole) =>\n client.patch<WorkspaceMember>(`/workspaces/${workspaceId}/members/${memberId}`, { role }),\n remove: (workspaceId: string, memberId: string) =>\n client.delete<void>(`/workspaces/${workspaceId}/members/${memberId}`),\n };\n\n // ── Messages ──\n const messageApi = {\n list: (\n workspaceId: string,\n params?: { limit?: number; offset?: number; sort?: 'asc' | 'desc' }\n ) => {\n const qs = params\n ? '?' +\n new URLSearchParams(\n Object.fromEntries(\n Object.entries(params)\n .filter(([, v]) => v != null)\n .map(([k, v]) => [k, String(v)])\n )\n ).toString()\n : '';\n return client.get<PaginatedResponse<WorkspaceMessage>>(`/workspaces/${workspaceId}/messages${qs}`);\n },\n send: (workspaceId: string, payload: SendMessagePayload) =>\n client.post<WorkspaceMessage>(`/workspaces/${workspaceId}/messages`, payload),\n update: (workspaceId: string, messageId: string, payload: UpdateMessagePayload) =>\n client.patch<WorkspaceMessage>(`/workspaces/${workspaceId}/messages/${messageId}`, payload),\n delete: (workspaceId: string, messageId: string) =>\n client.delete<WorkspaceMessage>(`/workspaces/${workspaceId}/messages/${messageId}`),\n togglePin: (workspaceId: string, messageId: string) =>\n client.patch<WorkspaceMessage>(`/workspaces/${workspaceId}/messages/${messageId}/pin`, {}),\n };\n\n // ── Artefacts ──\n const artefactApi = {\n upload: async (\n workspaceId: string,\n files: File[],\n messageId?: string,\n artefactType?: string\n ): Promise<{ success: boolean; count: number; results: WorkspaceArtefact[] }> => {\n const formData = new FormData();\n files.forEach((f) => formData.append('files', f));\n if (messageId) formData.append('messageId', messageId);\n if (artefactType) formData.append('type', artefactType);\n return client.upload(`/workspaces/${workspaceId}/artefacts`, formData);\n },\n list: (workspaceId: string, artefactType?: ArtefactType) => {\n const query = artefactType ? `?type=${artefactType}` : '';\n return client.get<{ data: WorkspaceArtefact[]; total: number }>(\n `/workspaces/${workspaceId}/artefacts${query}`\n );\n },\n listPaginated: (\n workspaceId: string,\n params?: { type?: ArtefactType; limit?: number; offset?: number }\n ) => {\n const entries: [string, string][] = [];\n if (params) {\n if (params.type) entries.push(['type', params.type]);\n if (params.limit != null) entries.push(['limit', String(params.limit)]);\n if (params.offset != null) entries.push(['offset', String(params.offset)]);\n }\n const qs = entries.length > 0 ? '?' + new URLSearchParams(entries).toString() : '';\n return client.get<PaginatedResponse<WorkspaceArtefact>>(\n `/workspaces/${workspaceId}/artefacts${qs}`\n );\n },\n delete: (workspaceId: string, artefactId: string) =>\n client.delete(`/workspaces/${workspaceId}/artefacts/${artefactId}`),\n getSignedUrl: (fileId: string) =>\n client.get<{ url: string }>(`/files/${fileId}/signed-url`),\n getDownloadBlob: (fileId: string) => client.getBlob(`/files/${fileId}/download`),\n messagesWithArtefacts: (\n workspaceId: string,\n params?: {\n limit?: number;\n offset?: number;\n sort?: 'asc' | 'desc';\n members?: string[];\n concernsMe?: boolean;\n pinned?: boolean;\n }\n ) => {\n const entries: [string, string][] = [];\n if (params) {\n if (params.limit != null) entries.push(['limit', String(params.limit)]);\n if (params.offset != null) entries.push(['offset', String(params.offset)]);\n if (params.sort) entries.push(['sort', params.sort]);\n if (params.members && params.members.length > 0)\n entries.push(['members', params.members.join(',')]);\n if (params.concernsMe) entries.push(['concernsMe', 'true']);\n if (params.pinned) entries.push(['pinned', 'true']);\n }\n const qs = entries.length > 0 ? '?' + new URLSearchParams(entries).toString() : '';\n return client.get<PaginatedResponse<MessageWithArtefacts>>(\n `/workspaces/${workspaceId}/messages/with-artefacts${qs}`\n );\n },\n };\n\n // ── Reactions ──\n const reactionApi = {\n toggle: (workspaceId: string, messageId: string, reaction: string) =>\n client.post<ToggleReactionResponse>(\n `/workspaces/${workspaceId}/messages/${messageId}/reactions/toggle`,\n { reaction }\n ),\n };\n\n // ── Agents ──\n const agentApi = {\n list: (search?: string) => {\n const qs = search ? `?search=${encodeURIComponent(search)}` : '';\n return client.get<WorkspaceAgent[]>(`/workspace-agents${qs}`);\n },\n create: (body: { agentId: string; agentName: string }) =>\n client.post<WorkspaceAgent>('/workspace-agents', body),\n update: (id: string, body: { agentName: string }) =>\n client.patch<WorkspaceAgent>(`/workspace-agents/${id}`, body),\n delete: (id: string) => client.delete<void>(`/workspace-agents/${id}`),\n getDeleteInfo: (id: string) =>\n client.get<AgentDeleteInfo>(`/workspace-agents/${id}/delete-info`),\n };\n\n // ── Summaries ──\n const summaryApi = {\n generate: (workspaceId: string) =>\n client.post<WorkspaceSummary>(`/workspaces/${workspaceId}/summaries/generate`, {}),\n getLatest: (workspaceId: string) =>\n client.get<LatestSummaryResponse>(`/workspaces/${workspaceId}/summaries/latest`),\n getHistory: (workspaceId: string) =>\n client.get<WorkspaceSummary[]>(`/workspaces/${workspaceId}/summaries`),\n create: (\n workspaceId: string,\n payload: {\n keyPoints: string[];\n keyTasks: string[];\n keyDecisions: string[];\n messageCount: number;\n lastMessage?: string;\n wasTruncated?: boolean;\n generatedAt?: string;\n }\n ) => client.post<WorkspaceSummary>(`/workspaces/${workspaceId}/summaries`, payload),\n update: (\n workspaceId: string,\n summaryId: string,\n payload: Partial<{\n keyPoints: string[];\n keyTasks: string[];\n keyDecisions: string[];\n messageCount: number;\n wasTruncated: boolean;\n }>\n ) =>\n client.patch<WorkspaceSummary>(\n `/workspaces/${workspaceId}/summaries/${summaryId}`,\n payload\n ),\n };\n\n // ── Webhooks ──\n const webhookApi = {\n list: (params?: { search?: string; isAgent?: string; agentId?: string }) => {\n const cleanParams = Object.fromEntries(\n Object.entries(params || {}).filter(([, v]) => v !== undefined && v !== '')\n );\n const qs =\n Object.keys(cleanParams).length > 0\n ? '?' + new URLSearchParams(cleanParams as Record<string, string>).toString()\n : '';\n return client.get<WebhookSubscription[]>(`/webhook-subscriptions${qs}`);\n },\n create: (data: {\n name: string;\n targetUrl: string;\n secretKey: string;\n secretValue: string;\n eventTypes?: string[];\n active?: boolean;\n isAgent?: boolean;\n agentId?: string;\n metadata?: Record<string, unknown>;\n }) => client.post<WebhookSubscription>('/webhook-subscriptions', data),\n update: (\n id: string,\n data: Partial<{\n name: string;\n targetUrl: string;\n secretKey: string;\n secretValue: string;\n eventTypes: string[];\n active: boolean;\n isAgent: boolean;\n agentId: string;\n metadata: Record<string, unknown>;\n }>\n ) => client.patch<WebhookSubscription>(`/webhook-subscriptions/${id}`, data),\n delete: (id: string) => client.delete(`/webhook-subscriptions/${id}`),\n };\n\n // ── Sync ──\n const syncApi = {\n getAvailableProviders: () =>\n client\n .get<{ providers: SyncProviderInfo[] }>('/workspaces/sync/providers')\n .then((res) => res.providers),\n getStatus: (workspaceId: string) =>\n client.get<SyncStatus>(`/workspaces/${workspaceId}/sync-status`),\n toggleSync: (workspaceId: string, provider: string, enabled: boolean) =>\n client.patch<Workspace>(`/workspaces/${workspaceId}/sync`, { provider, enabled }),\n };\n\n return {\n workspaceTypeApi,\n workspaceApi,\n memberApi,\n messageApi,\n artefactApi,\n reactionApi,\n agentApi,\n summaryApi,\n webhookApi,\n syncApi,\n };\n}\n\nexport type WorkspaceApis = ReturnType<typeof createWorkspaceApis>;\n","import React, { createContext, useContext, useMemo } from 'react';\nimport { createWorkspaceClient, type WorkspaceClient } from './api/client';\nimport { createWorkspaceSocket, type WorkspaceSocketManager } from './socket/client';\nimport { buildThemeVars, type WorkspaceTheme, type WorkspaceColorScheme } from './theme';\nimport { WorkspaceThemeContext } from './theme-context';\nimport { WorkspaceStylesContext, type WorkspaceClassNames } from './styling';\nimport { cn } from './components/ui/cn';\n\n// ─── Config types ─────────────────────────────────────────────────────────────\n\nexport interface UserSearchResult {\n id: string;\n email: string;\n displayName: string;\n avatarUrl?: string;\n}\n\nexport interface WorkspaceConfig {\n /** Base URL of the workspace-platform server (e.g. http://localhost:3100) */\n baseUrl: string;\n /** Function that returns the current Bearer token (JWT) */\n getAuthToken: () => string | null;\n /** Current user identifier (email or ID) — used for socket auth & UI */\n currentUserId: string | null;\n /** Current user display name */\n currentUserName?: string | null;\n /** Optional: additional headers for API requests (e.g. { 'x-auth-mode': 'keycloak' }) */\n extraHeaders?: Record<string, string>;\n /** Optional: function to search users for member invitation */\n searchUsers?: (query: string) => Promise<UserSearchResult[]>;\n /** Optional: function to resolve user avatar URLs by email */\n resolveAvatars?: (memberIds: string[]) => Promise<Record<string, string>>;\n /** Optional: callback when navigating to a workspace */\n onNavigateToWorkspace?: (workspaceId: string) => void;\n /**\n * Optional: brand colors for this project. Provide at least `primary` and\n * `secondary` — all derived shades are computed automatically.\n */\n theme?: WorkspaceTheme;\n /**\n * Optional: light or dark base palette. Pass this from the host app (e.g.\n * following the user's OS / app theme). Defaults to `'light'`. Neutral tokens\n * (backgrounds, surfaces, text, borders) switch automatically; brand colors\n * from `theme` are re-tinted to stay legible on dark surfaces.\n */\n colorScheme?: WorkspaceColorScheme;\n /**\n * Optional: app-wide component style overrides. Use this when the `theme`\n * tokens aren't enough and you need to restyle components themselves (e.g.\n * square corners on every card, a different message bubble).\n *\n * Merged with `tailwind-merge`, so conflicting utilities replace the\n * defaults instead of stacking. Per-instance `classNames` / `className`\n * props still win over anything set here.\n */\n classNames?: WorkspaceClassNames;\n}\n\n// ─── Context ──────────────────────────────────────────────────────────────────\n\nexport interface WorkspaceContextValue {\n config: WorkspaceConfig;\n apiClient: WorkspaceClient;\n socket: WorkspaceSocketManager;\n}\n\nconst WorkspaceContext = createContext<WorkspaceContextValue | null>(null);\n\n// Stable identity so consumers that omit `classNames` never re-render the tree.\nconst EMPTY_CLASS_NAMES: WorkspaceClassNames = {};\n\nexport function WorkspaceProvider({\n config,\n children,\n}: {\n config: WorkspaceConfig;\n children: React.ReactNode;\n}) {\n const value = useMemo(() => {\n const apiClient = createWorkspaceClient(config);\n const socket = createWorkspaceSocket(config);\n return { config, apiClient, socket };\n }, [config.baseUrl, config.currentUserId]);\n\n const isDark = config.colorScheme === 'dark';\n\n const themeVars = useMemo(\n () => buildThemeVars(config.theme, config.colorScheme),\n [config.theme, config.colorScheme],\n );\n\n // The class carries the color-scheme; the style carries brand overrides.\n const themeClassName = cn('ws-root', isDark && 'ws-theme-dark');\n\n const themeAttrs = useMemo(\n () => ({ className: themeClassName, style: themeVars as React.CSSProperties }),\n [themeClassName, themeVars],\n );\n\n const classNames = config.classNames ?? EMPTY_CLASS_NAMES;\n\n return (\n <WorkspaceContext.Provider value={value}>\n <WorkspaceStylesContext.Provider value={classNames}>\n <WorkspaceThemeContext.Provider value={themeAttrs}>\n {/* Always rendered, even with no theme overrides: `.ws-root` is the\n * scope the stylesheet uses for element-level rules (cursors,\n * hover affordances), so it has to exist unconditionally.\n * `display: contents` keeps it out of the layout box tree while\n * still letting the --ws-* custom properties (and the color-scheme\n * class) inherit down to every child. */}\n <div\n className={themeClassName}\n style={{ display: 'contents', ...themeVars }}\n >\n {children}\n </div>\n </WorkspaceThemeContext.Provider>\n </WorkspaceStylesContext.Provider>\n </WorkspaceContext.Provider>\n );\n}\n\nexport function useWorkspaceContext(): WorkspaceContextValue {\n const ctx = useContext(WorkspaceContext);\n if (!ctx)\n throw new Error(\n 'useWorkspaceContext must be used within <WorkspaceProvider>'\n );\n return ctx;\n}\n","import { io, Socket } from 'socket.io-client';\nimport type { WorkspaceConfig } from '../provider';\n\n// ─── Decoupled Workspace Socket.IO Client ─────────────────────────────────────\n\nexport interface WorkspaceSocketManager {\n getSocket: () => Socket;\n connect: (userId?: string) => Socket;\n disconnect: () => void;\n}\n\nexport function createWorkspaceSocket(\n config: WorkspaceConfig\n): WorkspaceSocketManager {\n let socket: Socket | null = null;\n\n function getSocket(): Socket {\n if (!socket) {\n const token = config.getAuthToken();\n socket = io(`${config.baseUrl}/workspaces`, {\n autoConnect: false,\n auth: { token: token ?? '' },\n });\n }\n return socket;\n }\n\n function connect(userId?: string): Socket {\n const s = getSocket();\n if (!s.connected) s.connect();\n const uid = userId ?? config.currentUserId;\n if (uid) {\n if (s.connected) {\n s.emit('authenticate', { userId: uid });\n } else {\n s.once('connect', () => {\n s.emit('authenticate', { userId: uid });\n });\n }\n }\n return s;\n }\n\n function disconnect() {\n socket?.disconnect();\n socket = null;\n }\n\n return { getSocket, connect, disconnect };\n}\n","'use client';\n\nimport React, { createContext, useContext } from 'react';\n\n/**\n * Theme attributes that must be re-applied on elements rendered OUTSIDE the\n * provider's DOM subtree — most importantly React portals (modals), which\n * mount on `document.body` and therefore don't inherit the `--ws-*` custom\n * properties set on the provider wrapper.\n *\n * `Modal` reads this via {@link useWorkspaceThemeAttrs} and spreads it onto its\n * portal root so modals stay branded (and never fall back to the light\n * defaults / become transparent) in both light and dark mode.\n */\nexport interface WorkspaceThemeAttrs {\n /** Class name carrying the color-scheme (e.g. `ws-root ws-theme-dark`). */\n className: string;\n /** Inline `--ws-*` custom properties from the active theme. */\n style: React.CSSProperties;\n}\n\nconst EMPTY: WorkspaceThemeAttrs = { className: '', style: {} };\n\nexport const WorkspaceThemeContext = createContext<WorkspaceThemeAttrs>(EMPTY);\n\n/**\n * Returns the theme class + inline vars to re-apply on portal roots.\n * Safe to call outside a provider — returns empty attrs so primitives like\n * `Modal` remain usable standalone.\n */\nexport function useWorkspaceThemeAttrs(): WorkspaceThemeAttrs {\n return useContext(WorkspaceThemeContext);\n}\n","'use client';\n\nimport { createContext, useContext } from 'react';\nimport { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\n/**\n * Style override for one component.\n *\n * Either a single string — applied to the component's root element — or a map\n * targeting individual slots (inner elements) for finer control:\n *\n * ```tsx\n * <WorkspaceCard classNames=\"rounded-none\" />\n * <WorkspaceCard classNames={{ root: 'rounded-none', title: 'text-base' }} />\n * ```\n */\nexport type WorkspaceSlotOverride<Slot extends string = never> =\n | string\n | Partial<Record<Slot | 'root', string>>;\n\n/**\n * App-wide component style overrides, passed once through\n * `WorkspaceConfig.classNames`. Every entry is merged with the component's own\n * classes using `tailwind-merge`, so conflicting Tailwind utilities are\n * replaced rather than duplicated (`bg-surface` + `bg-white` → `bg-white`).\n *\n * Precedence, lowest to highest:\n * `component defaults` → `config.classNames` → per-instance `classNames`\n * → per-instance `className`.\n *\n * For anything not reachable here, every element also carries a stable\n * `ws-*` class you can target from plain CSS (see STYLING.md).\n */\n/** Slots shared by every right-drawer panel. */\nexport type PanelSlot = 'header' | 'title' | 'body' | 'empty';\nexport type PanelSlotOverride = WorkspaceSlotOverride<PanelSlot>;\n\nexport interface WorkspaceClassNames {\n // ── Primitives ──\n button?: WorkspaceSlotOverride;\n iconButton?: WorkspaceSlotOverride;\n card?: WorkspaceSlotOverride;\n badge?: WorkspaceSlotOverride;\n tooltip?: WorkspaceSlotOverride<'bubble'>;\n /** `root` is the full-screen overlay (the backdrop); `panel` is the dialog. */\n modal?: WorkspaceSlotOverride<\n 'panel' | 'header' | 'title' | 'description' | 'close'\n >;\n input?: WorkspaceSlotOverride;\n textarea?: WorkspaceSlotOverride;\n select?: WorkspaceSlotOverride;\n field?: WorkspaceSlotOverride<'label' | 'error' | 'hint'>;\n emojiPicker?: WorkspaceSlotOverride;\n memberAvatar?: WorkspaceSlotOverride;\n pagination?: WorkspaceSlotOverride;\n sidePanel?: WorkspaceSlotOverride;\n\n // ── Workspace listing ──\n workspaceCard?: WorkspaceSlotOverride<'header' | 'title' | 'body' | 'footer'>;\n workspaceRow?: WorkspaceSlotOverride<'title'>;\n workspaceList?: WorkspaceSlotOverride<'grid' | 'empty'>;\n\n // ── Chat ──\n messageFeed?: WorkspaceSlotOverride<'empty'>;\n messageItem?: WorkspaceSlotOverride<\n 'avatar' | 'bubble' | 'header' | 'body' | 'actions' | 'reactions' | 'attachments'\n >;\n messageInput?: WorkspaceSlotOverride<'field' | 'toolbar' | 'send'>;\n\n /** Applies to every right-drawer panel; refine with the keys below. */\n panel?: PanelSlotOverride;\n contextPanel?: PanelSlotOverride;\n membersPanel?: PanelSlotOverride;\n syncPanel?: PanelSlotOverride;\n artifactsPanel?: PanelSlotOverride;\n pinnedMessagesPanel?: PanelSlotOverride;\n summaryPanel?: PanelSlotOverride;\n activityPanel?: PanelSlotOverride;\n}\n\nexport type WorkspaceComponentKey = keyof WorkspaceClassNames;\n\nconst EMPTY: WorkspaceClassNames = {};\n\nexport const WorkspaceStylesContext = createContext<WorkspaceClassNames>(EMPTY);\n\n/** The app-wide overrides currently in effect. Empty outside a provider. */\nexport function useWorkspaceClassNames(): WorkspaceClassNames {\n return useContext(WorkspaceStylesContext);\n}\n\nfunction pickSlot(\n override: WorkspaceSlotOverride<string> | undefined,\n slot: string,\n): string | undefined {\n if (!override) return undefined;\n // The string shorthand only ever targets the root element.\n if (typeof override === 'string') return slot === 'root' ? override : undefined;\n return override[slot];\n}\n\n/** Resolves the classes for one slot: `base` first, overrides last. */\nexport type SlotResolver<Slot extends string> = (\n slot: Slot | 'root',\n ...base: ClassValue[]\n) => string;\n\n/**\n * Builds the class resolver a component uses for each of its slots.\n *\n * `keys` may list several registry entries (e.g. `['panel', 'contextPanel']`)\n * — they apply in order, so the more specific one wins.\n *\n * The `className` prop is applied to the root slot only, last, so a\n * per-instance class always beats every other source.\n */\nexport function useSlots<Slot extends string = never>(\n keys: WorkspaceComponentKey | WorkspaceComponentKey[],\n local?: WorkspaceSlotOverride<Slot>,\n className?: string,\n): SlotResolver<Slot> {\n const registry = useContext(WorkspaceStylesContext);\n const keyList = Array.isArray(keys) ? keys : [keys];\n\n return (slot, ...base) =>\n twMerge(\n clsx(\n ...base,\n ...keyList.map((key) => pickSlot(registry[key], slot)),\n pickSlot(local, slot),\n slot === 'root' ? className : undefined,\n ),\n );\n}\n","import { clsx, type ClassValue } from 'clsx';\nimport { twMerge } from 'tailwind-merge';\n\nexport function cn(...inputs: ClassValue[]) {\n return twMerge(clsx(inputs));\n}\n","'use client';\n\nimport React from 'react';\nimport { AlertTriangle } from 'lucide-react';\nimport { cn } from './cn';\nimport { Modal, type ModalProps } from './Modal';\nimport { Button } from './Button';\n\n// ── Types ─────────────────────────────────────────────────────────────────────\n\nexport interface ConfirmModalProps {\n open: boolean;\n onClose: () => void;\n onConfirm: () => void | Promise<void>;\n title: string;\n description?: React.ReactNode;\n confirmText?: string;\n cancelText?: string;\n danger?: boolean;\n className?: string;\n /** Forwarded to the underlying `Modal` (see its slots). */\n classNames?: ModalProps['classNames'];\n}\n\n// ── Component ─────────────────────────────────────────────────────────────────\n\nexport const ConfirmModal: React.FC<ConfirmModalProps> = ({\n open,\n onClose,\n onConfirm,\n title,\n description,\n confirmText = 'Confirmer',\n cancelText = 'Annuler',\n danger = false,\n className,\n classNames,\n}) => {\n const [loading, setLoading] = React.useState(false);\n\n const handleConfirm = async () => {\n setLoading(true);\n try {\n await onConfirm();\n } finally {\n setLoading(false);\n onClose();\n }\n };\n\n return (\n <Modal\n open={open}\n onClose={() => {\n if (!loading) onClose();\n }}\n size=\"sm\"\n closeOnBackdropClick={!loading}\n closeOnEscape={!loading}\n hideCloseButton\n zIndexClass=\"z-[120]\"\n className={cn('ws-confirm-modal', className)}\n classNames={classNames}\n >\n <div className=\"ws-confirm-modal__body flex flex-col gap-5 p-6\">\n <div className=\"flex items-start gap-3.5\">\n <div\n className={cn(\n 'flex h-11 w-11 flex-shrink-0 items-center justify-center rounded-full',\n danger ? 'bg-danger-light' : 'bg-primary-light',\n )}\n >\n <AlertTriangle\n size={20}\n className={danger ? 'text-danger' : 'text-primary'}\n />\n </div>\n <div className=\"min-w-0 flex-1 pt-0.5\">\n <h3 className=\"text-text text-base font-semibold\">{title}</h3>\n {description && (\n <div className=\"text-text-secondary mt-1.5 text-sm leading-relaxed\">\n {description}\n </div>\n )}\n </div>\n </div>\n\n <div className=\"flex justify-end gap-2.5\">\n <Button\n variant=\"outline\"\n size=\"sm\"\n onClick={onClose}\n disabled={loading}\n >\n {cancelText}\n </Button>\n <Button\n variant={danger ? 'danger' : 'primary'}\n size=\"sm\"\n loading={loading}\n onClick={handleConfirm}\n >\n {confirmText}\n </Button>\n </div>\n </div>\n </Modal>\n );\n};\n","import React, { useEffect, useId, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { X } from 'lucide-react';\nimport { useWorkspaceThemeAttrs } from '../../theme-context';\nimport { useSlots, type WorkspaceSlotOverride } from '../../styling';\n\n/** Preset width for the centered panel */\nexport type ModalSize =\n | 'sm' | 'md' | 'lg' | 'xl' | '2xl' | '3xl' | '4xl' | '5xl' | '6xl' | '7xl' | 'full';\n\nexport type ModalHeaderVariant = 'strip' | 'plain';\n\nconst MODAL_SIZE_CLASS: Record<ModalSize, string> = {\n sm: 'w-full min-w-0 max-w-sm',\n md: 'w-full min-w-0 max-w-md',\n lg: 'w-full min-w-0 max-w-lg',\n xl: 'w-full min-w-0 max-w-xl',\n '2xl': 'w-full min-w-0 max-w-2xl',\n '3xl': 'w-full min-w-0 max-w-3xl',\n '4xl': 'w-full min-w-0 max-w-4xl',\n '5xl': 'w-full min-w-0 max-w-5xl',\n '6xl': 'w-full min-w-0 max-w-6xl',\n '7xl': 'w-full min-w-0 max-w-7xl',\n full: 'w-full min-w-0 max-w-[calc(100vw-2rem)] sm:max-w-[min(96vw,90rem)]',\n};\n\nexport interface ModalProps {\n open: boolean;\n onClose: () => void;\n children: React.ReactNode;\n zIndexClass?: string;\n backdropClassName?: string;\n size?: ModalSize;\n panelClassName?: string;\n className?: string;\n closeOnBackdropClick?: boolean;\n closeOnEscape?: boolean;\n ariaLabelledBy?: string;\n ariaDescribedBy?: string;\n title?: React.ReactNode;\n description?: React.ReactNode;\n titleIcon?: React.ReactNode;\n headingId?: string;\n modalHeaderVariant?: ModalHeaderVariant;\n hideCloseButton?: boolean;\n headerTrailing?: React.ReactNode;\n closeButtonAriaLabel?: string;\n closeButtonDisabled?: boolean;\n closeButtonClassName?: string;\n closeIconSize?: number;\n headerClassName?: string;\n titleClassName?: string;\n descriptionClassName?: string;\n /**\n * Per-slot style overrides. Applied after the individual `*ClassName` props\n * above (kept for backwards compatibility) and after `config.classNames`.\n */\n classNames?: WorkspaceSlotOverride<\n 'panel' | 'header' | 'title' | 'description' | 'close'\n >;\n}\n\nexport function Modal({\n open,\n onClose,\n children,\n zIndexClass = 'z-[100]',\n backdropClassName = 'bg-black/40 backdrop-blur-sm',\n size,\n panelClassName,\n className,\n closeOnBackdropClick = false,\n closeOnEscape = true,\n ariaLabelledBy: ariaLabelledByProp,\n ariaDescribedBy: ariaDescribedByProp,\n title,\n description,\n titleIcon,\n headingId,\n modalHeaderVariant = 'strip',\n hideCloseButton = false,\n headerTrailing,\n closeButtonAriaLabel = 'Fermer',\n closeButtonDisabled = false,\n closeButtonClassName,\n closeIconSize = 20,\n headerClassName,\n titleClassName,\n descriptionClassName = 'text-text-secondary mt-1 text-sm',\n classNames,\n}: ModalProps) {\n const slot = useSlots('modal', classNames, className);\n const [mounted, setMounted] = useState(false);\n const autoHeadingId = useId();\n const autoDescIdByModal = useId();\n // Re-apply the active theme on the portal root — portals mount on\n // document.body, outside the provider wrapper, so they'd otherwise lose the\n // --ws-* custom properties and the dark color-scheme class.\n const themeAttrs = useWorkspaceThemeAttrs();\n\n const hasHeader = title != null;\n const resolvedHeadingId = headingId ?? ariaLabelledByProp ?? autoHeadingId;\n\n const assignAutoDescriptionId =\n hasHeader &&\n description != null &&\n ariaDescribedByProp === undefined &&\n (typeof description === 'string' || typeof description === 'number');\n\n const resolvedAriaDescribedBy = assignAutoDescriptionId\n ? autoDescIdByModal\n : ariaDescribedByProp;\n\n const resolvedAriaLabelledBy = hasHeader\n ? ariaLabelledByProp ?? resolvedHeadingId\n : ariaLabelledByProp;\n\n useEffect(() => { setMounted(true); }, []);\n\n useEffect(() => {\n if (!open) return;\n const prevOverflow = document.body.style.overflow;\n document.body.style.overflow = 'hidden';\n return () => { document.body.style.overflow = prevOverflow; };\n }, [open]);\n\n useEffect(() => {\n if (!open || !closeOnEscape) return;\n const onKeyDown = (e: KeyboardEvent) => { if (e.key === 'Escape') onClose(); };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [open, closeOnEscape, onClose]);\n\n const defaultCloseClasses =\n closeButtonClassName ?? 'text-text-secondary hover:text-text rounded p-1 transition-colors';\n\n const trailing =\n headerTrailing ??\n (!hideCloseButton ? (\n <button\n type=\"button\"\n disabled={closeButtonDisabled}\n onClick={onClose}\n className={slot(\n 'close',\n 'ws-modal__close',\n defaultCloseClasses,\n closeButtonDisabled && 'opacity-40',\n )}\n aria-label={closeButtonAriaLabel}\n >\n <X size={closeIconSize} />\n </button>\n ) : null);\n\n const descriptionSlot =\n description == null ? null : typeof description === 'string' ||\n typeof description === 'number' ? (\n <p\n id={assignAutoDescriptionId ? autoDescIdByModal : undefined}\n className={slot('description', 'ws-modal__description', descriptionClassName)}\n >\n {description}\n </p>\n ) : (\n description\n );\n\n const headerShellClass =\n modalHeaderVariant === 'strip'\n ? 'border-border flex shrink-0 items-start justify-between gap-3 border-b px-6 py-4'\n : 'mb-4 flex shrink-0 items-start justify-between gap-3';\n\n const modalHeaderMarkup = hasHeader ? (\n <div className={slot('header', 'ws-modal__header', headerShellClass, headerClassName)}>\n <div className=\"flex min-w-0 flex-1 items-start gap-3\">\n {titleIcon != null ? <div className=\"mt-0.5 shrink-0\">{titleIcon}</div> : null}\n <div className=\"min-w-0 flex-1\">\n <h2\n id={resolvedHeadingId}\n className={slot(\n 'title',\n 'ws-modal__title',\n 'text-text text-lg font-semibold',\n titleClassName,\n )}\n >\n {title}\n </h2>\n {descriptionSlot}\n </div>\n </div>\n {trailing ? <div className=\"flex shrink-0 items-start\">{trailing}</div> : null}\n </div>\n ) : null;\n\n if (!mounted || !open) return null;\n\n return createPortal(\n <div\n className={slot(\n 'root',\n 'ws-modal',\n 'fixed inset-0 flex items-center justify-center p-4',\n themeAttrs.className,\n zIndexClass,\n backdropClassName,\n )}\n style={themeAttrs.style}\n onClick={closeOnBackdropClick ? onClose : undefined}\n aria-hidden={false}\n >\n <div\n role=\"dialog\"\n aria-modal=\"true\"\n aria-labelledby={resolvedAriaLabelledBy}\n aria-describedby={resolvedAriaDescribedBy}\n className={slot(\n 'panel',\n 'ws-modal__panel',\n // Solid, opaque panel by default — guarantees the modal is never\n // transparent even if the caller forgets to pass `panelClassName`.\n 'bg-surface text-text border-border relative flex max-h-[calc(100vh-2rem)] w-full min-w-0 flex-col overflow-hidden rounded-2xl border shadow-panel animate-ws-scale-in',\n size ? MODAL_SIZE_CLASS[size] : undefined,\n panelClassName,\n )}\n onClick={(e) => e.stopPropagation()}\n >\n {modalHeaderMarkup}\n {children}\n </div>\n </div>,\n document.body,\n );\n}\n","'use client';\n\nimport React from 'react';\nimport { Loader2 } from 'lucide-react';\nimport { useSlots } from '../../styling';\n\nexport type ButtonVariant =\n | 'primary'\n | 'secondary'\n | 'outline'\n | 'ghost'\n | 'danger'\n | 'subtle';\nexport type ButtonSize = 'xs' | 'sm' | 'md' | 'lg';\n\nexport interface ButtonProps\n extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n variant?: ButtonVariant;\n size?: ButtonSize;\n loading?: boolean;\n fullWidth?: boolean;\n leftIcon?: React.ReactNode;\n rightIcon?: React.ReactNode;\n}\n\nconst VARIANT_CLASSES: Record<ButtonVariant, string> = {\n primary:\n 'bg-primary text-primary-contrast hover:bg-primary-hover border border-transparent shadow-xs',\n secondary:\n 'bg-secondary text-secondary-contrast hover:bg-secondary-hover border border-transparent shadow-xs',\n outline:\n 'bg-surface text-text border border-border hover:bg-bg-subtle hover:border-text-muted/40',\n ghost:\n 'bg-transparent text-text-secondary hover:bg-bg-subtle hover:text-text border border-transparent',\n danger:\n 'bg-danger text-white hover:brightness-95 border border-transparent shadow-xs',\n subtle:\n 'bg-primary-light text-primary hover:bg-primary-light/70 border border-transparent',\n};\n\nconst SIZE_CLASSES: Record<ButtonSize, string> = {\n xs: 'h-7 gap-1 px-2.5 text-xs rounded-lg',\n sm: 'h-9 gap-1.5 px-3.5 text-sm rounded-lg',\n md: 'h-10 gap-2 px-4 text-sm rounded-xl',\n lg: 'h-11 gap-2 px-5 text-[15px] rounded-xl',\n};\n\nexport const Button = React.forwardRef<HTMLButtonElement, ButtonProps>(\n (\n {\n variant = 'primary',\n size = 'md',\n loading = false,\n fullWidth = false,\n leftIcon,\n rightIcon,\n className,\n children,\n disabled,\n type = 'button',\n ...props\n },\n ref,\n ) => {\n const isDisabled = disabled || loading;\n const slot = useSlots('button', undefined, className);\n return (\n <button\n ref={ref}\n type={type}\n disabled={isDisabled}\n data-variant={variant}\n data-size={size}\n className={slot(\n 'root',\n 'ws-button',\n `ws-button--${variant}`,\n `ws-button--${size}`,\n 'inline-flex items-center justify-center font-medium whitespace-nowrap transition-all duration-150',\n 'focus-visible:ring-primary/40 focus-visible:ring-2 focus-visible:outline-none',\n 'active:scale-[0.98]',\n 'disabled:pointer-events-none disabled:opacity-55',\n VARIANT_CLASSES[variant],\n SIZE_CLASSES[size],\n fullWidth && 'w-full',\n )}\n {...props}\n >\n {loading ? (\n <Loader2 className=\"animate-spin\" size={size === 'lg' ? 18 : 16} />\n ) : (\n leftIcon\n )}\n {children}\n {!loading && rightIcon}\n </button>\n );\n },\n);\n\nButton.displayName = 'Button';\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'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'agent "\n <strong>{deleteAgent?.agentName}</strong>" ? 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'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'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'é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'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'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":["import_react","import_lucide_react","import_react","import_react","import_react","EMPTY","import_clsx","import_tailwind_merge","import_react","import_lucide_react","import_react","import_jsx_runtime","import_react","import_lucide_react","import_jsx_runtime","React","import_jsx_runtime","React","import_jsx_runtime","e","import_react","import_lucide_react","import_date_fns","import_locale","import_jsx_runtime","e","import_react","import_lucide_react","import_date_fns","import_locale","import_jsx_runtime","e"]}
|