@imenam/mcp-organizer 0.0.0-stage → 1.0.1
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 +529 -2
- package/dist/shared/logic/first-account.d.ts +13 -0
- package/dist/shared/logic/first-account.js +15 -0
- package/dist/shared/logic/labels.d.ts +5 -0
- package/dist/shared/logic/labels.js +17 -0
- package/dist/shared/logic/positions.d.ts +9 -0
- package/dist/shared/logic/positions.js +19 -0
- package/dist/shared/logic/spaces.d.ts +13 -0
- package/dist/shared/logic/spaces.js +48 -0
- package/dist/shared/logic/test-summary.d.ts +28 -0
- package/dist/shared/logic/test-summary.js +35 -0
- package/dist/shared/schemas/agent-api.schema.d.ts +268 -0
- package/dist/shared/schemas/agent-api.schema.js +94 -0
- package/dist/shared/schemas/agent-tools.schema.d.ts +724 -0
- package/dist/shared/schemas/agent-tools.schema.js +165 -0
- package/dist/shared/schemas/api.schema.d.ts +249 -0
- package/dist/shared/schemas/api.schema.js +116 -0
- package/dist/shared/schemas/entities.schema.d.ts +472 -0
- package/dist/shared/schemas/entities.schema.js +262 -0
- package/dist/shared/schemas/enums.schema.d.ts +135 -0
- package/dist/shared/schemas/enums.schema.js +58 -0
- package/dist/shared/schemas/gui-api.schema.d.ts +53 -0
- package/dist/shared/schemas/gui-api.schema.js +20 -0
- package/dist/shared/schemas/ideas-api.schema.d.ts +81 -0
- package/dist/shared/schemas/ideas-api.schema.js +40 -0
- package/dist/shared/schemas/notifications-api.schema.d.ts +87 -0
- package/dist/shared/schemas/notifications-api.schema.js +58 -0
- package/dist/shared/schemas/tasks-api.schema.d.ts +675 -0
- package/dist/shared/schemas/tasks-api.schema.js +225 -0
- package/dist/shared/schemas/tokens-api.schema.d.ts +106 -0
- package/dist/shared/schemas/tokens-api.schema.js +42 -0
- package/dist/shared/schemas/transcription-api.schema.d.ts +15 -0
- package/dist/shared/schemas/transcription-api.schema.js +12 -0
- package/dist/src/agent-api/checklist.d.ts +3 -0
- package/dist/src/agent-api/checklist.js +127 -0
- package/dist/src/agent-api/ideas.d.ts +3 -0
- package/dist/src/agent-api/ideas.js +93 -0
- package/dist/src/agent-api/requests.d.ts +3 -0
- package/dist/src/agent-api/requests.js +60 -0
- package/dist/src/agent-api/router.d.ts +3 -0
- package/dist/src/agent-api/router.js +40 -0
- package/dist/src/agent-api/tasks.d.ts +2 -0
- package/dist/src/agent-api/tasks.js +290 -0
- package/dist/src/agent-api/types.d.ts +41 -0
- package/dist/src/agent-api/types.js +14 -0
- package/dist/src/cli/backup.d.ts +12 -0
- package/dist/src/cli/backup.js +126 -0
- package/dist/src/cli/prompt.d.ts +7 -0
- package/dist/src/cli/prompt.js +40 -0
- package/dist/src/cli/set-user.d.ts +2 -0
- package/dist/src/cli/set-user.js +114 -0
- package/dist/src/cli/setup-mcp.d.ts +10 -0
- package/dist/src/cli/setup-mcp.js +110 -0
- package/dist/src/cli/setup.d.ts +39 -0
- package/dist/src/cli/setup.js +626 -0
- package/dist/src/core/accounts.d.ts +129 -0
- package/dist/src/core/accounts.js +284 -0
- package/dist/src/core/agent-tokens.d.ts +31 -0
- package/dist/src/core/agent-tokens.js +120 -0
- package/dist/src/core/agent.d.ts +71 -0
- package/dist/src/core/agent.js +358 -0
- package/dist/src/core/attachments.d.ts +21 -0
- package/dist/src/core/attachments.js +44 -0
- package/dist/src/core/data-dir.d.ts +5 -0
- package/dist/src/core/data-dir.js +11 -0
- package/dist/src/core/db.d.ts +13 -0
- package/dist/src/core/db.js +38 -0
- package/dist/src/core/env-file.d.ts +11 -0
- package/dist/src/core/env-file.js +36 -0
- package/dist/src/core/errors.d.ts +24 -0
- package/dist/src/core/errors.js +42 -0
- package/dist/src/core/history.d.ts +34 -0
- package/dist/src/core/history.js +279 -0
- package/dist/src/core/ideas.d.ts +16 -0
- package/dist/src/core/ideas.js +100 -0
- package/dist/src/core/ids.d.ts +2 -0
- package/dist/src/core/ids.js +5 -0
- package/dist/src/core/log-dir.d.ts +2 -0
- package/dist/src/core/log-dir.js +9 -0
- package/dist/src/core/logger.d.ts +14 -0
- package/dist/src/core/logger.js +37 -0
- package/dist/src/core/mail.d.ts +43 -0
- package/dist/src/core/mail.js +44 -0
- package/dist/src/core/mcp-entry.d.ts +20 -0
- package/dist/src/core/mcp-entry.js +15 -0
- package/dist/src/core/migrations.d.ts +18 -0
- package/dist/src/core/migrations.js +404 -0
- package/dist/src/core/native-sqlite.d.ts +2 -0
- package/dist/src/core/native-sqlite.js +23 -0
- package/dist/src/core/notifications.d.ts +46 -0
- package/dist/src/core/notifications.js +173 -0
- package/dist/src/core/project-root.d.ts +2 -0
- package/dist/src/core/project-root.js +13 -0
- package/dist/src/core/requests.d.ts +49 -0
- package/dist/src/core/requests.js +239 -0
- package/dist/src/core/snapshots.d.ts +32 -0
- package/dist/src/core/snapshots.js +35 -0
- package/dist/src/core/spaces.d.ts +66 -0
- package/dist/src/core/spaces.js +252 -0
- package/dist/src/core/store.d.ts +565 -0
- package/dist/src/core/store.js +2093 -0
- package/dist/src/core/task-history.d.ts +7 -0
- package/dist/src/core/task-history.js +41 -0
- package/dist/src/core/tasks.d.ts +58 -0
- package/dist/src/core/tasks.js +389 -0
- package/dist/src/core/test-tasks.d.ts +19 -0
- package/dist/src/core/test-tasks.js +135 -0
- package/dist/src/core/transcription.d.ts +45 -0
- package/dist/src/core/transcription.js +92 -0
- package/dist/src/deploy/env-render.d.ts +26 -0
- package/dist/src/deploy/env-render.js +98 -0
- package/dist/src/deploy/templates.d.ts +38 -0
- package/dist/src/deploy/templates.js +130 -0
- package/dist/src/gui-api.d.ts +37 -0
- package/dist/src/gui-api.js +383 -0
- package/dist/src/index.d.ts +2 -0
- package/dist/src/index.js +100 -0
- package/dist/src/mcp/client.d.ts +23 -0
- package/dist/src/mcp/client.js +81 -0
- package/dist/src/mcp/start.d.ts +14 -0
- package/dist/src/mcp/start.js +104 -0
- package/dist/src/mcp/tools.d.ts +46 -0
- package/dist/src/mcp/tools.js +348 -0
- package/dist/src/server/app.d.ts +25 -0
- package/dist/src/server/app.js +290 -0
- package/dist/src/server/config.d.ts +23 -0
- package/dist/src/server/config.js +75 -0
- package/dist/src/server/limits.d.ts +2 -0
- package/dist/src/server/limits.js +4 -0
- package/dist/src/server/login-limiter.d.ts +36 -0
- package/dist/src/server/login-limiter.js +81 -0
- package/dist/src/server/start.d.ts +5 -0
- package/dist/src/server/start.js +88 -0
- package/dist/src/version.d.ts +1 -0
- package/dist/src/version.js +16 -0
- package/gui/dist/assets/index-DwkXx4Q2.js +70 -0
- package/gui/dist/assets/index-lnvnkDdg.css +1 -0
- package/gui/dist/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/gui/dist/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/gui/dist/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/gui/dist/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/gui/dist/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/gui/dist/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/gui/dist/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/gui/dist/assets/jetbrains-mono-cyrillic-400-normal-BEIGL1Tu.woff2 +0 -0
- package/gui/dist/assets/jetbrains-mono-cyrillic-400-normal-ugxPyKxw.woff +0 -0
- package/gui/dist/assets/jetbrains-mono-greek-400-normal-B9oWc5Lo.woff +0 -0
- package/gui/dist/assets/jetbrains-mono-greek-400-normal-C190GLew.woff2 +0 -0
- package/gui/dist/assets/jetbrains-mono-latin-400-normal-6-qcROiO.woff +0 -0
- package/gui/dist/assets/jetbrains-mono-latin-400-normal-V6pRDFza.woff2 +0 -0
- package/gui/dist/assets/jetbrains-mono-latin-ext-400-normal-Bc8Ftmh3.woff2 +0 -0
- package/gui/dist/assets/jetbrains-mono-latin-ext-400-normal-fXTG6kC5.woff +0 -0
- package/gui/dist/assets/jetbrains-mono-vietnamese-400-normal-CqNFfHCs.woff +0 -0
- package/gui/dist/index.html +13 -0
- package/package.json +66 -4
|
@@ -0,0 +1,565 @@
|
|
|
1
|
+
import type Database from "better-sqlite3";
|
|
2
|
+
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";
|
|
3
|
+
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
|
+
/**
|
|
5
|
+
* Auteur d'une mutation : un utilisateur de la GUI, ou un agent qui agit avec
|
|
6
|
+
* son jeton pour une demande que ce jeton a prise, avec les droits du
|
|
7
|
+
* propriétaire du jeton.
|
|
8
|
+
*/
|
|
9
|
+
export type Actor = {
|
|
10
|
+
type: "user";
|
|
11
|
+
userId: string;
|
|
12
|
+
} | {
|
|
13
|
+
type: "agent";
|
|
14
|
+
requestId: string;
|
|
15
|
+
tokenId: string;
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Accès à la base. Les lectures sont libres ; toute écriture passe par
|
|
19
|
+
* `mutate`, qui l'exécute dans une transaction, vérifie les invariants,
|
|
20
|
+
* enregistre les versions des entités versionnées et alimente le journal
|
|
21
|
+
* `Change`.
|
|
22
|
+
*/
|
|
23
|
+
export declare class Store {
|
|
24
|
+
readonly db: Database.Database;
|
|
25
|
+
private activeMutation;
|
|
26
|
+
private emailListener;
|
|
27
|
+
constructor(db: Database.Database);
|
|
28
|
+
/** Ouvre (et migre) la base du répertoire de données. */
|
|
29
|
+
static open(dataDir: string): Store;
|
|
30
|
+
close(): void;
|
|
31
|
+
findUser(id: string): User | null;
|
|
32
|
+
getUser(id: string): User;
|
|
33
|
+
findUserByEmail(email: string): User | null;
|
|
34
|
+
countUsers(): number;
|
|
35
|
+
getUserSettings(userId: string): UserSettings;
|
|
36
|
+
findSessionByHash(idHash: string): Session | null;
|
|
37
|
+
findAccessLinkByHash(tokenHash: string): AccessLink | null;
|
|
38
|
+
/** Liens d'accès inutilisés d'un compte. */
|
|
39
|
+
listUnusedAccessLinks(userId: string): AccessLink[];
|
|
40
|
+
findAgentToken(id: string): AgentToken | null;
|
|
41
|
+
findAgentTokenByHash(tokenHash: string): AgentToken | null;
|
|
42
|
+
/** Jetons qui couvrent un espace, tous propriétaires confondus, du plus récemment utilisé au moins récemment. */
|
|
43
|
+
listAgentTokensOfSpace(spaceId: string): AgentToken[];
|
|
44
|
+
/** Jetons d'un utilisateur, du plus récent au plus ancien. */
|
|
45
|
+
listAgentTokensOf(userId: string): AgentToken[];
|
|
46
|
+
findInvitation(id: string): Invitation | null;
|
|
47
|
+
getInvitation(id: string): Invitation;
|
|
48
|
+
/** Invitations en attente (ni acceptées, ni révoquées, ni refusées) d'un espace, par date. */
|
|
49
|
+
listOpenInvitations(spaceId: string): Invitation[];
|
|
50
|
+
/** Invitations en attente adressées à une adresse, tous espaces confondus, par date. */
|
|
51
|
+
listOpenInvitationsForEmail(email: string): Invitation[];
|
|
52
|
+
findSpace(id: string): Space | null;
|
|
53
|
+
getSpace(id: string): Space;
|
|
54
|
+
findPersonalSpace(userId: string): Space | null;
|
|
55
|
+
/** Espaces dont l'utilisateur est membre : son espace personnel d'abord, puis les espaces communs par nom. */
|
|
56
|
+
listSpacesOf(userId: string): Space[];
|
|
57
|
+
listMemberships(spaceId: string): Membership[];
|
|
58
|
+
findMembership(spaceId: string, userId: string): Membership | null;
|
|
59
|
+
isMember(spaceId: string, userId: string): boolean;
|
|
60
|
+
findTask(id: string): Task | null;
|
|
61
|
+
getTask(id: string): Task;
|
|
62
|
+
/** Tâches d'un espace, par profondeur, colonne et position. */
|
|
63
|
+
listTasks(spaceId: string): Task[];
|
|
64
|
+
/** Tâche d'un espace par son numéro (`41` dans `ORG-41`). */
|
|
65
|
+
findTaskByNumber(spaceId: string, number: number): Task | null;
|
|
66
|
+
listChildren(parentId: string): Task[];
|
|
67
|
+
listAssigneeIds(taskId: string): string[];
|
|
68
|
+
listTagIds(taskId: string): string[];
|
|
69
|
+
/** Instantané d'une tâche : ses champs, ses assignés et ses tags. */
|
|
70
|
+
taskSnapshot(taskId: string): TaskSnapshot;
|
|
71
|
+
/** Assignations des tâches d'un espace. */
|
|
72
|
+
listAssignmentsInSpace(spaceId: string): {
|
|
73
|
+
taskId: string;
|
|
74
|
+
userId: string;
|
|
75
|
+
}[];
|
|
76
|
+
/** Associations tâche-tag des tâches d'un espace. */
|
|
77
|
+
listTaskTagsInSpace(spaceId: string): {
|
|
78
|
+
taskId: string;
|
|
79
|
+
tagId: string;
|
|
80
|
+
}[];
|
|
81
|
+
/** Tâches d'une colonne (espace, parent, statut) par position, sans `excludeId`. */
|
|
82
|
+
listColumn(spaceId: string, parentId: string | null, status: TaskStatus, excludeId?: string | null): Task[];
|
|
83
|
+
findTag(id: string): Tag | null;
|
|
84
|
+
/** Tags d'un espace, par nom. */
|
|
85
|
+
listTags(spaceId: string): Tag[];
|
|
86
|
+
findChecklistItem(id: string): ChecklistItem | null;
|
|
87
|
+
getChecklistItem(id: string): ChecklistItem;
|
|
88
|
+
listChecklist(taskId: string): ChecklistItem[];
|
|
89
|
+
findCheckpoint(id: string): TestCheckpoint | null;
|
|
90
|
+
getCheckpoint(id: string): TestCheckpoint;
|
|
91
|
+
/** Points de vérification d'une tâche de test, dans l'ordre. */
|
|
92
|
+
listCheckpoints(taskId: string): TestCheckpoint[];
|
|
93
|
+
/** Résultats saisis sur les points d'une tâche, tous testeurs confondus. */
|
|
94
|
+
listTestResults(taskId: string): TestResult[];
|
|
95
|
+
findTestResult(checkpointId: string, testerId: string): TestResult | null;
|
|
96
|
+
/** Reviews d'une tâche : brouillons et reviews soumises, par date de soumission. */
|
|
97
|
+
listTestReviews(taskId: string): TestReview[];
|
|
98
|
+
/** Brouillon de review d'un testeur sur une tâche. */
|
|
99
|
+
findDraftReview(taskId: string, testerId: string): TestReview | null;
|
|
100
|
+
findTestReview(id: string): TestReview | null;
|
|
101
|
+
/** Points de vérification des tâches d'un espace. */
|
|
102
|
+
listCheckpointsInSpace(spaceId: string): {
|
|
103
|
+
id: string;
|
|
104
|
+
taskId: string;
|
|
105
|
+
}[];
|
|
106
|
+
/** Résultats saisis sur les points des tâches d'un espace. */
|
|
107
|
+
listTestResultsInSpace(spaceId: string): {
|
|
108
|
+
taskId: string;
|
|
109
|
+
checkpointId: string;
|
|
110
|
+
testerId: string;
|
|
111
|
+
result: TestResultValue;
|
|
112
|
+
}[];
|
|
113
|
+
findComment(id: string): Comment | null;
|
|
114
|
+
getComment(id: string): Comment;
|
|
115
|
+
/** Commentaires d'une tâche, du plus ancien au plus récent. */
|
|
116
|
+
listComments(taskId: string): Comment[];
|
|
117
|
+
findAttachment(id: string): Attachment | null;
|
|
118
|
+
getAttachment(id: string): Attachment;
|
|
119
|
+
/** Pièces jointes d'une tâche, de la plus ancienne à la plus récente. */
|
|
120
|
+
listAttachments(taskId: string): Attachment[];
|
|
121
|
+
/** Pièces jointes d'une tâche et de toutes ses sous-tâches. */
|
|
122
|
+
listAttachmentsInSubtree(taskId: string): Attachment[];
|
|
123
|
+
/** Pièces jointes des tâches d'un espace. */
|
|
124
|
+
listAttachmentsInSpace(spaceId: string): Attachment[];
|
|
125
|
+
findIdea(id: string): Idea | null;
|
|
126
|
+
getIdea(id: string): Idea;
|
|
127
|
+
listIdeas(spaceId: string): Idea[];
|
|
128
|
+
/** Demandes de promotion (`idea_promotion`) en attente ou en cours sur les idées d'un espace. */
|
|
129
|
+
listOpenPromotionRequests(spaceId: string): AgentRequest[];
|
|
130
|
+
/** Tâches de test qui vérifient une tâche. */
|
|
131
|
+
listTestsOf(taskId: string): Task[];
|
|
132
|
+
findAgentRequest(id: string): AgentRequest | null;
|
|
133
|
+
getAgentRequest(id: string): AgentRequest;
|
|
134
|
+
/**
|
|
135
|
+
* Demandes qui visent un espace, d'un statut (toutes sans statut), au plus
|
|
136
|
+
* `limit` : les demandes en attente de la plus ancienne à la plus récente,
|
|
137
|
+
* les autres de la plus récente à la plus ancienne.
|
|
138
|
+
*/
|
|
139
|
+
listAgentRequestsTargeting(spaceId: string, status: RequestStatus | null, limit: number): AgentRequest[];
|
|
140
|
+
/** Demandes d'un espace, de la plus récente à la plus ancienne, au plus `limit`. */
|
|
141
|
+
listAgentRequestsOfSpace(spaceId: string, limit: number): AgentRequest[];
|
|
142
|
+
/** Nombre de demandes en attente d'un espace. */
|
|
143
|
+
countPendingRequestsOfSpace(spaceId: string): number;
|
|
144
|
+
findAgentAction(id: string): AgentAction | null;
|
|
145
|
+
getAgentAction(id: string): AgentAction;
|
|
146
|
+
/** Actions d'une demande (son lot), dans l'ordre où l'agent les a faites. */
|
|
147
|
+
listAgentActions(requestId: string): AgentAction[];
|
|
148
|
+
/** Dernière action non annulée de l'agent sur une entité. */
|
|
149
|
+
lastLiveAgentActionOn(entityType: EntityType, entityId: string): AgentAction | null;
|
|
150
|
+
/** Auteur du dernier changement enregistré d'une entité, ou null si elle n'en a aucun. */
|
|
151
|
+
lastChangeAuthor(entityType: EntityType, entityId: string): {
|
|
152
|
+
actorType: "user" | "agent";
|
|
153
|
+
actorId: string | null;
|
|
154
|
+
requestId: string | null;
|
|
155
|
+
} | null;
|
|
156
|
+
findNotification(id: string): Notification | null;
|
|
157
|
+
getNotification(id: string): Notification;
|
|
158
|
+
/**
|
|
159
|
+
* Notifications affichées dans l'application d'un utilisateur, sur les
|
|
160
|
+
* tâches des espaces dont il est encore membre : non lues d'abord, puis de
|
|
161
|
+
* la plus récente à la plus ancienne.
|
|
162
|
+
*/
|
|
163
|
+
listNotifications(userId: string, limit: number, offset: number): Notification[];
|
|
164
|
+
/** Nombre de notifications non lues affichées dans l'application d'un utilisateur. */
|
|
165
|
+
countUnreadNotifications(userId: string): number;
|
|
166
|
+
findVersion(entityType: VersionedEntityType, entityId: string, version: number): EntityVersion | null;
|
|
167
|
+
listVersions(entityType: VersionedEntityType, entityId: string): EntityVersion[];
|
|
168
|
+
/** Changements de numéro strictement supérieur à `since`, dans l'ordre. */
|
|
169
|
+
listChangesSince(since: number): Change[];
|
|
170
|
+
/**
|
|
171
|
+
* Changements postérieurs à `since` qui concernent un utilisateur : ceux des
|
|
172
|
+
* espaces dont il est membre et ceux qui le visent, au plus `limit`, dans l'ordre.
|
|
173
|
+
*/
|
|
174
|
+
listChangesForUser(userId: string, since: number, limit: number): Change[];
|
|
175
|
+
/** Numéro du dernier changement, 0 si le journal est vide. */
|
|
176
|
+
lastChangeSeq(): number;
|
|
177
|
+
/**
|
|
178
|
+
* Abonne `listener` aux notifications dont le destinataire veut un e-mail :
|
|
179
|
+
* il reçoit leurs identifiants après la validation de la mutation qui les a
|
|
180
|
+
* créées.
|
|
181
|
+
*/
|
|
182
|
+
setEmailListener(listener: ((notificationIds: string[]) => void) | null): void;
|
|
183
|
+
/**
|
|
184
|
+
* Point unique d'écriture. `fn` reçoit une `Mutation` et s'exécute dans une
|
|
185
|
+
* transaction exclusive ; à sa sortie, les invariants sont vérifiés sur l'état
|
|
186
|
+
* final, les versions et le journal sont écrits. Toute erreur annule
|
|
187
|
+
* l'ensemble.
|
|
188
|
+
*/
|
|
189
|
+
mutate<T>(actor: Actor, fn: (tx: Mutation) => T): T;
|
|
190
|
+
}
|
|
191
|
+
export interface CreateUserInput {
|
|
192
|
+
/** Identifiant imposé, pour qu'un compte puisse être l'acteur de sa propre création. */
|
|
193
|
+
id?: string;
|
|
194
|
+
email: string;
|
|
195
|
+
displayName?: string | null;
|
|
196
|
+
passwordHash?: string | null;
|
|
197
|
+
status: UserStatus;
|
|
198
|
+
}
|
|
199
|
+
export interface UpdateUserInput {
|
|
200
|
+
displayName?: string | null;
|
|
201
|
+
passwordHash?: string | null;
|
|
202
|
+
status?: UserStatus;
|
|
203
|
+
}
|
|
204
|
+
export interface CreateSpaceInput {
|
|
205
|
+
name: string;
|
|
206
|
+
kind: SpaceKind;
|
|
207
|
+
ownerId: string;
|
|
208
|
+
keyPrefix: string;
|
|
209
|
+
}
|
|
210
|
+
export interface CreateTaskInput {
|
|
211
|
+
spaceId: string;
|
|
212
|
+
parentId?: string | null;
|
|
213
|
+
type?: TaskType;
|
|
214
|
+
title: string;
|
|
215
|
+
description?: string;
|
|
216
|
+
status?: TaskStatus;
|
|
217
|
+
priority?: TaskPriority;
|
|
218
|
+
/** Rang dans la colonne ; par défaut, après la dernière tâche de la colonne. */
|
|
219
|
+
position?: number;
|
|
220
|
+
}
|
|
221
|
+
export interface UpdateTaskInput {
|
|
222
|
+
title?: string;
|
|
223
|
+
description?: string;
|
|
224
|
+
status?: TaskStatus;
|
|
225
|
+
priority?: TaskPriority;
|
|
226
|
+
type?: TaskType;
|
|
227
|
+
parentId?: string | null;
|
|
228
|
+
/** Tâche vérifiée, pour une tâche de test ; null la retire. */
|
|
229
|
+
testedTaskId?: string | null;
|
|
230
|
+
/** Rang dans la colonne ; par défaut, après la dernière tâche quand la colonne change. */
|
|
231
|
+
position?: number;
|
|
232
|
+
}
|
|
233
|
+
export interface UpdateUserSettingsInput {
|
|
234
|
+
notifyAssignApp?: boolean;
|
|
235
|
+
notifyAssignEmail?: boolean;
|
|
236
|
+
notifyCommentApp?: boolean;
|
|
237
|
+
notifyCommentEmail?: boolean;
|
|
238
|
+
}
|
|
239
|
+
/** Issue de l'envoi de l'e-mail d'une notification. */
|
|
240
|
+
export type NotificationEmailOutcome = {
|
|
241
|
+
sent: true;
|
|
242
|
+
} | {
|
|
243
|
+
sent: false;
|
|
244
|
+
reason: string;
|
|
245
|
+
};
|
|
246
|
+
export interface CreateIdeaInput {
|
|
247
|
+
spaceId: string;
|
|
248
|
+
text: string;
|
|
249
|
+
origin?: "manual" | "agent";
|
|
250
|
+
}
|
|
251
|
+
export interface UpdateIdeaInput {
|
|
252
|
+
text?: string;
|
|
253
|
+
promotedTaskId?: string | null;
|
|
254
|
+
archived?: boolean;
|
|
255
|
+
}
|
|
256
|
+
/** Action de l'agent à enregistrer dans le lot de sa demande. */
|
|
257
|
+
export interface AgentActionInput {
|
|
258
|
+
entityType: EntityType;
|
|
259
|
+
entityId: string;
|
|
260
|
+
operation: AgentOperation;
|
|
261
|
+
/** État de l'entité avant l'action ; null pour une création. */
|
|
262
|
+
before: unknown;
|
|
263
|
+
/** État de l'entité après l'action ; null pour une suppression. */
|
|
264
|
+
after: unknown;
|
|
265
|
+
/** Description lisible en français, affichée dans la GUI. */
|
|
266
|
+
summary: string;
|
|
267
|
+
/** Tâche concernée : la tâche elle-même, ou celle qui porte l'élément ; null pour une idée. */
|
|
268
|
+
taskId: string | null;
|
|
269
|
+
}
|
|
270
|
+
export interface CreateAgentRequestInput {
|
|
271
|
+
/** Espace où la demande est écrite, et où l'agent agira. */
|
|
272
|
+
targetSpaceId: string;
|
|
273
|
+
kind: RequestKind;
|
|
274
|
+
text: string;
|
|
275
|
+
contextTaskId?: string | null;
|
|
276
|
+
contextIdeaId?: string | null;
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Écritures d'une mutation en cours. Chaque méthode applique une modification
|
|
280
|
+
* et la note ; `finish` vérifie les invariants et écrit versions et journal.
|
|
281
|
+
*/
|
|
282
|
+
export declare class Mutation {
|
|
283
|
+
readonly store: Store;
|
|
284
|
+
readonly actor: Actor;
|
|
285
|
+
/** Horodatage commun à toutes les écritures de la mutation. */
|
|
286
|
+
readonly now: string;
|
|
287
|
+
private readonly touched;
|
|
288
|
+
/** Notifications créées par la mutation dont le destinataire veut un e-mail. */
|
|
289
|
+
readonly emailNotificationIds: string[];
|
|
290
|
+
/** Demande pour laquelle agit l'agent, lue au début de la mutation. */
|
|
291
|
+
private readonly request;
|
|
292
|
+
/** Jeton avec lequel agit l'agent. */
|
|
293
|
+
private readonly token;
|
|
294
|
+
/** Vrai une fois vérifié que l'agent peut écrire pour sa demande. */
|
|
295
|
+
private agentWriteChecked;
|
|
296
|
+
/** Demandes créées par la mutation, dont l'espace cible est vérifié. */
|
|
297
|
+
private readonly createdRequestIds;
|
|
298
|
+
private readonly db;
|
|
299
|
+
constructor(store: Store, actor: Actor);
|
|
300
|
+
/** Utilisateur au nom de qui la mutation s'exécute : l'utilisateur, ou le propriétaire du jeton de l'agent. */
|
|
301
|
+
get actingUserId(): string;
|
|
302
|
+
private loadAgentRequest;
|
|
303
|
+
/** La demande de l'agent vise l'espace de son jeton. */
|
|
304
|
+
private assertRequestInTokenSpace;
|
|
305
|
+
/** La demande est `processing` et prise par le jeton de l'agent. */
|
|
306
|
+
private assertClaimedByToken;
|
|
307
|
+
/**
|
|
308
|
+
* L'agent n'écrit que pour une demande `processing` prise par son jeton,
|
|
309
|
+
* dans l'espace du jeton, dont le propriétaire est toujours membre.
|
|
310
|
+
* Vérifié à la première écriture d'une entité autre que la demande elle-même.
|
|
311
|
+
*/
|
|
312
|
+
private assertAgentMayWrite;
|
|
313
|
+
private touch;
|
|
314
|
+
createUser(input: CreateUserInput): User;
|
|
315
|
+
updateUser(id: string, patch: UpdateUserInput): User;
|
|
316
|
+
createSession(session: Session): Session;
|
|
317
|
+
extendSession(idHash: string, expiresAt: string): void;
|
|
318
|
+
deleteSession(idHash: string): void;
|
|
319
|
+
/** Ferme les sessions d'un compte, sauf celle de `keepIdHash`. */
|
|
320
|
+
deleteSessionsOf(userId: string, keepIdHash?: string | null): void;
|
|
321
|
+
/** Supprime les sessions expirées à l'instant `now`. */
|
|
322
|
+
deleteExpiredSessions(now: string): void;
|
|
323
|
+
/**
|
|
324
|
+
* Émet un lien d'accès pour un compte. Un lien d'invitation est rattaché à
|
|
325
|
+
* son invitation, adressée à ce compte, et remplace le lien inutilisé de
|
|
326
|
+
* cette seule invitation ; un lien de réinitialisation remplace les liens de
|
|
327
|
+
* réinitialisation inutilisés du compte.
|
|
328
|
+
*/
|
|
329
|
+
createAccessLink(input: {
|
|
330
|
+
userId: string;
|
|
331
|
+
purpose: AccessLinkPurpose;
|
|
332
|
+
invitationId: string | null;
|
|
333
|
+
tokenHash: string;
|
|
334
|
+
expiresAt: string;
|
|
335
|
+
}): AccessLink;
|
|
336
|
+
/** Supprime les liens inutilisés d'un compte, qui ne fonctionnent plus. */
|
|
337
|
+
discardUnusedAccessLinks(userId: string): void;
|
|
338
|
+
/** Supprime les liens inutilisés émis par une invitation. */
|
|
339
|
+
private discardInvitationLinks;
|
|
340
|
+
markAccessLinkUsed(id: string): void;
|
|
341
|
+
/** Enregistre un jeton d'agent de l'utilisateur acteur ; seul son hash est conservé. */
|
|
342
|
+
createAgentToken(input: {
|
|
343
|
+
spaceId: string;
|
|
344
|
+
name: string;
|
|
345
|
+
prefix: string;
|
|
346
|
+
tokenHash: string;
|
|
347
|
+
expiresAt: string | null;
|
|
348
|
+
}): AgentToken;
|
|
349
|
+
/** Révoque un jeton de l'utilisateur acteur ; un jeton déjà révoqué reste tel quel. */
|
|
350
|
+
revokeAgentToken(id: string): AgentToken;
|
|
351
|
+
/** Date du dernier usage d'un jeton ; le journal des changements n'en garde pas trace. */
|
|
352
|
+
recordAgentTokenUse(id: string, at: string): void;
|
|
353
|
+
/** Invite une adresse dans un espace, jusqu'à `expiresAt`. */
|
|
354
|
+
createInvitation(input: {
|
|
355
|
+
spaceId: string;
|
|
356
|
+
email: string;
|
|
357
|
+
expiresAt: string;
|
|
358
|
+
}): Invitation;
|
|
359
|
+
/** Repousse l'échéance d'une invitation en attente. */
|
|
360
|
+
renewInvitation(id: string, expiresAt: string): Invitation;
|
|
361
|
+
/** Révoque une invitation en attente ; ses liens inutilisés ne fonctionnent plus. */
|
|
362
|
+
revokeInvitation(id: string): Invitation;
|
|
363
|
+
acceptInvitation(id: string): Invitation;
|
|
364
|
+
/** Refus d'une invitation en attente par son destinataire ; ses liens inutilisés ne fonctionnent plus. */
|
|
365
|
+
declineInvitation(id: string): Invitation;
|
|
366
|
+
private openInvitation;
|
|
367
|
+
/** Note la modification d'une invitation, pour son espace et pour le compte de son destinataire. */
|
|
368
|
+
private touchInvitation;
|
|
369
|
+
/** Crée un espace et en fait de son propriétaire le membre `owner`. */
|
|
370
|
+
createSpace(input: CreateSpaceInput): Space;
|
|
371
|
+
renameSpace(id: string, name: string): Space;
|
|
372
|
+
/** Supprime un espace commun et tout son contenu. Un espace personnel ne se supprime pas. */
|
|
373
|
+
deleteSpace(id: string): void;
|
|
374
|
+
addMember(spaceId: string, userId: string, role?: MemberRole): Membership;
|
|
375
|
+
setMemberRole(spaceId: string, userId: string, role: MemberRole): Membership;
|
|
376
|
+
/** Retire un membre d'un espace et révoque ses jetons d'agent sur cet espace. */
|
|
377
|
+
removeMember(spaceId: string, userId: string): void;
|
|
378
|
+
private insertMembership;
|
|
379
|
+
createTask(input: CreateTaskInput): Task;
|
|
380
|
+
/**
|
|
381
|
+
* Modifie une tâche. Un changement de parent recalcule la profondeur de toute
|
|
382
|
+
* la sous-arborescence ; un changement de colonne sans position place la
|
|
383
|
+
* tâche en fin de colonne. Une tâche qui devient standard perd sa tâche testée.
|
|
384
|
+
*/
|
|
385
|
+
updateTask(id: string, patch: UpdateTaskInput): Task;
|
|
386
|
+
/**
|
|
387
|
+
* Supprime une tâche et ses sous-tâches ; chacune reçoit une version de
|
|
388
|
+
* suppression. Les tâches de test qui vérifiaient une tâche supprimée
|
|
389
|
+
* perdent ce lien, avec une nouvelle version.
|
|
390
|
+
*/
|
|
391
|
+
deleteTask(id: string): void;
|
|
392
|
+
/** Remplace les assignés (ou testeurs) d'une tâche. */
|
|
393
|
+
setAssignees(taskId: string, userIds: readonly string[]): string[];
|
|
394
|
+
/**
|
|
395
|
+
* Déplace une tâche dans la colonne `status` de son parent, juste après
|
|
396
|
+
* `afterId` (null : en tête de colonne). Son rang est pris entre ses deux
|
|
397
|
+
* nouvelles voisines ; quand leur écart est trop faible, la colonne est
|
|
398
|
+
* renumérotée.
|
|
399
|
+
*/
|
|
400
|
+
moveTask(id: string, status: TaskStatus, afterId: string | null): Task;
|
|
401
|
+
/** Remplace les tags d'une tâche ; un nom absent de l'espace y crée le tag (noms comparés sans la casse). */
|
|
402
|
+
setTags(taskId: string, names: readonly string[]): Tag[];
|
|
403
|
+
private createTag;
|
|
404
|
+
/** Ajoute un élément en fin de checklist d'une tâche standard. */
|
|
405
|
+
addChecklistItem(taskId: string, text: string): ChecklistItem;
|
|
406
|
+
updateChecklistItem(id: string, patch: {
|
|
407
|
+
text?: string;
|
|
408
|
+
done?: boolean;
|
|
409
|
+
}): ChecklistItem;
|
|
410
|
+
deleteChecklistItem(id: string): void;
|
|
411
|
+
/** Recrée un élément de checklist supprimé, avec son identifiant et sa position. */
|
|
412
|
+
restoreChecklistItem(snapshot: ChecklistItem): ChecklistItem;
|
|
413
|
+
/** Place un élément de checklist juste après `afterId` (null : en tête), en renumérotant la liste si besoin. */
|
|
414
|
+
moveChecklistItem(id: string, afterId: string | null): ChecklistItem;
|
|
415
|
+
private updateChecklistItemPosition;
|
|
416
|
+
/**
|
|
417
|
+
* Rang d'un élément inséré juste après `afterId` (null : en tête) dans
|
|
418
|
+
* `items`, triés par rang. Quand les voisins sont trop proches, `renumber`
|
|
419
|
+
* reçoit les identifiants dans l'ordre et leur donne les rangs 1, 2, 3…
|
|
420
|
+
*/
|
|
421
|
+
private slotAfter;
|
|
422
|
+
/** Tâche de test qui porte des points de vérification. */
|
|
423
|
+
private testTask;
|
|
424
|
+
/** Tâche de test dont l'utilisateur acteur est testeur (assigné). */
|
|
425
|
+
private testedTask;
|
|
426
|
+
/** Ajoute un point de vérification en fin de liste d'une tâche de test. */
|
|
427
|
+
addCheckpoint(taskId: string, text: string): TestCheckpoint;
|
|
428
|
+
updateCheckpoint(id: string, text: string): TestCheckpoint;
|
|
429
|
+
/** Supprime un point de vérification et les résultats saisis dessus. */
|
|
430
|
+
deleteCheckpoint(id: string): void;
|
|
431
|
+
/** Recrée un point de vérification supprimé, avec son identifiant, sa position et les résultats saisis dessus. */
|
|
432
|
+
restoreCheckpoint(snapshot: TestCheckpoint, results: readonly TestResult[]): TestCheckpoint;
|
|
433
|
+
/** Place un point de vérification juste après `afterId` (null : en tête), en renumérotant la liste si besoin. */
|
|
434
|
+
moveCheckpoint(id: string, afterId: string | null): TestCheckpoint;
|
|
435
|
+
/**
|
|
436
|
+
* Enregistre le résultat de l'utilisateur acteur sur un point : valeur,
|
|
437
|
+
* commentaire, ou les deux. Seul un testeur de la tâche saisit ses propres
|
|
438
|
+
* résultats ; un point sans résultat vaut « untested ».
|
|
439
|
+
*/
|
|
440
|
+
setTestResult(checkpointId: string, patch: {
|
|
441
|
+
result?: TestResultValue;
|
|
442
|
+
comment?: string;
|
|
443
|
+
}): TestResult;
|
|
444
|
+
/** Enregistre le brouillon de review de l'utilisateur acteur, testeur de la tâche. */
|
|
445
|
+
saveReviewDraft(taskId: string, text: string): TestReview;
|
|
446
|
+
/**
|
|
447
|
+
* Soumet la review de l'utilisateur acteur avec le texte `text` : le
|
|
448
|
+
* brouillon est figé (date de soumission) et une demande `test_review` est
|
|
449
|
+
* déposée pour l'agent, dans l'espace de la tâche, avec la tâche pour contexte.
|
|
450
|
+
*/
|
|
451
|
+
submitReview(taskId: string, text: string): {
|
|
452
|
+
review: TestReview;
|
|
453
|
+
request: AgentRequest;
|
|
454
|
+
};
|
|
455
|
+
/** Commentaire de l'utilisateur acteur sur une tâche. */
|
|
456
|
+
addComment(taskId: string, body: string): Comment;
|
|
457
|
+
/** Modifie un commentaire ; seul son auteur le peut. */
|
|
458
|
+
updateComment(id: string, body: string): Comment;
|
|
459
|
+
/** Supprime un commentaire ; seul son auteur le peut. */
|
|
460
|
+
deleteComment(id: string): void;
|
|
461
|
+
/** Supprime un commentaire écrit par l'agent, quel que soit l'utilisateur acteur : annulation de l'action qui l'a créé. */
|
|
462
|
+
deleteAgentComment(id: string): void;
|
|
463
|
+
private authoredComment;
|
|
464
|
+
/** Enregistre une pièce jointe dont le fichier est déjà écrit sous `storagePath`. */
|
|
465
|
+
createAttachment(input: {
|
|
466
|
+
id: string;
|
|
467
|
+
taskId: string;
|
|
468
|
+
filename: string;
|
|
469
|
+
mime: string;
|
|
470
|
+
size: number;
|
|
471
|
+
storagePath: string;
|
|
472
|
+
}): Attachment;
|
|
473
|
+
/** Supprime l'enregistrement d'une pièce jointe et le renvoie ; son fichier reste à effacer. */
|
|
474
|
+
deleteAttachment(id: string): Attachment;
|
|
475
|
+
/** Profondeur d'un enfant de `parent`, qui doit être dans l'espace `spaceId` et laisser place à un niveau de plus. */
|
|
476
|
+
private childDepth;
|
|
477
|
+
/** Vrai si `taskId` est `rootId` ou l'une de ses sous-tâches. */
|
|
478
|
+
private isInSubtree;
|
|
479
|
+
/** Nombre de niveaux de sous-tâches sous `taskId` (0 sans sous-tâche). */
|
|
480
|
+
private subtreeHeight;
|
|
481
|
+
private updateDescendantDepths;
|
|
482
|
+
/** Position après la dernière tâche de la colonne (espace, parent, statut), en ignorant `excludeId`. */
|
|
483
|
+
private endOfColumn;
|
|
484
|
+
createIdea(input: CreateIdeaInput): Idea;
|
|
485
|
+
updateIdea(id: string, patch: UpdateIdeaInput): Idea;
|
|
486
|
+
/** Supprime une idée ; sa version de suppression a un instantané nul. */
|
|
487
|
+
deleteIdea(id: string): void;
|
|
488
|
+
/** Dépose une demande `pending` de l'utilisateur acteur. */
|
|
489
|
+
createAgentRequest(input: CreateAgentRequestInput): AgentRequest;
|
|
490
|
+
/** Note la modification d'une demande, pour son espace. */
|
|
491
|
+
private touchRequest;
|
|
492
|
+
/** Demande `pending` qu'un membre de son espace modifie ou annule. */
|
|
493
|
+
private pendingRequestForUser;
|
|
494
|
+
/** Remplace le texte d'une demande en attente. */
|
|
495
|
+
updateAgentRequestText(id: string, text: string): AgentRequest;
|
|
496
|
+
/** Annule une demande en attente : l'agent ne la traitera pas. */
|
|
497
|
+
cancelAgentRequest(id: string): AgentRequest;
|
|
498
|
+
/** Repasse en attente une demande `processing` : un agent pourra la reprendre. */
|
|
499
|
+
releaseAgentRequest(id: string): AgentRequest;
|
|
500
|
+
/** Demande et jeton de l'agent acteur. */
|
|
501
|
+
private agentRequest;
|
|
502
|
+
/**
|
|
503
|
+
* L'agent prend sa demande avec son jeton : `pending` devient `processing`
|
|
504
|
+
* et la demande est réservée à ce jeton. La mise à jour conditionnelle, dans
|
|
505
|
+
* la transaction exclusive, garantit qu'un seul agent prend une demande donnée.
|
|
506
|
+
*/
|
|
507
|
+
claimAgentRequest(): AgentRequest;
|
|
508
|
+
/** Termine la demande de l'agent avec son message de compte rendu. */
|
|
509
|
+
completeAgentRequest(reply: string): AgentRequest;
|
|
510
|
+
/** Termine la demande de l'agent en échec, avec la raison montrée à son auteur. */
|
|
511
|
+
failAgentRequest(reason: string): AgentRequest;
|
|
512
|
+
private finishAgentRequest;
|
|
513
|
+
/** Enregistre une action de l'agent dans le lot de sa demande, avec le rang suivant. */
|
|
514
|
+
recordAgentAction(input: AgentActionInput): AgentAction;
|
|
515
|
+
/** Marque annulée une action de l'agent, par l'utilisateur acteur. */
|
|
516
|
+
markAgentActionUndone(id: string, taskId: string | null): AgentAction;
|
|
517
|
+
/** Vrai si l'utilisateur est l'auteur humain de la mutation : on ne se notifie pas soi-même. */
|
|
518
|
+
private isActingUser;
|
|
519
|
+
/**
|
|
520
|
+
* Notifie un utilisateur selon ses préférences : la notification apparaît
|
|
521
|
+
* dans l'application si elle y est activée, et son identifiant est retenu
|
|
522
|
+
* pour l'envoi de l'e-mail si celui-ci est activé. Rien n'est créé quand les
|
|
523
|
+
* deux sont désactivés.
|
|
524
|
+
*/
|
|
525
|
+
private notify;
|
|
526
|
+
/** Marque lue une notification de l'utilisateur acteur. */
|
|
527
|
+
markNotificationRead(id: string): void;
|
|
528
|
+
/** Marque lues toutes les notifications de l'utilisateur acteur ; renvoie leur nombre. */
|
|
529
|
+
markAllNotificationsRead(): number;
|
|
530
|
+
/** Enregistre l'issue de l'envoi de l'e-mail d'une notification : date d'envoi ou raison de l'échec. */
|
|
531
|
+
recordNotificationEmail(id: string, outcome: NotificationEmailOutcome): Notification;
|
|
532
|
+
/** Modifie les préférences d'un utilisateur. */
|
|
533
|
+
updateUserSettings(userId: string, patch: UpdateUserSettingsInput): UserSettings;
|
|
534
|
+
/** Vérifie les invariants sur l'état final, puis écrit les versions et le journal. */
|
|
535
|
+
finish(): void;
|
|
536
|
+
private checkInvariants;
|
|
537
|
+
/**
|
|
538
|
+
* L'agent ne touche que sa demande et des entités de l'espace cible de
|
|
539
|
+
* celle-ci ; les notifications qu'il crée visent des personnes, pas un espace.
|
|
540
|
+
*/
|
|
541
|
+
private checkAgentScope;
|
|
542
|
+
/**
|
|
543
|
+
* Un espace personnel a exactement un membre, son propriétaire, et aucune
|
|
544
|
+
* invitation ; un espace commun a exactement un `owner`, son propriétaire.
|
|
545
|
+
* Les assignés (et testeurs) de ses tâches sont membres de l'espace ; les
|
|
546
|
+
* résultats et reviews d'un ancien testeur restent en historique.
|
|
547
|
+
*/
|
|
548
|
+
private checkSpace;
|
|
549
|
+
/**
|
|
550
|
+
* Profondeur, parent dans le même espace, absence de cycle, position unique
|
|
551
|
+
* dans la colonne ; tâche testée portée par une tâche de test, dans le même
|
|
552
|
+
* espace, autre qu'elle-même.
|
|
553
|
+
*/
|
|
554
|
+
private checkTask;
|
|
555
|
+
/**
|
|
556
|
+
* Une demande vise l'espace où elle est écrite, dont son auteur est membre.
|
|
557
|
+
* Une promotion d'idée vise l'espace de son idée, qui n'a pas d'autre
|
|
558
|
+
* promotion ouverte.
|
|
559
|
+
*/
|
|
560
|
+
private checkRequestTarget;
|
|
561
|
+
/** Une version par entité versionnée modifiée ; une suppression a un instantané nul. */
|
|
562
|
+
private writeVersions;
|
|
563
|
+
/** Une ligne du journal par entité modifiée, avec l'auteur de la mutation. */
|
|
564
|
+
private writeChanges;
|
|
565
|
+
}
|