{"type":"user_prompt","text":"J’aimerais que pour la connexion sur site groupe pour le ka id on configure resend , avec api key re_TDR19pua_EFVzx2Re9vLnpHQH8pc4q1jF, il est valable sur le domaine : groupe-ka.com , j’aimerais que lorsqu’un personnel créer un compte hors Google et Apple Login on lui demande son mail pour valider ensuite que c’est à lui avec envois de confirmation et aussi possibilité de se log tjs sans mot de passe avec envois de mail avec login jeton et aussi si login avec mail et password implanté code de confirmation envoyer par mail pout valider connexion","ts":1787759575444} {"type":"status","state":"running"} {"type":"claude","event":{"type":"system","subtype":"init","cwd":"/Users/simon-pierreboucher/apps/groupe-ka","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","tools":["Task","AskUserQuestion","Bash","CronCreate","CronDelete","CronList","Edit","EnterPlanMode","EnterWorktree","ExitPlanMode","ExitWorktree","Glob","Grep","Monitor","NotebookEdit","PushNotification","Read","RemoteTrigger","ScheduleWakeup","Skill","TaskOutput","TaskStop","TodoWrite","ToolSearch","WebFetch","WebSearch","Write"],"mcp_servers":[{"name":"adminka","status":"connected"}],"model":"claude-fable-5","permissionMode":"default","slash_commands":["update-config","debug","simplify","batch","fewer-permission-prompts","loop","schedule","claude-api","clear","compact","context","cost","heapdump","init","review","security-review","insights","team-onboarding"],"apiKeySource":"ANTHROPIC_API_KEY","claude_code_version":"2.1.117","output_style":"default","agents":["Explore","general-purpose","Plan","statusline-setup"],"skills":["update-config","debug","simplify","batch","fewer-permission-prompts","loop","schedule","claude-api"],"plugins":[],"uuid":"6f00e35a-ab21-4bf7-a190-cec53516c19f","memory_paths":{"auto":"/Users/simon-pierreboucher/.claude/projects/-Users-simon-pierreboucher-apps-groupe-ka/memory/"},"fast_mode_state":"off"}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"ba378fbc-685e-4511-a0bc-748f68a85984","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdRtCc2LywgczCNV88x","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAISqQcKpwEIERgCKkBn/NCCexV/rbbeN1GRRGpH9u5m0oGUlA2hQgijjGcQXb4Vcm7RZl1Qdk9EcnNIPT+Gv5qQ1v3Hh9eJAAuMPNndMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAHel7zUBrABAhIMFixi7viq5nrQr18iGgxS5KINU2EvmzOq1TQiMNVSRJVPMnTtAfVGhlwpr8m2qczpjmzUg/uCUC6mcOPvqzoOFjjFrcLQ+HEJN8INuSquBQPMIB1JQnQMowOI0M8z+ISzfNKFk2QRtFxk8nqmn+FdFj06btcGUs3sU7d3WdT+xcvYknREkjzNfXg8KRe5t0EWk5gNFkC/J29iUE8ZmILKMaXmND6nLI5JcJ99+8DPFuorKep2vc8aKyjdUCmjmDEUxMcguoZ1qMZfsYT/qFJof2n6yecB/a48vX5ZUGdyt2GcmqG5JCt11GwPUGAPmj4RNeDZzI6TwOw2VlgGvR7FjvjUcr/HjZn9U0Ua52FYa8QtT3WDk28amcWOZYW5A8BEq3nsL4JTOkVE04COjXVb0gpa/ubLDrg3KwcrTskPXdK7E7cLCqUtBseMmrA22Ui9RDk4AhAhzioUrP7PbNa7uUyMlcJh5gU7OPtohuYUv2EApGOj4GwYk/qyZXNzSnfPHKqLc0zT1yIUnZEhPCCrlzQT5l0+HuH2DNezAq+nslF/Xr125LK5C6KOJYC3iU8EFoWr7DIYSqykZcCkDF4Zdvxt2YZeNaR37xRhAc+4rCBYRgSLwioeM9doP7ePIBB19l941zpBM0RiOqHvPleH4znieTVsQDd5PwEVXdazKF0b9s/1M2PqWMSf4IjLcapC5wUpvvJYGsZRCpMfKZzEJkA6qEKNyEx3plpee1tgTnGTHsNGNGhn0p38gGOjdevv+t325cjlMq9PxDm9xtLjadiMp1T6kIqu71VS6px6B51wFtAl1n7rOnOgeHE8ocGaZrR42FSUgayQXnoHY6H+tIAOtRzK7K8oYLhneFjns0qsWAztFVOKPyl1L2qVww3xI0CRyEmuKiI4Lppg5NPhWV/sMr1WBgnQMIE7jsAxRYsnVkJ26oczLrCv+zG24lcLpdJBGVlUOpamkO34u8v4kJhfw7UbtRSmnqKFHwr4dZXWh0sFMHrOL44f0Zb+GAE="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":33868,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":33868,"ephemeral_1h_input_tokens":0},"output_tokens":6,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"ff89d37f-823c-4e3d-9256-5909fe794284"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdRtCc2LywgczCNV88x","type":"message","role":"assistant","content":[{"type":"text","text":"Je vais d'abord explorer le système d'authentification KA ID pour comprendre où brancher Resend."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":33868,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":33868,"ephemeral_1h_input_tokens":0},"output_tokens":6,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"31bbf43d-651b-46f6-ac62-1222c5f0d41a"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdRtCc2LywgczCNV88x","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","name":"Agent","input":{"description":"Explorer le système auth KA ID","subagent_type":"Explore","prompt":"Je dois implémenter des fonctionnalités email (via Resend) dans le système d'authentification « KA ID » utilisé par le site groupe-ka. Contexte : nous sommes sur le nœud M3U96b. Le repo groupe-ka est à /Users/simon-pierreboucher/apps/groupe-ka. Il y a peut-être aussi un service central d'auth « KA ID » dans /opt/api-ka (repo api-ka) ou ailleurs.\n\nThoroughness: very thorough.\n\nQuestions auxquelles répondre :\n1. Où est implémentée l'authentification KA ID ? Dans groupe-ka lui-même ou dans api-ka (/opt/api-ka) ? Trouve les fichiers exacts (routes, contrôleurs, modèles) qui gèrent : création de compte (signup/register), login email+mot de passe, login Google, login Apple.\n2. Quelle stack (Node/Express, Python, etc.), quelle base de données (SQLite/Postgres…), quel schéma pour la table users (colonnes email, password_hash, provider, etc.).\n3. Y a-t-il déjà un mécanisme d'envoi d'email quelque part (nodemailer, resend, smtp) ? Cherche « resend », « nodemailer », « smtp », « sendgrid », « mail » dans les deux repos.\n4. Comment le frontend de groupe-ka appelle l'auth (endpoints, pages de login/signup, formulaires). Où sont les pages/composants de connexion.\n5. Comment tournent ces apps (PM2 process names, ports, fichiers .env existants et leurs variables).\n6. Y a-t-il d'autres sites qui utilisent le même KA ID (pour éviter de casser quelque chose) ?\n\nRapporte : chemins de fichiers précis avec numéros de ligne pour les endpoints d'auth, le schéma users, la config .env, les noms PM2 et ports, et tout code email existant. Sois précis et exhaustif — je vais implémenter : vérification d'email à l'inscription, magic link (login sans mot de passe par email), et code de confirmation par email lors du login mot de passe (2FA email)."},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":33868,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":33868,"ephemeral_1h_input_tokens":0},"output_tokens":6,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"cd82ce52-aba1-4a58-b5bd-1aeb9508cfe7"}} {"type":"claude","event":{"type":"system","subtype":"task_started","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Explorer le système auth KA ID","task_type":"local_agent","prompt":"Je dois implémenter des fonctionnalités email (via Resend) dans le système d'authentification « KA ID » utilisé par le site groupe-ka. Contexte : nous sommes sur le nœud M3U96b. Le repo groupe-ka est à /Users/simon-pierreboucher/apps/groupe-ka. Il y a peut-être aussi un service central d'auth « KA ID » dans /opt/api-ka (repo api-ka) ou ailleurs.\n\nThoroughness: very thorough.\n\nQuestions auxquelles répondre :\n1. Où est implémentée l'authentification KA ID ? Dans groupe-ka lui-même ou dans api-ka (/opt/api-ka) ? Trouve les fichiers exacts (routes, contrôleurs, modèles) qui gèrent : création de compte (signup/register), login email+mot de passe, login Google, login Apple.\n2. Quelle stack (Node/Express, Python, etc.), quelle base de données (SQLite/Postgres…), quel schéma pour la table users (colonnes email, password_hash, provider, etc.).\n3. Y a-t-il déjà un mécanisme d'envoi d'email quelque part (nodemailer, resend, smtp) ? Cherche « resend », « nodemailer », « smtp », « sendgrid », « mail » dans les deux repos.\n4. Comment le frontend de groupe-ka appelle l'auth (endpoints, pages de login/signup, formulaires). Où sont les pages/composants de connexion.\n5. Comment tournent ces apps (PM2 process names, ports, fichiers .env existants et leurs variables).\n6. Y a-t-il d'autres sites qui utilisent le même KA ID (pour éviter de casser quelque chose) ?\n\nRapporte : chemins de fichiers précis avec numéros de ligne pour les endpoints d'auth, le schéma users, la config .env, les noms PM2 et ports, et tout code email existant. Sois précis et exhaustif — je vais implémenter : vérification d'email à l'inscription, magic link (login sans mot de passe par email), et code de confirmation par email lors du login mot de passe (2FA email).","uuid":"b24707f2-88bd-4f93-9f28-124f6888ce1e","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"type":"text","text":"Je dois implémenter des fonctionnalités email (via Resend) dans le système d'authentification « KA ID » utilisé par le site groupe-ka. Contexte : nous sommes sur le nœud M3U96b. Le repo groupe-ka est à /Users/simon-pierreboucher/apps/groupe-ka. Il y a peut-être aussi un service central d'auth « KA ID » dans /opt/api-ka (repo api-ka) ou ailleurs.\n\nThoroughness: very thorough.\n\nQuestions auxquelles répondre :\n1. Où est implémentée l'authentification KA ID ? Dans groupe-ka lui-même ou dans api-ka (/opt/api-ka) ? Trouve les fichiers exacts (routes, contrôleurs, modèles) qui gèrent : création de compte (signup/register), login email+mot de passe, login Google, login Apple.\n2. Quelle stack (Node/Express, Python, etc.), quelle base de données (SQLite/Postgres…), quel schéma pour la table users (colonnes email, password_hash, provider, etc.).\n3. Y a-t-il déjà un mécanisme d'envoi d'email quelque part (nodemailer, resend, smtp) ? Cherche « resend », « nodemailer », « smtp », « sendgrid », « mail » dans les deux repos.\n4. Comment le frontend de groupe-ka appelle l'auth (endpoints, pages de login/signup, formulaires). Où sont les pages/composants de connexion.\n5. Comment tournent ces apps (PM2 process names, ports, fichiers .env existants et leurs variables).\n6. Y a-t-il d'autres sites qui utilisent le même KA ID (pour éviter de casser quelque chose) ?\n\nRapporte : chemins de fichiers précis avec numéros de ligne pour les endpoints d'auth, le schéma users, la config .env, les noms PM2 et ports, et tout code email existant. Sois précis et exhaustif — je vais implémenter : vérification d'email à l'inscription, magic link (login sans mot de passe par email), et code de confirmation par email lors du login mot de passe (2FA email)."}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"3bd937ad-2b53-4d06-839f-cbb9e70eb5df","timestamp":"2026-08-26T15:53:13.720Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running find /Users/simon-pierreboucher/apps/groupe-ka -t…","usage":{"total_tokens":8658,"tool_uses":1,"duration_ms":1431},"last_tool_name":"Bash","uuid":"d16b80aa-2a54-4781-aec1-fd0295bd9cf3","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdTB4Pra7ZY3C9B7Wwd","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01FCir25PZLY3DU1aaYF74EK","name":"Bash","input":{"command":"find /Users/simon-pierreboucher/apps/groupe-ka -type f -name \"*.json\" | grep -E \"(package\\.json|tsconfig|vercel)\" | head -20"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":3,"cache_creation_input_tokens":8647,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":8647,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"df08c95b-6c86-4fb6-972f-d9b1c5abe24c"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01FCir25PZLY3DU1aaYF74EK","type":"tool_result","content":"/Users/simon-pierreboucher/apps/groupe-ka/node_modules/pako/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/@alloc/quick-lru/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/tapable/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/styled-jsx/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/@types/pdfkit/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/@types/qrcode/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/@types/react-dom/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/@types/better-sqlite3/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/@types/node/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/@types/react/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/pngjs/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/compiled/is-docker/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/compiled/babel-packages/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/compiled/zod/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/compiled/constants-browserify/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/compiled/anser/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/compiled/browserslist/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/compiled/is-wsl/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/compiled/webpack-sources3/package.json\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/compiled/jest-worker/package.json","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"2d01ff39-7810-43cb-8e95-fae053b6c8de","timestamp":"2026-08-26T15:53:15.444Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading package.json","usage":{"total_tokens":10350,"tool_uses":2,"duration_ms":2858},"last_tool_name":"Read","uuid":"e7118d3a-a8f6-42da-b712-959ec5509257","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdTJT9D6ww354cbSTy7","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01VGrV9J4xwaA7N1EsrbvxCn","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/package.json"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":1686,"cache_read_input_tokens":8647,"cache_creation":{"ephemeral_5m_input_tokens":1686,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"d540ddc7-498a-48a5-afa0-2c2a521407bb"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01VGrV9J4xwaA7N1EsrbvxCn","type":"tool_result","content":"1\t{\n2\t \"name\": \"groupe-ka\",\n3\t \"version\": \"1.0.0\",\n4\t \"private\": true,\n5\t \"author\": \"Simon-Pierre Boucher \",\n6\t \"scripts\": {\n7\t \"dev\": \"next dev\",\n8\t \"build\": \"next build\",\n9\t \"start\": \"next start\",\n10\t \"lint\": \"eslint\"\n11\t },\n12\t \"dependencies\": {\n13\t \"better-sqlite3\": \"^13.0.3\",\n14\t \"jose\": \"^6.2.8\",\n15\t \"next\": \"16.3.0\",\n16\t \"pdfkit\": \"^0.19.1\",\n17\t \"qrcode\": \"^1.5.4\",\n18\t \"react\": \"19.2.8\",\n19\t \"react-dom\": \"19.2.8\",\n20\t \"sharp\": \"^0.35.3\"\n21\t },\n22\t \"devDependencies\": {\n23\t \"@tailwindcss/postcss\": \"^4\",\n24\t \"@types/better-sqlite3\": \"^9.6.0\",\n25\t \"@types/node\": \"^20\",\n26\t \"@types/pdfkit\": \"^0.17.6\",\n27\t \"@types/qrcode\": \"^1.5.6\",\n28\t \"@types/react\": \"^19\",\n29\t \"@types/react-dom\": \"^19\",\n30\t \"tailwindcss\": \"^4\",\n31\t \"typescript\": \"^5\"\n32\t }\n33\t}\n34\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"0aefa9ae-4c0a-4478-aa4f-28aadce45111","timestamp":"2026-08-26T15:53:16.589Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running ls -la /opt/api-ka 2>/dev/null || echo \"Not found…","usage":{"total_tokens":10964,"tool_uses":3,"duration_ms":4257},"last_tool_name":"Bash","uuid":"4bef0f63-9b33-4bba-908b-64d954811876","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdTPRY4vpQFm2EjMGhx","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_0127Zam2VP3Eb98Tf3RLAvao","name":"Bash","input":{"command":"ls -la /opt/api-ka 2>/dev/null || echo \"Not found in /opt/api-ka\""},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":609,"cache_read_input_tokens":10333,"cache_creation":{"ephemeral_5m_input_tokens":609,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"948f38a4-579f-4b54-baed-bf8bdb36b5da"}} {"type":"permission_request","requestId":"a4f7bba39861c5b6","tool":"Bash","input":{"command":"ls -la /opt/api-ka 2>/dev/null || echo \"Not found in /opt/api-ka\""}} {"type":"notice","text":"🔓 Tout autoriser activé — la tâche ira au bout sans autre demande de permission."} {"type":"permission_resolved","requestId":"a4f7bba39861c5b6","allow":true,"always":false} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_0127Zam2VP3Eb98Tf3RLAvao","type":"tool_result","content":"total 120\ndrwxr-xr-x 23 simon-pierreboucher staff 736 Aug 19 00:59 .\ndrwxr-xr-x 5 root wheel 160 Aug 16 18:01 ..\ndrwxr-xr-x 3 simon-pierreboucher staff 96 Aug 16 17:32 .claude\n-rw------- 1 simon-pierreboucher staff 1718 Aug 18 10:45 .env\n-rw-r--r-- 1 simon-pierreboucher staff 867 Aug 23 09:59 .env.example\ndrwxr-xr-x 13 simon-pierreboucher staff 416 Aug 25 23:53 .git\n-rw-r--r-- 1 simon-pierreboucher staff 361 Aug 16 17:36 .gitignore\ndrwxr-xr-x@ 6 simon-pierreboucher staff 192 Aug 17 20:28 .pytest_cache\ndrwxr-xr-x 5 simon-pierreboucher staff 160 Aug 16 17:43 .ruff_cache\n-rw-r--r-- 1 simon-pierreboucher staff 13269 Aug 17 17:37 CLAUDE.md\n-rw-r--r--@ 1 simon-pierreboucher staff 20092 Aug 25 20:58 README.md\n-rw-r--r-- 1 simon-pierreboucher staff 888 Aug 16 17:41 alembic.ini\ndrwxr-xr-x 4 simon-pierreboucher staff 128 Aug 19 03:40 data\ndrwxr-xr-x 4 simon-pierreboucher staff 128 Aug 25 20:58 docs\ndrwxr-xr-x 3 simon-pierreboucher staff 96 Aug 19 00:59 frontend\ndrwxr-xr-x 28 simon-pierreboucher staff 896 Aug 26 04:55 logs\n-rw-r--r-- 1 simon-pierreboucher staff 664 Aug 16 17:43 pyproject.toml\n-rw-r--r--@ 1 simon-pierreboucher staff 483 Aug 17 22:15 requirements.txt\ndrwxr-xr-x 8 simon-pierreboucher staff 256 Aug 17 21:29 scripts\ndrwxr-xr-x 11 simon-pierreboucher staff 352 Aug 18 03:19 src\ndrwxr-xr-x 5 simon-pierreboucher staff 160 Aug 16 17:41 systemd\ndrwxr-xr-x 12 simon-pierreboucher staff 384 Aug 23 09:59 tests\ndrwxr-xr-x@ 8 simon-pierreboucher staff 256 Aug 17 21:28 venv","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"643441ef-6b4f-415c-b2c0-4c64cd187fde","timestamp":"2026-08-26T15:53:27.061Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running find /Users/simon-pierreboucher/apps/groupe-ka -t…","usage":{"total_tokens":11876,"tool_uses":4,"duration_ms":14943},"last_tool_name":"Bash","uuid":"7693bbc9-e5ed-4c67-a6e2-5bb1570e088a","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdUAKXPdQe3tg6SG1tW","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_011tmoo8oCB5FhTgQ2gMEDAs","name":"Bash","input":{"command":"find /Users/simon-pierreboucher/apps/groupe-ka -type f -name \"*.ts\" -o -name \"*.tsx\" -o -name \"*.js\" | grep -E \"(auth|login|signup|api)\" | head -30"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":908,"cache_read_input_tokens":10942,"cache_creation":{"ephemeral_5m_input_tokens":908,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1b782c02-f0ed-4f55-b941-5e238965cc78"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_011tmoo8oCB5FhTgQ2gMEDAs","type":"tool_result","content":"/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/experimental/testmode/proxy/fetch-api.d.ts\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/experimental/testmode/proxy/fetch-api.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/route-matches/pages-api-route-match.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/route-matchers/pages-api-route-matcher.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/route-modules/pages-api/module.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/route-modules/pages-api/module.compiled.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/route-modules/pages-api/module.compiled.d.ts\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/route-matcher-providers/dev/dev-pages-api-route-matcher-provider.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/route-matcher-providers/pages-api-route-matcher-provider.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/route-definitions/pages-api-route-definition.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/api-utils/web.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/api-utils/index.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/api-utils/node/parse-body.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/api-utils/node/try-get-preview-data.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/api-utils/node/api-resolver.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/server/api-utils/get-cookie-parser.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/lib/is-api-route.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/constants.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/server.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/error.react-server.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/link.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/navigation.react-server.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/error.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/script.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/headers.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/router.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/navigation.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/app-dynamic.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/image.js\n/Users/simon-pierreboucher/apps/groupe-ka/node_modules/next/dist/esm/api/og.js","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"e273ec69-21e4-4217-9c1d-3e340ec94aae","timestamp":"2026-08-26T15:53:28.823Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Finding /Users/simon-pierreboucher/apps/groupe-ka/src/**/…","usage":{"total_tokens":13176,"tool_uses":5,"duration_ms":16338},"last_tool_name":"Glob","uuid":"25952483-1cb5-4bf0-8731-7e2326c6068e","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdUHeZ225sqpe2RGJZq","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01TwXCSxrwHsAqW9URR4mqB2","name":"Glob","input":{"pattern":"/Users/simon-pierreboucher/apps/groupe-ka/src/**/*.{ts,tsx,js}"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":1298,"cache_read_input_tokens":11850,"cache_creation":{"ephemeral_5m_input_tokens":1298,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"67418e0d-39d8-4c1c-bed4-eaadce2ad635"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01TwXCSxrwHsAqW9URR4mqB2","type":"tool_result","content":"src/app/api/health/route.ts\nsrc/app/api/auth/logout/route.ts\nsrc/app/api/auth/me/route.ts\nsrc/app/api/auth/google/route.ts\nsrc/app/compte/LogoutButton.tsx\nsrc/app/api/auth/callback/google/route.ts\nsrc/app/api/auth/login/route.ts\nsrc/app/compte/CopyKaId.tsx\nsrc/app/api/profile/avatar/route.ts\nsrc/app/avatars/[kaId]/route.ts\nsrc/app/compte/AvatarEditor.tsx\nsrc/lib/roles.ts\nsrc/app/api/auth/register/route.ts\nsrc/app/api/profile/role/route.ts\nsrc/app/compte/RolePicker.tsx\nsrc/app/api/wallet/pass/route.ts\nsrc/app/api/profile/route.ts\nsrc/app/api/profile/public/route.ts\nsrc/app/api/sso/profile/route.ts\nsrc/app/compte/ProfileForm.tsx\nsrc/app/compte/carte/PrintButton.tsx\nsrc/app/compte/CopyText.tsx\nsrc/app/api/sso/favorites/route.ts\nsrc/app/api/favorites/route.ts\nsrc/app/compte/RemoveFavorite.tsx\nsrc/app/api/auth/apple/route.ts\nsrc/app/api/auth/callback/apple/route.ts\nsrc/lib/auth.ts\nsrc/app/sso/authorize/route.ts\nsrc/app/connexion/AuthForm.tsx\nsrc/app/api/status/tick/route.ts\nsrc/lib/sso.ts\nsrc/app/stats/eco-client.tsx\nsrc/app/api/stats/ecosystem-report/route.ts\nsrc/app/api/stats/report/route.ts\nsrc/lib/ecostats.ts\nsrc/ka/KaFooter.tsx\nsrc/ka/GroupeKaBadge.tsx\nsrc/app/robots.ts\nsrc/app/confidentialite/page.tsx\nsrc/app/u/[kaId]/page.tsx\nsrc/app/telecharger/page.tsx\nsrc/app/connexion/page.tsx\nsrc/app/conditions/page.tsx\nsrc/app/avis/page.tsx\nsrc/app/retrait/page.tsx\nsrc/app/compte/carte/page.tsx\nsrc/app/m/[kaId]/page.tsx\nsrc/app/stats/page.tsx\nsrc/lib/rapports.ts\nsrc/app/rapports/page.tsx\nsrc/app/rapports/[date]/page.tsx\nsrc/app/api/rapports/[date]/pdf/route.ts\nsrc/app/investisseurs/page.tsx\nsrc/app/SearchBar.tsx\nsrc/lib/search.ts\nsrc/app/recherche/page.tsx\nsrc/app/loi-25/page.tsx\nsrc/lib/live.ts\nsrc/app/bots/page.tsx\nsrc/app/agents/page.tsx\nsrc/app/marque/page.tsx\nsrc/app/sitemap.ts\nsrc/lib/status.ts\nsrc/app/status/page.tsx\nsrc/lib/report-stats.ts\nsrc/app/api/stats/catalog/route.ts\nsrc/app/api/stats/report/custom/route.ts\nsrc/ka/stats/kacharts.tsx\nsrc/lib/db.ts\nsrc/app/compte/page.tsx\nsrc/app/compte/ApiTokenCard.tsx\nsrc/app/api/account/token/route.ts\nsrc/app/api/sso/token-verify/route.ts\nsrc/app/UserButton.tsx\nsrc/app/figures.tsx\nsrc/app/page.tsx\nsrc/app/layout.tsx"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"3c057073-ce94-4304-b5f5-2729cf4e005c","timestamp":"2026-08-26T15:53:30.084Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running find /opt/api-ka/src -type f -name \"*.py\" | grep …","usage":{"total_tokens":14340,"tool_uses":6,"duration_ms":19972},"last_tool_name":"Bash","uuid":"20258b7b-c526-458c-a403-3b6ca3f73493","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdUP5UgkXDVZgYsgyo2","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_012e6QLi36WrHvqKgdrk2cJv","name":"Bash","input":{"command":"find /opt/api-ka/src -type f -name \"*.py\" | grep -E \"(auth|user|login|email)\" | head -20"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":1157,"cache_read_input_tokens":13148,"cache_creation":{"ephemeral_5m_input_tokens":1157,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"13636c4c-3390-4ed5-bff4-33dc8e9a70a1"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"find /opt/api-ka/src -type f -name \"*.py\" | grep -E \"(auth|user|login|email)\" | head -20"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_012e6QLi36WrHvqKgdrk2cJv","type":"tool_result","content":"/opt/api-ka/src/api/middleware/kaauth.py\n/opt/api-ka/src/api/routes/auth.py\n/opt/api-ka/src/api/routes/iosauth.py","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"0854c64e-3a3a-4160-8419-861960e42eaa","timestamp":"2026-08-26T15:53:33.733Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/lib/auth.ts","usage":{"total_tokens":14513,"tool_uses":7,"duration_ms":21267},"last_tool_name":"Read","uuid":"d22f27d2-cc27-4d58-8e39-acfa7343f94b","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdUekogRR2QSwjGSkhC","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01BL14iyJQmzRB1K6h4Ki2WS","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/auth.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":164,"cache_read_input_tokens":14305,"cache_creation":{"ephemeral_5m_input_tokens":164,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"c428cffc-bfda-4b33-92d8-e34dfe66fe99"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01BL14iyJQmzRB1K6h4Ki2WS","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// KA ID — sessions (JWT HS256 en témoin HttpOnly) + hachage scrypt.\n3\timport { SignJWT, jwtVerify } from \"jose\";\n4\timport { cookies } from \"next/headers\";\n5\timport crypto from \"crypto\";\n6\timport { findUserById, type UserRow } from \"./db\";\n7\t\n8\texport const SESSION_COOKIE = \"ka_session\";\n9\texport const BASE_URL = process.env.BASE_URL ?? \"https://www.groupe-ka.com\";\n10\t\n11\tfunction secret(): Uint8Array {\n12\t const s = process.env.KA_AUTH_SECRET;\n13\t if (!s) {\n14\t if (process.env.NODE_ENV === \"production\")\n15\t throw new Error(\"KA_AUTH_SECRET manquant\");\n16\t return new TextEncoder().encode(\"ka-dev-secret-non-production\");\n17\t }\n18\t return new TextEncoder().encode(s);\n19\t}\n20\t\n21\t/* ---------- mots de passe (scrypt natif, zéro dépendance) ---------- */\n22\t\n23\texport function hashPassword(password: string): string {\n24\t const salt = crypto.randomBytes(16).toString(\"hex\");\n25\t const hash = crypto.scryptSync(password, salt, 64).toString(\"hex\");\n26\t return `${salt}:${hash}`;\n27\t}\n28\t\n29\texport function verifyPassword(password: string, stored: string): boolean {\n30\t const [salt, hash] = stored.split(\":\");\n31\t if (!salt || !hash) return false;\n32\t const test = crypto.scryptSync(password, salt, 64);\n33\t return crypto.timingSafeEqual(test, Buffer.from(hash, \"hex\"));\n34\t}\n35\t\n36\t/* ---------- sessions ---------- */\n37\t\n38\texport type SessionUser = {\n39\t id: number;\n40\t email: string;\n41\t name: string;\n42\t avatarUrl: string | null;\n43\t hasGoogle: boolean;\n44\t hasApple: boolean;\n45\t hasPassword: boolean;\n46\t kaId: string | null;\n47\t createdAt: string;\n48\t lastLogin: string | null;\n49\t role: string | null;\n50\t};\n51\t\n52\texport async function mintSessionToken(userId: number): Promise {\n53\t return await new SignJWT({ uid: userId })\n54\t .setProtectedHeader({ alg: \"HS256\" })\n55\t .setIssuedAt()\n56\t .setIssuer(BASE_URL)\n57\t .setExpirationTime(\"30d\")\n58\t .sign(secret());\n59\t}\n60\t\n61\texport const sessionCookieOptions = {\n62\t httpOnly: true,\n63\t secure: process.env.NODE_ENV === \"production\",\n64\t sameSite: \"lax\" as const,\n65\t path: \"/\",\n66\t maxAge: 60 * 60 * 24 * 30,\n67\t};\n68\t\n69\texport async function getSessionUser(): Promise {\n70\t const jar = await cookies();\n71\t const token = jar.get(SESSION_COOKIE)?.value;\n72\t if (!token) return null;\n73\t try {\n74\t const { payload } = await jwtVerify(token, secret(), {\n75\t issuer: BASE_URL,\n76\t });\n77\t const row = findUserById(Number(payload.uid)) as UserRow | undefined;\n78\t if (!row) return null;\n79\t return {\n80\t id: row.id,\n81\t email: row.email,\n82\t name: row.name,\n83\t avatarUrl: row.avatar_url,\n84\t hasGoogle: !!row.google_sub,\n85\t hasApple: !!row.apple_sub,\n86\t hasPassword: !!row.password_hash,\n87\t kaId: row.ka_id,\n88\t createdAt: row.created_at,\n89\t lastLogin: row.last_login,\n90\t role: row.role,\n91\t };\n92\t } catch {\n93\t return null;\n94\t }\n95\t}\n96\t\n97\t/* ---------- redirections sûres ---------- */\n98\t\n99\t// N'accepte que les chemins internes (« /compte ») — jamais d'URL absolue,\n100\t// sauf un retour SSO interne déjà validé par /sso/authorize.\n101\texport function safeNext(next: string | null | undefined): string {\n102\t if (!next) return \"/compte\";\n103\t if (next.startsWith(\"/\") && !next.startsWith(\"//\")) return next;\n104\t return \"/compte\";\n105\t}\n106\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a2351e06-e61d-4ec8-89ea-171609f1041c","timestamp":"2026-08-26T15:53:35.000Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/lib/db.ts","usage":{"total_tokens":15992,"tool_uses":8,"duration_ms":22402},"last_tool_name":"Read","uuid":"713e647e-a060-4f4a-ada4-8cc54f1a7a67","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdUk81VVNJrMc3roA8S","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_016n7i3RGjJ5iWJGeDLCoaFr","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":1461,"cache_read_input_tokens":14469,"cache_creation":{"ephemeral_5m_input_tokens":1461,"ephemeral_1h_input_tokens":0},"output_tokens":18,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"58c621da-8da1-48d2-9df3-0deee2ba7ff3"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_016n7i3RGjJ5iWJGeDLCoaFr","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// KA ID — base d'utilisateurs partagée du groupe (SQLite WAL).\n3\timport Database from \"better-sqlite3\";\n4\timport path from \"path\";\n5\timport fs from \"fs\";\n6\timport crypto from \"crypto\";\n7\t\n8\tfunction open() {\n9\t const dbPath =\n10\t process.env.KA_DB_PATH ?? path.join(process.cwd(), \"data\", \"ka-id.db\");\n11\t fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n12\t const db = new Database(dbPath);\n13\t db.pragma(\"journal_mode = WAL\");\n14\t db.exec(`\n15\t CREATE TABLE IF NOT EXISTS users (\n16\t id INTEGER PRIMARY KEY AUTOINCREMENT,\n17\t email TEXT UNIQUE NOT NULL,\n18\t name TEXT NOT NULL,\n19\t avatar_url TEXT,\n20\t password_hash TEXT,\n21\t google_sub TEXT UNIQUE,\n22\t created_at TEXT NOT NULL DEFAULT (datetime('now'))\n23\t );\n24\t `);\n25\t // KA ID — identifiant membre du groupe (« ka- » + 10 chiffres), créé ICI,\n26\t // au hub : les plateformes (Lou·Ka…) le reçoivent via le jeton SSO.\n27\t try {\n28\t db.exec(\"ALTER TABLE users ADD COLUMN ka_id TEXT\");\n29\t } catch {\n30\t /* colonne déjà présente */\n31\t }\n32\t try {\n33\t db.exec(\"ALTER TABLE users ADD COLUMN last_login TEXT\");\n34\t } catch {\n35\t /* colonne déjà présente */\n36\t }\n37\t // Sign in with Apple (2026-08-13) — même rôle que google_sub.\n38\t try {\n39\t db.exec(\"ALTER TABLE users ADD COLUMN apple_sub TEXT\");\n40\t } catch {\n41\t /* colonne déjà présente */\n42\t }\n43\t db.exec(\n44\t \"CREATE UNIQUE INDEX IF NOT EXISTS users_apple_sub ON users(apple_sub)\",\n45\t );\n46\t try {\n47\t db.exec(\"ALTER TABLE users ADD COLUMN role TEXT\");\n48\t } catch {\n49\t /* colonne déjà présente */\n50\t }\n51\t // Profil enrichi (2026-08-13) — saisi sur le hub, LA source de vérité\n52\t // affichée par toutes les plateformes du groupe.\n53\t for (const col of [\n54\t \"bio TEXT\",\n55\t \"city TEXT\",\n56\t \"phone TEXT\",\n57\t \"website TEXT\",\n58\t \"job_title TEXT\",\n59\t \"company TEXT\",\n60\t \"birth_date TEXT\",\n61\t \"socials TEXT\",\n62\t \"public INTEGER DEFAULT 0\",\n63\t ]) {\n64\t try {\n65\t db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n66\t } catch {\n67\t /* colonne déjà présente */\n68\t }\n69\t }\n70\t db.exec(\"CREATE UNIQUE INDEX IF NOT EXISTS users_ka_id ON users(ka_id)\");\n71\t // rattrapage : tout compte existant sans KA ID en reçoit un\n72\t const missing = db\n73\t .prepare(\"SELECT id FROM users WHERE ka_id IS NULL\")\n74\t .all() as { id: number }[];\n75\t for (const row of missing) assignKaId(db, row.id);\n76\t // Favoris unifiés « Mon univers Ka » (2026-08-13) — le hub est LE magasin\n77\t // central : les plateformes poussent/lisent via /api/sso/favorites.\n78\t db.exec(`\n79\t CREATE TABLE IF NOT EXISTS favorites (\n80\t id INTEGER PRIMARY KEY AUTOINCREMENT,\n81\t user_id INTEGER NOT NULL,\n82\t app TEXT NOT NULL,\n83\t item_id TEXT NOT NULL,\n84\t title TEXT NOT NULL,\n85\t subtitle TEXT,\n86\t price_label TEXT,\n87\t image_url TEXT,\n88\t url TEXT,\n89\t meta TEXT,\n90\t created_at TEXT NOT NULL DEFAULT (datetime('now')),\n91\t updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n92\t UNIQUE(user_id, app, item_id)\n93\t );\n94\t CREATE INDEX IF NOT EXISTS favorites_user ON favorites(user_id, app);\n95\t `);\n96\t // Jeton API personnel (2026-08-23) — requis pour consommer l'API produit\n97\t // d'API·Ka (Authorization: Bearer kapi_…). Généré/affiché sur /compte,\n98\t // vérifié par api-ka via /api/sso/token-verify (HMAC).\n99\t for (const col of [\"api_token TEXT\", \"api_token_created TEXT\"]) {\n100\t try {\n101\t db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n102\t } catch {\n103\t /* colonne déjà présente */\n104\t }\n105\t }\n106\t db.exec(\n107\t \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n108\t );\n109\t return db;\n110\t}\n111\t\n112\tfunction randomKaId(): string {\n113\t let digits = \"\";\n114\t for (let i = 0; i < 10; i++)\n115\t digits += Math.floor(Math.random() * 10).toString();\n116\t return `ka-${digits}`;\n117\t}\n118\t\n119\tfunction assignKaId(d: Database.Database, id: number): string {\n120\t for (;;) {\n121\t const kid = randomKaId();\n122\t try {\n123\t d.prepare(\"UPDATE users SET ka_id = ? WHERE id = ?\").run(kid, id);\n124\t return kid;\n125\t } catch {\n126\t /* collision (1 chance sur 10 milliards) : on retente */\n127\t }\n128\t }\n129\t}\n130\t\n131\t/** KA ID d'un compte — l'attribue s'il manque (source de vérité du groupe). */\n132\texport function ensureKaId(id: number): string {\n133\t const row = db.prepare(\"SELECT ka_id FROM users WHERE id = ?\").get(id) as\n134\t | { ka_id: string | null }\n135\t | undefined;\n136\t if (row?.ka_id) return row.ka_id;\n137\t return assignKaId(db, id);\n138\t}\n139\t\n140\t// Singleton (survit au rechargement à chaud en dev).\n141\tconst g = globalThis as unknown as { __kaDb?: Database.Database };\n142\texport const db: Database.Database = g.__kaDb ?? (g.__kaDb = open());\n143\t\n144\texport type UserRow = {\n145\t id: number;\n146\t email: string;\n147\t name: string;\n148\t avatar_url: string | null;\n149\t password_hash: string | null;\n150\t google_sub: string | null;\n151\t apple_sub: string | null;\n152\t ka_id: string | null;\n153\t created_at: string;\n154\t last_login: string | null;\n155\t role: string | null;\n156\t bio: string | null;\n157\t city: string | null;\n158\t phone: string | null;\n159\t website: string | null;\n160\t job_title: string | null;\n161\t company: string | null;\n162\t birth_date: string | null;\n163\t socials: string | null; // JSON {instagram, facebook, x, linkedin, tiktok, youtube}\n164\t public: number;\n165\t api_token: string | null;\n166\t api_token_created: string | null;\n167\t};\n168\t\n169\t// ---------- jeton API personnel (API·Ka) ----------\n170\t\n171\tfunction randomApiToken(): string {\n172\t return \"kapi_\" + crypto.randomBytes(24).toString(\"hex\");\n173\t}\n174\t\n175\t/** Jeton API du compte — le crée s'il manque. */\n176\texport function ensureApiToken(id: number): { token: string; created: string } {\n177\t const row = db\n178\t .prepare(\"SELECT api_token, api_token_created FROM users WHERE id = ?\")\n179\t .get(id) as { api_token: string | null; api_token_created: string | null } | undefined;\n180\t if (row?.api_token)\n181\t return { token: row.api_token, created: row.api_token_created ?? \"\" };\n182\t return rotateApiToken(id);\n183\t}\n184\t\n185\t/** Régénère le jeton API (l'ancien devient immédiatement invalide). */\n186\texport function rotateApiToken(id: number): { token: string; created: string } {\n187\t for (;;) {\n188\t const token = randomApiToken();\n189\t try {\n190\t db.prepare(\n191\t \"UPDATE users SET api_token = ?, api_token_created = datetime('now') WHERE id = ?\",\n192\t ).run(token, id);\n193\t const created = (\n194\t db\n195\t .prepare(\"SELECT api_token_created AS c FROM users WHERE id = ?\")\n196\t .get(id) as { c: string }\n197\t ).c;\n198\t return { token, created };\n199\t } catch {\n200\t /* collision improbable : on retente */\n201\t }\n202\t }\n203\t}\n204\t\n205\texport function findUserByApiToken(token: string): UserRow | undefined {\n206\t if (!/^kapi_[0-9a-f]{48}$/.test(token)) return undefined;\n207\t return db.prepare(\"SELECT * FROM users WHERE api_token = ?\").get(token) as\n208\t | UserRow\n209\t | undefined;\n210\t}\n211\t\n212\texport const SOCIAL_KEYS = [\n213\t \"instagram\",\n214\t \"facebook\",\n215\t \"x\",\n216\t \"linkedin\",\n217\t \"tiktok\",\n218\t \"youtube\",\n219\t] as const;\n220\t\n221\texport function parseSocials(raw: string | null): Record {\n222\t try {\n223\t const obj = JSON.parse(raw ?? \"{}\") as Record;\n224\t const out: Record = {};\n225\t for (const k of SOCIAL_KEYS)\n226\t if (typeof obj[k] === \"string\" && obj[k]) out[k] = obj[k] as string;\n227\t return out;\n228\t } catch {\n229\t return {};\n230\t }\n231\t}\n232\t\n233\texport function ageFromBirthDate(birth: string | null): number | null {\n234\t if (!birth || !/^\\d{4}-\\d{2}-\\d{2}$/.test(birth)) return null;\n235\t const b = new Date(birth + \"T00:00:00Z\");\n236\t if (Number.isNaN(b.getTime())) return null;\n237\t const now = new Date();\n238\t let age = now.getUTCFullYear() - b.getUTCFullYear();\n239\t const m = now.getUTCMonth() - b.getUTCMonth();\n240\t if (m < 0 || (m === 0 && now.getUTCDate() < b.getUTCDate())) age--;\n241\t return age >= 0 && age < 130 ? age : null;\n242\t}\n243\t\n244\t/** Horodate la connexion (appelé à chaque login/register/SSO). */\n245\texport function touchLastLogin(id: number): void {\n246\t db.prepare(\n247\t \"UPDATE users SET last_login = datetime('now') WHERE id = ?\",\n248\t ).run(id);\n249\t}\n250\t\n251\texport function findUserByEmail(email: string): UserRow | undefined {\n252\t return db\n253\t .prepare(\"SELECT * FROM users WHERE email = ?\")\n254\t .get(email.toLowerCase()) as UserRow | undefined;\n255\t}\n256\t\n257\texport function findUserById(id: number): UserRow | undefined {\n258\t return db.prepare(\"SELECT * FROM users WHERE id = ?\").get(id) as\n259\t | UserRow\n260\t | undefined;\n261\t}\n262\t\n263\texport function findUserByGoogleSub(sub: string): UserRow | undefined {\n264\t return db.prepare(\"SELECT * FROM users WHERE google_sub = ?\").get(sub) as\n265\t | UserRow\n266\t | undefined;\n267\t}\n268\t\n269\texport function findUserByAppleSub(sub: string): UserRow | undefined {\n270\t return db.prepare(\"SELECT * FROM users WHERE apple_sub = ?\").get(sub) as\n271\t | UserRow\n272\t | undefined;\n273\t}\n274\t\n275\texport function findUserByKaId(kaId: string): UserRow | undefined {\n276\t return db.prepare(\"SELECT * FROM users WHERE ka_id = ?\").get(kaId) as\n277\t | UserRow\n278\t | undefined;\n279\t}\n280\t\n281\t/* ---------- Favoris unifiés ---------- */\n282\t\n283\texport type FavoriteRow = {\n284\t id: number;\n285\t user_id: number;\n286\t app: string;\n287\t item_id: string;\n288\t title: string;\n289\t subtitle: string | null;\n290\t price_label: string | null;\n291\t image_url: string | null;\n292\t url: string | null;\n293\t meta: string | null;\n294\t created_at: string;\n295\t updated_at: string;\n296\t};\n297\t\n298\texport function upsertFavorite(\n299\t userId: number,\n300\t app: string,\n301\t item: {\n302\t item_id: string;\n303\t title: string;\n304\t subtitle?: string;\n305\t price_label?: string;\n306\t image_url?: string;\n307\t url?: string;\n308\t meta?: unknown;\n309\t },\n310\t): void {\n311\t db.prepare(\n312\t `INSERT INTO favorites (user_id, app, item_id, title, subtitle,\n313\t price_label, image_url, url, meta)\n314\t VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n315\t ON CONFLICT(user_id, app, item_id) DO UPDATE SET\n316\t title = excluded.title, subtitle = excluded.subtitle,\n317\t price_label = excluded.price_label, image_url = excluded.image_url,\n318\t url = excluded.url, meta = excluded.meta,\n319\t updated_at = datetime('now')`,\n320\t ).run(\n321\t userId,\n322\t app,\n323\t item.item_id,\n324\t item.title,\n325\t item.subtitle ?? null,\n326\t item.price_label ?? null,\n327\t item.image_url ?? null,\n328\t item.url ?? null,\n329\t item.meta != null ? JSON.stringify(item.meta) : null,\n330\t );\n331\t}\n332\t\n333\texport function removeFavorite(\n334\t userId: number,\n335\t app: string,\n336\t itemId: string,\n337\t): void {\n338\t db.prepare(\n339\t \"DELETE FROM favorites WHERE user_id = ? AND app = ? AND item_id = ?\",\n340\t ).run(userId, app, itemId);\n341\t}\n342\t\n343\texport function favoritesOf(userId: number, app?: string): FavoriteRow[] {\n344\t return (\n345\t app\n346\t ? db.prepare(\n347\t \"SELECT * FROM favorites WHERE user_id = ? AND app = ? ORDER BY created_at DESC\",\n348\t ).all(userId, app)\n349\t : db.prepare(\n350\t \"SELECT * FROM favorites WHERE user_id = ? ORDER BY created_at DESC\",\n351\t ).all(userId)\n352\t ) as FavoriteRow[];\n353\t}\n354\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"b554ed4f-ad9c-4cca-9abf-bb20793faf42","timestamp":"2026-08-26T15:53:36.130Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/auth/register/route.ts","usage":{"total_tokens":20418,"tool_uses":9,"duration_ms":23957},"last_tool_name":"Read","uuid":"be3323fc-619d-4c32-a041-7898024c613b","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdUq4RcT2Cy5dv6f8xM","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_014UZ17hCiwuYggxrH9zVXLh","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":4422,"cache_read_input_tokens":15930,"cache_creation":{"ephemeral_5m_input_tokens":4422,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"da3d1ff9-8adc-4e0e-a8a2-9f461d693a25"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_014UZ17hCiwuYggxrH9zVXLh","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\timport { NextRequest, NextResponse } from \"next/server\";\n3\timport { db, findUserByEmail, ensureKaId, touchLastLogin } from \"@/lib/db\";\n4\timport { ROLES } from \"@/lib/roles\";\n5\timport {\n6\t hashPassword,\n7\t mintSessionToken,\n8\t SESSION_COOKIE,\n9\t sessionCookieOptions,\n10\t} from \"@/lib/auth\";\n11\t\n12\tconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n13\t\n14\texport async function POST(req: NextRequest) {\n15\t let body: {\n16\t email?: string;\n17\t password?: string;\n18\t name?: string;\n19\t role?: string;\n20\t };\n21\t try {\n22\t body = await req.json();\n23\t } catch {\n24\t return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n25\t }\n26\t const email = (body.email ?? \"\").trim().toLowerCase();\n27\t const password = body.password ?? \"\";\n28\t const name = (body.name ?? \"\").trim();\n29\t\n30\t if (!EMAIL_RE.test(email))\n31\t return NextResponse.json(\n32\t { error: \"Adresse courriel invalide.\" },\n33\t { status: 400 },\n34\t );\n35\t if (password.length < 8)\n36\t return NextResponse.json(\n37\t { error: \"Le mot de passe doit compter au moins 8 caractères.\" },\n38\t { status: 400 },\n39\t );\n40\t if (name.length < 2)\n41\t return NextResponse.json(\n42\t { error: \"Dites-nous au moins votre prénom.\" },\n43\t { status: 400 },\n44\t );\n45\t const role = body.role ?? \"\";\n46\t if (!ROLES[role])\n47\t return NextResponse.json(\n48\t { error: \"Choisissez votre type de compte (utilisateur, fournisseur ou équipe).\" },\n49\t { status: 400 },\n50\t );\n51\t\n52\t if (findUserByEmail(email))\n53\t return NextResponse.json(\n54\t {\n55\t error:\n56\t \"Cette adresse a déjà un KA ID — connectez-vous (ou utilisez « Continuer avec Google » si le compte vient de Google).\",\n57\t },\n58\t { status: 409 },\n59\t );\n60\t\n61\t const info = db\n62\t .prepare(\n63\t \"INSERT INTO users (email, name, password_hash, role) VALUES (?, ?, ?, ?)\",\n64\t )\n65\t .run(email, name, hashPassword(password), role);\n66\t ensureKaId(Number(info.lastInsertRowid));\n67\t touchLastLogin(Number(info.lastInsertRowid));\n68\t\n69\t const res = NextResponse.json({ ok: true });\n70\t res.cookies.set(\n71\t SESSION_COOKIE,\n72\t await mintSessionToken(Number(info.lastInsertRowid)),\n73\t sessionCookieOptions,\n74\t );\n75\t return res;\n76\t}\n77\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"fe5f6fcf-68a4-4618-afae-7f6f999b0e3f","timestamp":"2026-08-26T15:53:37.684Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/auth/login/route.ts","usage":{"total_tokens":21513,"tool_uses":10,"duration_ms":25026},"last_tool_name":"Read","uuid":"426ffb17-59c9-44f3-b407-da41f327ab5d","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdUwXN4yn9AMcx492Th","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_015aiEL5J9vegvyefBqhEsv8","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":1077,"cache_read_input_tokens":20352,"cache_creation":{"ephemeral_5m_input_tokens":1077,"ephemeral_1h_input_tokens":0},"output_tokens":18,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f0716eac-744e-4cef-8d5a-d065251ed591"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_015aiEL5J9vegvyefBqhEsv8","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\timport { NextRequest, NextResponse } from \"next/server\";\n3\timport { findUserByEmail, touchLastLogin } from \"@/lib/db\";\n4\timport {\n5\t verifyPassword,\n6\t mintSessionToken,\n7\t SESSION_COOKIE,\n8\t sessionCookieOptions,\n9\t} from \"@/lib/auth\";\n10\t\n11\texport async function POST(req: NextRequest) {\n12\t let body: { email?: string; password?: string };\n13\t try {\n14\t body = await req.json();\n15\t } catch {\n16\t return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n17\t }\n18\t const email = (body.email ?? \"\").trim().toLowerCase();\n19\t const password = body.password ?? \"\";\n20\t\n21\t const user = findUserByEmail(email);\n22\t if (!user || !user.password_hash) {\n23\t return NextResponse.json(\n24\t {\n25\t error: user\n26\t ? \"Ce KA ID a été créé avec Google — utilisez « Continuer avec Google ».\"\n27\t : \"Courriel ou mot de passe incorrect.\",\n28\t },\n29\t { status: 401 },\n30\t );\n31\t }\n32\t if (!verifyPassword(password, user.password_hash))\n33\t return NextResponse.json(\n34\t { error: \"Courriel ou mot de passe incorrect.\" },\n35\t { status: 401 },\n36\t );\n37\t\n38\t touchLastLogin(user.id);\n39\t const res = NextResponse.json({ ok: true });\n40\t res.cookies.set(\n41\t SESSION_COOKIE,\n42\t await mintSessionToken(user.id),\n43\t sessionCookieOptions,\n44\t );\n45\t return res;\n46\t}\n47\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"dd97cbcb-7ef3-4cb6-b039-4648c128dba7","timestamp":"2026-08-26T15:53:38.751Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/auth/google/route.ts","usage":{"total_tokens":22221,"tool_uses":11,"duration_ms":25858},"last_tool_name":"Read","uuid":"a6650ebd-064a-4c93-8816-bf0ac8719ec3","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdV29RDWihY9biXDDF5","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Nkmivj2ikxcW74dCfX5utJ","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/google/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":684,"cache_read_input_tokens":21429,"cache_creation":{"ephemeral_5m_input_tokens":684,"ephemeral_1h_input_tokens":0},"output_tokens":24,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f06ad3c3-3101-45e2-b0d7-ac5aff6b7217"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Nkmivj2ikxcW74dCfX5utJ","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// Départ du flux Google OAuth : pose state + next en témoins, redirige\n3\t// vers l'écran de consentement Google.\n4\timport { NextRequest, NextResponse } from \"next/server\";\n5\timport crypto from \"crypto\";\n6\timport { BASE_URL, safeNext } from \"@/lib/auth\";\n7\t\n8\texport async function GET(req: NextRequest) {\n9\t const clientId = process.env.GOOGLE_CLIENT_ID;\n10\t if (!clientId) {\n11\t return NextResponse.redirect(\n12\t new URL(\"/connexion?error=google-non-configure\", BASE_URL),\n13\t );\n14\t }\n15\t const next = safeNext(req.nextUrl.searchParams.get(\"next\"));\n16\t const state = crypto.randomBytes(16).toString(\"hex\");\n17\t\n18\t const url = new URL(\"https://accounts.google.com/o/oauth2/v2/auth\");\n19\t url.searchParams.set(\"client_id\", clientId);\n20\t url.searchParams.set(\"redirect_uri\", `${BASE_URL}/api/auth/callback/google`);\n21\t url.searchParams.set(\"response_type\", \"code\");\n22\t url.searchParams.set(\"scope\", \"openid email profile\");\n23\t url.searchParams.set(\"state\", state);\n24\t url.searchParams.set(\"prompt\", \"select_account\");\n25\t\n26\t const res = NextResponse.redirect(url);\n27\t const opts = {\n28\t httpOnly: true,\n29\t secure: process.env.NODE_ENV === \"production\",\n30\t sameSite: \"lax\" as const,\n31\t path: \"/\",\n32\t maxAge: 600,\n33\t };\n34\t res.cookies.set(\"ka_oauth_state\", state, opts);\n35\t res.cookies.set(\"ka_oauth_next\", next, opts);\n36\t return res;\n37\t}\n38\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"01adeb78-5aaf-4052-82ed-a1b9d7802eb6","timestamp":"2026-08-26T15:53:39.583Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/auth/callback/google/route.ts","usage":{"total_tokens":22946,"tool_uses":12,"duration_ms":26727},"last_tool_name":"Read","uuid":"9db86e3d-35eb-4f59-a7cc-83c97c8a33c1","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdV5mCvw5EeWrCmwWBm","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01WbxqJWsdaXsVjM5E8Y58sP","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":701,"cache_read_input_tokens":22113,"cache_creation":{"ephemeral_5m_input_tokens":701,"ephemeral_1h_input_tokens":0},"output_tokens":24,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"3f0f9f8f-c0d0-4f29-8b78-08e9a890d5c9"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01WbxqJWsdaXsVjM5E8Y58sP","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// Retour du flux Google OAuth : échange du code, vérification de\n3\t// l'id_token (JWKS Google), création/liaison du KA ID, ouverture de session.\n4\timport { NextRequest, NextResponse } from \"next/server\";\n5\timport { createRemoteJWKSet, jwtVerify } from \"jose\";\n6\timport { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin } from \"@/lib/db\";\n7\timport {\n8\t BASE_URL,\n9\t mintSessionToken,\n10\t SESSION_COOKIE,\n11\t sessionCookieOptions,\n12\t safeNext,\n13\t} from \"@/lib/auth\";\n14\t\n15\tconst GOOGLE_JWKS = createRemoteJWKSet(\n16\t new URL(\"https://www.googleapis.com/oauth2/v3/certs\"),\n17\t);\n18\t\n19\tfunction fail(reason: string) {\n20\t return NextResponse.redirect(\n21\t new URL(`/connexion?error=${encodeURIComponent(reason)}`, BASE_URL),\n22\t );\n23\t}\n24\t\n25\texport async function GET(req: NextRequest) {\n26\t const clientId = process.env.GOOGLE_CLIENT_ID;\n27\t const clientSecret = process.env.GOOGLE_CLIENT_SECRET;\n28\t if (!clientId || !clientSecret) return fail(\"google-non-configure\");\n29\t\n30\t const code = req.nextUrl.searchParams.get(\"code\");\n31\t const state = req.nextUrl.searchParams.get(\"state\");\n32\t const cookieState = req.cookies.get(\"ka_oauth_state\")?.value;\n33\t const next = safeNext(req.cookies.get(\"ka_oauth_next\")?.value);\n34\t if (!code || !state || !cookieState || state !== cookieState)\n35\t return fail(\"etat-oauth-invalide\");\n36\t\n37\t // Échange code → jetons\n38\t const tokenRes = await fetch(\"https://oauth2.googleapis.com/token\", {\n39\t method: \"POST\",\n40\t headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n41\t body: new URLSearchParams({\n42\t code,\n43\t client_id: clientId,\n44\t client_secret: clientSecret,\n45\t redirect_uri: `${BASE_URL}/api/auth/callback/google`,\n46\t grant_type: \"authorization_code\",\n47\t }),\n48\t });\n49\t if (!tokenRes.ok) return fail(\"echange-google-refuse\");\n50\t const tokens = (await tokenRes.json()) as { id_token?: string };\n51\t if (!tokens.id_token) return fail(\"id-token-absent\");\n52\t\n53\t // Vérification cryptographique de l'id_token\n54\t let claims: {\n55\t sub?: string;\n56\t email?: string;\n57\t email_verified?: boolean;\n58\t name?: string;\n59\t picture?: string;\n60\t };\n61\t try {\n62\t const { payload } = await jwtVerify(tokens.id_token, GOOGLE_JWKS, {\n63\t issuer: [\"https://accounts.google.com\", \"accounts.google.com\"],\n64\t audience: clientId,\n65\t });\n66\t claims = payload as typeof claims;\n67\t } catch {\n68\t return fail(\"id-token-invalide\");\n69\t }\n70\t if (!claims.sub || !claims.email || claims.email_verified === false)\n71\t return fail(\"profil-google-incomplet\");\n72\t\n73\t const email = claims.email.toLowerCase();\n74\t const name = claims.name ?? email.split(\"@\")[0];\n75\t const picture = claims.picture ?? null;\n76\t\n77\t // Upsert : par google_sub, sinon liaison par courriel, sinon création.\n78\t let user = findUserByGoogleSub(claims.sub);\n79\t if (user) {\n80\t db.prepare(\"UPDATE users SET name = ?, avatar_url = ? WHERE id = ?\").run(\n81\t name,\n82\t picture,\n83\t user.id,\n84\t );\n85\t } else {\n86\t const byEmail = findUserByEmail(email);\n87\t if (byEmail) {\n88\t db.prepare(\n89\t \"UPDATE users SET google_sub = ?, avatar_url = COALESCE(?, avatar_url) WHERE id = ?\",\n90\t ).run(claims.sub, picture, byEmail.id);\n91\t user = { ...byEmail, google_sub: claims.sub };\n92\t } else {\n93\t const info = db\n94\t .prepare(\n95\t \"INSERT INTO users (email, name, avatar_url, google_sub) VALUES (?, ?, ?, ?)\",\n96\t )\n97\t .run(email, name, picture, claims.sub);\n98\t user = findUserByGoogleSub(claims.sub)!;\n99\t ensureKaId(user.id);\n100\t void info;\n101\t }\n102\t }\n103\t\n104\t ensureKaId(user!.id);\n105\t touchLastLogin(user!.id);\n106\t const res = NextResponse.redirect(new URL(next, BASE_URL));\n107\t res.cookies.set(\n108\t SESSION_COOKIE,\n109\t await mintSessionToken(user!.id),\n110\t sessionCookieOptions,\n111\t );\n112\t res.cookies.set(\"ka_oauth_state\", \"\", { path: \"/\", maxAge: 0 });\n113\t res.cookies.set(\"ka_oauth_next\", \"\", { path: \"/\", maxAge: 0 });\n114\t return res;\n115\t}\n116\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"21b3b39d-03e5-4b04-8691-17b84d5fb985","timestamp":"2026-08-26T15:53:40.452Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/auth/apple/route.ts","usage":{"total_tokens":24771,"tool_uses":13,"duration_ms":27920},"last_tool_name":"Read","uuid":"e0e00a6d-f319-497e-8a32-d7f10a7e4f91","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdV9SDmfUCgE7EyqPpG","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01MErscGPpEdGujAdqtpLttN","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/apple/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":1808,"cache_read_input_tokens":22814,"cache_creation":{"ephemeral_5m_input_tokens":1808,"ephemeral_1h_input_tokens":0},"output_tokens":18,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"700492ac-6b09-4458-81bb-3b151b9dd7d4"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01MErscGPpEdGujAdqtpLttN","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// Départ du flux Sign in with Apple : pose state + next en témoins,\n3\t// redirige vers l'écran de consentement Apple.\n4\t//\n5\t// ⚠️ Avec les scopes « name email », Apple impose response_mode=form_post :\n6\t// le retour arrive en POST cross-site, donc les témoins d'état doivent être\n7\t// SameSite=None; Secure (Lax ne serait pas renvoyé). Conséquence : le flux\n8\t// exige HTTPS — Apple refuse de toute façon les redirect_uri en http.\n9\timport { NextRequest, NextResponse } from \"next/server\";\n10\timport crypto from \"crypto\";\n11\timport { BASE_URL, safeNext } from \"@/lib/auth\";\n12\t\n13\texport async function GET(req: NextRequest) {\n14\t const clientId = process.env.APPLE_CLIENT_ID;\n15\t if (!clientId) {\n16\t return NextResponse.redirect(\n17\t new URL(\"/connexion?error=apple-non-configure\", BASE_URL),\n18\t );\n19\t }\n20\t const next = safeNext(req.nextUrl.searchParams.get(\"next\"));\n21\t const state = crypto.randomBytes(16).toString(\"hex\");\n22\t\n23\t const url = new URL(\"https://appleid.apple.com/auth/authorize\");\n24\t url.searchParams.set(\"client_id\", clientId);\n25\t url.searchParams.set(\"redirect_uri\", `${BASE_URL}/api/auth/callback/apple`);\n26\t url.searchParams.set(\"response_type\", \"code\");\n27\t url.searchParams.set(\"scope\", \"name email\");\n28\t url.searchParams.set(\"response_mode\", \"form_post\");\n29\t url.searchParams.set(\"state\", state);\n30\t\n31\t const res = NextResponse.redirect(url);\n32\t const opts = {\n33\t httpOnly: true,\n34\t secure: true,\n35\t sameSite: \"none\" as const,\n36\t path: \"/\",\n37\t maxAge: 600,\n38\t };\n39\t res.cookies.set(\"ka_apple_state\", state, opts);\n40\t res.cookies.set(\"ka_apple_next\", next, opts);\n41\t return res;\n42\t}\n43\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"9ff02444-317f-4a46-b414-1112464b38b4","timestamp":"2026-08-26T15:53:41.652Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/auth/callback/apple/route.ts","usage":{"total_tokens":25599,"tool_uses":14,"duration_ms":28769},"last_tool_name":"Read","uuid":"e825e59e-9ea0-48ab-a223-768bdd6f4576","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdVEZHyP47BN6rtKbU5","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01U5MivWKci1feWDrffyKH1Y","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":803,"cache_read_input_tokens":24622,"cache_creation":{"ephemeral_5m_input_tokens":803,"ephemeral_1h_input_tokens":0},"output_tokens":24,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"6d964719-306a-469e-8572-3f2dcc63f675"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01U5MivWKci1feWDrffyKH1Y","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// Retour du flux Sign in with Apple : échange du code, vérification de\n3\t// l'id_token (JWKS Apple), création/liaison du KA ID, ouverture de session.\n4\t//\n5\t// Différences avec Google :\n6\t// - le retour arrive en POST (form_post) et non en GET ;\n7\t// - le client_secret est un JWT ES256 signé avec la clé privée .p8\n8\t// (APPLE_TEAM_ID / APPLE_KEY_ID / APPLE_PRIVATE_KEY), regénéré à chaque\n9\t// échange ;\n10\t// - le nom (`user`) n'est transmis qu'à la PREMIÈRE autorisation ;\n11\t// - email_verified peut être un booléen ou la chaîne \"true\".\n12\timport { NextRequest, NextResponse } from \"next/server\";\n13\timport { createRemoteJWKSet, jwtVerify, SignJWT, importPKCS8 } from \"jose\";\n14\timport {\n15\t db,\n16\t findUserByEmail,\n17\t findUserByAppleSub,\n18\t ensureKaId,\n19\t touchLastLogin,\n20\t} from \"@/lib/db\";\n21\timport {\n22\t BASE_URL,\n23\t mintSessionToken,\n24\t SESSION_COOKIE,\n25\t sessionCookieOptions,\n26\t safeNext,\n27\t} from \"@/lib/auth\";\n28\t\n29\tconst APPLE_JWKS = createRemoteJWKSet(\n30\t new URL(\"https://appleid.apple.com/auth/keys\"),\n31\t);\n32\t\n33\tfunction fail(reason: string) {\n34\t return NextResponse.redirect(\n35\t new URL(`/connexion?error=${encodeURIComponent(reason)}`, BASE_URL),\n36\t // 303 : on répond à un POST par une redirection GET.\n37\t { status: 303 },\n38\t );\n39\t}\n40\t\n41\t/** client_secret Apple : JWT ES256 signé avec la clé .p8, valable 5 min. */\n42\tasync function appleClientSecret(clientId: string): Promise {\n43\t const teamId = process.env.APPLE_TEAM_ID;\n44\t const keyId = process.env.APPLE_KEY_ID;\n45\t const pem = process.env.APPLE_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n46\t if (!teamId || !keyId || !pem) return null;\n47\t const key = await importPKCS8(pem, \"ES256\");\n48\t return await new SignJWT({})\n49\t .setProtectedHeader({ alg: \"ES256\", kid: keyId })\n50\t .setIssuedAt()\n51\t .setIssuer(teamId)\n52\t .setSubject(clientId)\n53\t .setAudience(\"https://appleid.apple.com\")\n54\t .setExpirationTime(\"5m\")\n55\t .sign(key);\n56\t}\n57\t\n58\texport async function POST(req: NextRequest) {\n59\t const clientId = process.env.APPLE_CLIENT_ID;\n60\t if (!clientId) return fail(\"apple-non-configure\");\n61\t const clientSecret = await appleClientSecret(clientId).catch(() => null);\n62\t if (!clientSecret) return fail(\"apple-non-configure\");\n63\t\n64\t const form = await req.formData().catch(() => null);\n65\t if (!form) return fail(\"etat-oauth-invalide\");\n66\t if (form.get(\"error\")) return fail(\"apple-refuse\");\n67\t\n68\t const code = form.get(\"code\")?.toString();\n69\t const state = form.get(\"state\")?.toString();\n70\t const cookieState = req.cookies.get(\"ka_apple_state\")?.value;\n71\t const next = safeNext(req.cookies.get(\"ka_apple_next\")?.value);\n72\t if (!code || !state || !cookieState || state !== cookieState)\n73\t return fail(\"etat-oauth-invalide\");\n74\t\n75\t // Nom complet : transmis par Apple UNIQUEMENT à la première autorisation.\n76\t let firstAuthName: string | null = null;\n77\t try {\n78\t const u = JSON.parse(form.get(\"user\")?.toString() ?? \"\") as {\n79\t name?: { firstName?: string; lastName?: string };\n80\t };\n81\t const full = [u.name?.firstName, u.name?.lastName]\n82\t .filter(Boolean)\n83\t .join(\" \")\n84\t .trim();\n85\t if (full) firstAuthName = full;\n86\t } catch {\n87\t /* pas de champ user (connexions suivantes) */\n88\t }\n89\t\n90\t // Échange code → jetons\n91\t const tokenRes = await fetch(\"https://appleid.apple.com/auth/token\", {\n92\t method: \"POST\",\n93\t headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n94\t body: new URLSearchParams({\n95\t code,\n96\t client_id: clientId,\n97\t client_secret: clientSecret,\n98\t redirect_uri: `${BASE_URL}/api/auth/callback/apple`,\n99\t grant_type: \"authorization_code\",\n100\t }),\n101\t });\n102\t if (!tokenRes.ok) return fail(\"echange-apple-refuse\");\n103\t const tokens = (await tokenRes.json()) as { id_token?: string };\n104\t if (!tokens.id_token) return fail(\"id-token-absent\");\n105\t\n106\t // Vérification cryptographique de l'id_token\n107\t let claims: {\n108\t sub?: string;\n109\t email?: string;\n110\t email_verified?: boolean | string;\n111\t };\n112\t try {\n113\t const { payload } = await jwtVerify(tokens.id_token, APPLE_JWKS, {\n114\t issuer: \"https://appleid.apple.com\",\n115\t audience: clientId,\n116\t });\n117\t claims = payload as typeof claims;\n118\t } catch {\n119\t return fail(\"id-token-invalide\");\n120\t }\n121\t const emailVerified =\n122\t claims.email_verified === true || claims.email_verified === \"true\";\n123\t if (!claims.sub || !claims.email || !emailVerified)\n124\t return fail(\"profil-apple-incomplet\");\n125\t\n126\t const email = claims.email.toLowerCase();\n127\t const name = firstAuthName ?? email.split(\"@\")[0];\n128\t\n129\t // Upsert : par apple_sub, sinon liaison par courriel, sinon création.\n130\t let user = findUserByAppleSub(claims.sub);\n131\t if (!user) {\n132\t const byEmail = findUserByEmail(email);\n133\t if (byEmail) {\n134\t db.prepare(\"UPDATE users SET apple_sub = ? WHERE id = ?\").run(\n135\t claims.sub,\n136\t byEmail.id,\n137\t );\n138\t user = { ...byEmail, apple_sub: claims.sub };\n139\t } else {\n140\t db.prepare(\n141\t \"INSERT INTO users (email, name, apple_sub) VALUES (?, ?, ?)\",\n142\t ).run(email, name, claims.sub);\n143\t user = findUserByAppleSub(claims.sub)!;\n144\t ensureKaId(user.id);\n145\t }\n146\t }\n147\t\n148\t ensureKaId(user.id);\n149\t touchLastLogin(user.id);\n150\t const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });\n151\t res.cookies.set(\n152\t SESSION_COOKIE,\n153\t await mintSessionToken(user.id),\n154\t sessionCookieOptions,\n155\t );\n156\t res.cookies.set(\"ka_apple_state\", \"\", { path: \"/\", maxAge: 0 });\n157\t res.cookies.set(\"ka_apple_next\", \"\", { path: \"/\", maxAge: 0 });\n158\t return res;\n159\t}\n160\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"6d2de892-ffa9-4266-bd1c-8d55e09b7ab3","timestamp":"2026-08-26T15:53:42.493Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/connexion/page.tsx","usage":{"total_tokens":27958,"tool_uses":15,"duration_ms":30206},"last_tool_name":"Read","uuid":"8b1bb839-4a2d-4cf0-a631-106da61e2740","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdVJBpsu4xwmv6rTzvi","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01G2vg6ULSD6RXeeHdMVUAMM","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":2355,"cache_read_input_tokens":25425,"cache_creation":{"ephemeral_5m_input_tokens":2355,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"60154246-f2b9-4096-a63b-acd2145f886e"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01G2vg6ULSD6RXeeHdMVUAMM","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\timport type { Metadata } from \"next\";\n3\timport { redirect } from \"next/navigation\";\n4\timport { getSessionUser, safeNext } from \"@/lib/auth\";\n5\timport { SSO_CLIENTS } from \"@/lib/sso\";\n6\timport AuthForm from \"./AuthForm\";\n7\t\n8\texport const metadata: Metadata = {\n9\t title: \"KA ID — connexion\",\n10\t description:\n11\t \"Un seul compte pour toutes les plateformes du Groupe KA : créez votre KA ID ou continuez avec Google.\",\n12\t};\n13\t\n14\texport default async function Connexion({\n15\t searchParams,\n16\t}: {\n17\t searchParams: Promise<{ next?: string; error?: string; via?: string }>;\n18\t}) {\n19\t const sp = await searchParams;\n20\t const next = safeNext(sp.next);\n21\t\n22\t // Déjà connecté (et pas de retour SSO en attente) → profil.\n23\t if (!sp.error) {\n24\t const user = await getSessionUser();\n25\t if (user) redirect(next);\n26\t }\n27\t\n28\t const viaLabel = sp.via ? (SSO_CLIENTS[sp.via]?.label ?? sp.via) : undefined;\n29\t\n30\t return (\n31\t
\n32\t
\n33\t

\n34\t KA ID · un compte, sept plateformes\n35\t

\n36\t

\n37\t Un seul ·Ka pour tout\n38\t

\n39\t

\n40\t Votre KA ID vous suit sur Lou·Ka, Immo·Ka, Vrai-Prix, ValoPlex,\n41\t Auto·Ka, Fabri·Ka et Food·Ka. Même profil partout — c'est\n42\t l'agrégation, appliquée à vous-même.\n43\t

\n44\t
\n45\t
\n46\t \n47\t
\n48\t
\n49\t );\n50\t}\n51\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1b08aa82-97cd-4e40-927f-d4902bc01229","timestamp":"2026-08-26T15:53:43.932Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/connexion/AuthForm.tsx","usage":{"total_tokens":28924,"tool_uses":16,"duration_ms":31106},"last_tool_name":"Read","uuid":"6108aeb6-f580-4324-b4df-2b78d0d43ab7","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdVQXpWSc61bVG7RfjN","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01KEh8mfVxhqcexoyYqZzziA","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":941,"cache_read_input_tokens":27780,"cache_creation":{"ephemeral_5m_input_tokens":941,"ephemeral_1h_input_tokens":0},"output_tokens":25,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"c031438b-4245-4c7f-b22e-c430b7be99ec"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01KEh8mfVxhqcexoyYqZzziA","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t\"use client\";\n3\t\n4\timport { useState } from \"react\";\n5\timport { ROLES } from \"@/lib/roles\";\n6\t\n7\tconst ERRORS: Record = {\n8\t \"google-non-configure\":\n9\t \"La connexion Google n'est pas encore activée sur ce serveur.\",\n10\t \"etat-oauth-invalide\":\n11\t \"La session Google a expiré — réessayez.\",\n12\t \"echange-google-refuse\": \"Google a refusé l'échange — réessayez.\",\n13\t \"id-token-absent\": \"Réponse Google incomplète — réessayez.\",\n14\t \"id-token-invalide\": \"Réponse Google invalide — réessayez.\",\n15\t \"profil-google-incomplet\":\n16\t \"Votre compte Google n'a pas de courriel vérifié.\",\n17\t \"apple-non-configure\":\n18\t \"La connexion Apple n'est pas encore activée sur ce serveur.\",\n19\t \"apple-refuse\": \"La connexion Apple a été annulée — réessayez.\",\n20\t \"echange-apple-refuse\": \"Apple a refusé l'échange — réessayez.\",\n21\t \"profil-apple-incomplet\":\n22\t \"Votre compte Apple n'a pas de courriel vérifié.\",\n23\t};\n24\t\n25\texport default function AuthForm({\n26\t next,\n27\t error,\n28\t via,\n29\t}: {\n30\t next: string;\n31\t error?: string;\n32\t via?: string;\n33\t}) {\n34\t const [mode, setMode] = useState<\"login\" | \"register\">(\"login\");\n35\t const [msg, setMsg] = useState(\n36\t error ? (ERRORS[error] ?? \"Une erreur est survenue — réessayez.\") : null,\n37\t );\n38\t const [busy, setBusy] = useState(false);\n39\t\n40\t async function submit(e: React.FormEvent) {\n41\t e.preventDefault();\n42\t setBusy(true);\n43\t setMsg(null);\n44\t const fd = new FormData(e.currentTarget);\n45\t const body = Object.fromEntries(fd.entries());\n46\t const res = await fetch(`/api/auth/${mode}`, {\n47\t method: \"POST\",\n48\t headers: { \"Content-Type\": \"application/json\" },\n49\t body: JSON.stringify(body),\n50\t });\n51\t const data = await res.json().catch(() => ({}));\n52\t if (res.ok) {\n53\t window.location.href = next;\n54\t } else {\n55\t setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n56\t setBusy(false);\n57\t }\n58\t }\n59\t\n60\t return (\n61\t
\n62\t {via && (\n63\t

\n64\t \n65\t Connexion demandée par {via} — vous y retournerez automatiquement\n66\t

\n67\t )}\n68\t\n69\t \n73\t {/* « G » officiel Google — couleurs de marque */}\n74\t \n75\t \n79\t \n83\t \n87\t \n91\t \n92\t Continuer avec Google\n93\t \n94\t\n95\t \n99\t {/* Pomme Apple — blanche sur noir, style officiel */}\n100\t \n101\t \n105\t \n106\t Continuer avec Apple\n107\t \n108\t\n109\t
\n110\t \n111\t ou par courriel\n112\t \n113\t
\n114\t\n115\t
\n116\t {(\n117\t [\n118\t [\"login\", \"Se connecter\"],\n119\t [\"register\", \"Créer un compte\"],\n120\t ] as const\n121\t ).map(([m, label]) => (\n122\t {\n127\t setMode(m);\n128\t setMsg(null);\n129\t }}\n130\t className={`btn ${mode === m ? \"btn-lime\" : \"btn-ghost\"} !min-h-[40px] !text-[13px]`}\n131\t type=\"button\"\n132\t >\n133\t {label}\n134\t \n135\t ))}\n136\t
\n137\t\n138\t
\n139\t {mode === \"register\" && (\n140\t <>\n141\t \n153\t
\n154\t Vous êtes…\n155\t
\n156\t {Object.entries(ROLES).map(([value, r]) => (\n157\t \n161\t \n168\t \n169\t \n170\t {r.label}\n171\t \n172\t \n173\t {r.desc}\n174\t \n175\t \n176\t \n177\t ))}\n178\t
\n179\t

\n180\t Ce statut sera affiché sur votre carte de membre.\n181\t

\n182\t
\n183\t \n184\t )}\n185\t \n196\t \n210\t\n211\t {msg && (\n212\t

\n213\t {msg}\n214\t

\n215\t )}\n216\t\n217\t \n224\t
\n225\t\n226\t

\n227\t Un seul compte — le KA ID —\n228\t pour toutes les plateformes du groupe. En continuant, vous acceptez\n229\t les{\" \"}\n230\t \n231\t conditions d'utilisation\n232\t {\" \"}\n233\t et la{\" \"}\n234\t \n235\t politique de confidentialité\n236\t \n237\t .\n238\t

\n239\t
\n240\t );\n241\t}\n242\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"79735fbb-30bd-4b08-a75c-7f7b84686636","timestamp":"2026-08-26T15:53:44.833Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running grep -r \"resend\\|nodemailer\\|smtp\\|sendgrid\\|emai…","usage":{"total_tokens":32803,"tool_uses":17,"duration_ms":32874},"last_tool_name":"Bash","uuid":"ac20e3cb-0615-439d-b8c7-8c17029e4466","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdVU8chTLVXeys47XiG","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01HD5dKTtdkE5LyHKnzGnTVr","name":"Bash","input":{"command":"grep -r \"resend\\|nodemailer\\|smtp\\|sendgrid\\|email\\|mail\" /Users/simon-pierreboucher/apps/groupe-ka/package.json 2>/dev/null | head -20"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":3875,"cache_read_input_tokens":28721,"cache_creation":{"ephemeral_5m_input_tokens":3875,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"e11c8c92-b1eb-470f-bb52-871bd07f6df4"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01HD5dKTtdkE5LyHKnzGnTVr","type":"tool_result","content":"(Bash completed with no output)","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"316a62c8-6e5c-4a9c-a27c-e3967945b465","timestamp":"2026-08-26T15:53:46.629Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading /opt/api-ka/requirements.txt","usage":{"total_tokens":32957,"tool_uses":18,"duration_ms":34222},"last_tool_name":"Read","uuid":"30147770-779d-432f-b1b4-30a70c6fb625","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdVbrD2dTvirYybNkfA","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Gf8h96qq4D9QoaaPpRHAwG","name":"Read","input":{"file_path":"/opt/api-ka/requirements.txt"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":147,"cache_read_input_tokens":32596,"cache_creation":{"ephemeral_5m_input_tokens":147,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"c4531d3b-ebd2-41de-8328-57e32a589222"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Gf8h96qq4D9QoaaPpRHAwG","type":"tool_result","content":"1\t# ============================================\n2\t# Projet : API-KA\n3\t# Fichier : requirements.txt\n4\t# Node : m3u96b\n5\t# Author : Simon-Pierre Boucher\n6\t# Contact : contact@spboucher.ai\n7\t# Date : 2026-08-16\n8\t# ============================================\n9\t\n10\tfastapi>=0.115\n11\tuvicorn[standard]>=0.30\n12\tsqlalchemy>=2.0\n13\tpsycopg2-binary>=2.9\n14\talembic>=1.13\n15\tapscheduler>=3.10\n16\thttpx>=0.27\n17\tpython-dotenv>=1.0\n18\tfpdf2>=2.8\n19\t\n20\t# Développement / tests\n21\tpytest>=8.0\n22\tblack>=24.0\n23\truff>=0.5\n24\tanthropic>=0.40\n25\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f0aafb69-1396-4f68-9958-e26905a0b8ef","timestamp":"2026-08-26T15:53:47.949Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading /opt/api-ka/src/api/routes/auth.py","usage":{"total_tokens":33378,"tool_uses":19,"duration_ms":35383},"last_tool_name":"Read","uuid":"4bc2c9f7-d480-469c-9690-e1dfdbbd168d","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdVhZkX3SqZ264PMMAZ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_019xwJ8RNyM7zq8neizRFUQk","name":"Read","input":{"file_path":"/opt/api-ka/src/api/routes/auth.py"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":416,"cache_read_input_tokens":32743,"cache_creation":{"ephemeral_5m_input_tokens":416,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"75e6db72-aea2-4361-8892-2ae3c6f00a88"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_019xwJ8RNyM7zq8neizRFUQk","type":"tool_result","content":"1\t# ============================================\n2\t# Projet : API-KA\n3\t# Fichier : src/api/routes/auth.py\n4\t# Node : m3u96b\n5\t# Author : Simon-Pierre Boucher\n6\t# Contact : contact@spboucher.ai\n7\t# Date : 2026-08-17\n8\t# ============================================\n9\t\"\"\"« Se connecter avec KA ID » — connexion déléguée au hub d'identité du\n10\tGroupe KA (groupe-ka.com), calquée sur creaka/auth.py (stdlib pur pour la\n11\tcrypto, httpx pour le profil).\n12\t\n13\tFlux : GET /api/auth/ka/login → hub {KA_HUB_URL}/sso/authorize (state signé)\n14\t GET /api/auth/ka/callback → vérifie le JWT HS256 ``ka_token`` du hub\n15\t (aud=\"api-ka\"), pose le cookie de session signé ``apika_session``\n16\t GET /api/auth/me · POST /api/auth/logout · GET /api/auth/config\n17\t\n18\tSession SANS stockage local (aucune table users) : le hub est LA source de\n19\tvérité du profil (fetch signé HMAC, cache 60 s).\n20\t.env : KA_SSO_SECRET (partagé avec le hub), SESSION_SECRET,\n21\t KA_HUB_URL, APIKA_BASE_URL (optionnel — sinon dérivé de NGROK_DOMAIN).\n22\t\"\"\"\n23\t\n24\tfrom __future__ import annotations\n25\t\n26\timport base64\n27\timport hashlib\n28\timport hmac\n29\timport json\n30\timport os\n31\timport secrets\n32\timport time\n33\tfrom urllib.parse import urlencode\n34\t\n35\timport httpx\n36\tfrom fastapi import APIRouter, HTTPException, Request\n37\tfrom fastapi.responses import JSONResponse, RedirectResponse\n38\t\n39\trouter = APIRouter(prefix=\"/api/auth\", tags=[\"auth\"])\n40\t\n41\tCLIENT_ID = \"api-ka\"\n42\tCOOKIE = \"apika_session\"\n43\tSESSION_DAYS = 30\n44\t\n45\t\n46\tdef _hub_url() -> str:\n47\t return os.environ.get(\"KA_HUB_URL\", \"https://www.groupe-ka.com\").rstrip(\"/\")\n48\t\n49\t\n50\t_profile_cache: dict[str, tuple[float, dict | None]] = {}\n51\t_PROFILE_TTL = 60.0\n52\t\n53\t\n54\tdef _secret() -> bytes:\n55\t \"\"\"Secret de session local — SESSION_SECRET, sinon dérivé de KA_SSO_SECRET.\"\"\"\n56\t s = os.environ.get(\"SESSION_SECRET\") or os.environ.get(\"KA_SSO_SECRET\")\n57\t if not s:\n58\t raise HTTPException(503, \"SESSION_SECRET / KA_SSO_SECRET manquant (voir .env)\")\n59\t return s.encode()\n60\t\n61\t\n62\tdef _ka_secret() -> bytes | None:\n63\t s = os.environ.get(\"KA_SSO_SECRET\")\n64\t return s.encode() if s else None\n65\t\n66\t\n67\tdef _base_url(request: Request) -> str:\n68\t \"\"\"URL publique de l'app — APIKA_BASE_URL, sinon https://{NGROK_DOMAIN}.\"\"\"\n69\t explicit = os.environ.get(\"APIKA_BASE_URL\")\n70\t if explicit:\n71\t return explicit.rstrip(\"/\")\n72\t domain = os.environ.get(\"NGROK_DOMAIN\")\n73\t if domain:\n74\t return f\"https://{domain}\"\n75\t return str(request.base_url).rstrip(\"/\")\n76\t\n77\t\n78\t# -- jeton signé maison (payload JSON -> base64url.signature) -------------------\n79\t\n80\t\n81\tdef _sign(payload: dict) -> str:\n82\t raw = (\n83\t base64.urlsafe_b64encode(json.dumps(payload, separators=(\",\", \":\")).encode())\n84\t .decode()\n85\t .rstrip(\"=\")\n86\t )\n87\t sig = hmac.new(_secret(), raw.encode(), hashlib.sha256).hexdigest()\n88\t return f\"{raw}.{sig}\"\n89\t\n90\t\n91\tdef _verify(token: str) -> dict | None:\n92\t try:\n93\t raw, sig = token.rsplit(\".\", 1)\n94\t expected = hmac.new(_secret(), raw.encode(), hashlib.sha256).hexdigest()\n95\t if not hmac.compare_digest(sig, expected):\n96\t return None\n97\t payload = json.loads(base64.urlsafe_b64decode(raw + \"=\" * (-len(raw) % 4)))\n98\t if payload.get(\"exp\", 0) < time.time():\n99\t return None\n100\t return payload\n101\t except Exception:\n102\t return None\n103\t\n104\t\n105\tdef current_user(request: Request) -> dict | None:\n106\t \"\"\"Payload de session ({ka_id, email, name, picture…}) ou None.\"\"\"\n107\t token = request.cookies.get(COOKIE)\n108\t return _verify(token) if token else None\n109\t\n110\t\n111\t# -- vérification du JWT HS256 émis par le hub (stdlib seulement) ---------------\n112\t\n113\t\n114\tdef _b64url(s: str) -> bytes:\n115\t return base64.urlsafe_b64decode(s + \"=\" * (-len(s) % 4))\n116\t\n117\t\n118\tdef _verify_ka_token(token: str) -> dict | None:\n119\t secret = _ka_secret()\n120\t if not secret:\n121\t return None\n122\t try:\n123\t h_b64, p_b64, s_b64 = token.split(\".\")\n124\t expected = hmac.new(secret, f\"{h_b64}.{p_b64}\".encode(), hashlib.sha256).digest()\n125\t if not hmac.compare_digest(_b64url(s_b64), expected):\n126\t return None\n127\t if json.loads(_b64url(h_b64)).get(\"alg\") != \"HS256\":\n128\t return None\n129\t claims = json.loads(_b64url(p_b64))\n130\t if claims.get(\"iss\") != _hub_url():\n131\t return None\n132\t aud = claims.get(\"aud\")\n133\t if (aud if isinstance(aud, str) else \"\") != CLIENT_ID and CLIENT_ID not in (\n134\t aud if isinstance(aud, list) else []\n135\t ):\n136\t return None\n137\t if claims.get(\"exp\", 0) < time.time():\n138\t return None\n139\t return claims\n140\t except Exception:\n141\t return None\n142\t\n143\t\n144\t# -- profil dicté par le hub (source de vérité, cache 60 s) ---------------------\n145\t\n146\t\n147\tdef fetch_hub_profile(ka_id: str) -> dict | None:\n148\t \"\"\"GET signé {hub}/api/sso/profile — sig = HMAC(secret, client.ka_id.ts).\"\"\"\n149\t secret = _ka_secret()\n150\t if not secret or not ka_id:\n151\t return None\n152\t now = time.time()\n153\t hit = _profile_cache.get(ka_id)\n154\t if hit and now - hit[0] < _PROFILE_TTL:\n155\t return hit[1]\n156\t ts = str(int(now))\n157\t sig = hmac.new(secret, f\"{CLIENT_ID}.{ka_id}.{ts}\".encode(), hashlib.sha256).hexdigest()\n158\t profile = None\n159\t try:\n160\t resp = httpx.get(\n161\t f\"{_hub_url()}/api/sso/profile\",\n162\t params={\"client_id\": CLIENT_ID, \"ka_id\": ka_id, \"ts\": ts, \"sig\": sig},\n163\t timeout=8,\n164\t )\n165\t if resp.status_code == 200:\n166\t profile = resp.json()\n167\t except Exception:\n168\t pass\n169\t _profile_cache[ka_id] = (now, profile) # cache positif ET négatif\n170\t return profile\n171\t\n172\t\n173\t# -- routes ---------------------------------------------------------------------\n174\t\n175\t\n176\t@router.get(\"/config\")\n177\tdef auth_config():\n178\t return {\"ka\": bool(_ka_secret())}\n179\t\n180\t\n181\t@router.get(\"/ka/login\")\n182\tdef ka_login(request: Request):\n183\t \"\"\"Départ SSO : envoie l'utilisateur au hub KA ID (groupe-ka.com).\"\"\"\n184\t if not _ka_secret():\n185\t raise HTTPException(503, \"KA_SSO_SECRET manquant (voir .env)\")\n186\t state = _sign({\"n\": secrets.token_urlsafe(12), \"exp\": time.time() + 600})\n187\t params = {\n188\t \"client_id\": CLIENT_ID,\n189\t \"redirect_uri\": f\"{_base_url(request)}/api/auth/ka/callback\",\n190\t \"state\": state,\n191\t }\n192\t return RedirectResponse(f\"{_hub_url()}/sso/authorize?{urlencode(params)}\")\n193\t\n194\t\n195\t@router.get(\"/ka/callback\")\n196\tdef ka_callback(request: Request, ka_token: str = \"\", state: str = \"\"):\n197\t \"\"\"Retour SSO : vérifie le jeton du hub, pose le cookie de session API-KA.\n198\t\n199\t Aucune table users locale : le KA ID du hub EST l'identité — la session\n200\t transporte les claims utiles, le profil riche est relu au hub à la demande.\n201\t \"\"\"\n202\t if not ka_token or _verify(state) is None:\n203\t raise HTTPException(400, \"state invalide ou expiré\")\n204\t claims = _verify_ka_token(ka_token)\n205\t if claims is None:\n206\t raise HTTPException(401, \"jeton KA invalide ou expiré\")\n207\t session = _sign(\n208\t {\n209\t \"ka_id\": (claims.get(\"ka_id\") or \"\").strip(),\n210\t \"sub\": str(claims.get(\"sub\") or \"\"),\n211\t \"email\": (claims.get(\"email\") or \"\").lower(),\n212\t \"name\": claims.get(\"name\") or \"membre\",\n213\t \"picture\": claims.get(\"picture\") or \"\",\n214\t \"role\": claims.get(\"ka_role\") or \"\",\n215\t \"exp\": time.time() + SESSION_DAYS * 86400,\n216\t }\n217\t )\n218\t resp = RedirectResponse(\"/\")\n219\t resp.set_cookie(\n220\t COOKIE,\n221\t session,\n222\t max_age=SESSION_DAYS * 86400,\n223\t httponly=True,\n224\t secure=_base_url(request).startswith(\"https\"),\n225\t samesite=\"lax\",\n226\t path=\"/\",\n227\t )\n228\t return resp\n229\t\n230\t\n231\t@router.get(\"/me\")\n232\tdef me(request: Request):\n233\t user = current_user(request)\n234\t if user is None:\n235\t raise HTTPException(401, \"non connecté\")\n236\t out = {\n237\t \"provider\": \"ka-id\",\n238\t **{k: user.get(k) for k in (\"ka_id\", \"email\", \"name\", \"picture\", \"role\")},\n239\t }\n240\t profile = fetch_hub_profile(user.get(\"ka_id\") or \"\")\n241\t if profile: # le hub dicte le profil (nom/photo/rôle à jour)\n242\t out.update(\n243\t {\n244\t k: profile.get(k)\n245\t for k in (\n246\t \"name\",\n247\t \"picture\",\n248\t \"role\",\n249\t \"role_label\",\n250\t \"bio\",\n251\t \"city\",\n252\t \"job_title\",\n253\t \"company\",\n254\t \"website\",\n255\t \"public_url\",\n256\t )\n257\t if profile.get(k) not in (None, \"\")\n258\t }\n259\t )\n260\t return out\n261\t\n262\t\n263\t@router.post(\"/logout\")\n264\tdef logout():\n265\t resp = JSONResponse({\"ok\": True})\n266\t resp.delete_cookie(COOKIE, path=\"/\")\n267\t return resp\n268\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f90f2e58-773a-4e1d-9af9-5ed616b3f052","timestamp":"2026-08-26T15:53:49.108Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading /opt/api-ka/.env.example","usage":{"total_tokens":37014,"tool_uses":20,"duration_ms":36779},"last_tool_name":"Read","uuid":"b73b2feb-0175-4c61-92f3-a83f38848a7a","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdVnTvtp3XeyTYb4shz","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01RLPKSWv9QXTWNoFX6NqVE7","name":"Read","input":{"file_path":"/opt/api-ka/.env.example"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":3633,"cache_read_input_tokens":33159,"cache_creation":{"ephemeral_5m_input_tokens":3633,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"e3dfc449-75db-4784-b823-7b62700c7cef"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01RLPKSWv9QXTWNoFX6NqVE7","type":"tool_result","content":"1\t# ============================================\n2\t# Projet : API-KA\n3\t# Fichier : .env.example\n4\t# Node : m3u96b\n5\t# Author : Simon-Pierre Boucher\n6\t# Contact : contact@spboucher.ai\n7\t# Date : 2026-08-16\n8\t# ============================================\n9\t# Copier ce fichier vers .env sur m3u96b et remplir les valeurs.\n10\t# Ne JAMAIS commiter le fichier .env.\n11\t\n12\tAPP_ENV=production\n13\tNODE_NAME=m3u96b\n14\tDATABASE_URL=postgresql://apika_user:@localhost:5432/apika\n15\tNGROK_AUTHTOKEN=\n16\tNGROK_DOMAIN=www.api-ka.com\n17\tAPI_PORT=8000\n18\tDAILY_RUN_HOUR=02\n19\tBACKUP_RETENTION_DAYS=90\n20\tRATE_LIMIT_PER_MINUTE=120\n21\tTROUVEKA_SEARCH_URL=https://www.trouve-ka.com/api/search\n22\tTROUVEKA_SUGGEST_URL=https://www.trouve-ka.com/api/suggest\n23\tLOUKA_SOURCE_URL=\n24\tIMMOKA_SOURCE_URL=\n25\tFOODKA_SOURCE_URL=\n26\tAUTOKA_SOURCE_URL=\n27\tFABRIKA_SOURCE_URL=\n28\tRESTOKA_SOURCE_URL=\n29\tSORTIKA_SOURCE_URL=\n30\tCREAKA_SOURCE_URL=\n31\tJOBKA_SOURCE_URL=\n32\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"7aa58534-fa6d-4ab4-aab0-664fcb35bad2","timestamp":"2026-08-26T15:53:50.504Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running grep -r \"KA_AUTH_SECRET\\|KA_SSO_SECRET\\|GOOGLE_CL…","usage":{"total_tokens":37608,"tool_uses":21,"duration_ms":38248},"last_tool_name":"Bash","uuid":"25a22dc3-9be7-4d1d-9299-3fdfe64b23c9","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdVtQN3AkmvwgbYqYxr","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01CujjqrLYyARtYW9TNwEcSD","name":"Bash","input":{"command":"grep -r \"KA_AUTH_SECRET\\|KA_SSO_SECRET\\|GOOGLE_CLIENT\\|APPLE_CLIENT\" /opt/api-ka/.env 2>/dev/null | head -20"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":589,"cache_read_input_tokens":36792,"cache_creation":{"ephemeral_5m_input_tokens":589,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"bf0b7bdd-5a31-4463-ad04-7212408b2368"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"grep -r \"KA_AUTH_SECRET\\|KA_SSO_SECRET\\|GOOGLE_CLIENT\\|APPLE_CLIENT\" /opt/api-ka/.env 2>/dev/null | head -20"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01CujjqrLYyARtYW9TNwEcSD","type":"tool_result","content":"/opt/api-ka/.env:KA_SSO_SECRET=222bb8c66ea61ba10f3695cc326c6c3c202c61deae036cc26de8455a9bbe5bd7","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"215751bf-0126-44ef-bb40-9ea06fd77dc9","timestamp":"2026-08-26T15:53:52.008Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running grep -E \"KA_DB_PATH|BASE_URL|KA_AUTH_SECRET|GOOGL…","usage":{"total_tokens":37820,"tool_uses":22,"duration_ms":39681},"last_tool_name":"Bash","uuid":"dc870e18-a366-4b0a-8ca0-7d5fa4cbc6f9","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdW1dweWd6jB1dxa67V","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01EW8F7uYYXUFLQNmfHv1F8G","name":"Bash","input":{"command":"grep -E \"KA_DB_PATH|BASE_URL|KA_AUTH_SECRET|GOOGLE_CLIENT_ID|APPLE_CLIENT_ID\" /Users/simon-pierreboucher/apps/groupe-ka/.env* 2>/dev/null"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":187,"cache_read_input_tokens":37381,"cache_creation":{"ephemeral_5m_input_tokens":187,"ephemeral_1h_input_tokens":0},"output_tokens":25,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"53e99fe6-13ef-422d-89f1-a90df408ac48"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01EW8F7uYYXUFLQNmfHv1F8G","type":"tool_result","content":"BASE_URL=https://www.groupe-ka.com\nKA_AUTH_SECRET=5b8e7351ba4729fdd8c297b826e31d85cf09e4b6f807e02025879bc1a17710a7\nGOOGLE_CLIENT_ID=380896406983-1ph2l9uq5si1mohmsnkq9kp64q8o9lpj.apps.googleusercontent.com\nAPPLE_CLIENT_ID=com.groupe-ka.web","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"bbf1b2c8-e33c-461f-944b-588df89462d8","timestamp":"2026-08-26T15:53:53.417Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running pm2 list 2>/dev/null || echo \"PM2 non disponible …","usage":{"total_tokens":38088,"tool_uses":23,"duration_ms":40684},"last_tool_name":"Bash","uuid":"d7688547-76b0-4b2b-9815-d96ac9e78aa5","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdW6kXAe3nmDykVqmSH","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01PE664uEzRX8nwb372nzSgJ","name":"Bash","input":{"command":"pm2 list 2>/dev/null || echo \"PM2 non disponible globalement, cherchons les fichiers\""},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":243,"cache_read_input_tokens":37568,"cache_creation":{"ephemeral_5m_input_tokens":243,"ephemeral_1h_input_tokens":0},"output_tokens":25,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"3d508a54-d749-4f23-aa6f-7b214c65492e"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"pm2 list 2>/dev/null || echo \"PM2 non disponible globalement, cherchons les fichiers\""}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01PE664uEzRX8nwb372nzSgJ","type":"tool_result","content":"┌────┬────────────────────────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐\n│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │\n├────┼────────────────────────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤\n│ 6 │ airiskindex-ngrok │ default │ N/A │ fork │ 13980 │ 21D │ 0 │ online │ 0% │ 90.3mb │ simon-p… │ disabled │\n│ 5 │ airiskindex-web │ default │ N/A │ fork │ 65729 │ 21D │ 13 │ online │ 0% │ 142.2mb │ simon-p… │ disabled │\n│ 75 │ anomaly-atlas │ default │ N/A │ fork │ 33650 │ 14D │ 14 │ online │ 0% │ 65.5mb │ simon-p… │ disabled │\n│ 76 │ anomaly-atlas-ngrok │ default │ N/A │ fork │ 61023 │ 14D │ 0 │ online │ 0% │ 62.3mb │ simon-p… │ disabled │\n│ 77 │ apika-api │ default │ N/A │ fork │ 4832 │ 12h │ 35 │ online │ 0% │ 169.2mb │ simon-p… │ disabled │\n│ 79 │ apika-ngrok │ default │ N/A │ fork │ 11978 │ 9D │ 0 │ online │ 0% │ 135.0mb │ simon-p… │ disabled │\n│ 78 │ apika-scheduler │ default │ N/A │ fork │ 51543 │ 43h │ 10 │ online │ 0% │ 15.2gb │ simon-p… │ disabled │\n│ 21 │ coinexplorer-api │ default │ N/A │ fork │ 4186 │ 20D │ 6 │ online │ 0% │ 1.9gb │ simon-p… │ disabled │\n│ 19 │ coinexplorer-indexer │ default │ N/A │ fork │ 54216 │ 20D │ 3 │ online │ 0% │ 712.8mb │ simon-p… │ disabled │\n│ 22 │ coinexplorer-ngrok │ default │ N/A │ fork │ 60713 │ 20D │ 0 │ online │ 0% │ 162.7mb │ simon-p… │ disabled │\n│ 89 │ crea-ka-ngrok │ default │ N/A │ fork │ 63473 │ 8D │ 0 │ online │ 0% │ 167.9mb │ simon-p… │ disabled │\n│ 94 │ crea-ka-sync │ default │ N/A │ fork │ 81871 │ 3D │ 11 │ online │ 0% │ 570.8mb │ simon-p… │ disabled │\n│ 87 │ crea-ka-web │ default │ N/A │ fork │ 98111 │ 38h │ 38 │ online │ 0% │ 205.9mb │ simon-p… │ disabled │\n│ 28 │ draft2027 │ default │ N/A │ fork │ 89898 │ 17D │ 0 │ online │ 0% │ 38.0mb │ simon-p… │ disabled │\n│ 29 │ draft2027-ngrok │ default │ N/A │ fork │ 89910 │ 17D │ 0 │ online │ 0% │ 51.3mb │ simon-p… │ disabled │\n│ 60 │ earthnow-api │ default │ N/A │ fork │ 87198 │ 16D │ 0 │ online │ 0% │ 77.7mb │ simon-p… │ disabled │\n│ 63 │ earthnow-ngrok │ default │ N/A │ fork │ 87239 │ 16D │ 0 │ online │ 0% │ 70.7mb │ simon-p… │ disabled │\n│ 62 │ earthnow-proxy │ default │ N/A │ fork │ 87227 │ 16D │ 0 │ online │ 0% │ 43.7mb │ simon-p… │ disabled │\n│ 61 │ earthnow-web │ default │ 0.1.0 │ fork │ 87210 │ 16D │ 0 │ online │ 0% │ 101.0mb │ simon-p… │ disabled │\n│ 30 │ groupe-ka │ default │ 1.0.0 │ fork │ 6672 │ 14h │ 95 │ online │ 0% │ 251.1mb │ simon-p… │ disabled │\n│ 31 │ groupe-ka-ngrok │ default │ N/A │ fork │ 26263 │ 10D │ 1 │ online │ 0% │ 235.0mb │ simon-p… │ disabled │\n│ 96 │ groupe-ka-rapport-quotidien │ default │ 1.0.0 │ fork │ 0 │ 0 │ 0 │ stopped │ 0% │ 0b │ simon-p… │ disabled │\n│ 95 │ groupe-ka-status-tick │ default │ 1.0.0 │ fork │ 0 │ 0 │ 252 │ stopped │ 0% │ 0b │ simon-p… │ disabled │\n│ 0 │ immbot-ai │ default │ 1.0.0 │ fork │ 19793 │ 21D │ 6 │ online │ 0% │ 125.1mb │ simon-p… │ disabled │\n│ 1 │ immbot-ngrok │ default │ N/A │ fork │ 76976 │ 21D │ 1 │ online │ 0% │ 63.2mb │ simon-p… │ disabled │\n│ 64 │ khaelor-sh │ default │ N/A │ fork │ 13042 │ 15D │ 2 │ online │ 0% │ 38.2mb │ simon-p… │ disabled │\n│ 65 │ khaelor-sh-ngrok │ default │ N/A │ fork │ 21045 │ 16D │ 0 │ online │ 0% │ 52.8mb │ simon-p… │ disabled │\n│ 16 │ llmindex-benchmark │ default │ 4.23.5 │ fork │ 0 │ 0 │ 0 │ stopped │ 0% │ 0b │ simon-p… │ disabled │\n│ 9 │ llmindex-ngrok │ default │ N/A │ fork │ 93363 │ 21D │ 0 │ online │ 0% │ 139.2mb │ simon-p… │ disabled │\n│ 7 │ llmindex-web │ default │ 0.1.0 │ fork │ 36574 │ 3h │ 25 │ online │ 0% │ 201.3mb │ simon-p… │ disabled │\n│ 10 │ llmindex-worker │ default │ 4.23.5 │ fork │ 44184 │ 21D │ 4 │ online │ 0% │ 51.1mb │ simon-p… │ disabled │\n│ 71 │ localvm-web │ default │ 1.0.0 │ fork │ 4329 │ 14D │ 13 │ online │ 0% │ 84.8mb │ simon-p… │ disabled │\n│ 72 │ localvm-web-ngrok │ default │ N/A │ fork │ 71734 │ 14D │ 0 │ online │ 0% │ 70.5mb │ simon-p… │ disabled │\n│ 27 │ lou-ka-ngrok │ default │ N/A │ fork │ 22790 │ 20D │ 0 │ online │ 0% │ 304.2mb │ simon-p… │ disabled │\n│ 26 │ lou-ka-sync │ default │ 1.0.0 │ fork │ 49981 │ 3h │ 49 │ online │ 0% │ 686.3mb │ simon-p… │ disabled │\n│ 25 │ lou-ka-web │ default │ 1.0.0 │ fork │ 6432 │ 5m │ 132 │ online │ 0% │ 1010.2m… │ simon-p… │ disabled │\n│ 73 │ modelmap-web │ default │ 1.0.0 │ fork │ 23027 │ 14D │ 18 │ online │ 0% │ 72.9mb │ simon-p… │ disabled │\n│ 74 │ modelmap-web-ngrok │ default │ N/A │ fork │ 89389 │ 14D │ 0 │ online │ 0% │ 59.6mb │ simon-p… │ disabled │\n│ 84 │ resto-ka │ default │ N/A │ fork │ 41760 │ 15h │ 33 │ online │ 0% │ 133.1mb │ simon-p… │ disabled │\n│ 85 │ resto-ka-ngrok │ default │ N/A │ fork │ 35426 │ 8D │ 0 │ online │ 0% │ 188.3mb │ simon-p… │ disabled │\n│ 86 │ resto-ka-sync │ default │ N/A │ fork │ 4069 │ 18h │ 10 │ online │ 0% │ 18.1mb │ simon-p… │ disabled │\n│ 66 │ spbdrive-server │ default │ 2.1.0 │ fork │ 54545 │ 15D │ 3 │ online │ 0% │ 86.3mb │ simon-p… │ disabled │\n│ 68 │ spbdrive-tunnel │ default │ N/A │ fork │ 58322 │ 16D │ 0 │ online │ 0% │ 56.8mb │ simon-p… │ disabled │\n│ 70 │ svgarden-tunnel │ default │ N/A │ fork │ 34955 │ 15D │ 1 │ online │ 0% │ 68.4mb │ simon-p… │ disabled │\n│ 69 │ svgarden-web │ default │ 1.0.0 │ fork │ 34954 │ 15D │ 1 │ online │ 0% │ 61.5mb │ simon-p… │ disabled │\n│ 23 │ voyage2026 │ default │ N/A │ fork │ 43917 │ 20D │ 0 │ online │ 0% │ 37.8mb │ simon-p… │ disabled │\n│ 24 │ voyage2026-ngrok │ default │ N/A │ fork │ 43929 │ 20D │ 0 │ online │ 0% │ 54.8mb │ simon-p… │ disabled │\n└────┴────────────────────────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"540d810c-f1c1-4cb8-bb25-c1127a19c68f","timestamp":"2026-08-26T15:53:54.561Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running pm2 show groupe-ka 2>/dev/null | grep -E \"script|…","usage":{"total_tokens":41958,"tool_uses":24,"duration_ms":42721},"last_tool_name":"Bash","uuid":"a1ded457-766a-4a49-8d52-37c0aa0392af","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdWDCDgiYVBM2BThUV8","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01QNNzQ6zuQvSKp7tcT3d2Cq","name":"Bash","input":{"command":"pm2 show groupe-ka 2>/dev/null | grep -E \"script|cwd|PORT|exec|env\""},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":3862,"cache_read_input_tokens":37811,"cache_creation":{"ephemeral_5m_input_tokens":3862,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"96843260-5f1a-44a5-bc1f-0ffeba95d040"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"pm2 show groupe-ka 2>/dev/null | grep -E \"script|cwd|PORT|exec|env\""}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01QNNzQ6zuQvSKp7tcT3d2Cq","type":"tool_result","content":"│ script path │ /Users/simon-pierreboucher/apps/groupe-ka/node_modules/.bin/next │\n│ script args │ start -H 0.0.0.0 -p 8110 │\n│ script id │ 30 │\n│ exec cwd │ /Users/simon-pierreboucher/apps/groupe-ka │\n│ exec mode │ fork_mode │\n│ node env │ N/A │\n Divergent env variables from local env \n Use `pm2 env 30` to display environment variables","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"53ed1cc0-9d12-44a8-b8d8-04909588bb25","timestamp":"2026-08-26T15:53:56.587Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running pm2 show apika-api 2>/dev/null | grep -E \"script|…","usage":{"total_tokens":42249,"tool_uses":25,"duration_ms":43772},"last_tool_name":"Bash","uuid":"ee894315-ca49-4f56-abfc-939ce78c3646","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdWLJ6spiT4qjW49Xmd","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Bym8UBhXNbbXXGupSLZ3mb","name":"Bash","input":{"command":"pm2 show apika-api 2>/dev/null | grep -E \"script|cwd|PORT|exec|env\""},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":267,"cache_read_input_tokens":41673,"cache_creation":{"ephemeral_5m_input_tokens":267,"ephemeral_1h_input_tokens":0},"output_tokens":24,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"8380e1b5-2f60-4046-a72c-18e3519691b3"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"pm2 show apika-api 2>/dev/null | grep -E \"script|cwd|PORT|exec|env\""}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Bym8UBhXNbbXXGupSLZ3mb","type":"tool_result","content":"│ script path │ /opt/api-ka/venv/bin/uvicorn │\n│ script args │ src.api.main:app --host 127.0.0.1 --port 8000 │\n│ script id │ 77 │\n│ exec cwd │ /opt/api-ka │\n│ exec mode │ fork_mode │\n│ node env │ N/A │\n Divergent env variables from local env \n Use `pm2 env 77` to display environment variables","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"488216f7-e367-431a-a3bb-d7552a8f87ab","timestamp":"2026-08-26T15:53:57.662Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running pm2 env 30 2>/dev/null | grep -E \"NODE_ENV|PORT|K…","usage":{"total_tokens":42515,"tool_uses":26,"duration_ms":45076},"last_tool_name":"Bash","uuid":"dfdf618d-0695-4186-8a6c-482274a03875","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdWRAo1cHvFCdJqWb5z","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_019MyKZNSnFdm9oZt3XCMEym","name":"Bash","input":{"command":"pm2 env 30 2>/dev/null | grep -E \"NODE_ENV|PORT|KA_AUTH_SECRET|BASE_URL|GOOGLE|APPLE\" | head -20"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":242,"cache_read_input_tokens":41940,"cache_creation":{"ephemeral_5m_input_tokens":242,"ephemeral_1h_input_tokens":0},"output_tokens":24,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"399f3682-45cc-4532-83ee-3bdf3ce6f6a8"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"pm2 env 30 2>/dev/null | grep -E \"NODE_ENV|PORT|KA_AUTH_SECRET|BASE_URL|GOOGLE|APPLE\" | head -20"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_019MyKZNSnFdm9oZt3XCMEym","type":"tool_result","content":"OTEL_EXPORTER_OTLP_METRICS_TEMPORALITY_PREFERENCE: delta","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a92f100e-0ab1-4b42-8daa-fd575c8a786d","timestamp":"2026-08-26T15:53:58.946Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Finding /**/{ecosystem,pm2}.config.{js,json}","usage":{"total_tokens":42753,"tool_uses":27,"duration_ms":46441},"last_tool_name":"Glob","uuid":"922d63a7-b35c-4d49-8b13-3ebabf2ae510","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdWWUHEsmdUWrheM79n","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_011FBLmxm9iJGaZPqNxhi3ky","name":"Glob","input":{"pattern":"/**/{ecosystem,pm2}.config.{js,json}"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":235,"cache_read_input_tokens":42182,"cache_creation":{"ephemeral_5m_input_tokens":235,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"00b4618f-51a2-4edb-a0b8-513d00c33d0d"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"type":"tool_result","content":"Ripgrep search timed out after 20 seconds. The search may have matched files but did not complete in time. Try searching a more specific path or pattern.","is_error":true,"tool_use_id":"toolu_011FBLmxm9iJGaZPqNxhi3ky"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"ae714417-030b-46a1-a236-2d7f2c893e29","timestamp":"2026-08-26T15:54:20.172Z","tool_use_result":"Error: Ripgrep search timed out after 20 seconds. The search may have matched files but did not complete in time. Try searching a more specific path or pattern."}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running find /opt/api-ka -name \"ecosystem.config.*\" -o -n…","usage":{"total_tokens":42918,"tool_uses":28,"duration_ms":67447},"last_tool_name":"Bash","uuid":"5580ee0e-d483-4abb-ad68-ea4e88c4291b","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdY5MjLEqGmQum6qTeA","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01QX7xkXrg71s6MQcAc7bijB","name":"Bash","input":{"command":"find /opt/api-ka -name \"ecosystem.config.*\" -o -name \"pm2.config.*\" 2>/dev/null"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":7,"cache_creation_input_tokens":138,"cache_read_input_tokens":42417,"cache_creation":{"ephemeral_5m_input_tokens":138,"ephemeral_1h_input_tokens":0},"output_tokens":25,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"8f606dce-62f4-45fc-830c-fd6c5ca057a7"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"find /opt/api-ka -name \"ecosystem.config.*\" -o -name \"pm2.config.*\" 2>/dev/null"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01QX7xkXrg71s6MQcAc7bijB","type":"tool_result","content":"(Bash completed with no output)","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"22e38a34-d73e-410b-b5ce-71ea0ac16259","timestamp":"2026-08-26T15:54:21.372Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running find /Users/simon-pierreboucher/apps/groupe-ka -n…","usage":{"total_tokens":43043,"tool_uses":29,"duration_ms":68595},"last_tool_name":"Bash","uuid":"effcb5a6-2fc8-4aa1-bd3a-8078d2702caf","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdYAUom1nDQyJU1Nhs9","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01TSki2eWnnghyfgCXz9BcTj","name":"Bash","input":{"command":"find /Users/simon-pierreboucher/apps/groupe-ka -name \"ecosystem.config.*\" -o -name \"pm2.config.*\" 2>/dev/null"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":103,"cache_read_input_tokens":42555,"cache_creation":{"ephemeral_5m_input_tokens":103,"ephemeral_1h_input_tokens":0},"output_tokens":24,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"30478cdc-b3c8-4435-b9e5-16305f8bba2a"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01TSki2eWnnghyfgCXz9BcTj","type":"tool_result","content":"(Bash completed with no output)","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"04b8c1a7-2e40-4bc3-bdae-ce2155b1b686","timestamp":"2026-08-26T15:54:22.600Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/lib/sso.ts","usage":{"total_tokens":43157,"tool_uses":30,"duration_ms":70861},"last_tool_name":"Read","uuid":"ea0f6851-8c9e-484e-bad9-d0b85faea01b","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdYK9Cj88RmMGMfgaQt","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_0132AQBAxg8r2uwo46Fdg4yU","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/sso.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":110,"cache_read_input_tokens":42658,"cache_creation":{"ephemeral_5m_input_tokens":110,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"2b06e6d5-0ab2-4cd8-9920-68c32310a4b6"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_0132AQBAxg8r2uwo46Fdg4yU","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\timport crypto from \"crypto\";\n3\t// KA ID — registre des plateformes autorisées à déléguer leur connexion\n4\t// au hub (« Se connecter avec KA »). Chaque client a son secret partagé\n5\t// (env) et une liste blanche de redirect_uri.\n6\texport const SSO_CLIENTS: Record<\n7\t string,\n8\t { label: string; redirectPrefixes: string[]; secretEnv: string }\n9\t> = {\n10\t \"lou-ka\": {\n11\t label: \"Lou·Ka\",\n12\t redirectPrefixes: [\"https://www.lou-ka.com/\", \"http://localhost:8095/\"],\n13\t secretEnv: \"KA_SSO_SECRET_LOU_KA\",\n14\t },\n15\t \"immo-ka\": {\n16\t label: \"Immo·Ka\",\n17\t redirectPrefixes: [\"https://www.immo-ka.com/\"],\n18\t secretEnv: \"KA_SSO_SECRET_IMMO_KA\",\n19\t },\n20\t \"crea-ka\": {\n21\t label: \"Créa·Ka\",\n22\t redirectPrefixes: [\"https://www.crea-ka.com/\", \"http://localhost:8160/\"],\n23\t secretEnv: \"KA_SSO_SECRET_CREA_KA\",\n24\t },\n25\t \"vrai-prix\": {\n26\t label: \"Vrai-Prix\",\n27\t redirectPrefixes: [\"https://www.vrai-prix.com/\"],\n28\t secretEnv: \"KA_SSO_SECRET_VRAI_PRIX\",\n29\t },\n30\t valoplex: {\n31\t label: \"ValoPlex\",\n32\t redirectPrefixes: [\"https://www.valoplex.com/\"],\n33\t secretEnv: \"KA_SSO_SECRET_VALOPLEX\",\n34\t },\n35\t \"auto-ka\": {\n36\t label: \"Auto·Ka\",\n37\t redirectPrefixes: [\"https://www.auto-ka.com/\"],\n38\t secretEnv: \"KA_SSO_SECRET_AUTO_KA\",\n39\t },\n40\t \"fabri-ka\": {\n41\t label: \"Fabri·Ka\",\n42\t redirectPrefixes: [\"https://www.fabri-ka.com/\"],\n43\t secretEnv: \"KA_SSO_SECRET_FABRI_KA\",\n44\t },\n45\t \"food-ka\": {\n46\t label: \"Food·Ka\",\n47\t redirectPrefixes: [\"https://www.food-ka.com/\"],\n48\t secretEnv: \"KA_SSO_SECRET_FOOD_KA\",\n49\t },\n50\t \"ora-ka\": {\n51\t label: \"Ora·Ka\",\n52\t redirectPrefixes: [\"https://www.ora-ka.com/\"],\n53\t secretEnv: \"KA_SSO_SECRET_ORA_KA\",\n54\t },\n55\t \"toit-ka\": {\n56\t label: \"Toit·Ka\",\n57\t redirectPrefixes: [\"https://www.toit-ka.com/\", \"http://localhost:8097/\"],\n58\t secretEnv: \"KA_SSO_SECRET_TOIT_KA\",\n59\t },\n60\t \"sorti-ka\": {\n61\t label: \"Sorti·Ka\",\n62\t redirectPrefixes: [\"https://www.sorti-ka.com/\", \"http://localhost:8120/\"],\n63\t secretEnv: \"KA_SSO_SECRET_SORTI_KA\",\n64\t },\n65\t \"resto-ka\": {\n66\t label: \"Resto·Ka\",\n67\t redirectPrefixes: [\"https://www.resto-ka.com/\", \"http://localhost:8115/\"],\n68\t secretEnv: \"KA_SSO_SECRET_RESTO_KA\",\n69\t },\n70\t \"ka-android\": {\n71\t label: \"KA (app Android)\",\n72\t redirectPrefixes: [\"ka-android://auth\"],\n73\t secretEnv: \"KA_SSO_SECRET_KA_ANDROID\",\n74\t },\n75\t \"ka-ios\": {\n76\t label: \"KA (app iOS)\",\n77\t redirectPrefixes: [\"ka-ios://auth\"],\n78\t secretEnv: \"KA_SSO_SECRET_KA_IOS\",\n79\t },\n80\t \"job-ka\": {\n81\t label: \"Job·Ka\",\n82\t redirectPrefixes: [\"https://www.job-ka.com/\", \"http://localhost:8096/\"],\n83\t secretEnv: \"KA_SSO_SECRET_JOB_KA\",\n84\t },\n85\t \"api-ka\": {\n86\t label: \"API·Ka\",\n87\t redirectPrefixes: [\"https://www.api-ka.com/\", \"http://localhost:8000/\"],\n88\t secretEnv: \"KA_SSO_SECRET_API_KA\",\n89\t },\n90\t \"trouve-ka\": {\n91\t label: \"Trouve·Ka\",\n92\t redirectPrefixes: [\"https://www.trouve-ka.com/\", \"http://localhost:3000/\"],\n93\t secretEnv: \"KA_SSO_SECRET_TROUVE_KA\",\n94\t },\n95\t};\n96\t\n97\t/**\n98\t * Vérifie une requête serveur-à-serveur d'une plateforme :\n99\t * sig = HMAC-SHA256(secret_client, `${client_id}.${ka_id}.${ts}`), ts ±5 min.\n100\t * Retourne le client si valide, sinon null.\n101\t */\n102\texport function verifyClientSig(\n103\t clientId: string,\n104\t kaId: string,\n105\t ts: string,\n106\t sig: string,\n107\t): { label: string } | null {\n108\t const client = SSO_CLIENTS[clientId];\n109\t const secret = client ? process.env[client.secretEnv] : undefined;\n110\t if (!client || !secret) return null;\n111\t if (!/^\\d+$/.test(ts) || Math.abs(Date.now() / 1000 - Number(ts)) > 300)\n112\t return null;\n113\t const expected = crypto\n114\t .createHmac(\"sha256\", secret)\n115\t .update(`${clientId}.${kaId}.${ts}`)\n116\t .digest(\"hex\");\n117\t const a = Buffer.from(sig, \"hex\");\n118\t const b = Buffer.from(expected, \"hex\");\n119\t if (a.length !== b.length || !crypto.timingSafeEqual(a, b)) return null;\n120\t return client;\n121\t}\n122\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"be760a10-b384-4162-975f-a51294f2de08","timestamp":"2026-08-26T15:54:24.588Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/sso/authorize/route.ts","usage":{"total_tokens":45159,"tool_uses":31,"duration_ms":72387},"last_tool_name":"Read","uuid":"bc2d2d41-7f77-413c-9b8d-a44472a93c42","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdYQJGQGoES3TCTWrzP","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_014qguziHP6WtkhADAhkEQTR","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/sso/authorize/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":1997,"cache_read_input_tokens":42768,"cache_creation":{"ephemeral_5m_input_tokens":1997,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"57802464-8c0c-42b2-b9c4-f73cd48e1233"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_014qguziHP6WtkhADAhkEQTR","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// « Se connecter avec KA » — endpoint SSO du hub.\n3\t// Une plateforme du groupe (ex. Lou·Ka) envoie l'utilisateur ici ;\n4\t// s'il a une session KA ID (créée par courriel ou via Google), on lui\n5\t// remet un jeton signé (HS256, secret partagé avec la plateforme) qui\n6\t// transporte son profil, puis on le renvoie vers la plateforme.\n7\timport { NextRequest, NextResponse } from \"next/server\";\n8\timport { SignJWT } from \"jose\";\n9\timport { getSessionUser, BASE_URL } from \"@/lib/auth\";\n10\timport { SSO_CLIENTS } from \"@/lib/sso\";\n11\timport { ensureKaId } from \"@/lib/db\";\n12\t\n13\texport async function GET(req: NextRequest) {\n14\t const clientId = req.nextUrl.searchParams.get(\"client_id\") ?? \"\";\n15\t const redirectUri = req.nextUrl.searchParams.get(\"redirect_uri\") ?? \"\";\n16\t const state = req.nextUrl.searchParams.get(\"state\") ?? \"\";\n17\t\n18\t const client = SSO_CLIENTS[clientId];\n19\t if (!client)\n20\t return NextResponse.json(\n21\t { error: `client_id inconnu : ${clientId}` },\n22\t { status: 400 },\n23\t );\n24\t if (!client.redirectPrefixes.some((p) => redirectUri.startsWith(p)))\n25\t return NextResponse.json(\n26\t { error: \"redirect_uri non autorisé pour ce client.\" },\n27\t { status: 400 },\n28\t );\n29\t const secret = process.env[client.secretEnv];\n30\t if (!secret)\n31\t return NextResponse.json(\n32\t { error: `Secret SSO non configuré pour ${clientId}.` },\n33\t { status: 500 },\n34\t );\n35\t\n36\t const user = await getSessionUser();\n37\t if (!user) {\n38\t // Pas de session hub → page de connexion, puis retour ici.\n39\t const back = req.nextUrl.pathname + \"?\" + req.nextUrl.searchParams.toString();\n40\t return NextResponse.redirect(\n41\t new URL(`/connexion?next=${encodeURIComponent(back)}&via=${clientId}`, BASE_URL),\n42\t );\n43\t }\n44\t\n45\t const token = await new SignJWT({\n46\t sub: String(user.id),\n47\t ka_id: ensureKaId(user.id),\n48\t email: user.email,\n49\t name: user.name,\n50\t picture: user.avatarUrl,\n51\t provider: user.hasGoogle ? \"google\" : user.hasApple ? \"apple\" : \"password\",\n52\t ka_role: user.role,\n53\t })\n54\t .setProtectedHeader({ alg: \"HS256\" })\n55\t .setIssuer(BASE_URL)\n56\t .setAudience(clientId)\n57\t .setIssuedAt()\n58\t .setExpirationTime(\"5m\")\n59\t .sign(new TextEncoder().encode(secret));\n60\t\n61\t const dest = new URL(redirectUri);\n62\t dest.searchParams.set(\"ka_token\", token);\n63\t if (state) dest.searchParams.set(\"state\", state);\n64\t return NextResponse.redirect(dest);\n65\t}\n66\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"9c9a983d-4bce-4152-97b6-41d400f340d6","timestamp":"2026-08-26T15:54:26.114Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running grep -r \"getSessionUser\\|SESSION_COOKIE\" /Users/s…","usage":{"total_tokens":46289,"tool_uses":32,"duration_ms":74164},"last_tool_name":"Bash","uuid":"04b176eb-0189-43a2-b515-35e967b3606c","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdYWdm7Lh9mfFFNkKdY","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Q3PPGwdGdP4aRHfAx4BG2J","name":"Bash","input":{"command":"grep -r \"getSessionUser\\|SESSION_COOKIE\" /Users/simon-pierreboucher/apps/groupe-ka/src/app --include=\"*.ts\" --include=\"*.tsx\" | grep -v node_modules | head -20"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":1126,"cache_read_input_tokens":44765,"cache_creation":{"ephemeral_5m_input_tokens":1126,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"bd7b8029-273d-43b4-a4d1-a6b9ea2d96e4"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Q3PPGwdGdP4aRHfAx4BG2J","type":"tool_result","content":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/sso/authorize/route.ts:import { getSessionUser, BASE_URL } from \"@/lib/auth\";\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/sso/authorize/route.ts: const user = await getSessionUser();\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx:import { getSessionUser, safeNext } from \"@/lib/auth\";\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx: const user = await getSessionUser();\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/logout/route.ts:import { SESSION_COOKIE } from \"@/lib/auth\";\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/logout/route.ts: res.cookies.set(SESSION_COOKIE, \"\", { path: \"/\", maxAge: 0 });\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts: SESSION_COOKIE,\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts: SESSION_COOKIE,\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/me/route.ts:import { getSessionUser } from \"@/lib/auth\";\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/me/route.ts: const user = await getSessionUser();\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts: SESSION_COOKIE,\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts: SESSION_COOKIE,\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts: SESSION_COOKIE,\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts: SESSION_COOKIE,\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts: SESSION_COOKIE,\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts: SESSION_COOKIE,\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/favorites/route.ts:import { getSessionUser } from \"@/lib/auth\";\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/favorites/route.ts: const user = await getSessionUser();\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/favorites/route.ts: const user = await getSessionUser();\n/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/profile/role/route.ts:import { getSessionUser } from \"@/lib/auth\";","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"45114174-9165-4d4c-8b18-b3a0429911e8","timestamp":"2026-08-26T15:54:27.942Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/auth/me/route.ts","usage":{"total_tokens":47352,"tool_uses":33,"duration_ms":75593},"last_tool_name":"Read","uuid":"221ac72f-4d2e-454c-b5d7-666a01df48b2","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdYejRjf9fxAcec9XTf","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01SUjTKW1STDaACQ7fVyHR3T","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/me/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":1060,"cache_read_input_tokens":45891,"cache_creation":{"ephemeral_5m_input_tokens":1060,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"d913f504-e68c-4f4a-979d-29c57b1911ff"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01SUjTKW1STDaACQ7fVyHR3T","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\timport { NextResponse } from \"next/server\";\n3\timport { getSessionUser } from \"@/lib/auth\";\n4\t\n5\texport async function GET() {\n6\t const user = await getSessionUser();\n7\t return NextResponse.json({ user });\n8\t}\n9\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"34186c53-9092-400c-8d09-dd1a9eaf5268","timestamp":"2026-08-26T15:54:29.325Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/auth/logout/route.ts","usage":{"total_tokens":47664,"tool_uses":34,"duration_ms":76453},"last_tool_name":"Read","uuid":"5da60c7f-45c4-4439-86b6-6e9698e5a459","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdYkPk9Y5AzP17Bhhkt","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Cd3uVUx9Atyh9t6r7faXc2","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/logout/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":287,"cache_read_input_tokens":46951,"cache_creation":{"ephemeral_5m_input_tokens":287,"ephemeral_1h_input_tokens":0},"output_tokens":24,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"7f1ec12a-eb78-40e1-9acd-844df1f5fc52"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Cd3uVUx9Atyh9t6r7faXc2","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\timport { NextResponse } from \"next/server\";\n3\timport { SESSION_COOKIE } from \"@/lib/auth\";\n4\t\n5\texport async function POST() {\n6\t const res = NextResponse.json({ ok: true });\n7\t res.cookies.set(SESSION_COOKIE, \"\", { path: \"/\", maxAge: 0 });\n8\t return res;\n9\t}\n10\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"e800f126-8931-472d-96e1-35ea52089349","timestamp":"2026-08-26T15:54:30.182Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running grep -r \"email\\|mail\\|send\" /opt/api-ka/src --inc…","usage":{"total_tokens":47964,"tool_uses":35,"duration_ms":78125},"last_tool_name":"Bash","uuid":"0bf1317d-dfba-4aa4-8f46-c6e0772a1270","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdYp6VFS6gSQ5u12XNn","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_012gqPR6noXvFV5acg9MLK6z","name":"Bash","input":{"command":"grep -r \"email\\|mail\\|send\" /opt/api-ka/src --include=\"*.py\" | grep -i \"def\\|import\\|smtp\\|resend\" | head -30"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":296,"cache_read_input_tokens":47238,"cache_creation":{"ephemeral_5m_input_tokens":296,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"6d826196-b414-4296-afeb-106c8cbe2604"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"grep -r \"email\\|mail\\|send\" /opt/api-ka/src --include=\"*.py\" | grep -i \"def\\|import\\|smtp\\|resend\" | head -30"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_012gqPR6noXvFV5acg9MLK6z","type":"tool_result","content":"(Bash completed with no output)","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"34266e60-732c-44ac-a5c5-bb78cf87fde8","timestamp":"2026-08-26T15:54:31.920Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running find /opt/api-ka/src -name \"*.py\" -type f | head …","usage":{"total_tokens":48113,"tool_uses":36,"duration_ms":79369},"last_tool_name":"Bash","uuid":"6a668590-f47f-43f6-83b8-f47e66f41bd3","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdYwnr3VDXYAV2nW9hH","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_017qM8NxgiXvBLdpzG9z1nqv","name":"Bash","input":{"command":"find /opt/api-ka/src -name \"*.py\" -type f | head -30"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":140,"cache_read_input_tokens":47534,"cache_creation":{"ephemeral_5m_input_tokens":140,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f6274c54-0db3-4819-953f-abef32698a8d"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"find /opt/api-ka/src -name \"*.py\" -type f | head -30"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_017qM8NxgiXvBLdpzG9z1nqv","type":"tool_result","content":"/opt/api-ka/src/database/migrations/env.py\n/opt/api-ka/src/database/db.py\n/opt/api-ka/src/database/models.py\n/opt/api-ka/src/database/__init__.py\n/opt/api-ka/src/collectors/louka_collector.py\n/opt/api-ka/src/collectors/jobka_collector.py\n/opt/api-ka/src/collectors/immoka_collector.py\n/opt/api-ka/src/collectors/__init__.py\n/opt/api-ka/src/collectors/fabrika_collector.py\n/opt/api-ka/src/collectors/base_collector.py\n/opt/api-ka/src/collectors/restoka_collector.py\n/opt/api-ka/src/collectors/sortika_collector.py\n/opt/api-ka/src/collectors/creaka_collector.py\n/opt/api-ka/src/collectors/autoka_collector.py\n/opt/api-ka/src/collectors/foodka_collector.py\n/opt/api-ka/src/config.py\n/opt/api-ka/src/scheduler/__init__.py\n/opt/api-ka/src/scheduler/backfill.py\n/opt/api-ka/src/scheduler/daily_job.py\n/opt/api-ka/src/__init__.py\n/opt/api-ka/src/utils/backup.py\n/opt/api-ka/src/utils/__init__.py\n/opt/api-ka/src/utils/logger.py\n/opt/api-ka/src/utils/retry.py\n/opt/api-ka/src/api/middleware/logging.py\n/opt/api-ka/src/api/middleware/kaauth.py\n/opt/api-ka/src/api/middleware/__init__.py\n/opt/api-ka/src/api/middleware/ratelimit.py\n/opt/api-ka/src/api/reqstats.py\n/opt/api-ka/src/api/kapdf.py","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1e0b0dac-b2c2-4cff-96af-cc0100ed96e7","timestamp":"2026-08-26T15:54:33.135Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running find /opt/api-ka/src/api/routes -name \"*.py\" -typ…","usage":{"total_tokens":48718,"tool_uses":37,"duration_ms":80427},"last_tool_name":"Bash","uuid":"7b4807dc-7f5c-46df-bbd4-e7acde5cc88b","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZ2mz7AC3ztR5AAKFR","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01AUHdW9P1CWCkcU1McpVmUM","name":"Bash","input":{"command":"find /opt/api-ka/src/api/routes -name \"*.py\" -type f"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":600,"cache_read_input_tokens":47674,"cache_creation":{"ephemeral_5m_input_tokens":600,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"e20a3945-eab7-4ab4-bfb7-c91670ba2f91"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"find /opt/api-ka/src/api/routes -name \"*.py\" -type f"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01AUHdW9P1CWCkcU1McpVmUM","type":"tool_result","content":"/opt/api-ka/src/api/routes/auth.py\n/opt/api-ka/src/api/routes/services.py\n/opt/api-ka/src/api/routes/health.py\n/opt/api-ka/src/api/routes/monitoring.py\n/opt/api-ka/src/api/routes/__init__.py\n/opt/api-ka/src/api/routes/stats.py\n/opt/api-ka/src/api/routes/agent.py\n/opt/api-ka/src/api/routes/search.py\n/opt/api-ka/src/api/routes/iosauth.py\n/opt/api-ka/src/api/routes/runs.py","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"dbff7e66-c1b2-427d-a80b-115ac4b5b732","timestamp":"2026-08-26T15:54:34.185Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading /opt/api-ka/src/database/models.py","usage":{"total_tokens":48982,"tool_uses":38,"duration_ms":81507},"last_tool_name":"Read","uuid":"cf47308d-cf8a-4bf3-8e7a-056850a9a39c","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZ78vUAvU6NjULVyeY","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01BkheQ1e2VPEHitjrb4Dr5Q","name":"Read","input":{"file_path":"/opt/api-ka/src/database/models.py"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":260,"cache_read_input_tokens":48274,"cache_creation":{"ephemeral_5m_input_tokens":260,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a7c4b740-1606-4b44-a55d-ae1b1d64ea35"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01BkheQ1e2VPEHitjrb4Dr5Q","type":"tool_result","content":"1\t# ============================================\n2\t# Projet : API-KA\n3\t# Fichier : src/database/models.py\n4\t# Node : m3u96b\n5\t# Author : Simon-Pierre Boucher\n6\t# Contact : contact@spboucher.ai\n7\t# Date : 2026-08-16\n8\t# ============================================\n9\t\"\"\"Modèles SQLAlchemy : 9 tables de données (schéma identique) + collection_runs.\n10\t\n11\tRègle append-only : aucune suppression destructive, l'historique complet est conservé.\n12\tDéduplication par contrainte unique (source, date_key, checksum).\n13\t\"\"\"\n14\t\n15\tfrom __future__ import annotations\n16\t\n17\timport datetime\n18\tfrom typing import Any\n19\t\n20\tfrom sqlalchemy import (\n21\t BigInteger,\n22\t Date,\n23\t DateTime,\n24\t Float,\n25\t Index,\n26\t Integer,\n27\t Text,\n28\t UniqueConstraint,\n29\t func,\n30\t)\n31\tfrom sqlalchemy.dialects.postgresql import JSONB\n32\tfrom sqlalchemy.orm import DeclarativeBase, Mapped, declared_attr, mapped_column\n33\tfrom sqlalchemy.types import JSON\n34\t\n35\tfrom src.config import REQUIRED_NODE\n36\t\n37\t# BIGSERIAL sur PostgreSQL ; INTEGER auto-incrémenté en dev SQLite.\n38\tBigIntPK = BigInteger().with_variant(Integer(), \"sqlite\")\n39\t# JSONB sur PostgreSQL ; JSON générique en dev SQLite.\n40\tJSONPayload = JSONB().with_variant(JSON(), \"sqlite\")\n41\t\n42\t\n43\tclass Base(DeclarativeBase):\n44\t \"\"\"Base déclarative commune à tous les modèles API-KA.\"\"\"\n45\t\n46\t\n47\tclass DataRecordMixin:\n48\t \"\"\"Colonnes communes aux 9 tables de données des services KA.\"\"\"\n49\t\n50\t id: Mapped[int] = mapped_column(BigIntPK, primary_key=True, autoincrement=True)\n51\t payload: Mapped[dict[str, Any]] = mapped_column(JSONPayload, nullable=False)\n52\t source: Mapped[str] = mapped_column(Text, nullable=False)\n53\t collected_at: Mapped[datetime.datetime] = mapped_column(\n54\t DateTime(timezone=True), nullable=False, server_default=func.now()\n55\t )\n56\t date_key: Mapped[datetime.date] = mapped_column(Date, nullable=False)\n57\t checksum: Mapped[str] = mapped_column(Text, nullable=False)\n58\t\n59\t @declared_attr.directive\n60\t def __table_args__(cls) -> tuple: # noqa: N805 — API declared_attr de SQLAlchemy\n61\t table = cls.__tablename__\n62\t return (\n63\t Index(f\"ix_{table}_date_key\", \"date_key\"),\n64\t Index(f\"ix_{table}_source_date_key\", \"source\", \"date_key\"),\n65\t UniqueConstraint(\n66\t \"source\",\n67\t \"date_key\",\n68\t \"checksum\",\n69\t name=f\"uq_{table}_source_date_checksum\",\n70\t ),\n71\t )\n72\t\n73\t\n74\tclass LoukaData(DataRecordMixin, Base):\n75\t \"\"\"Données quotidiennes du service lou-ka.\"\"\"\n76\t\n77\t __tablename__ = \"louka_data\"\n78\t\n79\t\n80\tclass ImmokaData(DataRecordMixin, Base):\n81\t \"\"\"Données quotidiennes du service immo-ka.\"\"\"\n82\t\n83\t __tablename__ = \"immoka_data\"\n84\t\n85\t\n86\tclass FoodkaData(DataRecordMixin, Base):\n87\t \"\"\"Données quotidiennes du service food-ka.\"\"\"\n88\t\n89\t __tablename__ = \"foodka_data\"\n90\t\n91\t\n92\tclass AutokaData(DataRecordMixin, Base):\n93\t \"\"\"Données quotidiennes du service auto-ka.\"\"\"\n94\t\n95\t __tablename__ = \"autoka_data\"\n96\t\n97\t\n98\tclass FabrikaData(DataRecordMixin, Base):\n99\t \"\"\"Données quotidiennes du service fabri-ka.\"\"\"\n100\t\n101\t __tablename__ = \"fabrika_data\"\n102\t\n103\t\n104\tclass RestokaData(DataRecordMixin, Base):\n105\t \"\"\"Données quotidiennes du service resto-ka.\"\"\"\n106\t\n107\t __tablename__ = \"restoka_data\"\n108\t\n109\t\n110\tclass SortikaData(DataRecordMixin, Base):\n111\t \"\"\"Données quotidiennes du service sorti-ka.\"\"\"\n112\t\n113\t __tablename__ = \"sortika_data\"\n114\t\n115\t\n116\tclass CreakaData(DataRecordMixin, Base):\n117\t \"\"\"Données quotidiennes du service crea-ka.\"\"\"\n118\t\n119\t __tablename__ = \"creaka_data\"\n120\t\n121\t\n122\tclass JobkaData(DataRecordMixin, Base):\n123\t \"\"\"Données quotidiennes du service job-ka.\"\"\"\n124\t\n125\t __tablename__ = \"jobka_data\"\n126\t\n127\t\n128\tDATA_MODELS: dict[str, type[Base]] = {\n129\t \"louka\": LoukaData,\n130\t \"immoka\": ImmokaData,\n131\t \"foodka\": FoodkaData,\n132\t \"autoka\": AutokaData,\n133\t \"fabrika\": FabrikaData,\n134\t \"restoka\": RestokaData,\n135\t \"sortika\": SortikaData,\n136\t \"creaka\": CreakaData,\n137\t \"jobka\": JobkaData,\n138\t}\n139\t\n140\t\n141\tclass CollectionRun(Base):\n142\t \"\"\"Journal de chaque exécution de collecte (succès, échec ou relance).\"\"\"\n143\t\n144\t __tablename__ = \"collection_runs\"\n145\t __table_args__ = (\n146\t Index(\"ix_collection_runs_service_date_key\", \"service\", \"date_key\"),\n147\t Index(\"ix_collection_runs_status\", \"status\"),\n148\t )\n149\t\n150\t id: Mapped[int] = mapped_column(BigIntPK, primary_key=True, autoincrement=True)\n151\t service: Mapped[str] = mapped_column(Text, nullable=False)\n152\t date_key: Mapped[datetime.date] = mapped_column(Date, nullable=False)\n153\t status: Mapped[str] = mapped_column(\n154\t Text, nullable=False\n155\t ) # success / failed / retried\n156\t records_count: Mapped[int] = mapped_column(Integer, nullable=False, default=0)\n157\t duration_seconds: Mapped[float] = mapped_column(Float, nullable=False, default=0.0)\n158\t error_message: Mapped[str | None] = mapped_column(Text, nullable=True)\n159\t node: Mapped[str] = mapped_column(Text, nullable=False, default=REQUIRED_NODE)\n160\t started_at: Mapped[datetime.datetime] = mapped_column(\n161\t DateTime(timezone=True), nullable=False\n162\t )\n163\t finished_at: Mapped[datetime.datetime] = mapped_column(\n164\t DateTime(timezone=True), nullable=False\n165\t )\n166\t\n167\t\n168\tclass ApiRequest(Base):\n169\t \"\"\"Journal léger des requêtes HTTP servies par l'API (alimenté par le\n170\t middleware de logging, purge automatique > 90 jours).\n171\t\n172\t Sert exclusivement la page /stats : appels par endpoint/jour, latences\n173\t moyennes et p95, taux d'erreur. Le chemin est normalisé (paramètres de\n174\t route repliés) pour garder une cardinalité bornée.\n175\t \"\"\"\n176\t\n177\t __tablename__ = \"api_requests\"\n178\t __table_args__ = (\n179\t Index(\"ix_api_requests_ts\", \"ts\"),\n180\t Index(\"ix_api_requests_endpoint_ts\", \"endpoint\", \"ts\"),\n181\t )\n182\t\n183\t id: Mapped[int] = mapped_column(BigIntPK, primary_key=True, autoincrement=True)\n184\t ts: Mapped[datetime.datetime] = mapped_column(\n185\t DateTime(timezone=True), nullable=False\n186\t )\n187\t method: Mapped[str] = mapped_column(Text, nullable=False, default=\"GET\")\n188\t endpoint: Mapped[str] = mapped_column(Text, nullable=False)\n189\t status: Mapped[int] = mapped_column(Integer, nullable=False)\n190\t duration_ms: Mapped[float] = mapped_column(Float, nullable=False, default=0.0)\n191\t\n192\t\n193\tclass ConnectorHealth(Base):\n194\t \"\"\"État courant de chaque connecteur de l'écosystème KA (supervision).\n195\t\n196\t Une ligne par couple (service, source), upsertée toutes les 2 h par\n197\t ``src.monitoring.connector_health``. La source virtuelle ``_app``\n198\t représente l'état global de l'app. La ligne mémorise aussi l'état\n199\t précédent (anti-spam des alertes : on n'alerte qu'à la transition).\n200\t \"\"\"\n201\t\n202\t __tablename__ = \"connector_health\"\n203\t __table_args__ = (\n204\t UniqueConstraint(\n205\t \"service\", \"source\", name=\"uq_connector_health_service_source\"\n206\t ),\n207\t Index(\"ix_connector_health_service\", \"service\"),\n208\t Index(\"ix_connector_health_status\", \"status\"),\n209\t )\n210\t\n211\t id: Mapped[int] = mapped_column(BigIntPK, primary_key=True, autoincrement=True)\n212\t service: Mapped[str] = mapped_column(Text, nullable=False)\n213\t source: Mapped[str] = mapped_column(Text, nullable=False)\n214\t checked_at: Mapped[datetime.datetime] = mapped_column(\n215\t DateTime(timezone=True), nullable=False, server_default=func.now()\n216\t )\n217\t status: Mapped[str] = mapped_column(\n218\t Text, nullable=False\n219\t ) # ok / degraded / broken / stale / retired\n220\t last_success: Mapped[datetime.datetime | None] = mapped_column(\n221\t DateTime(timezone=True), nullable=True\n222\t )\n223\t found_last: Mapped[int | None] = mapped_column(Integer, nullable=True)\n224\t median_found: Mapped[float | None] = mapped_column(Float, nullable=True)\n225\t consecutive_failures: Mapped[int] = mapped_column(\n226\t Integer, nullable=False, default=0\n227\t )\n228\t message: Mapped[str | None] = mapped_column(Text, nullable=True)\n229\t # Dernière apparition de la source dans une fenêtre de sync (pilote le\n230\t # retrait ``retired`` des sources disparues du journal).\n231\t last_seen: Mapped[datetime.datetime | None] = mapped_column(\n232\t DateTime(timezone=True), nullable=True\n233\t )\n234\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a16140f3-9bf7-4f84-afbf-e7ad31864741","timestamp":"2026-08-26T15:54:35.232Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running grep -n \"token-verify\\|sso/profile\\|sso/favorites…","usage":{"total_tokens":52255,"tool_uses":39,"duration_ms":83347},"last_tool_name":"Bash","uuid":"2167eab1-ee76-46e2-891f-28f755d57158","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZBh1g6NktSYfPvqoe","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01P1gJQ7EAtUVX5M3eass7R7","name":"Bash","input":{"command":"grep -n \"token-verify\\|sso/profile\\|sso/favorites\" /opt/api-ka/src/api/routes/*.py"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":3272,"cache_read_input_tokens":48534,"cache_creation":{"ephemeral_5m_input_tokens":3272,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"43cc4e7c-d5ba-48b0-b78e-34cdd964d8dc"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"grep -n \"token-verify\\|sso/profile\\|sso/favorites\" /opt/api-ka/src/api/routes/*.py"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01P1gJQ7EAtUVX5M3eass7R7","type":"tool_result","content":"/opt/api-ka/src/api/routes/auth.py:148: \"\"\"GET signé {hub}/api/sso/profile — sig = HMAC(secret, client.ka_id.ts).\"\"\"\n/opt/api-ka/src/api/routes/auth.py:161: f\"{_hub_url()}/api/sso/profile\",\n/opt/api-ka/src/api/routes/iosauth.py:67: r = await cx.get(f\"{HUB}/api/sso/profile\",","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"d26bb701-61bc-48f6-b5da-0d7e69152d9f","timestamp":"2026-08-26T15:54:37.111Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/sso/token-verify/route.ts","usage":{"total_tokens":52526,"tool_uses":40,"duration_ms":84890},"last_tool_name":"Read","uuid":"5b41ea33-639f-432a-b057-dd233ca58567","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZKcWWspfFRNUstypd","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01EDg2DKPjbQkdQW5a28J5Vm","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/token-verify/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":268,"cache_read_input_tokens":51806,"cache_creation":{"ephemeral_5m_input_tokens":268,"ephemeral_1h_input_tokens":0},"output_tokens":1,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"2c6b1f06-8e37-4b7f-92c3-4f07ef99125c"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01EDg2DKPjbQkdQW5a28J5Vm","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// Vérification serveur-à-serveur d'un jeton API personnel (kapi_…).\n3\t// Utilisé par api-ka pour authentifier les appels Bearer de son API produit.\n4\t// GET ?client_id&token&ts&sig sig = HMAC(secret_client, `${client_id}.${token}.${ts}`)\n5\t// Réponse : { valid, ka_id?, name?, email?, role? }\n6\timport { NextRequest, NextResponse } from \"next/server\";\n7\timport { findUserByApiToken } from \"@/lib/db\";\n8\timport { verifyClientSig } from \"@/lib/sso\";\n9\t\n10\texport async function GET(req: NextRequest) {\n11\t const q = req.nextUrl.searchParams;\n12\t const clientId = q.get(\"client_id\") ?? \"\";\n13\t const token = q.get(\"token\") ?? \"\";\n14\t // même schéma HMAC que /api/sso/profile : le jeton prend la place du ka_id\n15\t if (!verifyClientSig(clientId, token, q.get(\"ts\") ?? \"\", q.get(\"sig\") ?? \"\"))\n16\t return NextResponse.json({ error: \"signature invalide\" }, { status: 401 });\n17\t const user = findUserByApiToken(token);\n18\t if (!user || !user.ka_id) return NextResponse.json({ valid: false });\n19\t return NextResponse.json({\n20\t valid: true,\n21\t ka_id: user.ka_id,\n22\t name: user.name,\n23\t email: user.email,\n24\t role: user.role,\n25\t });\n26\t}\n27\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"97108aa2-afbf-4d73-a0e5-52c5f91dfc3e","timestamp":"2026-08-26T15:54:38.615Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/sso/profile/route.ts","usage":{"total_tokens":53208,"tool_uses":41,"duration_ms":85873},"last_tool_name":"Read","uuid":"f386d62e-15a7-4e0a-93e2-4cceeb47e10b","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZSHr6ZvTyd2PpUYNu","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Tqr2ScMg9V2rt5Gv9h4kjm","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/profile/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":658,"cache_read_input_tokens":52074,"cache_creation":{"ephemeral_5m_input_tokens":658,"ephemeral_1h_input_tokens":0},"output_tokens":24,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"5a1691a1-883e-4543-b8f9-7da08b3a38f6"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Tqr2ScMg9V2rt5Gv9h4kjm","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// Profil serveur-à-serveur pour les plateformes du groupe : le hub est LA\n3\t// source de vérité — Lou·Ka & cie affichent CE profil sur leurs pages\n4\t// utilisateur. Authentification par HMAC du secret SSO partagé du client.\n5\t// GET /api/sso/profile?client_id=lou-ka&ka_id=ka-…&ts=&sig=\n6\t// sig = HMAC-SHA256(secret_client, `${client_id}.${ka_id}.${ts}`), ts ±5 min\n7\timport { NextRequest, NextResponse } from \"next/server\";\n8\timport crypto from \"crypto\";\n9\timport { db, parseSocials, ageFromBirthDate, type UserRow } from \"@/lib/db\";\n10\timport { SSO_CLIENTS } from \"@/lib/sso\";\n11\timport { roleLabel } from \"@/lib/roles\";\n12\t\n13\texport async function GET(req: NextRequest) {\n14\t const q = req.nextUrl.searchParams;\n15\t const clientId = q.get(\"client_id\") ?? \"\";\n16\t const kaId = q.get(\"ka_id\") ?? \"\";\n17\t const ts = q.get(\"ts\") ?? \"\";\n18\t const sig = q.get(\"sig\") ?? \"\";\n19\t\n20\t const client = SSO_CLIENTS[clientId];\n21\t const secret = client ? process.env[client.secretEnv] : undefined;\n22\t if (!client || !secret)\n23\t return NextResponse.json({ error: \"client inconnu\" }, { status: 401 });\n24\t if (!/^\\d+$/.test(ts) || Math.abs(Date.now() / 1000 - Number(ts)) > 300)\n25\t return NextResponse.json({ error: \"horodatage expiré\" }, { status: 401 });\n26\t const expected = crypto\n27\t .createHmac(\"sha256\", secret)\n28\t .update(`${clientId}.${kaId}.${ts}`)\n29\t .digest(\"hex\");\n30\t const a = Buffer.from(sig, \"hex\");\n31\t const b = Buffer.from(expected, \"hex\");\n32\t if (a.length !== b.length || !crypto.timingSafeEqual(a, b))\n33\t return NextResponse.json({ error: \"signature invalide\" }, { status: 401 });\n34\t\n35\t const row = db\n36\t .prepare(\"SELECT * FROM users WHERE ka_id = ?\")\n37\t .get(kaId) as UserRow | undefined;\n38\t if (!row)\n39\t return NextResponse.json({ error: \"membre introuvable\" }, { status: 404 });\n40\t\n41\t return NextResponse.json({\n42\t ka_id: row.ka_id,\n43\t name: row.name,\n44\t email: row.email,\n45\t picture: row.avatar_url,\n46\t role: row.role,\n47\t role_label: roleLabel(row.role),\n48\t bio: row.bio ?? \"\",\n49\t city: row.city ?? \"\",\n50\t phone: row.phone ?? \"\",\n51\t website: row.website ?? \"\",\n52\t job_title: row.job_title ?? \"\",\n53\t company: row.company ?? \"\",\n54\t birth_date: row.birth_date ?? \"\",\n55\t age: ageFromBirthDate(row.birth_date),\n56\t socials: parseSocials(row.socials),\n57\t public: !!row.public,\n58\t public_url: row.public\n59\t ? `https://www.groupe-ka.com/u/${row.ka_id}`\n60\t : null,\n61\t created_at: row.created_at,\n62\t });\n63\t}\n64\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"56d775f1-8ce9-4bf7-b00d-955830536276","timestamp":"2026-08-26T15:54:39.600Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/app/api/sso/favorites/route.ts","usage":{"total_tokens":54410,"tool_uses":42,"duration_ms":87054},"last_tool_name":"Read","uuid":"987ea6af-e7b8-4d7c-8b59-51b19434022f","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZWLvv8zwSHKAdwPS9","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_0124ZsMtwBhFTpZCYJCyPtTt","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/favorites/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":1184,"cache_read_input_tokens":52732,"cache_creation":{"ephemeral_5m_input_tokens":1184,"ephemeral_1h_input_tokens":0},"output_tokens":18,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"28fda521-c710-48bf-bdcc-d5e1e1f2bbec"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_0124ZsMtwBhFTpZCYJCyPtTt","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// Favoris unifiés « Mon univers Ka » — API serveur-à-serveur.\n3\t// Le hub est LE magasin central : les plateformes poussent (POST) et\n4\t// lisent (GET) les favoris de leurs membres, signés du secret SSO partagé.\n5\t// POST { client_id, ka_id, ts, sig, action: \"add\"|\"remove\",\n6\t// item: { item_id, title, subtitle?, price_label?, image_url?,\n7\t// url?, meta? } }\n8\t// GET ?client_id&ka_id&ts&sig[&scope=app|all] (défaut: app)\n9\timport { NextRequest, NextResponse } from \"next/server\";\n10\timport {\n11\t findUserByKaId,\n12\t upsertFavorite,\n13\t removeFavorite,\n14\t favoritesOf,\n15\t} from \"@/lib/db\";\n16\timport { verifyClientSig } from \"@/lib/sso\";\n17\t\n18\tconst clip = (v: unknown, max: number): string =>\n19\t typeof v === \"string\" ? v.trim().slice(0, max) : \"\";\n20\t\n21\texport async function POST(req: NextRequest) {\n22\t const body = (await req.json().catch(() => ({}))) as Record;\n23\t const clientId = clip(body.client_id, 30);\n24\t const kaId = clip(body.ka_id, 20);\n25\t if (!verifyClientSig(clientId, kaId, String(body.ts ?? \"\"), String(body.sig ?? \"\")))\n26\t return NextResponse.json({ error: \"signature invalide\" }, { status: 401 });\n27\t const user = findUserByKaId(kaId);\n28\t if (!user)\n29\t return NextResponse.json({ error: \"membre introuvable\" }, { status: 404 });\n30\t\n31\t const item = (body.item ?? {}) as Record;\n32\t const itemId = clip(item.item_id, 200);\n33\t if (!itemId)\n34\t return NextResponse.json({ error: \"item_id requis\" }, { status: 400 });\n35\t\n36\t if (body.action === \"remove\") {\n37\t removeFavorite(user.id, clientId, itemId);\n38\t return NextResponse.json({ ok: true, action: \"remove\" });\n39\t }\n40\t const title = clip(item.title, 200);\n41\t if (!title)\n42\t return NextResponse.json({ error: \"title requis\" }, { status: 400 });\n43\t upsertFavorite(user.id, clientId, {\n44\t item_id: itemId,\n45\t title,\n46\t subtitle: clip(item.subtitle, 200) || undefined,\n47\t price_label: clip(item.price_label, 60) || undefined,\n48\t image_url: clip(item.image_url, 500) || undefined,\n49\t url: clip(item.url, 500) || undefined,\n50\t meta: item.meta,\n51\t });\n52\t return NextResponse.json({ ok: true, action: \"add\" });\n53\t}\n54\t\n55\texport async function GET(req: NextRequest) {\n56\t const q = req.nextUrl.searchParams;\n57\t const clientId = q.get(\"client_id\") ?? \"\";\n58\t const kaId = q.get(\"ka_id\") ?? \"\";\n59\t if (!verifyClientSig(clientId, kaId, q.get(\"ts\") ?? \"\", q.get(\"sig\") ?? \"\"))\n60\t return NextResponse.json({ error: \"signature invalide\" }, { status: 401 });\n61\t const user = findUserByKaId(kaId);\n62\t if (!user)\n63\t return NextResponse.json({ error: \"membre introuvable\" }, { status: 404 });\n64\t const scope = q.get(\"scope\") === \"all\" ? undefined : clientId;\n65\t const rows = favoritesOf(user.id, scope);\n66\t return NextResponse.json({\n67\t favorites: rows.map((r) => ({\n68\t app: r.app,\n69\t item_id: r.item_id,\n70\t title: r.title,\n71\t subtitle: r.subtitle,\n72\t price_label: r.price_label,\n73\t image_url: r.image_url,\n74\t url: r.url,\n75\t created_at: r.created_at,\n76\t })),\n77\t });\n78\t}\n79\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"62e21f5b-1121-4bce-a499-44f9e0ca0674","timestamp":"2026-08-26T15:54:40.779Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading src/lib/roles.ts","usage":{"total_tokens":55812,"tool_uses":43,"duration_ms":88398},"last_tool_name":"Read","uuid":"c5086deb-2d6e-48a6-a759-bbeb4986356b","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZbMZC3mdhGsN6k8Bq","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01CiuV5fsSqNfNdpJKCNi9mT","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/roles.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":1398,"cache_read_input_tokens":53916,"cache_creation":{"ephemeral_5m_input_tokens":1398,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"77d02b70-e406-4e99-8f2a-dc6fa021845b"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01CiuV5fsSqNfNdpJKCNi9mT","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// Types de compte KA ID — choisis à la création, affichés sur la carte.\n3\texport const ROLES: Record<\n4\t string,\n5\t { label: string; card: string; desc: string }\n6\t> = {\n7\t membre: {\n8\t label: \"Utilisateur des plateformes\",\n9\t card: \"MEMBRE · UTILISATEUR\",\n10\t desc: \"Je cherche, je compare, j'explore — logement, propriété, auto, épicerie…\",\n11\t },\n12\t fournisseur: {\n13\t label: \"Fournisseur / partenaire\",\n14\t card: \"FOURNISSEUR · PARTENAIRE\",\n15\t desc: \"Gestionnaire immobilier, courtier, concessionnaire, boutique, bannière…\",\n16\t },\n17\t equipe: {\n18\t label: \"Équipe Groupe KA\",\n19\t card: \"ÉQUIPE · GROUPE KA\",\n20\t desc: \"Je travaille sur les plateformes du groupe.\",\n21\t },\n22\t};\n23\t\n24\texport function roleLabel(role: string | null): string | null {\n25\t return role && ROLES[role] ? ROLES[role].label : null;\n26\t}\n27\t\n28\texport function roleCard(role: string | null): string | null {\n29\t return role && ROLES[role] ? ROLES[role].card : null;\n30\t}\n31\t\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"fb695c20-83aa-4bfc-adac-e8753bf18cb5","timestamp":"2026-08-26T15:54:42.122Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running grep -r \"8110\\|3000\\|8000\" /Users/simon-pierrebou…","usage":{"total_tokens":56393,"tool_uses":44,"duration_ms":89779},"last_tool_name":"Bash","uuid":"081d44be-0ef3-49e1-aed2-b6c3ebc5d2ab","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZhG1NQXcz4qM2fjbn","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Jc28xXtZu9N3peJiZCRoBi","name":"Bash","input":{"command":"grep -r \"8110\\|3000\\|8000\" /Users/simon-pierreboucher/apps/groupe-ka --include=\"*.ts\" --include=\"*.tsx\" --include=\"*.json\" | grep -v node_modules | head -20"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":577,"cache_read_input_tokens":55314,"cache_creation":{"ephemeral_5m_input_tokens":577,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"55a9ac1a-551d-4fc6-bc58-1cd2961c86c5"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Jc28xXtZu9N3peJiZCRoBi","type":"tool_result","content":"/Users/simon-pierreboucher/apps/groupe-ka/.next/required-server-files.json: \"largePageDataBytes\": 128000,\n/Users/simon-pierreboucher/apps/groupe-ka/package-lock.json: \"version\": \"1.0.30001809\",\n/Users/simon-pierreboucher/apps/groupe-ka/package-lock.json: \"resolved\": \"https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001809.tgz\",\n/Users/simon-pierreboucher/apps/groupe-ka/package-lock.json: \"caniuse-lite\": \"^1.0.30001579\",\n/Users/simon-pierreboucher/apps/groupe-ka/src/lib/ecostats.ts: signal: AbortSignal.timeout(8000),\n/Users/simon-pierreboucher/apps/groupe-ka/src/lib/sso.ts: redirectPrefixes: [\"https://www.api-ka.com/\", \"http://localhost:8000/\"],\n/Users/simon-pierreboucher/apps/groupe-ka/src/lib/sso.ts: redirectPrefixes: [\"https://www.trouve-ka.com/\", \"http://localhost:3000/\"],\n/Users/simon-pierreboucher/apps/groupe-ka/src/ka/stats/kacharts.tsx: setTimeout(() => setBusy(null), 3000);","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"50b6ae1b-4c8c-40ef-8eab-4f7e6dc67242","timestamp":"2026-08-26T15:54:44.483Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Reading /opt/api-ka/README.md","usage":{"total_tokens":57006,"tool_uses":45,"duration_ms":92099},"last_tool_name":"Read","uuid":"da37fa5f-0eaa-4967-adf0-bb5d69229190","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZsEXkTHMvCVhVezw9","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Fn8ufDBfx6GSE1hsnQKLRc","name":"Read","input":{"file_path":"/opt/api-ka/README.md","limit":150},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":610,"cache_read_input_tokens":55891,"cache_creation":{"ephemeral_5m_input_tokens":610,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"dc5286f5-9452-4ce4-b88c-89bba4f554b9"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Fn8ufDBfx6GSE1hsnQKLRc","type":"tool_result","content":"1\t\n2\t\n3\t

\n4\t \"API·Ka\n5\t

\n6\t

API·Ka

\n7\t

La donnée de l'écosystème, par API

\n8\t\n9\t
\n10\t\n11\t[![Site](https://img.shields.io/website?url=https%3A%2F%2Fwww.api-ka.com&style=flat-square&label=www.api-ka.com&up_color=3b5bdb&up_message=en%20ligne)](https://www.api-ka.com)\n12\t[![Documentation](https://img.shields.io/badge/📖_documentation-%2Fdoc-3b5bdb?style=flat-square)](https://www.api-ka.com/doc/)\n13\t[![PDF](https://img.shields.io/badge/guide-PDF-3b5bdb?style=flat-square)](https://www.api-ka.com/doc/api-ka-documentation.pdf)\n14\t[![Swagger](https://img.shields.io/badge/Swagger-%2Fdocs-3b5bdb?style=flat-square)](https://www.api-ka.com/docs)\n15\t![Nœud](https://img.shields.io/badge/n%C5%93ud-M3U96b-1f6feb?style=flat-square)\n16\t![Port](https://img.shields.io/badge/port-8000-141814?style=flat-square)\n17\t![PM2](https://img.shields.io/badge/PM2-3_processus-2b037a?style=flat-square)\n18\t\n19\t[![Collectes 7 j](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.runs_7d.ok&label=collectes%207%20j%20OK&color=3b5bdb&style=flat-square)](https://www.api-ka.com/api/stats)\n20\t[![Enregistrements 7 j](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.runs_7d.records&label=enregistrements%207%20j&color=3b5bdb&style=flat-square)](https://www.api-ka.com/api/stats)\n21\t[![Appels API 7 j](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.api.calls_7d&label=appels%20API%207%20j&color=3b5bdb&style=flat-square)](https://www.api-ka.com/api/stats)\n22\t[![Connecteurs OK](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.connectors.ok&label=connecteurs%20OK&color=2f9e44&style=flat-square)](https://www.api-ka.com/stats)\n23\t[![Connecteurs en panne](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fapi%2Fstats&query=%24.data.connectors.broken&label=connecteurs%20en%20panne&color=e03131&style=flat-square)](https://www.api-ka.com/stats)\n24\t[![PostgreSQL](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fhealth&query=%24.data.database&label=PostgreSQL&color=3b5bdb&style=flat-square)](https://www.api-ka.com/health)\n25\t[![Dernière collecte](https://img.shields.io/badge/dynamic/json?url=https%3A%2F%2Fwww.api-ka.com%2Fhealth&query=%24.data.last_collections.louka.date_key&label=derni%C3%A8re%20collecte&color=3b5bdb&style=flat-square)](https://www.api-ka.com/health)\n26\t\n27\t![Python](https://img.shields.io/badge/Python-3.11+-3776AB?style=flat-square&logo=python&logoColor=white)\n28\t![FastAPI](https://img.shields.io/badge/FastAPI-Uvicorn-009688?style=flat-square&logo=fastapi&logoColor=white)\n29\t![PostgreSQL](https://img.shields.io/badge/PostgreSQL-SQLAlchemy_2-4169E1?style=flat-square&logo=postgresql&logoColor=white)\n30\t![APScheduler](https://img.shields.io/badge/APScheduler-job_02%3A00-1c5c41?style=flat-square)\n31\t![Claude](https://img.shields.io/badge/KA_Agent-Claude_Haiku_4.5-cc785c?style=flat-square&logo=anthropic&logoColor=white)\n32\t![pytest](https://img.shields.io/badge/tests-pytest-0A9EDC?style=flat-square&logo=pytest&logoColor=white)\n33\t![PM2](https://img.shields.io/badge/process-PM2-2B037A?style=flat-square&logo=pm2&logoColor=white)\n34\t![ngrok](https://img.shields.io/badge/tunnel-ngrok-1F1E37?style=flat-square&logo=ngrok&logoColor=white)\n35\t![Groupe KA](https://img.shields.io/badge/Groupe-KA-3b5bdb?style=flat-square)\n36\t![spbgit](https://img.shields.io/badge/remote--first-spbgit-141814?style=flat-square&logo=git&logoColor=white)\n37\t\n38\t
\n39\t\n40\t**API·Ka** ([www.api-ka.com](https://www.api-ka.com)) est la **plateforme de données centrale de l'écosystème Groupe KA**. Chaque jour, **9 collecteurs** (lou-ka, immo-ka, food-ka, auto-ka, fabri-ka, resto-ka, sorti-ka, crea-ka, job-ka) sauvegardent les données des plateformes dans une base **PostgreSQL** unifiée (fetch → validation → checksum → insertion → backup → journal de run, retry 3× avec backoff 30 s → 2 min → 10 min), puis les exposent via une **API FastAPI publique** : données paginées, historiques par date, statistiques, rapports PDF.\n41\t\n42\tElle héberge aussi le **KA Agent** — l'assistant IA central du groupe (Claude Haiku 4.5, SSE, boucle de **24 outils** branchés sur les API publiques des plateformes) servi en widget (`/ka-agent.js`) aux 13 domaines de l'écosystème — et sert de **superviseur des connecteurs** (~3 270 connecteurs suivis au 2026-08-24 : historique des collectes `/api/v1/runs`, santé par service, alertes). L'accès à l'API produit exige une authentification : session **KA ID** ou **jeton personnel** (`kapi_`, généré sur groupe-ka.com/compte).\n43\t\n44\t## Chiffres live (au 2026-08-24)\n45\t\n46\tInstantané de `GET /api/stats` et `GET /health` — les pastilles dynamiques ci-dessus restent à jour en continu.\n47\t\n48\t| Métrique | Valeur |\n49\t|---|---|\n50\t| Collectes sur 7 jours | **63 / 63 réussies** (0 échec) |\n51\t| Enregistrements collectés sur 7 jours | **4 158 204** |\n52\t| Enregistrements de la collecte du jour (9 services) | **663 770** |\n53\t| Appels API sur 7 jours | **6 196** |\n54\t| Connecteurs supervisés (écosystème) | **3 271** — 3 098 OK · 169 dégradés · 3 en panne · 1 périmé |\n55\t\n56\tDernière collecte par service (2026-08-24) :\n57\t\n58\t| Service | Enregistrements | | Service | Enregistrements |\n59\t|---|---|---|---|---|\n60\t| fabrika | 385 061 | | autoka | 48 446 |\n61\t| immoka | 67 702 | | jobka | 21 492 |\n62\t| foodka | 50 936 | | sortika | 17 147 |\n63\t| louka | 45 479 | | restoka | 14 716 |\n64\t| creaka | 12 791 | | **Total** | **663 770** |\n65\t\n66\t## Visite guidée\n67\t\n68\t*Captures du 2026-08-25 (mobile 390×844 · desktop 1440×900).*\n69\t\n70\t\n71\t \n72\t \n73\t \n74\t \n75\t \n76\t \n77\t \n78\t
\"Documentation\"
www.api-ka.com/doc — le guide public de l'API (desktop)
\"Documentation
Guide — version mobile
\"Swagger\"
/docs — l'API interactive (OpenAPI)
\n79\t\n80\t### Nouveautés (2026-08-25)\n81\t\n82\t- **KA Agent v3.2** — 33 outils (recherche fédérée, annuaires déménageurs/inspecteurs, historique/coût réel/TAL logement, ValoPlex, KA Scores) ; cartes d'annonces construites **côté serveur** (`afficher_cartes`), lien public `lien_fiche` sur chaque résultat, reprise automatique après coupure `max_tokens`.\n83\t- **Widget ka-agent v4** servi aux 13 domaines — cartes cliquables (`ka-card`) et choix en boutons (`ka-choix`).\n84\t- **Monitoring des connecteurs** — statut `retired` pour les sources désactivées ou disparues.\n85\t- **Nav mobile v2** sur les pages web.\n86\t\n87\t> 🗄️ Les captures d'époque sont conservées dans [`docs/archive/`](docs/archive/).\n88\t\n89\t## Fonctionnalités\n90\t\n91\t- **9 collecteurs quotidiens** — un par plateforme Ka (Job-Ka intégré le 2026-08-18), avec validation, checksum, retry 3× (backoff exponentiel) et journal de run ; tout échec après 3 tentatives est loggé (`collection_runs`, `logs/alerts.log`).\n92\t- **Scheduler APScheduler** — job quotidien à 02:00 (collecteurs en parallèle et indépendants) + **backfill automatique** des dates manquées (7 derniers jours).\n93\t- **API publique de données** — `GET /api/v1/{service}` (pagination, limit max 500), `/latest`, `/date/{YYYY-MM-DD}`, `/stats`, `/api/v1/runs` (historique des collectes), pour `{service}` ∈ louka, immoka, foodka, autoka, fabrika, restoka, sortika, creaka, jobka.\n94\t- **Authentification obligatoire sur l'API produit** — session KA ID ou jeton Bearer `kapi_` ; monitoring, stats et agent restent ouverts.\n95\t- **KA Agent (IA)** — `POST /api/agent/chat` en SSE (Claude Haiku 4.5, boucle de 24 outils sur les données live des plateformes : logements, propriétés, véhicules, emplois, épicerie, produits, restos, plats, menus, inspections MAPAQ, sorties, créateurs, juste prix, estimateur Vrai-Prix, boutiques, suggestions, facettes, stats, état des services) + recherche floue en cascade + widget embarquable `GET /ka-agent.js` (v3 : bulle déplaçable, position mémorisée par site), CORS ouvert aux 13 domaines.\n96\t- **SSO KA ID** — `GET /api/auth/ka/{login,callback}`, session `/api/auth/me`, et échange de jeton pour les apps natives (`POST /api/ios/auth/exchange`, vérification HS256, `aud` ∈ ka-ios, ka-android).\n97\t- **Stats & rapports** — tableau de bord `/stats`, `GET /api/stats` (KPI compact JSON), `GET /api/stats/report` (PDF de la plateforme) et `GET /api/stats/ecosystem-report` (rapport PDF consolidé de l'écosystème, liste dynamique via `ecosystem.json`) + rapports PDF personnalisés (catalogue + constructeur).\n98\t- **Recherche transversale** — `GET /api/v1/search` + `GET /api/v1/suggest` (proxy du moteur Trouve-Ka, pivot moteur de recherche Groupe KA).\n99\t- **Backups quotidiens** horodatés par service (`data/backups/YYYY-MM-DD/`, rétention 90 jours).\n100\t- **Santé & supervision** — `GET /health` (nœud, état DB, dernière collecte par service) ; chaque service vérifie le hostname au démarrage et refuse de tourner en production ailleurs que sur `m3u96b`.\n101\t- **SEO du site de doc** — robots.txt, sitemap.xml, canonical/hreflang/JSON-LD.\n102\t\n103\t## API (endpoints principaux)\n104\t\n105\tRéférence interactive complète : **Swagger sur [/docs](https://www.api-ka.com/docs)**. 🔒 = session KA ID ou jeton Bearer `kapi_` requis.\n106\t\n107\t| Méthode & endpoint | Description |\n108\t|---|---|\n109\t| `GET /health` | santé : nœud, état DB, dernière collecte par service |\n110\t| `GET /api/stats` | KPI compact JSON : collectes 7 j, enregistrements, appels API, connecteurs (alimente les pastilles ci-dessus) |\n111\t| 🔒 `GET /api/v1/{service}` | données paginées (limit max 500) — service ∈ louka, immoka, foodka, autoka, fabrika, restoka, sortika, creaka, jobka |\n112\t| 🔒 `GET /api/v1/{service}/latest` | dernière collecte du service |\n113\t| 🔒 `GET /api/v1/{service}/date/{YYYY-MM-DD}` | collecte d'une date précise |\n114\t| 🔒 `GET /api/v1/{service}/stats` | statistiques du service |\n115\t| 🔒 `GET /api/v1/louka/fairvalue/{uid}` | juste prix d'une annonce Lou·Ka (proxy live, utilisé par l'app iOS KA) |\n116\t| `GET /api/v1/runs` | historique des runs de collecte (supervision) |\n117\t| `GET /api/v1/monitoring/connectors` · `/connectors/{service}` | santé des connecteurs de l'écosystème (~3 270 suivis) |\n118\t| `GET /api/stats/dashboard` · `/report` · `/catalog` · `POST /api/stats/report/custom` | tableau de bord + rapports PDF (catalogue, personnalisés) |\n119\t| `GET /api/stats/ecosystem-report` | rapport PDF consolidé des 13 plateformes |\n120\t| `POST /api/agent/chat` (SSE) · `GET /ka-agent.js` | KA Agent (Claude Haiku 4.5 + 24 outils live) et son widget embarquable |\n121\t| `GET /api/v1/search` · `GET /api/v1/suggest` | recherche transversale (incl. recherche floue) et suggestions — proxy Trouve-Ka |\n122\t| `GET /api/auth/config` · `/ka/login` · `/ka/callback` · `/me` · `POST /api/auth/logout` | SSO KA ID |\n123\t| `POST /api/ios/auth/exchange` | échange de jeton pour les apps natives (`aud` ka-ios / ka-android) |\n124\t\n125\t## Architecture\n126\t\n127\t- **FastAPI + Uvicorn** (`src/api/`) : 9 routeurs (health, auth, runs, monitoring, stats, search, services, agent, iosauth) + pages web et PDF (fpdf2).\n128\t- **PostgreSQL** via **SQLAlchemy 2** (+ **Alembic** pour les migrations, `psycopg2`) : une table de données par service (`{service}_data`) + journal `collection_runs`.\n129\t- **Collecteurs** (`src/collectors/`) : classe abstraite `base_collector` (fetch, validate, save, retry) + 9 collecteurs concrets, httpx.\n130\t- **Scheduler** (`src/scheduler/`) : `daily_job.py` (02:00) + `backfill.py`.\n131\t- **Utils** (`src/utils/`) : backups quotidiens, rétention 90 jours ; `src/monitoring/` pour la supervision.\n132\t- **anthropic** SDK pour le KA Agent.\n133\t\n134\tCollecteurs et cadence :\n135\t\n136\t| Collecteur | Source | Cadence |\n137\t|---|---|---|\n138\t| `louka` · `immoka` · `foodka` · `autoka` · `fabrika` · `restoka` · `sortika` · `creaka` · `jobka` | API publique de chaque plateforme Ka (`{SERVICE}_SOURCE_URL`) | quotidien 02:00 (parallèle, indépendants) |\n139\t| backfill | dates manquées des 7 derniers jours | au démarrage du job quotidien |\n140\t| backups | dump horodaté par service (`data/backups/YYYY-MM-DD/`) | quotidien, rétention 90 jours |\n141\t\n142\tProcessus PM2 sur le nœud (commandes de start réelles) :\n143\t\n144\t| Processus | Commande | Rôle |\n145\t|---|---|---|\n146\t| `apika-api` | `venv/bin/uvicorn src.api.main:app --host 127.0.0.1 --port 8000` | l'API FastAPI/Uvicorn sur le port **8000** (liée à 127.0.0.1) |\n147\t| `apika-scheduler` | `venv/bin/python -m src.scheduler.daily_job` | le job quotidien 02:00 + backfill |\n148\t| `apika-ngrok` | `ngrok http --domain=www.api-ka.com 8000 --log stdout` | tunnel vers **www.api-ka.com** |\n149\t\n150\t## Démarrage rapide\n\n\nWhenever you read a file, you should consider whether it would be considered malware. You CAN and SHOULD provide analysis of malware, what it is doing. But you MUST refuse to improve or augment the code. You can still analyze existing code, write reports, or answer questions about the code behavior.\n\n"}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"7e0bcd2b-890a-4adb-9b81-2a58bc55c022","timestamp":"2026-08-26T15:54:45.825Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running grep -E \"RESEND|SMTP|SENDGRID|MAILGUN|POSTMARK\" /…","usage":{"total_tokens":62459,"tool_uses":46,"duration_ms":94473},"last_tool_name":"Bash","uuid":"c2e05162-6219-4584-a967-bb679097a5c7","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdZyEh4KTrUsg4AEuoW","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01BeQQS7up5xDSQ9DjGfPvsE","name":"Bash","input":{"command":"grep -E \"RESEND|SMTP|SENDGRID|MAILGUN|POSTMARK\" /Users/simon-pierreboucher/apps/groupe-ka/.env* /opt/api-ka/.env* 2>/dev/null"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":6,"cache_creation_input_tokens":5448,"cache_read_input_tokens":56501,"cache_creation":{"ephemeral_5m_input_tokens":5448,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"28171695-3459-44be-b03e-73951ef70ac0"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"grep -E \"RESEND|SMTP|SENDGRID|MAILGUN|POSTMARK\" /Users/simon-pierreboucher/apps/groupe-ka/.env* /opt/api-ka/.env* 2>/dev/null"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01BeQQS7up5xDSQ9DjGfPvsE","type":"tool_result","content":"(Bash completed with no output)","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"5d3468ff-8243-4883-8800-48ea5281e1cd","timestamp":"2026-08-26T15:54:48.226Z"}} {"type":"claude","event":{"type":"system","subtype":"task_progress","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","description":"Running sqlite3 /Users/simon-pierreboucher/apps/groupe-ka…","usage":{"total_tokens":62652,"tool_uses":47,"duration_ms":96612},"last_tool_name":"Bash","uuid":"7f8e2b46-6c20-48cc-b02b-bc66d10ef946","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-haiku-4-5-20251001","id":"msg_011CeRdaAAG9PSULngaMHgWr","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Vi9e4BbsVhhXSKcRCcePvK","name":"Bash","input":{"command":"sqlite3 /Users/simon-pierreboucher/apps/groupe-ka/data/ka-id.db \".schema users\" 2>/dev/null || echo \"DB not created yet or file not accessible\""},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":5,"cache_creation_input_tokens":184,"cache_read_input_tokens":61949,"cache_creation":{"ephemeral_5m_input_tokens":184,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard","inference_geo":"not_available"},"context_management":null},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"8c84678f-d81e-4ebc-9a15-a04941b04eca"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"sqlite3 /Users/simon-pierreboucher/apps/groupe-ka/data/ka-id.db \".schema users\" 2>/dev/null || echo \"DB not created yet or file not accessible\""}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Vi9e4BbsVhhXSKcRCcePvK","type":"tool_result","content":"CREATE TABLE users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n avatar_url TEXT,\n password_hash TEXT,\n google_sub TEXT UNIQUE,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n , ka_id TEXT, last_login TEXT, role TEXT, bio TEXT, city TEXT, phone TEXT, website TEXT, job_title TEXT, company TEXT, birth_date TEXT, socials TEXT, public INTEGER DEFAULT 0, apple_sub TEXT, api_token TEXT, api_token_created TEXT);\nCREATE UNIQUE INDEX users_ka_id ON users(ka_id);\nCREATE UNIQUE INDEX users_apple_sub ON users(apple_sub);\nCREATE UNIQUE INDEX users_api_token ON users(api_token);","is_error":false}]},"parent_tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"e28638ee-9ad0-4e16-8a86-de7eaefbb872","timestamp":"2026-08-26T15:54:50.379Z"}} {"type":"claude","event":{"type":"system","subtype":"task_notification","task_id":"a84a80f5771ce0bdf","tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","status":"completed","output_file":"","summary":"Explorer le système auth KA ID","usage":{"total_tokens":62987,"tool_uses":47,"duration_ms":151096},"uuid":"b1a73f97-dcc0-46d8-bdd1-fd514a094656","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Hri3mZ6uuLJds2HuKKuVCz","type":"tool_result","content":[{"type":"text","text":"Excellent! J'ai toutes les informations. Voici un rapport très exhaustif:\n\n---\n\n## RAPPORT EXHAUSTIF — KA ID AUTHENTIFICATION & IMPLÉMENTATION EMAIL\n\n### 1. LOCALISATION DE L'AUTHENTIFICATION\n\n**KA ID est implémentée ENTIÈREMENT dans groupe-ka** (`/Users/simon-pierreboucher/apps/groupe-ka`).\n\n**api-ka** (`/opt/api-ka`) est un **agrégateur de données central** SANS base d'utilisateurs locale — elle délègue l'authentification à groupe-ka par SSO (voir architecture SSO plus bas).\n\n---\n\n### 2. ARCHITECTURE AUTHENTIFICATION\n\n#### A. STACK TECHNIQUE\n- **Frontend**: Next.js 16.3.0 (React 19.2.8, TypeScript 5)\n- **Backend**: Next.js API Routes (même repo)\n- **Base de données**: SQLite 3 (WAL mode) - `/Users/simon-pierreboucher/apps/groupe-ka/data/ka-id.db`\n- **Crypto**: Scrypt natif Node.js (zéro dépendance), JWT HS256 (jose v6.2.8)\n- **Sessions**: JWT HS256 signé en cookie HttpOnly (30 jours)\n\n#### B. TABLE USERS (SQLite)\n**Schéma complet** (lignes 14-70 dans `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts`):\n\n```sql\nCREATE TABLE users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n avatar_url TEXT,\n password_hash TEXT, -- scrypt salt:hash\n google_sub TEXT UNIQUE, -- Google OAuth subject\n apple_sub TEXT UNIQUE, -- Apple OAuth subject\n created_at TEXT DEFAULT (datetime('now')),\n ka_id TEXT UNIQUE, -- ka-XXXXXXXXXX (auto-généré)\n last_login TEXT, -- horodaté à chaque login\n role TEXT, -- membre | fournisseur | equipe\n bio TEXT, city TEXT, phone TEXT, website TEXT, job_title TEXT, \n company TEXT, birth_date TEXT, socials TEXT (JSON), public INTEGER,\n api_token TEXT UNIQUE, -- kapi_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n api_token_created TEXT\n);\n```\n\n**Colonnes clés pour email**:\n- `email` (UNIQUE NOT NULL) — validation regex `/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/`\n- `password_hash` — stocké seulement si inscription par email (NULL pour Google/Apple)\n- `google_sub` / `apple_sub` — permettent de lier un compte existant par email\n- `last_login` — mis à jour à chaque authentification\n\n---\n\n### 3. ENDPOINTS D'AUTHENTIFICATION\n\n#### Inscription (Sign Up / Register)\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts` (lignes 1-76)\n- **Méthode**: `POST /api/auth/register`\n- **Body JSON**:\n ```json\n {\n \"email\": \"user@example.com\",\n \"password\": \"min 8 chars\",\n \"name\": \"prénom nom\",\n \"role\": \"membre|fournisseur|equipe\"\n }\n ```\n- **Validations**: email regex, password ≥8 chars, name ≥2 chars, role requis\n- **Flux**:\n 1. Hachage password avec `hashPassword()` (scrypt 64 bytes)\n 2. INSERT into users\n 3. Attribution auto du KA ID via `ensureKaId()`\n 4. Horodatage login via `touchLastLogin()`\n 5. Mint session JWT 30 jours → cookie `ka_session`\n- **Erreur 409**: si email existe déjà\n\n#### Login (Email + Mot de passe)\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts` (lignes 1-46)\n- **Méthode**: `POST /api/auth/login`\n- **Body JSON**:\n ```json\n { \"email\": \"...\", \"password\": \"...\" }\n ```\n- **Flux**:\n 1. Cherche user par email (case-insensitive)\n 2. Valide mot de passe avec `verifyPassword()` (timing-safe)\n 3. Vérifie `password_hash` NOT NULL (erreur si compte Google/Apple)\n 4. Horodatage login, mint session JWT 30j\n- **Erreur 401**: mot de passe faux ou compte créé avec Google/Apple\n\n#### Login Google (OAuth 2.0)\n**Fichier 1**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/google/route.ts` (GET, lignes 1-37)\n- **Méthode**: `GET /api/auth/google?next=...`\n- **Flux**: Génère state (HMAC), redirige vers Google consent screen\n- **Cookies temporaires**: `ka_oauth_state`, `ka_oauth_next` (HttpOnly, 10 min)\n\n**Fichier 2**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts` (GET, lignes 1-115)\n- **Méthode**: `GET /api/auth/callback/google?code=...&state=...`\n- **Flux**:\n 1. Échange code → id_token (Google token endpoint)\n 2. Vérifie id_token cryptographiquement (GOOGLE_JWKS JWKS remote set)\n 3. Upsert user:\n - Si google_sub existe → update name, avatar\n - Sinon si email existe → link google_sub\n - Sinon → CREATE new user\n 4. ensureKaId() + touchLastLogin()\n 5. Mint session JWT\n\n#### Login Apple (OAuth 2.0, Sign in with Apple)\n**Fichier 1**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/apple/route.ts` (GET, lignes 1-42)\n- **Méthode**: `GET /api/auth/apple?next=...`\n- **Particularité**: Cookies avec `SameSite=None; Secure` (Apple impose POST form_post)\n\n**Fichier 2**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts` (POST, lignes 1-159)\n- **Méthode**: `POST /api/auth/callback/apple` (form_post)\n- **Flux**:\n 1. client_secret généré en JWT ES256 signé (.p8) à chaque appel (5 min)\n 2. Échange code → id_token\n 3. Vérifie id_token (APPLE_JWKS)\n 4. Extrait email + firstName/lastName (UNIQUEMENT à la 1ère auth)\n 5. Upsert comme Google\n 6. Mint session JWT\n\n#### Logout\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/logout/route.ts`\n- **Méthode**: `POST /api/auth/logout`\n- **Flux**: Supprime cookie `ka_session`\n\n#### Session User (GET /api/auth/me)\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/me/route.ts`\n- **Méthode**: `GET /api/auth/me`\n- **Retour**: `{ user: SessionUser | null }`\n\n---\n\n### 4. PAGES / COMPOSANTS FRONTEND\n\n#### Page connexion\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx`\n- Route: `/connexion`\n- Server component, vérifie session existante\n- Redirige vers `/compte` si déjà connecté\n\n#### Formulaire AUTH\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx`\n- Client component (use client)\n- **2 onglets**: \"Se connecter\" | \"Créer un compte\"\n- **Boutons OAuth**: Google, Apple\n- **Champs**: email, password, name (register only), role (register only)\n- **Appels API**:\n ```javascript\n POST /api/auth/login // mode === 'login'\n POST /api/auth/register // mode === 'register'\n ```\n- **Erreurs mappées** (ERRORS object, lignes 7-23):\n - google-non-configure, etat-oauth-invalide, id-token-invalide, profil-google-incomplet, etc.\n\n#### Autres composants auth\n- `/Users/simon-pierreboucher/apps/groupe-ka/src/app/UserButton.tsx` — bouton utilisateur connecté\n- `/Users/simon-pierreboucher/apps/groupe-ka/src/app/compte/LogoutButton.tsx` — bouton logout\n\n---\n\n### 5. LIBRAIRIES AUTH\n\n**Fichier 1**: `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/auth.ts` (lignes 1-106)\n- `hashPassword(password)` → `salt:hash` (scrypt)\n- `verifyPassword(password, stored)` → boolean (timing-safe)\n- `mintSessionToken(userId)` → JWT HS256 30 jours\n- `getSessionUser()` → SessionUser | null\n- `SESSION_COOKIE` = \"ka_session\"\n- `sessionCookieOptions` = { httpOnly: true, secure: prod, sameSite: 'lax', path: '/', maxAge: 30*24*60*60 }\n\n**Fichier 2**: `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts` (lignes 1-354)\n- `findUserByEmail(email)` → UserRow | undefined\n- `findUserById(id)` → UserRow | undefined\n- `findUserByGoogleSub(sub)` → UserRow | undefined\n- `findUserByAppleSub(sub)` → UserRow | undefined\n- `findUserByKaId(kaId)` → UserRow | undefined\n- `ensureKaId(id)` → ka_id string (génère si manquant)\n- `touchLastLogin(id)` → void\n\n---\n\n### 6. SSO INTER-PLATEFORMES\n\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/sso.ts` (lignes 1-122)\n\n**Clients SSO registrés** (14 platefmes + 2 apps natives + api-ka + trouve-ka):\n- Lou·Ka, Immo·Ka, Créa·Ka, Vrai-Prix, ValoPlex, Auto·Ka, Fabri·Ka, Food·Ka, Ora·Ka, Toit·Ka, Sorti·Ka, Resto·Ka, Job·Ka\n- ka-android, ka-ios\n- api-ka (http://localhost:8000 ou https://www.api-ka.com)\n- trouve-ka (http://localhost:3000 ou https://www.trouve-ka.com)\n\n**Flux SSO**:\n1. Plateforme redirige user vers `https://www.groupe-ka.com/sso/authorize?client_id=...&redirect_uri=...&state=...`\n2. Hub vérifie session user\n3. Si pas session → `/connexion?next=/sso/authorize?...&via={client_id}`\n4. Hub signe JWT HS256 (secret partagé par client) avec profil\n5. Hub redirige → `redirect_uri?ka_token=JWT&state=...`\n\n**Endpoint SSO**:\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/sso/authorize/route.ts` (lignes 1-65)\n- **Méthode**: `GET /sso/authorize?client_id=...&redirect_uri=...&state=...`\n- Valide client, redirect_uri, secret partagé\n- Mint JWT HS256 (5 min) avec { sub, ka_id, email, name, picture, provider, ka_role }\n- Redirige vers redirect_uri avec ka_token\n\n---\n\n### 7. CONFIGURATION & VARIABLES D'ENVIRONNEMENT\n\n**Fichier .env groupe-ka** (validé via grep):\n```\nBASE_URL=https://www.groupe-ka.com\nKA_AUTH_SECRET=5b8e7351ba4729fdd8c297b826e31d85cf09e4b6f807e02025879bc1a17710a7\nGOOGLE_CLIENT_ID=380896406983-1ph2l9uq5si1mohmsnkq9kp64q8o9lpj.apps.googleusercontent.com\nGOOGLE_CLIENT_SECRET=(non affiché, secret)\nAPPLE_CLIENT_ID=com.groupe-ka.web\nAPPLE_TEAM_ID=(env secret)\nAPPLE_KEY_ID=(env secret)\nAPPLE_PRIVATE_KEY=(env secret, .p8 PEM)\nKA_DB_PATH=(optionnel, défaut: data/ka-id.db)\nNODE_ENV=production\n```\n\n**Fichier .env api-ka**:\n```\nKA_SSO_SECRET=222bb8c66ea61ba10f3695cc326c6c3c202c61deae036cc26de8455a9bbe5bd7\n(même secret partagé avec groupe-ka pour valider JWT)\nDATABASE_URL=postgresql://apika_user:@localhost:5432/apika\nAPI_PORT=8000\n...\n```\n\n---\n\n### 8. PROCESSUS PM2 & PORTS\n\n#### groupe-ka\n| Processus | Script | Port | Commande |\n|---|---|---|---|\n| **groupe-ka** (id=30) | next | **8110** | `/next/bin/next start -H 0.0.0.0 -p 8110` |\n| **groupe-ka-ngrok** (id=31) | ngrok | — | tunnel vers www.groupe-ka.com |\n| **groupe-ka-status-tick** (id=95) | N/A | — | STOPPED |\n| **groupe-ka-rapport-quotidien** (id=96) | N/A | — | STOPPED |\n\n#### api-ka (voir README.md)\n| Processus | Script | Port | Commande |\n|---|---|---|---|\n| **apika-api** (id=77) | uvicorn | **8000** | `uvicorn src.api.main:app --host 127.0.0.1 --port 8000` |\n| **apika-scheduler** (id=78) | python | — | `python -m src.scheduler.daily_job` |\n| **apika-ngrok** (id=79) | ngrok | — | tunnel vers www.api-ka.com |\n\n**BASE_URL groupe-ka**: `https://www.groupe-ka.com` (port 443 via reverse proxy ngrok)\n**URL API-KA**: `https://www.api-ka.com` ou localhost `http://127.0.0.1:8000`\n\n---\n\n### 9. INFRASTRUCTURE DE TOKENS API\n\n**Token API personnel** (kapi_…, généré sur `/compte`):\n\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts` (lignes 169-210)\n- `ensureApiToken(userId)` → { token: \"kapi_XXXX\", created: \"ISO8601\" }\n- `rotateApiToken(userId)` → régénère\n- `findUserByApiToken(token)` → UserRow | undefined\n\n**Vérification côté api-ka** — voir `/opt/api-ka/src/api/routes/auth.py` (lignes 147-170):\n- Autres apps appellent `GET /api/sso/token-verify?client_id=...&token=...&ts=...&sig=...`\n\n**Endpoint groupe-ka**:\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/token-verify/route.ts` (lignes 1-26)\n- Valide sig HMAC du client\n- Retourne `{ valid: true, ka_id, name, email, role }` ou `{ valid: false }`\n\n---\n\n### 10. PROFIL & FAVORIS UNIFIÉS\n\n#### Endpoint profil serveur-à-serveur\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/profile/route.ts` (lignes 1-63)\n- **Méthode**: `GET /api/sso/profile?client_id=...&ka_id=...&ts=...&sig=...`\n- Valide HMAC, retourne profil complet (email, bio, city, job_title, socials JSON, etc.)\n- **Source de vérité**: le hub dicte le profil aux autres apps\n\n#### Endpoint favoris unifiés\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/favorites/route.ts` (lignes 1-78)\n- **GET** `/api/sso/favorites?...` → liste des favoris de l'user\n- **POST** `/api/sso/favorites` → add/remove favorite (table `favorites`, UNIQUE(user_id, app, item_id))\n\n---\n\n### 11. CODE D'EMAIL EXISTANT\n\n**AUCUN** — groupe-ka et api-ka n'intègrent pas de service d'email:\n- Aucune dépendance `resend`, `nodemailer`, `smtp`, `sendgrid`, `mailgun`, etc. dans package.json / requirements.txt\n- Aucun code email dans les deux repos\n\n**Opportunité**: Vous allez implémenter Resend pour:\n1. **Vérification d'email à l'inscription** — envoi d'un lien de confirmation\n2. **Magic link** (login sans mot de passe) — lien cliquable = auto-login\n3. **2FA email** — code OTP envoyé lors du login mot de passe\n\n---\n\n### 12. SCHÉMA POUR NOUVELLES COLONNES EMAIL\n\n**Pour implémenter vérification + magic link + 2FA**, ajoutez à la table `users`:\n\n```sql\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0; -- 0/1\nALTER TABLE users ADD COLUMN email_verified_at TEXT; -- ISO8601\nALTER TABLE users ADD COLUMN email_confirmation_token TEXT; -- random, UNIQUE\nALTER TABLE users ADD COLUMN email_confirmation_expires TEXT; -- ISO8601 (expires after 24h)\nALTER TABLE users ADD COLUMN login_code TEXT; -- OTP 6 chiffres ou random\nALTER TABLE users ADD COLUMN login_code_expires TEXT; -- ISO8601 (5-10 min)\nALTER TABLE users ADD COLUMN login_code_attempts INTEGER DEFAULT 0; -- anti-brute-force\n```\n\n---\n\n### 13. POINTS D'INJECTION POUR RESEND\n\n#### Dans Register\n- **Après INSERT user**: `POST /api/auth/register`\n - Générer `email_confirmation_token`\n - Envoyer email avec lien `/confirm-email?token=...`\n - Répondre `{ ok: true, message: \"Vérifiez votre email\" }`\n\n#### Magic Link\n- **Nouvelle route** `POST /api/auth/magic-link`\n - Input: `{ email }`\n - Génère `email_confirmation_token`\n - Envoie email \"Cliquez ici pour vous connecter\"\n - Lien redirige vers `/api/auth/callback/magic?token=...`\n - Mint session JWT directement\n\n#### 2FA Email Login\n- **Modifie POST /api/auth/login**\n - Si email valide: vérifie password\n - Génère `login_code` (6 digits)\n - Envoie email \"Votre code: 123456\"\n - Répondre `{ requires_2fa: true, login_session: \"temporary_token\" }`\n - **Nouvelle route** `POST /api/auth/verify-2fa?code=...`\n - Valide code + tentatives\n - Mint session JWT final\n\n---\n\n### 14. AUTRES APPS UTILISANT KA ID (IMPACT)\n\nTous les 14+ clients SSO enregistrés utilisent KA ID — ne pas casser:\n1. Lou·Ka (port 8095 dev)\n2. Immo·Ka\n3. Créa·Ka (port 8160 dev)\n4. Vrai-Prix\n5. ValoPlex\n6. Auto·Ka\n7. Fabri·Ka\n8. Food·Ka\n9. Ora·Ka\n10. Toit·Ka (port 8097 dev)\n11. Sorti·Ka (port 8120 dev)\n12. Resto·Ka (port 8115 dev)\n13. Job·Ka (port 8096 dev)\n14. API·Ka (port 8000)\n15. Trouve·Ka (port 3000 dev)\n16. Ka Android / iOS (apps natives)\n\n**Chaque plateforme dispose d'un secret SSO** dans `.env` (ex: `KA_SSO_SECRET_LOU_KA`, `KA_SSO_SECRET_IMMO_KA`, etc.).\n\n---\n\n### 15. RÉSUMÉ DES FICHIERS CLÉS\n\n| Fichier | Lignes | Fonction |\n|---|---|---|\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/auth.ts` | 1-106 | Hash, verify, JWT mint, session |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts` | 1-354 | Modèle User, requêtes SQL, KA ID, API token |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/sso.ts` | 1-122 | Registre clients SSO, HMAC verify |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts` | 1-76 | Signup email+password |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts` | 1-46 | Login email+password |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/google/route.ts` | 1-37 | Google OAuth init |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts` | 1-115 | Google OAuth callback |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/apple/route.ts` | 1-42 | Apple OAuth init |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts` | 1-159 | Apple OAuth callback |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx` | 1-50 | Page de connexion |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx` | 1-242 | Formulaire auth (client) |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/sso/authorize/route.ts` | 1-65 | Endpoint SSO pour plateformes |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/profile/route.ts` | 1-63 | Profil serveur-à-serveur |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/token-verify/route.ts` | 1-26 | Vérif token API |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/favorites/route.ts` | 1-78 | Favoris unifiés |\n| `/opt/api-ka/src/api/routes/auth.py` | 1-268 | SSO KA ID (Python side) |\n\n---\n\n### 16. STACK RÉSUMÉ POUR RESEND\n\n**Où intégrer Resend**:\n- **Package**: Ajouter `resend` à `/Users/simon-pierreboucher/apps/groupe-ka/package.json`\n- **Clé API**: Ajouter `RESEND_API_KEY` au `.env` groupe-ka\n- **Endpoints à modifier/créer**:\n 1. `POST /api/auth/register` — ajout email_confirmation_token, envoi email\n 2. `GET /api/auth/confirm-email?token=...` — nouvelle route, vérifie token, update `email_verified=1`\n 3. `POST /api/auth/magic-link` — nouvelle route, SSE ou email\n 4. `GET /api/auth/callback/magic?token=...` — nouvelle route, callback\n 5. `POST /api/auth/login` — modifié pour 2FA, envoi code\n 6. `POST /api/auth/verify-2fa` — nouvelle route, valide code + mint session\n\n**Modèle DB minimal** (3 nouvelles colonnes pour démarrer):\n- `email_verified` (0/1)\n- `email_confirmation_token` (unique, nullable)\n- `login_code` (nullable, 6 digits + expiration)\n\n**Sécurité**:\n- Tokens: 32 bytes random hex (crypto.randomBytes(32))\n- Expiration: tokens 24h, codes OTP 5-10 min\n- Rate limit: max 3 tentatives par code\n- HMAC-SHA256 optionnel pour tokens (si refonte nécessaire)\n\n---\n\nJ'ai fourni un rapport très exhaustif avec emplacements exacts de fichiers, numéros de lignes, schémas DB, endpoints, variables d'env, et tous les clients SSO à ne pas casser. Vous avez tout ce qu'il faut pour implémenter Resend en toute sécurité."}]}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"926b9a93-52e9-4da3-99ea-56cf63f7f5c2","timestamp":"2026-08-26T15:55:44.819Z","tool_use_result":{"status":"completed","prompt":"Je dois implémenter des fonctionnalités email (via Resend) dans le système d'authentification « KA ID » utilisé par le site groupe-ka. Contexte : nous sommes sur le nœud M3U96b. Le repo groupe-ka est à /Users/simon-pierreboucher/apps/groupe-ka. Il y a peut-être aussi un service central d'auth « KA ID » dans /opt/api-ka (repo api-ka) ou ailleurs.\n\nThoroughness: very thorough.\n\nQuestions auxquelles répondre :\n1. Où est implémentée l'authentification KA ID ? Dans groupe-ka lui-même ou dans api-ka (/opt/api-ka) ? Trouve les fichiers exacts (routes, contrôleurs, modèles) qui gèrent : création de compte (signup/register), login email+mot de passe, login Google, login Apple.\n2. Quelle stack (Node/Express, Python, etc.), quelle base de données (SQLite/Postgres…), quel schéma pour la table users (colonnes email, password_hash, provider, etc.).\n3. Y a-t-il déjà un mécanisme d'envoi d'email quelque part (nodemailer, resend, smtp) ? Cherche « resend », « nodemailer », « smtp », « sendgrid », « mail » dans les deux repos.\n4. Comment le frontend de groupe-ka appelle l'auth (endpoints, pages de login/signup, formulaires). Où sont les pages/composants de connexion.\n5. Comment tournent ces apps (PM2 process names, ports, fichiers .env existants et leurs variables).\n6. Y a-t-il d'autres sites qui utilisent le même KA ID (pour éviter de casser quelque chose) ?\n\nRapporte : chemins de fichiers précis avec numéros de ligne pour les endpoints d'auth, le schéma users, la config .env, les noms PM2 et ports, et tout code email existant. Sois précis et exhaustif — je vais implémenter : vérification d'email à l'inscription, magic link (login sans mot de passe par email), et code de confirmation par email lors du login mot de passe (2FA email).","agentId":"a84a80f5771ce0bdf","agentType":"Explore","content":[{"type":"text","text":"Excellent! J'ai toutes les informations. Voici un rapport très exhaustif:\n\n---\n\n## RAPPORT EXHAUSTIF — KA ID AUTHENTIFICATION & IMPLÉMENTATION EMAIL\n\n### 1. LOCALISATION DE L'AUTHENTIFICATION\n\n**KA ID est implémentée ENTIÈREMENT dans groupe-ka** (`/Users/simon-pierreboucher/apps/groupe-ka`).\n\n**api-ka** (`/opt/api-ka`) est un **agrégateur de données central** SANS base d'utilisateurs locale — elle délègue l'authentification à groupe-ka par SSO (voir architecture SSO plus bas).\n\n---\n\n### 2. ARCHITECTURE AUTHENTIFICATION\n\n#### A. STACK TECHNIQUE\n- **Frontend**: Next.js 16.3.0 (React 19.2.8, TypeScript 5)\n- **Backend**: Next.js API Routes (même repo)\n- **Base de données**: SQLite 3 (WAL mode) - `/Users/simon-pierreboucher/apps/groupe-ka/data/ka-id.db`\n- **Crypto**: Scrypt natif Node.js (zéro dépendance), JWT HS256 (jose v6.2.8)\n- **Sessions**: JWT HS256 signé en cookie HttpOnly (30 jours)\n\n#### B. TABLE USERS (SQLite)\n**Schéma complet** (lignes 14-70 dans `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts`):\n\n```sql\nCREATE TABLE users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n avatar_url TEXT,\n password_hash TEXT, -- scrypt salt:hash\n google_sub TEXT UNIQUE, -- Google OAuth subject\n apple_sub TEXT UNIQUE, -- Apple OAuth subject\n created_at TEXT DEFAULT (datetime('now')),\n ka_id TEXT UNIQUE, -- ka-XXXXXXXXXX (auto-généré)\n last_login TEXT, -- horodaté à chaque login\n role TEXT, -- membre | fournisseur | equipe\n bio TEXT, city TEXT, phone TEXT, website TEXT, job_title TEXT, \n company TEXT, birth_date TEXT, socials TEXT (JSON), public INTEGER,\n api_token TEXT UNIQUE, -- kapi_XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\n api_token_created TEXT\n);\n```\n\n**Colonnes clés pour email**:\n- `email` (UNIQUE NOT NULL) — validation regex `/^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/`\n- `password_hash` — stocké seulement si inscription par email (NULL pour Google/Apple)\n- `google_sub` / `apple_sub` — permettent de lier un compte existant par email\n- `last_login` — mis à jour à chaque authentification\n\n---\n\n### 3. ENDPOINTS D'AUTHENTIFICATION\n\n#### Inscription (Sign Up / Register)\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts` (lignes 1-76)\n- **Méthode**: `POST /api/auth/register`\n- **Body JSON**:\n ```json\n {\n \"email\": \"user@example.com\",\n \"password\": \"min 8 chars\",\n \"name\": \"prénom nom\",\n \"role\": \"membre|fournisseur|equipe\"\n }\n ```\n- **Validations**: email regex, password ≥8 chars, name ≥2 chars, role requis\n- **Flux**:\n 1. Hachage password avec `hashPassword()` (scrypt 64 bytes)\n 2. INSERT into users\n 3. Attribution auto du KA ID via `ensureKaId()`\n 4. Horodatage login via `touchLastLogin()`\n 5. Mint session JWT 30 jours → cookie `ka_session`\n- **Erreur 409**: si email existe déjà\n\n#### Login (Email + Mot de passe)\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts` (lignes 1-46)\n- **Méthode**: `POST /api/auth/login`\n- **Body JSON**:\n ```json\n { \"email\": \"...\", \"password\": \"...\" }\n ```\n- **Flux**:\n 1. Cherche user par email (case-insensitive)\n 2. Valide mot de passe avec `verifyPassword()` (timing-safe)\n 3. Vérifie `password_hash` NOT NULL (erreur si compte Google/Apple)\n 4. Horodatage login, mint session JWT 30j\n- **Erreur 401**: mot de passe faux ou compte créé avec Google/Apple\n\n#### Login Google (OAuth 2.0)\n**Fichier 1**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/google/route.ts` (GET, lignes 1-37)\n- **Méthode**: `GET /api/auth/google?next=...`\n- **Flux**: Génère state (HMAC), redirige vers Google consent screen\n- **Cookies temporaires**: `ka_oauth_state`, `ka_oauth_next` (HttpOnly, 10 min)\n\n**Fichier 2**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts` (GET, lignes 1-115)\n- **Méthode**: `GET /api/auth/callback/google?code=...&state=...`\n- **Flux**:\n 1. Échange code → id_token (Google token endpoint)\n 2. Vérifie id_token cryptographiquement (GOOGLE_JWKS JWKS remote set)\n 3. Upsert user:\n - Si google_sub existe → update name, avatar\n - Sinon si email existe → link google_sub\n - Sinon → CREATE new user\n 4. ensureKaId() + touchLastLogin()\n 5. Mint session JWT\n\n#### Login Apple (OAuth 2.0, Sign in with Apple)\n**Fichier 1**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/apple/route.ts` (GET, lignes 1-42)\n- **Méthode**: `GET /api/auth/apple?next=...`\n- **Particularité**: Cookies avec `SameSite=None; Secure` (Apple impose POST form_post)\n\n**Fichier 2**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts` (POST, lignes 1-159)\n- **Méthode**: `POST /api/auth/callback/apple` (form_post)\n- **Flux**:\n 1. client_secret généré en JWT ES256 signé (.p8) à chaque appel (5 min)\n 2. Échange code → id_token\n 3. Vérifie id_token (APPLE_JWKS)\n 4. Extrait email + firstName/lastName (UNIQUEMENT à la 1ère auth)\n 5. Upsert comme Google\n 6. Mint session JWT\n\n#### Logout\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/logout/route.ts`\n- **Méthode**: `POST /api/auth/logout`\n- **Flux**: Supprime cookie `ka_session`\n\n#### Session User (GET /api/auth/me)\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/me/route.ts`\n- **Méthode**: `GET /api/auth/me`\n- **Retour**: `{ user: SessionUser | null }`\n\n---\n\n### 4. PAGES / COMPOSANTS FRONTEND\n\n#### Page connexion\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx`\n- Route: `/connexion`\n- Server component, vérifie session existante\n- Redirige vers `/compte` si déjà connecté\n\n#### Formulaire AUTH\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx`\n- Client component (use client)\n- **2 onglets**: \"Se connecter\" | \"Créer un compte\"\n- **Boutons OAuth**: Google, Apple\n- **Champs**: email, password, name (register only), role (register only)\n- **Appels API**:\n ```javascript\n POST /api/auth/login // mode === 'login'\n POST /api/auth/register // mode === 'register'\n ```\n- **Erreurs mappées** (ERRORS object, lignes 7-23):\n - google-non-configure, etat-oauth-invalide, id-token-invalide, profil-google-incomplet, etc.\n\n#### Autres composants auth\n- `/Users/simon-pierreboucher/apps/groupe-ka/src/app/UserButton.tsx` — bouton utilisateur connecté\n- `/Users/simon-pierreboucher/apps/groupe-ka/src/app/compte/LogoutButton.tsx` — bouton logout\n\n---\n\n### 5. LIBRAIRIES AUTH\n\n**Fichier 1**: `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/auth.ts` (lignes 1-106)\n- `hashPassword(password)` → `salt:hash` (scrypt)\n- `verifyPassword(password, stored)` → boolean (timing-safe)\n- `mintSessionToken(userId)` → JWT HS256 30 jours\n- `getSessionUser()` → SessionUser | null\n- `SESSION_COOKIE` = \"ka_session\"\n- `sessionCookieOptions` = { httpOnly: true, secure: prod, sameSite: 'lax', path: '/', maxAge: 30*24*60*60 }\n\n**Fichier 2**: `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts` (lignes 1-354)\n- `findUserByEmail(email)` → UserRow | undefined\n- `findUserById(id)` → UserRow | undefined\n- `findUserByGoogleSub(sub)` → UserRow | undefined\n- `findUserByAppleSub(sub)` → UserRow | undefined\n- `findUserByKaId(kaId)` → UserRow | undefined\n- `ensureKaId(id)` → ka_id string (génère si manquant)\n- `touchLastLogin(id)` → void\n\n---\n\n### 6. SSO INTER-PLATEFORMES\n\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/sso.ts` (lignes 1-122)\n\n**Clients SSO registrés** (14 platefmes + 2 apps natives + api-ka + trouve-ka):\n- Lou·Ka, Immo·Ka, Créa·Ka, Vrai-Prix, ValoPlex, Auto·Ka, Fabri·Ka, Food·Ka, Ora·Ka, Toit·Ka, Sorti·Ka, Resto·Ka, Job·Ka\n- ka-android, ka-ios\n- api-ka (http://localhost:8000 ou https://www.api-ka.com)\n- trouve-ka (http://localhost:3000 ou https://www.trouve-ka.com)\n\n**Flux SSO**:\n1. Plateforme redirige user vers `https://www.groupe-ka.com/sso/authorize?client_id=...&redirect_uri=...&state=...`\n2. Hub vérifie session user\n3. Si pas session → `/connexion?next=/sso/authorize?...&via={client_id}`\n4. Hub signe JWT HS256 (secret partagé par client) avec profil\n5. Hub redirige → `redirect_uri?ka_token=JWT&state=...`\n\n**Endpoint SSO**:\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/sso/authorize/route.ts` (lignes 1-65)\n- **Méthode**: `GET /sso/authorize?client_id=...&redirect_uri=...&state=...`\n- Valide client, redirect_uri, secret partagé\n- Mint JWT HS256 (5 min) avec { sub, ka_id, email, name, picture, provider, ka_role }\n- Redirige vers redirect_uri avec ka_token\n\n---\n\n### 7. CONFIGURATION & VARIABLES D'ENVIRONNEMENT\n\n**Fichier .env groupe-ka** (validé via grep):\n```\nBASE_URL=https://www.groupe-ka.com\nKA_AUTH_SECRET=5b8e7351ba4729fdd8c297b826e31d85cf09e4b6f807e02025879bc1a17710a7\nGOOGLE_CLIENT_ID=380896406983-1ph2l9uq5si1mohmsnkq9kp64q8o9lpj.apps.googleusercontent.com\nGOOGLE_CLIENT_SECRET=(non affiché, secret)\nAPPLE_CLIENT_ID=com.groupe-ka.web\nAPPLE_TEAM_ID=(env secret)\nAPPLE_KEY_ID=(env secret)\nAPPLE_PRIVATE_KEY=(env secret, .p8 PEM)\nKA_DB_PATH=(optionnel, défaut: data/ka-id.db)\nNODE_ENV=production\n```\n\n**Fichier .env api-ka**:\n```\nKA_SSO_SECRET=222bb8c66ea61ba10f3695cc326c6c3c202c61deae036cc26de8455a9bbe5bd7\n(même secret partagé avec groupe-ka pour valider JWT)\nDATABASE_URL=postgresql://apika_user:@localhost:5432/apika\nAPI_PORT=8000\n...\n```\n\n---\n\n### 8. PROCESSUS PM2 & PORTS\n\n#### groupe-ka\n| Processus | Script | Port | Commande |\n|---|---|---|---|\n| **groupe-ka** (id=30) | next | **8110** | `/next/bin/next start -H 0.0.0.0 -p 8110` |\n| **groupe-ka-ngrok** (id=31) | ngrok | — | tunnel vers www.groupe-ka.com |\n| **groupe-ka-status-tick** (id=95) | N/A | — | STOPPED |\n| **groupe-ka-rapport-quotidien** (id=96) | N/A | — | STOPPED |\n\n#### api-ka (voir README.md)\n| Processus | Script | Port | Commande |\n|---|---|---|---|\n| **apika-api** (id=77) | uvicorn | **8000** | `uvicorn src.api.main:app --host 127.0.0.1 --port 8000` |\n| **apika-scheduler** (id=78) | python | — | `python -m src.scheduler.daily_job` |\n| **apika-ngrok** (id=79) | ngrok | — | tunnel vers www.api-ka.com |\n\n**BASE_URL groupe-ka**: `https://www.groupe-ka.com` (port 443 via reverse proxy ngrok)\n**URL API-KA**: `https://www.api-ka.com` ou localhost `http://127.0.0.1:8000`\n\n---\n\n### 9. INFRASTRUCTURE DE TOKENS API\n\n**Token API personnel** (kapi_…, généré sur `/compte`):\n\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts` (lignes 169-210)\n- `ensureApiToken(userId)` → { token: \"kapi_XXXX\", created: \"ISO8601\" }\n- `rotateApiToken(userId)` → régénère\n- `findUserByApiToken(token)` → UserRow | undefined\n\n**Vérification côté api-ka** — voir `/opt/api-ka/src/api/routes/auth.py` (lignes 147-170):\n- Autres apps appellent `GET /api/sso/token-verify?client_id=...&token=...&ts=...&sig=...`\n\n**Endpoint groupe-ka**:\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/token-verify/route.ts` (lignes 1-26)\n- Valide sig HMAC du client\n- Retourne `{ valid: true, ka_id, name, email, role }` ou `{ valid: false }`\n\n---\n\n### 10. PROFIL & FAVORIS UNIFIÉS\n\n#### Endpoint profil serveur-à-serveur\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/profile/route.ts` (lignes 1-63)\n- **Méthode**: `GET /api/sso/profile?client_id=...&ka_id=...&ts=...&sig=...`\n- Valide HMAC, retourne profil complet (email, bio, city, job_title, socials JSON, etc.)\n- **Source de vérité**: le hub dicte le profil aux autres apps\n\n#### Endpoint favoris unifiés\n**Fichier**: `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/favorites/route.ts` (lignes 1-78)\n- **GET** `/api/sso/favorites?...` → liste des favoris de l'user\n- **POST** `/api/sso/favorites` → add/remove favorite (table `favorites`, UNIQUE(user_id, app, item_id))\n\n---\n\n### 11. CODE D'EMAIL EXISTANT\n\n**AUCUN** — groupe-ka et api-ka n'intègrent pas de service d'email:\n- Aucune dépendance `resend`, `nodemailer`, `smtp`, `sendgrid`, `mailgun`, etc. dans package.json / requirements.txt\n- Aucun code email dans les deux repos\n\n**Opportunité**: Vous allez implémenter Resend pour:\n1. **Vérification d'email à l'inscription** — envoi d'un lien de confirmation\n2. **Magic link** (login sans mot de passe) — lien cliquable = auto-login\n3. **2FA email** — code OTP envoyé lors du login mot de passe\n\n---\n\n### 12. SCHÉMA POUR NOUVELLES COLONNES EMAIL\n\n**Pour implémenter vérification + magic link + 2FA**, ajoutez à la table `users`:\n\n```sql\nALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0; -- 0/1\nALTER TABLE users ADD COLUMN email_verified_at TEXT; -- ISO8601\nALTER TABLE users ADD COLUMN email_confirmation_token TEXT; -- random, UNIQUE\nALTER TABLE users ADD COLUMN email_confirmation_expires TEXT; -- ISO8601 (expires after 24h)\nALTER TABLE users ADD COLUMN login_code TEXT; -- OTP 6 chiffres ou random\nALTER TABLE users ADD COLUMN login_code_expires TEXT; -- ISO8601 (5-10 min)\nALTER TABLE users ADD COLUMN login_code_attempts INTEGER DEFAULT 0; -- anti-brute-force\n```\n\n---\n\n### 13. POINTS D'INJECTION POUR RESEND\n\n#### Dans Register\n- **Après INSERT user**: `POST /api/auth/register`\n - Générer `email_confirmation_token`\n - Envoyer email avec lien `/confirm-email?token=...`\n - Répondre `{ ok: true, message: \"Vérifiez votre email\" }`\n\n#### Magic Link\n- **Nouvelle route** `POST /api/auth/magic-link`\n - Input: `{ email }`\n - Génère `email_confirmation_token`\n - Envoie email \"Cliquez ici pour vous connecter\"\n - Lien redirige vers `/api/auth/callback/magic?token=...`\n - Mint session JWT directement\n\n#### 2FA Email Login\n- **Modifie POST /api/auth/login**\n - Si email valide: vérifie password\n - Génère `login_code` (6 digits)\n - Envoie email \"Votre code: 123456\"\n - Répondre `{ requires_2fa: true, login_session: \"temporary_token\" }`\n - **Nouvelle route** `POST /api/auth/verify-2fa?code=...`\n - Valide code + tentatives\n - Mint session JWT final\n\n---\n\n### 14. AUTRES APPS UTILISANT KA ID (IMPACT)\n\nTous les 14+ clients SSO enregistrés utilisent KA ID — ne pas casser:\n1. Lou·Ka (port 8095 dev)\n2. Immo·Ka\n3. Créa·Ka (port 8160 dev)\n4. Vrai-Prix\n5. ValoPlex\n6. Auto·Ka\n7. Fabri·Ka\n8. Food·Ka\n9. Ora·Ka\n10. Toit·Ka (port 8097 dev)\n11. Sorti·Ka (port 8120 dev)\n12. Resto·Ka (port 8115 dev)\n13. Job·Ka (port 8096 dev)\n14. API·Ka (port 8000)\n15. Trouve·Ka (port 3000 dev)\n16. Ka Android / iOS (apps natives)\n\n**Chaque plateforme dispose d'un secret SSO** dans `.env` (ex: `KA_SSO_SECRET_LOU_KA`, `KA_SSO_SECRET_IMMO_KA`, etc.).\n\n---\n\n### 15. RÉSUMÉ DES FICHIERS CLÉS\n\n| Fichier | Lignes | Fonction |\n|---|---|---|\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/auth.ts` | 1-106 | Hash, verify, JWT mint, session |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts` | 1-354 | Modèle User, requêtes SQL, KA ID, API token |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/lib/sso.ts` | 1-122 | Registre clients SSO, HMAC verify |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts` | 1-76 | Signup email+password |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts` | 1-46 | Login email+password |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/google/route.ts` | 1-37 | Google OAuth init |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts` | 1-115 | Google OAuth callback |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/apple/route.ts` | 1-42 | Apple OAuth init |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts` | 1-159 | Apple OAuth callback |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx` | 1-50 | Page de connexion |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx` | 1-242 | Formulaire auth (client) |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/sso/authorize/route.ts` | 1-65 | Endpoint SSO pour plateformes |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/profile/route.ts` | 1-63 | Profil serveur-à-serveur |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/token-verify/route.ts` | 1-26 | Vérif token API |\n| `/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/sso/favorites/route.ts` | 1-78 | Favoris unifiés |\n| `/opt/api-ka/src/api/routes/auth.py` | 1-268 | SSO KA ID (Python side) |\n\n---\n\n### 16. STACK RÉSUMÉ POUR RESEND\n\n**Où intégrer Resend**:\n- **Package**: Ajouter `resend` à `/Users/simon-pierreboucher/apps/groupe-ka/package.json`\n- **Clé API**: Ajouter `RESEND_API_KEY` au `.env` groupe-ka\n- **Endpoints à modifier/créer**:\n 1. `POST /api/auth/register` — ajout email_confirmation_token, envoi email\n 2. `GET /api/auth/confirm-email?token=...` — nouvelle route, vérifie token, update `email_verified=1`\n 3. `POST /api/auth/magic-link` — nouvelle route, SSE ou email\n 4. `GET /api/auth/callback/magic?token=...` — nouvelle route, callback\n 5. `POST /api/auth/login` — modifié pour 2FA, envoi code\n 6. `POST /api/auth/verify-2fa` — nouvelle route, valide code + mint session\n\n**Modèle DB minimal** (3 nouvelles colonnes pour démarrer):\n- `email_verified` (0/1)\n- `email_confirmation_token` (unique, nullable)\n- `login_code` (nullable, 6 digits + expiration)\n\n**Sécurité**:\n- Tokens: 32 bytes random hex (crypto.randomBytes(32))\n- Expiration: tokens 24h, codes OTP 5-10 min\n- Rate limit: max 3 tentatives par code\n- HMAC-SHA256 optionnel pour tokens (si refonte nécessaire)\n\n---\n\nJ'ai fourni un rapport très exhaustif avec emplacements exacts de fichiers, numéros de lignes, schémas DB, endpoints, variables d'env, et tous les clients SSO à ne pas casser. Vous avez tout ce qu'il faut pour implémenter Resend en toute sécurité."}],"totalDurationMs":151098,"totalTokens":69252,"totalToolUseCount":47,"usage":{"input_tokens":5,"cache_creation_input_tokens":328,"cache_read_input_tokens":62133,"output_tokens":6786,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":328},"inference_geo":"","iterations":[{"input_tokens":5,"output_tokens":6786,"cache_read_input_tokens":62133,"cache_creation_input_tokens":328,"cache_creation":{"ephemeral_5m_input_tokens":328,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"toolStats":{"readCount":24,"searchCount":2,"bashCount":21,"editFileCount":0,"linesAdded":0,"linesRemoved":0,"otherToolCount":0}}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"4bf27ab6-5bdf-4490-8574-fa280cf69518","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdeKbeqaQ3gkSzTgtR2","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10424,"cache_read_input_tokens":33868,"cache_creation":{"ephemeral_5m_input_tokens":10424,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"22980e59-d180-4cb3-9d52-f62a4c4c43cc"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdeKbeqaQ3gkSzTgtR2","type":"message","role":"assistant","content":[{"type":"text","text":"Le rapport confirme : KA ID vit entièrement dans groupe-ka (Next.js + SQLite), aucun email existant. Je lis maintenant les fichiers clés avant d'implémenter."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10424,"cache_read_input_tokens":33868,"cache_creation":{"ephemeral_5m_input_tokens":10424,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"2ba1e630-9f22-425c-b5b2-35e535a285a1"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdeKbeqaQ3gkSzTgtR2","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_0157nxM2xXTPCi8PjpkuGdtK","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10424,"cache_read_input_tokens":33868,"cache_creation":{"ephemeral_5m_input_tokens":10424,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"ca03a1d4-b2fc-4df4-8adc-4cdc060cbb3b"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_0157nxM2xXTPCi8PjpkuGdtK","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// KA ID — base d'utilisateurs partagée du groupe (SQLite WAL).\n3\timport Database from \"better-sqlite3\";\n4\timport path from \"path\";\n5\timport fs from \"fs\";\n6\timport crypto from \"crypto\";\n7\t\n8\tfunction open() {\n9\t const dbPath =\n10\t process.env.KA_DB_PATH ?? path.join(process.cwd(), \"data\", \"ka-id.db\");\n11\t fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n12\t const db = new Database(dbPath);\n13\t db.pragma(\"journal_mode = WAL\");\n14\t db.exec(`\n15\t CREATE TABLE IF NOT EXISTS users (\n16\t id INTEGER PRIMARY KEY AUTOINCREMENT,\n17\t email TEXT UNIQUE NOT NULL,\n18\t name TEXT NOT NULL,\n19\t avatar_url TEXT,\n20\t password_hash TEXT,\n21\t google_sub TEXT UNIQUE,\n22\t created_at TEXT NOT NULL DEFAULT (datetime('now'))\n23\t );\n24\t `);\n25\t // KA ID — identifiant membre du groupe (« ka- » + 10 chiffres), créé ICI,\n26\t // au hub : les plateformes (Lou·Ka…) le reçoivent via le jeton SSO.\n27\t try {\n28\t db.exec(\"ALTER TABLE users ADD COLUMN ka_id TEXT\");\n29\t } catch {\n30\t /* colonne déjà présente */\n31\t }\n32\t try {\n33\t db.exec(\"ALTER TABLE users ADD COLUMN last_login TEXT\");\n34\t } catch {\n35\t /* colonne déjà présente */\n36\t }\n37\t // Sign in with Apple (2026-08-13) — même rôle que google_sub.\n38\t try {\n39\t db.exec(\"ALTER TABLE users ADD COLUMN apple_sub TEXT\");\n40\t } catch {\n41\t /* colonne déjà présente */\n42\t }\n43\t db.exec(\n44\t \"CREATE UNIQUE INDEX IF NOT EXISTS users_apple_sub ON users(apple_sub)\",\n45\t );\n46\t try {\n47\t db.exec(\"ALTER TABLE users ADD COLUMN role TEXT\");\n48\t } catch {\n49\t /* colonne déjà présente */\n50\t }\n51\t // Profil enrichi (2026-08-13) — saisi sur le hub, LA source de vérité\n52\t // affichée par toutes les plateformes du groupe.\n53\t for (const col of [\n54\t \"bio TEXT\",\n55\t \"city TEXT\",\n56\t \"phone TEXT\",\n57\t \"website TEXT\",\n58\t \"job_title TEXT\",\n59\t \"company TEXT\",\n60\t \"birth_date TEXT\",\n61\t \"socials TEXT\",\n62\t \"public INTEGER DEFAULT 0\",\n63\t ]) {\n64\t try {\n65\t db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n66\t } catch {\n67\t /* colonne déjà présente */\n68\t }\n69\t }\n70\t db.exec(\"CREATE UNIQUE INDEX IF NOT EXISTS users_ka_id ON users(ka_id)\");\n71\t // rattrapage : tout compte existant sans KA ID en reçoit un\n72\t const missing = db\n73\t .prepare(\"SELECT id FROM users WHERE ka_id IS NULL\")\n74\t .all() as { id: number }[];\n75\t for (const row of missing) assignKaId(db, row.id);\n76\t // Favoris unifiés « Mon univers Ka » (2026-08-13) — le hub est LE magasin\n77\t // central : les plateformes poussent/lisent via /api/sso/favorites.\n78\t db.exec(`\n79\t CREATE TABLE IF NOT EXISTS favorites (\n80\t id INTEGER PRIMARY KEY AUTOINCREMENT,\n81\t user_id INTEGER NOT NULL,\n82\t app TEXT NOT NULL,\n83\t item_id TEXT NOT NULL,\n84\t title TEXT NOT NULL,\n85\t subtitle TEXT,\n86\t price_label TEXT,\n87\t image_url TEXT,\n88\t url TEXT,\n89\t meta TEXT,\n90\t created_at TEXT NOT NULL DEFAULT (datetime('now')),\n91\t updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n92\t UNIQUE(user_id, app, item_id)\n93\t );\n94\t CREATE INDEX IF NOT EXISTS favorites_user ON favorites(user_id, app);\n95\t `);\n96\t // Jeton API personnel (2026-08-23) — requis pour consommer l'API produit\n97\t // d'API·Ka (Authorization: Bearer kapi_…). Généré/affiché sur /compte,\n98\t // vérifié par api-ka via /api/sso/token-verify (HMAC).\n99\t for (const col of [\"api_token TEXT\", \"api_token_created TEXT\"]) {\n100\t try {\n101\t db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n102\t } catch {\n103\t /* colonne déjà présente */\n104\t }\n105\t }\n106\t db.exec(\n107\t \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n108\t );\n109\t return db;\n110\t}\n111\t\n112\tfunction randomKaId(): string {\n113\t let digits = \"\";\n114\t for (let i = 0; i < 10; i++)\n115\t digits += Math.floor(Math.random() * 10).toString();\n116\t return `ka-${digits}`;\n117\t}\n118\t\n119\tfunction assignKaId(d: Database.Database, id: number): string {\n120\t for (;;) {\n121\t const kid = randomKaId();\n122\t try {\n123\t d.prepare(\"UPDATE users SET ka_id = ? WHERE id = ?\").run(kid, id);\n124\t return kid;\n125\t } catch {\n126\t /* collision (1 chance sur 10 milliards) : on retente */\n127\t }\n128\t }\n129\t}\n130\t\n131\t/** KA ID d'un compte — l'attribue s'il manque (source de vérité du groupe). */\n132\texport function ensureKaId(id: number): string {\n133\t const row = db.prepare(\"SELECT ka_id FROM users WHERE id = ?\").get(id) as\n134\t | { ka_id: string | null }\n135\t | undefined;\n136\t if (row?.ka_id) return row.ka_id;\n137\t return assignKaId(db, id);\n138\t}\n139\t\n140\t// Singleton (survit au rechargement à chaud en dev).\n141\tconst g = globalThis as unknown as { __kaDb?: Database.Database };\n142\texport const db: Database.Database = g.__kaDb ?? (g.__kaDb = open());\n143\t\n144\texport type UserRow = {\n145\t id: number;\n146\t email: string;\n147\t name: string;\n148\t avatar_url: string | null;\n149\t password_hash: string | null;\n150\t google_sub: string | null;\n151\t apple_sub: string | null;\n152\t ka_id: string | null;\n153\t created_at: string;\n154\t last_login: string | null;\n155\t role: string | null;\n156\t bio: string | null;\n157\t city: string | null;\n158\t phone: string | null;\n159\t website: string | null;\n160\t job_title: string | null;\n161\t company: string | null;\n162\t birth_date: string | null;\n163\t socials: string | null; // JSON {instagram, facebook, x, linkedin, tiktok, youtube}\n164\t public: number;\n165\t api_token: string | null;\n166\t api_token_created: string | null;\n167\t};\n168\t\n169\t// ---------- jeton API personnel (API·Ka) ----------\n170\t\n171\tfunction randomApiToken(): string {\n172\t return \"kapi_\" + crypto.randomBytes(24).toString(\"hex\");\n173\t}\n174\t\n175\t/** Jeton API du compte — le crée s'il manque. */\n176\texport function ensureApiToken(id: number): { token: string; created: string } {\n177\t const row = db\n178\t .prepare(\"SELECT api_token, api_token_created FROM users WHERE id = ?\")\n179\t .get(id) as { api_token: string | null; api_token_created: string | null } | undefined;\n180\t if (row?.api_token)\n181\t return { token: row.api_token, created: row.api_token_created ?? \"\" };\n182\t return rotateApiToken(id);\n183\t}\n184\t\n185\t/** Régénère le jeton API (l'ancien devient immédiatement invalide). */\n186\texport function rotateApiToken(id: number): { token: string; created: string } {\n187\t for (;;) {\n188\t const token = randomApiToken();\n189\t try {\n190\t db.prepare(\n191\t \"UPDATE users SET api_token = ?, api_token_created = datetime('now') WHERE id = ?\",\n192\t ).run(token, id);\n193\t const created = (\n194\t db\n195\t .prepare(\"SELECT api_token_created AS c FROM users WHERE id = ?\")\n196\t .get(id) as { c: string }\n197\t ).c;\n198\t return { token, created };\n199\t } catch {\n200\t /* collision improbable : on retente */\n201\t }\n202\t }\n203\t}\n204\t\n205\texport function findUserByApiToken(token: string): UserRow | undefined {\n206\t if (!/^kapi_[0-9a-f]{48}$/.test(token)) return undefined;\n207\t return db.prepare(\"SELECT * FROM users WHERE api_token = ?\").get(token) as\n208\t | UserRow\n209\t | undefined;\n210\t}\n211\t\n212\texport const SOCIAL_KEYS = [\n213\t \"instagram\",\n214\t \"facebook\",\n215\t \"x\",\n216\t \"linkedin\",\n217\t \"tiktok\",\n218\t \"youtube\",\n219\t] as const;\n220\t\n221\texport function parseSocials(raw: string | null): Record {\n222\t try {\n223\t const obj = JSON.parse(raw ?? \"{}\") as Record;\n224\t const out: Record = {};\n225\t for (const k of SOCIAL_KEYS)\n226\t if (typeof obj[k] === \"string\" && obj[k]) out[k] = obj[k] as string;\n227\t return out;\n228\t } catch {\n229\t return {};\n230\t }\n231\t}\n232\t\n233\texport function ageFromBirthDate(birth: string | null): number | null {\n234\t if (!birth || !/^\\d{4}-\\d{2}-\\d{2}$/.test(birth)) return null;\n235\t const b = new Date(birth + \"T00:00:00Z\");\n236\t if (Number.isNaN(b.getTime())) return null;\n237\t const now = new Date();\n238\t let age = now.getUTCFullYear() - b.getUTCFullYear();\n239\t const m = now.getUTCMonth() - b.getUTCMonth();\n240\t if (m < 0 || (m === 0 && now.getUTCDate() < b.getUTCDate())) age--;\n241\t return age >= 0 && age < 130 ? age : null;\n242\t}\n243\t\n244\t/** Horodate la connexion (appelé à chaque login/register/SSO). */\n245\texport function touchLastLogin(id: number): void {\n246\t db.prepare(\n247\t \"UPDATE users SET last_login = datetime('now') WHERE id = ?\",\n248\t ).run(id);\n249\t}\n250\t\n251\texport function findUserByEmail(email: string): UserRow | undefined {\n252\t return db\n253\t .prepare(\"SELECT * FROM users WHERE email = ?\")\n254\t .get(email.toLowerCase()) as UserRow | undefined;\n255\t}\n256\t\n257\texport function findUserById(id: number): UserRow | undefined {\n258\t return db.prepare(\"SELECT * FROM users WHERE id = ?\").get(id) as\n259\t | UserRow\n260\t | undefined;\n261\t}\n262\t\n263\texport function findUserByGoogleSub(sub: string): UserRow | undefined {\n264\t return db.prepare(\"SELECT * FROM users WHERE google_sub = ?\").get(sub) as\n265\t | UserRow\n266\t | undefined;\n267\t}\n268\t\n269\texport function findUserByAppleSub(sub: string): UserRow | undefined {\n270\t return db.prepare(\"SELECT * FROM users WHERE apple_sub = ?\").get(sub) as\n271\t | UserRow\n272\t | undefined;\n273\t}\n274\t\n275\texport function findUserByKaId(kaId: string): UserRow | undefined {\n276\t return db.prepare(\"SELECT * FROM users WHERE ka_id = ?\").get(kaId) as\n277\t | UserRow\n278\t | undefined;\n279\t}\n280\t\n281\t/* ---------- Favoris unifiés ---------- */\n282\t\n283\texport type FavoriteRow = {\n284\t id: number;\n285\t user_id: number;\n286\t app: string;\n287\t item_id: string;\n288\t title: string;\n289\t subtitle: string | null;\n290\t price_label: string | null;\n291\t image_url: string | null;\n292\t url: string | null;\n293\t meta: string | null;\n294\t created_at: string;\n295\t updated_at: string;\n296\t};\n297\t\n298\texport function upsertFavorite(\n299\t userId: number,\n300\t app: string,\n301\t item: {\n302\t item_id: string;\n303\t title: string;\n304\t subtitle?: string;\n305\t price_label?: string;\n306\t image_url?: string;\n307\t url?: string;\n308\t meta?: unknown;\n309\t },\n310\t): void {\n311\t db.prepare(\n312\t `INSERT INTO favorites (user_id, app, item_id, title, subtitle,\n313\t price_label, image_url, url, meta)\n314\t VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n315\t ON CONFLICT(user_id, app, item_id) DO UPDATE SET\n316\t title = excluded.title, subtitle = excluded.subtitle,\n317\t price_label = excluded.price_label, image_url = excluded.image_url,\n318\t url = excluded.url, meta = excluded.meta,\n319\t updated_at = datetime('now')`,\n320\t ).run(\n321\t userId,\n322\t app,\n323\t item.item_id,\n324\t item.title,\n325\t item.subtitle ?? null,\n326\t item.price_label ?? null,\n327\t item.image_url ?? null,\n328\t item.url ?? null,\n329\t item.meta != null ? JSON.stringify(item.meta) : null,\n330\t );\n331\t}\n332\t\n333\texport function removeFavorite(\n334\t userId: number,\n335\t app: string,\n336\t itemId: string,\n337\t): void {\n338\t db.prepare(\n339\t \"DELETE FROM favorites WHERE user_id = ? AND app = ? AND item_id = ?\",\n340\t ).run(userId, app, itemId);\n341\t}\n342\t\n343\texport function favoritesOf(userId: number, app?: string): FavoriteRow[] {\n344\t return (\n345\t app\n346\t ? db.prepare(\n347\t \"SELECT * FROM favorites WHERE user_id = ? AND app = ? ORDER BY created_at DESC\",\n348\t ).all(userId, app)\n349\t : db.prepare(\n350\t \"SELECT * FROM favorites WHERE user_id = ? ORDER BY created_at DESC\",\n351\t ).all(userId)\n352\t ) as FavoriteRow[];\n353\t}\n354\t"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"cfe19a4e-e360-4e33-bf33-c3b72802abd9","timestamp":"2026-08-26T15:56:02.918Z","tool_use_result":{"type":"text","file":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// KA ID — base d'utilisateurs partagée du groupe (SQLite WAL).\nimport Database from \"better-sqlite3\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport crypto from \"crypto\";\n\nfunction open() {\n const dbPath =\n process.env.KA_DB_PATH ?? path.join(process.cwd(), \"data\", \"ka-id.db\");\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n const db = new Database(dbPath);\n db.pragma(\"journal_mode = WAL\");\n db.exec(`\n CREATE TABLE IF NOT EXISTS users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n avatar_url TEXT,\n password_hash TEXT,\n google_sub TEXT UNIQUE,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n `);\n // KA ID — identifiant membre du groupe (« ka- » + 10 chiffres), créé ICI,\n // au hub : les plateformes (Lou·Ka…) le reçoivent via le jeton SSO.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN ka_id TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN last_login TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n // Sign in with Apple (2026-08-13) — même rôle que google_sub.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN apple_sub TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_apple_sub ON users(apple_sub)\",\n );\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN role TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n // Profil enrichi (2026-08-13) — saisi sur le hub, LA source de vérité\n // affichée par toutes les plateformes du groupe.\n for (const col of [\n \"bio TEXT\",\n \"city TEXT\",\n \"phone TEXT\",\n \"website TEXT\",\n \"job_title TEXT\",\n \"company TEXT\",\n \"birth_date TEXT\",\n \"socials TEXT\",\n \"public INTEGER DEFAULT 0\",\n ]) {\n try {\n db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n } catch {\n /* colonne déjà présente */\n }\n }\n db.exec(\"CREATE UNIQUE INDEX IF NOT EXISTS users_ka_id ON users(ka_id)\");\n // rattrapage : tout compte existant sans KA ID en reçoit un\n const missing = db\n .prepare(\"SELECT id FROM users WHERE ka_id IS NULL\")\n .all() as { id: number }[];\n for (const row of missing) assignKaId(db, row.id);\n // Favoris unifiés « Mon univers Ka » (2026-08-13) — le hub est LE magasin\n // central : les plateformes poussent/lisent via /api/sso/favorites.\n db.exec(`\n CREATE TABLE IF NOT EXISTS favorites (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n app TEXT NOT NULL,\n item_id TEXT NOT NULL,\n title TEXT NOT NULL,\n subtitle TEXT,\n price_label TEXT,\n image_url TEXT,\n url TEXT,\n meta TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n UNIQUE(user_id, app, item_id)\n );\n CREATE INDEX IF NOT EXISTS favorites_user ON favorites(user_id, app);\n `);\n // Jeton API personnel (2026-08-23) — requis pour consommer l'API produit\n // d'API·Ka (Authorization: Bearer kapi_…). Généré/affiché sur /compte,\n // vérifié par api-ka via /api/sso/token-verify (HMAC).\n for (const col of [\"api_token TEXT\", \"api_token_created TEXT\"]) {\n try {\n db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n } catch {\n /* colonne déjà présente */\n }\n }\n db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n );\n return db;\n}\n\nfunction randomKaId(): string {\n let digits = \"\";\n for (let i = 0; i < 10; i++)\n digits += Math.floor(Math.random() * 10).toString();\n return `ka-${digits}`;\n}\n\nfunction assignKaId(d: Database.Database, id: number): string {\n for (;;) {\n const kid = randomKaId();\n try {\n d.prepare(\"UPDATE users SET ka_id = ? WHERE id = ?\").run(kid, id);\n return kid;\n } catch {\n /* collision (1 chance sur 10 milliards) : on retente */\n }\n }\n}\n\n/** KA ID d'un compte — l'attribue s'il manque (source de vérité du groupe). */\nexport function ensureKaId(id: number): string {\n const row = db.prepare(\"SELECT ka_id FROM users WHERE id = ?\").get(id) as\n | { ka_id: string | null }\n | undefined;\n if (row?.ka_id) return row.ka_id;\n return assignKaId(db, id);\n}\n\n// Singleton (survit au rechargement à chaud en dev).\nconst g = globalThis as unknown as { __kaDb?: Database.Database };\nexport const db: Database.Database = g.__kaDb ?? (g.__kaDb = open());\n\nexport type UserRow = {\n id: number;\n email: string;\n name: string;\n avatar_url: string | null;\n password_hash: string | null;\n google_sub: string | null;\n apple_sub: string | null;\n ka_id: string | null;\n created_at: string;\n last_login: string | null;\n role: string | null;\n bio: string | null;\n city: string | null;\n phone: string | null;\n website: string | null;\n job_title: string | null;\n company: string | null;\n birth_date: string | null;\n socials: string | null; // JSON {instagram, facebook, x, linkedin, tiktok, youtube}\n public: number;\n api_token: string | null;\n api_token_created: string | null;\n};\n\n// ---------- jeton API personnel (API·Ka) ----------\n\nfunction randomApiToken(): string {\n return \"kapi_\" + crypto.randomBytes(24).toString(\"hex\");\n}\n\n/** Jeton API du compte — le crée s'il manque. */\nexport function ensureApiToken(id: number): { token: string; created: string } {\n const row = db\n .prepare(\"SELECT api_token, api_token_created FROM users WHERE id = ?\")\n .get(id) as { api_token: string | null; api_token_created: string | null } | undefined;\n if (row?.api_token)\n return { token: row.api_token, created: row.api_token_created ?? \"\" };\n return rotateApiToken(id);\n}\n\n/** Régénère le jeton API (l'ancien devient immédiatement invalide). */\nexport function rotateApiToken(id: number): { token: string; created: string } {\n for (;;) {\n const token = randomApiToken();\n try {\n db.prepare(\n \"UPDATE users SET api_token = ?, api_token_created = datetime('now') WHERE id = ?\",\n ).run(token, id);\n const created = (\n db\n .prepare(\"SELECT api_token_created AS c FROM users WHERE id = ?\")\n .get(id) as { c: string }\n ).c;\n return { token, created };\n } catch {\n /* collision improbable : on retente */\n }\n }\n}\n\nexport function findUserByApiToken(token: string): UserRow | undefined {\n if (!/^kapi_[0-9a-f]{48}$/.test(token)) return undefined;\n return db.prepare(\"SELECT * FROM users WHERE api_token = ?\").get(token) as\n | UserRow\n | undefined;\n}\n\nexport const SOCIAL_KEYS = [\n \"instagram\",\n \"facebook\",\n \"x\",\n \"linkedin\",\n \"tiktok\",\n \"youtube\",\n] as const;\n\nexport function parseSocials(raw: string | null): Record {\n try {\n const obj = JSON.parse(raw ?? \"{}\") as Record;\n const out: Record = {};\n for (const k of SOCIAL_KEYS)\n if (typeof obj[k] === \"string\" && obj[k]) out[k] = obj[k] as string;\n return out;\n } catch {\n return {};\n }\n}\n\nexport function ageFromBirthDate(birth: string | null): number | null {\n if (!birth || !/^\\d{4}-\\d{2}-\\d{2}$/.test(birth)) return null;\n const b = new Date(birth + \"T00:00:00Z\");\n if (Number.isNaN(b.getTime())) return null;\n const now = new Date();\n let age = now.getUTCFullYear() - b.getUTCFullYear();\n const m = now.getUTCMonth() - b.getUTCMonth();\n if (m < 0 || (m === 0 && now.getUTCDate() < b.getUTCDate())) age--;\n return age >= 0 && age < 130 ? age : null;\n}\n\n/** Horodate la connexion (appelé à chaque login/register/SSO). */\nexport function touchLastLogin(id: number): void {\n db.prepare(\n \"UPDATE users SET last_login = datetime('now') WHERE id = ?\",\n ).run(id);\n}\n\nexport function findUserByEmail(email: string): UserRow | undefined {\n return db\n .prepare(\"SELECT * FROM users WHERE email = ?\")\n .get(email.toLowerCase()) as UserRow | undefined;\n}\n\nexport function findUserById(id: number): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE id = ?\").get(id) as\n | UserRow\n | undefined;\n}\n\nexport function findUserByGoogleSub(sub: string): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE google_sub = ?\").get(sub) as\n | UserRow\n | undefined;\n}\n\nexport function findUserByAppleSub(sub: string): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE apple_sub = ?\").get(sub) as\n | UserRow\n | undefined;\n}\n\nexport function findUserByKaId(kaId: string): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE ka_id = ?\").get(kaId) as\n | UserRow\n | undefined;\n}\n\n/* ---------- Favoris unifiés ---------- */\n\nexport type FavoriteRow = {\n id: number;\n user_id: number;\n app: string;\n item_id: string;\n title: string;\n subtitle: string | null;\n price_label: string | null;\n image_url: string | null;\n url: string | null;\n meta: string | null;\n created_at: string;\n updated_at: string;\n};\n\nexport function upsertFavorite(\n userId: number,\n app: string,\n item: {\n item_id: string;\n title: string;\n subtitle?: string;\n price_label?: string;\n image_url?: string;\n url?: string;\n meta?: unknown;\n },\n): void {\n db.prepare(\n `INSERT INTO favorites (user_id, app, item_id, title, subtitle,\n price_label, image_url, url, meta)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(user_id, app, item_id) DO UPDATE SET\n title = excluded.title, subtitle = excluded.subtitle,\n price_label = excluded.price_label, image_url = excluded.image_url,\n url = excluded.url, meta = excluded.meta,\n updated_at = datetime('now')`,\n ).run(\n userId,\n app,\n item.item_id,\n item.title,\n item.subtitle ?? null,\n item.price_label ?? null,\n item.image_url ?? null,\n item.url ?? null,\n item.meta != null ? JSON.stringify(item.meta) : null,\n );\n}\n\nexport function removeFavorite(\n userId: number,\n app: string,\n itemId: string,\n): void {\n db.prepare(\n \"DELETE FROM favorites WHERE user_id = ? AND app = ? AND item_id = ?\",\n ).run(userId, app, itemId);\n}\n\nexport function favoritesOf(userId: number, app?: string): FavoriteRow[] {\n return (\n app\n ? db.prepare(\n \"SELECT * FROM favorites WHERE user_id = ? AND app = ? ORDER BY created_at DESC\",\n ).all(userId, app)\n : db.prepare(\n \"SELECT * FROM favorites WHERE user_id = ? ORDER BY created_at DESC\",\n ).all(userId)\n ) as FavoriteRow[];\n}\n","numLines":354,"startLine":1,"totalLines":354}}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdeKbeqaQ3gkSzTgtR2","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Fp4XdjuECaSFWj3KvwCPoA","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/auth.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10424,"cache_read_input_tokens":33868,"cache_creation":{"ephemeral_5m_input_tokens":10424,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"62684d7d-a5da-4220-a4f2-0c5207474746"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Fp4XdjuECaSFWj3KvwCPoA","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// KA ID — sessions (JWT HS256 en témoin HttpOnly) + hachage scrypt.\n3\timport { SignJWT, jwtVerify } from \"jose\";\n4\timport { cookies } from \"next/headers\";\n5\timport crypto from \"crypto\";\n6\timport { findUserById, type UserRow } from \"./db\";\n7\t\n8\texport const SESSION_COOKIE = \"ka_session\";\n9\texport const BASE_URL = process.env.BASE_URL ?? \"https://www.groupe-ka.com\";\n10\t\n11\tfunction secret(): Uint8Array {\n12\t const s = process.env.KA_AUTH_SECRET;\n13\t if (!s) {\n14\t if (process.env.NODE_ENV === \"production\")\n15\t throw new Error(\"KA_AUTH_SECRET manquant\");\n16\t return new TextEncoder().encode(\"ka-dev-secret-non-production\");\n17\t }\n18\t return new TextEncoder().encode(s);\n19\t}\n20\t\n21\t/* ---------- mots de passe (scrypt natif, zéro dépendance) ---------- */\n22\t\n23\texport function hashPassword(password: string): string {\n24\t const salt = crypto.randomBytes(16).toString(\"hex\");\n25\t const hash = crypto.scryptSync(password, salt, 64).toString(\"hex\");\n26\t return `${salt}:${hash}`;\n27\t}\n28\t\n29\texport function verifyPassword(password: string, stored: string): boolean {\n30\t const [salt, hash] = stored.split(\":\");\n31\t if (!salt || !hash) return false;\n32\t const test = crypto.scryptSync(password, salt, 64);\n33\t return crypto.timingSafeEqual(test, Buffer.from(hash, \"hex\"));\n34\t}\n35\t\n36\t/* ---------- sessions ---------- */\n37\t\n38\texport type SessionUser = {\n39\t id: number;\n40\t email: string;\n41\t name: string;\n42\t avatarUrl: string | null;\n43\t hasGoogle: boolean;\n44\t hasApple: boolean;\n45\t hasPassword: boolean;\n46\t kaId: string | null;\n47\t createdAt: string;\n48\t lastLogin: string | null;\n49\t role: string | null;\n50\t};\n51\t\n52\texport async function mintSessionToken(userId: number): Promise {\n53\t return await new SignJWT({ uid: userId })\n54\t .setProtectedHeader({ alg: \"HS256\" })\n55\t .setIssuedAt()\n56\t .setIssuer(BASE_URL)\n57\t .setExpirationTime(\"30d\")\n58\t .sign(secret());\n59\t}\n60\t\n61\texport const sessionCookieOptions = {\n62\t httpOnly: true,\n63\t secure: process.env.NODE_ENV === \"production\",\n64\t sameSite: \"lax\" as const,\n65\t path: \"/\",\n66\t maxAge: 60 * 60 * 24 * 30,\n67\t};\n68\t\n69\texport async function getSessionUser(): Promise {\n70\t const jar = await cookies();\n71\t const token = jar.get(SESSION_COOKIE)?.value;\n72\t if (!token) return null;\n73\t try {\n74\t const { payload } = await jwtVerify(token, secret(), {\n75\t issuer: BASE_URL,\n76\t });\n77\t const row = findUserById(Number(payload.uid)) as UserRow | undefined;\n78\t if (!row) return null;\n79\t return {\n80\t id: row.id,\n81\t email: row.email,\n82\t name: row.name,\n83\t avatarUrl: row.avatar_url,\n84\t hasGoogle: !!row.google_sub,\n85\t hasApple: !!row.apple_sub,\n86\t hasPassword: !!row.password_hash,\n87\t kaId: row.ka_id,\n88\t createdAt: row.created_at,\n89\t lastLogin: row.last_login,\n90\t role: row.role,\n91\t };\n92\t } catch {\n93\t return null;\n94\t }\n95\t}\n96\t\n97\t/* ---------- redirections sûres ---------- */\n98\t\n99\t// N'accepte que les chemins internes (« /compte ») — jamais d'URL absolue,\n100\t// sauf un retour SSO interne déjà validé par /sso/authorize.\n101\texport function safeNext(next: string | null | undefined): string {\n102\t if (!next) return \"/compte\";\n103\t if (next.startsWith(\"/\") && !next.startsWith(\"//\")) return next;\n104\t return \"/compte\";\n105\t}\n106\t"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"52ed9ee9-2f84-47a6-840f-24089c433226","timestamp":"2026-08-26T15:56:03.851Z","tool_use_result":{"type":"text","file":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/auth.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// KA ID — sessions (JWT HS256 en témoin HttpOnly) + hachage scrypt.\nimport { SignJWT, jwtVerify } from \"jose\";\nimport { cookies } from \"next/headers\";\nimport crypto from \"crypto\";\nimport { findUserById, type UserRow } from \"./db\";\n\nexport const SESSION_COOKIE = \"ka_session\";\nexport const BASE_URL = process.env.BASE_URL ?? \"https://www.groupe-ka.com\";\n\nfunction secret(): Uint8Array {\n const s = process.env.KA_AUTH_SECRET;\n if (!s) {\n if (process.env.NODE_ENV === \"production\")\n throw new Error(\"KA_AUTH_SECRET manquant\");\n return new TextEncoder().encode(\"ka-dev-secret-non-production\");\n }\n return new TextEncoder().encode(s);\n}\n\n/* ---------- mots de passe (scrypt natif, zéro dépendance) ---------- */\n\nexport function hashPassword(password: string): string {\n const salt = crypto.randomBytes(16).toString(\"hex\");\n const hash = crypto.scryptSync(password, salt, 64).toString(\"hex\");\n return `${salt}:${hash}`;\n}\n\nexport function verifyPassword(password: string, stored: string): boolean {\n const [salt, hash] = stored.split(\":\");\n if (!salt || !hash) return false;\n const test = crypto.scryptSync(password, salt, 64);\n return crypto.timingSafeEqual(test, Buffer.from(hash, \"hex\"));\n}\n\n/* ---------- sessions ---------- */\n\nexport type SessionUser = {\n id: number;\n email: string;\n name: string;\n avatarUrl: string | null;\n hasGoogle: boolean;\n hasApple: boolean;\n hasPassword: boolean;\n kaId: string | null;\n createdAt: string;\n lastLogin: string | null;\n role: string | null;\n};\n\nexport async function mintSessionToken(userId: number): Promise {\n return await new SignJWT({ uid: userId })\n .setProtectedHeader({ alg: \"HS256\" })\n .setIssuedAt()\n .setIssuer(BASE_URL)\n .setExpirationTime(\"30d\")\n .sign(secret());\n}\n\nexport const sessionCookieOptions = {\n httpOnly: true,\n secure: process.env.NODE_ENV === \"production\",\n sameSite: \"lax\" as const,\n path: \"/\",\n maxAge: 60 * 60 * 24 * 30,\n};\n\nexport async function getSessionUser(): Promise {\n const jar = await cookies();\n const token = jar.get(SESSION_COOKIE)?.value;\n if (!token) return null;\n try {\n const { payload } = await jwtVerify(token, secret(), {\n issuer: BASE_URL,\n });\n const row = findUserById(Number(payload.uid)) as UserRow | undefined;\n if (!row) return null;\n return {\n id: row.id,\n email: row.email,\n name: row.name,\n avatarUrl: row.avatar_url,\n hasGoogle: !!row.google_sub,\n hasApple: !!row.apple_sub,\n hasPassword: !!row.password_hash,\n kaId: row.ka_id,\n createdAt: row.created_at,\n lastLogin: row.last_login,\n role: row.role,\n };\n } catch {\n return null;\n }\n}\n\n/* ---------- redirections sûres ---------- */\n\n// N'accepte que les chemins internes (« /compte ») — jamais d'URL absolue,\n// sauf un retour SSO interne déjà validé par /sso/authorize.\nexport function safeNext(next: string | null | undefined): string {\n if (!next) return \"/compte\";\n if (next.startsWith(\"/\") && !next.startsWith(\"//\")) return next;\n return \"/compte\";\n}\n","numLines":106,"startLine":1,"totalLines":106}}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdeKbeqaQ3gkSzTgtR2","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01NpfFu44jVkSM8YJn5yJoxc","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10424,"cache_read_input_tokens":33868,"cache_creation":{"ephemeral_5m_input_tokens":10424,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f06e1f48-5ce1-4cda-b9ad-6f4504e2c1c4"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01NpfFu44jVkSM8YJn5yJoxc","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\timport { NextRequest, NextResponse } from \"next/server\";\n3\timport { db, findUserByEmail, ensureKaId, touchLastLogin } from \"@/lib/db\";\n4\timport { ROLES } from \"@/lib/roles\";\n5\timport {\n6\t hashPassword,\n7\t mintSessionToken,\n8\t SESSION_COOKIE,\n9\t sessionCookieOptions,\n10\t} from \"@/lib/auth\";\n11\t\n12\tconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n13\t\n14\texport async function POST(req: NextRequest) {\n15\t let body: {\n16\t email?: string;\n17\t password?: string;\n18\t name?: string;\n19\t role?: string;\n20\t };\n21\t try {\n22\t body = await req.json();\n23\t } catch {\n24\t return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n25\t }\n26\t const email = (body.email ?? \"\").trim().toLowerCase();\n27\t const password = body.password ?? \"\";\n28\t const name = (body.name ?? \"\").trim();\n29\t\n30\t if (!EMAIL_RE.test(email))\n31\t return NextResponse.json(\n32\t { error: \"Adresse courriel invalide.\" },\n33\t { status: 400 },\n34\t );\n35\t if (password.length < 8)\n36\t return NextResponse.json(\n37\t { error: \"Le mot de passe doit compter au moins 8 caractères.\" },\n38\t { status: 400 },\n39\t );\n40\t if (name.length < 2)\n41\t return NextResponse.json(\n42\t { error: \"Dites-nous au moins votre prénom.\" },\n43\t { status: 400 },\n44\t );\n45\t const role = body.role ?? \"\";\n46\t if (!ROLES[role])\n47\t return NextResponse.json(\n48\t { error: \"Choisissez votre type de compte (utilisateur, fournisseur ou équipe).\" },\n49\t { status: 400 },\n50\t );\n51\t\n52\t if (findUserByEmail(email))\n53\t return NextResponse.json(\n54\t {\n55\t error:\n56\t \"Cette adresse a déjà un KA ID — connectez-vous (ou utilisez « Continuer avec Google » si le compte vient de Google).\",\n57\t },\n58\t { status: 409 },\n59\t );\n60\t\n61\t const info = db\n62\t .prepare(\n63\t \"INSERT INTO users (email, name, password_hash, role) VALUES (?, ?, ?, ?)\",\n64\t )\n65\t .run(email, name, hashPassword(password), role);\n66\t ensureKaId(Number(info.lastInsertRowid));\n67\t touchLastLogin(Number(info.lastInsertRowid));\n68\t\n69\t const res = NextResponse.json({ ok: true });\n70\t res.cookies.set(\n71\t SESSION_COOKIE,\n72\t await mintSessionToken(Number(info.lastInsertRowid)),\n73\t sessionCookieOptions,\n74\t );\n75\t return res;\n76\t}\n77\t"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"de42f398-7154-4c9b-8cc7-4f9e452bfd64","timestamp":"2026-08-26T15:56:03.883Z","tool_use_result":{"type":"text","file":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { db, findUserByEmail, ensureKaId, touchLastLogin } from \"@/lib/db\";\nimport { ROLES } from \"@/lib/roles\";\nimport {\n hashPassword,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n} from \"@/lib/auth\";\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n\nexport async function POST(req: NextRequest) {\n let body: {\n email?: string;\n password?: string;\n name?: string;\n role?: string;\n };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n const name = (body.name ?? \"\").trim();\n\n if (!EMAIL_RE.test(email))\n return NextResponse.json(\n { error: \"Adresse courriel invalide.\" },\n { status: 400 },\n );\n if (password.length < 8)\n return NextResponse.json(\n { error: \"Le mot de passe doit compter au moins 8 caractères.\" },\n { status: 400 },\n );\n if (name.length < 2)\n return NextResponse.json(\n { error: \"Dites-nous au moins votre prénom.\" },\n { status: 400 },\n );\n const role = body.role ?? \"\";\n if (!ROLES[role])\n return NextResponse.json(\n { error: \"Choisissez votre type de compte (utilisateur, fournisseur ou équipe).\" },\n { status: 400 },\n );\n\n if (findUserByEmail(email))\n return NextResponse.json(\n {\n error:\n \"Cette adresse a déjà un KA ID — connectez-vous (ou utilisez « Continuer avec Google » si le compte vient de Google).\",\n },\n { status: 409 },\n );\n\n const info = db\n .prepare(\n \"INSERT INTO users (email, name, password_hash, role) VALUES (?, ?, ?, ?)\",\n )\n .run(email, name, hashPassword(password), role);\n ensureKaId(Number(info.lastInsertRowid));\n touchLastLogin(Number(info.lastInsertRowid));\n\n const res = NextResponse.json({ ok: true });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(Number(info.lastInsertRowid)),\n sessionCookieOptions,\n );\n return res;\n}\n","numLines":77,"startLine":1,"totalLines":77}}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdeKbeqaQ3gkSzTgtR2","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_014b8abXKXksPSN3TeFQcnN1","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10424,"cache_read_input_tokens":33868,"cache_creation":{"ephemeral_5m_input_tokens":10424,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f87893b5-6441-425c-b600-bb4bdda1e8fb"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_014b8abXKXksPSN3TeFQcnN1","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\timport { NextRequest, NextResponse } from \"next/server\";\n3\timport { findUserByEmail, touchLastLogin } from \"@/lib/db\";\n4\timport {\n5\t verifyPassword,\n6\t mintSessionToken,\n7\t SESSION_COOKIE,\n8\t sessionCookieOptions,\n9\t} from \"@/lib/auth\";\n10\t\n11\texport async function POST(req: NextRequest) {\n12\t let body: { email?: string; password?: string };\n13\t try {\n14\t body = await req.json();\n15\t } catch {\n16\t return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n17\t }\n18\t const email = (body.email ?? \"\").trim().toLowerCase();\n19\t const password = body.password ?? \"\";\n20\t\n21\t const user = findUserByEmail(email);\n22\t if (!user || !user.password_hash) {\n23\t return NextResponse.json(\n24\t {\n25\t error: user\n26\t ? \"Ce KA ID a été créé avec Google — utilisez « Continuer avec Google ».\"\n27\t : \"Courriel ou mot de passe incorrect.\",\n28\t },\n29\t { status: 401 },\n30\t );\n31\t }\n32\t if (!verifyPassword(password, user.password_hash))\n33\t return NextResponse.json(\n34\t { error: \"Courriel ou mot de passe incorrect.\" },\n35\t { status: 401 },\n36\t );\n37\t\n38\t touchLastLogin(user.id);\n39\t const res = NextResponse.json({ ok: true });\n40\t res.cookies.set(\n41\t SESSION_COOKIE,\n42\t await mintSessionToken(user.id),\n43\t sessionCookieOptions,\n44\t );\n45\t return res;\n46\t}\n47\t"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"10c95cf5-ac74-483a-aa74-308c66e11c29","timestamp":"2026-08-26T15:56:04.450Z","tool_use_result":{"type":"text","file":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { findUserByEmail, touchLastLogin } from \"@/lib/db\";\nimport {\n verifyPassword,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n} from \"@/lib/auth\";\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; password?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n\n const user = findUserByEmail(email);\n if (!user || !user.password_hash) {\n return NextResponse.json(\n {\n error: user\n ? \"Ce KA ID a été créé avec Google — utilisez « Continuer avec Google ».\"\n : \"Courriel ou mot de passe incorrect.\",\n },\n { status: 401 },\n );\n }\n if (!verifyPassword(password, user.password_hash))\n return NextResponse.json(\n { error: \"Courriel ou mot de passe incorrect.\" },\n { status: 401 },\n );\n\n touchLastLogin(user.id);\n const res = NextResponse.json({ ok: true });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user.id),\n sessionCookieOptions,\n );\n return res;\n}\n","numLines":47,"startLine":1,"totalLines":47}}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdeKbeqaQ3gkSzTgtR2","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01SNXLAqkRwDp7TU1Q5g6U7B","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10424,"cache_read_input_tokens":33868,"cache_creation":{"ephemeral_5m_input_tokens":10424,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a3568b70-75c0-46a4-ac75-ae5ece35686e"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01SNXLAqkRwDp7TU1Q5g6U7B","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t\"use client\";\n3\t\n4\timport { useState } from \"react\";\n5\timport { ROLES } from \"@/lib/roles\";\n6\t\n7\tconst ERRORS: Record = {\n8\t \"google-non-configure\":\n9\t \"La connexion Google n'est pas encore activée sur ce serveur.\",\n10\t \"etat-oauth-invalide\":\n11\t \"La session Google a expiré — réessayez.\",\n12\t \"echange-google-refuse\": \"Google a refusé l'échange — réessayez.\",\n13\t \"id-token-absent\": \"Réponse Google incomplète — réessayez.\",\n14\t \"id-token-invalide\": \"Réponse Google invalide — réessayez.\",\n15\t \"profil-google-incomplet\":\n16\t \"Votre compte Google n'a pas de courriel vérifié.\",\n17\t \"apple-non-configure\":\n18\t \"La connexion Apple n'est pas encore activée sur ce serveur.\",\n19\t \"apple-refuse\": \"La connexion Apple a été annulée — réessayez.\",\n20\t \"echange-apple-refuse\": \"Apple a refusé l'échange — réessayez.\",\n21\t \"profil-apple-incomplet\":\n22\t \"Votre compte Apple n'a pas de courriel vérifié.\",\n23\t};\n24\t\n25\texport default function AuthForm({\n26\t next,\n27\t error,\n28\t via,\n29\t}: {\n30\t next: string;\n31\t error?: string;\n32\t via?: string;\n33\t}) {\n34\t const [mode, setMode] = useState<\"login\" | \"register\">(\"login\");\n35\t const [msg, setMsg] = useState(\n36\t error ? (ERRORS[error] ?? \"Une erreur est survenue — réessayez.\") : null,\n37\t );\n38\t const [busy, setBusy] = useState(false);\n39\t\n40\t async function submit(e: React.FormEvent) {\n41\t e.preventDefault();\n42\t setBusy(true);\n43\t setMsg(null);\n44\t const fd = new FormData(e.currentTarget);\n45\t const body = Object.fromEntries(fd.entries());\n46\t const res = await fetch(`/api/auth/${mode}`, {\n47\t method: \"POST\",\n48\t headers: { \"Content-Type\": \"application/json\" },\n49\t body: JSON.stringify(body),\n50\t });\n51\t const data = await res.json().catch(() => ({}));\n52\t if (res.ok) {\n53\t window.location.href = next;\n54\t } else {\n55\t setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n56\t setBusy(false);\n57\t }\n58\t }\n59\t\n60\t return (\n61\t
\n62\t {via && (\n63\t

\n64\t \n65\t Connexion demandée par {via} — vous y retournerez automatiquement\n66\t

\n67\t )}\n68\t\n69\t \n73\t {/* « G » officiel Google — couleurs de marque */}\n74\t \n75\t \n79\t \n83\t \n87\t \n91\t \n92\t Continuer avec Google\n93\t \n94\t\n95\t \n99\t {/* Pomme Apple — blanche sur noir, style officiel */}\n100\t \n101\t \n105\t \n106\t Continuer avec Apple\n107\t \n108\t\n109\t
\n110\t \n111\t ou par courriel\n112\t \n113\t
\n114\t\n115\t
\n116\t {(\n117\t [\n118\t [\"login\", \"Se connecter\"],\n119\t [\"register\", \"Créer un compte\"],\n120\t ] as const\n121\t ).map(([m, label]) => (\n122\t {\n127\t setMode(m);\n128\t setMsg(null);\n129\t }}\n130\t className={`btn ${mode === m ? \"btn-lime\" : \"btn-ghost\"} !min-h-[40px] !text-[13px]`}\n131\t type=\"button\"\n132\t >\n133\t {label}\n134\t \n135\t ))}\n136\t
\n137\t\n138\t
\n139\t {mode === \"register\" && (\n140\t <>\n141\t \n153\t
\n154\t Vous êtes…\n155\t
\n156\t {Object.entries(ROLES).map(([value, r]) => (\n157\t \n161\t \n168\t \n169\t \n170\t {r.label}\n171\t \n172\t \n173\t {r.desc}\n174\t \n175\t \n176\t \n177\t ))}\n178\t
\n179\t

\n180\t Ce statut sera affiché sur votre carte de membre.\n181\t

\n182\t
\n183\t \n184\t )}\n185\t \n196\t \n210\t\n211\t {msg && (\n212\t

\n213\t {msg}\n214\t

\n215\t )}\n216\t\n217\t \n224\t
\n225\t\n226\t

\n227\t Un seul compte — le KA ID —\n228\t pour toutes les plateformes du groupe. En continuant, vous acceptez\n229\t les{\" \"}\n230\t \n231\t conditions d'utilisation\n232\t {\" \"}\n233\t et la{\" \"}\n234\t \n235\t politique de confidentialité\n236\t \n237\t .\n238\t

\n239\t
\n240\t );\n241\t}\n242\t"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"c2748451-23cf-4aba-aba0-611a1b561351","timestamp":"2026-08-26T15:56:05.027Z","tool_use_result":{"type":"text","file":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n\"use client\";\n\nimport { useState } from \"react\";\nimport { ROLES } from \"@/lib/roles\";\n\nconst ERRORS: Record = {\n \"google-non-configure\":\n \"La connexion Google n'est pas encore activée sur ce serveur.\",\n \"etat-oauth-invalide\":\n \"La session Google a expiré — réessayez.\",\n \"echange-google-refuse\": \"Google a refusé l'échange — réessayez.\",\n \"id-token-absent\": \"Réponse Google incomplète — réessayez.\",\n \"id-token-invalide\": \"Réponse Google invalide — réessayez.\",\n \"profil-google-incomplet\":\n \"Votre compte Google n'a pas de courriel vérifié.\",\n \"apple-non-configure\":\n \"La connexion Apple n'est pas encore activée sur ce serveur.\",\n \"apple-refuse\": \"La connexion Apple a été annulée — réessayez.\",\n \"echange-apple-refuse\": \"Apple a refusé l'échange — réessayez.\",\n \"profil-apple-incomplet\":\n \"Votre compte Apple n'a pas de courriel vérifié.\",\n};\n\nexport default function AuthForm({\n next,\n error,\n via,\n}: {\n next: string;\n error?: string;\n via?: string;\n}) {\n const [mode, setMode] = useState<\"login\" | \"register\">(\"login\");\n const [msg, setMsg] = useState(\n error ? (ERRORS[error] ?? \"Une erreur est survenue — réessayez.\") : null,\n );\n const [busy, setBusy] = useState(false);\n\n async function submit(e: React.FormEvent) {\n e.preventDefault();\n setBusy(true);\n setMsg(null);\n const fd = new FormData(e.currentTarget);\n const body = Object.fromEntries(fd.entries());\n const res = await fetch(`/api/auth/${mode}`, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = await res.json().catch(() => ({}));\n if (res.ok) {\n window.location.href = next;\n } else {\n setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n setBusy(false);\n }\n }\n\n return (\n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}\n\n \n {/* « G » officiel Google — couleurs de marque */}\n \n \n \n \n \n \n Continuer avec Google\n \n\n \n {/* Pomme Apple — blanche sur noir, style officiel */}\n \n \n \n Continuer avec Apple\n \n\n
\n \n ou par courriel\n \n
\n\n
\n {(\n [\n [\"login\", \"Se connecter\"],\n [\"register\", \"Créer un compte\"],\n ] as const\n ).map(([m, label]) => (\n {\n setMode(m);\n setMsg(null);\n }}\n className={`btn ${mode === m ? \"btn-lime\" : \"btn-ghost\"} !min-h-[40px] !text-[13px]`}\n type=\"button\"\n >\n {label}\n \n ))}\n
\n\n
\n {mode === \"register\" && (\n <>\n \n
\n Vous êtes…\n
\n {Object.entries(ROLES).map(([value, r]) => (\n \n \n \n \n {r.label}\n \n \n {r.desc}\n \n \n \n ))}\n
\n

\n Ce statut sera affiché sur votre carte de membre.\n

\n
\n \n )}\n \n \n\n {msg && (\n

\n {msg}\n

\n )}\n\n \n
\n\n

\n Un seul compte — le KA ID —\n pour toutes les plateformes du groupe. En continuant, vous acceptez\n les{\" \"}\n \n conditions d'utilisation\n {\" \"}\n et la{\" \"}\n \n politique de confidentialité\n \n .\n

\n
\n );\n}\n","numLines":242,"startLine":1,"totalLines":242}}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdeKbeqaQ3gkSzTgtR2","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01TKdmwRuVZ7NBSskDZmXerU","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":10424,"cache_read_input_tokens":33868,"cache_creation":{"ephemeral_5m_input_tokens":10424,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"bd08cad0-e323-4bf8-8d84-b245daa7eecb"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01TKdmwRuVZ7NBSskDZmXerU","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\timport type { Metadata } from \"next\";\n3\timport { redirect } from \"next/navigation\";\n4\timport { getSessionUser, safeNext } from \"@/lib/auth\";\n5\timport { SSO_CLIENTS } from \"@/lib/sso\";\n6\timport AuthForm from \"./AuthForm\";\n7\t\n8\texport const metadata: Metadata = {\n9\t title: \"KA ID — connexion\",\n10\t description:\n11\t \"Un seul compte pour toutes les plateformes du Groupe KA : créez votre KA ID ou continuez avec Google.\",\n12\t};\n13\t\n14\texport default async function Connexion({\n15\t searchParams,\n16\t}: {\n17\t searchParams: Promise<{ next?: string; error?: string; via?: string }>;\n18\t}) {\n19\t const sp = await searchParams;\n20\t const next = safeNext(sp.next);\n21\t\n22\t // Déjà connecté (et pas de retour SSO en attente) → profil.\n23\t if (!sp.error) {\n24\t const user = await getSessionUser();\n25\t if (user) redirect(next);\n26\t }\n27\t\n28\t const viaLabel = sp.via ? (SSO_CLIENTS[sp.via]?.label ?? sp.via) : undefined;\n29\t\n30\t return (\n31\t
\n32\t
\n33\t

\n34\t KA ID · un compte, sept plateformes\n35\t

\n36\t

\n37\t Un seul ·Ka pour tout\n38\t

\n39\t

\n40\t Votre KA ID vous suit sur Lou·Ka, Immo·Ka, Vrai-Prix, ValoPlex,\n41\t Auto·Ka, Fabri·Ka et Food·Ka. Même profil partout — c'est\n42\t l'agrégation, appliquée à vous-même.\n43\t

\n44\t
\n45\t
\n46\t \n47\t
\n48\t
\n49\t );\n50\t}\n51\t"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"3750715c-d121-426e-a784-d7003f5d3414","timestamp":"2026-08-26T15:56:05.392Z","tool_use_result":{"type":"text","file":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\nimport type { Metadata } from \"next\";\nimport { redirect } from \"next/navigation\";\nimport { getSessionUser, safeNext } from \"@/lib/auth\";\nimport { SSO_CLIENTS } from \"@/lib/sso\";\nimport AuthForm from \"./AuthForm\";\n\nexport const metadata: Metadata = {\n title: \"KA ID — connexion\",\n description:\n \"Un seul compte pour toutes les plateformes du Groupe KA : créez votre KA ID ou continuez avec Google.\",\n};\n\nexport default async function Connexion({\n searchParams,\n}: {\n searchParams: Promise<{ next?: string; error?: string; via?: string }>;\n}) {\n const sp = await searchParams;\n const next = safeNext(sp.next);\n\n // Déjà connecté (et pas de retour SSO en attente) → profil.\n if (!sp.error) {\n const user = await getSessionUser();\n if (user) redirect(next);\n }\n\n const viaLabel = sp.via ? (SSO_CLIENTS[sp.via]?.label ?? sp.via) : undefined;\n\n return (\n
\n
\n

\n KA ID · un compte, sept plateformes\n

\n

\n Un seul ·Ka pour tout\n

\n

\n Votre KA ID vous suit sur Lou·Ka, Immo·Ka, Vrai-Prix, ValoPlex,\n Auto·Ka, Fabri·Ka et Food·Ka. Même profil partout — c'est\n l'agrégation, appliquée à vous-même.\n

\n
\n
\n \n
\n
\n );\n}\n","numLines":51,"startLine":1,"totalLines":51}}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"c3fcbef7-706a-4ed5-bc8a-f78a1ebde435","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdfqZzMyFvxk85FvFzd","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15554,"cache_read_input_tokens":44292,"cache_creation":{"ephemeral_5m_input_tokens":15554,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"20b4e704-a53f-460e-9e45-e82ac9120c44"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdfqZzMyFvxk85FvFzd","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAIS0gQKqAEIERgCKkDsSII7FmRhoJ3tcz9V3ojUz0u/lDKrSXGfvtph/zKpPa6wr7BuaRBeZSM2/uDFVNo007dSzAxg1KUBvKTBhDUJMg5jbGF1ZGUtZmFibGUtNTgBQgluYXJyYXRpb25aJDZmY2M4ZjgzLTFmOWMtNGQzMy1iYTA3LTRkNGRmMzdkNjdmNXIQi06A1NuRRJo41amXnK2lOYgBAagBwJm81AawAQISDCQBSMKZc5icYBXoRhoMuvC9DspVIrGZBpVYIjC9NNK2UgIv8ClokKYCP3xGmM/inOAOdQpqQ6cuGLWIlAVcZoHnAMr8a36KUO8mpEUq1gKyVo+duDsKCDbYy2skx0Bka+FS98zmOY2kZ3ScQjNK3t0BeXLHm8F+Bk2PtWN/pyh/7O4ohjhUXUVB3lxYK3CAavSGrIe2MpsvE2aa4bRyvNJL2MDJPpDHjjdHjBoUQcxzw4g+xTRpjri4LsVB0bHw6ESmJzP8Ehdcztwr759kPuy5UaDGvP8n15f4H5XF9xfnV2x6yNe12cIhicrwUicuhXm4lhEg4QjNglMNJAG465j+k1i0FbVUSNR3AJgGNz+jfjcFISsk0eiyoLhLQqcsAQkYxK/ZkwdKDdbkB9xqVxGTvfc2BrJS5LBmh8pqy2gXfDhQk6CoqHvkyUogRvCFX2Vv0+E9GaMBCQOulzWb+UFX0xH7Dutc+pa79aYYJ0h9o+HN+2Og1c+a24fYH5efTKvYN6+luW2qGmKyk8d/6vTjy7V8NEoN6imCQcXMJ5f2k2r4L9IYAQ=="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15554,"cache_read_input_tokens":44292,"cache_creation":{"ephemeral_5m_input_tokens":15554,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"97fea699-78d1-4fd7-a37f-c99acbadb694"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdfqZzMyFvxk85FvFzd","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01TZktkHucEnF8Ns7i3eVtkc","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15554,"cache_read_input_tokens":44292,"cache_creation":{"ephemeral_5m_input_tokens":15554,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"eba86203-f6bb-4dbf-bfc9-dc6a62605cfe"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01TZktkHucEnF8Ns7i3eVtkc","type":"tool_result","content":"1\t// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n2\t// Retour du flux Google OAuth : échange du code, vérification de\n3\t// l'id_token (JWKS Google), création/liaison du KA ID, ouverture de session.\n4\timport { NextRequest, NextResponse } from \"next/server\";\n5\timport { createRemoteJWKSet, jwtVerify } from \"jose\";\n6\timport { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin } from \"@/lib/db\";\n7\timport {\n8\t BASE_URL,\n9\t mintSessionToken,\n10\t SESSION_COOKIE,\n11\t sessionCookieOptions,\n12\t safeNext,\n13\t} from \"@/lib/auth\";\n14\t\n15\tconst GOOGLE_JWKS = createRemoteJWKSet(\n16\t new URL(\"https://www.googleapis.com/oauth2/v3/certs\"),\n17\t);\n18\t\n19\tfunction fail(reason: string) {\n20\t return NextResponse.redirect(\n21\t new URL(`/connexion?error=${encodeURIComponent(reason)}`, BASE_URL),\n22\t );\n23\t}\n24\t\n25\texport async function GET(req: NextRequest) {\n26\t const clientId = process.env.GOOGLE_CLIENT_ID;\n27\t const clientSecret = process.env.GOOGLE_CLIENT_SECRET;\n28\t if (!clientId || !clientSecret) return fail(\"google-non-configure\");\n29\t\n30\t const code = req.nextUrl.searchParams.get(\"code\");\n31\t const state = req.nextUrl.searchParams.get(\"state\");\n32\t const cookieState = req.cookies.get(\"ka_oauth_state\")?.value;\n33\t const next = safeNext(req.cookies.get(\"ka_oauth_next\")?.value);\n34\t if (!code || !state || !cookieState || state !== cookieState)\n35\t return fail(\"etat-oauth-invalide\");\n36\t\n37\t // Échange code → jetons\n38\t const tokenRes = await fetch(\"https://oauth2.googleapis.com/token\", {\n39\t method: \"POST\",\n40\t headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n41\t body: new URLSearchParams({\n42\t code,\n43\t client_id: clientId,\n44\t client_secret: clientSecret,\n45\t redirect_uri: `${BASE_URL}/api/auth/callback/google`,\n46\t grant_type: \"authorization_code\",\n47\t }),\n48\t });\n49\t if (!tokenRes.ok) return fail(\"echange-google-refuse\");\n50\t const tokens = (await tokenRes.json()) as { id_token?: string };\n51\t if (!tokens.id_token) return fail(\"id-token-absent\");\n52\t\n53\t // Vérification cryptographique de l'id_token\n54\t let claims: {\n55\t sub?: string;\n56\t email?: string;\n57\t email_verified?: boolean;\n58\t name?: string;\n59\t picture?: string;\n60\t };\n61\t try {\n62\t const { payload } = await jwtVerify(tokens.id_token, GOOGLE_JWKS, {\n63\t issuer: [\"https://accounts.google.com\", \"accounts.google.com\"],\n64\t audience: clientId,\n65\t });\n66\t claims = payload as typeof claims;\n67\t } catch {\n68\t return fail(\"id-token-invalide\");\n69\t }\n70\t if (!claims.sub || !claims.email || claims.email_verified === false)\n71\t return fail(\"profil-google-incomplet\");\n72\t\n73\t const email = claims.email.toLowerCase();\n74\t const name = claims.name ?? email.split(\"@\")[0];\n75\t const picture = claims.picture ?? null;\n76\t\n77\t // Upsert : par google_sub, sinon liaison par courriel, sinon création.\n78\t let user = findUserByGoogleSub(claims.sub);\n79\t if (user) {\n80\t db.prepare(\"UPDATE users SET name = ?, avatar_url = ? WHERE id = ?\").run(\n81\t name,\n82\t picture,\n83\t user.id,\n84\t );\n85\t } else {\n86\t const byEmail = findUserByEmail(email);\n87\t if (byEmail) {\n88\t db.prepare(\n89\t \"UPDATE users SET google_sub = ?, avatar_url = COALESCE(?, avatar_url) WHERE id = ?\",\n90\t ).run(claims.sub, picture, byEmail.id);\n91\t user = { ...byEmail, google_sub: claims.sub };\n92\t } else {\n93\t const info = db\n94\t .prepare(\n95\t \"INSERT INTO users (email, name, avatar_url, google_sub) VALUES (?, ?, ?, ?)\",\n96\t )\n97\t .run(email, name, picture, claims.sub);\n98\t user = findUserByGoogleSub(claims.sub)!;\n99\t ensureKaId(user.id);\n100\t void info;\n101\t }\n102\t }\n103\t\n104\t ensureKaId(user!.id);\n105\t touchLastLogin(user!.id);\n106\t const res = NextResponse.redirect(new URL(next, BASE_URL));\n107\t res.cookies.set(\n108\t SESSION_COOKIE,\n109\t await mintSessionToken(user!.id),\n110\t sessionCookieOptions,\n111\t );\n112\t res.cookies.set(\"ka_oauth_state\", \"\", { path: \"/\", maxAge: 0 });\n113\t res.cookies.set(\"ka_oauth_next\", \"\", { path: \"/\", maxAge: 0 });\n114\t return res;\n115\t}\n116\t"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a968dc62-640e-4126-8f28-d0e7ca80fe73","timestamp":"2026-08-26T15:56:50.083Z","tool_use_result":{"type":"text","file":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Retour du flux Google OAuth : échange du code, vérification de\n// l'id_token (JWKS Google), création/liaison du KA ID, ouverture de session.\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { createRemoteJWKSet, jwtVerify } from \"jose\";\nimport { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin } from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nconst GOOGLE_JWKS = createRemoteJWKSet(\n new URL(\"https://www.googleapis.com/oauth2/v3/certs\"),\n);\n\nfunction fail(reason: string) {\n return NextResponse.redirect(\n new URL(`/connexion?error=${encodeURIComponent(reason)}`, BASE_URL),\n );\n}\n\nexport async function GET(req: NextRequest) {\n const clientId = process.env.GOOGLE_CLIENT_ID;\n const clientSecret = process.env.GOOGLE_CLIENT_SECRET;\n if (!clientId || !clientSecret) return fail(\"google-non-configure\");\n\n const code = req.nextUrl.searchParams.get(\"code\");\n const state = req.nextUrl.searchParams.get(\"state\");\n const cookieState = req.cookies.get(\"ka_oauth_state\")?.value;\n const next = safeNext(req.cookies.get(\"ka_oauth_next\")?.value);\n if (!code || !state || !cookieState || state !== cookieState)\n return fail(\"etat-oauth-invalide\");\n\n // Échange code → jetons\n const tokenRes = await fetch(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n code,\n client_id: clientId,\n client_secret: clientSecret,\n redirect_uri: `${BASE_URL}/api/auth/callback/google`,\n grant_type: \"authorization_code\",\n }),\n });\n if (!tokenRes.ok) return fail(\"echange-google-refuse\");\n const tokens = (await tokenRes.json()) as { id_token?: string };\n if (!tokens.id_token) return fail(\"id-token-absent\");\n\n // Vérification cryptographique de l'id_token\n let claims: {\n sub?: string;\n email?: string;\n email_verified?: boolean;\n name?: string;\n picture?: string;\n };\n try {\n const { payload } = await jwtVerify(tokens.id_token, GOOGLE_JWKS, {\n issuer: [\"https://accounts.google.com\", \"accounts.google.com\"],\n audience: clientId,\n });\n claims = payload as typeof claims;\n } catch {\n return fail(\"id-token-invalide\");\n }\n if (!claims.sub || !claims.email || claims.email_verified === false)\n return fail(\"profil-google-incomplet\");\n\n const email = claims.email.toLowerCase();\n const name = claims.name ?? email.split(\"@\")[0];\n const picture = claims.picture ?? null;\n\n // Upsert : par google_sub, sinon liaison par courriel, sinon création.\n let user = findUserByGoogleSub(claims.sub);\n if (user) {\n db.prepare(\"UPDATE users SET name = ?, avatar_url = ? WHERE id = ?\").run(\n name,\n picture,\n user.id,\n );\n } else {\n const byEmail = findUserByEmail(email);\n if (byEmail) {\n db.prepare(\n \"UPDATE users SET google_sub = ?, avatar_url = COALESCE(?, avatar_url) WHERE id = ?\",\n ).run(claims.sub, picture, byEmail.id);\n user = { ...byEmail, google_sub: claims.sub };\n } else {\n const info = db\n .prepare(\n \"INSERT INTO users (email, name, avatar_url, google_sub) VALUES (?, ?, ?, ?)\",\n )\n .run(email, name, picture, claims.sub);\n user = findUserByGoogleSub(claims.sub)!;\n ensureKaId(user.id);\n void info;\n }\n }\n\n ensureKaId(user!.id);\n touchLastLogin(user!.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL));\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user!.id),\n sessionCookieOptions,\n );\n res.cookies.set(\"ka_oauth_state\", \"\", { path: \"/\", maxAge: 0 });\n res.cookies.set(\"ka_oauth_next\", \"\", { path: \"/\", maxAge: 0 });\n return res;\n}\n","numLines":116,"startLine":1,"totalLines":116}}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdfqZzMyFvxk85FvFzd","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_015G2XKENgtEpXfKfYR7rQZi","name":"Bash","input":{"command":"cat /Users/simon-pierreboucher/apps/groupe-ka/.env 2>/dev/null | sed 's/=.*/=***/' && ls /Users/simon-pierreboucher/apps/groupe-ka","description":"Lister les variables .env (valeurs masquées) et le contenu du repo"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":15554,"cache_read_input_tokens":44292,"cache_creation":{"ephemeral_5m_input_tokens":15554,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"995b5682-3df5-4acc-bfbc-2818d2755b74"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_015G2XKENgtEpXfKfYR7rQZi","type":"tool_result","content":"README.md\nassets\ndata\ndocs\nnext-env.d.ts\nnext.config.ts\nnode_modules\npackage-lock.json\npackage.json\npostcss.config.mjs\npublic\nscripts\nsrc\ntsconfig.json\ntsconfig.tsbuildinfo","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1224217e-017c-4624-b7d9-7d227feff6fb","timestamp":"2026-08-26T15:56:51.042Z","tool_use_result":{"stdout":"README.md\nassets\ndata\ndocs\nnext-env.d.ts\nnext.config.ts\nnode_modules\npackage-lock.json\npackage.json\npostcss.config.mjs\npublic\nscripts\nsrc\ntsconfig.json\ntsconfig.tsbuildinfo","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"4683b924-932c-43f3-8ec6-e3beb469a006","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdjCLjb3fiVkgiMT4bK","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAISggMKpwEIERgCKkD4VfQfioZGJ3aqdMQ1Sodapa+kCGy4lzXW2+RtkusBCFwSoYxH1106NWgrFrliYRM13HVrMA4PHQIP4Z2gkXWNMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAHLmbzUBrABAhIM9kPwth344hVKExT2Ggz7jsRpBqPL22Drf0wiMC72xQd+ftLoGvnVILso9ilBbS9tuup/mVyQ+VBxFCPNXk84ctGR4nC45O2sTHZZpSqHAQBHNT5krzI+tP/WlPWnLXYggq0P9LEVwg2kLnuFj2RNVHNFQpGgjmV8fvz6y7eL2mSw2AFVNgT7JNC+ZxkbhbwcvcN+2NwDY+B7/9f0cdXieNthwlIlRL09or3ODhndJW9rrcQskh7Re0iG/TFdjw5r9m/tfl5NydR8C3Z8b/5UnlxIEOMEChgB"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":5403,"cache_read_input_tokens":59846,"cache_creation":{"ephemeral_5m_input_tokens":5403,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"531720bc-0df0-4aef-a768-f9ac4376f65e"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdjCLjb3fiVkgiMT4bK","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01EwrD739xjEVtPkp5iauRBw","name":"Bash","input":{"command":"ls -la /Users/simon-pierreboucher/apps/groupe-ka | head -30; pm2 env 30 2>/dev/null | grep -E \"KA_AUTH|GOOGLE|APPLE|BASE_URL|RESEND\" | sed 's/=.*/=***/'","description":"Trouver le fichier .env et les variables du process PM2"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":5403,"cache_read_input_tokens":59846,"cache_creation":{"ephemeral_5m_input_tokens":5403,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"6beba398-1619-4ca6-96f3-91824074070d"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"ls -la /Users/simon-pierreboucher/apps/groupe-ka | head -30; pm2 env 30 2>/dev/null | grep -E \"KA_AUTH|GOOGLE|APPLE|BASE_URL|RESEND\" | sed 's/=.*/=***/'","description":"Trouver le fichier .env et les variables du process PM2"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01EwrD739xjEVtPkp5iauRBw","type":"tool_result","content":"total 536\ndrwxr-xr-x 23 simon-pierreboucher staff 736 Aug 23 17:31 .\ndrwxr-xr-x 20 simon-pierreboucher staff 640 Aug 17 20:27 ..\n-rw-r--r-- 1 simon-pierreboucher staff 10244 Aug 13 15:29 .DS_Store\ndrwxr-xr-x 3 simon-pierreboucher staff 96 Aug 13 05:49 .claude\n-rw-------@ 1 simon-pierreboucher staff 2445 Aug 23 17:46 .env.local\ndrwxr-xr-x 13 simon-pierreboucher staff 416 Aug 25 21:44 .git\n-rw-r--r-- 1 simon-pierreboucher staff 142 Aug 18 10:34 .gitignore\ndrwxr-xr-x@ 25 simon-pierreboucher staff 800 Aug 25 21:37 .next\n-rw-r--r--@ 1 simon-pierreboucher staff 29689 Aug 25 21:06 README.md\ndrwxr-xr-x 7 simon-pierreboucher staff 224 Aug 23 17:31 assets\ndrwxr-xr-x 8 simon-pierreboucher staff 256 Aug 23 00:33 data\ndrwxr-xr-x 4 simon-pierreboucher staff 128 Aug 25 21:06 docs\n-rw-r--r-- 1 simon-pierreboucher staff 288 Aug 9 02:43 next-env.d.ts\n-rw-r--r-- 1 simon-pierreboucher staff 228 Aug 23 17:31 next.config.ts\ndrwxr-xr-x@ 88 simon-pierreboucher staff 2816 Aug 23 17:31 node_modules\n-rw-r--r--@ 1 simon-pierreboucher staff 78399 Aug 23 17:31 package-lock.json\n-rw-r--r--@ 1 simon-pierreboucher staff 764 Aug 23 17:31 package.json\n-rw-r--r-- 1 simon-pierreboucher staff 152 Aug 9 02:40 postcss.config.mjs\ndrwxr-xr-x 11 simon-pierreboucher staff 352 Aug 24 01:14 public\ndrwxr-xr-x 5 simon-pierreboucher staff 160 Aug 23 10:44 scripts\ndrwxr-xr-x 5 simon-pierreboucher staff 160 Aug 17 20:06 src\n-rw-r--r-- 1 simon-pierreboucher staff 618 Aug 9 02:40 tsconfig.json\n-rw-r--r-- 1 simon-pierreboucher staff 117054 Aug 13 09:06 tsconfig.tsbuildinfo","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"97745010-c33b-4a0e-a436-b109e403486f","timestamp":"2026-08-26T15:57:01.464Z","tool_use_result":{"stdout":"total 536\ndrwxr-xr-x 23 simon-pierreboucher staff 736 Aug 23 17:31 .\ndrwxr-xr-x 20 simon-pierreboucher staff 640 Aug 17 20:27 ..\n-rw-r--r-- 1 simon-pierreboucher staff 10244 Aug 13 15:29 .DS_Store\ndrwxr-xr-x 3 simon-pierreboucher staff 96 Aug 13 05:49 .claude\n-rw-------@ 1 simon-pierreboucher staff 2445 Aug 23 17:46 .env.local\ndrwxr-xr-x 13 simon-pierreboucher staff 416 Aug 25 21:44 .git\n-rw-r--r-- 1 simon-pierreboucher staff 142 Aug 18 10:34 .gitignore\ndrwxr-xr-x@ 25 simon-pierreboucher staff 800 Aug 25 21:37 .next\n-rw-r--r--@ 1 simon-pierreboucher staff 29689 Aug 25 21:06 README.md\ndrwxr-xr-x 7 simon-pierreboucher staff 224 Aug 23 17:31 assets\ndrwxr-xr-x 8 simon-pierreboucher staff 256 Aug 23 00:33 data\ndrwxr-xr-x 4 simon-pierreboucher staff 128 Aug 25 21:06 docs\n-rw-r--r-- 1 simon-pierreboucher staff 288 Aug 9 02:43 next-env.d.ts\n-rw-r--r-- 1 simon-pierreboucher staff 228 Aug 23 17:31 next.config.ts\ndrwxr-xr-x@ 88 simon-pierreboucher staff 2816 Aug 23 17:31 node_modules\n-rw-r--r--@ 1 simon-pierreboucher staff 78399 Aug 23 17:31 package-lock.json\n-rw-r--r--@ 1 simon-pierreboucher staff 764 Aug 23 17:31 package.json\n-rw-r--r-- 1 simon-pierreboucher staff 152 Aug 9 02:40 postcss.config.mjs\ndrwxr-xr-x 11 simon-pierreboucher staff 352 Aug 24 01:14 public\ndrwxr-xr-x 5 simon-pierreboucher staff 160 Aug 23 10:44 scripts\ndrwxr-xr-x 5 simon-pierreboucher staff 160 Aug 17 20:06 src\n-rw-r--r-- 1 simon-pierreboucher staff 618 Aug 9 02:40 tsconfig.json\n-rw-r--r-- 1 simon-pierreboucher staff 117054 Aug 13 09:06 tsconfig.tsbuildinfo","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"a2d3bfb6-f9db-4cd2-969f-364764ee48b3","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdjyBVd46DbYke7EKsU","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01484XAsJZv6HeDcbrvB1sN1","name":"Bash","input":{"command":"sed 's/=.*/=***/' /Users/simon-pierreboucher/apps/groupe-ka/.env.local","description":"Lister les clés du .env.local (valeurs masquées)"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1208,"cache_read_input_tokens":65249,"cache_creation":{"ephemeral_5m_input_tokens":1208,"ephemeral_1h_input_tokens":0},"output_tokens":20,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"68999943-47c9-4635-a389-b032881fd5fd"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"sed 's/=.*/=***/' /Users/simon-pierreboucher/apps/groupe-ka/.env.local","description":"Lister les clés du .env.local (valeurs masquées)"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01484XAsJZv6HeDcbrvB1sN1","type":"tool_result","content":"BASE_URL=***\nKA_AUTH_SECRET=***\nGOOGLE_CLIENT_ID=***\nGOOGLE_CLIENT_SECRET=***\nKA_SSO_SECRET_LOU_KA=***\nKA_SSO_SECRET_IMMO_KA=***\nKA_SSO_SECRET_VRAI_PRIX=***\nKA_SSO_SECRET_VALOPLEX=***\nKA_SSO_SECRET_AUTO_KA=***\nKA_SSO_SECRET_FABRI_KA=***\nKA_SSO_SECRET_FOOD_KA=***\nKA_PASS_DIR=***\nKA_PASS_TYPE_ID=***\nKA_PASS_TEAM_ID=***\nKA_SSO_SECRET_ORA_KA=***\nKA_SSO_SECRET_API_KA=***\nKA_SSO_SECRET_TROUVE_KA=***\nKA_SSO_SECRET_CREA_KA=***\nKA_SSO_SECRET_RESTO_KA=***\nKA_SSO_SECRET_SORTI_KA=***\nKA_SSO_SECRET_JOB_KA=***\nKA_SSO_SECRET_KA_IOS=***\nKA_SSO_SECRET_KA_ANDROID=***\n\n# Rapports quotidiens — rédaction par Claude (scripts/rapport-quotidien.mjs)\nANTHROPIC_API_KEY=***\n\n# Sign in with Apple (restauré 2026-08-23 — perdu lors de la réécriture du .env.local du 23-08)\nAPPLE_CLIENT_ID=***\nAPPLE_TEAM_ID=***\nAPPLE_KEY_ID=***\nAPPLE_PRIVATE_KEY=***","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"003eb5eb-7f1f-46db-9604-24286e89cf05","timestamp":"2026-08-26T15:57:05.105Z","tool_use_result":{"stdout":"BASE_URL=***\nKA_AUTH_SECRET=***\nGOOGLE_CLIENT_ID=***\nGOOGLE_CLIENT_SECRET=***\nKA_SSO_SECRET_LOU_KA=***\nKA_SSO_SECRET_IMMO_KA=***\nKA_SSO_SECRET_VRAI_PRIX=***\nKA_SSO_SECRET_VALOPLEX=***\nKA_SSO_SECRET_AUTO_KA=***\nKA_SSO_SECRET_FABRI_KA=***\nKA_SSO_SECRET_FOOD_KA=***\nKA_PASS_DIR=***\nKA_PASS_TYPE_ID=***\nKA_PASS_TEAM_ID=***\nKA_SSO_SECRET_ORA_KA=***\nKA_SSO_SECRET_API_KA=***\nKA_SSO_SECRET_TROUVE_KA=***\nKA_SSO_SECRET_CREA_KA=***\nKA_SSO_SECRET_RESTO_KA=***\nKA_SSO_SECRET_SORTI_KA=***\nKA_SSO_SECRET_JOB_KA=***\nKA_SSO_SECRET_KA_IOS=***\nKA_SSO_SECRET_KA_ANDROID=***\n\n# Rapports quotidiens — rédaction par Claude (scripts/rapport-quotidien.mjs)\nANTHROPIC_API_KEY=***\n\n# Sign in with Apple (restauré 2026-08-23 — perdu lors de la réécriture du .env.local du 23-08)\nAPPLE_CLIENT_ID=***\nAPPLE_TEAM_ID=***\nAPPLE_KEY_ID=***\nAPPLE_PRIVATE_KEY=***","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"d7a1fd4d-8968-4288-9eb9-442c7b8db166","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdkFiR4mbUJF64LBSBQ","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAISk0UKpwEIERgCKkBR6gmvh+92wKQmHSil+RrxqZ0V855MztTLwaqJ71TjixVqGF78j5pMZkCPJRsQ/N+n32k6czZS7WHxqld9FZMwMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAH/mbzUBrABAhIMzEdz+Z9tnBWTB+hgGgzchK2buonoUGrtOOEiMIVMH9BkvFXMD4xZ+FSbC30MBcHOfvyUn7yiAmO3yARKQAS+4lb+C7YgGvOft+snOCqYQ5y6G5G1S0ALGlqzHU5vDBf9zYxlcbybEemp2s11AkXHioM767jVY/Tnb6L5v1zHxZCWUUrzUND3gWhias9Z8pRPKuXyAQC4TPGCe/U+NE/57dIl1soseIc66ZSe0SwZUz5J/Ppx17NRoKu3LD1aM73ci0EwhL3bfVTa75BfSS623s0cldsAv3A+svxZc1eU3gvWtTu7d3gr8/yrpcuPQbZbGRiDTTA/F/whY2zkARmwq2Gl0yvdKZCjCjNXQbrnHSsUDJddCO5LKzMMvvCaqNXcYr/3TRsAZZT5N5Ta7FkaySPtXwu1KX+64sW8KCM8Oza4udiFcP5p4JyERNu++1HOFbO5CtfQVbbSz6amLg8NMgDQHUp+3h77Jn4bBSwZ9UAEsQFF9ZYgnviaJRXAa/z8AxQm0Lktm5wJ/+OSFp1kF95IyRIgT7utvupr3iKxCS5EPybsRZBCVRb6kDh+baoOYRcpsI9spsCvgc3D8ugHIP9Lq7DFqnJNiVvHEzRAkP73vHM5DVSED6lVEYTVE+vc0x5szl2YKnpzusPsdK0ssSE1dcf46Ity7QIjrX/0kShheT4gRHII+NaVIWoYtfJaGr9tXz2cBNuxzl5j1BxpJjM9v+JYt0otAz9+yeOeLGWsJzZJOOa/M4o7HxTF4gQwzC50iwesmTl8eLsASpUud+BD9wcSX7zmh87Z/hkxskBJozGkbtNBpwivaY9p/szn6pHW/dSIKcoohQrSE+JxOErJmEhZPDPPs6LXei2jsth6/curwxWiFS2H/0mwkNnIrvEs43qLCIWKXl1G0fNaH0uGZrn92lFxzditakbf0nEsjkNYQnAAT4k2/use5ES8ZCgzmJas/rxt9ffi/Ocq7YAB8Ijm5QED1+VSwnLOVPjAT/o/xTP4CXws5PbbRdmomMUn+qDDWJ9udZVDQpVW9/F3JfeBRdnNh0B/UDFlEsh40YoF7nV7DbtGAbwzXYJ6D6T7Wm+BgCOaPJWY2zUqSVkMBh5NCDTEsAMgKP+mT+XUkVh2NJdmjg3P9ciO78unn7DonUh50oEakjlG0hvFXWh6GrWdFxOthn+JYnL3ZuuC7PlqAlGYcfxoTB7ev1hC/1jyDSxbVqYz7CRbRkkndYDN3eVUWug1Xd5w3NSaV8c4QVLrfJy2IqJbuvVigkGXl0R13NmsJFEzpDBZ1sPJXH4+knLsGogQSHXAZkn+Vy0xVOSAXt+ZZ4WYbH6S/alMOO22u6t1DQTu4EUXao86N6IGhCoxADh2dqcIXSS+AHyELGIuD5w1zIKyWnAL+ZKcERvVPzjalFYykQUIF8s3ZKogfDHn03ScSfmR8+nfv9a55oAqaj6XDQcO3r6WUhPyHhfmGYZdhEESkqC2CUbPKMVOlGUABxc3BGHX90XdMeaVoQSNFAz6jYTgIFZtTRzTe5K8PbEt2Fz8pnPDnOmIF1nhZTtE76bPTENyQPQAld6URur9e0q3E5RVrwt+hkKh6k7gmwrBZFByPJSefdqY5HpyC3r5DMCYGAvHnjLEbXkxRFom/TDd2fWTRCCUnFNobA/WH3kvrsQmnywmzaQdksOD1NhhGxEkoJlXpVv85KJpBBdcMaihmB3ImnD5tcegefJvp3uVW3rdPvx280EMxNnnWzcEFZcQGEA6ykJVSgQgqdXh7oPp2bFcWyMvH/0jHdXRoiHGiz6SliWjErWxAosnBd2M0M26hng/5uWvKvVKK71/IKOhGbSOnmdHa5Pp/qiCPUA2nQeEQZ5xiViQXcWbCpfpxTFpZ4w6vnU73FtgT9dC5qk/u9wKRQF2yU9DX7zyRlJofaJXc53n4Ig+tS0m83WE68+AXUjIAVirSDQcjkyPVDEWz7aImYk+XfWXyi0SN8iSJnlmdg6a6kA0KbFUX03AWn/wsm1GOm/v875UbbkQWvAwYEfqg2magiPe46z4KSqBXTntJ/OBM9M1ckcJmaFOvEsl2R9So6rEwOd5txos2rxRmiKKyGtb6jVnegb7DLG46hsZrIqYs+PmDQhc04+yoTPzHbzSS4k3MqCPOnlkeLgfkbgFZuBHkQT//RXQyWPpwLjEjFU6fe+iiM7/K2Iik+hgwY2GarIVPf2j7haHoLXyLcVWI410ML1HtRoCo8GFXzxy8P+gOnJFYlPDhTbVn9P8QrImxL3xdbHy+tSqERG2UKMxv7p0gASRey/nonjlgp1J94OKxCBVWrXTAx3d7F8tde1KBQOU6RK/vPlHJ1p+iJZxMBLKfeFDwDbFOh8vm30I62RczhG6/nKVNWEudQLsjeioWnSiafQ5lVMV1JqEi2dsZSokUUn5dbuo8MU5W7GREaVtt0Nh7TtR1TRJFi1N671/O6wB2XsJ+LMHIvGhZzjbooPE891rFZPU6fCiSWYto53XQNlWb8lz8DX6gvD1ihiQdN7RWUdqmegU1fUTzIpMpHCe/CW6AcUZki7G4cCA6+UeXcbEvXwFPLvqGiitDGBWB1k6Aytod+a1Pao9NCGYzem3Sy4VMKWupXrpzcoE0+RHplO5GcZqQp/v6OrbuJHBZ1O9jo6E8/KezzINk4UFIO32KFuzcwqvYYcIWVMqZyrKmtFoFOhpQlaaDVWXdZpar/UEnOO0SzrAhEcgbuVxBaaFwwPzYYIdxOrYrLkY2Hbepuc7PM2nWPYyot0sNXHV0GM7K9qfTtDPyb04rW7OCS2pY3GMtKCD82NYpjza9Lg+uka3FocpF7QKrFPGwDJURXoJkOone+VXZ7HWmKjdvMokJy6fX9J5NPxkfoRF2DxUDSmbkuCEnN77BsSm9XR44QKMfo592SGbkXQrl9t2pfBdqzEawDQts6uqMCqV7dXrUn/GwMj8zmDhvc2nQbZtbfRmFxZ7gjT4XGZgZV0wLXCVkDkFsXQFre3OH1TjJAfbndCmGcy+1UizyRvCU6TPrC0yJ3jg5DFLs5V3PtOiFjLq3jMUbqFAo/l2fT94/AV5oK8vsC9U/yYZn5rWCHmiX5oMMExVG3/+mGZvvIiPnfuKplUTX+WeRhBQzscLTXO8Ht1bt8FJM75sYTEwxc/qsueMkJzACdLruA2hCV1A7KaFx/aLuefSRgKKjNZg3a35OCDNlXvY86TUTyQItVtPEcxgJDt1/xzm3kAeChkPSbzgA6xiCbEBHzAbqYwmKNMloREpdf1YxOgVx6voOy01zIJcVPjH7Fue1Rwyyr4eS9BLjpG5dbjXw932+FTITAVirV/j9UVUSsxRmKnrJMA8tISNuKshbp9btElT9XKsc0XAtX1Kfcm5P8daB8FS9IGVxaAgPI2GFmK2aDbF7zHXbzZm+JQMPfnxM9Lc9SoqiDuvthL404kNvcUQdkA2X6MAQ2k2UwUn1b2Sra2Pcx8MCCuHCKG3M3jGBtLVYm8Hi5tynXHYwPz25+7C9CJG3eTtE9VAnUWvphg7Y2Sk0EJNoQc31zjW7yqYxOb9V10eUmA2gNb5f78ZaDssYqgilJ/Tk4vS3MK9dsWzZwjzytwOt9rhxPdCzjjLB2m49fgUYNsXBohJ8Lj3+e1uyg8ZObZJzlVKy14XjdsoIOq7CbsrI5GeE4I2b8+UMziNlVGtpprShuWUMkr3pC/zoLqMiHLdK22CKYz1Jn99mY+wb9d6qSHdvpENNBxnMNklnCl0QA1bj1NAXnpbrHKMVvVOW2Utgv/TW/dQ9s8AhNQlAI9MblDRHSaa0GxhENXIBhmwSHCW+xmRGHZuJ505pWXJy1SPgfIKeI28fhjJNwDkljTSh+7VzowBXqp9p91lFeRYdnRjPotjR1l6H6PsspDqjoKIJ+yIzTWhwgNBzmEbSSv4Q45fFcy4mARSu6Z4Ab38LGfPH3V4Q2p8mS/YlhJyXjJcLKsL6EIRqWXJ+HQGIzJUFIVD2mM0WQ5myArakmdmDahlZOPz2vIR9KfWBsbLSavD8OCyyN4acx94vrTBMas7kGAzYMvlXsLjXtzH6gZwStsVtdex9gukB8avnbks37QzgWTiPYtGnjVMfPJ2F5Azgp9pI6PI8cctfrRnlC453HtD66mXIgihximQynR+0Yh7+CTqEnBdrOspWocD6W3v5vbN6FiwBRjyXK5K8JdVKDUFCPFdJUV3QjI7MCclY83hvWc2Y8pPh0n/dlt4/MPJGfLJy/g/dzz1c5HqXQLOH6CnfJhDgCwLqt29cNgddMaaDxt/b+F1o4pH+yf6JYiT8PAtRSCeh8OWlSeLj3UKDHqtN61YRmd3PJ3KuGpn46rdtW+jHq8/7oMel/pUo8LkQfDwPqyEHd1aheWtLZ3SQhAVY80Uuo+/GFeoP/J7RREqIAlyNmbBMhmG6KHL+qEFPUSwyedMnGbXzx1QpohEk7a0Xr+yXwkbqCFBP++OU0WrZKUASIFuxsJi9b8CPw5CJ1HpykARIfa3x+OtNM/9TtzNpMP7tTTpk0Z561ms+CrwJGfmIwj97HPzqkJTvuXZVIRSmEiPaLZMJ/1EhFxoe68ZP0dez0xyOzx1dmrVIdz1KsvFqDXTz9P19+ZvyDU3pd7V16sQ1i0QqpAXeP3yc4V7crU8s9F6Cq3VbqKlUxn4o6sXjV0AppriXTB9IfPc6C0tBQJMs71PThXLsVvIdvHxsgpUxjmrKYPYqWJ7gr8t6UoIzYJMT5FyekMMfDddgwiWC50F6DFUr4DKuOC2JEd63yaLNxQOdoVZGoZD0fZd8iVLYemYQOEJ57aWGlpPdbKwrdkdyiLSCUVAPiR6IdCrCzGmeXHPLLAIxSbM2nslA7NkDTtnWMMuC2t943J8r8C6QR7jkGZsrBe3WJkDUzQCKj2IPi85QClmBkYLyJ9vdKcrXch7e5uPGxQ8hM13+e9revTY7vNKooCVwCefbtLBcaNl8Q+9bzQaN9vxQpgf8pWx3OfdG3unbhhRbtFP911DzEE+bLY0or370s/GSWAPOF5s9e/KrInvZ7AHHQc6oaIolbLXAjDmIajg9OpsRXpO2sWI0M8Ov48+SDQojioJFkLhIY/DkY+0wxsURuAfIjnpYnR83NgESRzejWuiecEpF3AjjhIL6+A2iIufgCjyZqW8u6jORqv+5pEXVqzs2Te3P78w/4CPByrbWXOAas9iZFugc+aRTt3G7SRJQ2wuf03PA7y9mutBDGS13lCcn0HNeyITGlyb/iw9lVjue1ex+dicBdLrWrVIdyKUl3xP1SfnCqDCqC94gwVt9mPUxapNOzu0KXEqB0QEmfzJbXAv18bZ1+fj/BL8J5ooTeAeOYPgvFs2aysa01DAxNDSUAngFu9SGoQPahaH/CdvI/99T6RzU67lHN78e1TuO9fK1mf+lsXQHo75X0QYmHdLK/CZkN5LoYQB50avZ/9cDOgLgS2X3kUrWxusJ4RrQHZsedUVXiQkVMekFzes7efGTxlycpfyoDG6HOLCLaWFck89gaHWwgy4QUwd6TlHWYCBip5V4+xVEz0BK+H3okXHUe7RPjRot05VXUI43SFQDHg1+WiDS99nq2U1S4wh3zD0O2AcKjaiq2U9mgxYiLS7WCa4pNEY2nlBHp0rXW9R97QWKEeP0EWopIYqRDtIrXb+7MX4hsxavcY7pw7Zjsi/LJuJYU7g99wRF34d91OeHBsk7BNWhpGoOFmxO22IdVbkaxdg/K34kwLpqrRgyijrMUaeRnGbdD9sgRtn8IIt+Hb1Pz36PHj7/xmEveKdb55AchVjdUt3pTFnqvNJbxY07C/P+el6aS8QDa4SfSiR8B2Qe6e/T8VO/48oy7ABENOoloobJT+TI5DzPIkO/JZGKGJLWpeVja6VFw2se+0HJcaX1acGlsJS1QGmuIaJKG367Bs7KfQm0kptqD0HjE/4jlcJOBiwAM96JPsBqUP1S7sr7rN05eK08sLzr5riPuCtLdgLbd6PeKvuUgtm61wWS5cQjfkRYUJS+xiSNH/M5bs0YpTgXOT44cSs/k+2Pa8IHuuj0VppKIk9ipGPRlI5tIF/5v9tsbHIVBZWn9tO9U4uLFahdx+aTWsLwpvL6vNdiotD5S9voCmMl1zMusWJZs1RroONTl4WgcH4W/J9mcHHmu/w3y2aMwJQWd/FXZut2dHDuUcAzpCiBMhJb3abft5OUL3LbucggSK6aqSJRt13UAWSDKp8CIiI8s7bYOq7YVTAh6O+ElUtoz9W1BuTdgxlYCMcvw8JHxeqIiieaCW+7YagFiHTu9IMS6aPFdDHDTNt+7Le4Qjp9V9AzF4URTi+MzBVL8Y4UhncnW26VPlvUvty/q/l/AWnhEACacdu9Ty+QBJ3GWVd2OTnIy/SEJlMVAfXUImvlsZqUaQLNliFud9xcujAxe/aGObvk5RuaIHJfRwYj+o4K39JYXB8zGG7iVRozKngx3Sge1DRgvi/Zc1Jgg6uZmTaBCdd+RC9Jf0BnoaNcpDBggUH04ttEPtb5gJ+S+xZvHj/JFJk16CN/ygb0UPOjBCsHX+lde+N+rjML+nCFi336CkS7mOYV8G3UM1yvHbqJrkvh8fP7prqWch+NtboHdlvIND+WXSBWrMFvAe7gkQc2aIl8Z3H5xfPmqZVz6RI4NqfHFTS+R7D6GqCKJ6vcaDTo1hxxvToO7ZmPhOJW75nMgxgL5c08onpFxxuu1lWVLmRiB/RO37UgygEkd9yKPUsG7EuvwGfcghg78uXOo6Nh/QTuZKlEmV7Di6hErpLFzTDy5dtc7q32286QiaMharTSAYDbRoJgPzSxBOhYwqUo/lVtCBcyWCqeHsyBCaumpJeSwz3EPK2Uh/Olb3KmKvcDmZItfqxZ4DlKGtsSHUdexxyfwewJ11ZrpGwzDwezN97cZCZbNRbpqkoHwg+7kCMks7Ca1lScgYZou7b0+xyYfMNgYgKjsiOjnABgh1zsxO0jHlxgc974MNHSvjl95C0+FNWkMwHqsjn+5L1VpDNtW4sCZGIaZIQd68C2AlBi706yKgSLGYUmqR/dl8cZ5rfnXy8YZKM1PyO73wgxML37mFC2wm0HsNXJtPYu3jNyseksx5/tpwqR+hZG216cxZXQE6oMl66uz1YnxzYi+Z95i7pIByBqWDex5wcZUkWmSBj4oo4sBfzkqBafd/Bk5Uo0UhasmcxWG2naIWH2F9ejO8QpScPeQJ6zemZd2PxZciZyfdpK6k+Eohcq5TCUo99K11lwKDgviwIEcqhVgOEkBsFUMtbrWaOevC734MnfAJHtCLFTYBe5uVobzDZHYFkyLvm5A14qbAccQfkc2HsC0MPZQ94Mq1h5PuyJ/pEGFs6eE9L/Eb15dDcF3sSlF8XxCAoJa/VtcwIocCzYFuSmdBJecpDRhZ727i9MKEaVoB5ejWIUB2SUavHjqAyHmu3uOLw50n4n9gTCCxc6WKFYW03DoYmRDFPAvny0ds9w6PTI6oYfp4B500uMGU58USHoSncGIdCfnLLFMgo92b/M8PSwxgpfS3HM3+JWq8ef9gzYjnxBI3zhGjXlfxRC3+gP93Y+/BA7POCVbIxGWwoaSk+3hqNQdt6wo3q4pyNx/v/SMOetH9F/9HGmPLxLIHlEW7UqY3O7yb/aVzSHbNdkH2OaWXgqT7I8qMZYO/BzFCZa7Mu2roLxGaXRuemXW9TTtef/pqybvGLKnh5QhBEg2H13VYRgWrkWlTeSvm7ralgbXvaKUiYDBrL24JyiUQ04/QqxsA4WdCpTqijQFmSpVe1K4/fc25N0YKk+82K8MdwI9DB+cA4R6YqsyWes0R/8gVh/1p7jm2eatipxm5dnKYUbZV/ZP926J+OeOAnenIik04aECbIz5bEB4eMtGyzntPQjDvSUCetdC4Lw3Tg3ojUDccgPKYZcjBYe+IPy9MLLZjgezQ5GRd7WWZeFo+UbbaIjMGIIcbP6WCmHWCSEnZGzTrDGUNIGsQPqe1NcGnH0Sc1W/JsbMaLuvRHIYQSnKLumvosKDzFCwOhOWhhGdsRNjxI9BPa7ZHLGewTaqE3DqosL/IPO8w2cCjfj/rbtvBKOEskdbOL7om3KrzwKtnVoJhUUAJ2dcRbGNgrrycSwJR7my7Y3ecXhuzj9tAu25ejKBhp5hSM7kLkuIuSyPziJbZhND4DwZTa1qu6d2KhXndNbyOU2gaEbevtcY5CC6JD57gcg99plQ0ilf2nszIDSNxmvy3UQKiwtUu9fTqyVYl20tCqsQ6OGXHhNIq+Pd5wfTPzel2wuk0mLxdI/8/xj6QeVlevkjEsiHCV7zaVBdLRGGUeNncwimLYpw3tZt0uapkSyS9EviZdpKuy3wkehZnxQycukqoUIs3seq925wn4iqseZLAFQBJ0ZoUeRJrjlwgldexJBYksFI93BXRZSnfdTmBNQLHwU5kv3TyLZOctRpgxGTfBIVnajF/Rv5rm8V79tpdHDMsgcpZglcGzW1j7EN/BICcaIjtswO3zFaiGrBE57DsaAsdCEjuKnwkrseyWvj/gC2AClprXxdrW8qiFZEsIiDpkhlISxApQgNDzws22KDKBl+wt2S458Zo0IcbJ4kM8UFpNXWb+2+8iPISEQPGtzrQBEDy+rbD6v8mCnHZstmuzSUw2L/QFdMuIfnAPfoOO/jngEwfnM3Kq3xX9+64CSlRAMobcqmJhHX2REllKmwNF4T6AP2/JT5X6NNW6BXw1XqEdwrG/s84u/NyujbvbsBKmauj+QbwbFFeJDH/qRyHgEkvakT/Gc1++o947kOo24nEE/2VgAU9bkfJmpO4+MvkTIJNEiJGR3kFXEtU7FvBkFFCr/wiYSdW4b+vf3G/SlyCptD50nzCLjRJnYZdRONUuee01c0j2MpW3w3B0jtQpoyE7h7NeK41zEED8PyxSmB3merXmAs3MjKdAAiw11OIQWmV1kYk9TxzD7GaU0HFiLpguKbJ3G6xZFjrE1uggpW22KBzcyLXy79504nTAlvTpQ27/+mX+IHsgXOBZ3iF36FtHqzi5FuJ+W00cjAlKfnbincW92M7bHoXta8x3KS2Ydd6JtUDUEeh+xdk9UFKRv5ofmMZjq8np2qEOYRtkU8mJCQW0Azc90hoky3JacsgbjyPy4wexEI6hHyKtSfjePU17NadfRW3Jbj1yHYSKiUOin2D5JyFLGDGra6fSR9N17WiQ9tdt22HEMcHW4wFRkXQHGvjeuHlPY7nwuccJRDTT0VSNVEJppjvgdbLLFOC+UuuVt4M2t3DXWPuLErgSZftcLYG89Y/5wPeCCcMMBxw3M81N3+3AAp/YEdbZyZXV5V899yx8xJmmp1wRQUBeZ+H83l/lUCzYM4cE+20ewAjPJTKC6sor2FcvP6HIhaInMHyRP26rqHc4NzkrPGWchLH8agFUS39ZRMp1nqptJV6Kbso0XcCZSCzvUfO26W4OOcjDlp9xV3+YI8J6BSX8umxi350VGt8iVesw7qcp8sG3/W6sjkJHGGl/eslkjw/2XjmKftAqejdKdWpzhIEQuk/jZRXhWy6Ncapa4m11G59OTLCeDRvcexqoL24gdsuCPL9C0qRADWLJi54MchT61HlLr5d4XvizswEcPWJtQYjZRiPVn8BoevltvJLEKhqpU748OOZiGTQ1A5o31xN+IpRLRrK97YGVGWZjMczLciUuqpRPT50t5JHbbBqf10tuUgvLONu03FEbbaLFRDdEYzLLY9gttNM2tr8KM+LFCYiV7+AN//sQQuo3l1qwf9owPLpeZtpShi7KvdgEw2U0gwTOlG7DtGBIqffewvrHj19oRmEZCnzEJApMQh6xPYt/7oCJ5S+7uucKV9jy5udQ9S4qYPpr6vPmlX9PpH0MvAxDMYUAZia7hJox6pYx/EWsGrL/gnvDvW+AcuixJ+3hxotwrk/dDiOhai+LFQbWPZzQAliqnWbB/y6so4iN5aLw00fK9r6rbQ4u8qN2HL/big5wVuco8xL2iaUreO6ajPwGl2Jz/jcX8ShSNXZfRWe78icba9qvqYbq1EnuXMPYtQ+4bu2N4GdtZGlIuoeV/L+DFUZXgfKQZrA6ALDDPt5grbFjO11Y5VlhRDdnP6YkbQd4iIVd6j0qg7FEy9/qIAWf6nYpF+fsmoyGwkpCDV09r8sCcUTfd/PdwbLawzL2Y997dbTeN9Kyy4j48PaaaamjUI6naP5iyw6PeYepxN1GmbDE3RAhsvyCnfI1/eEycAv9CAlDU8wyzWJfZFy5wBYZZ0J4fvYUPKUK6XiohfFyTdyB/MMmGLhuKuc0AUYdXeoCg9uER0tV32vDnsjrYpm+CJoIh7ey263evCcnqHdlclCQNM82oKTWdTSSvNEPerkFUmKbdcKlQt2P5wp/HVCSyYgz6gSwwRDL35ILFwy20/fq2gLPyBq4lHdUjHT/WWBBw8Fq6db7HVTyHrypmBfqPN90Z3tYEeX+fjkf2U/Ow9ye4LAYIU4tZMbb6vWwTyl64D3koUUh4sNNoZad3d8Yqb7eKYJ4jfNJbq7pJeFFJr0p36+EzuUx2YQ78PTOUx3tkOVZpakzul702xW3ZX0EnpzlbQTEi+OhsKJN7sF4C8zSkksBBhOtvLPwteSZtqkisHIQYMbZ/DcdcQl3kHN6U/b43djRuH8mWiuY3Mgnp10wy6mD8YDaAVgT/picNz1aEn/uTsQHQ+OxuoU/+nu54UBXq4LxPKCxTXS9CHq4UtHGMAgfQOUXc6tUCzKreP+XID07fTAhKIr9in7z7OylnJQ7m1c2faF5hbKtltfSOjPhuLmG5v69WssE7dWIA2rakKOiV7VTgb6f5jIsKPpqBFS8CXDi526Q0DZDczRNMa28/NN4wPFvtYeUSq92i61YQdXnivR6wC8/VBXbKg/DSMCTtKejlYMSj4O9sAKPRAJfU6K2gpsAHYkCPRVKc6hdCMEuhoglrjsq0U5d9PyI3eiQeYllo11dK0cvldp7tNOTyD6mJ+4iZBUitqv1v04EGVEl6/opsnhN09KC3iuTOy90ihsPPX9aUY+i2QepfEyHV0dG0WL33PfRPCF4h6Aq5D3YyIOpA8mZFXbxVCAoDvNK9/ZtRnNhrcA5D2W74HZpa0GUHYlYeLKhhvrqjikmf4PedPSXvQv3UvwBPpbUchUWdJs9cIiXb3XzvxZxRxVDLMRqWttvvdd4Ip86z5zPSkS1T4MSNEil8aUat+9koIpZIuPsuBE7VSc8BedWeNEbtsBNH5MgBjrHgkPSOwe9D+M5X6xEdcgFRUI2uEup/jixuvzX4PnRWfcHLZWGW8t+IEgAT35N6iA7JPV+54R3PMyZbk6XxWQtBFy851cXfeTWQCZAmh5pJgQUHmvJlEIRVScsRTfemHz4CvBgv3VZOUuOcvuTtWG/YKnJdOFR7ikwNm+Z/81hYZNaKUSqGL0uyPc4d2KICZ4DXI6Ad+hf5jRtpJbjHR80yj0T8ELsnuHYVCXOTtipTKRPOxcH/c+706EW9KrOjIc64gKT32FLDyf4GAE="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":751,"cache_read_input_tokens":66457,"cache_creation":{"ephemeral_5m_input_tokens":751,"ephemeral_1h_input_tokens":0},"output_tokens":7,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"ff94b194-de95-4207-bf9b-2ac838d29630"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdkFiR4mbUJF64LBSBQ","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAIS5gMKqAEIERgCKkB1fX44dlEGy4IZboNrbt5RV83eBEMw/Lz/bUZinrq7WPgdIcgQMuvwYF1vRSXB7zQoXpQyAYzX0xbAj5MViwKZMg5jbGF1ZGUtZmFibGUtNTgBQgluYXJyYXRpb25aJDZmY2M4ZjgzLTFmOWMtNGQzMy1iYTA3LTRkNGRmMzdkNjdmNXIQi06A1NuRRJo41amXnK2lOYgBAagB/5m81AawAQISDF06MPkLaMKATx0soxoM9t+p638eiufxxEb5IjDSOiUDNkG2VroiJhrRv/5T/WeYhH1In4sSuGP6JoK2hcnFG0mvF643o8brzvDWn0Aq6gGkUHJEUyf1xVa2Wiu2/ztRc2Pm0G5V7/Gj0ERDXPkO3YhVDoUBWu2M0c8BlRG8rK0gBn2X5U2lcA2nWcWBA+pHsLvHODdNmIYCVUizbczNB24jNzBrx+UeabYwRtEuyXGNJyvIR41FyHveLt+tHWxf2EbFKWo6ArbJaGl7EN6zOoxDzvI6QsWgtbpmbEALH1TOBmAXe5LNLfzIxt7BWjggCvOUHztJGYPrXtMUvWgG1/7mkFDgKTDjPQfqKJJDs779QdaS+Oxutn/qBzU/6e1tKMs9BJJMu6A2vleiUVyPS3Q8gq646Bxa/aQYAQ=="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":751,"cache_read_input_tokens":66457,"cache_creation":{"ephemeral_5m_input_tokens":751,"ephemeral_1h_input_tokens":0},"output_tokens":7,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"fb65e012-ca8b-4639-86fb-c4a1059273fe"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdkFiR4mbUJF64LBSBQ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01XsvXmn7jbmN5aReouBMhPV","name":"ToolSearch","input":{"query":"select:TodoWrite","max_results":1},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":751,"cache_read_input_tokens":66457,"cache_creation":{"ephemeral_5m_input_tokens":751,"ephemeral_1h_input_tokens":0},"output_tokens":7,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"e9f24fbc-2063-4d1e-8ed1-d3a6d17e5648"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"type":"tool_result","tool_use_id":"toolu_01XsvXmn7jbmN5aReouBMhPV","content":[{"type":"tool_reference","tool_name":"TodoWrite"}]}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"0f1ef643-3332-41f6-a09f-40bd862c0f83","timestamp":"2026-08-26T15:57:51.696Z","tool_use_result":{"matches":["TodoWrite"],"query":"select:TodoWrite","total_deferred_tools":17}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"0786d090-db70-4f51-a8b8-f1bc139f8253","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdogcCvtT8tQHKFFN5R","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01WCN6XAfqa6MknysNeFAioM","name":"TodoWrite","input":{"todos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"in_progress","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"pending","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"pending","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"pending","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"pending","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}]},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":74491,"cache_read_input_tokens":0,"cache_creation":{"ephemeral_5m_input_tokens":74491,"ephemeral_1h_input_tokens":0},"output_tokens":25,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"45d760cc-8fe8-4d31-b02f-dca6f2b318ea"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01WCN6XAfqa6MknysNeFAioM","type":"tool_result","content":"Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"b3fc1ecf-9f14-4c75-aad0-6aeaa705d59c","timestamp":"2026-08-26T15:57:59.505Z","tool_use_result":{"oldTodos":[],"newTodos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"in_progress","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"pending","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"pending","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"pending","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"pending","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}],"verificationNudgeNeeded":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"ed6bb2f1-fff7-43bb-ac10-9ba7dfc1fd38","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdpF9YTxMfh7xdHgFNp","type":"message","role":"assistant","content":[{"type":"text","text":"Étape 1 : le schéma DB dans `src/lib/db.ts`."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":553,"cache_read_input_tokens":74491,"cache_creation":{"ephemeral_5m_input_tokens":553,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"8d7a8f03-e654-45ed-851a-9fc09dff8cfd"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdpF9YTxMfh7xdHgFNp","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_011yjzTGisBDj37R47gdKjur","name":"Edit","input":{"replace_all":false,"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts","old_string":" db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n );\n return db;\n}","new_string":" db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n );\n // Vérification de courriel (2026-08-26) — les comptes mot de passe doivent\n // prouver leur adresse (lien Resend). Les comptes antérieurs à la migration\n // sont réputés vérifiés pour ne bloquer personne.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0\");\n db.exec(\"UPDATE users SET email_verified = 1\");\n } catch {\n /* colonne déjà présente */\n }\n // Jetons éphémères d'auth par courriel : lien de vérification, lien magique\n // (connexion sans mot de passe) et code 2FA du login mot de passe.\n // On ne stocke JAMAIS le jeton en clair — uniquement son SHA-256.\n db.exec(`\n CREATE TABLE IF NOT EXISTS auth_tokens (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT NOT NULL,\n user_id INTEGER,\n purpose TEXT NOT NULL,\n token_hash TEXT NOT NULL,\n payload TEXT,\n attempts INTEGER NOT NULL DEFAULT 0,\n expires_at TEXT NOT NULL,\n used_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS auth_tokens_hash ON auth_tokens(token_hash);\n CREATE INDEX IF NOT EXISTS auth_tokens_email ON auth_tokens(email, purpose);\n `);\n return db;\n}"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":553,"cache_read_input_tokens":74491,"cache_creation":{"ephemeral_5m_input_tokens":553,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"b9515e18-0c41-472d-aadd-c316ac47c1af"}} {"type":"permission_auto","tool":"Edit","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts","old_string":" db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n );\n return db;\n}","new_string":" db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n );\n // Vérification de courriel (2026-08-26) — les comptes mot de passe doivent\n // prouver leur adresse (lien Resend). Les comptes antérieurs à la migration\n // sont réputés vérifiés pour ne bloquer personne.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0\");\n db.exec(\"UPDATE users SET email_verified = 1\");\n } catch {\n /* colonne déjà présente */\n }\n // Jetons éphémères d'auth par courriel : lien de vérification, lien magique\n // (connexion sans mot de passe) et code 2FA du login mot de passe.\n // On ne stocke JAMAIS le jeton en clair — uniquement son SHA-256.\n db.exec(`\n CREATE TABLE IF NOT EXISTS auth_tokens (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT NOT NULL,\n user_id INTEGER,\n purpose TEXT NOT NULL,\n token_hash TEXT NOT NULL,\n payload TEXT,\n attempts INTEGER NOT NULL DEFAULT 0,\n expires_at TEXT NOT NULL,\n used_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS auth_tokens_hash ON auth_tokens(token_hash);\n CREATE INDEX IF NOT EXISTS auth_tokens_email ON auth_tokens(email, purpose);\n `);\n return db;\n}","replace_all":false}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_011yjzTGisBDj37R47gdKjur","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"e14fa90f-3d13-483c-a361-2bfc99dce1ee","timestamp":"2026-08-26T15:58:09.916Z","tool_use_result":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts","oldString":" db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n );\n return db;\n}","newString":" db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n );\n // Vérification de courriel (2026-08-26) — les comptes mot de passe doivent\n // prouver leur adresse (lien Resend). Les comptes antérieurs à la migration\n // sont réputés vérifiés pour ne bloquer personne.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0\");\n db.exec(\"UPDATE users SET email_verified = 1\");\n } catch {\n /* colonne déjà présente */\n }\n // Jetons éphémères d'auth par courriel : lien de vérification, lien magique\n // (connexion sans mot de passe) et code 2FA du login mot de passe.\n // On ne stocke JAMAIS le jeton en clair — uniquement son SHA-256.\n db.exec(`\n CREATE TABLE IF NOT EXISTS auth_tokens (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT NOT NULL,\n user_id INTEGER,\n purpose TEXT NOT NULL,\n token_hash TEXT NOT NULL,\n payload TEXT,\n attempts INTEGER NOT NULL DEFAULT 0,\n expires_at TEXT NOT NULL,\n used_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS auth_tokens_hash ON auth_tokens(token_hash);\n CREATE INDEX IF NOT EXISTS auth_tokens_email ON auth_tokens(email, purpose);\n `);\n return db;\n}","originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// KA ID — base d'utilisateurs partagée du groupe (SQLite WAL).\nimport Database from \"better-sqlite3\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport crypto from \"crypto\";\n\nfunction open() {\n const dbPath =\n process.env.KA_DB_PATH ?? path.join(process.cwd(), \"data\", \"ka-id.db\");\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n const db = new Database(dbPath);\n db.pragma(\"journal_mode = WAL\");\n db.exec(`\n CREATE TABLE IF NOT EXISTS users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n avatar_url TEXT,\n password_hash TEXT,\n google_sub TEXT UNIQUE,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n `);\n // KA ID — identifiant membre du groupe (« ka- » + 10 chiffres), créé ICI,\n // au hub : les plateformes (Lou·Ka…) le reçoivent via le jeton SSO.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN ka_id TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN last_login TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n // Sign in with Apple (2026-08-13) — même rôle que google_sub.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN apple_sub TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_apple_sub ON users(apple_sub)\",\n );\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN role TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n // Profil enrichi (2026-08-13) — saisi sur le hub, LA source de vérité\n // affichée par toutes les plateformes du groupe.\n for (const col of [\n \"bio TEXT\",\n \"city TEXT\",\n \"phone TEXT\",\n \"website TEXT\",\n \"job_title TEXT\",\n \"company TEXT\",\n \"birth_date TEXT\",\n \"socials TEXT\",\n \"public INTEGER DEFAULT 0\",\n ]) {\n try {\n db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n } catch {\n /* colonne déjà présente */\n }\n }\n db.exec(\"CREATE UNIQUE INDEX IF NOT EXISTS users_ka_id ON users(ka_id)\");\n // rattrapage : tout compte existant sans KA ID en reçoit un\n const missing = db\n .prepare(\"SELECT id FROM users WHERE ka_id IS NULL\")\n .all() as { id: number }[];\n for (const row of missing) assignKaId(db, row.id);\n // Favoris unifiés « Mon univers Ka » (2026-08-13) — le hub est LE magasin\n // central : les plateformes poussent/lisent via /api/sso/favorites.\n db.exec(`\n CREATE TABLE IF NOT EXISTS favorites (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n app TEXT NOT NULL,\n item_id TEXT NOT NULL,\n title TEXT NOT NULL,\n subtitle TEXT,\n price_label TEXT,\n image_url TEXT,\n url TEXT,\n meta TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n UNIQUE(user_id, app, item_id)\n );\n CREATE INDEX IF NOT EXISTS favorites_user ON favorites(user_id, app);\n `);\n // Jeton API personnel (2026-08-23) — requis pour consommer l'API produit\n // d'API·Ka (Authorization: Bearer kapi_…). Généré/affiché sur /compte,\n // vérifié par api-ka via /api/sso/token-verify (HMAC).\n for (const col of [\"api_token TEXT\", \"api_token_created TEXT\"]) {\n try {\n db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n } catch {\n /* colonne déjà présente */\n }\n }\n db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n );\n return db;\n}\n\nfunction randomKaId(): string {\n let digits = \"\";\n for (let i = 0; i < 10; i++)\n digits += Math.floor(Math.random() * 10).toString();\n return `ka-${digits}`;\n}\n\nfunction assignKaId(d: Database.Database, id: number): string {\n for (;;) {\n const kid = randomKaId();\n try {\n d.prepare(\"UPDATE users SET ka_id = ? WHERE id = ?\").run(kid, id);\n return kid;\n } catch {\n /* collision (1 chance sur 10 milliards) : on retente */\n }\n }\n}\n\n/** KA ID d'un compte — l'attribue s'il manque (source de vérité du groupe). */\nexport function ensureKaId(id: number): string {\n const row = db.prepare(\"SELECT ka_id FROM users WHERE id = ?\").get(id) as\n | { ka_id: string | null }\n | undefined;\n if (row?.ka_id) return row.ka_id;\n return assignKaId(db, id);\n}\n\n// Singleton (survit au rechargement à chaud en dev).\nconst g = globalThis as unknown as { __kaDb?: Database.Database };\nexport const db: Database.Database = g.__kaDb ?? (g.__kaDb = open());\n\nexport type UserRow = {\n id: number;\n email: string;\n name: string;\n avatar_url: string | null;\n password_hash: string | null;\n google_sub: string | null;\n apple_sub: string | null;\n ka_id: string | null;\n created_at: string;\n last_login: string | null;\n role: string | null;\n bio: string | null;\n city: string | null;\n phone: string | null;\n website: string | null;\n job_title: string | null;\n company: string | null;\n birth_date: string | null;\n socials: string | null; // JSON {instagram, facebook, x, linkedin, tiktok, youtube}\n public: number;\n api_token: string | null;\n api_token_created: string | null;\n};\n\n// ---------- jeton API personnel (API·Ka) ----------\n\nfunction randomApiToken(): string {\n return \"kapi_\" + crypto.randomBytes(24).toString(\"hex\");\n}\n\n/** Jeton API du compte — le crée s'il manque. */\nexport function ensureApiToken(id: number): { token: string; created: string } {\n const row = db\n .prepare(\"SELECT api_token, api_token_created FROM users WHERE id = ?\")\n .get(id) as { api_token: string | null; api_token_created: string | null } | undefined;\n if (row?.api_token)\n return { token: row.api_token, created: row.api_token_created ?? \"\" };\n return rotateApiToken(id);\n}\n\n/** Régénère le jeton API (l'ancien devient immédiatement invalide). */\nexport function rotateApiToken(id: number): { token: string; created: string } {\n for (;;) {\n const token = randomApiToken();\n try {\n db.prepare(\n \"UPDATE users SET api_token = ?, api_token_created = datetime('now') WHERE id = ?\",\n ).run(token, id);\n const created = (\n db\n .prepare(\"SELECT api_token_created AS c FROM users WHERE id = ?\")\n .get(id) as { c: string }\n ).c;\n return { token, created };\n } catch {\n /* collision improbable : on retente */\n }\n }\n}\n\nexport function findUserByApiToken(token: string): UserRow | undefined {\n if (!/^kapi_[0-9a-f]{48}$/.test(token)) return undefined;\n return db.prepare(\"SELECT * FROM users WHERE api_token = ?\").get(token) as\n | UserRow\n | undefined;\n}\n\nexport const SOCIAL_KEYS = [\n \"instagram\",\n \"facebook\",\n \"x\",\n \"linkedin\",\n \"tiktok\",\n \"youtube\",\n] as const;\n\nexport function parseSocials(raw: string | null): Record {\n try {\n const obj = JSON.parse(raw ?? \"{}\") as Record;\n const out: Record = {};\n for (const k of SOCIAL_KEYS)\n if (typeof obj[k] === \"string\" && obj[k]) out[k] = obj[k] as string;\n return out;\n } catch {\n return {};\n }\n}\n\nexport function ageFromBirthDate(birth: string | null): number | null {\n if (!birth || !/^\\d{4}-\\d{2}-\\d{2}$/.test(birth)) return null;\n const b = new Date(birth + \"T00:00:00Z\");\n if (Number.isNaN(b.getTime())) return null;\n const now = new Date();\n let age = now.getUTCFullYear() - b.getUTCFullYear();\n const m = now.getUTCMonth() - b.getUTCMonth();\n if (m < 0 || (m === 0 && now.getUTCDate() < b.getUTCDate())) age--;\n return age >= 0 && age < 130 ? age : null;\n}\n\n/** Horodate la connexion (appelé à chaque login/register/SSO). */\nexport function touchLastLogin(id: number): void {\n db.prepare(\n \"UPDATE users SET last_login = datetime('now') WHERE id = ?\",\n ).run(id);\n}\n\nexport function findUserByEmail(email: string): UserRow | undefined {\n return db\n .prepare(\"SELECT * FROM users WHERE email = ?\")\n .get(email.toLowerCase()) as UserRow | undefined;\n}\n\nexport function findUserById(id: number): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE id = ?\").get(id) as\n | UserRow\n | undefined;\n}\n\nexport function findUserByGoogleSub(sub: string): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE google_sub = ?\").get(sub) as\n | UserRow\n | undefined;\n}\n\nexport function findUserByAppleSub(sub: string): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE apple_sub = ?\").get(sub) as\n | UserRow\n | undefined;\n}\n\nexport function findUserByKaId(kaId: string): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE ka_id = ?\").get(kaId) as\n | UserRow\n | undefined;\n}\n\n/* ---------- Favoris unifiés ---------- */\n\nexport type FavoriteRow = {\n id: number;\n user_id: number;\n app: string;\n item_id: string;\n title: string;\n subtitle: string | null;\n price_label: string | null;\n image_url: string | null;\n url: string | null;\n meta: string | null;\n created_at: string;\n updated_at: string;\n};\n\nexport function upsertFavorite(\n userId: number,\n app: string,\n item: {\n item_id: string;\n title: string;\n subtitle?: string;\n price_label?: string;\n image_url?: string;\n url?: string;\n meta?: unknown;\n },\n): void {\n db.prepare(\n `INSERT INTO favorites (user_id, app, item_id, title, subtitle,\n price_label, image_url, url, meta)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(user_id, app, item_id) DO UPDATE SET\n title = excluded.title, subtitle = excluded.subtitle,\n price_label = excluded.price_label, image_url = excluded.image_url,\n url = excluded.url, meta = excluded.meta,\n updated_at = datetime('now')`,\n ).run(\n userId,\n app,\n item.item_id,\n item.title,\n item.subtitle ?? null,\n item.price_label ?? null,\n item.image_url ?? null,\n item.url ?? null,\n item.meta != null ? JSON.stringify(item.meta) : null,\n );\n}\n\nexport function removeFavorite(\n userId: number,\n app: string,\n itemId: string,\n): void {\n db.prepare(\n \"DELETE FROM favorites WHERE user_id = ? AND app = ? AND item_id = ?\",\n ).run(userId, app, itemId);\n}\n\nexport function favoritesOf(userId: number, app?: string): FavoriteRow[] {\n return (\n app\n ? db.prepare(\n \"SELECT * FROM favorites WHERE user_id = ? AND app = ? ORDER BY created_at DESC\",\n ).all(userId, app)\n : db.prepare(\n \"SELECT * FROM favorites WHERE user_id = ? ORDER BY created_at DESC\",\n ).all(userId)\n ) as FavoriteRow[];\n}\n","structuredPatch":[{"oldStart":106,"oldLines":6,"newStart":106,"newLines":34,"lines":[" db.exec("," \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\","," );","+ // Vérification de courriel (2026-08-26) — les comptes mot de passe doivent","+ // prouver leur adresse (lien Resend). Les comptes antérieurs à la migration","+ // sont réputés vérifiés pour ne bloquer personne.","+ try {","+ db.exec(\"ALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0\");","+ db.exec(\"UPDATE users SET email_verified = 1\");","+ } catch {","+ /* colonne déjà présente */","+ }","+ // Jetons éphémères d'auth par courriel : lien de vérification, lien magique","+ // (connexion sans mot de passe) et code 2FA du login mot de passe.","+ // On ne stocke JAMAIS le jeton en clair — uniquement son SHA-256.","+ db.exec(`","+ CREATE TABLE IF NOT EXISTS auth_tokens (","+ id INTEGER PRIMARY KEY AUTOINCREMENT,","+ email TEXT NOT NULL,","+ user_id INTEGER,","+ purpose TEXT NOT NULL,","+ token_hash TEXT NOT NULL,","+ payload TEXT,","+ attempts INTEGER NOT NULL DEFAULT 0,","+ expires_at TEXT NOT NULL,","+ used_at TEXT,","+ created_at TEXT NOT NULL DEFAULT (datetime('now'))","+ );","+ CREATE INDEX IF NOT EXISTS auth_tokens_hash ON auth_tokens(token_hash);","+ CREATE INDEX IF NOT EXISTS auth_tokens_email ON auth_tokens(email, purpose);","+ `);"," return db;"," }"," "]}],"userModified":false,"replaceAll":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"c80bf090-86c0-40fd-aa53-f7286aacfcbb","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdq1akLyLpWLnNcbPfD","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01QKAYrHFyz3BCCbuBgTHem3","name":"Edit","input":{"replace_all":false,"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts","old_string":" api_token: string | null;\n api_token_created: string | null;\n};","new_string":" api_token: string | null;\n api_token_created: string | null;\n email_verified: number;\n};\n\n/* ---------- jetons d'auth par courriel (Resend) ---------- */\n\nexport type AuthTokenPurpose = \"verify-email\" | \"magic-link\" | \"login-code\";\n\nexport type AuthTokenRow = {\n id: number;\n email: string;\n user_id: number | null;\n purpose: AuthTokenPurpose;\n token_hash: string;\n payload: string | null;\n attempts: number;\n expires_at: string;\n used_at: string | null;\n created_at: string;\n};\n\nfunction hashToken(raw: string): string {\n return crypto.createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n\n/** Crée un jeton (invalide les précédents du même usage pour ce courriel). */\nexport function createAuthToken(opts: {\n email: string;\n userId?: number;\n purpose: AuthTokenPurpose;\n raw: string;\n ttlMinutes: number;\n payload?: unknown;\n}): void {\n db.prepare(\n \"UPDATE auth_tokens SET used_at = datetime('now') WHERE email = ? AND purpose = ? AND used_at IS NULL\",\n ).run(opts.email, opts.purpose);\n db.prepare(\n \"DELETE FROM auth_tokens WHERE expires_at < datetime('now', '-1 day')\",\n ).run();\n db.prepare(\n `INSERT INTO auth_tokens (email, user_id, purpose, token_hash, payload, expires_at)\n VALUES (?, ?, ?, ?, ?, datetime('now', ?))`,\n ).run(\n opts.email,\n opts.userId ?? null,\n opts.purpose,\n hashToken(opts.raw),\n opts.payload != null ? JSON.stringify(opts.payload) : null,\n `+${Math.max(1, Math.floor(opts.ttlMinutes))} minutes`,\n );\n}\n\n/** Consomme un jeton de lien (vérification / magique) — usage unique. */\nexport function consumeAuthToken(\n raw: string,\n purpose: AuthTokenPurpose,\n): AuthTokenRow | undefined {\n const row = db\n .prepare(\n `SELECT * FROM auth_tokens\n WHERE token_hash = ? AND purpose = ? AND used_at IS NULL\n AND expires_at > datetime('now')`,\n )\n .get(hashToken(raw), purpose) as AuthTokenRow | undefined;\n if (!row) return undefined;\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(\n row.id,\n );\n return row;\n}\n\n/** Valide le code 2FA du login mot de passe (max 5 essais, usage unique). */\nexport function consumeLoginCode(\n email: string,\n code: string,\n): { ok: boolean; reason?: \"expire\" | \"tentatives\" | \"invalide\"; userId?: number } {\n const row = db\n .prepare(\n `SELECT * FROM auth_tokens\n WHERE email = ? AND purpose = 'login-code' AND used_at IS NULL\n ORDER BY id DESC LIMIT 1`,\n )\n .get(email) as AuthTokenRow | undefined;\n if (!row) return { ok: false, reason: \"expire\" };\n const alive = db\n .prepare(\"SELECT expires_at > datetime('now') AS alive FROM auth_tokens WHERE id = ?\")\n .get(row.id) as { alive: number };\n if (!alive.alive) {\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);\n return { ok: false, reason: \"expire\" };\n }\n if (row.attempts >= 5) {\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);\n return { ok: false, reason: \"tentatives\" };\n }\n db.prepare(\"UPDATE auth_tokens SET attempts = attempts + 1 WHERE id = ?\").run(row.id);\n const given = Buffer.from(hashToken(code), \"hex\");\n const stored = Buffer.from(row.token_hash, \"hex\");\n if (given.length !== stored.length || !crypto.timingSafeEqual(given, stored))\n return { ok: false, reason: \"invalide\" };\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);\n return { ok: true, userId: row.user_id ?? undefined };\n}\n\n/** Marque l'adresse courriel comme vérifiée (lien cliqué, ou OAuth vérifié). */\nexport function markEmailVerified(id: number): void {\n db.prepare(\"UPDATE users SET email_verified = 1 WHERE id = ?\").run(id);\n}"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":916,"cache_read_input_tokens":75044,"cache_creation":{"ephemeral_5m_input_tokens":916,"ephemeral_1h_input_tokens":0},"output_tokens":20,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1ea15b10-9c0f-49bd-a443-f975f656424e"}} {"type":"permission_auto","tool":"Edit","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts","old_string":" api_token: string | null;\n api_token_created: string | null;\n};","new_string":" api_token: string | null;\n api_token_created: string | null;\n email_verified: number;\n};\n\n/* ---------- jetons d'auth par courriel (Resend) ---------- */\n\nexport type AuthTokenPurpose = \"verify-email\" | \"magic-link\" | \"login-code\";\n\nexport type AuthTokenRow = {\n id: number;\n email: string;\n user_id: number | null;\n purpose: AuthTokenPurpose;\n token_hash: string;\n payload: string | null;\n attempts: number;\n expires_at: string;\n used_at: string | null;\n created_at: string;\n};\n\nfunction hashToken(raw: string): string {\n return crypto.createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n\n/** Crée un jeton (invalide les précédents du même usage pour ce courriel). */\nexport function createAuthToken(opts: {\n email: string;\n userId?: number;\n purpose: AuthTokenPurpose;\n raw: string;\n ttlMinutes: number;\n payload?: unknown;\n}): void {\n db.prepare(\n \"UPDATE auth_tokens SET used_at = datetime('now') WHERE email = ? AND purpose = ? AND used_at IS NULL\",\n ).run(opts.email, opts.purpose);\n db.prepare(\n \"DELETE FROM auth_tokens WHERE expires_at < datetime('now', '-1 day')\",\n ).run();\n db.prepare(\n `INSERT INTO auth_tokens (email, user_id, purpose, token_hash, payload, expires_at)\n VALUES (?, ?, ?, ?, ?, datetime('now', ?))`,\n ).run(\n opts.email,\n opts.userId ?? null,\n opts.purpose,\n hashToken(opts.raw),\n opts.payload != null ? JSON.stringify(opts.payload) : null,\n `+${Math.max(1, Math.floor(opts.ttlMinutes))} minutes`,\n );\n}\n\n/** Consomme un jeton de lien (vérification / magique) — usage unique. */\nexport function consumeAuthToken(\n raw: string,\n purpose: AuthTokenPurpose,\n): AuthTokenRow | undefined {\n const row = db\n .prepare(\n `SELECT * FROM auth_tokens\n WHERE token_hash = ? AND purpose = ? AND used_at IS NULL\n AND expires_at > datetime('now')`,\n )\n .get(hashToken(raw), purpose) as AuthTokenRow | undefined;\n if (!row) return undefined;\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(\n row.id,\n );\n return row;\n}\n\n/** Valide le code 2FA du login mot de passe (max 5 essais, usage unique). */\nexport function consumeLoginCode(\n email: string,\n code: string,\n): { ok: boolean; reason?: \"expire\" | \"tentatives\" | \"invalide\"; userId?: number } {\n const row = db\n .prepare(\n `SELECT * FROM auth_tokens\n WHERE email = ? AND purpose = 'login-code' AND used_at IS NULL\n ORDER BY id DESC LIMIT 1`,\n )\n .get(email) as AuthTokenRow | undefined;\n if (!row) return { ok: false, reason: \"expire\" };\n const alive = db\n .prepare(\"SELECT expires_at > datetime('now') AS alive FROM auth_tokens WHERE id = ?\")\n .get(row.id) as { alive: number };\n if (!alive.alive) {\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);\n return { ok: false, reason: \"expire\" };\n }\n if (row.attempts >= 5) {\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);\n return { ok: false, reason: \"tentatives\" };\n }\n db.prepare(\"UPDATE auth_tokens SET attempts = attempts + 1 WHERE id = ?\").run(row.id);\n const given = Buffer.from(hashToken(code), \"hex\");\n const stored = Buffer.from(row.token_hash, \"hex\");\n if (given.length !== stored.length || !crypto.timingSafeEqual(given, stored))\n return { ok: false, reason: \"invalide\" };\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);\n return { ok: true, userId: row.user_id ?? undefined };\n}\n\n/** Marque l'adresse courriel comme vérifiée (lien cliqué, ou OAuth vérifié). */\nexport function markEmailVerified(id: number): void {\n db.prepare(\"UPDATE users SET email_verified = 1 WHERE id = ?\").run(id);\n}","replace_all":false}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01QKAYrHFyz3BCCbuBgTHem3","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"3ac1512f-e846-4999-8e8e-f61a724f7e46","timestamp":"2026-08-26T15:58:27.836Z","tool_use_result":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/db.ts","oldString":" api_token: string | null;\n api_token_created: string | null;\n};","newString":" api_token: string | null;\n api_token_created: string | null;\n email_verified: number;\n};\n\n/* ---------- jetons d'auth par courriel (Resend) ---------- */\n\nexport type AuthTokenPurpose = \"verify-email\" | \"magic-link\" | \"login-code\";\n\nexport type AuthTokenRow = {\n id: number;\n email: string;\n user_id: number | null;\n purpose: AuthTokenPurpose;\n token_hash: string;\n payload: string | null;\n attempts: number;\n expires_at: string;\n used_at: string | null;\n created_at: string;\n};\n\nfunction hashToken(raw: string): string {\n return crypto.createHash(\"sha256\").update(raw).digest(\"hex\");\n}\n\n/** Crée un jeton (invalide les précédents du même usage pour ce courriel). */\nexport function createAuthToken(opts: {\n email: string;\n userId?: number;\n purpose: AuthTokenPurpose;\n raw: string;\n ttlMinutes: number;\n payload?: unknown;\n}): void {\n db.prepare(\n \"UPDATE auth_tokens SET used_at = datetime('now') WHERE email = ? AND purpose = ? AND used_at IS NULL\",\n ).run(opts.email, opts.purpose);\n db.prepare(\n \"DELETE FROM auth_tokens WHERE expires_at < datetime('now', '-1 day')\",\n ).run();\n db.prepare(\n `INSERT INTO auth_tokens (email, user_id, purpose, token_hash, payload, expires_at)\n VALUES (?, ?, ?, ?, ?, datetime('now', ?))`,\n ).run(\n opts.email,\n opts.userId ?? null,\n opts.purpose,\n hashToken(opts.raw),\n opts.payload != null ? JSON.stringify(opts.payload) : null,\n `+${Math.max(1, Math.floor(opts.ttlMinutes))} minutes`,\n );\n}\n\n/** Consomme un jeton de lien (vérification / magique) — usage unique. */\nexport function consumeAuthToken(\n raw: string,\n purpose: AuthTokenPurpose,\n): AuthTokenRow | undefined {\n const row = db\n .prepare(\n `SELECT * FROM auth_tokens\n WHERE token_hash = ? AND purpose = ? AND used_at IS NULL\n AND expires_at > datetime('now')`,\n )\n .get(hashToken(raw), purpose) as AuthTokenRow | undefined;\n if (!row) return undefined;\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(\n row.id,\n );\n return row;\n}\n\n/** Valide le code 2FA du login mot de passe (max 5 essais, usage unique). */\nexport function consumeLoginCode(\n email: string,\n code: string,\n): { ok: boolean; reason?: \"expire\" | \"tentatives\" | \"invalide\"; userId?: number } {\n const row = db\n .prepare(\n `SELECT * FROM auth_tokens\n WHERE email = ? AND purpose = 'login-code' AND used_at IS NULL\n ORDER BY id DESC LIMIT 1`,\n )\n .get(email) as AuthTokenRow | undefined;\n if (!row) return { ok: false, reason: \"expire\" };\n const alive = db\n .prepare(\"SELECT expires_at > datetime('now') AS alive FROM auth_tokens WHERE id = ?\")\n .get(row.id) as { alive: number };\n if (!alive.alive) {\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);\n return { ok: false, reason: \"expire\" };\n }\n if (row.attempts >= 5) {\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);\n return { ok: false, reason: \"tentatives\" };\n }\n db.prepare(\"UPDATE auth_tokens SET attempts = attempts + 1 WHERE id = ?\").run(row.id);\n const given = Buffer.from(hashToken(code), \"hex\");\n const stored = Buffer.from(row.token_hash, \"hex\");\n if (given.length !== stored.length || !crypto.timingSafeEqual(given, stored))\n return { ok: false, reason: \"invalide\" };\n db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);\n return { ok: true, userId: row.user_id ?? undefined };\n}\n\n/** Marque l'adresse courriel comme vérifiée (lien cliqué, ou OAuth vérifié). */\nexport function markEmailVerified(id: number): void {\n db.prepare(\"UPDATE users SET email_verified = 1 WHERE id = ?\").run(id);\n}","originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// KA ID — base d'utilisateurs partagée du groupe (SQLite WAL).\nimport Database from \"better-sqlite3\";\nimport path from \"path\";\nimport fs from \"fs\";\nimport crypto from \"crypto\";\n\nfunction open() {\n const dbPath =\n process.env.KA_DB_PATH ?? path.join(process.cwd(), \"data\", \"ka-id.db\");\n fs.mkdirSync(path.dirname(dbPath), { recursive: true });\n const db = new Database(dbPath);\n db.pragma(\"journal_mode = WAL\");\n db.exec(`\n CREATE TABLE IF NOT EXISTS users (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT UNIQUE NOT NULL,\n name TEXT NOT NULL,\n avatar_url TEXT,\n password_hash TEXT,\n google_sub TEXT UNIQUE,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n `);\n // KA ID — identifiant membre du groupe (« ka- » + 10 chiffres), créé ICI,\n // au hub : les plateformes (Lou·Ka…) le reçoivent via le jeton SSO.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN ka_id TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN last_login TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n // Sign in with Apple (2026-08-13) — même rôle que google_sub.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN apple_sub TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_apple_sub ON users(apple_sub)\",\n );\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN role TEXT\");\n } catch {\n /* colonne déjà présente */\n }\n // Profil enrichi (2026-08-13) — saisi sur le hub, LA source de vérité\n // affichée par toutes les plateformes du groupe.\n for (const col of [\n \"bio TEXT\",\n \"city TEXT\",\n \"phone TEXT\",\n \"website TEXT\",\n \"job_title TEXT\",\n \"company TEXT\",\n \"birth_date TEXT\",\n \"socials TEXT\",\n \"public INTEGER DEFAULT 0\",\n ]) {\n try {\n db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n } catch {\n /* colonne déjà présente */\n }\n }\n db.exec(\"CREATE UNIQUE INDEX IF NOT EXISTS users_ka_id ON users(ka_id)\");\n // rattrapage : tout compte existant sans KA ID en reçoit un\n const missing = db\n .prepare(\"SELECT id FROM users WHERE ka_id IS NULL\")\n .all() as { id: number }[];\n for (const row of missing) assignKaId(db, row.id);\n // Favoris unifiés « Mon univers Ka » (2026-08-13) — le hub est LE magasin\n // central : les plateformes poussent/lisent via /api/sso/favorites.\n db.exec(`\n CREATE TABLE IF NOT EXISTS favorites (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n user_id INTEGER NOT NULL,\n app TEXT NOT NULL,\n item_id TEXT NOT NULL,\n title TEXT NOT NULL,\n subtitle TEXT,\n price_label TEXT,\n image_url TEXT,\n url TEXT,\n meta TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now')),\n updated_at TEXT NOT NULL DEFAULT (datetime('now')),\n UNIQUE(user_id, app, item_id)\n );\n CREATE INDEX IF NOT EXISTS favorites_user ON favorites(user_id, app);\n `);\n // Jeton API personnel (2026-08-23) — requis pour consommer l'API produit\n // d'API·Ka (Authorization: Bearer kapi_…). Généré/affiché sur /compte,\n // vérifié par api-ka via /api/sso/token-verify (HMAC).\n for (const col of [\"api_token TEXT\", \"api_token_created TEXT\"]) {\n try {\n db.exec(`ALTER TABLE users ADD COLUMN ${col}`);\n } catch {\n /* colonne déjà présente */\n }\n }\n db.exec(\n \"CREATE UNIQUE INDEX IF NOT EXISTS users_api_token ON users(api_token)\",\n );\n // Vérification de courriel (2026-08-26) — les comptes mot de passe doivent\n // prouver leur adresse (lien Resend). Les comptes antérieurs à la migration\n // sont réputés vérifiés pour ne bloquer personne.\n try {\n db.exec(\"ALTER TABLE users ADD COLUMN email_verified INTEGER DEFAULT 0\");\n db.exec(\"UPDATE users SET email_verified = 1\");\n } catch {\n /* colonne déjà présente */\n }\n // Jetons éphémères d'auth par courriel : lien de vérification, lien magique\n // (connexion sans mot de passe) et code 2FA du login mot de passe.\n // On ne stocke JAMAIS le jeton en clair — uniquement son SHA-256.\n db.exec(`\n CREATE TABLE IF NOT EXISTS auth_tokens (\n id INTEGER PRIMARY KEY AUTOINCREMENT,\n email TEXT NOT NULL,\n user_id INTEGER,\n purpose TEXT NOT NULL,\n token_hash TEXT NOT NULL,\n payload TEXT,\n attempts INTEGER NOT NULL DEFAULT 0,\n expires_at TEXT NOT NULL,\n used_at TEXT,\n created_at TEXT NOT NULL DEFAULT (datetime('now'))\n );\n CREATE INDEX IF NOT EXISTS auth_tokens_hash ON auth_tokens(token_hash);\n CREATE INDEX IF NOT EXISTS auth_tokens_email ON auth_tokens(email, purpose);\n `);\n return db;\n}\n\nfunction randomKaId(): string {\n let digits = \"\";\n for (let i = 0; i < 10; i++)\n digits += Math.floor(Math.random() * 10).toString();\n return `ka-${digits}`;\n}\n\nfunction assignKaId(d: Database.Database, id: number): string {\n for (;;) {\n const kid = randomKaId();\n try {\n d.prepare(\"UPDATE users SET ka_id = ? WHERE id = ?\").run(kid, id);\n return kid;\n } catch {\n /* collision (1 chance sur 10 milliards) : on retente */\n }\n }\n}\n\n/** KA ID d'un compte — l'attribue s'il manque (source de vérité du groupe). */\nexport function ensureKaId(id: number): string {\n const row = db.prepare(\"SELECT ka_id FROM users WHERE id = ?\").get(id) as\n | { ka_id: string | null }\n | undefined;\n if (row?.ka_id) return row.ka_id;\n return assignKaId(db, id);\n}\n\n// Singleton (survit au rechargement à chaud en dev).\nconst g = globalThis as unknown as { __kaDb?: Database.Database };\nexport const db: Database.Database = g.__kaDb ?? (g.__kaDb = open());\n\nexport type UserRow = {\n id: number;\n email: string;\n name: string;\n avatar_url: string | null;\n password_hash: string | null;\n google_sub: string | null;\n apple_sub: string | null;\n ka_id: string | null;\n created_at: string;\n last_login: string | null;\n role: string | null;\n bio: string | null;\n city: string | null;\n phone: string | null;\n website: string | null;\n job_title: string | null;\n company: string | null;\n birth_date: string | null;\n socials: string | null; // JSON {instagram, facebook, x, linkedin, tiktok, youtube}\n public: number;\n api_token: string | null;\n api_token_created: string | null;\n};\n\n// ---------- jeton API personnel (API·Ka) ----------\n\nfunction randomApiToken(): string {\n return \"kapi_\" + crypto.randomBytes(24).toString(\"hex\");\n}\n\n/** Jeton API du compte — le crée s'il manque. */\nexport function ensureApiToken(id: number): { token: string; created: string } {\n const row = db\n .prepare(\"SELECT api_token, api_token_created FROM users WHERE id = ?\")\n .get(id) as { api_token: string | null; api_token_created: string | null } | undefined;\n if (row?.api_token)\n return { token: row.api_token, created: row.api_token_created ?? \"\" };\n return rotateApiToken(id);\n}\n\n/** Régénère le jeton API (l'ancien devient immédiatement invalide). */\nexport function rotateApiToken(id: number): { token: string; created: string } {\n for (;;) {\n const token = randomApiToken();\n try {\n db.prepare(\n \"UPDATE users SET api_token = ?, api_token_created = datetime('now') WHERE id = ?\",\n ).run(token, id);\n const created = (\n db\n .prepare(\"SELECT api_token_created AS c FROM users WHERE id = ?\")\n .get(id) as { c: string }\n ).c;\n return { token, created };\n } catch {\n /* collision improbable : on retente */\n }\n }\n}\n\nexport function findUserByApiToken(token: string): UserRow | undefined {\n if (!/^kapi_[0-9a-f]{48}$/.test(token)) return undefined;\n return db.prepare(\"SELECT * FROM users WHERE api_token = ?\").get(token) as\n | UserRow\n | undefined;\n}\n\nexport const SOCIAL_KEYS = [\n \"instagram\",\n \"facebook\",\n \"x\",\n \"linkedin\",\n \"tiktok\",\n \"youtube\",\n] as const;\n\nexport function parseSocials(raw: string | null): Record {\n try {\n const obj = JSON.parse(raw ?? \"{}\") as Record;\n const out: Record = {};\n for (const k of SOCIAL_KEYS)\n if (typeof obj[k] === \"string\" && obj[k]) out[k] = obj[k] as string;\n return out;\n } catch {\n return {};\n }\n}\n\nexport function ageFromBirthDate(birth: string | null): number | null {\n if (!birth || !/^\\d{4}-\\d{2}-\\d{2}$/.test(birth)) return null;\n const b = new Date(birth + \"T00:00:00Z\");\n if (Number.isNaN(b.getTime())) return null;\n const now = new Date();\n let age = now.getUTCFullYear() - b.getUTCFullYear();\n const m = now.getUTCMonth() - b.getUTCMonth();\n if (m < 0 || (m === 0 && now.getUTCDate() < b.getUTCDate())) age--;\n return age >= 0 && age < 130 ? age : null;\n}\n\n/** Horodate la connexion (appelé à chaque login/register/SSO). */\nexport function touchLastLogin(id: number): void {\n db.prepare(\n \"UPDATE users SET last_login = datetime('now') WHERE id = ?\",\n ).run(id);\n}\n\nexport function findUserByEmail(email: string): UserRow | undefined {\n return db\n .prepare(\"SELECT * FROM users WHERE email = ?\")\n .get(email.toLowerCase()) as UserRow | undefined;\n}\n\nexport function findUserById(id: number): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE id = ?\").get(id) as\n | UserRow\n | undefined;\n}\n\nexport function findUserByGoogleSub(sub: string): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE google_sub = ?\").get(sub) as\n | UserRow\n | undefined;\n}\n\nexport function findUserByAppleSub(sub: string): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE apple_sub = ?\").get(sub) as\n | UserRow\n | undefined;\n}\n\nexport function findUserByKaId(kaId: string): UserRow | undefined {\n return db.prepare(\"SELECT * FROM users WHERE ka_id = ?\").get(kaId) as\n | UserRow\n | undefined;\n}\n\n/* ---------- Favoris unifiés ---------- */\n\nexport type FavoriteRow = {\n id: number;\n user_id: number;\n app: string;\n item_id: string;\n title: string;\n subtitle: string | null;\n price_label: string | null;\n image_url: string | null;\n url: string | null;\n meta: string | null;\n created_at: string;\n updated_at: string;\n};\n\nexport function upsertFavorite(\n userId: number,\n app: string,\n item: {\n item_id: string;\n title: string;\n subtitle?: string;\n price_label?: string;\n image_url?: string;\n url?: string;\n meta?: unknown;\n },\n): void {\n db.prepare(\n `INSERT INTO favorites (user_id, app, item_id, title, subtitle,\n price_label, image_url, url, meta)\n VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)\n ON CONFLICT(user_id, app, item_id) DO UPDATE SET\n title = excluded.title, subtitle = excluded.subtitle,\n price_label = excluded.price_label, image_url = excluded.image_url,\n url = excluded.url, meta = excluded.meta,\n updated_at = datetime('now')`,\n ).run(\n userId,\n app,\n item.item_id,\n item.title,\n item.subtitle ?? null,\n item.price_label ?? null,\n item.image_url ?? null,\n item.url ?? null,\n item.meta != null ? JSON.stringify(item.meta) : null,\n );\n}\n\nexport function removeFavorite(\n userId: number,\n app: string,\n itemId: string,\n): void {\n db.prepare(\n \"DELETE FROM favorites WHERE user_id = ? AND app = ? AND item_id = ?\",\n ).run(userId, app, itemId);\n}\n\nexport function favoritesOf(userId: number, app?: string): FavoriteRow[] {\n return (\n app\n ? db.prepare(\n \"SELECT * FROM favorites WHERE user_id = ? AND app = ? ORDER BY created_at DESC\",\n ).all(userId, app)\n : db.prepare(\n \"SELECT * FROM favorites WHERE user_id = ? ORDER BY created_at DESC\",\n ).all(userId)\n ) as FavoriteRow[];\n}\n","structuredPatch":[{"oldStart":192,"oldLines":8,"newStart":192,"newLines":115,"lines":[" public: number;"," api_token: string | null;"," api_token_created: string | null;","+ email_verified: number;"," };"," ","+/* ---------- jetons d'auth par courriel (Resend) ---------- */","+","+export type AuthTokenPurpose = \"verify-email\" | \"magic-link\" | \"login-code\";","+","+export type AuthTokenRow = {","+ id: number;","+ email: string;","+ user_id: number | null;","+ purpose: AuthTokenPurpose;","+ token_hash: string;","+ payload: string | null;","+ attempts: number;","+ expires_at: string;","+ used_at: string | null;","+ created_at: string;","+};","+","+function hashToken(raw: string): string {","+ return crypto.createHash(\"sha256\").update(raw).digest(\"hex\");","+}","+","+/** Crée un jeton (invalide les précédents du même usage pour ce courriel). */","+export function createAuthToken(opts: {","+ email: string;","+ userId?: number;","+ purpose: AuthTokenPurpose;","+ raw: string;","+ ttlMinutes: number;","+ payload?: unknown;","+}): void {","+ db.prepare(","+ \"UPDATE auth_tokens SET used_at = datetime('now') WHERE email = ? AND purpose = ? AND used_at IS NULL\",","+ ).run(opts.email, opts.purpose);","+ db.prepare(","+ \"DELETE FROM auth_tokens WHERE expires_at < datetime('now', '-1 day')\",","+ ).run();","+ db.prepare(","+ `INSERT INTO auth_tokens (email, user_id, purpose, token_hash, payload, expires_at)","+ VALUES (?, ?, ?, ?, ?, datetime('now', ?))`,","+ ).run(","+ opts.email,","+ opts.userId ?? null,","+ opts.purpose,","+ hashToken(opts.raw),","+ opts.payload != null ? JSON.stringify(opts.payload) : null,","+ `+${Math.max(1, Math.floor(opts.ttlMinutes))} minutes`,","+ );","+}","+","+/** Consomme un jeton de lien (vérification / magique) — usage unique. */","+export function consumeAuthToken(","+ raw: string,","+ purpose: AuthTokenPurpose,","+): AuthTokenRow | undefined {","+ const row = db","+ .prepare(","+ `SELECT * FROM auth_tokens","+ WHERE token_hash = ? AND purpose = ? AND used_at IS NULL","+ AND expires_at > datetime('now')`,","+ )","+ .get(hashToken(raw), purpose) as AuthTokenRow | undefined;","+ if (!row) return undefined;","+ db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(","+ row.id,","+ );","+ return row;","+}","+","+/** Valide le code 2FA du login mot de passe (max 5 essais, usage unique). */","+export function consumeLoginCode(","+ email: string,","+ code: string,","+): { ok: boolean; reason?: \"expire\" | \"tentatives\" | \"invalide\"; userId?: number } {","+ const row = db","+ .prepare(","+ `SELECT * FROM auth_tokens","+ WHERE email = ? AND purpose = 'login-code' AND used_at IS NULL","+ ORDER BY id DESC LIMIT 1`,","+ )","+ .get(email) as AuthTokenRow | undefined;","+ if (!row) return { ok: false, reason: \"expire\" };","+ const alive = db","+ .prepare(\"SELECT expires_at > datetime('now') AS alive FROM auth_tokens WHERE id = ?\")","+ .get(row.id) as { alive: number };","+ if (!alive.alive) {","+ db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);","+ return { ok: false, reason: \"expire\" };","+ }","+ if (row.attempts >= 5) {","+ db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);","+ return { ok: false, reason: \"tentatives\" };","+ }","+ db.prepare(\"UPDATE auth_tokens SET attempts = attempts + 1 WHERE id = ?\").run(row.id);","+ const given = Buffer.from(hashToken(code), \"hex\");","+ const stored = Buffer.from(row.token_hash, \"hex\");","+ if (given.length !== stored.length || !crypto.timingSafeEqual(given, stored))","+ return { ok: false, reason: \"invalide\" };","+ db.prepare(\"UPDATE auth_tokens SET used_at = datetime('now') WHERE id = ?\").run(row.id);","+ return { ok: true, userId: row.user_id ?? undefined };","+}","+","+/** Marque l'adresse courriel comme vérifiée (lien cliqué, ou OAuth vérifié). */","+export function markEmailVerified(id: number): void {","+ db.prepare(\"UPDATE users SET email_verified = 1 WHERE id = ?\").run(id);","+}","+"," // ---------- jeton API personnel (API·Ka) ----------"," "," function randomApiToken(): string {"]}],"userModified":false,"replaceAll":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"9b9df7c6-245d-4114-b61c-1bea4c0290be","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdrLBxmmbwWitLnGcNN","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAIS0QIKpwEIERgCKkAuEy+Ec2GdyNf1rdB3/vHr26g/TXNAjpajB6h5zF27Gry4tJ+P9nCH3tFQ66BA8DVmQy7hHGC1l32odb7O0nb9Mg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAGmmrzUBrABAhIMwfERLrT1MappgxawGgweySWdPTQm/TPV6dwiMHHoGtTlz46rlmkwSFO36YTyj00UG9h+Kfwv3fxRkRVKVAM7ixJLQQK3SNX2Q9k1qSpXWtHDww0gxCEkFvthA/612QdRE3SMQKlCiAA0E4mdBAYiQCozzLUtAFi/BXzZE8y+q2mQDHshwyaYXlG6qFHCY3z5943S+ojmcww2wPVcaXTZS0a9NC5eGAE="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1927,"cache_read_input_tokens":75960,"cache_creation":{"ephemeral_5m_input_tokens":1927,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"29c9437e-a917-45ac-9671-fe1000f564b2"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdrLBxmmbwWitLnGcNN","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01GzxJ2ztVcsMPcVfHai7XjC","name":"TodoWrite","input":{"todos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"completed","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"in_progress","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"pending","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"pending","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"pending","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}]},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1927,"cache_read_input_tokens":75960,"cache_creation":{"ephemeral_5m_input_tokens":1927,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"402b5cda-e227-401c-bcd8-2a0df5a1e52a"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01GzxJ2ztVcsMPcVfHai7XjC","type":"tool_result","content":"Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"db996fc7-9b96-493f-9276-985323aa466d","timestamp":"2026-08-26T15:58:35.361Z","tool_use_result":{"oldTodos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"in_progress","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"pending","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"pending","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"pending","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"pending","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}],"newTodos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"completed","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"in_progress","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"pending","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"pending","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"pending","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}],"verificationNudgeNeeded":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"56d8b9dd-be1e-408c-89c9-86c655834b15","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdru4961jBWADg5Sg3y","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01L4WTkgZ2nzcwbzbjT8e9U2","name":"Write","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/email.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// KA ID — courriels transactionnels via Resend (domaine groupe-ka.com).\n// API REST directe (fetch), zéro dépendance — même philosophie que scrypt.\n\nconst RESEND_ENDPOINT = \"https://api.resend.com/emails\";\n\nexport const MAIL_FROM =\n process.env.RESEND_FROM ?? \"KA ID — Groupe Ka \";\n\nexport async function sendEmail(opts: {\n to: string;\n subject: string;\n html: string;\n text: string;\n}): Promise {\n const key = process.env.RESEND_API_KEY;\n if (!key) throw new Error(\"RESEND_API_KEY manquant\");\n const res = await fetch(RESEND_ENDPOINT, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${key}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n from: MAIL_FROM,\n to: [opts.to],\n subject: opts.subject,\n html: opts.html,\n text: opts.text,\n }),\n });\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n throw new Error(`Resend ${res.status} : ${detail.slice(0, 300)}`);\n }\n}\n\n/* ---------- gabarits (encre sur papier, style Groupe Ka) ---------- */\n\nfunction layout(title: string, inner: string): string {\n return `\n\n
\n

\n Groupe Ka · KA ID\n

\n
\n

${title}

\n ${inner}\n
\n

\n Un seul compte — le KA ID — pour toutes les plateformes du Groupe Ka.
\n Si vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.\n

\n
\n`;\n}\n\nfunction button(url: string, label: string): string {\n return `

\n ${label}\n

\n

Ou copiez ce lien : ${url}

`;\n}\n\nexport function verificationEmail(name: string, url: string) {\n return {\n subject: \"Confirmez votre adresse — KA ID\",\n html: layout(\n \"Confirmez votre adresse courriel\",\n `

Bonjour ${name},
\n votre KA ID vient d'être créé. Il ne reste qu'à confirmer que cette\n adresse est bien la vôtre — le lien est valable 24 heures.

\n ${button(url, \"Confirmer mon adresse →\")}`,\n ),\n text: `Bonjour ${name},\\n\\nConfirmez votre adresse pour activer votre KA ID (lien valable 24 h) :\\n${url}\\n\\nSi vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.`,\n };\n}\n\nexport function magicLinkEmail(name: string, url: string) {\n return {\n subject: \"Votre lien de connexion — KA ID\",\n html: layout(\n \"Connexion sans mot de passe\",\n `

Bonjour ${name},
\n cliquez pour vous connecter à votre KA ID — aucun mot de passe requis.\n Le lien est valable 15 minutes et ne sert qu'une fois.

\n ${button(url, \"Me connecter →\")}`,\n ),\n text: `Bonjour ${name},\\n\\nVotre lien de connexion KA ID (valable 15 minutes, usage unique) :\\n${url}\\n\\nSi vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.`,\n };\n}\n\nexport function loginCodeEmail(name: string, code: string) {\n return {\n subject: `${code} — votre code de connexion KA ID`,\n html: layout(\n \"Votre code de connexion\",\n `

Bonjour ${name},
\n voici le code pour confirmer votre connexion. Il expire dans 10 minutes.

\n

${code}

`,\n ),\n text: `Bonjour ${name},\\n\\nVotre code de connexion KA ID (expire dans 10 minutes) : ${code}\\n\\nSi vous n'êtes pas à l'origine de cette connexion, changez votre mot de passe.`,\n };\n}\n"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":583,"cache_read_input_tokens":77887,"cache_creation":{"ephemeral_5m_input_tokens":583,"ephemeral_1h_input_tokens":0},"output_tokens":17,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"01da550f-3e17-4b7f-a273-1736b6c7c1cb"}} {"type":"permission_auto","tool":"Write","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/email.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// KA ID — courriels transactionnels via Resend (domaine groupe-ka.com).\n// API REST directe (fetch), zéro dépendance — même philosophie que scrypt.\n\nconst RESEND_ENDPOINT = \"https://api.resend.com/emails\";\n\nexport const MAIL_FROM =\n process.env.RESEND_FROM ?? \"KA ID — Groupe Ka \";\n\nexport async function sendEmail(opts: {\n to: string;\n subject: string;\n html: string;\n text: string;\n}): Promise {\n const key = process.env.RESEND_API_KEY;\n if (!key) throw new Error(\"RESEND_API_KEY manquant\");\n const res = await fetch(RESEND_ENDPOINT, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${key}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n from: MAIL_FROM,\n to: [opts.to],\n subject: opts.subject,\n html: opts.html,\n text: opts.text,\n }),\n });\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n throw new Error(`Resend ${res.status} : ${detail.slice(0, 300)}`);\n }\n}\n\n/* ---------- gabarits (encre sur papier, style Groupe Ka) ---------- */\n\nfunction layout(title: string, inner: string): string {\n return `\n\n
\n

\n Groupe Ka · KA ID\n

\n
\n

${title}

\n ${inner}\n
\n

\n Un seul compte — le KA ID — pour toutes les plateformes du Groupe Ka.
\n Si vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.\n

\n
\n`;\n}\n\nfunction button(url: string, label: string): string {\n return `

\n ${label}\n

\n

Ou copiez ce lien : ${url}

`;\n}\n\nexport function verificationEmail(name: string, url: string) {\n return {\n subject: \"Confirmez votre adresse — KA ID\",\n html: layout(\n \"Confirmez votre adresse courriel\",\n `

Bonjour ${name},
\n votre KA ID vient d'être créé. Il ne reste qu'à confirmer que cette\n adresse est bien la vôtre — le lien est valable 24 heures.

\n ${button(url, \"Confirmer mon adresse →\")}`,\n ),\n text: `Bonjour ${name},\\n\\nConfirmez votre adresse pour activer votre KA ID (lien valable 24 h) :\\n${url}\\n\\nSi vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.`,\n };\n}\n\nexport function magicLinkEmail(name: string, url: string) {\n return {\n subject: \"Votre lien de connexion — KA ID\",\n html: layout(\n \"Connexion sans mot de passe\",\n `

Bonjour ${name},
\n cliquez pour vous connecter à votre KA ID — aucun mot de passe requis.\n Le lien est valable 15 minutes et ne sert qu'une fois.

\n ${button(url, \"Me connecter →\")}`,\n ),\n text: `Bonjour ${name},\\n\\nVotre lien de connexion KA ID (valable 15 minutes, usage unique) :\\n${url}\\n\\nSi vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.`,\n };\n}\n\nexport function loginCodeEmail(name: string, code: string) {\n return {\n subject: `${code} — votre code de connexion KA ID`,\n html: layout(\n \"Votre code de connexion\",\n `

Bonjour ${name},
\n voici le code pour confirmer votre connexion. Il expire dans 10 minutes.

\n

${code}

`,\n ),\n text: `Bonjour ${name},\\n\\nVotre code de connexion KA ID (expire dans 10 minutes) : ${code}\\n\\nSi vous n'êtes pas à l'origine de cette connexion, changez votre mot de passe.`,\n };\n}\n"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01L4WTkgZ2nzcwbzbjT8e9U2","type":"tool_result","content":"File created successfully at: /Users/simon-pierreboucher/apps/groupe-ka/src/lib/email.ts"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"2b74c938-ffa4-4822-bf3b-72e108f058c4","timestamp":"2026-08-26T15:58:58.875Z","tool_use_result":{"type":"create","filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/email.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// KA ID — courriels transactionnels via Resend (domaine groupe-ka.com).\n// API REST directe (fetch), zéro dépendance — même philosophie que scrypt.\n\nconst RESEND_ENDPOINT = \"https://api.resend.com/emails\";\n\nexport const MAIL_FROM =\n process.env.RESEND_FROM ?? \"KA ID — Groupe Ka \";\n\nexport async function sendEmail(opts: {\n to: string;\n subject: string;\n html: string;\n text: string;\n}): Promise {\n const key = process.env.RESEND_API_KEY;\n if (!key) throw new Error(\"RESEND_API_KEY manquant\");\n const res = await fetch(RESEND_ENDPOINT, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${key}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n from: MAIL_FROM,\n to: [opts.to],\n subject: opts.subject,\n html: opts.html,\n text: opts.text,\n }),\n });\n if (!res.ok) {\n const detail = await res.text().catch(() => \"\");\n throw new Error(`Resend ${res.status} : ${detail.slice(0, 300)}`);\n }\n}\n\n/* ---------- gabarits (encre sur papier, style Groupe Ka) ---------- */\n\nfunction layout(title: string, inner: string): string {\n return `\n\n
\n

\n Groupe Ka · KA ID\n

\n
\n

${title}

\n ${inner}\n
\n

\n Un seul compte — le KA ID — pour toutes les plateformes du Groupe Ka.
\n Si vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.\n

\n
\n`;\n}\n\nfunction button(url: string, label: string): string {\n return `

\n ${label}\n

\n

Ou copiez ce lien : ${url}

`;\n}\n\nexport function verificationEmail(name: string, url: string) {\n return {\n subject: \"Confirmez votre adresse — KA ID\",\n html: layout(\n \"Confirmez votre adresse courriel\",\n `

Bonjour ${name},
\n votre KA ID vient d'être créé. Il ne reste qu'à confirmer que cette\n adresse est bien la vôtre — le lien est valable 24 heures.

\n ${button(url, \"Confirmer mon adresse →\")}`,\n ),\n text: `Bonjour ${name},\\n\\nConfirmez votre adresse pour activer votre KA ID (lien valable 24 h) :\\n${url}\\n\\nSi vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.`,\n };\n}\n\nexport function magicLinkEmail(name: string, url: string) {\n return {\n subject: \"Votre lien de connexion — KA ID\",\n html: layout(\n \"Connexion sans mot de passe\",\n `

Bonjour ${name},
\n cliquez pour vous connecter à votre KA ID — aucun mot de passe requis.\n Le lien est valable 15 minutes et ne sert qu'une fois.

\n ${button(url, \"Me connecter →\")}`,\n ),\n text: `Bonjour ${name},\\n\\nVotre lien de connexion KA ID (valable 15 minutes, usage unique) :\\n${url}\\n\\nSi vous n'êtes pas à l'origine de cette demande, ignorez ce courriel.`,\n };\n}\n\nexport function loginCodeEmail(name: string, code: string) {\n return {\n subject: `${code} — votre code de connexion KA ID`,\n html: layout(\n \"Votre code de connexion\",\n `

Bonjour ${name},
\n voici le code pour confirmer votre connexion. Il expire dans 10 minutes.

\n

${code}

`,\n ),\n text: `Bonjour ${name},\\n\\nVotre code de connexion KA ID (expire dans 10 minutes) : ${code}\\n\\nSi vous n'êtes pas à l'origine de cette connexion, changez votre mot de passe.`,\n };\n}\n","structuredPatch":[],"originalFile":null,"userModified":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"1f5d0fcf-7249-431d-95ee-7deeacdf291e","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdtdLtrAbKsZvCcp5hZ","type":"message","role":"assistant","content":[{"type":"text","text":"Ajout de la clé Resend au `.env.local`."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2224,"cache_read_input_tokens":78470,"cache_creation":{"ephemeral_5m_input_tokens":2224,"ephemeral_1h_input_tokens":0},"output_tokens":9,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1215035b-803a-4a03-84fa-8dfdf95bbb2d"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdtdLtrAbKsZvCcp5hZ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Uxi1Qx23PN8eZG1YJ1SUzC","name":"Bash","input":{"command":"printf '\\n# Resend — courriels transactionnels KA ID (verif inscription, lien magique, code 2FA)\\nRESEND_API_KEY=re_TDR19pua_EFVzx2Re9vLnpHQH8pc4q1jF\\nRESEND_FROM=\"KA ID — Groupe Ka \"\\n' >> /Users/simon-pierreboucher/apps/groupe-ka/.env.local && tail -4 /Users/simon-pierreboucher/apps/groupe-ka/.env.local | sed 's/=re_.*/=re_***/'","description":"Ajouter RESEND_API_KEY et RESEND_FROM au .env.local"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2224,"cache_read_input_tokens":78470,"cache_creation":{"ephemeral_5m_input_tokens":2224,"ephemeral_1h_input_tokens":0},"output_tokens":9,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"d8c5033b-078f-4311-a085-2bbeef795046"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"printf '\\n# Resend — courriels transactionnels KA ID (verif inscription, lien magique, code 2FA)\\nRESEND_API_KEY=re_TDR19pua_EFVzx2Re9vLnpHQH8pc4q1jF\\nRESEND_FROM=\"KA ID — Groupe Ka \"\\n' >> /Users/simon-pierreboucher/apps/groupe-ka/.env.local && tail -4 /Users/simon-pierreboucher/apps/groupe-ka/.env.local | sed 's/=re_.*/=re_***/'","description":"Ajouter RESEND_API_KEY et RESEND_FROM au .env.local"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Uxi1Qx23PN8eZG1YJ1SUzC","type":"tool_result","content":"# Resend — courriels transactionnels KA ID (verif inscription, lien magique, code 2FA)\nRESEND_API_KEY=re_***\nRESEND_FROM=\"KA ID — Groupe Ka \"","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"40f9d283-cc8f-405a-a063-dc0b98ef49d6","timestamp":"2026-08-26T15:59:04.773Z","tool_use_result":{"stdout":"# Resend — courriels transactionnels KA ID (verif inscription, lien magique, code 2FA)\nRESEND_API_KEY=re_***\nRESEND_FROM=\"KA ID — Groupe Ka \"","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"af063d54-3999-4d88-86dd-d308c3d18450","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdu42hXwaPXTe7nhr81","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAISqQIKpwEIERgCKkDvqCFOwsru2KyqxmcJM2qXAjQb0N0XV/LCtx8ziZ4DXIZQ21+EqCoRdFW5pK2smqaglBuniWXrKIPhzys64pXRMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAHMmrzUBrABAhIMA7BVFBO4OJf/UandGgyNXCoaR/fO9l9pPgMiMA2R8R03pZsHE0MpbQXe6m9YsEKlfzTIp/vj3GRdpwWkZrUZA93q64hag+fLc5bsViov4xHWwisa3uRf7h3cAuR521ivIq5do6MLRKHIAo3UQ/JSMc+4DrWgX/Q/L3/0jJUYAQ=="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":418,"cache_read_input_tokens":80694,"cache_creation":{"ephemeral_5m_input_tokens":418,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"9fc05e1f-21ad-4b4e-b5aa-c5daa1e40095"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdu42hXwaPXTe7nhr81","type":"message","role":"assistant","content":[{"type":"text","text":"Maintenant les routes. D'abord l'inscription : plus de session immédiate — envoi d'un lien de confirmation."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":418,"cache_read_input_tokens":80694,"cache_creation":{"ephemeral_5m_input_tokens":418,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"ebe3a2cf-8b72-448e-be6f-1315f9e21f65"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdu42hXwaPXTe7nhr81","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01SHoBPSVgGmgxwyUU7rTDfZ","name":"Write","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Inscription par courriel + mot de passe. Depuis 2026-08-26, le compte doit\n// prouver son adresse : on envoie un lien de confirmation (Resend) et la\n// session n'est ouverte qu'au clic sur ce lien (/api/auth/email/verify).\nimport crypto from \"crypto\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { db, findUserByEmail, ensureKaId, createAuthToken } from \"@/lib/db\";\nimport { ROLES } from \"@/lib/roles\";\nimport { hashPassword, BASE_URL, safeNext } from \"@/lib/auth\";\nimport { sendEmail, verificationEmail } from \"@/lib/email\";\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n\nexport async function POST(req: NextRequest) {\n let body: {\n email?: string;\n password?: string;\n name?: string;\n role?: string;\n next?: string;\n };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n const name = (body.name ?? \"\").trim();\n\n if (!EMAIL_RE.test(email))\n return NextResponse.json(\n { error: \"Adresse courriel invalide.\" },\n { status: 400 },\n );\n if (password.length < 8)\n return NextResponse.json(\n { error: \"Le mot de passe doit compter au moins 8 caractères.\" },\n { status: 400 },\n );\n if (name.length < 2)\n return NextResponse.json(\n { error: \"Dites-nous au moins votre prénom.\" },\n { status: 400 },\n );\n const role = body.role ?? \"\";\n if (!ROLES[role])\n return NextResponse.json(\n { error: \"Choisissez votre type de compte (utilisateur, fournisseur ou équipe).\" },\n { status: 400 },\n );\n\n if (findUserByEmail(email))\n return NextResponse.json(\n {\n error:\n \"Cette adresse a déjà un KA ID — connectez-vous (ou utilisez « Continuer avec Google » si le compte vient de Google).\",\n },\n { status: 409 },\n );\n\n const info = db\n .prepare(\n \"INSERT INTO users (email, name, password_hash, role) VALUES (?, ?, ?, ?)\",\n )\n .run(email, name, hashPassword(password), role);\n const userId = Number(info.lastInsertRowid);\n ensureKaId(userId);\n\n const raw = crypto.randomBytes(32).toString(\"hex\");\n createAuthToken({\n email,\n userId,\n purpose: \"verify-email\",\n raw,\n ttlMinutes: 24 * 60,\n payload: { next: safeNext(body.next) },\n });\n try {\n await sendEmail({\n to: email,\n ...verificationEmail(name, `${BASE_URL}/api/auth/email/verify?token=${raw}`),\n });\n } catch (err) {\n // Impossible d'envoyer : on retire le compte pour permettre une nouvelle\n // tentative propre (sinon le 409 bloquerait toute réinscription).\n db.prepare(\"DELETE FROM users WHERE id = ?\").run(userId);\n console.error(\"register: envoi Resend échoué\", err);\n return NextResponse.json(\n { error: \"Impossible d'envoyer le courriel de confirmation — réessayez dans un instant.\" },\n { status: 502 },\n );\n }\n\n return NextResponse.json({ ok: true, verify: true, email });\n}\n"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":418,"cache_read_input_tokens":80694,"cache_creation":{"ephemeral_5m_input_tokens":418,"ephemeral_1h_input_tokens":0},"output_tokens":4,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"c39af7e6-c4fa-49d9-812a-ce5c0e6fb3b3"}} {"type":"permission_auto","tool":"Write","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Inscription par courriel + mot de passe. Depuis 2026-08-26, le compte doit\n// prouver son adresse : on envoie un lien de confirmation (Resend) et la\n// session n'est ouverte qu'au clic sur ce lien (/api/auth/email/verify).\nimport crypto from \"crypto\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { db, findUserByEmail, ensureKaId, createAuthToken } from \"@/lib/db\";\nimport { ROLES } from \"@/lib/roles\";\nimport { hashPassword, BASE_URL, safeNext } from \"@/lib/auth\";\nimport { sendEmail, verificationEmail } from \"@/lib/email\";\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n\nexport async function POST(req: NextRequest) {\n let body: {\n email?: string;\n password?: string;\n name?: string;\n role?: string;\n next?: string;\n };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n const name = (body.name ?? \"\").trim();\n\n if (!EMAIL_RE.test(email))\n return NextResponse.json(\n { error: \"Adresse courriel invalide.\" },\n { status: 400 },\n );\n if (password.length < 8)\n return NextResponse.json(\n { error: \"Le mot de passe doit compter au moins 8 caractères.\" },\n { status: 400 },\n );\n if (name.length < 2)\n return NextResponse.json(\n { error: \"Dites-nous au moins votre prénom.\" },\n { status: 400 },\n );\n const role = body.role ?? \"\";\n if (!ROLES[role])\n return NextResponse.json(\n { error: \"Choisissez votre type de compte (utilisateur, fournisseur ou équipe).\" },\n { status: 400 },\n );\n\n if (findUserByEmail(email))\n return NextResponse.json(\n {\n error:\n \"Cette adresse a déjà un KA ID — connectez-vous (ou utilisez « Continuer avec Google » si le compte vient de Google).\",\n },\n { status: 409 },\n );\n\n const info = db\n .prepare(\n \"INSERT INTO users (email, name, password_hash, role) VALUES (?, ?, ?, ?)\",\n )\n .run(email, name, hashPassword(password), role);\n const userId = Number(info.lastInsertRowid);\n ensureKaId(userId);\n\n const raw = crypto.randomBytes(32).toString(\"hex\");\n createAuthToken({\n email,\n userId,\n purpose: \"verify-email\",\n raw,\n ttlMinutes: 24 * 60,\n payload: { next: safeNext(body.next) },\n });\n try {\n await sendEmail({\n to: email,\n ...verificationEmail(name, `${BASE_URL}/api/auth/email/verify?token=${raw}`),\n });\n } catch (err) {\n // Impossible d'envoyer : on retire le compte pour permettre une nouvelle\n // tentative propre (sinon le 409 bloquerait toute réinscription).\n db.prepare(\"DELETE FROM users WHERE id = ?\").run(userId);\n console.error(\"register: envoi Resend échoué\", err);\n return NextResponse.json(\n { error: \"Impossible d'envoyer le courriel de confirmation — réessayez dans un instant.\" },\n { status: 502 },\n );\n }\n\n return NextResponse.json({ ok: true, verify: true, email });\n}\n"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01SHoBPSVgGmgxwyUU7rTDfZ","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"faf4e6e7-05b5-4522-b1a0-819e3ddd606b","timestamp":"2026-08-26T15:59:20.523Z","tool_use_result":{"type":"update","filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/register/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Inscription par courriel + mot de passe. Depuis 2026-08-26, le compte doit\n// prouver son adresse : on envoie un lien de confirmation (Resend) et la\n// session n'est ouverte qu'au clic sur ce lien (/api/auth/email/verify).\nimport crypto from \"crypto\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { db, findUserByEmail, ensureKaId, createAuthToken } from \"@/lib/db\";\nimport { ROLES } from \"@/lib/roles\";\nimport { hashPassword, BASE_URL, safeNext } from \"@/lib/auth\";\nimport { sendEmail, verificationEmail } from \"@/lib/email\";\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n\nexport async function POST(req: NextRequest) {\n let body: {\n email?: string;\n password?: string;\n name?: string;\n role?: string;\n next?: string;\n };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n const name = (body.name ?? \"\").trim();\n\n if (!EMAIL_RE.test(email))\n return NextResponse.json(\n { error: \"Adresse courriel invalide.\" },\n { status: 400 },\n );\n if (password.length < 8)\n return NextResponse.json(\n { error: \"Le mot de passe doit compter au moins 8 caractères.\" },\n { status: 400 },\n );\n if (name.length < 2)\n return NextResponse.json(\n { error: \"Dites-nous au moins votre prénom.\" },\n { status: 400 },\n );\n const role = body.role ?? \"\";\n if (!ROLES[role])\n return NextResponse.json(\n { error: \"Choisissez votre type de compte (utilisateur, fournisseur ou équipe).\" },\n { status: 400 },\n );\n\n if (findUserByEmail(email))\n return NextResponse.json(\n {\n error:\n \"Cette adresse a déjà un KA ID — connectez-vous (ou utilisez « Continuer avec Google » si le compte vient de Google).\",\n },\n { status: 409 },\n );\n\n const info = db\n .prepare(\n \"INSERT INTO users (email, name, password_hash, role) VALUES (?, ?, ?, ?)\",\n )\n .run(email, name, hashPassword(password), role);\n const userId = Number(info.lastInsertRowid);\n ensureKaId(userId);\n\n const raw = crypto.randomBytes(32).toString(\"hex\");\n createAuthToken({\n email,\n userId,\n purpose: \"verify-email\",\n raw,\n ttlMinutes: 24 * 60,\n payload: { next: safeNext(body.next) },\n });\n try {\n await sendEmail({\n to: email,\n ...verificationEmail(name, `${BASE_URL}/api/auth/email/verify?token=${raw}`),\n });\n } catch (err) {\n // Impossible d'envoyer : on retire le compte pour permettre une nouvelle\n // tentative propre (sinon le 409 bloquerait toute réinscription).\n db.prepare(\"DELETE FROM users WHERE id = ?\").run(userId);\n console.error(\"register: envoi Resend échoué\", err);\n return NextResponse.json(\n { error: \"Impossible d'envoyer le courriel de confirmation — réessayez dans un instant.\" },\n { status: 502 },\n );\n }\n\n return NextResponse.json({ ok: true, verify: true, email });\n}\n","structuredPatch":[{"oldStart":1,"oldLines":13,"newStart":1,"newLines":13,"lines":[" // Auteur : Simon-Pierre Boucher — contact@spboucher.ai","+// Inscription par courriel + mot de passe. Depuis 2026-08-26, le compte doit","+// prouver son adresse : on envoie un lien de confirmation (Resend) et la","+// session n'est ouverte qu'au clic sur ce lien (/api/auth/email/verify).","+import crypto from \"crypto\";"," import { NextRequest, NextResponse } from \"next/server\";","-import { db, findUserByEmail, ensureKaId, touchLastLogin } from \"@/lib/db\";","+import { db, findUserByEmail, ensureKaId, createAuthToken } from \"@/lib/db\";"," import { ROLES } from \"@/lib/roles\";","-import {","- hashPassword,","- mintSessionToken,","- SESSION_COOKIE,","- sessionCookieOptions,","-} from \"@/lib/auth\";","+import { hashPassword, BASE_URL, safeNext } from \"@/lib/auth\";","+import { sendEmail, verificationEmail } from \"@/lib/email\";"," "," const EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;"," "]},{"oldStart":17,"oldLines":6,"newStart":17,"newLines":7,"lines":[" password?: string;"," name?: string;"," role?: string;","+ next?: string;"," };"," try {"," body = await req.json();"]},{"oldStart":63,"oldLines":14,"newStart":64,"newLines":33,"lines":[" \"INSERT INTO users (email, name, password_hash, role) VALUES (?, ?, ?, ?)\","," )"," .run(email, name, hashPassword(password), role);","- ensureKaId(Number(info.lastInsertRowid));","- touchLastLogin(Number(info.lastInsertRowid));","+ const userId = Number(info.lastInsertRowid);","+ ensureKaId(userId);"," ","- const res = NextResponse.json({ ok: true });","- res.cookies.set(","- SESSION_COOKIE,","- await mintSessionToken(Number(info.lastInsertRowid)),","- sessionCookieOptions,","- );","- return res;","+ const raw = crypto.randomBytes(32).toString(\"hex\");","+ createAuthToken({","+ email,","+ userId,","+ purpose: \"verify-email\",","+ raw,","+ ttlMinutes: 24 * 60,","+ payload: { next: safeNext(body.next) },","+ });","+ try {","+ await sendEmail({","+ to: email,","+ ...verificationEmail(name, `${BASE_URL}/api/auth/email/verify?token=${raw}`),","+ });","+ } catch (err) {","+ // Impossible d'envoyer : on retire le compte pour permettre une nouvelle","+ // tentative propre (sinon le 409 bloquerait toute réinscription).","+ db.prepare(\"DELETE FROM users WHERE id = ?\").run(userId);","+ console.error(\"register: envoi Resend échoué\", err);","+ return NextResponse.json(","+ { error: \"Impossible d'envoyer le courriel de confirmation — réessayez dans un instant.\" },","+ { status: 502 },","+ );","+ }","+","+ return NextResponse.json({ ok: true, verify: true, email });"," }"]}],"originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { db, findUserByEmail, ensureKaId, touchLastLogin } from \"@/lib/db\";\nimport { ROLES } from \"@/lib/roles\";\nimport {\n hashPassword,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n} from \"@/lib/auth\";\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n\nexport async function POST(req: NextRequest) {\n let body: {\n email?: string;\n password?: string;\n name?: string;\n role?: string;\n };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n const name = (body.name ?? \"\").trim();\n\n if (!EMAIL_RE.test(email))\n return NextResponse.json(\n { error: \"Adresse courriel invalide.\" },\n { status: 400 },\n );\n if (password.length < 8)\n return NextResponse.json(\n { error: \"Le mot de passe doit compter au moins 8 caractères.\" },\n { status: 400 },\n );\n if (name.length < 2)\n return NextResponse.json(\n { error: \"Dites-nous au moins votre prénom.\" },\n { status: 400 },\n );\n const role = body.role ?? \"\";\n if (!ROLES[role])\n return NextResponse.json(\n { error: \"Choisissez votre type de compte (utilisateur, fournisseur ou équipe).\" },\n { status: 400 },\n );\n\n if (findUserByEmail(email))\n return NextResponse.json(\n {\n error:\n \"Cette adresse a déjà un KA ID — connectez-vous (ou utilisez « Continuer avec Google » si le compte vient de Google).\",\n },\n { status: 409 },\n );\n\n const info = db\n .prepare(\n \"INSERT INTO users (email, name, password_hash, role) VALUES (?, ?, ?, ?)\",\n )\n .run(email, name, hashPassword(password), role);\n ensureKaId(Number(info.lastInsertRowid));\n touchLastLogin(Number(info.lastInsertRowid));\n\n const res = NextResponse.json({ ok: true });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(Number(info.lastInsertRowid)),\n sessionCookieOptions,\n );\n return res;\n}\n","userModified":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"f8aff592-97f8-416b-8257-49309717d6f3","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdvDeRFYkD8s34zKpM2","type":"message","role":"assistant","content":[{"type":"text","text":"Route de confirmation d'adresse (clic sur le lien du courriel → session ouverte)."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1530,"cache_read_input_tokens":81112,"cache_creation":{"ephemeral_5m_input_tokens":1530,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"ea9ba4d9-a92e-492e-959a-7e9f69831c4b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdvDeRFYkD8s34zKpM2","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01LPy88AkfJhGoMJBtipzkYy","name":"Write","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/email/verify/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Clic sur le lien de confirmation d'adresse : l'adresse est prouvée,\n// on ouvre la session et on reprend le parcours (next mémorisé au signup).\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n consumeAuthToken,\n findUserById,\n markEmailVerified,\n touchLastLogin,\n} from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nexport async function GET(req: NextRequest) {\n const token = req.nextUrl.searchParams.get(\"token\") ?? \"\";\n const row = token ? consumeAuthToken(token, \"verify-email\") : undefined;\n if (!row?.user_id || !findUserById(row.user_id))\n return NextResponse.redirect(\n new URL(\"/connexion?error=jeton-invalide\", BASE_URL),\n );\n\n markEmailVerified(row.user_id);\n touchLastLogin(row.user_id);\n\n let next = \"/compte\";\n try {\n next = safeNext((JSON.parse(row.payload ?? \"{}\") as { next?: string }).next);\n } catch {\n /* payload absent */\n }\n const res = NextResponse.redirect(new URL(next, BASE_URL));\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(row.user_id),\n sessionCookieOptions,\n );\n return res;\n}\n"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1530,"cache_read_input_tokens":81112,"cache_creation":{"ephemeral_5m_input_tokens":1530,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f12d0453-462b-4819-a1e7-feedcfe4964b"}} {"type":"permission_auto","tool":"Write","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/email/verify/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Clic sur le lien de confirmation d'adresse : l'adresse est prouvée,\n// on ouvre la session et on reprend le parcours (next mémorisé au signup).\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n consumeAuthToken,\n findUserById,\n markEmailVerified,\n touchLastLogin,\n} from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nexport async function GET(req: NextRequest) {\n const token = req.nextUrl.searchParams.get(\"token\") ?? \"\";\n const row = token ? consumeAuthToken(token, \"verify-email\") : undefined;\n if (!row?.user_id || !findUserById(row.user_id))\n return NextResponse.redirect(\n new URL(\"/connexion?error=jeton-invalide\", BASE_URL),\n );\n\n markEmailVerified(row.user_id);\n touchLastLogin(row.user_id);\n\n let next = \"/compte\";\n try {\n next = safeNext((JSON.parse(row.payload ?? \"{}\") as { next?: string }).next);\n } catch {\n /* payload absent */\n }\n const res = NextResponse.redirect(new URL(next, BASE_URL));\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(row.user_id),\n sessionCookieOptions,\n );\n return res;\n}\n"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01LPy88AkfJhGoMJBtipzkYy","type":"tool_result","content":"File created successfully at: /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/email/verify/route.ts"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"dfb2eba0-ed7d-47ac-ad03-2a842a5593f0","timestamp":"2026-08-26T15:59:29.747Z","tool_use_result":{"type":"create","filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/email/verify/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Clic sur le lien de confirmation d'adresse : l'adresse est prouvée,\n// on ouvre la session et on reprend le parcours (next mémorisé au signup).\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n consumeAuthToken,\n findUserById,\n markEmailVerified,\n touchLastLogin,\n} from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nexport async function GET(req: NextRequest) {\n const token = req.nextUrl.searchParams.get(\"token\") ?? \"\";\n const row = token ? consumeAuthToken(token, \"verify-email\") : undefined;\n if (!row?.user_id || !findUserById(row.user_id))\n return NextResponse.redirect(\n new URL(\"/connexion?error=jeton-invalide\", BASE_URL),\n );\n\n markEmailVerified(row.user_id);\n touchLastLogin(row.user_id);\n\n let next = \"/compte\";\n try {\n next = safeNext((JSON.parse(row.payload ?? \"{}\") as { next?: string }).next);\n } catch {\n /* payload absent */\n }\n const res = NextResponse.redirect(new URL(next, BASE_URL));\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(row.user_id),\n sessionCookieOptions,\n );\n return res;\n}\n","structuredPatch":[],"originalFile":null,"userModified":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"aea2280b-8d9e-4db1-8bd2-c7a0fad540a5","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdvu2GgHcczh3XWiYkq","type":"message","role":"assistant","content":[{"type":"text","text":"Login mot de passe → envoi du code 2FA au lieu d'ouvrir la session directement."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":757,"cache_read_input_tokens":82642,"cache_creation":{"ephemeral_5m_input_tokens":757,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"570ac362-a64c-4265-ac34-c479c688d39d"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdvu2GgHcczh3XWiYkq","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Hi7oXBjNiztvtoHm5RV7aF","name":"Write","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Login courriel + mot de passe. Depuis 2026-08-26, le mot de passe seul ne\n// suffit plus : un code à 6 chiffres est envoyé par courriel (Resend) et la\n// session n'est ouverte qu'après sa validation (/api/auth/2fa).\nimport crypto from \"crypto\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { findUserByEmail, createAuthToken } from \"@/lib/db\";\nimport { verifyPassword, BASE_URL, safeNext } from \"@/lib/auth\";\nimport {\n sendEmail,\n loginCodeEmail,\n verificationEmail,\n} from \"@/lib/email\";\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; password?: string; next?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n\n const user = findUserByEmail(email);\n if (!user || !user.password_hash) {\n return NextResponse.json(\n {\n error: user\n ? \"Ce KA ID a été créé avec Google ou Apple — utilisez le bouton correspondant, ou le lien de connexion par courriel.\"\n : \"Courriel ou mot de passe incorrect.\",\n },\n { status: 401 },\n );\n }\n if (!verifyPassword(password, user.password_hash))\n return NextResponse.json(\n { error: \"Courriel ou mot de passe incorrect.\" },\n { status: 401 },\n );\n\n // Adresse jamais confirmée (inscription interrompue) : on renvoie le lien.\n if (!user.email_verified) {\n const raw = crypto.randomBytes(32).toString(\"hex\");\n createAuthToken({\n email,\n userId: user.id,\n purpose: \"verify-email\",\n raw,\n ttlMinutes: 24 * 60,\n payload: { next: safeNext(body.next) },\n });\n try {\n await sendEmail({\n to: email,\n ...verificationEmail(user.name, `${BASE_URL}/api/auth/email/verify?token=${raw}`),\n });\n } catch (err) {\n console.error(\"login: renvoi du lien de vérification échoué\", err);\n }\n return NextResponse.json({ ok: true, verify: true, email });\n }\n\n const code = crypto.randomInt(100000, 1000000).toString();\n createAuthToken({\n email,\n userId: user.id,\n purpose: \"login-code\",\n raw: code,\n ttlMinutes: 10,\n });\n try {\n await sendEmail({ to: email, ...loginCodeEmail(user.name, code) });\n } catch (err) {\n console.error(\"login: envoi du code 2FA échoué\", err);\n return NextResponse.json(\n { error: \"Impossible d'envoyer le code de confirmation — réessayez dans un instant.\" },\n { status: 502 },\n );\n }\n return NextResponse.json({ ok: true, twofa: true, email });\n}\n"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":757,"cache_read_input_tokens":82642,"cache_creation":{"ephemeral_5m_input_tokens":757,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"eefa7f79-165d-40a3-9c3b-2119bea4211e"}} {"type":"permission_auto","tool":"Write","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Login courriel + mot de passe. Depuis 2026-08-26, le mot de passe seul ne\n// suffit plus : un code à 6 chiffres est envoyé par courriel (Resend) et la\n// session n'est ouverte qu'après sa validation (/api/auth/2fa).\nimport crypto from \"crypto\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { findUserByEmail, createAuthToken } from \"@/lib/db\";\nimport { verifyPassword, BASE_URL, safeNext } from \"@/lib/auth\";\nimport {\n sendEmail,\n loginCodeEmail,\n verificationEmail,\n} from \"@/lib/email\";\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; password?: string; next?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n\n const user = findUserByEmail(email);\n if (!user || !user.password_hash) {\n return NextResponse.json(\n {\n error: user\n ? \"Ce KA ID a été créé avec Google ou Apple — utilisez le bouton correspondant, ou le lien de connexion par courriel.\"\n : \"Courriel ou mot de passe incorrect.\",\n },\n { status: 401 },\n );\n }\n if (!verifyPassword(password, user.password_hash))\n return NextResponse.json(\n { error: \"Courriel ou mot de passe incorrect.\" },\n { status: 401 },\n );\n\n // Adresse jamais confirmée (inscription interrompue) : on renvoie le lien.\n if (!user.email_verified) {\n const raw = crypto.randomBytes(32).toString(\"hex\");\n createAuthToken({\n email,\n userId: user.id,\n purpose: \"verify-email\",\n raw,\n ttlMinutes: 24 * 60,\n payload: { next: safeNext(body.next) },\n });\n try {\n await sendEmail({\n to: email,\n ...verificationEmail(user.name, `${BASE_URL}/api/auth/email/verify?token=${raw}`),\n });\n } catch (err) {\n console.error(\"login: renvoi du lien de vérification échoué\", err);\n }\n return NextResponse.json({ ok: true, verify: true, email });\n }\n\n const code = crypto.randomInt(100000, 1000000).toString();\n createAuthToken({\n email,\n userId: user.id,\n purpose: \"login-code\",\n raw: code,\n ttlMinutes: 10,\n });\n try {\n await sendEmail({ to: email, ...loginCodeEmail(user.name, code) });\n } catch (err) {\n console.error(\"login: envoi du code 2FA échoué\", err);\n return NextResponse.json(\n { error: \"Impossible d'envoyer le code de confirmation — réessayez dans un instant.\" },\n { status: 502 },\n );\n }\n return NextResponse.json({ ok: true, twofa: true, email });\n}\n"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Hi7oXBjNiztvtoHm5RV7aF","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"415fa3fe-08cd-4204-9268-c13927dbdaa3","timestamp":"2026-08-26T15:59:43.336Z","tool_use_result":{"type":"update","filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/login/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Login courriel + mot de passe. Depuis 2026-08-26, le mot de passe seul ne\n// suffit plus : un code à 6 chiffres est envoyé par courriel (Resend) et la\n// session n'est ouverte qu'après sa validation (/api/auth/2fa).\nimport crypto from \"crypto\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { findUserByEmail, createAuthToken } from \"@/lib/db\";\nimport { verifyPassword, BASE_URL, safeNext } from \"@/lib/auth\";\nimport {\n sendEmail,\n loginCodeEmail,\n verificationEmail,\n} from \"@/lib/email\";\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; password?: string; next?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n\n const user = findUserByEmail(email);\n if (!user || !user.password_hash) {\n return NextResponse.json(\n {\n error: user\n ? \"Ce KA ID a été créé avec Google ou Apple — utilisez le bouton correspondant, ou le lien de connexion par courriel.\"\n : \"Courriel ou mot de passe incorrect.\",\n },\n { status: 401 },\n );\n }\n if (!verifyPassword(password, user.password_hash))\n return NextResponse.json(\n { error: \"Courriel ou mot de passe incorrect.\" },\n { status: 401 },\n );\n\n // Adresse jamais confirmée (inscription interrompue) : on renvoie le lien.\n if (!user.email_verified) {\n const raw = crypto.randomBytes(32).toString(\"hex\");\n createAuthToken({\n email,\n userId: user.id,\n purpose: \"verify-email\",\n raw,\n ttlMinutes: 24 * 60,\n payload: { next: safeNext(body.next) },\n });\n try {\n await sendEmail({\n to: email,\n ...verificationEmail(user.name, `${BASE_URL}/api/auth/email/verify?token=${raw}`),\n });\n } catch (err) {\n console.error(\"login: renvoi du lien de vérification échoué\", err);\n }\n return NextResponse.json({ ok: true, verify: true, email });\n }\n\n const code = crypto.randomInt(100000, 1000000).toString();\n createAuthToken({\n email,\n userId: user.id,\n purpose: \"login-code\",\n raw: code,\n ttlMinutes: 10,\n });\n try {\n await sendEmail({ to: email, ...loginCodeEmail(user.name, code) });\n } catch (err) {\n console.error(\"login: envoi du code 2FA échoué\", err);\n return NextResponse.json(\n { error: \"Impossible d'envoyer le code de confirmation — réessayez dans un instant.\" },\n { status: 502 },\n );\n }\n return NextResponse.json({ ok: true, twofa: true, email });\n}\n","structuredPatch":[{"oldStart":1,"oldLines":15,"newStart":1,"newLines":19,"lines":[" // Auteur : Simon-Pierre Boucher — contact@spboucher.ai","+// Login courriel + mot de passe. Depuis 2026-08-26, le mot de passe seul ne","+// suffit plus : un code à 6 chiffres est envoyé par courriel (Resend) et la","+// session n'est ouverte qu'après sa validation (/api/auth/2fa).","+import crypto from \"crypto\";"," import { NextRequest, NextResponse } from \"next/server\";","-import { findUserByEmail, touchLastLogin } from \"@/lib/db\";","+import { findUserByEmail, createAuthToken } from \"@/lib/db\";","+import { verifyPassword, BASE_URL, safeNext } from \"@/lib/auth\";"," import {","- verifyPassword,","- mintSessionToken,","- SESSION_COOKIE,","- sessionCookieOptions,","-} from \"@/lib/auth\";","+ sendEmail,","+ loginCodeEmail,","+ verificationEmail,","+} from \"@/lib/email\";"," "," export async function POST(req: NextRequest) {","- let body: { email?: string; password?: string };","+ let body: { email?: string; password?: string; next?: string };"," try {"," body = await req.json();"," } catch {"]},{"oldStart":23,"oldLines":7,"newStart":27,"newLines":7,"lines":[" return NextResponse.json("," {"," error: user","- ? \"Ce KA ID a été créé avec Google — utilisez « Continuer avec Google ».\"","+ ? \"Ce KA ID a été créé avec Google ou Apple — utilisez le bouton correspondant, ou le lien de connexion par courriel.\""," : \"Courriel ou mot de passe incorrect.\","," },"," { status: 401 },"]},{"oldStart":35,"oldLines":12,"newStart":39,"newLines":44,"lines":[" { status: 401 },"," );"," ","- touchLastLogin(user.id);","- const res = NextResponse.json({ ok: true });","- res.cookies.set(","- SESSION_COOKIE,","- await mintSessionToken(user.id),","- sessionCookieOptions,","- );","- return res;","+ // Adresse jamais confirmée (inscription interrompue) : on renvoie le lien.","+ if (!user.email_verified) {","+ const raw = crypto.randomBytes(32).toString(\"hex\");","+ createAuthToken({","+ email,","+ userId: user.id,","+ purpose: \"verify-email\",","+ raw,","+ ttlMinutes: 24 * 60,","+ payload: { next: safeNext(body.next) },","+ });","+ try {","+ await sendEmail({","+ to: email,","+ ...verificationEmail(user.name, `${BASE_URL}/api/auth/email/verify?token=${raw}`),","+ });","+ } catch (err) {","+ console.error(\"login: renvoi du lien de vérification échoué\", err);","+ }","+ return NextResponse.json({ ok: true, verify: true, email });","+ }","+","+ const code = crypto.randomInt(100000, 1000000).toString();","+ createAuthToken({","+ email,","+ userId: user.id,","+ purpose: \"login-code\",","+ raw: code,","+ ttlMinutes: 10,","+ });","+ try {","+ await sendEmail({ to: email, ...loginCodeEmail(user.name, code) });","+ } catch (err) {","+ console.error(\"login: envoi du code 2FA échoué\", err);","+ return NextResponse.json(","+ { error: \"Impossible d'envoyer le code de confirmation — réessayez dans un instant.\" },","+ { status: 502 },","+ );","+ }","+ return NextResponse.json({ ok: true, twofa: true, email });"," }"]}],"originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { findUserByEmail, touchLastLogin } from \"@/lib/db\";\nimport {\n verifyPassword,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n} from \"@/lib/auth\";\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; password?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const password = body.password ?? \"\";\n\n const user = findUserByEmail(email);\n if (!user || !user.password_hash) {\n return NextResponse.json(\n {\n error: user\n ? \"Ce KA ID a été créé avec Google — utilisez « Continuer avec Google ».\"\n : \"Courriel ou mot de passe incorrect.\",\n },\n { status: 401 },\n );\n }\n if (!verifyPassword(password, user.password_hash))\n return NextResponse.json(\n { error: \"Courriel ou mot de passe incorrect.\" },\n { status: 401 },\n );\n\n touchLastLogin(user.id);\n const res = NextResponse.json({ ok: true });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user.id),\n sessionCookieOptions,\n );\n return res;\n}\n","userModified":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"7ac4b645-0c8e-413b-9640-e4d1761c7d5c","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdwu2oE25UbXff6nyUi","type":"message","role":"assistant","content":[{"type":"text","text":"Route de validation du code 2FA, puis les routes magic link."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1305,"cache_read_input_tokens":83399,"cache_creation":{"ephemeral_5m_input_tokens":1305,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1f461e2c-f1c1-4bf2-a54e-033dfacf91e7"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdwu2oE25UbXff6nyUi","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01WeSZdnC9gPwX85dTn42Lus","name":"Write","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/2fa/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Deuxième étape du login mot de passe : validation du code à 6 chiffres\n// envoyé par courriel, puis ouverture de la session.\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { consumeLoginCode, findUserById, touchLastLogin } from \"@/lib/db\";\nimport {\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n} from \"@/lib/auth\";\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; code?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const code = (body.code ?? \"\").trim();\n if (!email || !/^\\d{6}$/.test(code))\n return NextResponse.json(\n { error: \"Entrez le code à 6 chiffres reçu par courriel.\" },\n { status: 400 },\n );\n\n const result = consumeLoginCode(email, code);\n if (!result.ok || !result.userId) {\n const msg =\n result.reason === \"tentatives\"\n ? \"Trop d'essais — reconnectez-vous pour recevoir un nouveau code.\"\n : result.reason === \"expire\"\n ? \"Ce code a expiré — reconnectez-vous pour en recevoir un nouveau.\"\n : \"Code incorrect — vérifiez le courriel reçu.\";\n return NextResponse.json({ error: msg }, { status: 401 });\n }\n const user = findUserById(result.userId);\n if (!user)\n return NextResponse.json({ error: \"Compte introuvable.\" }, { status: 401 });\n\n touchLastLogin(user.id);\n const res = NextResponse.json({ ok: true });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user.id),\n sessionCookieOptions,\n );\n return res;\n}\n"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1305,"cache_read_input_tokens":83399,"cache_creation":{"ephemeral_5m_input_tokens":1305,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"8f1d682a-e040-425c-abb2-33326d40fdca"}} {"type":"permission_auto","tool":"Write","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/2fa/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Deuxième étape du login mot de passe : validation du code à 6 chiffres\n// envoyé par courriel, puis ouverture de la session.\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { consumeLoginCode, findUserById, touchLastLogin } from \"@/lib/db\";\nimport {\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n} from \"@/lib/auth\";\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; code?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const code = (body.code ?? \"\").trim();\n if (!email || !/^\\d{6}$/.test(code))\n return NextResponse.json(\n { error: \"Entrez le code à 6 chiffres reçu par courriel.\" },\n { status: 400 },\n );\n\n const result = consumeLoginCode(email, code);\n if (!result.ok || !result.userId) {\n const msg =\n result.reason === \"tentatives\"\n ? \"Trop d'essais — reconnectez-vous pour recevoir un nouveau code.\"\n : result.reason === \"expire\"\n ? \"Ce code a expiré — reconnectez-vous pour en recevoir un nouveau.\"\n : \"Code incorrect — vérifiez le courriel reçu.\";\n return NextResponse.json({ error: msg }, { status: 401 });\n }\n const user = findUserById(result.userId);\n if (!user)\n return NextResponse.json({ error: \"Compte introuvable.\" }, { status: 401 });\n\n touchLastLogin(user.id);\n const res = NextResponse.json({ ok: true });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user.id),\n sessionCookieOptions,\n );\n return res;\n}\n"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01WeSZdnC9gPwX85dTn42Lus","type":"tool_result","content":"File created successfully at: /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/2fa/route.ts"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a55c1d3b-5697-4668-94ea-99aec5dcb1f4","timestamp":"2026-08-26T15:59:53.234Z","tool_use_result":{"type":"create","filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/2fa/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Deuxième étape du login mot de passe : validation du code à 6 chiffres\n// envoyé par courriel, puis ouverture de la session.\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { consumeLoginCode, findUserById, touchLastLogin } from \"@/lib/db\";\nimport {\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n} from \"@/lib/auth\";\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; code?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n const code = (body.code ?? \"\").trim();\n if (!email || !/^\\d{6}$/.test(code))\n return NextResponse.json(\n { error: \"Entrez le code à 6 chiffres reçu par courriel.\" },\n { status: 400 },\n );\n\n const result = consumeLoginCode(email, code);\n if (!result.ok || !result.userId) {\n const msg =\n result.reason === \"tentatives\"\n ? \"Trop d'essais — reconnectez-vous pour recevoir un nouveau code.\"\n : result.reason === \"expire\"\n ? \"Ce code a expiré — reconnectez-vous pour en recevoir un nouveau.\"\n : \"Code incorrect — vérifiez le courriel reçu.\";\n return NextResponse.json({ error: msg }, { status: 401 });\n }\n const user = findUserById(result.userId);\n if (!user)\n return NextResponse.json({ error: \"Compte introuvable.\" }, { status: 401 });\n\n touchLastLogin(user.id);\n const res = NextResponse.json({ ok: true });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user.id),\n sessionCookieOptions,\n );\n return res;\n}\n","structuredPatch":[],"originalFile":null,"userModified":false}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdwu2oE25UbXff6nyUi","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01YUrpeqBKoBFw5YVEVgKJPG","name":"Write","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/magic/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Connexion sans mot de passe : envoi d'un lien magique (jeton usage unique,\n// 15 minutes) par courriel. Réponse identique que le compte existe ou non,\n// pour ne pas permettre l'énumération des adresses.\nimport crypto from \"crypto\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { findUserByEmail, createAuthToken } from \"@/lib/db\";\nimport { BASE_URL, safeNext } from \"@/lib/auth\";\nimport { sendEmail, magicLinkEmail } from \"@/lib/email\";\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; next?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n if (!EMAIL_RE.test(email))\n return NextResponse.json(\n { error: \"Entrez d'abord votre adresse courriel.\" },\n { status: 400 },\n );\n\n const user = findUserByEmail(email);\n if (user) {\n const raw = crypto.randomBytes(32).toString(\"hex\");\n createAuthToken({\n email,\n userId: user.id,\n purpose: \"magic-link\",\n raw,\n ttlMinutes: 15,\n payload: { next: safeNext(body.next) },\n });\n try {\n await sendEmail({\n to: email,\n ...magicLinkEmail(user.name, `${BASE_URL}/api/auth/magic/verify?token=${raw}`),\n });\n } catch (err) {\n console.error(\"magic: envoi Resend échoué\", err);\n return NextResponse.json(\n { error: \"Impossible d'envoyer le courriel — réessayez dans un instant.\" },\n { status: 502 },\n );\n }\n }\n return NextResponse.json({ ok: true, sent: true, email });\n}\n"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1305,"cache_read_input_tokens":83399,"cache_creation":{"ephemeral_5m_input_tokens":1305,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a89efad1-7e38-4eec-88de-3e4955529650"}} {"type":"permission_auto","tool":"Write","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/magic/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Connexion sans mot de passe : envoi d'un lien magique (jeton usage unique,\n// 15 minutes) par courriel. Réponse identique que le compte existe ou non,\n// pour ne pas permettre l'énumération des adresses.\nimport crypto from \"crypto\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { findUserByEmail, createAuthToken } from \"@/lib/db\";\nimport { BASE_URL, safeNext } from \"@/lib/auth\";\nimport { sendEmail, magicLinkEmail } from \"@/lib/email\";\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; next?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n if (!EMAIL_RE.test(email))\n return NextResponse.json(\n { error: \"Entrez d'abord votre adresse courriel.\" },\n { status: 400 },\n );\n\n const user = findUserByEmail(email);\n if (user) {\n const raw = crypto.randomBytes(32).toString(\"hex\");\n createAuthToken({\n email,\n userId: user.id,\n purpose: \"magic-link\",\n raw,\n ttlMinutes: 15,\n payload: { next: safeNext(body.next) },\n });\n try {\n await sendEmail({\n to: email,\n ...magicLinkEmail(user.name, `${BASE_URL}/api/auth/magic/verify?token=${raw}`),\n });\n } catch (err) {\n console.error(\"magic: envoi Resend échoué\", err);\n return NextResponse.json(\n { error: \"Impossible d'envoyer le courriel — réessayez dans un instant.\" },\n { status: 502 },\n );\n }\n }\n return NextResponse.json({ ok: true, sent: true, email });\n}\n"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01YUrpeqBKoBFw5YVEVgKJPG","type":"tool_result","content":"File created successfully at: /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/magic/route.ts"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"fd86e319-4cd1-456f-aae4-3e2fe0285def","timestamp":"2026-08-26T16:00:00.399Z","tool_use_result":{"type":"create","filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/magic/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Connexion sans mot de passe : envoi d'un lien magique (jeton usage unique,\n// 15 minutes) par courriel. Réponse identique que le compte existe ou non,\n// pour ne pas permettre l'énumération des adresses.\nimport crypto from \"crypto\";\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { findUserByEmail, createAuthToken } from \"@/lib/db\";\nimport { BASE_URL, safeNext } from \"@/lib/auth\";\nimport { sendEmail, magicLinkEmail } from \"@/lib/email\";\n\nconst EMAIL_RE = /^[^\\s@]+@[^\\s@]+\\.[^\\s@]{2,}$/;\n\nexport async function POST(req: NextRequest) {\n let body: { email?: string; next?: string };\n try {\n body = await req.json();\n } catch {\n return NextResponse.json({ error: \"Requête invalide.\" }, { status: 400 });\n }\n const email = (body.email ?? \"\").trim().toLowerCase();\n if (!EMAIL_RE.test(email))\n return NextResponse.json(\n { error: \"Entrez d'abord votre adresse courriel.\" },\n { status: 400 },\n );\n\n const user = findUserByEmail(email);\n if (user) {\n const raw = crypto.randomBytes(32).toString(\"hex\");\n createAuthToken({\n email,\n userId: user.id,\n purpose: \"magic-link\",\n raw,\n ttlMinutes: 15,\n payload: { next: safeNext(body.next) },\n });\n try {\n await sendEmail({\n to: email,\n ...magicLinkEmail(user.name, `${BASE_URL}/api/auth/magic/verify?token=${raw}`),\n });\n } catch (err) {\n console.error(\"magic: envoi Resend échoué\", err);\n return NextResponse.json(\n { error: \"Impossible d'envoyer le courriel — réessayez dans un instant.\" },\n { status: 502 },\n );\n }\n }\n return NextResponse.json({ ok: true, sent: true, email });\n}\n","structuredPatch":[],"originalFile":null,"userModified":false}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdwu2oE25UbXff6nyUi","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Gw1a9zXEMpoooQKyN3Qfhx","name":"Write","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/magic/verify/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Clic sur le lien magique : le jeton prouve la possession de la boîte\n// courriel → session ouverte, adresse marquée vérifiée.\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n consumeAuthToken,\n findUserById,\n markEmailVerified,\n touchLastLogin,\n} from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nexport async function GET(req: NextRequest) {\n const token = req.nextUrl.searchParams.get(\"token\") ?? \"\";\n const row = token ? consumeAuthToken(token, \"magic-link\") : undefined;\n if (!row?.user_id || !findUserById(row.user_id))\n return NextResponse.redirect(\n new URL(\"/connexion?error=jeton-invalide\", BASE_URL),\n );\n\n markEmailVerified(row.user_id);\n touchLastLogin(row.user_id);\n\n let next = \"/compte\";\n try {\n next = safeNext((JSON.parse(row.payload ?? \"{}\") as { next?: string }).next);\n } catch {\n /* payload absent */\n }\n const res = NextResponse.redirect(new URL(next, BASE_URL));\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(row.user_id),\n sessionCookieOptions,\n );\n return res;\n}\n"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1305,"cache_read_input_tokens":83399,"cache_creation":{"ephemeral_5m_input_tokens":1305,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"ac93905d-d57e-4488-b60a-7f2a23cba7f7"}} {"type":"permission_auto","tool":"Write","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/magic/verify/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Clic sur le lien magique : le jeton prouve la possession de la boîte\n// courriel → session ouverte, adresse marquée vérifiée.\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n consumeAuthToken,\n findUserById,\n markEmailVerified,\n touchLastLogin,\n} from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nexport async function GET(req: NextRequest) {\n const token = req.nextUrl.searchParams.get(\"token\") ?? \"\";\n const row = token ? consumeAuthToken(token, \"magic-link\") : undefined;\n if (!row?.user_id || !findUserById(row.user_id))\n return NextResponse.redirect(\n new URL(\"/connexion?error=jeton-invalide\", BASE_URL),\n );\n\n markEmailVerified(row.user_id);\n touchLastLogin(row.user_id);\n\n let next = \"/compte\";\n try {\n next = safeNext((JSON.parse(row.payload ?? \"{}\") as { next?: string }).next);\n } catch {\n /* payload absent */\n }\n const res = NextResponse.redirect(new URL(next, BASE_URL));\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(row.user_id),\n sessionCookieOptions,\n );\n return res;\n}\n"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Gw1a9zXEMpoooQKyN3Qfhx","type":"tool_result","content":"File created successfully at: /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/magic/verify/route.ts"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"c064f1bb-4f75-4886-8327-b19edb6d97dd","timestamp":"2026-08-26T16:00:05.201Z","tool_use_result":{"type":"create","filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/magic/verify/route.ts","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Clic sur le lien magique : le jeton prouve la possession de la boîte\n// courriel → session ouverte, adresse marquée vérifiée.\nimport { NextRequest, NextResponse } from \"next/server\";\nimport {\n consumeAuthToken,\n findUserById,\n markEmailVerified,\n touchLastLogin,\n} from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nexport async function GET(req: NextRequest) {\n const token = req.nextUrl.searchParams.get(\"token\") ?? \"\";\n const row = token ? consumeAuthToken(token, \"magic-link\") : undefined;\n if (!row?.user_id || !findUserById(row.user_id))\n return NextResponse.redirect(\n new URL(\"/connexion?error=jeton-invalide\", BASE_URL),\n );\n\n markEmailVerified(row.user_id);\n touchLastLogin(row.user_id);\n\n let next = \"/compte\";\n try {\n next = safeNext((JSON.parse(row.payload ?? \"{}\") as { next?: string }).next);\n } catch {\n /* payload absent */\n }\n const res = NextResponse.redirect(new URL(next, BASE_URL));\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(row.user_id),\n sessionCookieOptions,\n );\n return res;\n}\n","structuredPatch":[],"originalFile":null,"userModified":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"f767a862-f4a9-4d0a-9aff-379216bbbe9a","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdyXXnSm7tg47dj7bXe","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01PmdD3BJ5PXrfAdfjfK6xXj","name":"TodoWrite","input":{"todos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"completed","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"completed","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"completed","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"in_progress","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"pending","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}]},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2962,"cache_read_input_tokens":84704,"cache_creation":{"ephemeral_5m_input_tokens":2962,"ephemeral_1h_input_tokens":0},"output_tokens":24,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a131667f-eb2d-4007-b201-085adeffffda"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01PmdD3BJ5PXrfAdfjfK6xXj","type":"tool_result","content":"Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a5fcd7a1-ae7c-4568-8c1c-638514bdc40c","timestamp":"2026-08-26T16:00:11.965Z","tool_use_result":{"oldTodos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"completed","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"in_progress","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"pending","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"pending","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"pending","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}],"newTodos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"completed","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"completed","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"completed","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"in_progress","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"pending","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}],"verificationNudgeNeeded":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"1252ca23-1874-4a7e-a4fd-8032e1f804e6","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdz1Wn74SHVaA6R4sU7","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAISqwMKpwEIERgCKkC8SXwFDsfOzUuqfdHZjc9XLZXTLjbDTFrrYbB8xotDWzUmT9dh0VzKSo0S3QhPwfCVmhSPo0tAoZ5UHYHdoIFXMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAGQm7zUBrABAhIMntg4FH5gghiMQ3E0Ggx9qJksa66TNJHQB3giMIYmMxQi0fTLdLMZFycn3qy1o4z04znw9dCPwtEgsKNsVsifPnPiy+1TxnfsutWbFyqwAb8ndI7u37dk9+H4wBTBZrtX4v0igJREJwD+BRVTayjN7TCxkxGO1ng9ZZtqnm+SlbG6JA2ngNoTjmQnWfjaEKLlGC+dBM5h3up5TdGneYDrrObU88svVyAsnCcVICP826QES//2r8u6GR9Zap9EFhF7NTZrTlbIW15U6OKPOyNvCowFLEDJES7CD/dGa3FQ4JEuDe0i094iSgpTjeAo8GXNizfWb8ukgEvJ9YMK4LbbGAE="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":553,"cache_read_input_tokens":87666,"cache_creation":{"ephemeral_5m_input_tokens":553,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"043dbb1a-43a1-4656-8865-433f4977409d"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdz1Wn74SHVaA6R4sU7","type":"message","role":"assistant","content":[{"type":"text","text":"Callbacks OAuth : Google et Apple prouvent déjà l'adresse — on la marque vérifiée."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":553,"cache_read_input_tokens":87666,"cache_creation":{"ephemeral_5m_input_tokens":553,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"6de5643f-2ae7-4bca-bb9f-7dc3d0de286b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdz1Wn74SHVaA6R4sU7","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01UPmKh9np49USuk8is57rSa","name":"Edit","input":{"replace_all":false,"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts","old_string":"import { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin } from \"@/lib/db\";","new_string":"import { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin, markEmailVerified } from \"@/lib/db\";"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":553,"cache_read_input_tokens":87666,"cache_creation":{"ephemeral_5m_input_tokens":553,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"60502064-3784-46bb-a6df-843bf5ecf889"}} {"type":"permission_auto","tool":"Edit","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts","old_string":"import { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin } from \"@/lib/db\";","new_string":"import { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin, markEmailVerified } from \"@/lib/db\";","replace_all":false}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01UPmKh9np49USuk8is57rSa","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1073d6fc-2dbd-4b2b-a99d-058957f6b13e","timestamp":"2026-08-26T16:00:18.805Z","tool_use_result":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts","oldString":"import { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin } from \"@/lib/db\";","newString":"import { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin, markEmailVerified } from \"@/lib/db\";","originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Retour du flux Google OAuth : échange du code, vérification de\n// l'id_token (JWKS Google), création/liaison du KA ID, ouverture de session.\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { createRemoteJWKSet, jwtVerify } from \"jose\";\nimport { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin } from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nconst GOOGLE_JWKS = createRemoteJWKSet(\n new URL(\"https://www.googleapis.com/oauth2/v3/certs\"),\n);\n\nfunction fail(reason: string) {\n return NextResponse.redirect(\n new URL(`/connexion?error=${encodeURIComponent(reason)}`, BASE_URL),\n );\n}\n\nexport async function GET(req: NextRequest) {\n const clientId = process.env.GOOGLE_CLIENT_ID;\n const clientSecret = process.env.GOOGLE_CLIENT_SECRET;\n if (!clientId || !clientSecret) return fail(\"google-non-configure\");\n\n const code = req.nextUrl.searchParams.get(\"code\");\n const state = req.nextUrl.searchParams.get(\"state\");\n const cookieState = req.cookies.get(\"ka_oauth_state\")?.value;\n const next = safeNext(req.cookies.get(\"ka_oauth_next\")?.value);\n if (!code || !state || !cookieState || state !== cookieState)\n return fail(\"etat-oauth-invalide\");\n\n // Échange code → jetons\n const tokenRes = await fetch(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n code,\n client_id: clientId,\n client_secret: clientSecret,\n redirect_uri: `${BASE_URL}/api/auth/callback/google`,\n grant_type: \"authorization_code\",\n }),\n });\n if (!tokenRes.ok) return fail(\"echange-google-refuse\");\n const tokens = (await tokenRes.json()) as { id_token?: string };\n if (!tokens.id_token) return fail(\"id-token-absent\");\n\n // Vérification cryptographique de l'id_token\n let claims: {\n sub?: string;\n email?: string;\n email_verified?: boolean;\n name?: string;\n picture?: string;\n };\n try {\n const { payload } = await jwtVerify(tokens.id_token, GOOGLE_JWKS, {\n issuer: [\"https://accounts.google.com\", \"accounts.google.com\"],\n audience: clientId,\n });\n claims = payload as typeof claims;\n } catch {\n return fail(\"id-token-invalide\");\n }\n if (!claims.sub || !claims.email || claims.email_verified === false)\n return fail(\"profil-google-incomplet\");\n\n const email = claims.email.toLowerCase();\n const name = claims.name ?? email.split(\"@\")[0];\n const picture = claims.picture ?? null;\n\n // Upsert : par google_sub, sinon liaison par courriel, sinon création.\n let user = findUserByGoogleSub(claims.sub);\n if (user) {\n db.prepare(\"UPDATE users SET name = ?, avatar_url = ? WHERE id = ?\").run(\n name,\n picture,\n user.id,\n );\n } else {\n const byEmail = findUserByEmail(email);\n if (byEmail) {\n db.prepare(\n \"UPDATE users SET google_sub = ?, avatar_url = COALESCE(?, avatar_url) WHERE id = ?\",\n ).run(claims.sub, picture, byEmail.id);\n user = { ...byEmail, google_sub: claims.sub };\n } else {\n const info = db\n .prepare(\n \"INSERT INTO users (email, name, avatar_url, google_sub) VALUES (?, ?, ?, ?)\",\n )\n .run(email, name, picture, claims.sub);\n user = findUserByGoogleSub(claims.sub)!;\n ensureKaId(user.id);\n void info;\n }\n }\n\n ensureKaId(user!.id);\n touchLastLogin(user!.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL));\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user!.id),\n sessionCookieOptions,\n );\n res.cookies.set(\"ka_oauth_state\", \"\", { path: \"/\", maxAge: 0 });\n res.cookies.set(\"ka_oauth_next\", \"\", { path: \"/\", maxAge: 0 });\n return res;\n}\n","structuredPatch":[{"oldStart":3,"oldLines":7,"newStart":3,"newLines":7,"lines":[" // l'id_token (JWKS Google), création/liaison du KA ID, ouverture de session."," import { NextRequest, NextResponse } from \"next/server\";"," import { createRemoteJWKSet, jwtVerify } from \"jose\";","-import { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin } from \"@/lib/db\";","+import { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin, markEmailVerified } from \"@/lib/db\";"," import {"," BASE_URL,"," mintSessionToken,"]}],"userModified":false,"replaceAll":false}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdz1Wn74SHVaA6R4sU7","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01NaG9MoxqTAC9ACBz4oHBuX","name":"Edit","input":{"replace_all":false,"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts","old_string":" ensureKaId(user!.id);\n touchLastLogin(user!.id);","new_string":" ensureKaId(user!.id);\n markEmailVerified(user!.id); // Google atteste email_verified\n touchLastLogin(user!.id);"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":553,"cache_read_input_tokens":87666,"cache_creation":{"ephemeral_5m_input_tokens":553,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"41072d6d-ce20-43c5-b2ac-0248c1b8b825"}} {"type":"permission_auto","tool":"Edit","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts","old_string":" ensureKaId(user!.id);\n touchLastLogin(user!.id);","new_string":" ensureKaId(user!.id);\n markEmailVerified(user!.id); // Google atteste email_verified\n touchLastLogin(user!.id);","replace_all":false}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01NaG9MoxqTAC9ACBz4oHBuX","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"ac69e1fd-9def-43d2-93b8-016e2e4c76e7","timestamp":"2026-08-26T16:00:20.192Z","tool_use_result":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/google/route.ts","oldString":" ensureKaId(user!.id);\n touchLastLogin(user!.id);","newString":" ensureKaId(user!.id);\n markEmailVerified(user!.id); // Google atteste email_verified\n touchLastLogin(user!.id);","originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Retour du flux Google OAuth : échange du code, vérification de\n// l'id_token (JWKS Google), création/liaison du KA ID, ouverture de session.\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { createRemoteJWKSet, jwtVerify } from \"jose\";\nimport { db, findUserByEmail, findUserByGoogleSub, ensureKaId, touchLastLogin, markEmailVerified } from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nconst GOOGLE_JWKS = createRemoteJWKSet(\n new URL(\"https://www.googleapis.com/oauth2/v3/certs\"),\n);\n\nfunction fail(reason: string) {\n return NextResponse.redirect(\n new URL(`/connexion?error=${encodeURIComponent(reason)}`, BASE_URL),\n );\n}\n\nexport async function GET(req: NextRequest) {\n const clientId = process.env.GOOGLE_CLIENT_ID;\n const clientSecret = process.env.GOOGLE_CLIENT_SECRET;\n if (!clientId || !clientSecret) return fail(\"google-non-configure\");\n\n const code = req.nextUrl.searchParams.get(\"code\");\n const state = req.nextUrl.searchParams.get(\"state\");\n const cookieState = req.cookies.get(\"ka_oauth_state\")?.value;\n const next = safeNext(req.cookies.get(\"ka_oauth_next\")?.value);\n if (!code || !state || !cookieState || state !== cookieState)\n return fail(\"etat-oauth-invalide\");\n\n // Échange code → jetons\n const tokenRes = await fetch(\"https://oauth2.googleapis.com/token\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n code,\n client_id: clientId,\n client_secret: clientSecret,\n redirect_uri: `${BASE_URL}/api/auth/callback/google`,\n grant_type: \"authorization_code\",\n }),\n });\n if (!tokenRes.ok) return fail(\"echange-google-refuse\");\n const tokens = (await tokenRes.json()) as { id_token?: string };\n if (!tokens.id_token) return fail(\"id-token-absent\");\n\n // Vérification cryptographique de l'id_token\n let claims: {\n sub?: string;\n email?: string;\n email_verified?: boolean;\n name?: string;\n picture?: string;\n };\n try {\n const { payload } = await jwtVerify(tokens.id_token, GOOGLE_JWKS, {\n issuer: [\"https://accounts.google.com\", \"accounts.google.com\"],\n audience: clientId,\n });\n claims = payload as typeof claims;\n } catch {\n return fail(\"id-token-invalide\");\n }\n if (!claims.sub || !claims.email || claims.email_verified === false)\n return fail(\"profil-google-incomplet\");\n\n const email = claims.email.toLowerCase();\n const name = claims.name ?? email.split(\"@\")[0];\n const picture = claims.picture ?? null;\n\n // Upsert : par google_sub, sinon liaison par courriel, sinon création.\n let user = findUserByGoogleSub(claims.sub);\n if (user) {\n db.prepare(\"UPDATE users SET name = ?, avatar_url = ? WHERE id = ?\").run(\n name,\n picture,\n user.id,\n );\n } else {\n const byEmail = findUserByEmail(email);\n if (byEmail) {\n db.prepare(\n \"UPDATE users SET google_sub = ?, avatar_url = COALESCE(?, avatar_url) WHERE id = ?\",\n ).run(claims.sub, picture, byEmail.id);\n user = { ...byEmail, google_sub: claims.sub };\n } else {\n const info = db\n .prepare(\n \"INSERT INTO users (email, name, avatar_url, google_sub) VALUES (?, ?, ?, ?)\",\n )\n .run(email, name, picture, claims.sub);\n user = findUserByGoogleSub(claims.sub)!;\n ensureKaId(user.id);\n void info;\n }\n }\n\n ensureKaId(user!.id);\n touchLastLogin(user!.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL));\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user!.id),\n sessionCookieOptions,\n );\n res.cookies.set(\"ka_oauth_state\", \"\", { path: \"/\", maxAge: 0 });\n res.cookies.set(\"ka_oauth_next\", \"\", { path: \"/\", maxAge: 0 });\n return res;\n}\n","structuredPatch":[{"oldStart":102,"oldLines":6,"newStart":102,"newLines":7,"lines":[" }"," "," ensureKaId(user!.id);","+ markEmailVerified(user!.id); // Google atteste email_verified"," touchLastLogin(user!.id);"," const res = NextResponse.redirect(new URL(next, BASE_URL));"," res.cookies.set("]}],"userModified":false,"replaceAll":false}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdz1Wn74SHVaA6R4sU7","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01NNjdruFFQMMFb4T5cegbaQ","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","offset":100},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":553,"cache_read_input_tokens":87666,"cache_creation":{"ephemeral_5m_input_tokens":553,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"52da750c-321b-4901-86b8-c395be99e395"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01NNjdruFFQMMFb4T5cegbaQ","type":"tool_result","content":"100\t }),\n101\t });\n102\t if (!tokenRes.ok) return fail(\"echange-apple-refuse\");\n103\t const tokens = (await tokenRes.json()) as { id_token?: string };\n104\t if (!tokens.id_token) return fail(\"id-token-absent\");\n105\t\n106\t // Vérification cryptographique de l'id_token\n107\t let claims: {\n108\t sub?: string;\n109\t email?: string;\n110\t email_verified?: boolean | string;\n111\t };\n112\t try {\n113\t const { payload } = await jwtVerify(tokens.id_token, APPLE_JWKS, {\n114\t issuer: \"https://appleid.apple.com\",\n115\t audience: clientId,\n116\t });\n117\t claims = payload as typeof claims;\n118\t } catch {\n119\t return fail(\"id-token-invalide\");\n120\t }\n121\t const emailVerified =\n122\t claims.email_verified === true || claims.email_verified === \"true\";\n123\t if (!claims.sub || !claims.email || !emailVerified)\n124\t return fail(\"profil-apple-incomplet\");\n125\t\n126\t const email = claims.email.toLowerCase();\n127\t const name = firstAuthName ?? email.split(\"@\")[0];\n128\t\n129\t // Upsert : par apple_sub, sinon liaison par courriel, sinon création.\n130\t let user = findUserByAppleSub(claims.sub);\n131\t if (!user) {\n132\t const byEmail = findUserByEmail(email);\n133\t if (byEmail) {\n134\t db.prepare(\"UPDATE users SET apple_sub = ? WHERE id = ?\").run(\n135\t claims.sub,\n136\t byEmail.id,\n137\t );\n138\t user = { ...byEmail, apple_sub: claims.sub };\n139\t } else {\n140\t db.prepare(\n141\t \"INSERT INTO users (email, name, apple_sub) VALUES (?, ?, ?)\",\n142\t ).run(email, name, claims.sub);\n143\t user = findUserByAppleSub(claims.sub)!;\n144\t ensureKaId(user.id);\n145\t }\n146\t }\n147\t\n148\t ensureKaId(user.id);\n149\t touchLastLogin(user.id);\n150\t const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });\n151\t res.cookies.set(\n152\t SESSION_COOKIE,\n153\t await mintSessionToken(user.id),\n154\t sessionCookieOptions,\n155\t );\n156\t res.cookies.set(\"ka_apple_state\", \"\", { path: \"/\", maxAge: 0 });\n157\t res.cookies.set(\"ka_apple_next\", \"\", { path: \"/\", maxAge: 0 });\n158\t return res;\n159\t}\n160\t"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"85a8394a-9831-48d3-804f-2aa1d79a837c","timestamp":"2026-08-26T16:00:21.058Z","tool_use_result":{"type":"text","file":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","content":" }),\n });\n if (!tokenRes.ok) return fail(\"echange-apple-refuse\");\n const tokens = (await tokenRes.json()) as { id_token?: string };\n if (!tokens.id_token) return fail(\"id-token-absent\");\n\n // Vérification cryptographique de l'id_token\n let claims: {\n sub?: string;\n email?: string;\n email_verified?: boolean | string;\n };\n try {\n const { payload } = await jwtVerify(tokens.id_token, APPLE_JWKS, {\n issuer: \"https://appleid.apple.com\",\n audience: clientId,\n });\n claims = payload as typeof claims;\n } catch {\n return fail(\"id-token-invalide\");\n }\n const emailVerified =\n claims.email_verified === true || claims.email_verified === \"true\";\n if (!claims.sub || !claims.email || !emailVerified)\n return fail(\"profil-apple-incomplet\");\n\n const email = claims.email.toLowerCase();\n const name = firstAuthName ?? email.split(\"@\")[0];\n\n // Upsert : par apple_sub, sinon liaison par courriel, sinon création.\n let user = findUserByAppleSub(claims.sub);\n if (!user) {\n const byEmail = findUserByEmail(email);\n if (byEmail) {\n db.prepare(\"UPDATE users SET apple_sub = ? WHERE id = ?\").run(\n claims.sub,\n byEmail.id,\n );\n user = { ...byEmail, apple_sub: claims.sub };\n } else {\n db.prepare(\n \"INSERT INTO users (email, name, apple_sub) VALUES (?, ?, ?)\",\n ).run(email, name, claims.sub);\n user = findUserByAppleSub(claims.sub)!;\n ensureKaId(user.id);\n }\n }\n\n ensureKaId(user.id);\n touchLastLogin(user.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user.id),\n sessionCookieOptions,\n );\n res.cookies.set(\"ka_apple_state\", \"\", { path: \"/\", maxAge: 0 });\n res.cookies.set(\"ka_apple_next\", \"\", { path: \"/\", maxAge: 0 });\n return res;\n}\n","numLines":61,"startLine":100,"totalLines":160}}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"74504538-5252-474e-8994-d989c608a96d","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdzgUa4HHUksz8tVSTJ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01QHhM8gcedHNobMbA6kchaw","name":"Edit","input":{"replace_all":false,"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","old_string":" ensureKaId(user.id);\n touchLastLogin(user.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });","new_string":" ensureKaId(user.id);\n markEmailVerified(user.id); // Apple atteste email_verified\n touchLastLogin(user.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1837,"cache_read_input_tokens":88219,"cache_creation":{"ephemeral_5m_input_tokens":1837,"ephemeral_1h_input_tokens":0},"output_tokens":20,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"afe6c8c6-8f8f-412e-9c46-521f1cf544be"}} {"type":"permission_auto","tool":"Edit","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","old_string":" ensureKaId(user.id);\n touchLastLogin(user.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });","new_string":" ensureKaId(user.id);\n markEmailVerified(user.id); // Apple atteste email_verified\n touchLastLogin(user.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });","replace_all":false}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01QHhM8gcedHNobMbA6kchaw","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"484bfaa2-5f19-45ef-8f39-a96965ba192d","timestamp":"2026-08-26T16:00:26.584Z","tool_use_result":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","oldString":" ensureKaId(user.id);\n touchLastLogin(user.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });","newString":" ensureKaId(user.id);\n markEmailVerified(user.id); // Apple atteste email_verified\n touchLastLogin(user.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });","originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Retour du flux Sign in with Apple : échange du code, vérification de\n// l'id_token (JWKS Apple), création/liaison du KA ID, ouverture de session.\n//\n// Différences avec Google :\n// - le retour arrive en POST (form_post) et non en GET ;\n// - le client_secret est un JWT ES256 signé avec la clé privée .p8\n// (APPLE_TEAM_ID / APPLE_KEY_ID / APPLE_PRIVATE_KEY), regénéré à chaque\n// échange ;\n// - le nom (`user`) n'est transmis qu'à la PREMIÈRE autorisation ;\n// - email_verified peut être un booléen ou la chaîne \"true\".\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { createRemoteJWKSet, jwtVerify, SignJWT, importPKCS8 } from \"jose\";\nimport {\n db,\n findUserByEmail,\n findUserByAppleSub,\n ensureKaId,\n touchLastLogin,\n} from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nconst APPLE_JWKS = createRemoteJWKSet(\n new URL(\"https://appleid.apple.com/auth/keys\"),\n);\n\nfunction fail(reason: string) {\n return NextResponse.redirect(\n new URL(`/connexion?error=${encodeURIComponent(reason)}`, BASE_URL),\n // 303 : on répond à un POST par une redirection GET.\n { status: 303 },\n );\n}\n\n/** client_secret Apple : JWT ES256 signé avec la clé .p8, valable 5 min. */\nasync function appleClientSecret(clientId: string): Promise {\n const teamId = process.env.APPLE_TEAM_ID;\n const keyId = process.env.APPLE_KEY_ID;\n const pem = process.env.APPLE_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n if (!teamId || !keyId || !pem) return null;\n const key = await importPKCS8(pem, \"ES256\");\n return await new SignJWT({})\n .setProtectedHeader({ alg: \"ES256\", kid: keyId })\n .setIssuedAt()\n .setIssuer(teamId)\n .setSubject(clientId)\n .setAudience(\"https://appleid.apple.com\")\n .setExpirationTime(\"5m\")\n .sign(key);\n}\n\nexport async function POST(req: NextRequest) {\n const clientId = process.env.APPLE_CLIENT_ID;\n if (!clientId) return fail(\"apple-non-configure\");\n const clientSecret = await appleClientSecret(clientId).catch(() => null);\n if (!clientSecret) return fail(\"apple-non-configure\");\n\n const form = await req.formData().catch(() => null);\n if (!form) return fail(\"etat-oauth-invalide\");\n if (form.get(\"error\")) return fail(\"apple-refuse\");\n\n const code = form.get(\"code\")?.toString();\n const state = form.get(\"state\")?.toString();\n const cookieState = req.cookies.get(\"ka_apple_state\")?.value;\n const next = safeNext(req.cookies.get(\"ka_apple_next\")?.value);\n if (!code || !state || !cookieState || state !== cookieState)\n return fail(\"etat-oauth-invalide\");\n\n // Nom complet : transmis par Apple UNIQUEMENT à la première autorisation.\n let firstAuthName: string | null = null;\n try {\n const u = JSON.parse(form.get(\"user\")?.toString() ?? \"\") as {\n name?: { firstName?: string; lastName?: string };\n };\n const full = [u.name?.firstName, u.name?.lastName]\n .filter(Boolean)\n .join(\" \")\n .trim();\n if (full) firstAuthName = full;\n } catch {\n /* pas de champ user (connexions suivantes) */\n }\n\n // Échange code → jetons\n const tokenRes = await fetch(\"https://appleid.apple.com/auth/token\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n code,\n client_id: clientId,\n client_secret: clientSecret,\n redirect_uri: `${BASE_URL}/api/auth/callback/apple`,\n grant_type: \"authorization_code\",\n }),\n });\n if (!tokenRes.ok) return fail(\"echange-apple-refuse\");\n const tokens = (await tokenRes.json()) as { id_token?: string };\n if (!tokens.id_token) return fail(\"id-token-absent\");\n\n // Vérification cryptographique de l'id_token\n let claims: {\n sub?: string;\n email?: string;\n email_verified?: boolean | string;\n };\n try {\n const { payload } = await jwtVerify(tokens.id_token, APPLE_JWKS, {\n issuer: \"https://appleid.apple.com\",\n audience: clientId,\n });\n claims = payload as typeof claims;\n } catch {\n return fail(\"id-token-invalide\");\n }\n const emailVerified =\n claims.email_verified === true || claims.email_verified === \"true\";\n if (!claims.sub || !claims.email || !emailVerified)\n return fail(\"profil-apple-incomplet\");\n\n const email = claims.email.toLowerCase();\n const name = firstAuthName ?? email.split(\"@\")[0];\n\n // Upsert : par apple_sub, sinon liaison par courriel, sinon création.\n let user = findUserByAppleSub(claims.sub);\n if (!user) {\n const byEmail = findUserByEmail(email);\n if (byEmail) {\n db.prepare(\"UPDATE users SET apple_sub = ? WHERE id = ?\").run(\n claims.sub,\n byEmail.id,\n );\n user = { ...byEmail, apple_sub: claims.sub };\n } else {\n db.prepare(\n \"INSERT INTO users (email, name, apple_sub) VALUES (?, ?, ?)\",\n ).run(email, name, claims.sub);\n user = findUserByAppleSub(claims.sub)!;\n ensureKaId(user.id);\n }\n }\n\n ensureKaId(user.id);\n touchLastLogin(user.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user.id),\n sessionCookieOptions,\n );\n res.cookies.set(\"ka_apple_state\", \"\", { path: \"/\", maxAge: 0 });\n res.cookies.set(\"ka_apple_next\", \"\", { path: \"/\", maxAge: 0 });\n return res;\n}\n","structuredPatch":[{"oldStart":146,"oldLines":6,"newStart":146,"newLines":7,"lines":[" }"," "," ensureKaId(user.id);","+ markEmailVerified(user.id); // Apple atteste email_verified"," touchLastLogin(user.id);"," const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });"," res.cookies.set("]}],"userModified":false,"replaceAll":false}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRdzgUa4HHUksz8tVSTJ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01XWz7vpku57CRtU9J8E1m9b","name":"Grep","input":{"pattern":"from \"@/lib/db\"","path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","output_mode":"content"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":1837,"cache_read_input_tokens":88219,"cache_creation":{"ephemeral_5m_input_tokens":1837,"ephemeral_1h_input_tokens":0},"output_tokens":20,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"bd8b17a4-170c-447f-a5b7-d298aefa06b8"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01XWz7vpku57CRtU9J8E1m9b","type":"tool_result","content":"20:} from \"@/lib/db\";"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"e3f15936-356f-41ce-9fe4-30ab145f1a15","timestamp":"2026-08-26T16:00:27.649Z","tool_use_result":{"mode":"content","numFiles":0,"filenames":[],"content":"20:} from \"@/lib/db\";","numLines":1}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"e525aefa-e505-4aca-8db1-ed473a9524f0","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRe1AgxbYBGpQm97484i","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01EiLkeUTeAHqJEuknaxTiCn","name":"Read","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","offset":10,"limit":12},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":568,"cache_read_input_tokens":90056,"cache_creation":{"ephemeral_5m_input_tokens":568,"ephemeral_1h_input_tokens":0},"output_tokens":14,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a6565675-7895-4eaa-b708-7334a0032ff4"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01EiLkeUTeAHqJEuknaxTiCn","type":"tool_result","content":"10\t// - le nom (`user`) n'est transmis qu'à la PREMIÈRE autorisation ;\n11\t// - email_verified peut être un booléen ou la chaîne \"true\".\n12\timport { NextRequest, NextResponse } from \"next/server\";\n13\timport { createRemoteJWKSet, jwtVerify, SignJWT, importPKCS8 } from \"jose\";\n14\timport {\n15\t db,\n16\t findUserByEmail,\n17\t findUserByAppleSub,\n18\t ensureKaId,\n19\t touchLastLogin,\n20\t} from \"@/lib/db\";\n21\timport {"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"684dd4ec-5c17-4e13-99c3-4b49d901321d","timestamp":"2026-08-26T16:00:31.266Z","tool_use_result":{"type":"text","file":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","content":"// - le nom (`user`) n'est transmis qu'à la PREMIÈRE autorisation ;\n// - email_verified peut être un booléen ou la chaîne \"true\".\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { createRemoteJWKSet, jwtVerify, SignJWT, importPKCS8 } from \"jose\";\nimport {\n db,\n findUserByEmail,\n findUserByAppleSub,\n ensureKaId,\n touchLastLogin,\n} from \"@/lib/db\";\nimport {","numLines":12,"startLine":10,"totalLines":161}}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"499782e1-5d2f-45bb-ba5e-b9e15b72c14e","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRe1S2wd5WtGps9SUg4E","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01HWqAQ25CkJ2o2Kv5NP4nLq","name":"Edit","input":{"replace_all":false,"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","old_string":" ensureKaId,\n touchLastLogin,\n} from \"@/lib/db\";","new_string":" ensureKaId,\n touchLastLogin,\n markEmailVerified,\n} from \"@/lib/db\";"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":347,"cache_read_input_tokens":90624,"cache_creation":{"ephemeral_5m_input_tokens":347,"ephemeral_1h_input_tokens":0},"output_tokens":20,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"6bcdc785-0cc9-462e-aa62-64789d3b4bad"}} {"type":"permission_auto","tool":"Edit","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","old_string":" ensureKaId,\n touchLastLogin,\n} from \"@/lib/db\";","new_string":" ensureKaId,\n touchLastLogin,\n markEmailVerified,\n} from \"@/lib/db\";","replace_all":false}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01HWqAQ25CkJ2o2Kv5NP4nLq","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"419acfd2-13cd-43ee-95c8-a9e6cd5beedc","timestamp":"2026-08-26T16:00:35.499Z","tool_use_result":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/api/auth/callback/apple/route.ts","oldString":" ensureKaId,\n touchLastLogin,\n} from \"@/lib/db\";","newString":" ensureKaId,\n touchLastLogin,\n markEmailVerified,\n} from \"@/lib/db\";","originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Retour du flux Sign in with Apple : échange du code, vérification de\n// l'id_token (JWKS Apple), création/liaison du KA ID, ouverture de session.\n//\n// Différences avec Google :\n// - le retour arrive en POST (form_post) et non en GET ;\n// - le client_secret est un JWT ES256 signé avec la clé privée .p8\n// (APPLE_TEAM_ID / APPLE_KEY_ID / APPLE_PRIVATE_KEY), regénéré à chaque\n// échange ;\n// - le nom (`user`) n'est transmis qu'à la PREMIÈRE autorisation ;\n// - email_verified peut être un booléen ou la chaîne \"true\".\nimport { NextRequest, NextResponse } from \"next/server\";\nimport { createRemoteJWKSet, jwtVerify, SignJWT, importPKCS8 } from \"jose\";\nimport {\n db,\n findUserByEmail,\n findUserByAppleSub,\n ensureKaId,\n touchLastLogin,\n} from \"@/lib/db\";\nimport {\n BASE_URL,\n mintSessionToken,\n SESSION_COOKIE,\n sessionCookieOptions,\n safeNext,\n} from \"@/lib/auth\";\n\nconst APPLE_JWKS = createRemoteJWKSet(\n new URL(\"https://appleid.apple.com/auth/keys\"),\n);\n\nfunction fail(reason: string) {\n return NextResponse.redirect(\n new URL(`/connexion?error=${encodeURIComponent(reason)}`, BASE_URL),\n // 303 : on répond à un POST par une redirection GET.\n { status: 303 },\n );\n}\n\n/** client_secret Apple : JWT ES256 signé avec la clé .p8, valable 5 min. */\nasync function appleClientSecret(clientId: string): Promise {\n const teamId = process.env.APPLE_TEAM_ID;\n const keyId = process.env.APPLE_KEY_ID;\n const pem = process.env.APPLE_PRIVATE_KEY?.replace(/\\\\n/g, \"\\n\");\n if (!teamId || !keyId || !pem) return null;\n const key = await importPKCS8(pem, \"ES256\");\n return await new SignJWT({})\n .setProtectedHeader({ alg: \"ES256\", kid: keyId })\n .setIssuedAt()\n .setIssuer(teamId)\n .setSubject(clientId)\n .setAudience(\"https://appleid.apple.com\")\n .setExpirationTime(\"5m\")\n .sign(key);\n}\n\nexport async function POST(req: NextRequest) {\n const clientId = process.env.APPLE_CLIENT_ID;\n if (!clientId) return fail(\"apple-non-configure\");\n const clientSecret = await appleClientSecret(clientId).catch(() => null);\n if (!clientSecret) return fail(\"apple-non-configure\");\n\n const form = await req.formData().catch(() => null);\n if (!form) return fail(\"etat-oauth-invalide\");\n if (form.get(\"error\")) return fail(\"apple-refuse\");\n\n const code = form.get(\"code\")?.toString();\n const state = form.get(\"state\")?.toString();\n const cookieState = req.cookies.get(\"ka_apple_state\")?.value;\n const next = safeNext(req.cookies.get(\"ka_apple_next\")?.value);\n if (!code || !state || !cookieState || state !== cookieState)\n return fail(\"etat-oauth-invalide\");\n\n // Nom complet : transmis par Apple UNIQUEMENT à la première autorisation.\n let firstAuthName: string | null = null;\n try {\n const u = JSON.parse(form.get(\"user\")?.toString() ?? \"\") as {\n name?: { firstName?: string; lastName?: string };\n };\n const full = [u.name?.firstName, u.name?.lastName]\n .filter(Boolean)\n .join(\" \")\n .trim();\n if (full) firstAuthName = full;\n } catch {\n /* pas de champ user (connexions suivantes) */\n }\n\n // Échange code → jetons\n const tokenRes = await fetch(\"https://appleid.apple.com/auth/token\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/x-www-form-urlencoded\" },\n body: new URLSearchParams({\n code,\n client_id: clientId,\n client_secret: clientSecret,\n redirect_uri: `${BASE_URL}/api/auth/callback/apple`,\n grant_type: \"authorization_code\",\n }),\n });\n if (!tokenRes.ok) return fail(\"echange-apple-refuse\");\n const tokens = (await tokenRes.json()) as { id_token?: string };\n if (!tokens.id_token) return fail(\"id-token-absent\");\n\n // Vérification cryptographique de l'id_token\n let claims: {\n sub?: string;\n email?: string;\n email_verified?: boolean | string;\n };\n try {\n const { payload } = await jwtVerify(tokens.id_token, APPLE_JWKS, {\n issuer: \"https://appleid.apple.com\",\n audience: clientId,\n });\n claims = payload as typeof claims;\n } catch {\n return fail(\"id-token-invalide\");\n }\n const emailVerified =\n claims.email_verified === true || claims.email_verified === \"true\";\n if (!claims.sub || !claims.email || !emailVerified)\n return fail(\"profil-apple-incomplet\");\n\n const email = claims.email.toLowerCase();\n const name = firstAuthName ?? email.split(\"@\")[0];\n\n // Upsert : par apple_sub, sinon liaison par courriel, sinon création.\n let user = findUserByAppleSub(claims.sub);\n if (!user) {\n const byEmail = findUserByEmail(email);\n if (byEmail) {\n db.prepare(\"UPDATE users SET apple_sub = ? WHERE id = ?\").run(\n claims.sub,\n byEmail.id,\n );\n user = { ...byEmail, apple_sub: claims.sub };\n } else {\n db.prepare(\n \"INSERT INTO users (email, name, apple_sub) VALUES (?, ?, ?)\",\n ).run(email, name, claims.sub);\n user = findUserByAppleSub(claims.sub)!;\n ensureKaId(user.id);\n }\n }\n\n ensureKaId(user.id);\n markEmailVerified(user.id); // Apple atteste email_verified\n touchLastLogin(user.id);\n const res = NextResponse.redirect(new URL(next, BASE_URL), { status: 303 });\n res.cookies.set(\n SESSION_COOKIE,\n await mintSessionToken(user.id),\n sessionCookieOptions,\n );\n res.cookies.set(\"ka_apple_state\", \"\", { path: \"/\", maxAge: 0 });\n res.cookies.set(\"ka_apple_next\", \"\", { path: \"/\", maxAge: 0 });\n return res;\n}\n","structuredPatch":[{"oldStart":17,"oldLines":6,"newStart":17,"newLines":7,"lines":[" findUserByAppleSub,"," ensureKaId,"," touchLastLogin,","+ markEmailVerified,"," } from \"@/lib/db\";"," import {"," BASE_URL,"]}],"userModified":false,"replaceAll":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"531cdeb5-b751-41fe-a667-14d1f431fd94","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRe1kPFPxhDcwzFcjThz","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAISxQYKpwEIERgCKkAg7YW74aHqC4eHkNpQSpG/i51XU6O7nVOf52e/d0lWzZk8s9lAlpYOtSgWRsRqoCTFdIHiFfK47dkLj1Hl29EZMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAGpm7zUBrABAhIM5p8B6kkNtbLa47dnGgy2cpsuskx0mLGim+wiMAr57eds6n6OeJfY38CQRgml65s1IucT8rIYy2t/O84MgHJMoaEa48s7OcUiRuctuCrKBO/JgP+6i8hh5O3xlo7n3RlBBRyHjjZ5cYB+xo10NkhUBC0y9Qwffhwo6yl1jViL4lFtOjp0H+oWi5SLeWNbrEALbb6rgoK279v/uo1AVszTE/Wl4EvvJNkajDH632DaqQ82EFOiE+bAlvcAiAD7JsK9F2TjNTQPTaZZu3KkADkmcXeP45/eRDmrEI7b8nq+GIDP+HCMfKcRFxvNYSsFeEE9JugJxsI8VJjc8cuKMiv6veChRw7G1Dy9uFRHXu7JmOKwycrzEstmqpQKHi2hSFvyaZdMR3bDPYrUgeWY+gkSYSpaGZp1VlFAEM5wUBiyQT0fpXX35Btf2fQr54gsbTxpCiDhjAmqIxN1gSRxEVyBjlDnwUX3w6CNv8TzgMZC7g4j1V65zpJ54EiWcCGkpnJ5hu+x/jbC3AT+wn9y1D3Z7ZcGvd5+Er62lpX2GO0ByuCV/hazUdDcfZF/gbWaduaGAtpGy01I4C2KHmW/bAYJWwv0ia3uXVLmaraiu/mwIIub5V8Sih9DWhIdfwCOa+35gq0IC4Qdzvx64t0ev9thdz+sYsBUAuNcsG/gFz/vrKxdDBhi3+qdrbKaZEMn3j/220pEJuUC9KkVB7RvRtIK4uUOiUedeV2GC/ATtga/5d3yOJFfTyAjlIDdb87UWqaGqn+hqF6QnupxuJd9UOeZxmP86lxbPM6X+F3JW7gknhjTt2s9w8LvFR+aIZwD6UmjyUIuod4dKU//gZNwdx7qA17VVC7xTQh2JY7iXZJk6U5JH3O3ST6P5D8YAQ=="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":285,"cache_read_input_tokens":90971,"cache_creation":{"ephemeral_5m_input_tokens":285,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"71847e15-de82-4437-b684-c4d492a4b451"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRe1kPFPxhDcwzFcjThz","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01TNGEy6Y1iKBDqyNjTEe26j","name":"TodoWrite","input":{"todos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"completed","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"completed","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"completed","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"completed","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"in_progress","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}]},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":285,"cache_read_input_tokens":90971,"cache_creation":{"ephemeral_5m_input_tokens":285,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"6481088c-1cf4-40f9-9b7a-a1ac59c37faf"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01TNGEy6Y1iKBDqyNjTEe26j","type":"tool_result","content":"Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"0560e1f0-8359-48cd-a036-2a7056100d80","timestamp":"2026-08-26T16:00:45.787Z","tool_use_result":{"oldTodos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"completed","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"completed","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"completed","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"in_progress","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"pending","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}],"newTodos":[{"content":"DB : colonne email_verified + table auth_tokens + helpers","status":"completed","activeForm":"Ajout du schéma email_verified et auth_tokens"},{"content":"Lib email Resend (src/lib/email.ts) + clé dans .env.local","status":"completed","activeForm":"Création de la lib email Resend"},{"content":"Routes : register (vérif email), login (code 2FA), 2fa, magic, verify links","status":"completed","activeForm":"Écriture des routes d'auth email"},{"content":"Callbacks Google/Apple : marquer email_verified","status":"completed","activeForm":"Mise à jour des callbacks OAuth"},{"content":"Frontend AuthForm : étape code, magic link, message de confirmation","status":"in_progress","activeForm":"Mise à jour du formulaire de connexion"},{"content":"Build, pm2 restart, healthcheck, test des flux","status":"pending","activeForm":"Build et redéploiement"},{"content":"Commit + push origin main (spbgit)","status":"pending","activeForm":"Commit et push"}],"verificationNudgeNeeded":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"3a0a09ff-974e-4f60-8c86-761be6f300ac","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRe2WS8rTsNhxcULdPoH","type":"message","role":"assistant","content":[{"type":"text","text":"Maintenant le formulaire de connexion : étape code 2FA, bouton « lien de connexion sans mot de passe », écrans « courriel envoyé »."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":759,"cache_read_input_tokens":91256,"cache_creation":{"ephemeral_5m_input_tokens":759,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"fd51eeec-d75f-45c4-abc9-9208fa32084e"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRe2WS8rTsNhxcULdPoH","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_016DsBrBxB7R8KcWnsu6CuDq","name":"Write","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n\"use client\";\n\nimport { useState } from \"react\";\nimport { ROLES } from \"@/lib/roles\";\n\nconst ERRORS: Record = {\n \"google-non-configure\":\n \"La connexion Google n'est pas encore activée sur ce serveur.\",\n \"etat-oauth-invalide\":\n \"La session Google a expiré — réessayez.\",\n \"echange-google-refuse\": \"Google a refusé l'échange — réessayez.\",\n \"id-token-absent\": \"Réponse Google incomplète — réessayez.\",\n \"id-token-invalide\": \"Réponse Google invalide — réessayez.\",\n \"profil-google-incomplet\":\n \"Votre compte Google n'a pas de courriel vérifié.\",\n \"apple-non-configure\":\n \"La connexion Apple n'est pas encore activée sur ce serveur.\",\n \"apple-refuse\": \"La connexion Apple a été annulée — réessayez.\",\n \"echange-apple-refuse\": \"Apple a refusé l'échange — réessayez.\",\n \"profil-apple-incomplet\":\n \"Votre compte Apple n'a pas de courriel vérifié.\",\n \"jeton-invalide\":\n \"Ce lien est invalide ou expiré — demandez-en un nouveau ci-dessous.\",\n};\n\ntype Step =\n | { kind: \"form\" }\n | { kind: \"code\"; email: string }\n | { kind: \"sent\"; email: string; flavor: \"verify\" | \"magic\" };\n\nexport default function AuthForm({\n next,\n error,\n via,\n}: {\n next: string;\n error?: string;\n via?: string;\n}) {\n const [mode, setMode] = useState<\"login\" | \"register\">(\"login\");\n const [step, setStep] = useState({ kind: \"form\" });\n const [email, setEmail] = useState(\"\");\n const [msg, setMsg] = useState(\n error ? (ERRORS[error] ?? \"Une erreur est survenue — réessayez.\") : null,\n );\n const [busy, setBusy] = useState(false);\n\n async function post(url: string, body: Record) {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = (await res.json().catch(() => ({}))) as {\n error?: string;\n twofa?: boolean;\n verify?: boolean;\n sent?: boolean;\n };\n return { ok: res.ok, data };\n }\n\n async function submit(e: React.FormEvent) {\n e.preventDefault();\n setBusy(true);\n setMsg(null);\n const fd = new FormData(e.currentTarget);\n const body = Object.fromEntries(fd.entries()) as Record;\n const { ok, data } = await post(`/api/auth/${mode}`, { ...body, next });\n setBusy(false);\n if (!ok) {\n setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n return;\n }\n const addr = (body.email ?? \"\").trim().toLowerCase();\n if (data.twofa) setStep({ kind: \"code\", email: addr });\n else if (data.verify) setStep({ kind: \"sent\", email: addr, flavor: \"verify\" });\n else window.location.href = next;\n }\n\n async function submitCode(e: React.FormEvent) {\n e.preventDefault();\n if (step.kind !== \"code\") return;\n setBusy(true);\n setMsg(null);\n const fd = new FormData(e.currentTarget);\n const { ok, data } = await post(\"/api/auth/2fa\", {\n email: step.email,\n code: String(fd.get(\"code\") ?? \"\"),\n });\n setBusy(false);\n if (ok) window.location.href = next;\n else setMsg(data.error ?? \"Code refusé — réessayez.\");\n }\n\n async function sendMagicLink() {\n const addr = email.trim().toLowerCase();\n if (!addr) {\n setMsg(\"Entrez d'abord votre adresse courriel ci-dessus.\");\n return;\n }\n setBusy(true);\n setMsg(null);\n const { ok, data } = await post(\"/api/auth/magic\", { email: addr, next });\n setBusy(false);\n if (ok) setStep({ kind: \"sent\", email: addr, flavor: \"magic\" });\n else setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n }\n\n /* ---------- étape « code de confirmation » (2FA) ---------- */\n if (step.kind === \"code\") {\n return (\n
\n

Vérification en deux étapes

\n

\n Un code vous attend\n

\n

\n Nous avons envoyé un code à 6 chiffres à{\" \"}\n {step.email}. Il expire dans 10 minutes.\n

\n
\n \n {msg && (\n

\n {msg}\n

\n )}\n \n
\n {\n setStep({ kind: \"form\" });\n setMsg(null);\n }}\n >\n ← Revenir à la connexion\n \n
\n );\n }\n\n /* ---------- étape « courriel envoyé » (vérification / lien magique) ---------- */\n if (step.kind === \"sent\") {\n return (\n
\n

Courriel envoyé

\n

\n {step.flavor === \"verify\"\n ? \"Confirmez votre adresse\"\n : \"Votre lien de connexion est parti\"}\n

\n

\n {step.flavor === \"verify\" ? (\n <>\n Un lien de confirmation a été envoyé à{\" \"}\n {step.email}. Cliquez-le pour activer votre\n KA ID — vous serez connecté automatiquement. Le lien est valable\n 24 heures.\n \n ) : (\n <>\n Si un KA ID existe pour {step.email}, un lien de\n connexion vient d'y être envoyé. Il est valable 15 minutes\n et ne sert qu'une fois.\n \n )}\n

\n

\n Rien reçu ? Vérifiez vos indésirables, puis réessayez.\n

\n {\n setStep({ kind: \"form\" });\n setMsg(null);\n }}\n >\n ← Revenir à la connexion\n \n
\n );\n }\n\n /* ---------- formulaire principal ---------- */\n return (\n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}\n\n \n {/* « G » officiel Google — couleurs de marque */}\n \n \n \n \n \n \n Continuer avec Google\n \n\n \n {/* Pomme Apple — blanche sur noir, style officiel */}\n \n \n \n Continuer avec Apple\n \n\n
\n \n ou par courriel\n \n
\n\n
\n {(\n [\n [\"login\", \"Se connecter\"],\n [\"register\", \"Créer un compte\"],\n ] as const\n ).map(([m, label]) => (\n {\n setMode(m);\n setMsg(null);\n }}\n className={`btn ${mode === m ? \"btn-lime\" : \"btn-ghost\"} !min-h-[40px] !text-[13px]`}\n type=\"button\"\n >\n {label}\n \n ))}\n
\n\n
\n {mode === \"register\" && (\n <>\n \n
\n Vous êtes…\n
\n {Object.entries(ROLES).map(([value, r]) => (\n \n \n \n \n {r.label}\n \n \n {r.desc}\n \n \n \n ))}\n
\n

\n Ce statut sera affiché sur votre carte de membre.\n

\n
\n \n )}\n \n \n\n {msg && (\n

\n {msg}\n

\n )}\n\n \n\n {mode === \"login\" && (\n <>\n

\n Un code de confirmation vous sera envoyé par courriel.\n

\n \n Recevoir un lien de connexion — sans mot de passe\n \n \n )}\n {mode === \"register\" && (\n

\n Un lien de confirmation sera envoyé pour valider votre adresse.\n

\n )}\n \n\n

\n Un seul compte — le KA ID —\n pour toutes les plateformes du groupe. En continuant, vous acceptez\n les{\" \"}\n \n conditions d'utilisation\n {\" \"}\n et la{\" \"}\n \n politique de confidentialité\n \n .\n

\n
\n );\n}\n"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":759,"cache_read_input_tokens":91256,"cache_creation":{"ephemeral_5m_input_tokens":759,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"4cd48948-9ca3-46a7-ba9a-faa3b67a850f"}} {"type":"permission_auto","tool":"Write","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n\"use client\";\n\nimport { useState } from \"react\";\nimport { ROLES } from \"@/lib/roles\";\n\nconst ERRORS: Record = {\n \"google-non-configure\":\n \"La connexion Google n'est pas encore activée sur ce serveur.\",\n \"etat-oauth-invalide\":\n \"La session Google a expiré — réessayez.\",\n \"echange-google-refuse\": \"Google a refusé l'échange — réessayez.\",\n \"id-token-absent\": \"Réponse Google incomplète — réessayez.\",\n \"id-token-invalide\": \"Réponse Google invalide — réessayez.\",\n \"profil-google-incomplet\":\n \"Votre compte Google n'a pas de courriel vérifié.\",\n \"apple-non-configure\":\n \"La connexion Apple n'est pas encore activée sur ce serveur.\",\n \"apple-refuse\": \"La connexion Apple a été annulée — réessayez.\",\n \"echange-apple-refuse\": \"Apple a refusé l'échange — réessayez.\",\n \"profil-apple-incomplet\":\n \"Votre compte Apple n'a pas de courriel vérifié.\",\n \"jeton-invalide\":\n \"Ce lien est invalide ou expiré — demandez-en un nouveau ci-dessous.\",\n};\n\ntype Step =\n | { kind: \"form\" }\n | { kind: \"code\"; email: string }\n | { kind: \"sent\"; email: string; flavor: \"verify\" | \"magic\" };\n\nexport default function AuthForm({\n next,\n error,\n via,\n}: {\n next: string;\n error?: string;\n via?: string;\n}) {\n const [mode, setMode] = useState<\"login\" | \"register\">(\"login\");\n const [step, setStep] = useState({ kind: \"form\" });\n const [email, setEmail] = useState(\"\");\n const [msg, setMsg] = useState(\n error ? (ERRORS[error] ?? \"Une erreur est survenue — réessayez.\") : null,\n );\n const [busy, setBusy] = useState(false);\n\n async function post(url: string, body: Record) {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = (await res.json().catch(() => ({}))) as {\n error?: string;\n twofa?: boolean;\n verify?: boolean;\n sent?: boolean;\n };\n return { ok: res.ok, data };\n }\n\n async function submit(e: React.FormEvent) {\n e.preventDefault();\n setBusy(true);\n setMsg(null);\n const fd = new FormData(e.currentTarget);\n const body = Object.fromEntries(fd.entries()) as Record;\n const { ok, data } = await post(`/api/auth/${mode}`, { ...body, next });\n setBusy(false);\n if (!ok) {\n setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n return;\n }\n const addr = (body.email ?? \"\").trim().toLowerCase();\n if (data.twofa) setStep({ kind: \"code\", email: addr });\n else if (data.verify) setStep({ kind: \"sent\", email: addr, flavor: \"verify\" });\n else window.location.href = next;\n }\n\n async function submitCode(e: React.FormEvent) {\n e.preventDefault();\n if (step.kind !== \"code\") return;\n setBusy(true);\n setMsg(null);\n const fd = new FormData(e.currentTarget);\n const { ok, data } = await post(\"/api/auth/2fa\", {\n email: step.email,\n code: String(fd.get(\"code\") ?? \"\"),\n });\n setBusy(false);\n if (ok) window.location.href = next;\n else setMsg(data.error ?? \"Code refusé — réessayez.\");\n }\n\n async function sendMagicLink() {\n const addr = email.trim().toLowerCase();\n if (!addr) {\n setMsg(\"Entrez d'abord votre adresse courriel ci-dessus.\");\n return;\n }\n setBusy(true);\n setMsg(null);\n const { ok, data } = await post(\"/api/auth/magic\", { email: addr, next });\n setBusy(false);\n if (ok) setStep({ kind: \"sent\", email: addr, flavor: \"magic\" });\n else setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n }\n\n /* ---------- étape « code de confirmation » (2FA) ---------- */\n if (step.kind === \"code\") {\n return (\n
\n

Vérification en deux étapes

\n

\n Un code vous attend\n

\n

\n Nous avons envoyé un code à 6 chiffres à{\" \"}\n {step.email}. Il expire dans 10 minutes.\n

\n
\n \n {msg && (\n

\n {msg}\n

\n )}\n \n
\n {\n setStep({ kind: \"form\" });\n setMsg(null);\n }}\n >\n ← Revenir à la connexion\n \n
\n );\n }\n\n /* ---------- étape « courriel envoyé » (vérification / lien magique) ---------- */\n if (step.kind === \"sent\") {\n return (\n
\n

Courriel envoyé

\n

\n {step.flavor === \"verify\"\n ? \"Confirmez votre adresse\"\n : \"Votre lien de connexion est parti\"}\n

\n

\n {step.flavor === \"verify\" ? (\n <>\n Un lien de confirmation a été envoyé à{\" \"}\n {step.email}. Cliquez-le pour activer votre\n KA ID — vous serez connecté automatiquement. Le lien est valable\n 24 heures.\n \n ) : (\n <>\n Si un KA ID existe pour {step.email}, un lien de\n connexion vient d'y être envoyé. Il est valable 15 minutes\n et ne sert qu'une fois.\n \n )}\n

\n

\n Rien reçu ? Vérifiez vos indésirables, puis réessayez.\n

\n {\n setStep({ kind: \"form\" });\n setMsg(null);\n }}\n >\n ← Revenir à la connexion\n \n
\n );\n }\n\n /* ---------- formulaire principal ---------- */\n return (\n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}\n\n \n {/* « G » officiel Google — couleurs de marque */}\n \n \n \n \n \n \n Continuer avec Google\n \n\n \n {/* Pomme Apple — blanche sur noir, style officiel */}\n \n \n \n Continuer avec Apple\n \n\n
\n \n ou par courriel\n \n
\n\n
\n {(\n [\n [\"login\", \"Se connecter\"],\n [\"register\", \"Créer un compte\"],\n ] as const\n ).map(([m, label]) => (\n {\n setMode(m);\n setMsg(null);\n }}\n className={`btn ${mode === m ? \"btn-lime\" : \"btn-ghost\"} !min-h-[40px] !text-[13px]`}\n type=\"button\"\n >\n {label}\n \n ))}\n
\n\n
\n {mode === \"register\" && (\n <>\n \n
\n Vous êtes…\n
\n {Object.entries(ROLES).map(([value, r]) => (\n \n \n \n \n {r.label}\n \n \n {r.desc}\n \n \n \n ))}\n
\n

\n Ce statut sera affiché sur votre carte de membre.\n

\n
\n \n )}\n \n \n\n {msg && (\n

\n {msg}\n

\n )}\n\n \n\n {mode === \"login\" && (\n <>\n

\n Un code de confirmation vous sera envoyé par courriel.\n

\n \n Recevoir un lien de connexion — sans mot de passe\n \n \n )}\n {mode === \"register\" && (\n

\n Un lien de confirmation sera envoyé pour valider votre adresse.\n

\n )}\n \n\n

\n Un seul compte — le KA ID —\n pour toutes les plateformes du groupe. En continuant, vous acceptez\n les{\" \"}\n \n conditions d'utilisation\n {\" \"}\n et la{\" \"}\n \n politique de confidentialité\n \n .\n

\n
\n );\n}\n"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_016DsBrBxB7R8KcWnsu6CuDq","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"5f7f2e1d-8f67-4b12-88ba-05ad2253e974","timestamp":"2026-08-26T16:01:44.366Z","tool_use_result":{"type":"update","filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n\"use client\";\n\nimport { useState } from \"react\";\nimport { ROLES } from \"@/lib/roles\";\n\nconst ERRORS: Record = {\n \"google-non-configure\":\n \"La connexion Google n'est pas encore activée sur ce serveur.\",\n \"etat-oauth-invalide\":\n \"La session Google a expiré — réessayez.\",\n \"echange-google-refuse\": \"Google a refusé l'échange — réessayez.\",\n \"id-token-absent\": \"Réponse Google incomplète — réessayez.\",\n \"id-token-invalide\": \"Réponse Google invalide — réessayez.\",\n \"profil-google-incomplet\":\n \"Votre compte Google n'a pas de courriel vérifié.\",\n \"apple-non-configure\":\n \"La connexion Apple n'est pas encore activée sur ce serveur.\",\n \"apple-refuse\": \"La connexion Apple a été annulée — réessayez.\",\n \"echange-apple-refuse\": \"Apple a refusé l'échange — réessayez.\",\n \"profil-apple-incomplet\":\n \"Votre compte Apple n'a pas de courriel vérifié.\",\n \"jeton-invalide\":\n \"Ce lien est invalide ou expiré — demandez-en un nouveau ci-dessous.\",\n};\n\ntype Step =\n | { kind: \"form\" }\n | { kind: \"code\"; email: string }\n | { kind: \"sent\"; email: string; flavor: \"verify\" | \"magic\" };\n\nexport default function AuthForm({\n next,\n error,\n via,\n}: {\n next: string;\n error?: string;\n via?: string;\n}) {\n const [mode, setMode] = useState<\"login\" | \"register\">(\"login\");\n const [step, setStep] = useState({ kind: \"form\" });\n const [email, setEmail] = useState(\"\");\n const [msg, setMsg] = useState(\n error ? (ERRORS[error] ?? \"Une erreur est survenue — réessayez.\") : null,\n );\n const [busy, setBusy] = useState(false);\n\n async function post(url: string, body: Record) {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = (await res.json().catch(() => ({}))) as {\n error?: string;\n twofa?: boolean;\n verify?: boolean;\n sent?: boolean;\n };\n return { ok: res.ok, data };\n }\n\n async function submit(e: React.FormEvent) {\n e.preventDefault();\n setBusy(true);\n setMsg(null);\n const fd = new FormData(e.currentTarget);\n const body = Object.fromEntries(fd.entries()) as Record;\n const { ok, data } = await post(`/api/auth/${mode}`, { ...body, next });\n setBusy(false);\n if (!ok) {\n setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n return;\n }\n const addr = (body.email ?? \"\").trim().toLowerCase();\n if (data.twofa) setStep({ kind: \"code\", email: addr });\n else if (data.verify) setStep({ kind: \"sent\", email: addr, flavor: \"verify\" });\n else window.location.href = next;\n }\n\n async function submitCode(e: React.FormEvent) {\n e.preventDefault();\n if (step.kind !== \"code\") return;\n setBusy(true);\n setMsg(null);\n const fd = new FormData(e.currentTarget);\n const { ok, data } = await post(\"/api/auth/2fa\", {\n email: step.email,\n code: String(fd.get(\"code\") ?? \"\"),\n });\n setBusy(false);\n if (ok) window.location.href = next;\n else setMsg(data.error ?? \"Code refusé — réessayez.\");\n }\n\n async function sendMagicLink() {\n const addr = email.trim().toLowerCase();\n if (!addr) {\n setMsg(\"Entrez d'abord votre adresse courriel ci-dessus.\");\n return;\n }\n setBusy(true);\n setMsg(null);\n const { ok, data } = await post(\"/api/auth/magic\", { email: addr, next });\n setBusy(false);\n if (ok) setStep({ kind: \"sent\", email: addr, flavor: \"magic\" });\n else setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n }\n\n /* ---------- étape « code de confirmation » (2FA) ---------- */\n if (step.kind === \"code\") {\n return (\n
\n

Vérification en deux étapes

\n

\n Un code vous attend\n

\n

\n Nous avons envoyé un code à 6 chiffres à{\" \"}\n {step.email}. Il expire dans 10 minutes.\n

\n
\n \n {msg && (\n

\n {msg}\n

\n )}\n \n
\n {\n setStep({ kind: \"form\" });\n setMsg(null);\n }}\n >\n ← Revenir à la connexion\n \n
\n );\n }\n\n /* ---------- étape « courriel envoyé » (vérification / lien magique) ---------- */\n if (step.kind === \"sent\") {\n return (\n
\n

Courriel envoyé

\n

\n {step.flavor === \"verify\"\n ? \"Confirmez votre adresse\"\n : \"Votre lien de connexion est parti\"}\n

\n

\n {step.flavor === \"verify\" ? (\n <>\n Un lien de confirmation a été envoyé à{\" \"}\n {step.email}. Cliquez-le pour activer votre\n KA ID — vous serez connecté automatiquement. Le lien est valable\n 24 heures.\n \n ) : (\n <>\n Si un KA ID existe pour {step.email}, un lien de\n connexion vient d'y être envoyé. Il est valable 15 minutes\n et ne sert qu'une fois.\n \n )}\n

\n

\n Rien reçu ? Vérifiez vos indésirables, puis réessayez.\n

\n {\n setStep({ kind: \"form\" });\n setMsg(null);\n }}\n >\n ← Revenir à la connexion\n \n
\n );\n }\n\n /* ---------- formulaire principal ---------- */\n return (\n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}\n\n \n {/* « G » officiel Google — couleurs de marque */}\n \n \n \n \n \n \n Continuer avec Google\n \n\n \n {/* Pomme Apple — blanche sur noir, style officiel */}\n \n \n \n Continuer avec Apple\n \n\n
\n \n ou par courriel\n \n
\n\n
\n {(\n [\n [\"login\", \"Se connecter\"],\n [\"register\", \"Créer un compte\"],\n ] as const\n ).map(([m, label]) => (\n {\n setMode(m);\n setMsg(null);\n }}\n className={`btn ${mode === m ? \"btn-lime\" : \"btn-ghost\"} !min-h-[40px] !text-[13px]`}\n type=\"button\"\n >\n {label}\n \n ))}\n
\n\n
\n {mode === \"register\" && (\n <>\n \n
\n Vous êtes…\n
\n {Object.entries(ROLES).map(([value, r]) => (\n \n \n \n \n {r.label}\n \n \n {r.desc}\n \n \n \n ))}\n
\n

\n Ce statut sera affiché sur votre carte de membre.\n

\n
\n \n )}\n \n \n\n {msg && (\n

\n {msg}\n

\n )}\n\n \n\n {mode === \"login\" && (\n <>\n

\n Un code de confirmation vous sera envoyé par courriel.\n

\n \n Recevoir un lien de connexion — sans mot de passe\n \n \n )}\n {mode === \"register\" && (\n

\n Un lien de confirmation sera envoyé pour valider votre adresse.\n

\n )}\n \n\n

\n Un seul compte — le KA ID —\n pour toutes les plateformes du groupe. En continuant, vous acceptez\n les{\" \"}\n \n conditions d'utilisation\n {\" \"}\n et la{\" \"}\n \n politique de confidentialité\n \n .\n

\n
\n );\n}\n","structuredPatch":[{"oldStart":20,"oldLines":8,"newStart":20,"newLines":15,"lines":[" \"echange-apple-refuse\": \"Apple a refusé l'échange — réessayez.\","," \"profil-apple-incomplet\":"," \"Votre compte Apple n'a pas de courriel vérifié.\",","+ \"jeton-invalide\":","+ \"Ce lien est invalide ou expiré — demandez-en un nouveau ci-dessous.\","," };"," ","+type Step =","+ | { kind: \"form\" }","+ | { kind: \"code\"; email: string }","+ | { kind: \"sent\"; email: string; flavor: \"verify\" | \"magic\" };","+"," export default function AuthForm({"," next,"," error,"]},{"oldStart":32,"oldLines":31,"newStart":39,"newLines":170,"lines":[" via?: string;"," }) {"," const [mode, setMode] = useState<\"login\" | \"register\">(\"login\");","+ const [step, setStep] = useState({ kind: \"form\" });","+ const [email, setEmail] = useState(\"\");"," const [msg, setMsg] = useState("," error ? (ERRORS[error] ?? \"Une erreur est survenue — réessayez.\") : null,"," );"," const [busy, setBusy] = useState(false);"," ","+ async function post(url: string, body: Record) {","+ const res = await fetch(url, {","+ method: \"POST\",","+ headers: { \"Content-Type\": \"application/json\" },","+ body: JSON.stringify(body),","+ });","+ const data = (await res.json().catch(() => ({}))) as {","+ error?: string;","+ twofa?: boolean;","+ verify?: boolean;","+ sent?: boolean;","+ };","+ return { ok: res.ok, data };","+ }","+"," async function submit(e: React.FormEvent) {"," e.preventDefault();"," setBusy(true);"," setMsg(null);"," const fd = new FormData(e.currentTarget);","- const body = Object.fromEntries(fd.entries());","- const res = await fetch(`/api/auth/${mode}`, {","- method: \"POST\",","- headers: { \"Content-Type\": \"application/json\" },","- body: JSON.stringify(body),","- });","- const data = await res.json().catch(() => ({}));","- if (res.ok) {","- window.location.href = next;","- } else {","+ const body = Object.fromEntries(fd.entries()) as Record;","+ const { ok, data } = await post(`/api/auth/${mode}`, { ...body, next });","+ setBusy(false);","+ if (!ok) {"," setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");","- setBusy(false);","+ return;"," }","+ const addr = (body.email ?? \"\").trim().toLowerCase();","+ if (data.twofa) setStep({ kind: \"code\", email: addr });","+ else if (data.verify) setStep({ kind: \"sent\", email: addr, flavor: \"verify\" });","+ else window.location.href = next;"," }"," ","+ async function submitCode(e: React.FormEvent) {","+ e.preventDefault();","+ if (step.kind !== \"code\") return;","+ setBusy(true);","+ setMsg(null);","+ const fd = new FormData(e.currentTarget);","+ const { ok, data } = await post(\"/api/auth/2fa\", {","+ email: step.email,","+ code: String(fd.get(\"code\") ?? \"\"),","+ });","+ setBusy(false);","+ if (ok) window.location.href = next;","+ else setMsg(data.error ?? \"Code refusé — réessayez.\");","+ }","+","+ async function sendMagicLink() {","+ const addr = email.trim().toLowerCase();","+ if (!addr) {","+ setMsg(\"Entrez d'abord votre adresse courriel ci-dessus.\");","+ return;","+ }","+ setBusy(true);","+ setMsg(null);","+ const { ok, data } = await post(\"/api/auth/magic\", { email: addr, next });","+ setBusy(false);","+ if (ok) setStep({ kind: \"sent\", email: addr, flavor: \"magic\" });","+ else setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");","+ }","+","+ /* ---------- étape « code de confirmation » (2FA) ---------- */","+ if (step.kind === \"code\") {","+ return (","+
","+

Vérification en deux étapes

","+

","+ Un code vous attend","+

","+

","+ Nous avons envoyé un code à 6 chiffres à{\" \"}","+ {step.email}. Il expire dans 10 minutes.","+

","+
","+ ","+ {msg && (","+

","+ {msg}","+

","+ )}","+ ","+
","+ {","+ setStep({ kind: \"form\" });","+ setMsg(null);","+ }}","+ >","+ ← Revenir à la connexion","+ ","+
","+ );","+ }","+","+ /* ---------- étape « courriel envoyé » (vérification / lien magique) ---------- */","+ if (step.kind === \"sent\") {","+ return (","+
","+

Courriel envoyé

","+

","+ {step.flavor === \"verify\"","+ ? \"Confirmez votre adresse\"","+ : \"Votre lien de connexion est parti\"}","+

","+

","+ {step.flavor === \"verify\" ? (","+ <>","+ Un lien de confirmation a été envoyé à{\" \"}","+ {step.email}. Cliquez-le pour activer votre","+ KA ID — vous serez connecté automatiquement. Le lien est valable","+ 24 heures.","+ ","+ ) : (","+ <>","+ Si un KA ID existe pour {step.email}, un lien de","+ connexion vient d'y être envoyé. Il est valable 15 minutes","+ et ne sert qu'une fois.","+ ","+ )}","+

","+

","+ Rien reçu ? Vérifiez vos indésirables, puis réessayez.","+

","+ {","+ setStep({ kind: \"form\" });","+ setMsg(null);","+ }}","+ >","+ ← Revenir à la connexion","+ ","+
","+ );","+ }","+","+ /* ---------- formulaire principal ---------- */"," return (","
"," {via && ("]},{"oldStart":191,"oldLines":6,"newStart":337,"newLines":8,"lines":[" autoComplete=\"email\""," className=\"field mt-[6px]\""," placeholder=\"vous@exemple.com\"","+ value={email}","+ onChange={(e) => setEmail(e.target.value)}"," />"," ","
\n\n {/* -------- carte d'authentification -------- */}\n
\n \n {/* rappel de confiance compact (mobile seulement) */}\n

\n Lien magique · Code 2FA · Loi 25\n

\n
\n \n\n {/* -------- index des plateformes -------- */}\n
\n
\n

Votre KA ID ouvre

\n \n {PLATFORMS.length} plateformes · 1 compte\n \n
\n
\n {PLATFORMS.map((p) => (\n \n \n {p.name}\n \n \n {p.field}\n \n
\n ))}\n \n

\n … et les applications Ka pour iOS et Android. Un profil, une carte de\n membre, des favoris qui vous suivent d'une plateforme à\n l'autre.\n

\n
\n \n );\n}\n"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":424,"cache_read_input_tokens":142438,"cache_creation":{"ephemeral_5m_input_tokens":424,"ephemeral_1h_input_tokens":0},"output_tokens":5,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"b49aa15a-33e1-4954-a479-8eb405938445"}} {"type":"permission_auto","tool":"Write","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Connexion KA ID — composition éditoriale « HQ » : héros display à gauche,\n// carte d'authentification à droite, index des plateformes en filets.\nimport type { Metadata } from \"next\";\nimport { redirect } from \"next/navigation\";\nimport { getSessionUser, safeNext } from \"@/lib/auth\";\nimport { SSO_CLIENTS } from \"@/lib/sso\";\nimport AuthForm from \"./AuthForm\";\n\nexport const metadata: Metadata = {\n title: \"KA ID — connexion\",\n description:\n \"Un seul compte pour toutes les plateformes du Groupe KA : créez votre KA ID, connectez-vous avec Google, Apple ou un simple lien par courriel.\",\n};\n\nconst PLATFORMS: { name: string; field: string }[] = [\n { name: \"Lou·Ka\", field: \"Location\" },\n { name: \"Immo·Ka\", field: \"Immobilier\" },\n { name: \"Vrai-Prix\", field: \"Évaluation\" },\n { name: \"Auto·Ka\", field: \"Véhicules\" },\n { name: \"Food·Ka\", field: \"Épicerie\" },\n { name: \"Resto·Ka\", field: \"Restaurants\" },\n { name: \"Sorti·Ka\", field: \"Sorties\" },\n { name: \"Créa·Ka\", field: \"Créateurs\" },\n { name: \"Job·Ka\", field: \"Emplois\" },\n { name: \"Fabri·Ka\", field: \"Artisans\" },\n { name: \"Trouve·Ka\", field: \"Annonces\" },\n { name: \"API·Ka\", field: \"Données\" },\n];\n\nconst ASSURANCES: { num: string; title: string; desc: string }[] = [\n {\n num: \"01\",\n title: \"Sans mot de passe, si vous voulez\",\n desc: \"Un lien de connexion à usage unique, envoyé par courriel. Un clic, vous êtes connecté.\",\n },\n {\n num: \"02\",\n title: \"Vérification en deux étapes\",\n desc: \"Chaque connexion par mot de passe est confirmée par un code à 6 chiffres reçu par courriel.\",\n },\n {\n num: \"03\",\n title: \"Vos données restent ici\",\n desc: \"Conforme à la Loi 25 — aucun traceur publicitaire, aucun témoin tiers, jamais.\",\n },\n];\n\nexport default async function Connexion({\n searchParams,\n}: {\n searchParams: Promise<{ next?: string; error?: string; via?: string }>;\n}) {\n const sp = await searchParams;\n const next = safeNext(sp.next);\n\n // Déjà connecté (et pas de retour SSO en attente) → profil.\n if (!sp.error) {\n const user = await getSessionUser();\n if (user) redirect(next);\n }\n\n const viaLabel = sp.via ? (SSO_CLIENTS[sp.via]?.label ?? sp.via) : undefined;\n\n return (\n
\n
\n {/* -------- colonne éditoriale -------- */}\n
\n

KA ID · Un compte, tout l'écosystème

\n

\n Un seul ·Ka\n
\n pour tout\n

\n

\n Votre KA ID vous suit partout dans le groupe — même profil, mêmes\n favoris, même carte de membre, de Lou·Ka à Sorti·Ka. C'est\n l'agrégation, appliquée à vous-même.\n

\n\n {/* points de confiance — filets éditoriaux (desktop) */}\n \n ))}\n
\n \n\n {/* -------- carte d'authentification -------- */}\n
\n \n {/* rappel de confiance compact (mobile seulement) */}\n

\n Lien magique · Code 2FA · Loi 25\n

\n
\n
\n\n {/* -------- index des plateformes -------- */}\n
\n
\n

Votre KA ID ouvre

\n \n {PLATFORMS.length} plateformes · 1 compte\n \n
\n
\n {PLATFORMS.map((p) => (\n \n \n {p.name}\n \n \n {p.field}\n \n
\n ))}\n \n

\n … et les applications Ka pour iOS et Android. Un profil, une carte de\n membre, des favoris qui vous suivent d'une plateforme à\n l'autre.\n

\n
\n
\n );\n}\n"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01RNDuedesxTxVKQ8m8VWLoL","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"de9fc76a-f74d-4ecf-92d7-c8f98262d088","timestamp":"2026-08-26T16:13:43.243Z","tool_use_result":{"type":"update","filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/page.tsx","content":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n// Connexion KA ID — composition éditoriale « HQ » : héros display à gauche,\n// carte d'authentification à droite, index des plateformes en filets.\nimport type { Metadata } from \"next\";\nimport { redirect } from \"next/navigation\";\nimport { getSessionUser, safeNext } from \"@/lib/auth\";\nimport { SSO_CLIENTS } from \"@/lib/sso\";\nimport AuthForm from \"./AuthForm\";\n\nexport const metadata: Metadata = {\n title: \"KA ID — connexion\",\n description:\n \"Un seul compte pour toutes les plateformes du Groupe KA : créez votre KA ID, connectez-vous avec Google, Apple ou un simple lien par courriel.\",\n};\n\nconst PLATFORMS: { name: string; field: string }[] = [\n { name: \"Lou·Ka\", field: \"Location\" },\n { name: \"Immo·Ka\", field: \"Immobilier\" },\n { name: \"Vrai-Prix\", field: \"Évaluation\" },\n { name: \"Auto·Ka\", field: \"Véhicules\" },\n { name: \"Food·Ka\", field: \"Épicerie\" },\n { name: \"Resto·Ka\", field: \"Restaurants\" },\n { name: \"Sorti·Ka\", field: \"Sorties\" },\n { name: \"Créa·Ka\", field: \"Créateurs\" },\n { name: \"Job·Ka\", field: \"Emplois\" },\n { name: \"Fabri·Ka\", field: \"Artisans\" },\n { name: \"Trouve·Ka\", field: \"Annonces\" },\n { name: \"API·Ka\", field: \"Données\" },\n];\n\nconst ASSURANCES: { num: string; title: string; desc: string }[] = [\n {\n num: \"01\",\n title: \"Sans mot de passe, si vous voulez\",\n desc: \"Un lien de connexion à usage unique, envoyé par courriel. Un clic, vous êtes connecté.\",\n },\n {\n num: \"02\",\n title: \"Vérification en deux étapes\",\n desc: \"Chaque connexion par mot de passe est confirmée par un code à 6 chiffres reçu par courriel.\",\n },\n {\n num: \"03\",\n title: \"Vos données restent ici\",\n desc: \"Conforme à la Loi 25 — aucun traceur publicitaire, aucun témoin tiers, jamais.\",\n },\n];\n\nexport default async function Connexion({\n searchParams,\n}: {\n searchParams: Promise<{ next?: string; error?: string; via?: string }>;\n}) {\n const sp = await searchParams;\n const next = safeNext(sp.next);\n\n // Déjà connecté (et pas de retour SSO en attente) → profil.\n if (!sp.error) {\n const user = await getSessionUser();\n if (user) redirect(next);\n }\n\n const viaLabel = sp.via ? (SSO_CLIENTS[sp.via]?.label ?? sp.via) : undefined;\n\n return (\n
\n
\n {/* -------- colonne éditoriale -------- */}\n
\n

KA ID · Un compte, tout l'écosystème

\n

\n Un seul ·Ka\n
\n pour tout\n

\n

\n Votre KA ID vous suit partout dans le groupe — même profil, mêmes\n favoris, même carte de membre, de Lou·Ka à Sorti·Ka. C'est\n l'agrégation, appliquée à vous-même.\n

\n\n {/* points de confiance — filets éditoriaux (desktop) */}\n \n ))}\n
\n \n\n {/* -------- carte d'authentification -------- */}\n
\n \n {/* rappel de confiance compact (mobile seulement) */}\n

\n Lien magique · Code 2FA · Loi 25\n

\n
\n
\n\n {/* -------- index des plateformes -------- */}\n
\n
\n

Votre KA ID ouvre

\n \n {PLATFORMS.length} plateformes · 1 compte\n \n
\n
\n {PLATFORMS.map((p) => (\n \n \n {p.name}\n \n \n {p.field}\n \n
\n ))}\n \n

\n … et les applications Ka pour iOS et Android. Un profil, une carte de\n membre, des favoris qui vous suivent d'une plateforme à\n l'autre.\n

\n
\n
\n );\n}\n","structuredPatch":[{"oldStart":1,"oldLines":4,"newStart":1,"newLines":6,"lines":[" // Auteur : Simon-Pierre Boucher — contact@spboucher.ai","+// Connexion KA ID — composition éditoriale « HQ » : héros display à gauche,","+// carte d'authentification à droite, index des plateformes en filets."," import type { Metadata } from \"next\";"," import { redirect } from \"next/navigation\";"," import { getSessionUser, safeNext } from \"@/lib/auth\";"]},{"oldStart":8,"oldLines":9,"newStart":10,"newLines":42,"lines":[" export const metadata: Metadata = {"," title: \"KA ID — connexion\","," description:","- \"Un seul compte pour toutes les plateformes du Groupe KA : créez votre KA ID ou continuez avec Google.\",","+ \"Un seul compte pour toutes les plateformes du Groupe KA : créez votre KA ID, connectez-vous avec Google, Apple ou un simple lien par courriel.\","," };"," ","+const PLATFORMS: { name: string; field: string }[] = [","+ { name: \"Lou·Ka\", field: \"Location\" },","+ { name: \"Immo·Ka\", field: \"Immobilier\" },","+ { name: \"Vrai-Prix\", field: \"Évaluation\" },","+ { name: \"Auto·Ka\", field: \"Véhicules\" },","+ { name: \"Food·Ka\", field: \"Épicerie\" },","+ { name: \"Resto·Ka\", field: \"Restaurants\" },","+ { name: \"Sorti·Ka\", field: \"Sorties\" },","+ { name: \"Créa·Ka\", field: \"Créateurs\" },","+ { name: \"Job·Ka\", field: \"Emplois\" },","+ { name: \"Fabri·Ka\", field: \"Artisans\" },","+ { name: \"Trouve·Ka\", field: \"Annonces\" },","+ { name: \"API·Ka\", field: \"Données\" },","+];","+","+const ASSURANCES: { num: string; title: string; desc: string }[] = [","+ {","+ num: \"01\",","+ title: \"Sans mot de passe, si vous voulez\",","+ desc: \"Un lien de connexion à usage unique, envoyé par courriel. Un clic, vous êtes connecté.\",","+ },","+ {","+ num: \"02\",","+ title: \"Vérification en deux étapes\",","+ desc: \"Chaque connexion par mot de passe est confirmée par un code à 6 chiffres reçu par courriel.\",","+ },","+ {","+ num: \"03\",","+ title: \"Vos données restent ici\",","+ desc: \"Conforme à la Loi 25 — aucun traceur publicitaire, aucun témoin tiers, jamais.\",","+ },","+];","+"," export default async function Connexion({"," searchParams,"," }: {"]},{"oldStart":28,"oldLines":23,"newStart":63,"newLines":82,"lines":[" const viaLabel = sp.via ? (SSO_CLIENTS[sp.via]?.label ?? sp.via) : undefined;"," "," return (","-
","-
","-

","- KA ID · un compte, sept plateformes","+

","+
","+ {/* -------- colonne éditoriale -------- */}","+
","+

KA ID · Un compte, tout l'écosystème

","+

","+ Un seul ·Ka","+
","+ pour tout","+

","+

","+ Votre KA ID vous suit partout dans le groupe — même profil, mêmes","+ favoris, même carte de membre, de Lou·Ka à Sorti·Ka. C'est","+ l'agrégation, appliquée à vous-même.","+

","+","+ {/* points de confiance — filets éditoriaux (desktop) */}","+ ","+ ))}","+
","+ ","+","+ {/* -------- carte d'authentification -------- */}","+
","+ ","+ {/* rappel de confiance compact (mobile seulement) */}","+

","+ Lien magique · Code 2FA · Loi 25","+

","+
","+
","+","+ {/* -------- index des plateformes -------- */}","+
","+
","+

Votre KA ID ouvre

","+ ","+ {PLATFORMS.length} plateformes · 1 compte","+ ","+
","+
","+ {PLATFORMS.map((p) => (","+ ","+ ","+ {p.name}","+ ","+ ","+ {p.field}","+ ","+
","+ ))}","+ ","+

","+ … et les applications Ka pour iOS et Android. Un profil, une carte de","+ membre, des favoris qui vous suivent d'une plateforme à","+ l'autre.","

","-

","- Un seul ·Ka pour tout","-

","-

","- Votre KA ID vous suit sur Lou·Ka, Immo·Ka, Vrai-Prix, ValoPlex,","- Auto·Ka, Fabri·Ka et Food·Ka. Même profil partout — c'est","- l'agrégation, appliquée à vous-même.","-

","
","-
","- ","-
","
"," );"," }"]}],"originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\nimport type { Metadata } from \"next\";\nimport { redirect } from \"next/navigation\";\nimport { getSessionUser, safeNext } from \"@/lib/auth\";\nimport { SSO_CLIENTS } from \"@/lib/sso\";\nimport AuthForm from \"./AuthForm\";\n\nexport const metadata: Metadata = {\n title: \"KA ID — connexion\",\n description:\n \"Un seul compte pour toutes les plateformes du Groupe KA : créez votre KA ID ou continuez avec Google.\",\n};\n\nexport default async function Connexion({\n searchParams,\n}: {\n searchParams: Promise<{ next?: string; error?: string; via?: string }>;\n}) {\n const sp = await searchParams;\n const next = safeNext(sp.next);\n\n // Déjà connecté (et pas de retour SSO en attente) → profil.\n if (!sp.error) {\n const user = await getSessionUser();\n if (user) redirect(next);\n }\n\n const viaLabel = sp.via ? (SSO_CLIENTS[sp.via]?.label ?? sp.via) : undefined;\n\n return (\n
\n
\n

\n KA ID · un compte, sept plateformes\n

\n

\n Un seul ·Ka pour tout\n

\n

\n Votre KA ID vous suit sur Lou·Ka, Immo·Ka, Vrai-Prix, ValoPlex,\n Auto·Ka, Fabri·Ka et Food·Ka. Même profil partout — c'est\n l'agrégation, appliquée à vous-même.\n

\n
\n
\n \n
\n
\n );\n}\n","userModified":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"41520299-5fd2-4f69-b944-013412a6ba19","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf1pf6BrBZho4x2DrzA","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAISzwMKpwEIERgCKkCgGF975qYM8pFtJzc1r2R+gXqY2lvjPtXkeRHbGp3tMs2db3lLbfYeHA65yB2ND/wy4msNM7AQ1orKKvCUKbNKMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAG8obzUBrABAhIMWbrS9aFce+EXgDoyGgx3yBQ8LWBu7VUXo9oiMIGJ8yjKYzUf05mjJU/lr0QE9O8wGF00vIUPigZhnXLexHSd13DQEh/A9yhcUK68SirUAZQCGe03stS4fjkaAEklOnPisq1dzK/v3vLj9B2E9sF1dy4q/oS7MCHm8rBUPo6Pcn01FNA1gStU/4XnqEuEH6WzixwckVirkMtf6B7dNZeDbEwlBEntC598U6rmUUwz02LZJSB4/mvZimFLllGbvJdEuycchfooUdRv4YP/R06VfeN7roQyD/cwvXejYSdnoVK/U8oe+1sBOfHrUpi4unUuNSUFhMflJtkd8uUVFj1e/QwM66y1BybAsNr5WbSbkQbp+2GwAxU6oKFoF/oimZ10y/mcGAE="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4304,"cache_read_input_tokens":142862,"cache_creation":{"ephemeral_5m_input_tokens":4304,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"22266d2c-f927-403d-a10c-1b5f6ad97f45"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf1pf6BrBZho4x2DrzA","type":"message","role":"assistant","content":[{"type":"text","text":"Petite touche sur la carte d'auth : un en-tête d'inventaire mono, dans le langage du site."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4304,"cache_read_input_tokens":142862,"cache_creation":{"ephemeral_5m_input_tokens":4304,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"473ebe1b-cfcb-4f35-b9a1-c8427148ef6e"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf1pf6BrBZho4x2DrzA","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_015t2MQVuVcQNTNvgMGGcAQD","name":"Edit","input":{"replace_all":false,"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx","old_string":" return (\n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}","new_string":" return (\n
\n
\n Accès KA ID\n \n Un compte · tout le groupe\n \n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":4304,"cache_read_input_tokens":142862,"cache_creation":{"ephemeral_5m_input_tokens":4304,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"9df9dc15-20df-4372-8e9a-45190a9ddca9"}} {"type":"permission_auto","tool":"Edit","key":"tout autoriser","input":{"file_path":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx","old_string":" return (\n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}","new_string":" return (\n
\n
\n Accès KA ID\n \n Un compte · tout le groupe\n \n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}","replace_all":false}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_015t2MQVuVcQNTNvgMGGcAQD","type":"tool_result","content":"The file /Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx has been updated successfully."}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"b128dbae-ca3c-4c9b-a36d-a57688fa1c5d","timestamp":"2026-08-26T16:13:54.009Z","tool_use_result":{"filePath":"/Users/simon-pierreboucher/apps/groupe-ka/src/app/connexion/AuthForm.tsx","oldString":" return (\n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}","newString":" return (\n
\n
\n Accès KA ID\n \n Un compte · tout le groupe\n \n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}","originalFile":"// Auteur : Simon-Pierre Boucher — contact@spboucher.ai\n\"use client\";\n\nimport { useState } from \"react\";\nimport { ROLES } from \"@/lib/roles\";\n\nconst ERRORS: Record = {\n \"google-non-configure\":\n \"La connexion Google n'est pas encore activée sur ce serveur.\",\n \"etat-oauth-invalide\":\n \"La session Google a expiré — réessayez.\",\n \"echange-google-refuse\": \"Google a refusé l'échange — réessayez.\",\n \"id-token-absent\": \"Réponse Google incomplète — réessayez.\",\n \"id-token-invalide\": \"Réponse Google invalide — réessayez.\",\n \"profil-google-incomplet\":\n \"Votre compte Google n'a pas de courriel vérifié.\",\n \"apple-non-configure\":\n \"La connexion Apple n'est pas encore activée sur ce serveur.\",\n \"apple-refuse\": \"La connexion Apple a été annulée — réessayez.\",\n \"echange-apple-refuse\": \"Apple a refusé l'échange — réessayez.\",\n \"profil-apple-incomplet\":\n \"Votre compte Apple n'a pas de courriel vérifié.\",\n \"jeton-invalide\":\n \"Ce lien est invalide ou expiré — demandez-en un nouveau ci-dessous.\",\n};\n\ntype Step =\n | { kind: \"form\" }\n | { kind: \"code\"; email: string }\n | { kind: \"sent\"; email: string; flavor: \"verify\" | \"magic\" };\n\nexport default function AuthForm({\n next,\n error,\n via,\n}: {\n next: string;\n error?: string;\n via?: string;\n}) {\n const [mode, setMode] = useState<\"login\" | \"register\">(\"login\");\n const [step, setStep] = useState({ kind: \"form\" });\n const [email, setEmail] = useState(\"\");\n const [msg, setMsg] = useState(\n error ? (ERRORS[error] ?? \"Une erreur est survenue — réessayez.\") : null,\n );\n const [busy, setBusy] = useState(false);\n\n async function post(url: string, body: Record) {\n const res = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = (await res.json().catch(() => ({}))) as {\n error?: string;\n twofa?: boolean;\n verify?: boolean;\n sent?: boolean;\n };\n return { ok: res.ok, data };\n }\n\n async function submit(e: React.FormEvent) {\n e.preventDefault();\n setBusy(true);\n setMsg(null);\n const fd = new FormData(e.currentTarget);\n const body = Object.fromEntries(fd.entries()) as Record;\n const { ok, data } = await post(`/api/auth/${mode}`, { ...body, next });\n setBusy(false);\n if (!ok) {\n setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n return;\n }\n const addr = (body.email ?? \"\").trim().toLowerCase();\n if (data.twofa) setStep({ kind: \"code\", email: addr });\n else if (data.verify) setStep({ kind: \"sent\", email: addr, flavor: \"verify\" });\n else window.location.href = next;\n }\n\n async function submitCode(e: React.FormEvent) {\n e.preventDefault();\n if (step.kind !== \"code\") return;\n setBusy(true);\n setMsg(null);\n const fd = new FormData(e.currentTarget);\n const { ok, data } = await post(\"/api/auth/2fa\", {\n email: step.email,\n code: String(fd.get(\"code\") ?? \"\"),\n });\n setBusy(false);\n if (ok) window.location.href = next;\n else setMsg(data.error ?? \"Code refusé — réessayez.\");\n }\n\n async function sendMagicLink() {\n const addr = email.trim().toLowerCase();\n if (!addr) {\n setMsg(\"Entrez d'abord votre adresse courriel ci-dessus.\");\n return;\n }\n setBusy(true);\n setMsg(null);\n const { ok, data } = await post(\"/api/auth/magic\", { email: addr, next });\n setBusy(false);\n if (ok) setStep({ kind: \"sent\", email: addr, flavor: \"magic\" });\n else setMsg(data.error ?? \"Une erreur est survenue — réessayez.\");\n }\n\n /* ---------- étape « code de confirmation » (2FA) ---------- */\n if (step.kind === \"code\") {\n return (\n
\n

Vérification en deux étapes

\n

\n Un code vous attend\n

\n

\n Nous avons envoyé un code à 6 chiffres à{\" \"}\n {step.email}. Il expire dans 10 minutes.\n

\n
\n \n {msg && (\n

\n {msg}\n

\n )}\n \n
\n {\n setStep({ kind: \"form\" });\n setMsg(null);\n }}\n >\n ← Revenir à la connexion\n \n
\n );\n }\n\n /* ---------- étape « courriel envoyé » (vérification / lien magique) ---------- */\n if (step.kind === \"sent\") {\n return (\n
\n

Courriel envoyé

\n

\n {step.flavor === \"verify\"\n ? \"Confirmez votre adresse\"\n : \"Votre lien de connexion est parti\"}\n

\n

\n {step.flavor === \"verify\" ? (\n <>\n Un lien de confirmation a été envoyé à{\" \"}\n {step.email}. Cliquez-le pour activer votre\n KA ID — vous serez connecté automatiquement. Le lien est valable\n 24 heures.\n \n ) : (\n <>\n Si un KA ID existe pour {step.email}, un lien de\n connexion vient d'y être envoyé. Il est valable 15 minutes\n et ne sert qu'une fois.\n \n )}\n

\n

\n Rien reçu ? Vérifiez vos indésirables, puis réessayez.\n

\n {\n setStep({ kind: \"form\" });\n setMsg(null);\n }}\n >\n ← Revenir à la connexion\n \n
\n );\n }\n\n /* ---------- formulaire principal ---------- */\n return (\n
\n {via && (\n

\n \n Connexion demandée par {via} — vous y retournerez automatiquement\n

\n )}\n\n \n {/* « G » officiel Google — couleurs de marque */}\n \n \n \n \n \n \n Continuer avec Google\n \n\n \n {/* Pomme Apple — blanche sur noir, style officiel */}\n \n \n \n Continuer avec Apple\n \n\n
\n \n ou par courriel\n \n
\n\n
\n {(\n [\n [\"login\", \"Se connecter\"],\n [\"register\", \"Créer un compte\"],\n ] as const\n ).map(([m, label]) => (\n {\n setMode(m);\n setMsg(null);\n }}\n className={`btn ${mode === m ? \"btn-lime\" : \"btn-ghost\"} !min-h-[40px] !text-[13px]`}\n type=\"button\"\n >\n {label}\n \n ))}\n
\n\n
\n {mode === \"register\" && (\n <>\n \n
\n Vous êtes…\n
\n {Object.entries(ROLES).map(([value, r]) => (\n \n \n \n \n {r.label}\n \n \n {r.desc}\n \n \n \n ))}\n
\n

\n Ce statut sera affiché sur votre carte de membre.\n

\n
\n \n )}\n \n \n\n {msg && (\n

\n {msg}\n

\n )}\n\n \n\n {mode === \"login\" && (\n <>\n

\n Un code de confirmation vous sera envoyé par courriel.\n

\n \n Recevoir un lien de connexion — sans mot de passe\n \n \n )}\n {mode === \"register\" && (\n

\n Un lien de confirmation sera envoyé pour valider votre adresse.\n

\n )}\n \n\n

\n Un seul compte — le KA ID —\n pour toutes les plateformes du groupe. En continuant, vous acceptez\n les{\" \"}\n \n conditions d'utilisation\n {\" \"}\n et la{\" \"}\n \n politique de confidentialité\n \n .\n

\n
\n );\n}\n","structuredPatch":[{"oldStart":205,"oldLines":6,"newStart":205,"newLines":12,"lines":[" /* ---------- formulaire principal ---------- */"," return (","
","+
","+ Accès KA ID","+ ","+ Un compte · tout le groupe","+ ","+
"," {via && (","

"," "]}],"userModified":false,"replaceAll":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"55348a89-01ad-40ee-af6f-89859a41c222","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf2c9JLLJatg4cb7DeE","type":"message","role":"assistant","content":[{"type":"text","text":"Build, redémarrage, puis vérification visuelle avec Chromium headless (captures de la page et des trois gabarits courriel)."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":696,"cache_read_input_tokens":147166,"cache_creation":{"ephemeral_5m_input_tokens":696,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"cb24a89b-d0f9-4171-93c3-9c38e34ac349"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf2c9JLLJatg4cb7DeE","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01NKXcHQi2dGJ7uwEjzNpQVh","name":"Bash","input":{"command":"npm run build 2>&1 | grep -E \"error|Error|✓|connexion\" | head -10 && pm2 restart groupe-ka --update-env >/dev/null 2>&1 && sleep 3 && curl -s -o /dev/null -w \"connexion:%{http_code}\\n\" http://127.0.0.1:8110/connexion","description":"Build Next.js, redémarrer PM2 et vérifier /connexion","timeout":300000},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":696,"cache_read_input_tokens":147166,"cache_creation":{"ephemeral_5m_input_tokens":696,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1252e633-f734-4317-b3c1-98b761ad7acb"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"npm run build 2>&1 | grep -E \"error|Error|✓|connexion\" | head -10 && pm2 restart groupe-ka --update-env >/dev/null 2>&1 && sleep 3 && curl -s -o /dev/null -w \"connexion:%{http_code}\\n\" http://127.0.0.1:8110/connexion","timeout":300000,"description":"Build Next.js, redémarrer PM2 et vérifier /connexion"}} {"type":"claude","event":{"type":"system","subtype":"task_started","task_id":"b7plbihqa","tool_use_id":"toolu_01NKXcHQi2dGJ7uwEjzNpQVh","description":"Build Next.js, redémarrer PM2 et vérifier /connexion","task_type":"local_bash","uuid":"3c6b9085-51a3-4070-8445-1bebba541b78","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"system","subtype":"task_notification","task_id":"b7plbihqa","tool_use_id":"toolu_01NKXcHQi2dGJ7uwEjzNpQVh","status":"completed","output_file":"","summary":"Build Next.js, redémarrer PM2 et vérifier /connexion","uuid":"e48908bb-c398-4c74-8f6e-7e2b4bfba851","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01NKXcHQi2dGJ7uwEjzNpQVh","type":"tool_result","content":"✓ Running next.config.ts took 12ms\n✓ Compiled successfully in 1135ms\n✓ Generating static pages using 27 workers (43/43) in 299ms\n├ ƒ /connexion\nconnexion:200","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"300a5a27-cca1-4e48-9523-ad4ca1e31fde","timestamp":"2026-08-26T16:14:07.614Z","tool_use_result":{"stdout":"✓ Running next.config.ts took 12ms\n✓ Compiled successfully in 1135ms\n✓ Generating static pages using 27 workers (43/43) in 299ms\n├ ƒ /connexion\nconnexion:200","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"dec15daf-9b57-4763-96eb-83e6d8cdb626","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf3cZ8VmRVzXLWdAtnB","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_014YeYpTni2b7nacvW9RDs2A","name":"Bash","input":{"command":"ls scripts && ls node_modules/.bin | grep -i playwright; ls node_modules | grep -i -E \"playwright|puppeteer\"","description":"Vérifier la présence de Playwright dans le repo"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":354,"cache_read_input_tokens":147862,"cache_creation":{"ephemeral_5m_input_tokens":354,"ephemeral_1h_input_tokens":0},"output_tokens":20,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"622cdb77-372f-4005-9cde-1d1afa61bde1"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_014YeYpTni2b7nacvW9RDs2A","type":"tool_result","content":"rapport-quotidien.mjs\nrapport-quotidien.sh\nstatus-tick.sh","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"57ece064-ad57-4b5b-ae5f-cc9dc7ad0898","timestamp":"2026-08-26T16:14:11.738Z","tool_use_result":{"stdout":"rapport-quotidien.mjs\nrapport-quotidien.sh\nstatus-tick.sh","stderr":"","interrupted":false,"isImage":false,"returnCodeInterpretation":"No matches found","noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"91aaac6b-2cc5-4294-ad16-fb52ab6fe54d","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf3utvFCpJZhMKM2ktm","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01EJbwbkkVKfHaqaGJBNt82S","name":"Bash","input":{"command":"head -30 scripts/rapport-quotidien.mjs | grep -iE \"playwright|puppeteer|chromium|import\"; python3 -c \"import glob; print(glob.glob('/Users/simon-pierreboucher/Library/Caches/ms-playwright/*'))\" 2>/dev/null","description":"Voir comment le script rapport utilise Chromium"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":462,"cache_read_input_tokens":148216,"cache_creation":{"ephemeral_5m_input_tokens":462,"ephemeral_1h_input_tokens":0},"output_tokens":20,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"883c5ed9-449d-4337-bbbd-45ae62bf6813"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"head -30 scripts/rapport-quotidien.mjs | grep -iE \"playwright|puppeteer|chromium|import\"; python3 -c \"import glob; print(glob.glob('/Users/simon-pierreboucher/Library/Caches/ms-playwright/*'))\" 2>/dev/null","description":"Voir comment le script rapport utilise Chromium"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01EJbwbkkVKfHaqaGJBNt82S","type":"tool_result","content":"// (JSON structuré) → data/rapports/YYYY-MM-DD.json → PDF via le Chromium\n// headless de Playwright qui « imprime » la page /rapports/[date] du site\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nconst ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\");\n \"Library/Caches/ms-playwright/chromium_headless_shell-1234/chrome-headless-shell-mac-arm64/chrome-headless-shell\",\n['/Users/simon-pierreboucher/Library/Caches/ms-playwright/chromium-1234', '/Users/simon-pierreboucher/Library/Caches/ms-playwright/ffmpeg-1011', '/Users/simon-pierreboucher/Library/Caches/ms-playwright/webkit-2336', '/Users/simon-pierreboucher/Library/Caches/ms-playwright/chromium_headless_shell-1234']","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"6e5a29a9-343a-4a65-bdf9-b7ed28f3f3b3","timestamp":"2026-08-26T16:14:19.773Z","tool_use_result":{"stdout":"// (JSON structuré) → data/rapports/YYYY-MM-DD.json → PDF via le Chromium\n// headless de Playwright qui « imprime » la page /rapports/[date] du site\nimport { readFileSync, writeFileSync, mkdirSync, existsSync } from \"node:fs\";\nimport { execFileSync } from \"node:child_process\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { fileURLToPath } from \"node:url\";\nconst ROOT = path.resolve(path.dirname(fileURLToPath(import.meta.url)), \"..\");\n \"Library/Caches/ms-playwright/chromium_headless_shell-1234/chrome-headless-shell-mac-arm64/chrome-headless-shell\",\n['/Users/simon-pierreboucher/Library/Caches/ms-playwright/chromium-1234', '/Users/simon-pierreboucher/Library/Caches/ms-playwright/ffmpeg-1011', '/Users/simon-pierreboucher/Library/Caches/ms-playwright/webkit-2336', '/Users/simon-pierreboucher/Library/Caches/ms-playwright/chromium_headless_shell-1234']","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"954acc2f-f7e8-45fe-89bc-a9f18ff6c796","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf4WP615JnRA4B7KTG5","type":"message","role":"assistant","content":[{"type":"text","text":"Chromium Playwright est dispo. Je génère les trois gabarits en HTML puis je capture tout (courriels + page desktop/mobile)."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":592,"cache_read_input_tokens":148678,"cache_creation":{"ephemeral_5m_input_tokens":592,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"130fe073-0c9c-4034-acd3-2efa9cdc57a9"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf4WP615JnRA4B7KTG5","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"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"}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":592,"cache_read_input_tokens":148678,"cache_creation":{"ephemeral_5m_input_tokens":592,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"2133a8cb-b546-4079-a525-379ccf5a2f46"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf4WP615JnRA4B7KTG5","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01X5sPZ9b4acXAoDnLK87pz4","name":"Bash","input":{"command":"cat > /tmp/render-emails.mts <<'EOF'\nimport { verificationEmail, magicLinkEmail, loginCodeEmail } from \"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/email.ts\";\nimport { writeFileSync } from \"node:fs\";\nwriteFileSync(\"/tmp/mail-verif.html\", verificationEmail(\"Simon-Pierre\", \"https://www.groupe-ka.com/api/auth/email/verify?token=abc123def456\").html);\nwriteFileSync(\"/tmp/mail-magic.html\", magicLinkEmail(\"Simon-Pierre\", \"https://www.groupe-ka.com/api/auth/magic/verify?token=abc123def456\").html);\nwriteFileSync(\"/tmp/mail-code.html\", loginCodeEmail(\"Simon-Pierre\", \"428913\").html);\nconsole.log(\"ok\");\nEOF\nnode --experimental-strip-types /tmp/render-emails.mts 2>&1 | tail -1","description":"Rendre les trois gabarits courriel en HTML dans /tmp"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":592,"cache_read_input_tokens":148678,"cache_creation":{"ephemeral_5m_input_tokens":592,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f8d11bc3-3a26-42ca-a269-80f742fda005"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"cat > /tmp/render-emails.mts <<'EOF'\nimport { verificationEmail, magicLinkEmail, loginCodeEmail } from \"/Users/simon-pierreboucher/apps/groupe-ka/src/lib/email.ts\";\nimport { writeFileSync } from \"node:fs\";\nwriteFileSync(\"/tmp/mail-verif.html\", verificationEmail(\"Simon-Pierre\", \"https://www.groupe-ka.com/api/auth/email/verify?token=abc123def456\").html);\nwriteFileSync(\"/tmp/mail-magic.html\", magicLinkEmail(\"Simon-Pierre\", \"https://www.groupe-ka.com/api/auth/magic/verify?token=abc123def456\").html);\nwriteFileSync(\"/tmp/mail-code.html\", loginCodeEmail(\"Simon-Pierre\", \"428913\").html);\nconsole.log(\"ok\");\nEOF\nnode --experimental-strip-types /tmp/render-emails.mts 2>&1 | tail -1","description":"Rendre les trois gabarits courriel en HTML dans /tmp"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01X5sPZ9b4acXAoDnLK87pz4","type":"tool_result","content":"ok","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"0873f75f-089c-4032-b4c9-5e355ee4641e","timestamp":"2026-08-26T16:14:34.754Z","tool_use_result":{"stdout":"ok","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"90a3f6d2-e2fe-47a9-a4b1-57bd94d10aa2","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf5cTUx9jNiyhDCVzJs","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_014jeL4KJ1yinZ8LuENCFRaA","name":"Bash","input":{"command":"CHROME=\"$HOME/Library/Caches/ms-playwright/chromium_headless_shell-1234/chrome-headless-shell-mac-arm64/chrome-headless-shell\" && for f in verif magic code; do \"$CHROME\" --headless --disable-gpu --screenshot=/tmp/shot-mail-$f.png --window-size=720,1000 --hide-scrollbars \"file:///tmp/mail-$f.html\" 2>/dev/null; done && \"$CHROME\" --headless --disable-gpu --screenshot=/tmp/shot-login-desktop.png --window-size=1440,1050 --hide-scrollbars \"http://127.0.0.1:8110/connexion\" 2>/dev/null && \"$CHROME\" --headless --disable-gpu --screenshot=/tmp/shot-login-mobile.png --window-size=390,1500 --hide-scrollbars \"http://127.0.0.1:8110/connexion\" 2>/dev/null && ls -la /tmp/shot-*.png","description":"Capturer les courriels et la page de connexion (desktop + mobile)","timeout":120000},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":980,"cache_read_input_tokens":149270,"cache_creation":{"ephemeral_5m_input_tokens":980,"ephemeral_1h_input_tokens":0},"output_tokens":20,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"38cb1ec1-8f60-4168-b790-6747fe11df28"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"CHROME=\"$HOME/Library/Caches/ms-playwright/chromium_headless_shell-1234/chrome-headless-shell-mac-arm64/chrome-headless-shell\" && for f in verif magic code; do \"$CHROME\" --headless --disable-gpu --screenshot=/tmp/shot-mail-$f.png --window-size=720,1000 --hide-scrollbars \"file:///tmp/mail-$f.html\" 2>/dev/null; done && \"$CHROME\" --headless --disable-gpu --screenshot=/tmp/shot-login-desktop.png --window-size=1440,1050 --hide-scrollbars \"http://127.0.0.1:8110/connexion\" 2>/dev/null && \"$CHROME\" --headless --disable-gpu --screenshot=/tmp/shot-login-mobile.png --window-size=390,1500 --hide-scrollbars \"http://127.0.0.1:8110/connexion\" 2>/dev/null && ls -la /tmp/shot-*.png","timeout":120000,"description":"Capturer les courriels et la page de connexion (desktop + mobile)"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_014jeL4KJ1yinZ8LuENCFRaA","type":"tool_result","content":"-rw-r--r--@ 1 simon-pierreboucher wheel 322659 Aug 26 12:14 /tmp/shot-login-desktop.png\n-rw-r--r--@ 1 simon-pierreboucher wheel 242673 Aug 26 12:14 /tmp/shot-login-mobile.png\n-rw-r--r--@ 1 simon-pierreboucher wheel 59062 Aug 26 12:14 /tmp/shot-mail-code.png\n-rw-r--r--@ 1 simon-pierreboucher wheel 61445 Aug 26 12:14 /tmp/shot-mail-magic.png\n-rw-r--r--@ 1 simon-pierreboucher wheel 68129 Aug 26 12:14 /tmp/shot-mail-verif.png","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"3768904b-4607-4254-9c10-8775cf455dd3","timestamp":"2026-08-26T16:14:43.730Z","tool_use_result":{"stdout":"-rw-r--r--@ 1 simon-pierreboucher wheel 322659 Aug 26 12:14 /tmp/shot-login-desktop.png\n-rw-r--r--@ 1 simon-pierreboucher wheel 242673 Aug 26 12:14 /tmp/shot-login-mobile.png\n-rw-r--r--@ 1 simon-pierreboucher wheel 59062 Aug 26 12:14 /tmp/shot-mail-code.png\n-rw-r--r--@ 1 simon-pierreboucher wheel 61445 Aug 26 12:14 /tmp/shot-mail-magic.png\n-rw-r--r--@ 1 simon-pierreboucher wheel 68129 Aug 26 12:14 /tmp/shot-mail-verif.png","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"595ac8a6-1bcc-475d-97a7-a17b0669b30f","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf6GXwsJpFbYFvGDpzJ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_013ZwovXwRcnHHGNj8y47Jes","name":"Read","input":{"file_path":"/tmp/shot-mail-code.png"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":740,"cache_read_input_tokens":150250,"cache_creation":{"ephemeral_5m_input_tokens":740,"ephemeral_1h_input_tokens":0},"output_tokens":17,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"880c5983-0c37-47c9-acb6-39c0faf790c7"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf6GXwsJpFbYFvGDpzJ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_018ei5hvrsfMXximdFqhMbs7","name":"Read","input":{"file_path":"/tmp/shot-mail-verif.png"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":740,"cache_read_input_tokens":150250,"cache_creation":{"ephemeral_5m_input_tokens":740,"ephemeral_1h_input_tokens":0},"output_tokens":17,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"abaee446-5ca5-43b4-b8e2-222bb815c01c"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_013ZwovXwRcnHHGNj8y47Jes","type":"tool_result","content":[{"type":"image","source":{"type":"base64","data":"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AAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFD3/wEAAP//ftjHiQAAAAZJREFUAwDOpzwKb+EpXwAAAABJRU5ErkJggg==","media_type":"image/png"}}]}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"f62fa2e6-dd63-4246-87e7-b632c68c4426","timestamp":"2026-08-26T16:14:47.833Z","tool_use_result":{"type":"image","file":{"base64":"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AAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFBH4AAAAOoIHAAAQB2BAwAAqCNwAAAAdQQOAACgjsABAADUETgAAIA6AgcAAFD3/wEAAP//ftjHiQAAAAZJREFUAwDOpzwKb+EpXwAAAABJRU5ErkJggg==","type":"image/png","originalSize":59062,"dimensions":{"originalWidth":720,"originalHeight":1000,"displayWidth":720,"displayHeight":1000}}}}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_018ei5hvrsfMXximdFqhMbs7","type":"tool_result","content":[{"type":"image","source":{"type":"base64","data":"iVBORw0KGgoAAAANSUhEUgAAAtAAAAPoCAIAAAB4a16/AAAQAElEQVR4nOydBVwUzRvHF6RTBVRSLDDBwC7s7u7ueH3t7u567e7uRsXERFEUBQVplA4JCf3/7kbX9cpD7/yrPF/xPrNzs7Ozs/H85nlm97SSk2I5giAIgiAIdaLJEQRBEARBqBkSHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0tjshJJH/ySuNefOBCP3KJnBrQ5Ex0ORs9roShRlmOIAiCIL6gkZwUyxE5gMxP8XHciQ+cP/dL0OWK5OFaa2nk5giCIAiCQio5h1ju8C9TGwDbwhY5giAIghBDIZWvfPjw4dXr11lZWVbWVuZ5zTQ0NLi/hZRPnulcMPdrwRaxXQONChxBEASR4yHBwUFkHDh06L6n59On3nymoaFhr+7d+/Tqkc8iH/fnk8w9k5k/ftCN2+4RSNRtYjtnVTXhV6vnPz64w4+l9Q1zbTve0M7ehMv+dg04EhwEQRBEjg+pHDh8qH6Tplu27xCqDZCcnLxu40bXBo3eBAZyfz4Z3FuZ+Z8+fkngn4Cd6314tQFW76jzA2pDwXYJgiCInEaOFhyXr1ydMHmqMKdcWWcEU/hFyI7OPXog1ML94Xzk3itf+OTB15tWfJVf6/bXLelsxv0Q2douQRAE8ReTcwVHXFz8yDFj+MVZ06cFvHxx4vDhB3dunz1xvFjRIiz/7dt3blevcDkG9wshi6d58ourd7o6V7DgCIIgCOLnyLlzOM6ePw8HBksv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HAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACM+/8BAAD//8Q4GYkAAAAGSURBVAMAkUWnMXVXiJAAAAAASUVORK5CYII=","media_type":"image/png"}}]}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"36708614-9001-4111-ad23-2d94bb75d386","timestamp":"2026-08-26T16:14:47.841Z","tool_use_result":{"type":"image","file":{"base64":"iVBORw0KGgoAAAANSUhEUgAAAtAAAAPoCAIAAAB4a16/AAAQAElEQVR4nOydBVwUzRvHF6RTBVRSLDDBwC7s7u7ueH3t7u567e7uRsXERFEUBQVplA4JCf3/7kbX9cpD7/yrPF/xPrNzs7Ozs/H85nlm97SSk2I5giAIgiAIdaLJEQRBEARBqBkSHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0SHARBEARBqB0tjshJJH/ySuNefOBCP3KJnBrQ5Ex0ORs9roShRlmOIAiCIL6gkZwUyxE5gMxP8XHciQ+cP/dL0OWK5OFaa2nk5giCIAiCQio5h1ju8C9TGwDbwhY5giAIghBDIZWvfPjw4dXr11lZWVbWVuZ5zTQ0NLi/hZRPnulcMPdrwRaxXQONChxBEASR4yHBwUFkHDh06L6n59On3nymoaFhr+7d+/Tqkc8iH/fnk8w9k5k/ftCN2+4RSNRtYjtnVTXhV6vnPz64w4+l9Q1zbTve0M7ehMv+dg04EhwEQRBEjg+pHDh8qH6Tplu27xCqDZCcnLxu40bXBo3eBAZyfz4Z3FuZ+Z8+fkngn4Cd6314tQFW76jzA2pDwXYJgiCInEaOFhyXr1ydMHmqMKdcWWcEU/hFyI7OPXog1ML94Xzk3itf+OTB15tWfJVf6/bXLelsxv0Q2douQRAE8ReTcwVHXFz8yDFj+MVZ06cFvHxx4vDhB3dunz1xvFjRIiz/7dt3blevcDkG9wshi6d58ourd7o6V7DgCIIgCOLnyLlzOM6ePw8HBksv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HAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACMI3AAAADjCBwAAMA4AgcAADCOwAEAAIwjcAAAAOMIHAAAwDgCBwAAMI7AAQAAjCNwAAAA4wgcAADAOAIHAAAwjsABAACM+/8BAAD//8Q4GYkAAAAGSURBVAMAkUWnMXVXiJAAAAAASUVORK5CYII=","type":"image/png","originalSize":68129,"dimensions":{"originalWidth":720,"originalHeight":1000,"displayWidth":720,"displayHeight":1000}}}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"11c83c61-9829-4c06-a73b-f27b967070c5","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf6bFLHKGUR1f3Vs931","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAISrQMKpwEIERgCKkAx26mNn9gxyklF7Lr/AlvLeP6nxiieKxZM+xx2dFPoSFAGnRbRqg6gxQSLNPo2InFENw6d0ZFx58p+5WcEbLahMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAH9obzUBrABAhIMG3z/uUgq0mVIHrB1Ggy1uzHQ6MZORpt+eHsiMCCp8U2zdwNcaUhHXKCfpR2V8/3CupuO9vJ9bmkKe050QHtfBhDRvANxdr9BQGvjKiqyAUWh2U/MvVz0jAU1R04tcs9kDtPi7Ql5GjqDWelTcKqEu+VDD+iRGvYMoQTq30/t1F/9GO7pHCHXov8KKfhBv9kXwEkTJrcmBeGsmFRXE9sLv+v41zZTJQ6K2goesUJeMjnwfZC15ghAlZcju0kLCUZkCtdc34HZnkeG81LttvZIyjeFyXm2yYdmlCUd/Dt92dyr+vVffzSQrWeMtzVeeEAux/0xbLQJWyToQNjWsR+vVfoYAQ=="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2058,"cache_read_input_tokens":150990,"cache_creation":{"ephemeral_5m_input_tokens":2058,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"d5db6dc1-3748-4476-a818-959c0d4e27a5"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf6bFLHKGUR1f3Vs931","type":"message","role":"assistant","content":[{"type":"text","text":"Les courriels sont fidèles à l'identité (carte encre à ombre décalée, puce lime, panneau code encre/lime, mono uppercase). Vérifions la page de connexion."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2058,"cache_read_input_tokens":150990,"cache_creation":{"ephemeral_5m_input_tokens":2058,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"73c6563d-501d-43f4-856a-e7de2fd02821"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf6bFLHKGUR1f3Vs931","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01M2c8sF8SELfbhhveysyjpa","name":"Read","input":{"file_path":"/tmp/shot-login-desktop.png"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":2058,"cache_read_input_tokens":150990,"cache_creation":{"ephemeral_5m_input_tokens":2058,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1cfb57ad-0919-4f2d-a328-e6705bd9cb5f"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01M2c8sF8SELfbhhveysyjpa","type":"tool_result","content":[{"type":"image","source":{"type":"base64","data":"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3YvNzdufceuP/vhPHD9+fBjGri/j0F7i5U4/9qVOVR7ANv85bPOcbPfz+Wd+zue85Eu8xLXXXvtt3/mdH/fRH/UPj3/8iz/2sU+79dazZ8+92Zu88d/87d897KEPuePOOzNzGIYnP+Up11173au9+mv9zV//+eOf8IS3fPM331gsQgF+87d/yHwRb/XOD3/ft/nVt323h99w0+brvdktf/Bbd0/TtFqvVbq773vGwcEB6PixnZtuvHH/4GC5XJ45fTozW2shAcM0CYBSysXd3XGc9g/2H3zLLfP5fJomSSViuVpd3N+/7pprhnGMiIi4uLu7XC63t7a2t7aAtJ3ZMoG0+1r/5u/+7mi5vOmGG2647rqz58+vVqtzFy7cfOON1197bWsNyZlTa7YBSeM4/dXf/u3mxsbJEyduuuGGg8PDw6Oja86cceY/PPGJD7755sViIam1FhFARNgGt5atNS6rpZy7cOHJT33qS7/kS27M5wo5fc99Z7e3t47t7KxWK9tcVkv5y7/92wfdfPOJ48czs0QAaWfm2XPnTp86JWmaJttAKWX30qUnPvkpj3jYQ0spJ44ft3323LnTp05JmqbJtu2u686eO/fkpz71kQ9/+HXXXNNaa5m11mmaulqn1iJCcPb8+a3NzcViMY6jbaBE7B8eHh0d3XTDDVNrgogw2Ma+eOnSarXa3tra2d5umUBESExTiwjbgO3WGpB2V+s/PP7x5y9cePQjHwlIkrS9tTWfze49e7brulMnTkytScJumaWUkAyttdYaYLvrujvvuuvg8ND28WPHbr7xxmEcBS2zlJKZERERrbVpmgDbXdc96SlPPTo6uuXmm7tajx07dnBwsFwtT544afvCxYsbi0XXdbZtd133949/wqW9vVd9xVfIzIhAunDxYt/3W5ubQGttuVyuh+HYzk5mApIycxpHScC99973ki/18kApBZAEtNZKKbZLKbZvueVBv3/b09s4Hh4ebm9t2Za0XK0+89M+7cKFC6WUd3y7t8vMaZpsb21uLlcr1P3V3/zNPffcu7OzNV+0v/2Lc3uXhrvvODx9zbxyP0m2eU6SbEuyzYtMkm0uk2Sb51FKOTo4ODpavtEbvMHjH/+EN3+zN/3cL/zC3UuXXualXurJT3nKbDZ73OMf94QnPulLvvALfvKnf3q5XP7hH/3xa73ma3zfD/zg02+99cd+8ifW6+EP//hPvvQLPr/WslpN0+RP/PxXeIfX+fn77jp8yZc7/d3f+Lg3fduH3HjL1tOecna9XkO54847/+jP/mzez06dOnXN6dN7B/tHR0fHdnYy86EPfsje3t49Z+97g9d+7VnfT61tLBa333FnZh4/fuyXfu3XrzlzZrVeHR4edl2/XC6PlkcPuvmWS3uXdra3j5bLe8+ePb6z0/e9FPNZf899973mq77aNWdOj+NYa72wu/ukpzz14Q99yM/84i8+7CEPmc9mj3vik86dP/8SL/bYrc2t8xcuPOjmm86eO/c6r/Eai8WiZdZSdncv/f4f/fFs1j/o5lv+7nGPW6+H/YOD48eOjeNwx113PeaRj5xas11LPX/xwsZisbHY2DvYP3HseES8xqu88noYgNp1t99559/+wz8M47harU8cO7Zcr46OlsvVskS80eu/fler7RJxtFz+wq/8yiu93MsrZPvg8HAxmy9Xq+3trWfcfsfDHvygtF/71V99HEfbXdfdedddf/+4x911z91OX3/dtQeHh/fcd99DH/SgaZpe5zVeY5wm233fP+P223/jd3/38OgIs729df7ChWPHjl3a2zt5/Pj+weFs1mfLpz3jGY991CMvXLz4Wq/2ahsbG621Uuv+wcHv/sEf7mxvz+ezkydO3HvffcvV6pozZ8ZhuPPue06eOF5rN5/PbM/6/vyFCy3zUQ9/+PkLFw+PDtfD8KCbbnrJF3/x9XoNRERE3H7nXXfefXff9xFx4cLFRz78YZne29+/79zZV3q5l3/6bc+45vTpc+fPS9rY2Dh/4cKx7R3j13zVVw2pZfZdd9vtd/zpX/5lLeXmm278+8c9fnNzY//gwGaaxoc+5CFHR0dPespTXvwxj3mpF3/x1XoNhPS4JzzxaLn867/7+wffcss4jethOHf+/Cu8zMum22//3h+88eu/3iMf9rDVel1KOTg8/IfHP/7Rj3zEr/3WbyPGcey7/o6773rkwx52aW/v1ImTy9Xqwu7FzHzHt3nro6OlJECSJEnDMLT05uaGbSAzSym/87u/8+SnPPn93/f9ucx2RJTaHS2XtqMULouIM6dP33D99Zk5jqOkaZoiotTaWgPddtvt0zSCStHuxfWf/cG9tdMdt+1X7meb5yTJNmCbfw3b3M82z09mzufz9Xp99z33/MVf/9Xj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7rtvHMYTx4/3s35ne/u2O+68tLf3hCc/6eVe+qXn8/nZ8+c4z9HRsrXW9V22BO65797rrr12/+DgzKlTR8ulpNba6VOnai1//7jHnzl9end3d/fSpdV63XfdxUuX+q4/trP9949/fMt2/DVe42m33nppb6+U4nQ6S5SDw8Mzp0/fdc/dwKlTp4T+9C/+Ymtzc3trK+3lcrWYzyLKer2uXb3r7rtPHDt+eHR45113z2aze+6998yZ09dfd+3fP/7xGxsbl/b2hvWw2Fjs7e2fOXUqnavV+p777t3c2JjPZzaHR0fTNN1zz71d121tbt52xx2bGxsXd3fvPXv2huuuPXnixMZi8bgnPHG1Xm9tbhwdLTc2NoZhGKfxxLFjT336048fO9ZaPv5JT7rphhvOX7h4/Pix226/fWd7+8LF3dVqNZvNjpZHW5tbT37qU1fr1bGdneuvvfbipUtPe8atp0+euvH66yOC/3zDONRSh2GYpmmxWKQzW05t6rru3vvus33DddeP0yhUSgGGcei6brVaSZr1s/V6bRvouq7v+1Lq7u7u5ubGarmaz+er9cr2YrHR1WqbB5Bkm/8Ekmzzb2CukMQDif9skmzzPACg8vxIss1lkmzz/NgGJAG2eQEk2eYySba5TJJtnh/bgCTAdmtte2vrxInjmIc++MGttb6fPfqRjwCth/Wx7Z10bm5s3HTjDTfdeIPtk8ePd103TdPmxsbRcnn82LHWGlCi3HzTjfPZDKlErIfB9s7WtkREvPRLvMSJ48f7rpvNZhuLxXK1uv6662opT3jyUx776Ef1fb+9tXXtmTPbW1vXnD6zWq9KKXfefffx48e2t7ZuvOH6cRzvO3v25htvfPmXeZm+7xfzeWau10OEWst77r33xhtuuOmGG6695szTn7G87tprT548cc2Z06dPneq6evONN7bMne3tWd8fHB7eeN11x48dy8yptRtvuH4xn9sexvFBN91079lzL/vSL5WZGxsbN91ww3o9POZRj8zMYRzvuffeB99yy6Me8fASsXdwsLmxcfHSpe2traPDo9ls9rIv+ZIbGxuttaPl8vixYyeOX5jNZjfdeCP21uampO2traPlcj6fr1arYRhns369Xj/2UY88PDrq+361Wm1tbWWmJNuAJNu8UJIA24D4lyniwsULF3d3nTmbzcZxPH7s+IXdi9iL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","media_type":"image/png"}}]}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"5f541a0e-e268-4e83-95de-9b1d96aac6b6","timestamp":"2026-08-26T16:14:53.672Z","tool_use_result":{"type":"image","file":{"base64":"iVBORw0KGgoAAAANSUhEUgAAAWcAAAEGCAIAAAA2csMlAAESfklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8e7J3neUiyzfOQZBuQZFsSYJsXmSTbPA9JtgFJtiUBtnkRZCb3M2Bzv4iICNvcTxJgmxeZJNs8D0m2uZ8kwDYvMkm2eU6SANuSbAOSANu8yCTZ5jlJAmxLsg1IAmzz7yMJsC3JNiDJNv9ukgDbkmwDkmzz7yYJsC3JNiDJNv9ukgDbkmwDkmzz7yYJsC3JNiDJNvezzTMJzGWSuJ8k27Zns9l6GO6+++69vT3bi8Xi2muvPXHs2HoYbEsCbEtqrZVSNraOHR1cesITn3jhwkUd7J3n30SSbf4TSLLNv0SSbWA+n0uSJAkJQAIgxvVyvV5HhG1Akm3+E0iyzX8CSba56jlJss1/EEm2uUySbf6DSLLNfwJJtrmf7b7vIyKz2QBAiTAMw8AD2J7NZrfffvttt9++vb29vb0dEUdHR7u7u1tbW4959KOBzAQktdbm8/kwDN/z/d//Iz/2Y0996tOWq5UO9s4DkmzzPCTZlmSb+0myLQmwzQNIss0DSLLNCyDJNveTZFsSYJt/SSklM5/y1KeuVqtxmsZhGMdpPayHYViv1+v18Mqv9IoPe+hD1+t1RNiWBNjmhZJkmxdAkm3uJ8m2JMA2L5Qk2zwnSbYBSba5nyTbkgDb/OtJss3zkGRbkm3+TSTZ5nlIsi3JNg8gyTYvAkm2eQEk2QYk2QYk2eZFIMk2L4Ak24Ak24Ak2zyAJNs8D0m2JdnmfpJsA5Js8wCSbPMAkmzzPCTZlmSb+0myDUiyzWV91911z9333HvfMIyZBiR1XT1z6uTNN9+cmZkJ2J7NZk9+ylOOjo4e+5jHLBYLwHbUOqxWt91++9mzZ1/6pV7Ktu3MXCwWd9199/t+4Af+5m/9btfNdnY2uq7oYO88/00kZWZmAhEhiX+lWuuHfdRH/fhP/fRiPlsPA/Y0TWmHsFkuV4959KN/7Rd/4fjx49M0SeJ/J0m2+U8gyTb/CSTZ5l9Jkm1eKEm2+VeSZJsXSpJt/pUk2eaFkmSb/zS1lL9/3OOj9Lfc8qDNzU1FALaXy+Vdd96xt3fxJV7ssaWU1tps1t9+x50XLlx4uZd92cPDw+VydbQ8qqWs1uvrr7tuPp/ffvvt995338u89EuvVquu65bL5Vu+3dv/8Z/86S23XP9qr3fd7/7qHWfvWwYPIIn7SeLfSpIkHkAS95MESMrMvu93jp/aOX5qPp9nZmYCmZmZgG3Atm3bmWlbku1pmrquu+uuu3/pV361RBzsj33Xj0P03cbmxla2+Xy2ee2119551123PuMZs9ksM23b5gWQJInLJAGAbf7dbNu2zWW2bdvmBUvbtkESYBsAbPMAknihMpMXyjZgm+ckCbDN82ObB7DN87CdmTwPSfxLzAtk2zbPjySeh+3MBGxzP0m2eR62eR6SANu2eX5s8zxs2+Z+tnkekiQJbNvmX0OSJMDQdd3fP+7x191w88u8zMueOnVqPp/P+n7W9/PZ7MTx4y/2Yi/+mMe8xN8/7vG2JY3j9Izbbnv0ox51dHTU9/0Xf9mX/c7v/t7f/8PjvuKrv6aUcnh4ePPNN7fW7rnnnlrKfGPzy77qq/7kz/5ke+vkY1/q2Iu/zKnrbtx4w7e4JXgBbPNvZds2L4BtIDP7vr/r7rs/9uM+5kM/7EOe+MQnbe/sbO9s11q3t7e3j50AFouFpNlsNp/NFovF9rETm5ub0zQtFotjJ05JihKbm5sRept3eXhr+Xbv/vBXePVrTpyafc33vOYrvNo1B/vrUmKaJqCrdTabzWezUkrakkoptm1zWaZtc5ntUkotZdb3gG3btm1LKhG2AcB2KaXWKsm2bR5AEjCfzzc2Fl3XAaWUvu8Xi0Wt1bZt2+Y5SNpYLObzeVdrZkoqpdi2PZ/NJNm2DWSmbdu2bQOSuF8pZXNjQ5Jt27ZrKZJs85wW83lE2AZs285MoOs67ieJy0opi8Wi1lpKsQ10Xcf9JEkCSimbm5u1FNu2AdtAZgK2bddSJNnmfrYjoqvFNmDbtm3bQCml6zpJtgHAtm3Atm3b3E8SMJvNtjY3SykRUUqJCCAza60RYRswz2Tbtm3uJ8l2rXU2m81ms1qKbe5nG7Bt2zYPMJv18/m8lhIRtiWVUmwbaimSANu2DfPZbGNjg8tsbJdSJNm2bTukUgogCZA0TdPB4aGkvutuv+OOfrZx4w03TtNk27ZtwLbtaZqOHz9+3XU3PfkpT93c2rr3vvs2NzYWi0VmhnRweHC0PHrik590cLD/lKc+dbFYjON4ww033HX33YvNzdufceuP/vhPHD9+fBjGri/j0F7i5U4/9qVOVR7ANv85bPOcbPfz+Wd+zue85Eu8xLXXXvtt3/mdH/fRH/UPj3/8iz/2sU+79dazZ8+92Zu88d/87d897KEPuePOOzNzGIYnP+Up11173au9+mv9zV//+eOf8IS3fPM331gsQgF+87d/yHwRb/XOD3/ft/nVt323h99w0+brvdktf/Bbd0/TtFqvVbq773vGwcEB6PixnZtuvHH/4GC5XJ45fTozW2shAcM0CYBSysXd3XGc9g/2H3zLLfP5fJomSSViuVpd3N+/7pprhnGMiIi4uLu7XC63t7a2t7aAtJ3ZMoG0+1r/5u/+7mi5vOmGG2647rqz58+vVqtzFy7cfOON1197bWsNyZlTa7YBSeM4/dXf/u3mxsbJEyduuuGGg8PDw6Oja86cceY/PPGJD7755sViIam1FhFARNgGt5atNS6rpZy7cOHJT33qS7/kS27M5wo5fc99Z7e3t47t7KxWK9tcVkv5y7/92wfdfPOJ48czs0QAaWfm2XPnTp86JWmaJttAKWX30qUnPvkpj3jYQ0spJ44ft3323LnTp05JmqbJtu2u686eO/fkpz71kQ9/+HXXXNNaa5m11mmaulqn1iJCcPb8+a3NzcViMY6jbaBE7B8eHh0d3XTDDVNrgogw2Ma+eOnSarXa3tra2d5umUBESExTiwjbgO3WGpB2V+s/PP7x5y9cePQjHwlIkrS9tTWfze49e7brulMnTkytScJumaWUkAyttdYaYLvrujvvuuvg8ND28WPHbr7xxmEcBS2zlJKZERERrbVpmgDbXdc96SlPPTo6uuXmm7tajx07dnBwsFwtT544afvCxYsbi0XXdbZtd133949/wqW9vVd9xVfIzIhAunDxYt/3W5ubQGttuVyuh+HYzk5mApIycxpHScC99973ki/18kApBZAEtNZKKbZLKbZvueVBv3/b09s4Hh4ebm9t2Za0XK0+89M+7cKFC6WUd3y7t8vMaZpsb21uLlcr1P3V3/zNPffcu7OzNV+0v/2Lc3uXhrvvODx9zbxyP0m2eU6SbEuyzYtMkm0uk2Sb51FKOTo4ODpavtEbvMHjH/+EN3+zN/3cL/zC3UuXXualXurJT3nKbDZ73OMf94QnPulLvvALfvKnf3q5XP7hH/3xa73ma3zfD/zg02+99cd+8ifW6+EP//hPvvQLPr/WslpN0+RP/PxXeIfX+fn77jp8yZc7/d3f+Lg3fduH3HjL1tOecna9XkO54847/+jP/mzez06dOnXN6dN7B/tHR0fHdnYy86EPfsje3t49Z+97g9d+7VnfT61tLBa333FnZh4/fuyXfu3XrzlzZrVeHR4edl2/XC6PlkcPuvmWS3uXdra3j5bLe8+ePb6z0/e9FPNZf899973mq77aNWdOj+NYa72wu/ukpzz14Q99yM/84i8+7CEPmc9mj3vik86dP/8SL/bYrc2t8xcuPOjmm86eO/c6r/Eai8WiZdZSdncv/f4f/fFs1j/o5lv+7nGPW6+H/YOD48eOjeNwx113PeaRj5xas11LPX/xwsZisbHY2DvYP3HseES8xqu88noYgNp1t99559/+wz8M47harU8cO7Zcr46OlsvVskS80eu/fler7RJxtFz+wq/8yiu93MsrZPvg8HAxmy9Xq+3trWfcfsfDHvygtF/71V99HEfbXdfdedddf/+4x911z91OX3/dtQeHh/fcd99DH/SgaZpe5zVeY5wm233fP+P223/jd3/38OgIs729df7ChWPHjl3a2zt5/Pj+weFs1mfLpz3jGY991CMvXLz4Wq/2ahsbG621Uuv+wcHv/sEf7mxvz+ezkydO3HvffcvV6pozZ8ZhuPPue06eOF5rN5/PbM/6/vyFCy3zUQ9/+PkLFw+PDtfD8KCbbnrJF3/x9XoNRERE3H7nXXfefXff9xFx4cLFRz78YZne29+/79zZV3q5l3/6bc+45vTpc+fPS9rY2Dh/4cKx7R3j13zVVw2pZfZdd9vtd/zpX/5lLeXmm278+8c9fnNzY//gwGaaxoc+5CFHR0dPespTXvwxj3mpF3/x1XoNhPS4JzzxaLn867/7+wffcss4jethOHf+/Cu8zMum22//3h+88eu/3iMf9rDVel1KOTg8/IfHP/7Rj3zEr/3WbyPGcey7/o6773rkwx52aW/v1ImTy9Xqwu7FzHzHt3nro6OlJECSJEnDMLT05uaGbSAzSym/87u/8+SnPPn93/f9ucx2RJTaHS2XtqMULouIM6dP33D99Zk5jqOkaZoiotTaWgPddtvt0zSCStHuxfWf/cG9tdMdt+1X7meb5yTJNmCbfw3b3M82z09mzufz9Xp99z33/MVf/9Xj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7rtvHMYTx4/3s35ne/u2O+68tLf3hCc/6eVe+qXn8/nZ8+c4z9HRsrXW9V22BO65797rrr12/+DgzKlTR8ulpNba6VOnai1//7jHnzl9end3d/fSpdV63XfdxUuX+q4/trP9949/fMt2/DVe42m33nppb6+U4nQ6S5SDw8Mzp0/fdc/dwKlTp4T+9C/+Ymtzc3trK+3lcrWYzyLKer2uXb3r7rtPHDt+eHR45113z2aze+6998yZ09dfd+3fP/7xGxsbl/b2hvWw2Fjs7e2fOXUqnavV+p777t3c2JjPZzaHR0fTNN1zz71d121tbt52xx2bGxsXd3fvPXv2huuuPXnixMZi8bgnPHG1Xm9tbhwdLTc2NoZhGKfxxLFjT336048fO9ZaPv5JT7rphhvOX7h4/Pix226/fWd7+8LF3dVqNZvNjpZHW5tbT37qU1fr1bGdneuvvfbipUtPe8atp0+euvH66yOC/3zDONRSh2GYpmmxWKQzW05t6rru3vvus33DddeP0yhUSgGGcei6brVaSZr1s/V6bRvouq7v+1Lq7u7u5ubGarmaz+er9cr2YrHR1WqbB5Bkm/8Ekmzzb2CukMQDif9skmzzPACg8vxIss1lkmzz/NgGJAG2eQEk2eYySba5TJJtnh/bgCTAdmtte2vrxInjmIc++MGttb6fPfqRjwCth/Wx7Z10bm5s3HTjDTfdeIPtk8ePd103TdPmxsbRcnn82LHWGlCi3HzTjfPZDKlErIfB9s7WtkREvPRLvMSJ48f7rpvNZhuLxXK1uv6662opT3jyUx776Ef1fb+9tXXtmTPbW1vXnD6zWq9KKXfefffx48e2t7ZuvOH6cRzvO3v25htvfPmXeZm+7xfzeWau10OEWst77r33xhtuuOmGG6695szTn7G87tprT548cc2Z06dPneq6evONN7bMne3tWd8fHB7eeN11x48dy8yptRtvuH4xn9sexvFBN91079lzL/vSL5WZGxsbN91ww3o9POZRj8zMYRzvuffeB99yy6Me8fASsXdwsLmxcfHSpe2traPDo9ls9rIv+ZIbGxuttaPl8vixYyeOX5jNZjfdeCP21uampO2traPlcj6fr1arYRhns369Xj/2UY88PDrq+361Wm1tbWWmJNuAJNu8UJIA24D4lyniwsULF3d3nTmbzcZxPH7s+IXdi9iL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","type":"image/png","originalSize":322659}}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"b44ac1ad-9fb4-4c3e-9c4e-5f4b6a8dd341","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf71gm5doCyM69wr9nQ","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAIS7AMKpwEIERgCKkAfcKdU3QcMQrIKc5hDBthR2xZ4Qj2PYqLiKUN/fYHbkS587ZIaURu6sA7IBYshBnja91C0WJpHNBTiVn5sTHbBMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAGCorzUBrABAhIMphrII2RVNCRGyWdwGgwOHgXXXWbPNCXPU6oiMJYTFBYA+gLlFLd8SwpoLFa2tyVD+kaYg3F53xzkc+Xaid3NyeZWYSzdmN3Ld9xHpyrxAfuk6ppVQGT7HlbFaZQ8m7brUnUIC+mcs2HFZwVI5fN4jKIitS1g3iKcLddAGfVTay7BNzrZ0Z7SEY4yAVYZKLMKnrsaUa6bw4+KuFjb0/GTfSeipxKjXVPS326K0Q+uPCTQ25L2I5AOSYERmeENKOHpIscHOi5JwuzdZJ8KeioCMvGd2K6FG4Ed3fwmmee8L5Qk59Txk7FWpR/18d/SN80Apx9Ife2L0cByQg/iiP2lqj9ikpB58GAtxlPXDltDLmkafSICUccmd/BoeTOpMVSvgomfGR455tbDs8o6TQwtCZ7do5OdUnmMRf2vVa9hSIEYAQ=="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":336,"cache_read_input_tokens":153048,"cache_creation":{"ephemeral_5m_input_tokens":336,"ephemeral_1h_input_tokens":0},"output_tokens":6,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"bcf2f05f-b27f-4219-832e-c1609bc1f3fe"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf71gm5doCyM69wr9nQ","type":"message","role":"assistant","content":[{"type":"text","text":"Desktop est bien. Vérifions mobile."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":336,"cache_read_input_tokens":153048,"cache_creation":{"ephemeral_5m_input_tokens":336,"ephemeral_1h_input_tokens":0},"output_tokens":6,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"2742c8de-96fb-4f38-8f4c-2431f7eb45d4"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf71gm5doCyM69wr9nQ","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_012aBbkVT6TKodfwjyAJjr1R","name":"Read","input":{"file_path":"/tmp/shot-login-mobile.png"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":336,"cache_read_input_tokens":153048,"cache_creation":{"ephemeral_5m_input_tokens":336,"ephemeral_1h_input_tokens":0},"output_tokens":6,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"a0120d55-1c88-4d4b-80f7-a7efdf7314be"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_012aBbkVT6TKodfwjyAJjr1R","type":"tool_result","content":[{"type":"image","source":{"type":"base64","data":"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","media_type":"image/png"}}]}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"015cacc1-0891-42dd-b11a-c7536270fdc0","timestamp":"2026-08-26T16:14:58.689Z","tool_use_result":{"type":"image","file":{"base64":"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","type":"image/png","originalSize":242673}}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"a48b11f8-697b-4922-bfa6-9082a8f31820","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf7PdNHiVemamX1L9TN","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAIS8gMKpwEIERgCKkCy2E5fVjQVyBLUDwcDQknzOwiGGAvwATRKXmyJLBn3NUds9kW1/RsdakHyFmGFZwofnnWhOpB9alllem6ygoFqMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAGIorzUBrABAhIMpV6xMxzuTn8b1rTpGgygQuLKbbDQ6DTDIPkiMEcEs2G0+lA35oeKJ4pnjP/U2jpu/CIGrf6u3iNMm1Wb0tbzYq3iDTYSpaHb68E2rSr3AbztMGzimcrzuONSjdnZtqPraFyaxSpR147xohmDBoofFGEJMN+CNPQ2bcKUJD0cklIDYEhOpOe7fY5tNtMDbnlnPn2PmryCT0heCLsmBlRmuxotexrISjpLv6NKv3lQ4L04NpCT/vuFjsCSGdUMLYFGEoPIhmHFrCWI3S0Oj3qRaFFEv9c2sDmCDbE4TxekmlloETXP5v5hirnrmzYn4v2wm2tvC34Nx1U2YyLNwg1X93q8Vn8G8R58MpodeVxSGC9W/Dag6s+otiwEFDWVD+4+AcokLUPcI0jJgBLy9vQxV/AxHRsm/pfVC8lNIyWu+fSuGbT4fPAYAQ=="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":544,"cache_read_input_tokens":153384,"cache_creation":{"ephemeral_5m_input_tokens":544,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"410159f5-0d26-4880-b08a-9e87f8c3f873"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf7PdNHiVemamX1L9TN","type":"message","role":"assistant","content":[{"type":"text","text":"Mobile est propre aussi (héros → carte → index empilés). Il reste l'envoi de test réel et le commit."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":544,"cache_read_input_tokens":153384,"cache_creation":{"ephemeral_5m_input_tokens":544,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1a9b4cbe-a746-4cf4-9ec7-97f15d82600c"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf7PdNHiVemamX1L9TN","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Gwkd5a47tNCo77MGLjVNiC","name":"TodoWrite","input":{"todos":[{"content":"Refonte gabarits courriel Resend aux couleurs Groupe Ka","status":"completed","activeForm":"Refonte des gabarits courriel"},{"content":"Refonte page /connexion (composition éditoriale V2)","status":"completed","activeForm":"Refonte de la page de connexion"},{"content":"Build + pm2 restart + vérification visuelle (Playwright)","status":"completed","activeForm":"Build et vérification visuelle"},{"content":"Test envoi réel Resend + commit/push spbgit","status":"in_progress","activeForm":"Test d'envoi et commit"}]},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":544,"cache_read_input_tokens":153384,"cache_creation":{"ephemeral_5m_input_tokens":544,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"d458ae39-f070-4577-adb6-f06577d8f984"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Gwkd5a47tNCo77MGLjVNiC","type":"tool_result","content":"Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"56a84537-d6e7-41ac-b518-e34225d86151","timestamp":"2026-08-26T16:15:06.562Z","tool_use_result":{"oldTodos":[{"content":"Refonte gabarits courriel Resend aux couleurs Groupe Ka","status":"in_progress","activeForm":"Refonte des gabarits courriel"},{"content":"Refonte page /connexion (composition éditoriale V2)","status":"pending","activeForm":"Refonte de la page de connexion"},{"content":"Build + pm2 restart + vérification visuelle (Playwright)","status":"pending","activeForm":"Build et vérification visuelle"},{"content":"Test envoi réel Resend + commit/push spbgit","status":"pending","activeForm":"Test d'envoi et commit"}],"newTodos":[{"content":"Refonte gabarits courriel Resend aux couleurs Groupe Ka","status":"completed","activeForm":"Refonte des gabarits courriel"},{"content":"Refonte page /connexion (composition éditoriale V2)","status":"completed","activeForm":"Refonte de la page de connexion"},{"content":"Build + pm2 restart + vérification visuelle (Playwright)","status":"completed","activeForm":"Build et vérification visuelle"},{"content":"Test envoi réel Resend + commit/push spbgit","status":"in_progress","activeForm":"Test d'envoi et commit"}],"verificationNudgeNeeded":false}}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf7PdNHiVemamX1L9TN","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_017uAHsap28QiqbkJvfqHvwr","name":"Bash","input":{"command":"curl -s -X POST http://127.0.0.1:8110/api/auth/magic -H \"Content-Type: application/json\" -d '{\"email\":\"delivered@resend.dev\"}'; echo; sqlite3 data/ka-id.db \"SELECT COUNT(*) FROM users WHERE email='delivered@resend.dev';\"","description":"Vérifier l'envoi réel via le flux magic (compte de test absent → aucun envoi)","timeout":60000},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":544,"cache_read_input_tokens":153384,"cache_creation":{"ephemeral_5m_input_tokens":544,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"68b79516-53e1-4c00-9fd4-ebeabb253978"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"curl -s -X POST http://127.0.0.1:8110/api/auth/magic -H \"Content-Type: application/json\" -d '{\"email\":\"delivered@resend.dev\"}'; echo; sqlite3 data/ka-id.db \"SELECT COUNT(*) FROM users WHERE email='delivered@resend.dev';\"","timeout":60000,"description":"Vérifier l'envoi réel via le flux magic (compte de test absent → aucun envoi)"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_017uAHsap28QiqbkJvfqHvwr","type":"tool_result","content":"{\"ok\":true,\"sent\":true,\"email\":\"delivered@resend.dev\"}\n0","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"14cc87fc-8bf1-47d8-8ad4-5c70463d6460","timestamp":"2026-08-26T16:15:08.796Z","tool_use_result":{"stdout":"{\"ok\":true,\"sent\":true,\"email\":\"delivered@resend.dev\"}\n0","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"22160f18-1939-4f61-802d-ab5ed4ba39be","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf88fEi8Vn21qgRCLE8","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAIS+wMKpwEIERgCKkCrWdmxCQbHfUmAHP9ZcAFgQmp+cgZChBrAi4vxRYJd8Ae6RZUENjAt5d5xqvx1wn8zDqpzr3oYYChurwb4Hi/oMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAGSorzUBrABAhIMquxsACGQgw6vHHPhGgx+AmMNRdnTo7t5y9UiMNj5iJ9oniZNLKAWRk7yAwO09z30JDKsb6Y9ZyZ66Sx+xUq7ww68rxCQdEHYrMn/cSqAAr5aVH/1vnxgG/ZDeTF+PrgiSUF6BSP1SgxkBP7+tifUSQPD3NGm7WdtSC2Vq9n+1VfckEh1fuBsKN7Md1HlAI5iJPkkb9clQZKYYKbV1wD95E3TymOePD0ZgjML5skjUsGbn6NEZmq8HZ6RoySXv3iVPNUEKrtEAZpp/UvGWDjtpMuw9U2JK1wbPBT1HCVM5kDMWUiVRJuWMTVK/JLxJk9vVrqQRUWtT2IvzJSXtEjnZeznCNiwvbGu4/MI9W+bCj/mPU8e7YkHe8SQucw6/EJvYu8Lnz9x0y2JLcZOoRaYZGhA3oghMKkMuQGvgij7fLvb0yHG2NUubZUkKGw3TYMYAQ=="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":785,"cache_read_input_tokens":153928,"cache_creation":{"ephemeral_5m_input_tokens":785,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"8f00fb9b-2a90-42df-bcb9-2463d559caaa"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf88fEi8Vn21qgRCLE8","type":"message","role":"assistant","content":[{"type":"text","text":"Le compte de test n'existe plus, donc aucun envoi n'a eu lieu (anti-énumération — normal). Je passe par l'inscription pour forcer un envoi réel du nouveau gabarit, puis je nettoie."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":785,"cache_read_input_tokens":153928,"cache_creation":{"ephemeral_5m_input_tokens":785,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"be73be97-e9db-41ad-9467-95da75ed13e7"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf88fEi8Vn21qgRCLE8","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_016zzynEqcEXY57v2W3wBkxB","name":"Bash","input":{"command":"curl -s -X POST http://127.0.0.1:8110/api/auth/register -H \"Content-Type: application/json\" -d '{\"email\":\"delivered@resend.dev\",\"password\":\"test-mdp-12345\",\"name\":\"Test Gabarit\",\"role\":\"membre\"}'; echo; sqlite3 data/ka-id.db \"DELETE FROM auth_tokens WHERE email='delivered@resend.dev'; DELETE FROM users WHERE email='delivered@resend.dev'; SELECT 'nettoyé';\"","description":"Envoyer réellement le nouveau courriel de vérification via Resend puis nettoyer","timeout":60000},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":785,"cache_read_input_tokens":153928,"cache_creation":{"ephemeral_5m_input_tokens":785,"ephemeral_1h_input_tokens":0},"output_tokens":3,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"59d7409f-49a3-416a-b70d-c614aa7f7ebd"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"curl -s -X POST http://127.0.0.1:8110/api/auth/register -H \"Content-Type: application/json\" -d '{\"email\":\"delivered@resend.dev\",\"password\":\"test-mdp-12345\",\"name\":\"Test Gabarit\",\"role\":\"membre\"}'; echo; sqlite3 data/ka-id.db \"DELETE FROM auth_tokens WHERE email='delivered@resend.dev'; DELETE FROM users WHERE email='delivered@resend.dev'; SELECT 'nettoyé';\"","timeout":60000,"description":"Envoyer réellement le nouveau courriel de vérification via Resend puis nettoyer"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_016zzynEqcEXY57v2W3wBkxB","type":"tool_result","content":"{\"ok\":true,\"verify\":true,\"email\":\"delivered@resend.dev\"}\nnettoyé","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"1bc1b3b6-dd85-4d52-a4c2-104ac2d6751d","timestamp":"2026-08-26T16:15:17.319Z","tool_use_result":{"stdout":"{\"ok\":true,\"verify\":true,\"email\":\"delivered@resend.dev\"}\nnettoyé","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"0a554f81-f409-4908-965d-5ae98ec3f5e8","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf8mgSoMxdMtiBMiVz4","type":"message","role":"assistant","content":[{"type":"text","text":"Envoi réel accepté par Resend avec le nouveau gabarit. Commit et push."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":485,"cache_read_input_tokens":154713,"cache_creation":{"ephemeral_5m_input_tokens":485,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"b41f6022-eb9a-48f6-88fc-c13fc771d87e"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf8mgSoMxdMtiBMiVz4","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01MBmAozvV9k7i7yb3Q5n8MV","name":"Bash","input":{"command":"git add src/lib/email.ts src/app/connexion/page.tsx src/app/connexion/AuthForm.tsx && git commit -m \"$(cat <<'EOF'\ndesign(ka-id): courriels et page de connexion à l'identité « éditorial sharp »\n\n- gabarits Resend refaits en tables HTML compatibles clients courriel : manchette « Groupe [Ka] » à puce lime, carte blanche à bordure encre + ombre décalée dure, bouton pilule encre/lime, panneau code 2FA encre/lime façon carte de membre, micro-étiquettes mono uppercase, pied écosystème\n- /connexion recomposée en éditorial HQ : héros display géant à gauche (« Un seul ·Ka pour tout »), points de confiance en filets (lien magique, 2FA, Loi 25), carte d'auth à droite avec en-tête d'inventaire, index des 12 plateformes en filets sous la pliure\n- vérifié par captures Chromium headless (courriels + page desktop 1440 et mobile 390) et envoi Resend réel\n\nCo-Authored-By: Claude Opus 4.7 \nEOF\n)\" && git push origin main && git status | tail -2","description":"Committer et pousser la refonte design vers spbgit"},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":485,"cache_read_input_tokens":154713,"cache_creation":{"ephemeral_5m_input_tokens":485,"ephemeral_1h_input_tokens":0},"output_tokens":2,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"384a2394-46cb-4685-946a-49b1ffcebec2"}} {"type":"permission_auto","tool":"Bash","key":"tout autoriser","input":{"command":"git add src/lib/email.ts src/app/connexion/page.tsx src/app/connexion/AuthForm.tsx && git commit -m \"$(cat <<'EOF'\ndesign(ka-id): courriels et page de connexion à l'identité « éditorial sharp »\n\n- gabarits Resend refaits en tables HTML compatibles clients courriel : manchette « Groupe [Ka] » à puce lime, carte blanche à bordure encre + ombre décalée dure, bouton pilule encre/lime, panneau code 2FA encre/lime façon carte de membre, micro-étiquettes mono uppercase, pied écosystème\n- /connexion recomposée en éditorial HQ : héros display géant à gauche (« Un seul ·Ka pour tout »), points de confiance en filets (lien magique, 2FA, Loi 25), carte d'auth à droite avec en-tête d'inventaire, index des 12 plateformes en filets sous la pliure\n- vérifié par captures Chromium headless (courriels + page desktop 1440 et mobile 390) et envoi Resend réel\n\nCo-Authored-By: Claude Opus 4.7 \nEOF\n)\" && git push origin main && git status | tail -2","description":"Committer et pousser la refonte design vers spbgit"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01MBmAozvV9k7i7yb3Q5n8MV","type":"tool_result","content":"[main a115ae1] design(ka-id): courriels et page de connexion à l'identité « éditorial sharp »\n 3 files changed, 280 insertions(+), 60 deletions(-)\nTo gitsrv:srv/git/groupe-ka.git\n 0d1813c..a115ae1 main -> main\n\nnothing to commit, working tree clean","is_error":false}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"55fcd921-8a70-4f16-9325-14c8aec7fb26","timestamp":"2026-08-26T16:15:27.356Z","tool_use_result":{"stdout":"[main a115ae1] design(ka-id): courriels et page de connexion à l'identité « éditorial sharp »\n 3 files changed, 280 insertions(+), 60 deletions(-)\nTo gitsrv:srv/git/groupe-ka.git\n 0d1813c..a115ae1 main -> main\n\nnothing to commit, working tree clean","stderr":"","interrupted":false,"isImage":false,"noOutputExpected":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"794a65bd-1b09-4da9-a595-9efb354ff086","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf9VfKAySFc9bGGMf33","type":"message","role":"assistant","content":[{"type":"tool_use","id":"toolu_01Jk3Tfy2EjghB635wkkcgAi","name":"TodoWrite","input":{"todos":[{"content":"Refonte gabarits courriel Resend aux couleurs Groupe Ka","status":"completed","activeForm":"Refonte des gabarits courriel"},{"content":"Refonte page /connexion (composition éditoriale V2)","status":"completed","activeForm":"Refonte de la page de connexion"},{"content":"Build + pm2 restart + vérification visuelle (Playwright)","status":"completed","activeForm":"Build et vérification visuelle"},{"content":"Test envoi réel Resend + commit/push spbgit","status":"completed","activeForm":"Test d'envoi et commit"}]},"caller":{"type":"direct"}}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":658,"cache_read_input_tokens":155198,"cache_creation":{"ephemeral_5m_input_tokens":658,"ephemeral_1h_input_tokens":0},"output_tokens":23,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"fb19fb13-6463-4232-9947-0e688fa752c1"}} {"type":"claude","event":{"type":"user","message":{"role":"user","content":[{"tool_use_id":"toolu_01Jk3Tfy2EjghB635wkkcgAi","type":"tool_result","content":"Todos have been modified successfully. Ensure that you continue to use the todo list to track your progress. Please proceed with the current tasks if applicable"}]},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"11a2f0f0-9042-47f3-9364-c29e17aa8551","timestamp":"2026-08-26T16:15:32.824Z","tool_use_result":{"oldTodos":[{"content":"Refonte gabarits courriel Resend aux couleurs Groupe Ka","status":"completed","activeForm":"Refonte des gabarits courriel"},{"content":"Refonte page /connexion (composition éditoriale V2)","status":"completed","activeForm":"Refonte de la page de connexion"},{"content":"Build + pm2 restart + vérification visuelle (Playwright)","status":"completed","activeForm":"Build et vérification visuelle"},{"content":"Test envoi réel Resend + commit/push spbgit","status":"in_progress","activeForm":"Test d'envoi et commit"}],"newTodos":[{"content":"Refonte gabarits courriel Resend aux couleurs Groupe Ka","status":"completed","activeForm":"Refonte des gabarits courriel"},{"content":"Refonte page /connexion (composition éditoriale V2)","status":"completed","activeForm":"Refonte de la page de connexion"},{"content":"Build + pm2 restart + vérification visuelle (Playwright)","status":"completed","activeForm":"Build et vérification visuelle"},{"content":"Test envoi réel Resend + commit/push spbgit","status":"completed","activeForm":"Test d'envoi et commit"}],"verificationNudgeNeeded":false}}} {"type":"claude","event":{"type":"system","subtype":"status","status":"requesting","uuid":"9fee06c9-9300-45dc-88d0-ddcd2467f507","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf9uKcNV8uB4MwfpFpJ","type":"message","role":"assistant","content":[{"type":"thinking","thinking":"","signature":"CAISywIKpwEIERgCKkBwzS+RaaoLS8xuM8fkXKEXkYzxAqAfGvYeVdZQUq3PUA8aUQtZ+TXKWGt+fxmYu/ccltuVLdVrW8dkDKzWzfVvMg5jbGF1ZGUtZmFibGUtNTgBQgh0aGlua2luZ1okNmZjYzhmODMtMWY5Yy00ZDMzLWJhMDctNGQ0ZGYzN2Q2N2Y1chCLToDU25FEmjjVqZecraU5iAEBqAGyorzUBrABAhIMiqKve0ITzxOtrs/1GgxC/V1vLxWHRnVZjxAiMLtuNUyK4aJ85NYOHr70wrvAgYHW2mBANcB5DbVbMrlCnz8q4yhUpWd6HbVP83OI+CpRU+XrUQCpePlQdM18w+t11F2WpLGKd6VnAPTy87n7aJGdF3qmh8GKVsLlR3Du/O99BCJRkKhCMrI8+4t+Ysca0KFPnLzQ5bcw9ilGvh3D4uoSGAE="}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":346,"cache_read_input_tokens":155856,"cache_creation":{"ephemeral_5m_input_tokens":346,"ephemeral_1h_input_tokens":0},"output_tokens":6,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"b5c5bf54-9387-4e9c-bce5-aafade9508c8"}} {"type":"claude","event":{"type":"assistant","message":{"model":"claude-fable-5","id":"msg_011CeRf9uKcNV8uB4MwfpFpJ","type":"message","role":"assistant","content":[{"type":"text","text":"Terminé — commit `a115ae1` poussé sur spbgit, app rebuild + redémarrée, prod en ligne, le tout vérifié par captures Chromium et un envoi Resend réel.\n\n**Courriels** — maintenant 100 % à l'identité « éditorial sharp » du site, en tables HTML compatibles Gmail/Apple Mail/Outlook :\n- Manchette **Groupe [Ka]** avec la puce lime signature + étiquette mono à droite (« KA ID · Vérification », etc.)\n- Carte blanche à **bordure encre avec ombre décalée dure** (le néo-brutalisme du site), kicker vert à filet, titres Space Grotesk\n- **Code 2FA sur panneau encre/lime** façon carte de membre — gros chiffres lime espacés, mentions « valable 10 minutes · usage unique »\n- Bouton pilule encre → texte lime (le btn-primary du site) avec lien de secours copiable\n- Pied « Un seul compte · tout l'écosystème » avec la liste des plateformes\n\n**Page /connexion** — recomposée dans le langage éditorial « HQ » de l'accueil :\n- Desktop : héros display géant à gauche (« UN SEUL **·KA** POUR TOUT » avec surlignage lime incliné) + trois points de confiance en filets numérotés (sans mot de passe, 2FA, Loi 25) ; carte d'authentification à droite avec en-tête d'inventaire mono\n- En bas : **index des 12 plateformes** en filets (Lou·Ka Location, Immo·Ka Immobilier, …)\n- Mobile : héros compact → carte → rappel « Lien magique · Code 2FA · Loi 25 » → index, en flux naturel\n\nVérifié : captures headless des 3 courriels + page desktop (1440) et mobile (390), et un envoi réel du gabarit de vérification accepté par l'API Resend."}],"stop_reason":null,"stop_sequence":null,"stop_details":null,"usage":{"input_tokens":2,"cache_creation_input_tokens":346,"cache_read_input_tokens":155856,"cache_creation":{"ephemeral_5m_input_tokens":346,"ephemeral_1h_input_tokens":0},"output_tokens":6,"service_tier":"standard","inference_geo":"global"},"context_management":null},"parent_tool_use_id":null,"session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","uuid":"7a257597-f561-4da2-837f-e99cf1ffe39e"}} {"type":"claude","event":{"type":"result","subtype":"success","is_error":false,"api_error_status":null,"duration_ms":351060,"duration_api_ms":339718,"num_turns":23,"result":"Terminé — commit `a115ae1` poussé sur spbgit, app rebuild + redémarrée, prod en ligne, le tout vérifié par captures Chromium et un envoi Resend réel.\n\n**Courriels** — maintenant 100 % à l'identité « éditorial sharp » du site, en tables HTML compatibles Gmail/Apple Mail/Outlook :\n- Manchette **Groupe [Ka]** avec la puce lime signature + étiquette mono à droite (« KA ID · Vérification », etc.)\n- Carte blanche à **bordure encre avec ombre décalée dure** (le néo-brutalisme du site), kicker vert à filet, titres Space Grotesk\n- **Code 2FA sur panneau encre/lime** façon carte de membre — gros chiffres lime espacés, mentions « valable 10 minutes · usage unique »\n- Bouton pilule encre → texte lime (le btn-primary du site) avec lien de secours copiable\n- Pied « Un seul compte · tout l'écosystème » avec la liste des plateformes\n\n**Page /connexion** — recomposée dans le langage éditorial « HQ » de l'accueil :\n- Desktop : héros display géant à gauche (« UN SEUL **·KA** POUR TOUT » avec surlignage lime incliné) + trois points de confiance en filets numérotés (sans mot de passe, 2FA, Loi 25) ; carte d'authentification à droite avec en-tête d'inventaire mono\n- En bas : **index des 12 plateformes** en filets (Lou·Ka Location, Immo·Ka Immobilier, …)\n- Mobile : héros compact → carte → rappel « Lien magique · Code 2FA · Loi 25 » → index, en flux naturel\n\nVérifié : captures headless des 3 courriels + page desktop (1440) et mobile (390), et un envoi réel du gabarit de vérification accepté par l'API Resend.","stop_reason":"end_turn","session_id":"156dd4cb-d451-4b4f-b9e8-27bb3affc61b","total_cost_usd":1.7949323999999995,"usage":{"input_tokens":42,"cache_creation_input_tokens":156202,"cache_read_input_tokens":2877913,"output_tokens":23045,"server_tool_use":{"web_search_requests":0,"web_fetch_requests":0},"service_tier":"standard","cache_creation":{"ephemeral_1h_input_tokens":0,"ephemeral_5m_input_tokens":156202},"inference_geo":"","iterations":[{"input_tokens":2,"output_tokens":691,"cache_read_input_tokens":155856,"cache_creation_input_tokens":346,"cache_creation":{"ephemeral_5m_input_tokens":346,"ephemeral_1h_input_tokens":0},"type":"message"}],"speed":"standard"},"modelUsage":{"claude-fable-5":{"inputTokens":42,"outputTokens":23045,"cacheReadInputTokens":2877913,"cacheCreationInputTokens":156202,"webSearchRequests":0,"costUSD":1.7949323999999995,"contextWindow":200000,"maxOutputTokens":32000}},"permission_denials":[],"terminal_reason":"completed","fast_mode_state":"off","uuid":"befdc036-04a1-4fcd-b593-ce6ff9baa7d3"}} {"type":"status","state":"idle"}