@imenam/mcp-organizer 1.0.2 → 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.
- package/README.md +609 -548
- package/dist/shared/schemas/admin-api.schema.d.ts +101 -0
- package/dist/shared/schemas/admin-api.schema.js +39 -0
- package/dist/shared/schemas/agent-api.schema.d.ts +2 -0
- package/dist/shared/schemas/agent-api.schema.js +4 -0
- package/dist/shared/schemas/agent-tools.schema.d.ts +40 -1
- package/dist/shared/schemas/agent-tools.schema.js +8 -1
- package/dist/shared/schemas/api.schema.d.ts +2 -0
- package/dist/shared/schemas/api.schema.js +2 -0
- package/dist/shared/schemas/entities.schema.d.ts +27 -1
- package/dist/shared/schemas/entities.schema.js +21 -2
- package/dist/shared/schemas/notifications-api.schema.d.ts +31 -0
- package/dist/shared/schemas/notifications-api.schema.js +22 -1
- package/dist/src/agent-api/notifications.js +1 -0
- package/dist/src/agent-api/requests.js +2 -1
- package/dist/src/cli/set-admin.d.ts +1 -0
- package/dist/src/cli/set-admin.js +45 -0
- package/dist/src/cli/watch.d.ts +0 -3
- package/dist/src/cli/watch.js +1 -9
- package/dist/src/core/accounts.js +2 -1
- package/dist/src/core/admin.d.ts +24 -0
- package/dist/src/core/admin.js +85 -0
- package/dist/src/core/agent-tokens.d.ts +9 -1
- package/dist/src/core/agent-tokens.js +25 -2
- package/dist/src/core/agent.d.ts +5 -0
- package/dist/src/core/agent.js +23 -0
- package/dist/src/core/migrations.js +369 -344
- package/dist/src/core/notifications.d.ts +7 -1
- package/dist/src/core/notifications.js +32 -1
- package/dist/src/core/requests.d.ts +1 -1
- package/dist/src/core/requests.js +4 -4
- package/dist/src/core/store.d.ts +38 -2
- package/dist/src/core/store.js +161 -38
- package/dist/src/gui-api.d.ts +6 -0
- package/dist/src/gui-api.js +25 -4
- package/dist/src/index.js +8 -1
- package/dist/src/mcp/notifications.d.ts +22 -5
- package/dist/src/mcp/notifications.js +95 -9
- package/dist/src/mcp/start.d.ts +1 -1
- package/dist/src/mcp/start.js +39 -32
- package/dist/src/mcp/tools.js +1 -1
- package/dist/src/server/runner.d.ts +51 -0
- package/dist/src/server/runner.js +222 -0
- package/dist/src/server/start.js +8 -0
- package/gui/dist/assets/index-DuoSNpBr.js +70 -0
- package/gui/dist/assets/index-duxL0fvO.css +1 -0
- package/gui/dist/index.html +2 -2
- package/package.json +3 -2
- package/gui/dist/assets/index-BVN0agCc.css +0 -1
- 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
|
/**
|
package/dist/src/core/store.d.ts
CHANGED
|
@@ -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
|
|
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;
|