@imenam/mcp-organizer 1.0.3 → 1.0.7

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 (45) hide show
  1. package/README.md +71 -20
  2. package/dist/shared/schemas/admin-api.schema.d.ts +101 -0
  3. package/dist/shared/schemas/admin-api.schema.js +39 -0
  4. package/dist/shared/schemas/agent-api.schema.d.ts +2 -0
  5. package/dist/shared/schemas/agent-api.schema.js +4 -0
  6. package/dist/shared/schemas/agent-tools.schema.d.ts +34 -0
  7. package/dist/shared/schemas/agent-tools.schema.js +2 -0
  8. package/dist/shared/schemas/api.schema.d.ts +2 -0
  9. package/dist/shared/schemas/api.schema.js +2 -0
  10. package/dist/shared/schemas/entities.schema.d.ts +27 -1
  11. package/dist/shared/schemas/entities.schema.js +21 -2
  12. package/dist/shared/schemas/notifications-api.schema.d.ts +31 -0
  13. package/dist/shared/schemas/notifications-api.schema.js +22 -1
  14. package/dist/src/agent-api/requests.js +2 -1
  15. package/dist/src/cli/set-admin.d.ts +1 -0
  16. package/dist/src/cli/set-admin.js +45 -0
  17. package/dist/src/core/accounts.js +2 -1
  18. package/dist/src/core/admin.d.ts +24 -0
  19. package/dist/src/core/admin.js +85 -0
  20. package/dist/src/core/agent-tokens.d.ts +9 -1
  21. package/dist/src/core/agent-tokens.js +25 -2
  22. package/dist/src/core/agent.d.ts +5 -0
  23. package/dist/src/core/agent.js +23 -0
  24. package/dist/src/core/migrations.js +369 -344
  25. package/dist/src/core/notifications.d.ts +7 -1
  26. package/dist/src/core/notifications.js +32 -1
  27. package/dist/src/core/requests.d.ts +1 -1
  28. package/dist/src/core/requests.js +4 -4
  29. package/dist/src/core/store.d.ts +38 -2
  30. package/dist/src/core/store.js +161 -38
  31. package/dist/src/gui-api.d.ts +6 -0
  32. package/dist/src/gui-api.js +25 -4
  33. package/dist/src/index.js +8 -1
  34. package/dist/src/mcp/start.d.ts +1 -1
  35. package/dist/src/mcp/start.js +1 -1
  36. package/dist/src/mcp/tools.js +1 -1
  37. package/dist/src/server/runner.d.ts +51 -0
  38. package/dist/src/server/runner.js +222 -0
  39. package/dist/src/server/start.js +8 -0
  40. package/gui/dist/assets/index-DuoSNpBr.js +70 -0
  41. package/gui/dist/assets/index-duxL0fvO.css +1 -0
  42. package/gui/dist/index.html +2 -2
  43. package/package.json +3 -2
  44. package/gui/dist/assets/index-BVN0agCc.css +0 -1
  45. package/gui/dist/assets/index-DI1_kr81.js +0 -70
@@ -1,7 +1,7 @@
1
1
  import type { Mailer } from "./mail.js";
2
2
  import type { Transcriber } from "./transcription.js";
3
3
  import type { Store } from "./store.js";
4
- import type { NotificationListQuery, NotificationListResponse, SettingsResponse, UnreadCountResponse, UpdateSettingsRequest } from "../../shared/schemas/notifications-api.schema.js";
4
+ import type { NotificationListQuery, NotificationListResponse, SettingsResponse, SpaceNotificationSettingsResponse, UnreadCountResponse, UpdateSettingsRequest, UpdateSpaceNotificationSettingsRequest } from "../../shared/schemas/notifications-api.schema.js";
5
5
  /** Dépendances de l'envoi des e-mails de notification. */
6
6
  export interface NotificationMailDeps {
7
7
  mailer: Mailer;
@@ -44,3 +44,9 @@ export type SettingsDeps = Pick<NotificationMailDeps, "mailer" | "publicUrl"> &
44
44
  };
45
45
  export declare function getSettings(store: Store, deps: SettingsDeps, userId: string): SettingsResponse;
46
46
  export declare function updateSettings(store: Store, deps: SettingsDeps, userId: string, patch: UpdateSettingsRequest): SettingsResponse;
47
+ export declare function getSpaceNotificationSettings(store: Store, deps: SettingsDeps, userId: string, spaceId: string): SpaceNotificationSettingsResponse;
48
+ /**
49
+ * Personnalise les notifications de l'utilisateur dans un espace, en partant des
50
+ * préférences en vigueur, ou le fait revenir aux préférences de son compte.
51
+ */
52
+ export declare function updateSpaceNotificationSettings(store: Store, deps: SettingsDeps, userId: string, spaceId: string, patch: UpdateSpaceNotificationSettingsRequest): SpaceNotificationSettingsResponse;
@@ -1,4 +1,5 @@
1
1
  import { NotFoundError } from "./errors.js";
2
+ import { requireMember } from "./spaces.js";
2
3
  /**
3
4
  * Notifications (assignation, commentaire) et préférences. Les notifications
4
5
  * sont créées par le store dans la transaction de l'événement ; leurs e-mails
@@ -153,13 +154,14 @@ export function markAllNotificationsRead(store, userId) {
153
154
  return unreadCount(store, userId);
154
155
  }
155
156
  function settingsView(store, deps, userId) {
156
- const { notifyAssignApp, notifyAssignEmail, notifyCommentApp, notifyCommentEmail } = store.getUserSettings(userId);
157
+ const { notifyAssignApp, notifyAssignEmail, notifyCommentApp, notifyCommentEmail, assistantHistory } = store.getUserSettings(userId);
157
158
  const reason = notificationEmailBlocker(deps);
158
159
  return {
159
160
  notifyAssignApp,
160
161
  notifyAssignEmail,
161
162
  notifyCommentApp,
162
163
  notifyCommentEmail,
164
+ assistantHistory,
163
165
  email: { enabled: reason === null, reason },
164
166
  transcription: { enabled: deps.transcriber.enabled, reason: deps.transcriber.disabledReason },
165
167
  };
@@ -171,3 +173,32 @@ export function updateSettings(store, deps, userId, patch) {
171
173
  store.mutate(asUser(userId), (tx) => tx.updateUserSettings(userId, patch));
172
174
  return settingsView(store, deps, userId);
173
175
  }
176
+ // --- Notifications d'un espace --------------------------------------------------------
177
+ function spaceNotificationView(store, deps, userId, spaceId) {
178
+ const reason = notificationEmailBlocker(deps);
179
+ return {
180
+ custom: store.findSpaceNotificationSettings(userId, spaceId) !== null,
181
+ ...store.notificationPreferences(userId, spaceId),
182
+ email: { enabled: reason === null, reason },
183
+ };
184
+ }
185
+ export function getSpaceNotificationSettings(store, deps, userId, spaceId) {
186
+ requireMember(store, spaceId, userId);
187
+ return spaceNotificationView(store, deps, userId, spaceId);
188
+ }
189
+ /**
190
+ * Personnalise les notifications de l'utilisateur dans un espace, en partant des
191
+ * préférences en vigueur, ou le fait revenir aux préférences de son compte.
192
+ */
193
+ export function updateSpaceNotificationSettings(store, deps, userId, spaceId, patch) {
194
+ store.mutate(asUser(userId), (tx) => {
195
+ requireMember(tx.store, spaceId, userId);
196
+ const { custom, ...preferences } = patch;
197
+ tx.setSpaceNotificationSettings(userId, spaceId, custom ? { ...tx.store.notificationPreferences(userId, spaceId), ...definedPreferences(preferences) } : null);
198
+ });
199
+ return spaceNotificationView(store, deps, userId, spaceId);
200
+ }
201
+ /** Préférences fournies, sans les champs absents. */
202
+ function definedPreferences(preferences) {
203
+ return Object.fromEntries(Object.entries(preferences).filter(([, value]) => value !== undefined));
204
+ }
@@ -43,7 +43,7 @@ export declare function getRequest(store: Store, userId: string, requestId: stri
43
43
  * actifs qui couvrent l'espace, chacun avec son dernier usage et la présence
44
44
  * de son veilleur de notifications.
45
45
  */
46
- export declare function listRequests(store: Store, userId: string, spaceId: string, now?: Date): RequestListResponse;
46
+ export declare function listRequests(store: Store, userId: string, spaceId: string, runnerDisabledReason: string | null, now?: Date): RequestListResponse;
47
47
  /** Annule une action de l'agent. */
48
48
  export declare function undoAction(store: Store, userId: string, actionId: string): RequestView;
49
49
  /** Annule toutes les actions non annulées d'un lot, de la plus récente à la plus ancienne : tout le lot ou rien. */
@@ -193,14 +193,14 @@ export function getRequest(store, userId, requestId) {
193
193
  * actifs qui couvrent l'espace, chacun avec son dernier usage et la présence
194
194
  * de son veilleur de notifications.
195
195
  */
196
- export function listRequests(store, userId, spaceId, now = new Date()) {
197
- requireMember(store, spaceId, userId);
196
+ export function listRequests(store, userId, spaceId, runnerDisabledReason, now = new Date()) {
197
+ const { space } = requireMember(store, spaceId, userId);
198
198
  const requests = store.listAgentRequestsOfSpace(spaceId, REQUESTS_PAGE_SIZE).map((request) => requestView(store, userId, request));
199
199
  const agents = store
200
200
  .listAgentTokensOfSpace(spaceId)
201
- .filter((token) => tokenState(store, token, now) === "active")
201
+ .filter((token) => tokenState(store, token, now) === "active" && (!token.isRunner || space.runnerAllowed))
202
202
  .map((token) => ({ ...agentRef(store, token), lastUsedAt: token.lastUsedAt, listening: store.watchers.status(token.id).armed }));
203
- return { requests, pendingCount: store.countPendingRequestsOfSpace(spaceId), agents };
203
+ return { requests, pendingCount: store.countPendingRequestsOfSpace(spaceId), agents, runnerAllowed: space.runnerAllowed, runnerDisabledReason };
204
204
  }
205
205
  // --- Annulation -----------------------------------------------------------------
206
206
  /**
@@ -1,7 +1,7 @@
1
1
  import type Database from "better-sqlite3";
2
2
  import { WatcherRegistry } from "./watchers.js";
3
3
  import { type EntityType, type MemberRole, type RequestKind, type RequestStatus, type SpaceKind, type TaskPriority, type TaskStatus, type TaskType, type TestResultValue, type AccessLinkPurpose, type AgentOperation, type UserStatus, type VersionedEntityType } from "../../shared/schemas/enums.schema.js";
4
- import { type AccessLink, type AgentAction, type AgentRequest, type AgentToken, type Attachment, type Change, type ChecklistItem, type Comment, type EntityVersion, type Idea, type Invitation, type Membership, type Notification, type Session, type Space, type Tag, type Task, type TaskSnapshot, type TestCheckpoint, type TestResult, type TestReview, type User, type UserSettings } from "../../shared/schemas/entities.schema.js";
4
+ import { type AccessLink, type AgentAction, type AgentRequest, type AgentToken, type Attachment, type Change, type ChecklistItem, type Comment, type EntityVersion, type Idea, type Invitation, type Membership, type Notification, type Session, type Space, type Tag, type Task, type TaskSnapshot, type TestCheckpoint, type TestResult, type TestReview, type User, type UserSettings, type NotificationPreferences, type SpaceNotificationSettings } from "../../shared/schemas/entities.schema.js";
5
5
  /**
6
6
  * Auteur d'une mutation : un utilisateur de la GUI, ou un agent qui agit avec
7
7
  * son jeton pour une demande que ce jeton a prise, avec les droits du
@@ -26,6 +26,7 @@ export declare class Store {
26
26
  private activeMutation;
27
27
  private emailListener;
28
28
  private readonly pendingRequestListeners;
29
+ private readonly runnerAllowedListeners;
29
30
  /** Présence des veilleurs de notifications, par jeton d'agent. */
30
31
  readonly watchers: WatcherRegistry;
31
32
  constructor(db: Database.Database);
@@ -36,6 +37,13 @@ export declare class Store {
36
37
  getUser(id: string): User;
37
38
  findUserByEmail(email: string): User | null;
38
39
  countUsers(): number;
40
+ /** Tous les comptes, du plus ancien au plus récent. */
41
+ listUsers(): User[];
42
+ countAdmins(): number;
43
+ /** Préférences de notification propres à un espace, ou null si l'utilisateur y suit celles de son compte. */
44
+ findSpaceNotificationSettings(userId: string, spaceId: string): SpaceNotificationSettings | null;
45
+ /** Préférences de notification qui s'appliquent à un utilisateur dans un espace : celles de l'espace, sinon celles du compte. */
46
+ notificationPreferences(userId: string, spaceId: string): NotificationPreferences;
39
47
  getUserSettings(userId: string): UserSettings;
40
48
  findSessionByHash(idHash: string): Session | null;
41
49
  findAccessLinkByHash(tokenHash: string): AccessLink | null;
@@ -44,6 +52,8 @@ export declare class Store {
44
52
  findAgentToken(id: string): AgentToken | null;
45
53
  findAgentTokenByHash(tokenHash: string): AgentToken | null;
46
54
  /** Jetons qui couvrent un espace, tous propriétaires confondus, du plus récemment utilisé au moins récemment. */
55
+ /** Jeton du runner de l'espace, s'il a déjà servi. */
56
+ findRunnerToken(spaceId: string): AgentToken | null;
47
57
  listAgentTokensOfSpace(spaceId: string): AgentToken[];
48
58
  /** Jetons d'un utilisateur, du plus récent au plus ancien. */
49
59
  listAgentTokensOf(userId: string): AgentToken[];
@@ -58,6 +68,8 @@ export declare class Store {
58
68
  findPersonalSpace(userId: string): Space | null;
59
69
  /** Espaces dont l'utilisateur est membre : son espace personnel d'abord, puis les espaces communs par nom. */
60
70
  listSpacesOf(userId: string): Space[];
71
+ /** Tous les espaces : les espaces personnels d'abord, puis les espaces communs par nom. */
72
+ listAllSpaces(): Space[];
61
73
  listMemberships(spaceId: string): Membership[];
62
74
  findMembership(spaceId: string, userId: string): Membership | null;
63
75
  isMember(spaceId: string, userId: string): boolean;
@@ -141,6 +153,11 @@ export declare class Store {
141
153
  * les autres de la plus récente à la plus ancienne.
142
154
  */
143
155
  listAgentRequestsTargeting(spaceId: string, status: RequestStatus | null, limit: number): AgentRequest[];
156
+ /**
157
+ * Échanges clos (traités ou en échec) d'un auteur dans un espace, antérieurs à
158
+ * la demande `before`, du plus ancien au plus récent : les `limit` derniers.
159
+ */
160
+ listClosedRequestsOfAuthorBefore(spaceId: string, authorId: string, before: AgentRequest, limit: number): AgentRequest[];
144
161
  /** Demandes d'un espace, de la plus récente à la plus ancienne, au plus `limit`. */
145
162
  listAgentRequestsOfSpace(spaceId: string, limit: number): AgentRequest[];
146
163
  /** Nombre de demandes en attente d'un espace. */
@@ -190,6 +207,8 @@ export declare class Store {
190
207
  * mutation. La fonction rendue désabonne.
191
208
  */
192
209
  onPendingRequest(listener: (request: AgentRequest) => void): () => void;
210
+ /** Abonne `listener` aux espaces où le runner vient d'être autorisé, après la validation de la mutation. */
211
+ onRunnerAllowed(listener: (space: Space) => void): () => void;
193
212
  /**
194
213
  * Point unique d'écriture. `fn` reçoit une `Mutation` et s'exécute dans une
195
214
  * transaction exclusive ; à sa sortie, les invariants sont vérifiés sur l'état
@@ -205,6 +224,7 @@ export interface CreateUserInput {
205
224
  displayName?: string | null;
206
225
  passwordHash?: string | null;
207
226
  status: UserStatus;
227
+ isAdmin?: boolean;
208
228
  }
209
229
  export interface UpdateUserInput {
210
230
  displayName?: string | null;
@@ -245,6 +265,7 @@ export interface UpdateUserSettingsInput {
245
265
  notifyAssignEmail?: boolean;
246
266
  notifyCommentApp?: boolean;
247
267
  notifyCommentEmail?: boolean;
268
+ assistantHistory?: number;
248
269
  }
249
270
  /** Issue de l'envoi de l'e-mail d'une notification. */
250
271
  export type NotificationEmailOutcome = {
@@ -299,6 +320,8 @@ export declare class Mutation {
299
320
  readonly emailNotificationIds: string[];
300
321
  /** Demandes passées en attente par la mutation : créées, ou libérées. */
301
322
  readonly pendingRequestIds: string[];
323
+ /** Espaces où la mutation a autorisé le runner. */
324
+ readonly runnerAllowedSpaceIds: string[];
302
325
  /** Demande pour laquelle agit l'agent, lue au début de la mutation. */
303
326
  private readonly request;
304
327
  /** Jeton avec lequel agit l'agent. */
@@ -325,6 +348,8 @@ export declare class Mutation {
325
348
  private touch;
326
349
  createUser(input: CreateUserInput): User;
327
350
  updateUser(id: string, patch: UpdateUserInput): User;
351
+ /** Accorde ou retire le rôle d'administrateur du site. */
352
+ setUserAdmin(id: string, isAdmin: boolean): User;
328
353
  createSession(session: Session): Session;
329
354
  extendSession(idHash: string, expiresAt: string): void;
330
355
  deleteSession(idHash: string): void;
@@ -357,9 +382,12 @@ export declare class Mutation {
357
382
  prefix: string;
358
383
  tokenHash: string;
359
384
  expiresAt: string | null;
385
+ isRunner?: boolean;
360
386
  }): AgentToken;
361
387
  /** Révoque un jeton de l'utilisateur acteur ; un jeton déjà révoqué reste tel quel. */
362
388
  revokeAgentToken(id: string): AgentToken;
389
+ /** Remplace la valeur d'un jeton du runner : l'ancienne valeur est aussitôt refusée. */
390
+ rotateRunnerToken(id: string, prefix: string, tokenHash: string): AgentToken;
363
391
  /** Date du dernier usage d'un jeton ; le journal des changements n'en garde pas trace. */
364
392
  recordAgentTokenUse(id: string, at: string): void;
365
393
  /** Invite une adresse dans un espace, jusqu'à `expiresAt`. */
@@ -380,6 +408,8 @@ export declare class Mutation {
380
408
  private touchInvitation;
381
409
  /** Crée un espace et en fait de son propriétaire le membre `owner`. */
382
410
  createSpace(input: CreateSpaceInput): Space;
411
+ /** Autorise ou interdit le runner sur un espace. */
412
+ setSpaceRunnerAllowed(id: string, allowed: boolean): Space;
383
413
  renameSpace(id: string, name: string): Space;
384
414
  /** Supprime un espace commun et tout son contenu. Un espace personnel ne se supprime pas. */
385
415
  deleteSpace(id: string): void;
@@ -529,7 +559,8 @@ export declare class Mutation {
529
559
  /** Vrai si l'utilisateur est l'auteur humain de la mutation : on ne se notifie pas soi-même. */
530
560
  private isActingUser;
531
561
  /**
532
- * Notifie un utilisateur selon ses préférences : la notification apparaît
562
+ * Notifie un utilisateur selon ses préférences dans l'espace de la tâche
563
+ * (celles de l'espace, sinon celles du compte) : la notification apparaît
533
564
  * dans l'application si elle y est activée, et son identifiant est retenu
534
565
  * pour l'envoi de l'e-mail si celui-ci est activé. Rien n'est créé quand les
535
566
  * deux sont désactivés.
@@ -543,6 +574,11 @@ export declare class Mutation {
543
574
  recordNotificationEmail(id: string, outcome: NotificationEmailOutcome): Notification;
544
575
  /** Modifie les préférences d'un utilisateur. */
545
576
  updateUserSettings(userId: string, patch: UpdateUserSettingsInput): UserSettings;
577
+ /**
578
+ * Fixe les préférences de notification d'un membre propres à un espace ;
579
+ * null les retire, et il y suit de nouveau celles de son compte.
580
+ */
581
+ setSpaceNotificationSettings(userId: string, spaceId: string, preferences: NotificationPreferences | null): SpaceNotificationSettings | null;
546
582
  /** Vérifie les invariants sur l'état final, puis écrit les versions et le journal. */
547
583
  finish(): void;
548
584
  private checkInvariants;