@deveye/types 0.15.0

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 (87) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +23 -0
  3. package/package.json +68 -0
  4. package/src/domain/audience.ts +549 -0
  5. package/src/domain/backup.ts +355 -0
  6. package/src/domain/credential.ts +55 -0
  7. package/src/domain/database.ts +467 -0
  8. package/src/domain/deploy.ts +231 -0
  9. package/src/domain/device.ts +172 -0
  10. package/src/domain/deviceFiles.ts +84 -0
  11. package/src/domain/deviceLogs.ts +82 -0
  12. package/src/domain/featureRegistry.ts +392 -0
  13. package/src/domain/finance.ts +477 -0
  14. package/src/domain/git.ts +419 -0
  15. package/src/domain/home.ts +314 -0
  16. package/src/domain/live.ts +272 -0
  17. package/src/domain/logs.ts +117 -0
  18. package/src/domain/mail.ts +394 -0
  19. package/src/domain/metrics.ts +127 -0
  20. package/src/domain/note.ts +202 -0
  21. package/src/domain/notifications.ts +268 -0
  22. package/src/domain/packages.ts +35 -0
  23. package/src/domain/password.ts +36 -0
  24. package/src/domain/presence.ts +21 -0
  25. package/src/domain/project.ts +168 -0
  26. package/src/domain/projectBoard.ts +130 -0
  27. package/src/domain/projectChat.ts +46 -0
  28. package/src/domain/projectHistory.ts +82 -0
  29. package/src/domain/projectLink.ts +87 -0
  30. package/src/domain/projectPlan.ts +68 -0
  31. package/src/domain/report.ts +492 -0
  32. package/src/domain/role.ts +8 -0
  33. package/src/domain/secrecy.ts +66 -0
  34. package/src/domain/sentinel.ts +623 -0
  35. package/src/domain/sharing.ts +186 -0
  36. package/src/domain/syncProtocol.ts +116 -0
  37. package/src/domain/twoFactor.ts +40 -0
  38. package/src/domain/uptime.ts +216 -0
  39. package/src/domain/user.ts +141 -0
  40. package/src/domain/workspace.ts +56 -0
  41. package/src/domain/workspaceRole.ts +251 -0
  42. package/src/features/admin.ts +112 -0
  43. package/src/features/audience.ts +275 -0
  44. package/src/features/backup.ts +230 -0
  45. package/src/features/database.ts +461 -0
  46. package/src/features/deploy.ts +245 -0
  47. package/src/features/device.ts +292 -0
  48. package/src/features/deviceFiles.ts +83 -0
  49. package/src/features/deviceLogs.ts +36 -0
  50. package/src/features/deviceTerminal.ts +57 -0
  51. package/src/features/finance.ts +360 -0
  52. package/src/features/git.ts +368 -0
  53. package/src/features/home.ts +32 -0
  54. package/src/features/live.ts +113 -0
  55. package/src/features/logs.ts +86 -0
  56. package/src/features/mail.ts +374 -0
  57. package/src/features/metrics.ts +185 -0
  58. package/src/features/note.ts +189 -0
  59. package/src/features/notify.ts +164 -0
  60. package/src/features/password.ts +67 -0
  61. package/src/features/project.ts +709 -0
  62. package/src/features/registry.ts +103 -0
  63. package/src/features/secrecy.ts +120 -0
  64. package/src/features/sentinel.ts +233 -0
  65. package/src/features/sharing.ts +79 -0
  66. package/src/features/twoFactor.ts +47 -0
  67. package/src/features/uptime.ts +186 -0
  68. package/src/features/user.ts +91 -0
  69. package/src/features/workspace.ts +200 -0
  70. package/src/http/auth.ts +94 -0
  71. package/src/http/device.ts +222 -0
  72. package/src/http/status.ts +45 -0
  73. package/src/index.ts +1700 -0
  74. package/src/protocol/agent.ts +1171 -0
  75. package/src/protocol/envelope.ts +46 -0
  76. package/src/protocol/error.ts +27 -0
  77. package/src/protocol/result.ts +17 -0
  78. package/src/protocol/version.ts +6 -0
  79. package/src/sdk/client-ambient.d.ts +238 -0
  80. package/src/sdk/client.ts +66 -0
  81. package/src/sdk/ids.ts +25 -0
  82. package/src/sdk/index.ts +11 -0
  83. package/src/sdk/manifest.ts +326 -0
  84. package/src/sdk/providers.ts +48 -0
  85. package/src/sdk/server.ts +378 -0
  86. package/src/sdk/testing.ts +179 -0
  87. package/src/utils/version.ts +28 -0
@@ -0,0 +1,419 @@
1
+ import { z } from 'zod';
2
+ import { userColorSchema } from './user';
3
+ import { projectStatusSchema } from './project';
4
+
5
+ /**
6
+ * Les dépôts git d'un espace, et le cache local de ce qu'on y a lu.
7
+ *
8
+ * **Un dépôt appartient à l'espace, pas à un projet.** C'est le renversement qui
9
+ * fonde cette feature : le même dépôt sert souvent plusieurs projets, et le
10
+ * modéliser comme une propriété de l'un d'eux le faisait synchroniser deux fois,
11
+ * dans deux caches, sous deux quotas. Un projet n'en garde donc qu'une
12
+ * **liaison** (`project_repo_links`), et délier n'efface jamais le dépôt.
13
+ *
14
+ * **Cache, et non source de vérité** : le dépôt distant fait foi. Ce qui est
15
+ * stocké ici sert à afficher un graphe et un historique sans rappeler l'API à
16
+ * chaque ouverture — et à respecter le quota du fournisseur.
17
+ *
18
+ * Découpage clair / chiffré : `sha`, `committed_at`, `author_ref` et les
19
+ * horodatages restent en clair (c'est ce qui rend le graphe calculable en SQL),
20
+ * les messages, noms de branches et identités d'auteur sont chiffrés.
21
+ *
22
+ * **Toujours à l'étage ouvert**, quel que soit le tier des projets qui s'y
23
+ * rattachent : un dépôt est d'espace, il ne peut pas suivre le palier de
24
+ * confidentialité de l'un d'eux, et le service de fond doit le lire sans
25
+ * session. Corollaire : un projet confidentiel n'a pas de dépôt du tout.
26
+ */
27
+
28
+ export const GIT_REPO_OWNER_MAX_LENGTH = 100;
29
+ export const GIT_REPO_NAME_MAX_LENGTH = 100;
30
+
31
+ /**
32
+ * Fournisseurs de dépôts.
33
+ *
34
+ * Un seul, et l'énumération est là pour que le second n'ait pas à réécrire le
35
+ * contrat. Elle couvrait aussi `dokploy` du temps où les jetons des deux
36
+ * intégrations vivaient dans ce module : un dépôt Dokploy n'a jamais existé,
37
+ * c'était le fournisseur d'un **jeton**, notion qui a désormais son propre
38
+ * domaine (`domain/credential.ts`).
39
+ */
40
+ export const gitProviderSchema = z.enum(['github']);
41
+ export type GitProvider = z.infer<typeof gitProviderSchema>;
42
+
43
+ /** Un dépôt de l'espace, et l'état de sa dernière synchronisation. */
44
+ export const gitRepoSchema = z.object({
45
+ id: z.number().int().positive(),
46
+ provider: gitProviderSchema,
47
+ owner: z.string().max(GIT_REPO_OWNER_MAX_LENGTH),
48
+ repo: z.string().max(GIT_REPO_NAME_MAX_LENGTH),
49
+ credentialId: z.number().int().positive().nullable(),
50
+ enabled: z.boolean(),
51
+ defaultBranch: z.string().nullable(),
52
+ lastSyncAt: z.number().int().nullable(),
53
+ /** Message du dernier échec, ou `null` après un succès. */
54
+ lastSyncError: z.string().nullable(),
55
+ /**
56
+ * Combien de projets s'en servent.
57
+ *
58
+ * En clair dans la liste plutôt que sur demande : c'est l'information qui
59
+ * dit si supprimer ce dépôt casse quelque chose, et elle doit se lire avant
60
+ * de cliquer, pas après.
61
+ */
62
+ projectCount: z.number().int().nonnegative(),
63
+ /**
64
+ * Cet élément vient d'un **autre espace**, qui le projette ici.
65
+ *
66
+ * L'écran le signale d'une pastille : sans elle, rien ne distingue une
67
+ * ligne locale d'une fenêtre sur l'espace voisin — et les gestes réservés
68
+ * au domicile (supprimer, re-partager) sembleraient cassés au lieu de
69
+ * s'expliquer.
70
+ */
71
+ foreign: z.boolean(),
72
+ created: z.number().int()
73
+ });
74
+ export type GitRepo = z.infer<typeof gitRepoSchema>;
75
+
76
+ /**
77
+ * Un dépôt proposé au choix, lu **chez le fournisseur au moment où on le
78
+ * demande** — comme le diff d'un commit, et pour la même raison : c'est une
79
+ * liste qu'on regarde une fois, au moment d'ajouter un dépôt, et qui serait
80
+ * périmée avant d'être relue si on la mettait en cache.
81
+ */
82
+ export const gitRepoCandidateSchema = z.object({
83
+ name: z.string(),
84
+ /** Un dépôt privé n'est visible qu'avec un jeton : le dire évite « où est-il ? ». */
85
+ private: z.boolean(),
86
+ archived: z.boolean(),
87
+ description: z.string(),
88
+ pushedAt: z.number().int().nullable(),
89
+ /** Déjà présent dans l'espace : on le signale plutôt que de le masquer. */
90
+ known: z.boolean()
91
+ });
92
+ export type GitRepoCandidate = z.infer<typeof gitRepoCandidateSchema>;
93
+
94
+ /**
95
+ * Un projet qui utilise ce dépôt.
96
+ *
97
+ * Ne remonte que des projets à l'étage ouvert — un projet confidentiel ne peut
98
+ * pas être lié, donc le titre est toujours lisible sans session.
99
+ */
100
+ export const gitRepoUsageSchema = z.object({
101
+ projectId: z.number().int().positive(),
102
+ title: z.string(),
103
+ status: projectStatusSchema
104
+ });
105
+ export type GitRepoUsage = z.infer<typeof gitRepoUsageSchema>;
106
+
107
+ export const gitBranchSchema = z.object({
108
+ id: z.number().int().positive(),
109
+ name: z.string(),
110
+ headSha: z.string().nullable(),
111
+ isDefault: z.boolean(),
112
+ updatedAt: z.number().int().nullable(),
113
+ /**
114
+ * Commits d'avance et de retard sur la branche par défaut.
115
+ *
116
+ * `null` — et non zéro — quand la comparaison n'a pas eu lieu : la branche
117
+ * par défaut elle-même, ou un dépôt jamais comparé. Zéro veut dire « à
118
+ * jour », ce qui est une affirmation ; l'absence n'en est pas une.
119
+ */
120
+ aheadCount: z.number().int().nonnegative().nullable(),
121
+ behindCount: z.number().int().nonnegative().nullable()
122
+ });
123
+ export type GitBranch = z.infer<typeof gitBranchSchema>;
124
+
125
+ /**
126
+ * L'issue d'une pull request.
127
+ *
128
+ * GitHub ne distingue pas « fusionnée » de « fermée » dans son champ `state` —
129
+ * une PR fusionnée y est simplement `closed`. Or ce sont deux fins opposées :
130
+ * on les sépare ici, et `draft` est promu au rang d'état parce que c'est ainsi
131
+ * qu'on le lit dans une liste.
132
+ */
133
+ export const gitPullStateSchema = z.enum(['open', 'draft', 'merged', 'closed']);
134
+ export type GitPullState = z.infer<typeof gitPullStateSchema>;
135
+
136
+ export const gitPullRequestSchema = z.object({
137
+ id: z.number().int().positive(),
138
+ /** Numéro public de la PR : son identité stable chez le fournisseur. */
139
+ number: z.number().int().positive(),
140
+ state: gitPullStateSchema,
141
+ title: z.string(),
142
+ body: z.string(),
143
+ authorName: z.string(),
144
+ headBranch: z.string(),
145
+ baseBranch: z.string(),
146
+ url: z.string().nullable(),
147
+ createdAt: z.number().int(),
148
+ updatedAt: z.number().int(),
149
+ mergedAt: z.number().int().nullable(),
150
+ closedAt: z.number().int().nullable()
151
+ });
152
+ export type GitPullRequest = z.infer<typeof gitPullRequestSchema>;
153
+
154
+ /** L'état d'un fichier dans un commit, tel que le fournisseur le qualifie. */
155
+ export const gitDiffStatusSchema = z
156
+ .enum(['added', 'modified', 'removed', 'renamed', 'copied', 'changed', 'unchanged'])
157
+ // Un fournisseur d'une autre version peut inventer un état : il dégrade
158
+ // l'affichage, il ne fait pas échouer la lecture d'un commit.
159
+ .catch('modified');
160
+ export type GitDiffStatus = z.infer<typeof gitDiffStatusSchema>;
161
+
162
+ export const gitDiffFileSchema = z.object({
163
+ filename: z.string(),
164
+ /** Ancien chemin d'un fichier renommé, sinon `null`. */
165
+ previousFilename: z.string().nullable(),
166
+ status: gitDiffStatusSchema,
167
+ additions: z.number().int().nonnegative(),
168
+ deletions: z.number().int().nonnegative(),
169
+ /**
170
+ * Le diff unifié du fichier, tel que le fournisseur le rend.
171
+ *
172
+ * `null` pour un binaire, ou quand le fournisseur l'a tronqué parce qu'il
173
+ * était trop gros — deux cas où il n'y a rien à colorer et où il vaut mieux
174
+ * le dire que d'afficher un vide inexpliqué.
175
+ */
176
+ patch: z.string().nullable()
177
+ });
178
+ export type GitDiffFile = z.infer<typeof gitDiffFileSchema>;
179
+
180
+ /**
181
+ * Le détail d'un commit : son diff.
182
+ *
183
+ * **Jamais mis en cache**, à la différence du reste de l'intégration git. Un
184
+ * diff pèse des ordres de grandeur de plus que la ligne qui le résume, on ne le
185
+ * regarde qu'une fois, et le stocker chiffré ferait grossir la base sans
186
+ * contrepartie. C'est donc la seule lecture du module qui interroge le
187
+ * fournisseur au moment où on la demande.
188
+ */
189
+ export const gitCommitDetailSchema = z.object({
190
+ sha: z.string(),
191
+ message: z.string(),
192
+ authorName: z.string(),
193
+ committedAt: z.number().int(),
194
+ url: z.string().nullable(),
195
+ additions: z.number().int().nonnegative(),
196
+ deletions: z.number().int().nonnegative(),
197
+ files: z.array(gitDiffFileSchema),
198
+ /** `true` quand le fournisseur a écrêté la liste (au-delà de 300 fichiers). */
199
+ truncated: z.boolean()
200
+ });
201
+ export type GitCommitDetail = z.infer<typeof gitCommitDetailSchema>;
202
+
203
+ /**
204
+ * L'avancement d'une synchronisation en cours.
205
+ *
206
+ * Volontairement compté **en étapes** et non en objets : on ignore combien de
207
+ * commits le distant va rendre avant de les avoir lus. Une barre qui progresse
208
+ * par étapes nommées dit la vérité ; une barre calée sur un total deviné
209
+ * mentirait.
210
+ */
211
+ /**
212
+ * L'avancement d'un dépôt dans la liste : le même, plus son identité.
213
+ *
214
+ * Rendu pour **tous** les dépôts en cours d'un coup, de sorte que la liste
215
+ * puisse afficher une bande de progression par carte sans interroger chaque
216
+ * dépôt séparément.
217
+ */
218
+ export const gitRepoSyncStateSchema = z.object({
219
+ repoId: z.number().int().positive(),
220
+ phase: z.string(),
221
+ step: z.number().int().nonnegative(),
222
+ stepCount: z.number().int().positive()
223
+ });
224
+ export type GitRepoSyncState = z.infer<typeof gitRepoSyncStateSchema>;
225
+
226
+ export const gitSyncStatusSchema = z.object({
227
+ running: z.boolean(),
228
+ /** Libellé de l'étape en cours, ou `null` hors synchronisation. */
229
+ phase: z.string().nullable(),
230
+ /** Étapes achevées, et total connu d'avance. */
231
+ step: z.number().int().nonnegative(),
232
+ stepCount: z.number().int().positive(),
233
+ startedAt: z.number().int().nullable()
234
+ });
235
+ export type GitSyncStatus = z.infer<typeof gitSyncStatusSchema>;
236
+
237
+ export const gitCommitSchema = z.object({
238
+ id: z.number().int().positive(),
239
+ sha: z.string(),
240
+ message: z.string(),
241
+ authorName: z.string(),
242
+ authorRef: z.string(),
243
+ /** Membre de l'espace rattaché à cet auteur git, s'il l'a été. */
244
+ authorUserId: z.number().int().positive().nullable(),
245
+ url: z.string().nullable(),
246
+ committedAt: z.number().int(),
247
+ /** Plus d'un parent = une fusion. */
248
+ parentCount: z.number().int().nonnegative()
249
+ });
250
+ export type GitCommit = z.infer<typeof gitCommitSchema>;
251
+
252
+ /**
253
+ * Un auteur git repéré dans l'historique, et son rattachement éventuel.
254
+ *
255
+ * `color` est la couleur retenue pour le graphe : celle du membre quand il est
256
+ * rattaché, sinon une teinte déterministe dérivée de `authorRef` — de sorte
257
+ * qu'un même contributeur garde la même couleur d'une session à l'autre, même
258
+ * sans compte DevEye.
259
+ */
260
+ export const gitCommitAuthorSchema = z.object({
261
+ authorRef: z.string(),
262
+ name: z.string(),
263
+ email: z.string(),
264
+ userId: z.number().int().positive().nullable(),
265
+ color: userColorSchema,
266
+ commitCount: z.number().int().nonnegative()
267
+ });
268
+ export type GitCommitAuthor = z.infer<typeof gitCommitAuthorSchema>;
269
+
270
+ /** Longueur des sha abrégés du graphe (voir `gitCommitPointsSchema`). */
271
+ export const GIT_GRAPH_SHA_LEN = 12;
272
+
273
+ /**
274
+ * Les points du graphe, en **colonnes parallèles** et non en tableau d'objets.
275
+ *
276
+ * Volontairement dépouillé — pas de message ici. Le graphe en affiche des
277
+ * dizaines de milliers ; les faire voyager avec leur texte chiffré coûterait
278
+ * autant de déchiffrements pour un rendu qui ne montre qu'un point.
279
+ *
280
+ * La forme colonnaire n'est pas de la coquetterie : à 20 000 commits, un tableau
281
+ * d'objets `{ sha, committedAt, authorRef }` pèse ~2 Mo de JSON (les accolades,
282
+ * les noms de champs et les guillemets répétés dominent la charge utile) et
283
+ * oblige le client à allouer 20 000 objets. Trois colonnes tombent à ~450 Ko et
284
+ * se parcourent sans allocation — c'est ce qui rend le dessin fluide.
285
+ *
286
+ * - `shas` : les sha abrégés **concaténés**, `GIT_GRAPH_SHA_LEN` caractères
287
+ * chacun. Découpés à la demande, jamais tous d'un coup. Abrégés parce que le
288
+ * graphe n'en fait que deux usages — l'info-bulle, qui en montre sept, et
289
+ * l'ouverture d'un commit, que le fournisseur accepte abrégée.
290
+ * - `authorIndex` : un indice dans le tableau `authors` de la réponse, plutôt
291
+ * que l'empreinte de 16 caractères répétée à chaque point.
292
+ */
293
+ export const gitCommitPointsSchema = z.object({
294
+ /** Nombre de points transportés — la longueur commune des trois colonnes. */
295
+ count: z.number().int().nonnegative(),
296
+ shas: z.string(),
297
+ committedAt: z.array(z.number().int()),
298
+ authorIndex: z.array(z.number().int().nonnegative())
299
+ });
300
+ export type GitCommitPoints = z.infer<typeof gitCommitPointsSchema>;
301
+
302
+ /**
303
+ * Le curseur de pagination des commits.
304
+ *
305
+ * Le couple `(committedAt, id)` et non `id` seul, parce que c'est **exactement**
306
+ * la clé de tri de la liste. Les identifiants suivent l'ordre d'insertion, qui
307
+ * est celui où le fournisseur a rendu les commits — pas leur ordre
308
+ * chronologique. Paginer sur `id` alors qu'on trie par date sautait donc des
309
+ * commits et en répétait d'autres, et la seconde page était souvent presque
310
+ * vide : c'est ce qui donnait l'impression qu'on ne pouvait charger qu'une fois.
311
+ */
312
+ export const gitCommitCursorSchema = z.object({
313
+ committedAt: z.number().int(),
314
+ id: z.number().int().positive()
315
+ });
316
+ export type GitCommitCursor = z.infer<typeof gitCommitCursorSchema>;
317
+
318
+ export const gitReleaseSchema = z.object({
319
+ id: z.number().int().positive(),
320
+ tag: z.string(),
321
+ name: z.string(),
322
+ body: z.string(),
323
+ url: z.string().nullable(),
324
+ publishedAt: z.number().int(),
325
+ isPrerelease: z.boolean()
326
+ });
327
+ export type GitRelease = z.infer<typeof gitReleaseSchema>;
328
+
329
+ /** Ligne SQL (serveur uniquement). */
330
+ export interface GitRepoRow {
331
+ id: number;
332
+ workspace_id: number;
333
+ credential_id: number | null;
334
+ provider: string;
335
+ /** Condensé de `owner/repo` en minuscules : porte l'unicité dans l'espace. */
336
+ slug_ref: string;
337
+ enabled: number;
338
+ default_branch: string | null;
339
+ last_sync_at: number | null;
340
+ last_sync_error: string | null;
341
+ sync_state: string | null;
342
+ /** Rang dans la liste, entièrement défini par l'utilisateur (`git.repoReorder`). */
343
+ sort_order: number;
344
+ content: string;
345
+ created: number;
346
+ }
347
+
348
+ /** Ligne SQL (serveur uniquement) : la liaison projet → dépôt. */
349
+ export interface ProjectRepoLinkRow {
350
+ project_id: number;
351
+ workspace_id: number;
352
+ repo_id: number;
353
+ created: number;
354
+ }
355
+
356
+ /** Ligne SQL (serveur uniquement). */
357
+ export interface GitCommitRow {
358
+ id: number;
359
+ repo_id: number;
360
+ workspace_id: number;
361
+ sha: string;
362
+ committed_at: number;
363
+ author_ref: string;
364
+ parents: string | null;
365
+ content: string;
366
+ }
367
+
368
+ /** Ligne SQL (serveur uniquement). */
369
+ export interface GitCommitAuthorRow {
370
+ id: number;
371
+ repo_id: number;
372
+ author_ref: string;
373
+ workspace_id: number;
374
+ user_id: number | null;
375
+ content: string;
376
+ created: number;
377
+ }
378
+
379
+ /** Ligne SQL (serveur uniquement). */
380
+ export interface GitBranchRow {
381
+ id: number;
382
+ repo_id: number;
383
+ workspace_id: number;
384
+ name_ref: string;
385
+ head_sha: string | null;
386
+ ahead_count: number | null;
387
+ behind_count: number | null;
388
+ /** `base..tête` au moment du calcul : dit si les compteurs valent encore. */
389
+ compared_sha: string | null;
390
+ is_default: number;
391
+ updated_at: number | null;
392
+ content: string;
393
+ }
394
+
395
+ /** Ligne SQL (serveur uniquement). */
396
+ export interface GitPullRequestRow {
397
+ id: number;
398
+ repo_id: number;
399
+ workspace_id: number;
400
+ number: number;
401
+ state: string;
402
+ author_ref: string | null;
403
+ created_at: number;
404
+ updated_at: number;
405
+ merged_at: number | null;
406
+ closed_at: number | null;
407
+ content: string;
408
+ }
409
+
410
+ /** Ligne SQL (serveur uniquement). */
411
+ export interface GitReleaseRow {
412
+ id: number;
413
+ repo_id: number;
414
+ workspace_id: number;
415
+ tag_ref: string;
416
+ published_at: number;
417
+ is_prerelease: number;
418
+ content: string;
419
+ }