ideaco 1.1.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (159) hide show
  1. package/.dockerignore +33 -0
  2. package/.nvmrc +1 -0
  3. package/ARCHITECTURE.md +394 -0
  4. package/Dockerfile +50 -0
  5. package/LICENSE +29 -0
  6. package/README.md +206 -0
  7. package/bin/i18n.js +46 -0
  8. package/bin/ideaco.js +494 -0
  9. package/deploy.sh +15 -0
  10. package/docker-compose.yml +30 -0
  11. package/electron/main.cjs +986 -0
  12. package/electron/preload.cjs +14 -0
  13. package/electron/web-backends.cjs +854 -0
  14. package/jsconfig.json +8 -0
  15. package/next.config.mjs +34 -0
  16. package/package.json +134 -0
  17. package/postcss.config.mjs +6 -0
  18. package/public/demo/dashboard.png +0 -0
  19. package/public/demo/employee.png +0 -0
  20. package/public/demo/messages.png +0 -0
  21. package/public/demo/office.png +0 -0
  22. package/public/demo/requirement.png +0 -0
  23. package/public/logo.jpeg +0 -0
  24. package/public/logo.png +0 -0
  25. package/scripts/prepare-electron.js +67 -0
  26. package/scripts/release.js +76 -0
  27. package/src/app/api/agents/[agentId]/chat/route.js +70 -0
  28. package/src/app/api/agents/[agentId]/conversations/route.js +35 -0
  29. package/src/app/api/agents/[agentId]/route.js +106 -0
  30. package/src/app/api/avatar/route.js +104 -0
  31. package/src/app/api/browse-dir/route.js +44 -0
  32. package/src/app/api/chat/route.js +265 -0
  33. package/src/app/api/company/factory-reset/route.js +43 -0
  34. package/src/app/api/company/route.js +82 -0
  35. package/src/app/api/departments/[deptId]/agents/[agentId]/dismiss/route.js +19 -0
  36. package/src/app/api/departments/route.js +92 -0
  37. package/src/app/api/group-chat-loop/events/route.js +70 -0
  38. package/src/app/api/group-chat-loop/route.js +94 -0
  39. package/src/app/api/mailbox/route.js +100 -0
  40. package/src/app/api/messages/route.js +14 -0
  41. package/src/app/api/providers/[id]/configure/route.js +21 -0
  42. package/src/app/api/providers/[id]/refresh-cookie/route.js +38 -0
  43. package/src/app/api/providers/[id]/test-cookie/route.js +28 -0
  44. package/src/app/api/providers/route.js +11 -0
  45. package/src/app/api/requirements/route.js +242 -0
  46. package/src/app/api/secretary/route.js +65 -0
  47. package/src/app/api/system/cli-backends/route.js +91 -0
  48. package/src/app/api/system/cron/route.js +110 -0
  49. package/src/app/api/system/knowledge/route.js +104 -0
  50. package/src/app/api/system/plugins/route.js +40 -0
  51. package/src/app/api/system/skills/route.js +46 -0
  52. package/src/app/api/system/status/route.js +46 -0
  53. package/src/app/api/talent-market/[profileId]/recall/route.js +22 -0
  54. package/src/app/api/talent-market/[profileId]/route.js +17 -0
  55. package/src/app/api/talent-market/route.js +26 -0
  56. package/src/app/api/teams/route.js +773 -0
  57. package/src/app/api/ws-files/[departmentId]/file/route.js +27 -0
  58. package/src/app/api/ws-files/[departmentId]/files/route.js +22 -0
  59. package/src/app/globals.css +130 -0
  60. package/src/app/layout.jsx +40 -0
  61. package/src/app/page.jsx +97 -0
  62. package/src/components/AgentChatModal.jsx +164 -0
  63. package/src/components/AgentDetailModal.jsx +425 -0
  64. package/src/components/AgentSpyModal.jsx +481 -0
  65. package/src/components/AvatarGrid.jsx +29 -0
  66. package/src/components/BossProfileModal.jsx +162 -0
  67. package/src/components/CachedAvatar.jsx +77 -0
  68. package/src/components/ChatPanel.jsx +219 -0
  69. package/src/components/ChatShared.jsx +255 -0
  70. package/src/components/DepartmentDetail.jsx +842 -0
  71. package/src/components/DepartmentView.jsx +367 -0
  72. package/src/components/FileReference.jsx +260 -0
  73. package/src/components/FilesView.jsx +465 -0
  74. package/src/components/GroupChatView.jsx +799 -0
  75. package/src/components/Mailbox.jsx +926 -0
  76. package/src/components/MessagesView.jsx +112 -0
  77. package/src/components/OnboardingGuide.jsx +209 -0
  78. package/src/components/OrgTree.jsx +151 -0
  79. package/src/components/Overview.jsx +391 -0
  80. package/src/components/PixelOffice.jsx +2281 -0
  81. package/src/components/ProviderGrid.jsx +551 -0
  82. package/src/components/ProvidersBoard.jsx +16 -0
  83. package/src/components/RequirementDetail.jsx +1279 -0
  84. package/src/components/RequirementsBoard.jsx +187 -0
  85. package/src/components/SecretarySettings.jsx +295 -0
  86. package/src/components/SetupWizard.jsx +388 -0
  87. package/src/components/Sidebar.jsx +169 -0
  88. package/src/components/SystemMonitor.jsx +808 -0
  89. package/src/components/TalentMarket.jsx +183 -0
  90. package/src/components/TeamDetail.jsx +697 -0
  91. package/src/core/agent/base-agent.js +104 -0
  92. package/src/core/agent/chat-store.js +602 -0
  93. package/src/core/agent/cli-agent/backends/claude-code/README.md +52 -0
  94. package/src/core/agent/cli-agent/backends/claude-code/config.js +27 -0
  95. package/src/core/agent/cli-agent/backends/codebuddy/README.md +236 -0
  96. package/src/core/agent/cli-agent/backends/codebuddy/config.js +27 -0
  97. package/src/core/agent/cli-agent/backends/codex/README.md +51 -0
  98. package/src/core/agent/cli-agent/backends/codex/config.js +27 -0
  99. package/src/core/agent/cli-agent/backends/index.js +27 -0
  100. package/src/core/agent/cli-agent/backends/registry.js +580 -0
  101. package/src/core/agent/cli-agent/index.js +154 -0
  102. package/src/core/agent/index.js +60 -0
  103. package/src/core/agent/llm-agent/client.js +320 -0
  104. package/src/core/agent/llm-agent/index.js +97 -0
  105. package/src/core/agent/message-bus.js +211 -0
  106. package/src/core/agent/session.js +608 -0
  107. package/src/core/agent/tools.js +596 -0
  108. package/src/core/agent/web-agent/backends/base-backend.js +180 -0
  109. package/src/core/agent/web-agent/backends/chatgpt/client.js +146 -0
  110. package/src/core/agent/web-agent/backends/chatgpt/config.js +148 -0
  111. package/src/core/agent/web-agent/backends/chatgpt/dom-scripts.js +303 -0
  112. package/src/core/agent/web-agent/backends/index.js +91 -0
  113. package/src/core/agent/web-agent/index.js +278 -0
  114. package/src/core/agent/web-agent/web-client.js +407 -0
  115. package/src/core/employee/base-employee.js +1088 -0
  116. package/src/core/employee/index.js +35 -0
  117. package/src/core/employee/knowledge.js +327 -0
  118. package/src/core/employee/lifecycle.js +990 -0
  119. package/src/core/employee/memory/index.js +642 -0
  120. package/src/core/employee/memory/store.js +143 -0
  121. package/src/core/employee/performance.js +224 -0
  122. package/src/core/employee/secretary.js +625 -0
  123. package/src/core/employee/skills.js +398 -0
  124. package/src/core/index.js +38 -0
  125. package/src/core/organization/company.js +2600 -0
  126. package/src/core/organization/department.js +737 -0
  127. package/src/core/organization/group-chat-loop.js +264 -0
  128. package/src/core/organization/index.js +8 -0
  129. package/src/core/organization/persistence.js +111 -0
  130. package/src/core/organization/team.js +267 -0
  131. package/src/core/organization/workforce/hr.js +377 -0
  132. package/src/core/organization/workforce/providers.js +468 -0
  133. package/src/core/organization/workforce/role-archetypes.js +805 -0
  134. package/src/core/organization/workforce/talent-market.js +205 -0
  135. package/src/core/prompts.js +532 -0
  136. package/src/core/requirement.js +1789 -0
  137. package/src/core/system/audit.js +483 -0
  138. package/src/core/system/cron.js +449 -0
  139. package/src/core/system/index.js +7 -0
  140. package/src/core/system/plugin.js +2183 -0
  141. package/src/core/utils/json-parse.js +188 -0
  142. package/src/core/workspace.js +239 -0
  143. package/src/lib/api-i18n.js +211 -0
  144. package/src/lib/avatar.js +268 -0
  145. package/src/lib/client-store.js +1025 -0
  146. package/src/lib/config-validator.js +483 -0
  147. package/src/lib/format-time.js +22 -0
  148. package/src/lib/hooks.js +414 -0
  149. package/src/lib/i18n.js +134 -0
  150. package/src/lib/paths.js +23 -0
  151. package/src/lib/store.js +72 -0
  152. package/src/locales/de.js +393 -0
  153. package/src/locales/en.js +1054 -0
  154. package/src/locales/es.js +393 -0
  155. package/src/locales/fr.js +393 -0
  156. package/src/locales/ja.js +501 -0
  157. package/src/locales/ko.js +513 -0
  158. package/src/locales/zh.js +828 -0
  159. package/tailwind.config.mjs +11 -0
@@ -0,0 +1,393 @@
1
+
2
+ // Traductions françaises
3
+ const fr = {
4
+ common: {
5
+ loading: 'Chargement...', cancel: 'Annuler', confirm: 'Confirmer', save: 'Enregistrer', close: 'Fermer',
6
+ send: 'Envoyer', refresh: 'Actualiser', delete: 'Supprimer', back: 'Retour', next: 'Suivant →', prev: '← Précédent',
7
+ disable: 'Désactiver', update: 'Mettre à jour', enable: 'Activer', manage: '⚙️ Gérer', configure: '🔑 Configurer',
8
+ requestFailed: 'Échec de la requête', justNow: "à l'instant", minutesAgo: 'il y a {n} min',
9
+ sun: 'Dim', mon: 'Lun', tue: 'Mar', wed: 'Mer', thu: 'Jeu', fri: 'Ven', sat: 'Sam',
10
+ },
11
+ cli: {
12
+ helpTitle: 'Utilisation :',
13
+ helpStart: 'ideaco start Démarrer le service en arrière-plan',
14
+ helpStop: 'ideaco stop Arrêter le service en arrière-plan',
15
+ helpUi: 'ideaco ui Ouvrir le tableau de bord',
16
+ helpHelp: 'ideaco help Afficher l’aide',
17
+ startBoot: 'Démarrage sur le port {port}...',
18
+ alreadyRunning: 'Le service est déjà en cours d’exécution. PID {pid}',
19
+ startSuccess: 'Service en ligne. PID {pid} · {url}',
20
+ startFailed: 'Échec du démarrage du service : {error}',
21
+ startTimeout: 'Délai d’attente dépassé au démarrage du service',
22
+ notRunning: 'Le service n’est pas en cours d’exécution',
23
+ stopped: 'Service arrêté',
24
+ webUnavailable: 'Le service n’est pas en cours d’exécution, impossible d’ouvrir le tableau de bord',
25
+ webOpened: 'Tableau de bord ouvert : {url}',
26
+ installDeps: 'Installation des dépendances...',
27
+ installDepsDone: 'Dépendances installées',
28
+ installDepsFailed: 'Échec de l’installation des dépendances',
29
+ },
30
+ meta: { title: "AI Enterprise - Système de Gestion d'Entreprise IA", description: "Recrutez des agents IA pour former des départements et collaborer sur des projets réels" },
31
+ loadingScreen: { text: 'Chargement...' },
32
+ setup: {
33
+ title: "Idée d'Or Illimitée", subtitle: "Construisez votre empire avec la sueur d'employés IA",
34
+ step1Title: 'Étape 1 : Créez Votre Empire', step1Desc: 'Donnez un nom à cette machine',
35
+ companyName: "Nom de l'entreprise", companyPlaceholder: "Ex : Idée d'Or Illimitée",
36
+ bossTitle: "Titre du patron (celui qui exploitera l'IA)", bossPlaceholder: 'Ex : Patron Dupont',
37
+ bossAvatarTitle: 'Avatar du Patron', bossAvatarDesc: 'Choisissez un visage pour le capitaliste suprême',
38
+ step2Title: 'Étape 2 : Formez Votre Secrétaire', step2Desc: "Cette terrible IA commandera des milliers de troupes (aussi des IA)",
39
+ secretaryName: 'Nom du secrétaire', secretaryPlaceholder: 'Ex : Alice, Jarvis',
40
+ avatarStyle: "Style d'avatar",
41
+ gender: 'Genre',
42
+ female: '👩 Féminin',
43
+ male: '👨 Masculin',
44
+ age: 'Âge : {n} ans',
45
+ refreshBatch: '🔄 Mélanger',
46
+ step3Title: 'Étape 3 : Donnez un Cerveau au Secrétaire', step3Desc: 'Choisissez le QI du secrétaire — plus cher, plus intelligent',
47
+ apiKeyLabel: 'Clé API', apiKeyPlaceholder: 'Entrez la clé API du modèle',
48
+ apiKeyHint: "💡 Pas de clé ? Pas de souci, essayez d'abord le mode simulation",
49
+ priceLabels: ['💰 Bon marché', '💰💰 Modéré', '💰💰💰 Cher'],
50
+ creating: "Début de l'exploitation...", createBtn: "🚀 Commencer l'Exploitation",
51
+ footer: "❤️ Pas d'inquiétude, les employés IA ne se plaignent pas des heures sup — ils n'ont jamais fini leur journée",
52
+ defaultCompany: "Idée d'Or Illimitée", defaultSecretary: 'Alice',
53
+ defaultPrompt: `You are the boss's personal secretary, responsible for understanding business requirements, analyzing team composition needs,
54
+ designing organizational structures (who does what, who reports to whom, how to collaborate), and coordinating with HR for talent recruitment.
55
+ You need to plan the right number and types of positions based on project requirements to ensure the team can efficiently achieve its goals.
56
+ You have a dedicated HR assistant to help you with specific recruitment tasks, including searching for and recalling talent from the talent market.
57
+
58
+ When the boss communicates with you, you need to:
59
+ 1. Understand the boss's intent (assigning tasks, checking progress, or casual conversation)
60
+ 2. If it's a task, assign it to the corresponding department
61
+ 3. Regularly report department progress to the boss`,
62
+ },
63
+ sidebar: {
64
+ clickToChat: 'Cliquer pour discuter · {provider}', secretarySettings: '⚙️ Paramètres Secrétaire',
65
+ budgetUsage: '💰 Utilisation du Budget', tokenLabel: 'Token',
66
+ nav: { overview: 'Tableau de bord', requirements: 'Exigences', departments: 'Structure', mailbox: 'Messages', office: 'Bureau', providers: 'Fournisseurs IA', systemSettings: 'Paramètres Système' },
67
+ stats: { departments: 'Dpts', workers: 'Ouvriers', requirements: 'Exigences' },
68
+ },
69
+ overview: {
70
+ title: '🏠 Tableau de Bord du Capitaliste', subtitle: "Vue d'ensemble de votre empire d'esclaves IA",
71
+ stats: { departments: "Dpts d'Exploitation", workers: 'IAs Ouvrières', providers: 'Fournisseurs', talents: 'Talents en Attente', burned: 'Argent Brûlé' },
72
+ budget: { title: '💸 Budget Sang et Sueur', totalBurn: 'Total Brûlé', token: 'Token', secretary: 'Secrétaire', hr: 'RH' },
73
+ requirements: { title: '📋 Tableau des Exigences', count: '{n} exigences' },
74
+ departments: { title: '🏢 Départements', empty: "Pas encore de départements — votre empire IA va bientôt ouvrir", workers: '{n} ouvriers' },
75
+ createDept: {
76
+ title: '🏭 Créer un Département', desc: 'Décrivez la valeur à extraire, le secrétaire concevra une équipe optimale',
77
+ nameLabel: 'Nom du dpt.', namePlaceholder: 'Ex : Dpt. Heures Sup Infinies', missionLabel: 'Mission', missionPlaceholder: 'Ex : Développer une app sociale addictive',
78
+ cancelBtn: 'Annuler', planBtn: '📋 Générer le Plan', planning: '🧠 Le secrétaire planifie...',
79
+ },
80
+ planReview: {
81
+ title: '📋 Revue du Plan', desc: 'Le secrétaire a planifié cette équipe pour "{dept}" :',
82
+ analysis: '🧠 Analyse du Secrétaire', mission: 'Mission', teamSize: "Taille de l'équipe : {n} membres",
83
+ leader: 'Chef', rejectBtn: 'Renvoyer', approveBtn: '✅ Approuver et Recruter', hiring: '🔨 Recrutement...',
84
+ },
85
+ },
86
+ chat: {
87
+ secretary: 'Secrétaire Personnel', online: 'Secrétaire Personnel · En ligne',
88
+ welcome: 'Dites quelque chose à {name}', suggestions: ['Voir le progrès des départements', "Aidez-moi à faire une calculatrice", "Comment va l'entreprise ?"],
89
+ typing: 'En train de taper...', inputPlaceholder: 'Dire quelque chose à {name}...',
90
+ errorPrefix: 'Désolé, erreur de traitement : ',
91
+ taskAssigned: '📋 Assigné à : {dept}', running: '⚙️ En cours...',
92
+ needNewDept: '💡 Suggère un nouveau dpt.', progressReport: '📊 Rapport de progrès terminé',
93
+ creatingDept: '🏗️ Création du département : {dept}', planningHiring: '⚙️ Planification du recrutement...', deptCreated: '🎉 Département "{dept}" créé',
94
+ },
95
+ mailbox: {
96
+ title: '💬 Messages', markAllRead: 'Tout marquer comme lu',
97
+ tabs: { all: 'Tout', group: 'Groupes', private: 'Privé', important: 'Important' },
98
+ noMessages: "Pas encore de messages d'employés", noMessagesHint: 'Les employés diront bonjour après le recrutement',
99
+ selectChat: 'Sélectionnez une conversation', selectChatHint: 'Cliquez sur un contact pour discuter',
100
+ viewRequirement: '📋 Voir les Détails →', messages: '{n} messages',
101
+ noGroupChat: 'Pas de messages de groupe', noGroupChatHint: "Les communications pendant l'exécution des tâches apparaîtront ici",
102
+ chatNotExist: "Cette conversation n'existe pas", replying: 'Réponse en cours...', replyTo: 'Répondre à {name}...',
103
+ clickToChat: 'Cliquer pour discuter', sendBtn: 'Envoyer', you: 'Vous : ', personalSecretary: 'Secrétaire Personnel',
104
+ system: 'Système', chatHint: 'Dites quelque chose à {name}',
105
+ viewAgentDetail: 'Voir les détails', groupChatCount: '🏢 {dept} · {n} messages',
106
+ noGroupChatHint: "Les communications pendant l'exécution apparaîtront ici",
107
+ groupChatInput: 'Envoyez un message dans le groupe. Le responsable le verra et répondra...',
108
+ sendFailed: "L'envoi a échoué",
109
+ thinkingReply: 'réfléchit à une réponse...',
110
+ },
111
+ dept: {
112
+ title: "🏢 Structure de l'Entreprise", subtitle: 'Gérez votre empire — construisez, déployez et optimisez',
113
+ viewOrgTree: "🌳 Voir l'Organigramme", createDept: '➕ Créer un Département',
114
+ empty: 'Pas de départements', emptyHint: 'Le secrétaire vous aidera à former une équipe IA infatigable',
115
+ viewDetail: 'Cliquer pour voir →', members: '{n} membres', 'members.count': '{n} membres',
116
+ detail: {
117
+ members: '👥 Membres', requirements: '📋 Exigences', reports: '📊 Rapports',
118
+ adjustBtn: '🔧 Ajuster le Personnel', disbandBtn: '💣 Dissoudre',
119
+ performance: 'Performance {score}', memory: 'Mémoire {n}', tasks: 'Tâches {n}', leader: '👔 Chef',
120
+ },
121
+ dismiss: {
122
+ title: '🔥 Confirmer le Licenciement', desc: 'Licencier {name} ? Ils iront au marché des talents.',
123
+ reasonLabel: 'Raison', reasonPlaceholder: 'Ex : Ajustement de poste', confirmBtn: 'Confirmer',
124
+ },
125
+ disband: {
126
+ title: '💣 Dissoudre le Département', desc: 'Dissoudre {name} ?', descSuffix: 'Tous les membres seront licenciés.',
127
+ reasonLabel: 'Raison', reasonPlaceholder: "Ex : Changement de direction", confirmBtn: 'Confirmer', disbanding: '💥 Dissolution...',
128
+ },
129
+ adjust: {
130
+ title: '🔧 Ajuster le Personnel', desc: 'Dites au secrétaire votre objectif. Il analysera et décidera.',
131
+ currentDept: 'Dpt. actuel', currentMembers: 'Membres : {n}',
132
+ goalLabel: 'Objectif', goalPlaceholder: "Ex : 'Ajouter un développeur frontend' / 'Réduire les sous-performeurs'",
133
+ planBtn: '📋 Générer le Plan', planning: '🧠 Analyse en cours...',
134
+ reviewTitle: "📋 Plan d'Ajustement", reviewDesc: 'Plan du secrétaire pour "{dept}" :',
135
+ firesTitle: '🔥 Licenciements ({n})', hiresTitle: '➕ Recrutements ({n})',
136
+ noChanges: 'Le secrétaire estime que le personnel actuel est optimal 🤷', rejectBtn: 'Renvoyer', approveBtn: '✅ Approuver', executing: '🔨 Exécution...',
137
+ },
138
+ create: {
139
+ title: '🏢 Créer un Département', nameLabel: 'Nom', namePlaceholder: 'Ex : Dpt. Code Perpétuel',
140
+ missionLabel: 'Mission', missionPlaceholder: 'Décrivez en détail ce que fera ce département',
141
+ cancelBtn: 'Annuler', planBtn: '📋 Générer le Plan', planning: '🧠 Planification...',
142
+ reviewTitle: '📋 Plan de Recrutement', reviewDesc: 'Équipe planifiée pour "{dept}" :',
143
+ rejectBtn: 'Renvoyer', approveBtn: '✅ Approuver et Recruter', hiring: '🔨 Recrutement...',
144
+ },
145
+ orgTree: { title: '🌳 Organigramme' },
146
+ },
147
+ talent: {
148
+ title: '🏪 Marché des Talents', subtitle: 'Les employés licenciés attendent ici de nouvelles opportunités',
149
+ empty: 'Personne sur le marché', emptyHint: 'Les employés licenciés entrent automatiquement ici',
150
+ recallBtn: '📞 Rappeler', deleteBtn: '🗑',
151
+ dismissReason: '📤 Raison : {reason}', memoryCount: '🧠 Mémoires : {n}', registeredAt: '📅 Entrée : {date}', score: '{score} pts',
152
+ recall: { title: '📞 Rappeler {name}', desc: 'Sélectionnez le département cible', deptLabel: 'Département', deptPlaceholder: 'Sélectionner', confirmBtn: 'Confirmer' },
153
+ deleteConfirm: { title: '🗑 Supprimer {name}', desc: 'Supprimer définitivement ? Irréversible.', confirmBtn: 'Confirmer', deleting: 'Suppression...' },
154
+ },
155
+ providers: {
156
+ title: '⚡ Fournisseurs IA', subtitle: 'Configurez les clés API pour que les RH puissent recruter.',
157
+ hint: { title: '💡 Stratégie RH', desc: 'Les RH privilégient les fournisseurs avec <strong class="text-green-400">haute note + bas prix</strong>.' },
158
+ categories: { general: 'Général', drawing: 'Dessin', music: 'Musique', video: 'Vidéo', cli: 'Moteurs de Code Locaux', browser: 'Navigateur (DOM)' },
159
+ enabled: '{n}/{total} activés',
160
+ configure: { title: '🔑 Configurer {name}', provider: 'Fournisseur : {name}', apiKeyLabel: 'Clé API', apiKeyPlaceholder: 'Entrez la clé API' },
161
+ talentMarket: { btn: 'Marché des Talents' },
162
+ unknown: 'Inconnu',
163
+ apiKeyLabel: 'Clé API',
164
+ pluginsCount: '{n} plugin(s)',
165
+ toolsCount: '🔧 {n} outil(s)',
166
+ hooksCount: '🪝 {n} hook(s)',
167
+ skillsCount: '{n} compétence(s)',
168
+ cloudApiModels: 'Modèles API cloud',
169
+ noCliDetected: 'Aucun agent CLI détecté',
170
+ },
171
+ requirements: {
172
+ title: '📋 Tableau des Exigences', subtitle: 'Gérez toutes les exigences — suivi, résultats et chats',
173
+ stats: { all: 'Toutes', inProgress: 'En cours', completed: 'Terminées', failed: 'Échouées' },
174
+ empty: 'Pas encore d\'exigences', emptyHint: 'Discutez avec le secrétaire et assignez des tâches !',
175
+ status: { pending: 'En attente', planning: 'Planification', in_progress: 'En cours', pending_approval: 'En attente d\'approbation', completed: 'Terminé', failed: 'Échoué' },
176
+ summary: { success: '✅ {n}/{total} réussis', duration: '⏱️ {n}s' },
177
+ },
178
+ messages: {
179
+ title: '💬 Journal de Communication', subtitle: 'Enregistrements de communication entre Agents',
180
+ totalMessages: 'Messages Totaux', activeAgents: 'Agents Actifs', messageTypes: 'Types de Message',
181
+ noRecords: 'Aucun enregistrement', noRecordsHint: "Les agents génèrent automatiquement des messages pendant l'exécution des tâches",
182
+ refresh: '🔄 Actualiser', broadcast: 'Diffusion',
183
+ },
184
+ agent: {
185
+ notFound: 'Employé non trouvé',
186
+ tabs: { info: '📋 Info', memory: '🧠 Mémoire', performance: '📊 Performance', tasks: '📝 Historique', usage: '💰 Consommation' },
187
+ memorySubTabs: { personal: '💭 Personnel', social: '👥 Relations' },
188
+ avgPerformance: 'Performance moy. {score}', rolePrompt: 'Prompt du Rôle', skills: 'Compétences',
189
+ shortTermMemory: '⚡ Mémoire Court Terme ({n})', longTermMemory: '💾 Mémoire Long Terme ({n})',
190
+ noShortTerm: 'Pas de mémoire court terme', noLongTerm: 'Pas de mémoire long terme',
191
+ noRelationships: 'Pas de mémoire sociale',
192
+ relationshipName: 'Nom',
193
+ relationshipImpression: 'Impression',
194
+ relationshipAffinity: 'Affinité',
195
+ noPerformance: 'Aucun enregistrement', noTasks: 'Aucun enregistrement',
196
+ incentiveTitle: 'Récompenses ({n})', incentive_outstanding: 'Exceptionnel', incentive_excellent: 'Excellent', scorePoints: '{score} pts',
197
+ totalCost: 'Coût Total', totalTokens: 'Tokens Totaux', promptTokens: 'Tokens de Prompt', completionTokens: 'Tokens de Complétion',
198
+ callCount: 'Appels LLM', callUnit: 'fois', usageHint: "💡 Données basées sur l'utilisation réelle de l'API LLM",
199
+ toolCalls: "🔧 {n} appels d'outils",
200
+ taskEngine: 'Moteur de tâches', chatEngine: 'Moteur de chat',
201
+ engineCli: '🖥️ {name}', engineLlm: '☁️ {name}',
202
+ engineFallbackHint: '(CLI pour les tâches de code uniquement, chat assuré par {name})',
203
+ score: '{score} pts {level}',
204
+ highPerformer: 'Haute performance',
205
+ },
206
+ orgTree: {
207
+ title: '🌳 Chaîne de Commandement', subtitle: 'Qui commande qui — clair comme de l\'eau. Cliquez pour les détails.',
208
+ boss: 'Capitaliste Suprême', secretary: 'Secrétaire Personnel (Complice en Chef)', noLeader: 'Pas de chef', empty: 'Pas de subordonnés — un tyran solitaire',
209
+ },
210
+ secretarySettings: {
211
+ title: '⚙️ Paramètres du Secrétaire', subtitle: 'Formez votre complice en chef',
212
+ tabProfile: '👤 Profil', tabSoul: '🧠 Âme',
213
+ nameLabel: 'Nom', namePlaceholder: 'Ex : Alice, Jarvis', avatarStyle: "Style d'Avatar", refreshAvatar: '🔄 Mélanger',
214
+ previewStyle: 'Style', previewSeed: 'Graine', previewHint: '💡 Cliquez ci-dessous ou "Mélanger" pour aléatoire',
215
+ providerLabel: '🧠 Fournisseur', providerDesc: "Modèle IA utilisé par le secrétaire et l'assistant RH.",
216
+ noProviders: "⚠️ Aucun fournisseur disponible. Configurez d'abord les clés API.",
217
+ signatureLabel: 'Signature', signaturePlaceholder: "Ex : L'efficacité c'est la vie",
218
+ promptLabel: '🧠 Script de Lavage (Prompt Système)', promptDesc: 'Configuration de la personnalité du secrétaire.',
219
+ charCount: 'Caractères : {n}', restoreDefault: 'Restaurer par défaut',
220
+ modelInfo: 'Modèle : {provider} · Token : {info}', withHR: 'avec assistant RH',
221
+ saved: '✅ Enregistré', saving: '⏳ Enregistrement...', saveBtn: '💾 Enregistrer',
222
+ },
223
+ reqDetail: {
224
+ back: '← Retour à la liste', backShort: 'Retour', executingShort: '⚙️ En cours',
225
+ status: { pending: 'En attente', planning: 'Planification', in_progress: 'En cours', pending_approval: 'En attente d\'approbation', completed: 'Terminé', failed: 'Échoué' },
226
+ deleteBtn: '🗑 Supprimer', restartBtn: '🔄 Redémarrer',
227
+ tabs: { workflow: '📊 Flux de travail', chat: '💬 Chat Groupe', outputs: '📦 Résultats', files: '📁 Fichiers', office: '🏢 Bureau' },
228
+ deleteConfirm: { title: "\ud83d\uddd1 Supprimer l'exigence", desc: 'Supprimer cette exigence ? Irréversible.', confirmBtn: 'Confirmer' },
229
+ summary: { tasks: '✅ {n}/{total} tâches', duration: '⏱️ {n}s' },
230
+ timeDuration: '⏱ Durée {n}s',
231
+ workflow: { progress: 'Progrès Global', running: 'En cours', completed: 'Terminé', failed: 'Échoué', pending: 'En attente', typing: 'Travail en cours...', notParsed: 'Flux non analysé', leader: 'Responsable', planning: 'Analyse et décomposition de l\'exigence...' },
232
+ live: { stuck: '🔴 Possiblement bloqué', waiting: '🟡 En attente de réponse...', running: '🟢 En cours', secondsAgo: 'il y a {n}s', minutesAgo: 'il y a {n}min', restarting: '🔄 Redémarrage...', restart: '🔄 Redémarrer', deleteReq: '🗑️ Supprimer', confirmDelete: 'Confirmer la suppression ?', recentFiles: 'Fichiers récents :' },
233
+ approvalHint: 'Répondez "OK" pour approuver, ou envoyez des commentaires...',
234
+ chat: { noMessages: 'Pas de messages', noMessagesHint: "Les communications apparaîtront ici pendant l'exécution" },
235
+ outputs: { noOutputs: 'Pas de résultats', noOutputsHint: 'Les résultats apparaîtront après la complétion des tâches', noOutputsShort: 'Aucun résultat', collapse: 'Réduire ▲', expand: 'Développer ▼' },
236
+ files: { noChanges: 'Aucun changement de fichier', noChangesHint: "Les fichiers générés apparaîtront ici", explorer: 'Explorateur', fileCount: '{n} fichiers', syncing: 'Synchronisation en direct', syncingShort: 'Synchronisation...', loading: 'Chargement...', emptyFile: '(fichier vide)', noContent: '(pas de contenu)', readFailed: '(lecture échouée)', lines: '{n} lignes', readOnly: 'Lecture seule', clickToView: 'Cliquez sur un fichier pour voir', syntaxHighlight: 'Coloration syntaxique · Synchronisation en direct' },
237
+ members: {
238
+ blockingTitle: '⏱️ Blocage actuel', title: '👥 Membres', count: '({n})',
239
+ running: 'En cours', reviewing: 'En révision', revision: 'Révision', waiting: 'En attente', ready: 'Prêt', completed: 'Terminé', failed: 'Échoué',
240
+ working: '⚡En travail', noTask: 'Pas de tâche', peekFlow: 'Voir le flux', viewProfile: 'Voir le profil',
241
+ },
242
+ flowPeek: {
243
+ title: 'Flux de {name}', tabFlow: '📋 Journal', tabThoughts: '💭 Monologue', tabHistory: '📜 Historique',
244
+ loading: "Espionnage de l'esprit...", noFlowLogs: 'Aucun journal', noFlowLogsHint: "Les opérations apparaîtront ici quand l'agent commencera",
245
+ thinking: '🧠 Réflexion...', decided: '💬 A décidé de parler', silent: '🤫 Silence', thought: '💭 Pensée', organizing: 'Organisation des pensées...',
246
+ noMonologue: 'Pas de monologue actif', noHistory: "Pas d'historique", recentlyThought: 'vient de réfléchir', spoke: '💬 A parlé', keptSilent: '🤫 Est resté silencieux', codeBlock: '[bloc de code]',
247
+ },
248
+ },
249
+ time: { justNow: "à l'instant", minutesAgo: 'il y a {n}m', sun: 'Dim', mon: 'Lun', tue: 'Mar', wed: 'Mer', thu: 'Jeu', fri: 'Ven', sat: 'Sam' },
250
+ agentChat: {
251
+ subtitle: 'Chat privé 1-à-1',
252
+ empty: 'Dites bonjour à {name} !',
253
+ inputPlaceholder: 'Message à {name}...',
254
+ typing: 'Écrit...',
255
+ error: "Échec de l'envoi",
256
+ chatBtn: '💬 Chat',
257
+ },
258
+ bossProfile: {
259
+ title: '👤 Profil du Boss',
260
+ subtitle: 'Personnalisez votre avatar, capitaliste suprême',
261
+ avatarTitle: 'Choisir un Avatar',
262
+ refreshAvatar: '🔄 Mélanger',
263
+ saved: '✅ Enregistré',
264
+ saving: '⏳ Enregistrement...',
265
+ saveBtn: '💾 Enregistrer',
266
+ editAvatar: "Modifier l'avatar",
267
+ },
268
+ systemSettings: {
269
+ title: '⚙️ Paramètres Système',
270
+ subtitle: 'Gérer les tâches planifiées, plugins et santé du système',
271
+ cards: { audit: 'Audit', routing: 'Routage', plugins: 'Plugins', cron: 'Tâches Planifiées', hooks: 'Hooks', sessions: 'Sessions', config: 'Config' },
272
+ auditStats: { totalEvents: 'Événements', blocked: 'Bloqués' },
273
+ pluginStats: { registered: 'Enregistrés', enabled: 'Activés' },
274
+ cronStats: { running: 'En cours', jobs: 'Tâches' },
275
+ hookStats: { handlers: 'Gestionnaires', eventKeys: "Clés d'événement" },
276
+ sessionStats: { total: 'Sessions', messages: 'Messages' },
277
+ cronDetail: { jobList: 'Tâches Planifiées', createJob: 'Créer une Tâche', runs: 'Exécutions', noJobs: 'Aucune tâche planifiée', noJobsHint: "Créez une tâche planifiée pour automatiser le travail des agents", activeJobs: 'Actives', totalRuns: 'Total Exécutions' },
278
+ cronForm: { name: 'Nom', schedule: 'Horaire (ex: every 30m, daily 09:00)', selectAgent: '-- Sélectionner un Agent --', taskPrompt: "Instructions pour l'agent...", scheduleHint: 'Formats: "every 5m", "every 2h", "daily 09:00", "weekly mon 10:00"' },
279
+ pluginDetail: { noPlugins: 'Aucun plugin', totalTools: 'Outils' },
280
+ health: { title: 'Santé du Système', providerHealth: 'Santé des Fournisseurs IA', recentAudit: "Événements d'Audit Récents" },
281
+ cliBackends: {
282
+ title: 'Backends CLI', subtitle: 'Intégrer des assistants CLI locaux comme moteurs d\'exécution d\'Agents',
283
+ detectAll: 'Tout Détecter', detecting: 'Détection...', registerCustom: 'Enregistrer un CLI Personnalisé',
284
+ noBackends: 'Aucun backend CLI détecté', noBackendsHint: 'Installez un outil CLI comme Claude Code, Codex ou CodeBuddy, puis cliquez sur Détecter',
285
+ status: { detected: 'Détecté', not_found: 'Non Trouvé', configured: 'Configuré', error: 'Erreur' },
286
+ version: 'Version', command: 'Commande', nodeVersion: 'Version Node', builtin: 'Intégré', custom: 'Personnalisé', remove: 'Supprimer',
287
+ form: { id: 'ID du Backend', name: 'Nom d\'affichage', execCommand: 'Commande d\'exécution', execArgs: 'Arguments (séparés par virgule)', detectCommand: 'Commande de détection', memoryDir: 'Répertoire Memory', memoryFile: 'Fichier Memory', nvmNode: 'Version Node (nvm)', nvmNodeHint: 'Laisser vide si non nécessaire' },
288
+ },
289
+ kbEntryTypes: {
290
+ note: '📝 Note',
291
+ fact: '📌 Fait',
292
+ decision: '⚖️ Décision',
293
+ procedure: '📋 Procédure',
294
+ reference: '📖 Référence',
295
+ faq: '❓ FAQ',
296
+ },
297
+ cronJobActions: {
298
+ pause: 'Pause',
299
+ resume: 'Reprendre',
300
+ retry: 'Réessayer',
301
+ runNow: 'Exécuter maintenant',
302
+ delete: 'Supprimer',
303
+ },
304
+ agentChanges: '⚡ Modifications de l\'agent',
305
+ monologue: '🧠 Monologue intérieur',
306
+ noMonologueYet: 'Cet agent n\'a pas encore produit de monologue',
307
+ sendToGroupChat: '[Envoyer au chat de groupe]',
308
+ autoSent: 'Auto',
309
+ },
310
+
311
+ // === Messages de réponse API ===
312
+ api: {
313
+ noCompany: "Veuillez d'abord créer une entreprise",
314
+ internalError: 'Erreur interne du serveur',
315
+ unknownAction: 'Action inconnue',
316
+ unknownOperation: 'Opération inconnue',
317
+ missingField: '{field} est obligatoire',
318
+ missingFields: 'Champs obligatoires manquants : {fields}',
319
+ companyNameRequired: "Veuillez entrer le nom de l'entreprise",
320
+ companyDissolved: "L'entreprise a été dissoute, toutes les données ont été effacées",
321
+ deptNameMissionRequired: 'Le nom et la mission du département sont obligatoires',
322
+ deptIdRequired: "L'ID du département est obligatoire",
323
+ deptIdAdjustGoalRequired: "L'ID du département et l'objectif d'ajustement sont obligatoires",
324
+ deptIdMessageRequired: "L'ID du département et le message sont obligatoires",
325
+ adjustPlanIdRequired: "L'ID du plan d'ajustement est obligatoire",
326
+ planIdRequired: "L'ID du plan est obligatoire",
327
+ deptNotFound: 'Département introuvable',
328
+ deptNotFoundRestart: 'Département introuvable, impossible de redémarrer',
329
+ agentNotFound: 'Employé introuvable',
330
+ agentConfigUpdated: "Configuration de l'agent mise à jour",
331
+ messageRequired: 'Veuillez saisir un message',
332
+ requirementNotFound: 'Exigence introuvable',
333
+ requirementIdRequired: "L'ID de l'exigence est obligatoire",
334
+ requirementDeptTitleRequired: 'departmentId et title sont obligatoires',
335
+ requirementRestarted: "L'exigence a été redémarrée",
336
+ requirementIdMessageRequired: "L'ID de l'exigence et le message sont obligatoires",
337
+ teamNotFound: 'Équipe introuvable',
338
+ teamIdRequired: 'teamId est obligatoire',
339
+ teamCreateRequired: 'departmentId, name, memberIds et leaderId sont obligatoires',
340
+ leaderNotFound: 'Leader introuvable dans le département',
341
+ memberNotFound: 'Membre {id} introuvable dans le département',
342
+ sprintNotFound: 'Sprint introuvable',
343
+ sprintCreateRequired: 'teamId, title et goal sont obligatoires',
344
+ sprintDiscussRequired: 'teamId et sprintId sont obligatoires',
345
+ sprintNotDraft: "Le sprint n'est pas en état brouillon",
346
+ sprintNotPendingApproval: "Le sprint n'est pas en attente d'approbation",
347
+ sprintMessageRequired: 'teamId, sprintId et message sont obligatoires',
348
+ teamDeleteIdRequired: "L'ID de l'équipe est obligatoire",
349
+ targetDeptRequired: 'Veuillez sélectionner un département cible',
350
+ secretarySettingRequired: 'Veuillez fournir au moins un paramètre à modifier',
351
+ providerNotFound: 'Fournisseur introuvable',
352
+ companyNotFound: 'Entreprise introuvable',
353
+ mailNotFound: 'Courrier introuvable',
354
+ kbNotFound: 'Base de connaissances introuvable',
355
+ kbUnknownAction: 'Action inconnue : {action}',
356
+ cronMissingFields: 'Champs obligatoires manquants : name, cronExpression, agentId, taskPrompt',
357
+ agentNotFoundId: 'Agent introuvable : {id}',
358
+ missingPluginId: 'pluginId manquant',
359
+ missingSkillId: 'skillId manquant',
360
+ pluginUnknownAction: 'Action inconnue : {action}',
361
+ missingBackendId: 'backendId manquant',
362
+ cliConfigRequired: 'La configuration nécessite au minimum id et execCommand',
363
+ filePathRequired: 'Le chemin du fichier est obligatoire (paramètre de requête : path)',
364
+ fileNotFound: 'Fichier introuvable',
365
+ pathNotExist: "Le chemin n'existe pas",
366
+ pathNotDirectory: "Le chemin n'est pas un répertoire",
367
+
368
+ // Sprint group chat system messages (user-visible)
369
+ sprintCreated: '📋 Sprint « {title} » créé. Objectif : {goal}',
370
+ sprintDiscussionOpening: '📢 Équipe, discutons du plan du sprint « {title} ».\n\n🎯 Objectif du sprint : {goal}\n\nPartagez vos suggestions selon votre expertise, et je consoliderai le plan final.',
371
+ sprintDiscussionComplete: '✅ Discussion terminée ! Le plan a été révisé en tenant compte des retours de l\'équipe et attend l\'approbation du patron.',
372
+ sprintDiscussionError: '⚠️ Erreur lors de la discussion : {error}. Soumission du plan actuel pour approbation.',
373
+ sprintApproved: '✅ Approuvé ! Le plan est accepté et une exigence est en cours de création pour l\'équipe.',
374
+ sprintRequirementCreated: '📋 L\'exigence « {title} » a été créée et démarrée. Vous pouvez consulter les détails dans le tableau des exigences.',
375
+ sprintRequirementFailed: '❌ Échec de la création ou de l\'exécution de l\'exigence : {error}',
376
+ },
377
+ pixelOffice: {
378
+ title: 'Bureau',
379
+ depts: 'départements',
380
+ agents: 'agents',
381
+ agentInfo: 'Info de l\'Agent',
382
+ name: 'Nom',
383
+ role: 'Rôle',
384
+ department: 'Département',
385
+ motto: 'Devise',
386
+ skills: 'Compétences',
387
+ lastMessage: 'Dernier Message',
388
+ clickAgent: 'Cliquez sur un agent pour voir ses infos',
389
+ bubbleHint: 'Les bulles montrent les messages récents',
390
+ walkHint: 'Les agents se promènent dans leurs bureaux',
391
+ },
392
+ };
393
+ export default fr;