@digipair/skill-temporal 0.113.1 → 0.114.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.
Files changed (44) hide show
  1. package/README.md +11 -0
  2. package/dist/src/index.d.ts +2 -0
  3. package/dist/src/index.d.ts.map +1 -0
  4. package/{src → dist/src}/index.js +1 -1
  5. package/dist/src/index.js.map +1 -0
  6. package/{src → dist/src}/lib/activities.d.ts +1 -1
  7. package/dist/src/lib/activities.d.ts.map +1 -0
  8. package/dist/src/lib/activities.js +8 -0
  9. package/dist/src/lib/activities.js.map +1 -0
  10. package/{src → dist/src}/lib/shared.d.ts +1 -1
  11. package/dist/src/lib/shared.d.ts.map +1 -0
  12. package/dist/src/lib/shared.js.map +1 -0
  13. package/{src → dist/src}/lib/skill-temporal.d.ts +1 -1
  14. package/dist/src/lib/skill-temporal.d.ts.map +1 -0
  15. package/dist/src/lib/skill-temporal.js +102 -0
  16. package/dist/src/lib/skill-temporal.js.map +1 -0
  17. package/{src → dist/src}/lib/workflows.d.ts +2 -1
  18. package/dist/src/lib/workflows.d.ts.map +1 -0
  19. package/dist/src/lib/workflows.js +123 -0
  20. package/dist/src/lib/workflows.js.map +1 -0
  21. package/package.json +58 -10
  22. package/src/digipair-engine.d.ts +23 -0
  23. package/src/handlebars.d.ts +1 -0
  24. package/src/index.ts +1 -0
  25. package/src/lib/activities.ts +11 -0
  26. package/src/lib/shared.ts +11 -0
  27. package/src/lib/skill-temporal.spec.ts +7 -0
  28. package/src/lib/skill-temporal.ts +126 -0
  29. package/src/lib/workflows.ts +153 -0
  30. package/src/schema.fr.json +443 -0
  31. package/src/schema.json +443 -0
  32. package/src/index.d.ts +0 -1
  33. package/src/index.js.map +0 -1
  34. package/src/lib/activities.js +0 -12
  35. package/src/lib/activities.js.map +0 -1
  36. package/src/lib/shared.js.map +0 -1
  37. package/src/lib/skill-temporal.js +0 -115
  38. package/src/lib/skill-temporal.js.map +0 -1
  39. package/src/lib/workflows.js +0 -121
  40. package/src/lib/workflows.js.map +0 -1
  41. /package/{index.d.ts → dist/index.d.ts} +0 -0
  42. /package/{schema.fr.json → dist/schema.fr.json} +0 -0
  43. /package/{schema.json → dist/schema.json} +0 -0
  44. /package/{src → dist/src}/lib/shared.js +0 -0
@@ -0,0 +1,153 @@
1
+ import { sleep, proxyActivities, condition, setHandler, defineSignal } from '@temporalio/workflow';
2
+ import { ApplicationFailure } from '@temporalio/common';
3
+ import { PinsSettings, preparePinsSettings } from '@digipair/engine';
4
+ import * as feelin from 'feelin';
5
+
6
+ import type * as activities from './activities.js';
7
+ import { WorkflowArgs } from './shared.js';
8
+
9
+ const { evaluate } = feelin as any;
10
+ export const dataSignal = defineSignal<[any]>('data');
11
+
12
+ async function executePins(
13
+ executePinsList: any,
14
+ steps: PinsSettings[],
15
+ state: { step: number },
16
+ settingsOrigin: PinsSettings,
17
+ context: any,
18
+ ) {
19
+ const settings = await preparePinsSettings(settingsOrigin, context);
20
+ let result = null;
21
+
22
+ if (settings.conditions?.each) {
23
+ const results = [] as any[];
24
+
25
+ for (let index = 0; index < settings.conditions.each.length; index++) {
26
+ const item = settings.conditions.each[index];
27
+ const itemSettingsOrigin = {
28
+ ...settingsOrigin,
29
+ conditions: { ...settingsOrigin.conditions, each: undefined },
30
+ };
31
+ const itemContext = {
32
+ ...context,
33
+ item,
34
+ index,
35
+ parent: { item: context.item, index: item.index, parent: context.parent },
36
+ };
37
+ const itemSettings = await preparePinsSettings(itemSettingsOrigin, itemContext);
38
+
39
+ if (typeof itemSettings.conditions?.if !== 'undefined' && !itemSettings.conditions.if) {
40
+ continue;
41
+ }
42
+
43
+ let itemResult = null;
44
+ try {
45
+ itemResult = await executePins(
46
+ executePinsList,
47
+ steps,
48
+ state,
49
+ itemSettingsOrigin,
50
+ itemContext,
51
+ );
52
+ } catch (error) {
53
+ if (error === 'DIGIPAIR_CONDITIONS_IF_FALSE') {
54
+ continue;
55
+ }
56
+
57
+ throw error;
58
+ }
59
+
60
+ results.push(itemResult);
61
+ }
62
+
63
+ return results;
64
+ }
65
+
66
+ if (typeof settings.conditions?.if !== 'undefined' && !settings.conditions.if) {
67
+ throw 'DIGIPAIR_CONDITIONS_IF_FALSE';
68
+ }
69
+
70
+ if (settings.element === 'sleep') {
71
+ result = await sleep((settings.properties as any)['duration']);
72
+ } else if (settings.element === 'condition') {
73
+ result = await condition(
74
+ () => evaluate(settings.properties.condition, context),
75
+ settings.properties.timeout,
76
+ );
77
+ } else if (settings.element === 'stop') {
78
+ throw 'DIGIPAIR_WORKFLOW_STOP';
79
+ } else if (settings.element === 'goto') {
80
+ const step = steps
81
+ .filter(current => !!current.properties?.['name'])
82
+ .findIndex(
83
+ current => (current.properties as any)['name'] === (settings.properties as any)['name'],
84
+ );
85
+
86
+ if (step <= -1) {
87
+ throw new ApplicationFailure('[SKILL-TEMPORAL] GOTO FAILED - STEP NOT FOUND', null, null, [
88
+ (settings.properties as any)['name'],
89
+ ]);
90
+ }
91
+ result = state.step = step;
92
+ } else if (settings.element === 'activity') {
93
+ try {
94
+ result = await executePinsList({
95
+ pinsSettingsList: (settings.properties as any)['execute'],
96
+ context,
97
+ });
98
+ } catch (error) {
99
+ throw new ApplicationFailure('[SKILL-TEMPORAL] EXECUTEPINS FAILED', null, null, [
100
+ error,
101
+ settings,
102
+ context,
103
+ ]);
104
+ }
105
+ }
106
+
107
+ return result;
108
+ }
109
+
110
+ export async function workflow({ steps, context, data, options }: WorkflowArgs): Promise<any> {
111
+ let result: any;
112
+
113
+ context.workflow = { steps: {}, data };
114
+ context.protected = {};
115
+
116
+ const { executePinsList } = proxyActivities<typeof activities>(options);
117
+ setHandler(dataSignal, (data: any) => {
118
+ context.workflow.data = { ...context.workflow.data, ...data };
119
+ });
120
+
121
+ // vérifie si tous les pinsSettings sont bien de la librairie @digipair/skill-temporal
122
+ const indexSkillNoWorkflow = steps.findIndex(
123
+ pinsSettings => pinsSettings.library !== '@digipair/skill-temporal',
124
+ );
125
+ if (indexSkillNoWorkflow >= 0) {
126
+ throw new ApplicationFailure('[SKILL-TEMPORAL] UNKNOWN STEP', null, null, [
127
+ steps[indexSkillNoWorkflow],
128
+ ]);
129
+ }
130
+
131
+ // parcourir tous les pins
132
+ for (let state = { step: 0 }; state.step < steps.length; state.step++) {
133
+ const pinsSettings = steps[state.step];
134
+
135
+ try {
136
+ result = await executePins(executePinsList, steps, state, pinsSettings, context);
137
+ } catch (error) {
138
+ if (error === 'DIGIPAIR_CONDITIONS_IF_FALSE') {
139
+ continue;
140
+ } else if (error === 'DIGIPAIR_WORKFLOW_STOP') {
141
+ return result;
142
+ }
143
+
144
+ throw error;
145
+ }
146
+
147
+ if (pinsSettings.properties?.['name']) {
148
+ context.workflow.steps[pinsSettings.properties['name']] = result;
149
+ }
150
+ }
151
+
152
+ return result;
153
+ }
@@ -0,0 +1,443 @@
1
+ {
2
+ "openapi": "3.0.0",
3
+ "info": {
4
+ "title": "@digipair/skill-temporal",
5
+ "summary": "Gestion des workflows temporal",
6
+ "description": "gérer des workflows temporal",
7
+ "version": "0.1.0",
8
+ "x-icon": "👩‍💻"
9
+ },
10
+ "paths": {
11
+ "/activity": {
12
+ "post": {
13
+ "tags": [
14
+ "service"
15
+ ],
16
+ "summary": "Activitée",
17
+ "description": "Définit une activité",
18
+ "parameters": [
19
+ {
20
+ "name": "name",
21
+ "summary": "Nom",
22
+ "required": false,
23
+ "description": "Nom de l'étape",
24
+ "schema": {
25
+ "type": "string"
26
+ }
27
+ },
28
+ {
29
+ "name": "execute",
30
+ "summary": "Exécute",
31
+ "required": true,
32
+ "description": "Liste des actions à exécuter",
33
+ "schema": {
34
+ "type": "array",
35
+ "items": {
36
+ "$ref": "https://schemas.digipair.ai/pinsSettings"
37
+ }
38
+ }
39
+ }
40
+ ],
41
+ "x-events": [],
42
+ "responses": {
43
+ "200": {
44
+ "description": "Résultat de l'exécution de l'activité",
45
+ "content": {
46
+ "application/json": {
47
+ "schema": {
48
+ "type": "string",
49
+ "description": "Résultat de l'exécution de l'activité"
50
+ }
51
+ }
52
+ }
53
+ }
54
+ }
55
+ }
56
+ },
57
+ "/sleep": {
58
+ "post": {
59
+ "tags": [
60
+ "service"
61
+ ],
62
+ "summary": "Attente",
63
+ "parameters": [
64
+ {
65
+ "name": "name",
66
+ "summary": "Nom",
67
+ "required": false,
68
+ "description": "Nom de l'étape",
69
+ "schema": {
70
+ "type": "string"
71
+ }
72
+ },
73
+ {
74
+ "name": "duration",
75
+ "summary": "Durée",
76
+ "required": true,
77
+ "description": "Durée de l'attente",
78
+ "schema": {
79
+ "type": "string"
80
+ }
81
+ }
82
+ ],
83
+ "x-events": [],
84
+ "responses": {
85
+ "200": {
86
+ "description": "Confirmation de la durée d'attente",
87
+ "content": {
88
+ "application/json": {
89
+ "schema": {
90
+ "type": "string",
91
+ "description": "Confirmation que la durée d'attente a été appliquée"
92
+ }
93
+ }
94
+ }
95
+ }
96
+ }
97
+ }
98
+ },
99
+ "/condition": {
100
+ "post": {
101
+ "tags": [
102
+ "service"
103
+ ],
104
+ "summary": "Condition d'attente",
105
+ "description": "Condition d'attente dans un workflow",
106
+ "parameters": [
107
+ {
108
+ "name": "condition",
109
+ "summary": "Condition",
110
+ "required": true,
111
+ "description": "Condition d'attente au format Feel",
112
+ "schema": {
113
+ "type": "string"
114
+ }
115
+ },
116
+ {
117
+ "name": "timeout",
118
+ "summary": "Timeout",
119
+ "required": false,
120
+ "description": "Timeout de la condition",
121
+ "schema": {
122
+ "type": "number"
123
+ }
124
+ }
125
+ ],
126
+ "x-events": [],
127
+ "responses": {
128
+ "200": {
129
+ "description": "Résultat de la condition d'attente",
130
+ "content": {
131
+ "application/json": {
132
+ "schema": {
133
+ "type": "boolean",
134
+ "description": "Si la condition a été remplie avant le timeout"
135
+ }
136
+ }
137
+ }
138
+ }
139
+ }
140
+ }
141
+ },
142
+ "/goto": {
143
+ "post": {
144
+ "tags": [
145
+ "service"
146
+ ],
147
+ "summary": "Aller à l'étape",
148
+ "parameters": [
149
+ {
150
+ "name": "target",
151
+ "summary": "Nom de la destination",
152
+ "required": true,
153
+ "description": "Nom de l'étape de destination",
154
+ "schema": {
155
+ "type": "string"
156
+ }
157
+ },
158
+ {
159
+ "name": "name",
160
+ "summary": "Nom",
161
+ "required": false,
162
+ "description": "Nom de l'étape",
163
+ "schema": {
164
+ "type": "string"
165
+ }
166
+ }
167
+ ],
168
+ "x-events": [],
169
+ "responses": {
170
+ "200": {
171
+ "description": "Numéro d'étape après goto",
172
+ "content": {
173
+ "application/json": {
174
+ "schema": {
175
+ "type": "number",
176
+ "description": "Numéro de l'étape cible dans le workflow"
177
+ }
178
+ }
179
+ }
180
+ }
181
+ }
182
+ }
183
+ },
184
+ "/stop": {
185
+ "post": {
186
+ "tags": [
187
+ "service"
188
+ ],
189
+ "summary": "Arrête le workflow",
190
+ "description": "Arrête le workflow",
191
+ "parameters": [
192
+ {
193
+ "name": "name",
194
+ "summary": "Nom",
195
+ "required": false,
196
+ "description": "Nom de l'étape",
197
+ "schema": {
198
+ "type": "string"
199
+ }
200
+ }
201
+ ],
202
+ "x-events": [],
203
+ "responses": {
204
+ "200": {
205
+ "description": "Confirmation de l'arrêt du workflow",
206
+ "content": {
207
+ "application/json": {
208
+ "schema": {
209
+ "type": "null",
210
+ "description": "Le workflow a été arrêté"
211
+ }
212
+ }
213
+ }
214
+ }
215
+ }
216
+ }
217
+ },
218
+ "/push": {
219
+ "post": {
220
+ "tags": [
221
+ "service"
222
+ ],
223
+ "summary": "Envoi de nouvelles données dans un workflow",
224
+ "description": "Envoi de nouvelles données dans le workflow",
225
+ "parameters": [
226
+ {
227
+ "name": "id",
228
+ "summary": "Identifiant du workflow",
229
+ "required": true,
230
+ "description": "Identifiant du workflow",
231
+ "schema": {
232
+ "type": "string"
233
+ }
234
+ },
235
+ {
236
+ "name": "data",
237
+ "summary": "Données",
238
+ "required": true,
239
+ "description": "Données",
240
+ "schema": {
241
+ "type": "object"
242
+ }
243
+ }
244
+ ],
245
+ "x-events": [],
246
+ "responses": {
247
+ "200": {
248
+ "description": "Confirmation de l'envoi des données",
249
+ "content": {
250
+ "application/json": {
251
+ "schema": {
252
+ "type": "null",
253
+ "description": "Les données ont été envoyées avec succès au workflow"
254
+ }
255
+ }
256
+ }
257
+ }
258
+ }
259
+ }
260
+ },
261
+ "/terminate": {
262
+ "post": {
263
+ "tags": [
264
+ "service"
265
+ ],
266
+ "summary": "Arrête un workflow",
267
+ "description": "Arrête un workflow",
268
+ "parameters": [
269
+ {
270
+ "name": "id",
271
+ "summary": "Identifiant du workflow",
272
+ "required": true,
273
+ "description": "Identifiant du workflow",
274
+ "schema": {
275
+ "type": "string"
276
+ }
277
+ }
278
+ ],
279
+ "x-events": [],
280
+ "responses": {
281
+ "200": {
282
+ "description": "Confirmation de l'arrêt du workflow",
283
+ "content": {
284
+ "application/json": {
285
+ "schema": {
286
+ "type": "null",
287
+ "description": "Le workflow a été arrêté avec succès"
288
+ }
289
+ }
290
+ }
291
+ }
292
+ }
293
+ }
294
+ },
295
+ "/list": {
296
+ "post": {
297
+ "tags": [
298
+ "service"
299
+ ],
300
+ "summary": "Liste les workflows",
301
+ "description": "Liste les workflows",
302
+ "parameters": [
303
+ {
304
+ "name": "query",
305
+ "summary": "Requête",
306
+ "required": false,
307
+ "description": "Requête de recherche",
308
+ "schema": {
309
+ "type": "string"
310
+ }
311
+ }
312
+ ],
313
+ "x-events": [],
314
+ "responses": {
315
+ "200": {
316
+ "description": "Liste des workflows",
317
+ "content": {
318
+ "application/json": {
319
+ "schema": {
320
+ "type": "array",
321
+ "items": {
322
+ "$ref": "#/components/schemas/WorkflowExecutionInfo"
323
+ }
324
+ }
325
+ }
326
+ }
327
+ }
328
+ }
329
+ }
330
+ }
331
+ },
332
+ "components": {
333
+ "schemas": {
334
+ "WorkflowExecutionInfo": {
335
+ "tags": [],
336
+ "type": "object",
337
+ "description": "Informations sur une exécution de workflow Temporal",
338
+ "properties": {
339
+ "workflowId": {
340
+ "type": "string",
341
+ "description": "Identifiant unique du workflow"
342
+ },
343
+ "runId": {
344
+ "type": "string",
345
+ "description": "Identifiant unique de l'exécution du workflow"
346
+ },
347
+ "type": {
348
+ "type": "object",
349
+ "properties": {
350
+ "name": {
351
+ "type": "string",
352
+ "description": "Nom du type de workflow"
353
+ }
354
+ }
355
+ },
356
+ "status": {
357
+ "type": "string",
358
+ "enum": [
359
+ "Running",
360
+ "Completed",
361
+ "Failed",
362
+ "Cancelled",
363
+ "Terminated"
364
+ ],
365
+ "description": "Statut actuel du workflow"
366
+ },
367
+ "startTime": {
368
+ "type": "string",
369
+ "format": "date-time",
370
+ "description": "Quand le workflow a été démarré"
371
+ },
372
+ "taskQueue": {
373
+ "type": "string",
374
+ "description": "Nom de la file d'attente des tâches utilisée par le workflow"
375
+ }
376
+ }
377
+ }
378
+ }
379
+ },
380
+ "x-scene-blocks": {
381
+ "/workflow": {
382
+ "summary": "Workflow Temporal",
383
+ "description": "Execute un workflow Temporal",
384
+ "tags": [
385
+ "service"
386
+ ],
387
+ "metadata": [],
388
+ "parameters": [
389
+ {
390
+ "name": "id",
391
+ "summary": "Identifiant",
392
+ "required": true,
393
+ "description": "Identifiant du workflow",
394
+ "schema": {
395
+ "type": "string"
396
+ }
397
+ },
398
+ {
399
+ "name": "steps",
400
+ "summary": "Exécute les étapes suivantes",
401
+ "required": true,
402
+ "description": "Exécute les étapes définies",
403
+ "schema": {
404
+ "type": "array",
405
+ "items": {
406
+ "$ref": "https://schemas.digipair.ai/pinsSettings"
407
+ }
408
+ }
409
+ },
410
+ {
411
+ "name": "data",
412
+ "summary": "Données du workflow",
413
+ "required": false,
414
+ "description": "Données du workflow temporal",
415
+ "schema": {
416
+ "type": "object"
417
+ }
418
+ },
419
+ {
420
+ "name": "options",
421
+ "summary": "Options temporal",
422
+ "required": false,
423
+ "description": "Options du workflow temporal",
424
+ "schema": {
425
+ "type": "object"
426
+ }
427
+ }
428
+ ],
429
+ "responses": {
430
+ "200": {
431
+ "description": "Résultat de l'exécution du workflow",
432
+ "content": {
433
+ "application/json": {
434
+ "schema": {
435
+ "description": "Le résultat de la dernière étape exécutée dans le workflow"
436
+ }
437
+ }
438
+ }
439
+ }
440
+ }
441
+ }
442
+ }
443
+ }