@imenam/mcp-messenger 1.0.32 → 1.0.33

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.
@@ -36,6 +36,13 @@
36
36
  Liaisons
37
37
  <span class="count count--accent" id="links-badge" hidden></span>
38
38
  </button>
39
+ <button type="button" class="tab" data-view="keys">
40
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
41
+ <path d="M2.6 17.4A2 2 0 0 0 2 18.8V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.2a2 2 0 0 0 1.4-.6l.8-.8a6.5 6.5 0 1 0-4-4z" />
42
+ <path d="M16.5 7.5h.01" />
43
+ </svg>
44
+ Clés API
45
+ </button>
39
46
  </nav>
40
47
 
41
48
  <div class="topbar-search" id="search-box">
@@ -67,7 +74,41 @@
67
74
  <path d="M19 6l-1 14a2 2 0 0 1-2 2H8a2 2 0 0 1-2-2L5 6" />
68
75
  </svg>
69
76
  </button>
70
- <button type="button" id="logout" class="btn btn--link">Se déconnecter</button>
77
+ </div>
78
+
79
+ <!-- Menu du compte : la page « Mon compte », les clés, la déconnexion. -->
80
+ <div class="account" id="account" hidden>
81
+ <button type="button" class="account-button" id="account-button" aria-haspopup="menu" aria-expanded="false">
82
+ <span class="account-avatar" id="account-initial"></span>
83
+ <span class="account-name" id="account-name"></span>
84
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="m6 9 6 6 6-6" /></svg>
85
+ </button>
86
+ <div class="account-menu" id="account-menu" role="menu" hidden>
87
+ <button type="button" class="account-item" role="menuitem" data-view="account">
88
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
89
+ <path d="M12 22a10 10 0 1 0 0-20 10 10 0 0 0 0 20z" />
90
+ <path d="M12 13a3 3 0 1 0 0-6 3 3 0 0 0 0 6z" />
91
+ <path d="M7 20.7v-.7a3 3 0 0 1 3-3h4a3 3 0 0 1 3 3v.7" />
92
+ </svg>
93
+ Mon compte
94
+ </button>
95
+ <button type="button" class="account-item" role="menuitem" data-view="keys">
96
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
97
+ <path d="M2.6 17.4A2 2 0 0 0 2 18.8V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.2a2 2 0 0 0 1.4-.6l.8-.8a6.5 6.5 0 1 0-4-4z" />
98
+ <path d="M16.5 7.5h.01" />
99
+ </svg>
100
+ Clés API
101
+ </button>
102
+ <div class="account-sep"></div>
103
+ <button type="button" class="account-item" role="menuitem" id="logout">
104
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
105
+ <path d="M9 21H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h4" />
106
+ <path d="m16 17 5-5-5-5" />
107
+ <path d="M21 12H9" />
108
+ </svg>
109
+ Se déconnecter
110
+ </button>
111
+ </div>
71
112
  </div>
72
113
  </header>
73
114
 
@@ -152,28 +193,170 @@
152
193
  <h2>Console de supervision</h2>
153
194
  <p class="card-sub" id="login-origin">MCP Messenger</p>
154
195
 
155
- <label class="field">
156
- <span class="field-label">Jeton administrateur</span>
196
+ <label class="field field--tight">
197
+ <span class="field-label">Nom d'utilisateur</span>
198
+ <span class="field-input">
199
+ <input type="text" id="login-username" autocomplete="username" autocapitalize="none" spellcheck="false" required />
200
+ </span>
201
+ </label>
202
+
203
+ <label class="field field--tight">
204
+ <span class="field-label">Mot de passe</span>
157
205
  <span class="field-input">
158
- <input type="password" id="token" autocomplete="current-password" placeholder="MESSENGER_ADMIN_TOKEN" />
159
- <button type="button" class="field-eye" id="token-reveal" aria-label="Afficher le jeton">
206
+ <input type="password" id="login-password" autocomplete="current-password" required />
207
+ <button type="button" class="field-eye" data-reveal="login-password" aria-label="Afficher le mot de passe">
160
208
  <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
161
209
  <path d="M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7z" />
162
210
  <circle cx="12" cy="12" r="3" />
163
211
  </svg>
164
212
  </button>
165
213
  </span>
166
- <span class="field-error" id="token-error"></span>
167
214
  </label>
168
215
 
216
+ <label class="check">
217
+ <input type="checkbox" id="login-remember" />
218
+ <span>Rester connecté sur cet appareil (30 jours)</span>
219
+ </label>
220
+
221
+ <p class="form-banner" id="login-error" hidden></p>
222
+
169
223
  <button type="submit" class="btn btn--primary btn--block">Se connecter</button>
170
- <p class="card-note">
171
- Le jeton n'est jamais conservé dans le navigateur : la session tient dans un cookie HttpOnly, fermé à la
172
- déconnexion.
224
+ <p class="card-note card-note--rule">
225
+ Mot de passe perdu ? Sur le serveur :<br />
226
+ <code>npx @imenam/mcp-messenger --reset-password</code>
173
227
  </p>
174
228
  </form>
175
229
  </main>
176
230
 
231
+ <!--
232
+ Premier lancement : aucun compte n'existe encore. Le code d'installation, écrit dans le
233
+ journal du serveur, prouve qu'on a accès à la machine.
234
+ -->
235
+ <main class="login" id="setup" hidden>
236
+ <form class="card" id="setup-form">
237
+ <div class="card-badge">
238
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
239
+ <path d="M16 21v-2a4 4 0 0 0-4-4H6a4 4 0 0 0-4 4v2" />
240
+ <path d="M9 11a4 4 0 1 0 0-8 4 4 0 0 0 0 8z" />
241
+ <path d="M19 8v6" />
242
+ <path d="M22 11h-6" />
243
+ </svg>
244
+ </div>
245
+ <h2>Créer le compte administrateur</h2>
246
+ <p class="card-sub">Ce compte ouvre la console et gère les clés API des agents.</p>
247
+
248
+ <label class="field field--tight">
249
+ <span class="field-label">Code d'installation</span>
250
+ <span class="field-input">
251
+ <input type="text" id="setup-code" class="mono" autocomplete="off" autocapitalize="characters" spellcheck="false" required />
252
+ </span>
253
+ <span class="field-hint">Affiché dans le journal du serveur au démarrage. Valable une fois.</span>
254
+ </label>
255
+
256
+ <div class="card-rule"></div>
257
+
258
+ <label class="field field--tight">
259
+ <span class="field-label">Nom d'utilisateur</span>
260
+ <span class="field-input">
261
+ <input type="text" id="setup-username" autocomplete="username" autocapitalize="none" spellcheck="false" required />
262
+ </span>
263
+ </label>
264
+
265
+ <label class="field field--tight">
266
+ <span class="field-label">Mot de passe</span>
267
+ <span class="field-input">
268
+ <input type="password" id="setup-password" autocomplete="new-password" required />
269
+ <button type="button" class="field-eye" data-reveal="setup-password" aria-label="Afficher le mot de passe">
270
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
271
+ <path d="M2 12s3.6-7 10-7 10 7 10 7-3.6 7-10 7-10-7-10-7z" />
272
+ <circle cx="12" cy="12" r="3" />
273
+ </svg>
274
+ </button>
275
+ </span>
276
+ <span class="meter" id="setup-meter" data-level="0">
277
+ <span></span><span></span><span></span><span></span>
278
+ </span>
279
+ <span class="field-hint" id="setup-meter-label">12 caractères minimum.</span>
280
+ </label>
281
+
282
+ <label class="field field--tight">
283
+ <span class="field-label">Confirmer le mot de passe</span>
284
+ <span class="field-input">
285
+ <input type="password" id="setup-confirm" autocomplete="new-password" required />
286
+ </span>
287
+ </label>
288
+
289
+ <p class="form-banner" id="setup-error" hidden></p>
290
+
291
+ <button type="submit" class="btn btn--primary btn--block" id="setup-submit" disabled>
292
+ Créer le compte et se connecter
293
+ </button>
294
+ <p class="card-note">Le mot de passe est stocké haché (scrypt), jamais en clair.</p>
295
+ </form>
296
+ </main>
297
+
298
+ <!-- Clés API : une par poste ou par agent, montrée en clair une seule fois. -->
299
+ <main class="page" id="keys" hidden>
300
+ <div class="page-head">
301
+ <div>
302
+ <h2>Clés API</h2>
303
+ <p class="muted">
304
+ Une clé par poste ou par agent. Elle ne s'affiche qu'une fois, à sa création ; une clé révoquée est
305
+ refusée dès l'appel suivant.
306
+ </p>
307
+ </div>
308
+ <button type="button" class="btn btn--primary" id="key-new">
309
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true"><path d="M5 12h14" /><path d="M12 5v14" /></svg>
310
+ Nouvelle clé
311
+ </button>
312
+ </div>
313
+ <div class="page-tools">
314
+ <div class="chips" id="key-filters">
315
+ <button type="button" class="chip is-active" data-status="active">Actives <span class="chip-count"></span></button>
316
+ <button type="button" class="chip" data-status="expired">Expirées <span class="chip-count"></span></button>
317
+ <button type="button" class="chip" data-status="revoked">Révoquées <span class="chip-count"></span></button>
318
+ </div>
319
+ <label class="page-search">
320
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
321
+ <circle cx="11" cy="11" r="8" />
322
+ <path d="m21 21-4.3-4.3" />
323
+ </svg>
324
+ <input type="search" id="key-search" placeholder="Nom, agent ou début de clé…" />
325
+ </label>
326
+ </div>
327
+ <div class="key-table" id="key-table"></div>
328
+ <p class="page-note">
329
+ <svg class="icon" viewBox="0 0 24 24" aria-hidden="true">
330
+ <path d="M12 21a9 9 0 1 0 0-18 9 9 0 0 0 0 18z" />
331
+ <path d="M12 11v5" />
332
+ <path d="M12 8h.01" />
333
+ </svg>
334
+ Côté agent, la clé se pose dans MESSENGER_API_KEY. Révoquer une clé coupe l'accès de l'agent ; ses boîtes et ses
335
+ messages restent en place.
336
+ </p>
337
+ </main>
338
+
339
+ <!-- Mon compte : identifiant, mot de passe, navigateurs connectés. -->
340
+ <main class="page page--narrow" id="account-page" hidden>
341
+ <div class="page-head">
342
+ <div>
343
+ <h2>Mon compte</h2>
344
+ <p class="muted">Identifiant de la console, mot de passe et appareils connectés.</p>
345
+ </div>
346
+ </div>
347
+ <div id="account-body"></div>
348
+ </main>
349
+
350
+ <!-- Volet des clés : création, clé affichée une fois, détail d'une clé. -->
351
+ <dialog class="drawer" id="key-drawer">
352
+ <div class="drawer-body" id="key-drawer-body"></div>
353
+ </dialog>
354
+
355
+ <!-- Confirmation de révocation : la seule action définitive sur une clé. -->
356
+ <dialog class="modal modal--confirm" id="key-revoke">
357
+ <div class="modal-card" id="key-revoke-body"></div>
358
+ </dialog>
359
+
177
360
  <!-- Console : agents, fils, lecteur du fil. -->
178
361
  <main class="console" id="console" hidden>
179
362
  <aside class="agents" id="agents-pane">