@esfaenza/flow-builder 20.0.0 → 20.3.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/index.d.ts CHANGED
@@ -34,7 +34,11 @@ interface FlowValue {
34
34
  stringValue?: string;
35
35
  integerValue?: number;
36
36
  numberValue?: number;
37
- /** Formato roundtrip senza fuso: `2026-08-15T00:00:00` (§2, §4.2). */
37
+ /**
38
+ * `2026-08-15T09:00:00Z` sono le 9 UTC, `2026-08-15T09:00:00` le 9 nel fuso
39
+ * dell'applicazione: sono **due istanti diversi**, e il motore converte prima di
40
+ * confrontare. Scrivere il fuso quando lo si conosce e' una scelta, non un dettaglio (§4.2).
41
+ */
38
42
  dateValue?: string;
39
43
  booleanValue?: boolean;
40
44
  enumValue?: string;
@@ -364,6 +368,67 @@ interface FlowUnsupportedNode extends FlowNodeBase {
364
368
  connector?: FlowConnector;
365
369
  [key: string]: unknown;
366
370
  }
371
+ /**
372
+ * §5.13 — i tre tipi di step. `stepMuleSoft` non esiste in questo sistema
373
+ * (`ELEMENT_NOT_SUPPORTED`); l'elenco autoritativo e' il dizionario `stageStepTypes`.
374
+ */
375
+ type FlowStageStepActionType = 'stepBackground' | 'stepInteractive' | 'stepApproval' | string;
376
+ /** A chi e' assegnato uno step interattivo. `assigneeTypes` e' il dizionario (§6.4). */
377
+ interface FlowStageStepAssignee {
378
+ assigneeType?: string;
379
+ assignee?: FlowValue;
380
+ }
381
+ /** Il nome di un *evaluation flow* che decide una condizione di ingresso o di uscita. */
382
+ type FlowStageStepConditionActionType = 'EvaluationFlow' | string;
383
+ /**
384
+ * §5.13 — uno step di uno stage.
385
+ *
386
+ * Due cose che non si vedono dal tipo:
387
+ * - gli step **non hanno un ordine di esecuzione**: parte quello le cui `entryConditions`
388
+ * sono vere, e l'ordine nell'array e' solo l'ordine d'esame;
389
+ * - `name` sta nello **stesso spazio dei nomi** di node e risorse (§3.3), e l'output di uno
390
+ * step e' sempre referenziabile come `<NomeStep>.<NomeOutput>`.
391
+ *
392
+ * I campi riservati (`runAsUser`, ignorato dal runtime, `canAssigneeEdit`, `shouldLock`,
393
+ * `requiresAsyncProcessing`) non sono modellati di proposito: non vanno esposti. Sopravvivono
394
+ * comunque al round-trip, perche' il documento viaggia come JSON.
395
+ */
396
+ interface FlowStageStep {
397
+ name?: string;
398
+ label?: string;
399
+ description?: string;
400
+ actionType?: FlowStageStepActionType;
401
+ /** Obbligatorio su `stepBackground`: il flow che il motore esegue subito. */
402
+ actionName?: string;
403
+ /** Obbligatori su `stepInteractive` e `stepApproval`. */
404
+ assignees?: FlowStageStepAssignee[];
405
+ /** `"0"` o `"1"`: il modello lo porta come stringa. */
406
+ requiresMultiMemberApproval?: string;
407
+ /** *Se* lo step si applica: se non si avverano, viene saltato (§5.13). */
408
+ entryConditions?: FlowCondition[];
409
+ /** *Quando* lo step libera lo stage: se restano false, lo stage va in stallo (§5.13). */
410
+ exitConditions?: FlowCondition[];
411
+ /** Evaluation flow che decide l'ingresso: deve restituire `isOrchestrationConditionMet`. */
412
+ entryActionName?: string;
413
+ entryActionType?: FlowStageStepConditionActionType;
414
+ exitActionName?: string;
415
+ exitActionType?: FlowStageStepConditionActionType;
416
+ inputParameters?: FlowInputParameter[];
417
+ /** `assignToReference` e' facoltativo: l'output e' già referenziabile (§5.13). */
418
+ outputParameters?: FlowOutputParameter[];
419
+ /** `true` → usa `outputConfigParams` come output finti, senza eseguire lo step. */
420
+ debugSimulateStep?: boolean;
421
+ outputConfigParams?: FlowInputParameter[];
422
+ }
423
+ interface FlowOrchestratedStage extends FlowNodeBase {
424
+ stageSteps?: FlowStageStep[];
425
+ connector?: FlowConnector;
426
+ /**
427
+ * **Non** e' un ramo di guasto: e' il ramo percorso quando uno step viene rifiutato.
428
+ * Senza, un rifiuto fa fallire l'interview (§5.13).
429
+ */
430
+ faultConnector?: FlowConnector;
431
+ }
367
432
  interface FlowSchedule {
368
433
  frequency?: 'Once' | 'Daily' | 'Weekly' | 'Monthly' | string;
369
434
  /** Data senza fuso: `2026-08-01T00:00:00`. */
@@ -438,10 +503,10 @@ interface FlowDefinition {
438
503
  transforms?: FlowTransform[];
439
504
  waits?: FlowWait[];
440
505
  customErrors?: FlowCustomError[];
506
+ orchestratedStages?: FlowOrchestratedStage[];
441
507
  /** Non supportati: conservati nel round-trip ma non creabili dalla palette. */
442
508
  steps?: FlowUnsupportedNode[];
443
509
  experiments?: FlowUnsupportedNode[];
444
- orchestratedStages?: FlowUnsupportedNode[];
445
510
  apiVersion?: string;
446
511
  timeZoneSidKey?: string;
447
512
  triggerOrder?: number;
@@ -449,13 +514,13 @@ interface FlowDefinition {
449
514
  customProperties?: FlowCustomProperty[];
450
515
  }
451
516
  /** Le collection di node: `metadataProperty` del dizionario `elementTypes` (§3.2). */
452
- declare const FLOW_NODE_COLLECTIONS: readonly ["screens", "assignments", "decisions", "loops", "collectionProcessors", "recordLookups", "recordCreates", "recordUpdates", "recordDeletes", "recordRollbacks", "actionCalls", "scriptPluginCalls", "subflows", "transforms", "waits", "customErrors", "steps", "experiments", "orchestratedStages"];
517
+ declare const FLOW_NODE_COLLECTIONS: readonly ["screens", "assignments", "decisions", "loops", "collectionProcessors", "recordLookups", "recordCreates", "recordUpdates", "recordDeletes", "recordRollbacks", "actionCalls", "scriptPluginCalls", "subflows", "transforms", "waits", "customErrors", "orchestratedStages", "steps", "experiments"];
453
518
  type FlowNodeCollection = (typeof FLOW_NODE_COLLECTIONS)[number];
454
519
  /** Le collection di risorse (§4.6). Condividono lo spazio dei nomi con i node (§3.3). */
455
520
  declare const FLOW_RESOURCE_COLLECTIONS: readonly ["variables", "constants", "formulas", "textTemplates", "choices", "dynamicChoiceSets", "stages"];
456
521
  type FlowResourceCollection = (typeof FLOW_RESOURCE_COLLECTIONS)[number];
457
522
  /** Il discriminatore `value` del dizionario `elementTypes`. */
458
- type FlowElementType = 'Screen' | 'Assignment' | 'Decision' | 'Loop' | 'CollectionProcessor' | 'CustomError' | 'Wait' | 'RecordLookup' | 'RecordCreate' | 'RecordUpdate' | 'RecordDelete' | 'RecordRollback' | 'ActionCall' | 'ScriptCall' | 'Subflow' | 'Transform' | 'Step' | 'Experiment' | 'OrchestratedStage' | string;
523
+ type FlowElementType = 'Screen' | 'Assignment' | 'Decision' | 'Loop' | 'CollectionProcessor' | 'CustomError' | 'Wait' | 'RecordLookup' | 'RecordCreate' | 'RecordUpdate' | 'RecordDelete' | 'RecordRollback' | 'ActionCall' | 'ScriptCall' | 'Subflow' | 'Transform' | 'OrchestratedStage' | 'Step' | 'Experiment' | string;
459
524
  /** Un node qualunque, come lo vede il canvas. */
460
525
  type FlowAnyNode = FlowNodeBase & Record<string, unknown>;
461
526
 
@@ -508,17 +573,37 @@ interface FlowAssignmentOperatorEntry extends FlowDictionaryEntry {
508
573
  /** Ha senso solo su destinazioni collection; altrove e' un avviso. */
509
574
  expectsCollection?: boolean;
510
575
  }
511
- /** §4.1 — variabile globale proponibile invece di farla digitare. */
576
+ /**
577
+ * §4.1 — variabile globale proponibile invece di farla digitare.
578
+ *
579
+ * La verificabilita' e' **per scope**: se `paths` porta almeno una voce, un percorso che non
580
+ * c'e' e' `GLOBAL_UNKNOWN`; se `paths` e' vuoto, lo scope resta non verificabile — che
581
+ * significa "non lo so", non "non esiste".
582
+ */
512
583
  interface FlowGlobalVariableEntry extends FlowDictionaryEntry {
513
584
  /** `$Flow`, `$GlobalConstant`, `$Record`, `$User`, … */
514
585
  scope?: string;
515
- /** Percorsi noti dello scope; per gli scope dell'host e' vuoto. */
586
+ /** Percorsi noti dello scope. Vuoto lo scope non e' verificabile (§4.1). */
516
587
  paths?: string[] | null;
517
- /** `true` → il backend non sa quali percorsi esistano e accetta qualunque cosa (§4.1). */
588
+ /** `true` → i percorsi li dichiara il sistema ospite, e solo quelli che dichiara. */
518
589
  isResolvedByHost?: boolean;
519
590
  /** Disponibile solo con un trigger su record (`$Record`, `$Record__Prior`). */
520
591
  requiresRecordTrigger?: boolean;
521
592
  }
593
+ /**
594
+ * §5.13 — i tipi di step di uno stage di orchestrazione (`stageStepTypes`).
595
+ * Le colonne dicono cosa il tipo pretende: senza, l'editor dovrebbe cablare i tre nomi.
596
+ */
597
+ interface FlowStageStepTypeEntry extends FlowDictionaryEntry {
598
+ /** `stepBackground`: il flow eseguito subito e' obbligatorio. */
599
+ requiresActionName?: boolean;
600
+ /** `stepInteractive` / `stepApproval`: gli assegnatari sono obbligatori. */
601
+ requiresAssignees?: boolean;
602
+ /** `true` → l'interview si **sospende** su questo step, in attesa di una persona. */
603
+ suspendsInterview?: boolean;
604
+ /** `true` → il rifiuto e' un esito previsto, e prende il `faultConnector` dello stage. */
605
+ supportsRejection?: boolean;
606
+ }
522
607
  interface FlowResourceKindEntry extends FlowDictionaryEntry {
523
608
  /** Solo le variabili sono scrivibili (§4.6). */
524
609
  isWritable?: boolean;
@@ -526,9 +611,13 @@ interface FlowResourceKindEntry extends FlowDictionaryEntry {
526
611
  metadataProperty?: string;
527
612
  }
528
613
  /**
529
- * §6.4 — tutte le tendine statiche in una risposta.
614
+ * §6.4 — le tendine in una risposta.
530
615
  * I campi sono opzionali: un backend che non popola un dizionario non deve far
531
616
  * crollare l'editor, che degrada mostrando il valore grezzo.
617
+ *
618
+ * Sono **quasi** statici: `globalVariables` dipende dal `processType` con cui si sono
619
+ * chiesti, perche' `$Record` non esiste in uno screen flow (§4.1). Chi lavora su piu' tipi di
620
+ * flow ne tiene una copia per tipo — se ne occupa {@link FlowDictionaryStore}.
532
621
  */
533
622
  interface FlowDictionaries {
534
623
  dataTypes?: FlowDataTypeEntry[];
@@ -549,6 +638,8 @@ interface FlowDictionaries {
549
638
  transformTypes?: FlowDictionaryEntry[];
550
639
  transactionModels?: FlowDictionaryEntry[];
551
640
  waitEventTypes?: FlowDictionaryEntry[];
641
+ stageStepTypes?: FlowStageStepTypeEntry[];
642
+ assigneeTypes?: FlowDictionaryEntry[];
552
643
  conditionLogicModes?: FlowDictionaryEntry[];
553
644
  screenNavigations?: FlowDictionaryEntry[];
554
645
  }
@@ -706,7 +797,11 @@ interface FlowReference {
706
797
  dataType?: FlowDataType | null;
707
798
  isCollection?: boolean;
708
799
  objectType?: string | null;
709
- /** Per i campi di destinazione: solo le variabili sono scrivibili (§4.6). */
800
+ /**
801
+ * Per i campi di destinazione. Scrivibili sono le variabili, `$Flow.CurrentStage`,
802
+ * `$Flow.ActiveStages` e le globali che il sistema ospite dichiara tali: la primitiva
803
+ * `POST /flows/references/writable` le comprende già, non vanno aggiunte lato client (§5.2).
804
+ */
710
805
  isWritable?: boolean;
711
806
  description?: string | null;
712
807
  }
@@ -773,6 +868,22 @@ interface FlowPendingScreen {
773
868
  canFinish?: boolean;
774
869
  canPause?: boolean;
775
870
  }
871
+ /**
872
+ * §5.13 — lo stato che un assegnatario comunica concludendo uno step.
873
+ * `Pending` non e' accettato in scrittura: e' `INVALID_REQUEST`.
874
+ */
875
+ type FlowStageStepStatus = 'Completed' | 'Rejected' | 'Cancelled' | 'Pending' | string;
876
+ /** Lo stato di uno step, come lo riporta l'ispezione di una sospesa (§5.13, §6.5). */
877
+ interface FlowStageStepState {
878
+ stepName?: string;
879
+ label?: string | null;
880
+ actionType?: string;
881
+ status?: FlowStageStepStatus;
882
+ /** `true` → c'e' un work item aperto: e' questo step a tenere sospesa l'interview. */
883
+ isWaiting?: boolean;
884
+ assignees?: string[];
885
+ outputs?: Record<string, FlowTypedValue>;
886
+ }
776
887
  interface FlowTraceEntry {
777
888
  sequence?: number;
778
889
  level?: string;
@@ -796,6 +907,14 @@ interface FlowInterviewResult {
796
907
  trace?: FlowTraceEntry[];
797
908
  /** Con `debug: true`: i valori di **tutte** le risorse, non solo gli output. */
798
909
  resources?: Record<string, FlowTypedValue>;
910
+ /**
911
+ * `Suspended` copre due attese diverse, e questi due flag le distinguono: un evento
912
+ * oppure uno step di orchestrazione (§6.5).
913
+ */
914
+ isWaitingForEvent?: boolean;
915
+ isWaitingForStageStep?: boolean;
916
+ /** Con `isWaitingForStageStep`: lo stato di ogni step dello stage corrente (§5.13). */
917
+ stageSteps?: FlowStageStepState[];
799
918
  isSuccess?: boolean;
800
919
  }
801
920
  interface FlowStartInterviewRequest {
@@ -815,6 +934,19 @@ interface FlowResumeRequest {
815
934
  interviewKey: string;
816
935
  debug?: boolean;
817
936
  }
937
+ /**
938
+ * §5.13 — `POST /interviews/{key}/stage-step`: un assegnatario conclude uno step.
939
+ * Se lo stage si sospende di nuovo, la risposta porta una `interviewKey` **nuova** e la
940
+ * vecchia non e' piu' valida.
941
+ */
942
+ interface FlowStageStepRequest {
943
+ interviewKey: string;
944
+ stepName: string;
945
+ /** `Pending` viene rifiutato come `INVALID_REQUEST`. */
946
+ status: FlowStageStepStatus;
947
+ stepOutputs?: Record<string, unknown>;
948
+ debug?: boolean;
949
+ }
818
950
  interface FlowExportQuery {
819
951
  version?: number;
820
952
  indented?: boolean;
@@ -936,10 +1068,14 @@ declare abstract class FlowBuilderApi {
936
1068
  /** `GET /flows/{name}/versions/{v}/validate` — valida una versione già salvata. */
937
1069
  validateVersion(flowName: string, version: number): Promise<FlowValidationResult>;
938
1070
  /**
939
- * `GET /flows/dictionaries`tutte le tendine statiche in una risposta.
940
- * Statiche: si caricano una volta e si tengono in cache (§6.4, §13.11).
1071
+ * `GET /flows/dictionaries?processType=` — le tendine in una risposta.
1072
+ *
1073
+ * Quasi statiche: si caricano una volta e si tengono in cache (§6.4, §13.11). L'eccezione e'
1074
+ * `globalVariables`, che dipende dal `processType`: `$Record` non esiste in uno screen flow,
1075
+ * e referenziarlo lì e' un errore, non un avviso (§4.1). Chi lavora su piu' tipi di flow
1076
+ * tiene una copia di dizionari per tipo.
941
1077
  */
942
- abstract getDictionaries(): Promise<FlowDictionaries>;
1078
+ abstract getDictionaries(processType?: string): Promise<FlowDictionaries>;
943
1079
  /**
944
1080
  * `POST /flows/references` — i valori proponibili in un campo che accetta una risorsa.
945
1081
  * Include gli **output automatici** degli elementi, che non sono dichiarati in nessuna
@@ -947,9 +1083,11 @@ declare abstract class FlowBuilderApi {
947
1083
  */
948
1084
  abstract getReferences(query: FlowReferenceQuery): Promise<FlowReference[]>;
949
1085
  /**
950
- * `POST /flows/references/writable` — solo le variabili, per i campi di destinazione.
951
- * Ai campi `assignToReference` va aggiunto `$Flow.CurrentStage` / `$Flow.ActiveStages`
952
- * se il flow dichiara stage (§5.2): quello lo fa l'editor, non la primitiva.
1086
+ * `POST /flows/references/writable` — le variabili **piu' le globali assegnabili**, per i
1087
+ * campi di destinazione: `$Flow.CurrentStage`, `$Flow.ActiveStages` e quelle che il sistema
1088
+ * ospite dichiara `isWritable`. La primitiva le comprende già, l'editor non le aggiunge
1089
+ * (§5.2). Restano fuori i campi di `$Record`, che dipendono dallo schema: quelli arrivano da
1090
+ * `listFields(object, 'updateable')` (§6.4).
953
1091
  */
954
1092
  abstract getWritableReferences(query: FlowReferenceQuery): Promise<FlowReference[]>;
955
1093
  /** `POST /flows/connector-targets?excluding=` — i node a cui un arco puo' puntare. */
@@ -1000,7 +1138,16 @@ declare abstract class FlowBuilderApi {
1000
1138
  respondToScreen(request: FlowScreenResponseRequest): Promise<FlowInterviewResult>;
1001
1139
  /** `POST /interviews/resume` — riprende un'esecuzione in pausa. */
1002
1140
  resumeInterview(request: FlowResumeRequest): Promise<FlowInterviewResult>;
1003
- /** `GET /interviews/{key}` — ispeziona una sospesa senza consumarla. */
1141
+ /**
1142
+ * `POST /interviews/{key}/stage-step` — un assegnatario conclude uno step (§5.13).
1143
+ * Se lo stage si sospende di nuovo, la risposta porta una `interviewKey` **nuova**: la
1144
+ * vecchia non e' piu' valida e va sostituita, non conservata.
1145
+ */
1146
+ completeStageStep(request: FlowStageStepRequest): Promise<FlowInterviewResult>;
1147
+ /**
1148
+ * `GET /interviews/{key}` — ispeziona una sospesa senza consumarla.
1149
+ * Con `isWaitingForStageStep` porta `stageSteps` con lo stato di ognuno (§5.13).
1150
+ */
1004
1151
  inspectInterview(interviewKey: string): Promise<FlowInterviewResult>;
1005
1152
  /** `DELETE /interviews/{key}` — abbandona. */
1006
1153
  abandonInterview(interviewKey: string): Promise<void>;
@@ -1053,7 +1200,7 @@ declare class HttpFlowBuilderApi extends FlowBuilderApi {
1053
1200
  deleteFlow(flowName: string): Promise<void>;
1054
1201
  validateDefinition(definition: FlowDefinition): Promise<FlowValidationResult>;
1055
1202
  validateVersion(flowName: string, version: number): Promise<FlowValidationResult>;
1056
- getDictionaries(): Promise<FlowDictionaries>;
1203
+ getDictionaries(processType?: string): Promise<FlowDictionaries>;
1057
1204
  getReferences(query: FlowReferenceQuery): Promise<FlowReference[]>;
1058
1205
  getWritableReferences(query: FlowReferenceQuery): Promise<FlowReference[]>;
1059
1206
  getConnectorTargets(definition: FlowDefinition, excluding?: string): Promise<FlowConnectorTarget[]>;
@@ -1075,6 +1222,7 @@ declare class HttpFlowBuilderApi extends FlowBuilderApi {
1075
1222
  startInterview(request: FlowStartInterviewRequest): Promise<FlowInterviewResult>;
1076
1223
  respondToScreen(request: FlowScreenResponseRequest): Promise<FlowInterviewResult>;
1077
1224
  resumeInterview(request: FlowResumeRequest): Promise<FlowInterviewResult>;
1225
+ completeStageStep(request: FlowStageStepRequest): Promise<FlowInterviewResult>;
1078
1226
  inspectInterview(interviewKey: string): Promise<FlowInterviewResult>;
1079
1227
  abandonInterview(interviewKey: string): Promise<void>;
1080
1228
  }
@@ -1131,7 +1279,7 @@ declare const FALLBACK_COLLECTION_BY_TYPE: Record<string, FlowNodeCollection>;
1131
1279
  declare const TYPE_BY_COLLECTION: Record<string, FlowElementType>;
1132
1280
  /** Etichette di fallback, se il dizionario non e' caricato. */
1133
1281
  declare const FALLBACK_TYPE_LABEL: Record<string, string>;
1134
- /** I tre tipi che il motore rifiuta: nascosti dalla palette (§3.2, §13.9). */
1282
+ /** I due tipi che il motore rifiuta: nascosti dalla palette (§3.2, §13.9). */
1135
1283
  declare const UNSUPPORTED_TYPES: ReadonlySet<string>;
1136
1284
  /** Elementi che espongono il proprio risultato sotto il nome dell'elemento (§4.5). */
1137
1285
  declare const TYPES_WITH_AUTOMATIC_OUTPUT: ReadonlySet<string>;
@@ -1231,6 +1379,78 @@ declare function moveCondition(holder: FlowConditionHolder, from: number, to: nu
1231
1379
  */
1232
1380
  declare function checkConditionLogic(logic: string, conditionCount: number): string | null;
1233
1381
 
1382
+ /**
1383
+ * Testo e numero non si confrontano — FRONTEND.md §4.3, §13.13.
1384
+ *
1385
+ * `Importo > "1000"` con `Importo` numerico e' `CONDITION_TYPE_MISMATCH`, un **errore** che
1386
+ * blocca l'attivazione: la conversione implicita renderebbe l'esito dipendente dal formato
1387
+ * del testo, e chi disegna il flow non ha modo di accorgersene.
1388
+ *
1389
+ * Il backend segnala solo quando conosce **entrambi** i tipi, e su un campo di un record o
1390
+ * sull'output automatico di un elemento non li conosce: il posto giusto in cui fermare
1391
+ * l'utente e' il picker, cioe' l'editor delle condizioni. Questo file e' la regola, in un
1392
+ * posto solo.
1393
+ *
1394
+ * Vale per i soli operatori di uguaglianza e ordine. `Contains`, `StartsWith`, `EndsWith`,
1395
+ * `In` e `NotIn` hanno una semantica propria e non sono soggetti alla regola; gli unari non
1396
+ * hanno un secondo operando.
1397
+ */
1398
+
1399
+ /**
1400
+ * `true` → per questo operatore i due lati devono essere compatibili.
1401
+ * `isUnary` arriva dal dizionario: un unario non ha un termine di confronto.
1402
+ */
1403
+ declare function isTypeCheckedOperator(operator: string | undefined | null, isUnary: boolean): boolean;
1404
+ declare function isNumericType(dataType: FlowDataType | undefined | null): boolean;
1405
+ /**
1406
+ * `false` solo per la coppia vietata: testo con numero.
1407
+ *
1408
+ * È l'**unica** coppia vietata. Un `Enum` confrontato con un testo resta lecito, perche' un
1409
+ * enum si confronta anche per nome; e con un tipo ignoto da un lato non si segnala nulla,
1410
+ * perche' non sapere non e' sapere che e' sbagliato.
1411
+ */
1412
+ declare function areTypesComparable(left: FlowDataType | undefined | null, right: FlowDataType | undefined | null): boolean;
1413
+ /**
1414
+ * I numeri viaggiano in **cultura invariante**: il separatore decimale e' il punto, la virgola
1415
+ * non e' accettata (§4.3). Un campo che mostra `1.234,50` deve scrivere `1234.50`.
1416
+ *
1417
+ * Accetta la virgola come separatore decimale digitato — e' quello che un utente italiano
1418
+ * scrive — e la traduce, invece di lasciare che `parseFloat` tronchi silenziosamente a `1`.
1419
+ */
1420
+ declare function parseInvariantNumber(raw: string): number | undefined;
1421
+
1422
+ /**
1423
+ * Gli step di uno stage di orchestrazione — FRONTEND.md §5.13.
1424
+ *
1425
+ * Tre regole del contratto che non si vedono guardando il tipo, e che qui stanno in un posto
1426
+ * solo perche' le usano l'inspector, lo spazio dei nomi del documento e la validazione locale:
1427
+ *
1428
+ * 1. il `name` di uno step vive nello **stesso spazio dei nomi** di node e risorse (§3.3):
1429
+ * uno step omonimo di una variabile e' `NAME_DUPLICATED`;
1430
+ * 2. l'output di uno step e' sempre referenziabile come `<NomeStep>.<NomeOutput>`, ma una
1431
+ * condizione **non** puo' referenziarlo: finche' lo step non ha girato il riferimento e'
1432
+ * irrisolvibile, e a runtime un riferimento irrisolvibile e' un errore;
1433
+ * 3. gli step non sono una sequenza: l'ordine nell'array e' solo l'ordine d'esame.
1434
+ */
1435
+
1436
+ /** I nomi di tutti gli step del documento: entrano nello spazio dei nomi comune (§3.3). */
1437
+ declare function stageStepNames(definition: FlowDefinition): string[];
1438
+ /** Gli step di uno stage, con l'array assente trattato come vuoto. */
1439
+ declare function stepsOf(stage: FlowOrchestratedStage | undefined): FlowStageStep[];
1440
+ /**
1441
+ * Il nome dello step il cui output un riferimento sta leggendo, se e' uno degli step passati.
1442
+ * `undefined` quando il riferimento e' legittimo. Serve a impedire nell'editor la condizione
1443
+ * che referenzia l'output di un altro step (§5.13, punto 4): la strada corretta e' scrivere
1444
+ * quel risultato in una variabile con `outputParameters.assignToReference` e condizionare
1445
+ * su quella.
1446
+ */
1447
+ declare function stageStepOutputReferenced(reference: string | undefined, steps: FlowStageStep[]): string | undefined;
1448
+ /**
1449
+ * L'unico output che il runtime legge da un evaluation flow di condizione. Dichiararne altri
1450
+ * e' `STAGE_ACTION_INVALID` (§5.13, punto 7).
1451
+ */
1452
+ declare const ORCHESTRATION_CONDITION_OUTPUT = "isOrchestrationConditionMet";
1453
+
1234
1454
  /** Un node come lo vede l'editor: il node piu' da dove viene. */
1235
1455
  interface FlowNodeRef {
1236
1456
  name: string;
@@ -1278,9 +1498,10 @@ declare class FlowDocumentStore {
1278
1498
  readonly nodeByName: _angular_core.Signal<Map<string, FlowNodeRef>>;
1279
1499
  readonly resources: _angular_core.Signal<FlowResourceRef[]>;
1280
1500
  /**
1281
- * §3.3 — l'insieme dei nomi già usati: node **e** risorse, un unico spazio di nomi.
1282
- * Il controllo di unicita' che guarda solo le variabili lascia passare una variabile
1283
- * omonima di un node (§13.5).
1501
+ * §3.3 — l'insieme dei nomi già usati: node, risorse **e** step di orchestrazione, un unico
1502
+ * spazio di nomi. Il controllo di unicita' che guarda solo le variabili lascia passare una
1503
+ * variabile omonima di un node (§13.5); quello che dimentica gli step lascia passare uno
1504
+ * step omonimo di una variabile, che e' `NAME_DUPLICATED` allo stesso modo (§5.13).
1284
1505
  */
1285
1506
  readonly usedNames: _angular_core.Signal<string[]>;
1286
1507
  /** Gli archi derivati dal documento, Start incluso. */
@@ -1369,11 +1590,21 @@ declare class FlowDictionaryStore {
1369
1590
  private readonly api;
1370
1591
  private readonly _dictionaries;
1371
1592
  private readonly _isLoaded;
1372
- private loading?;
1593
+ private readonly _processType;
1594
+ /** Una copia per tipo di flow: le globali dipendono dal `processType` (§4.1, §6.4). */
1595
+ private readonly cache;
1596
+ /** Cresce a ogni `load`: scarta la risposta di un caricamento superato. */
1597
+ private sequence;
1373
1598
  readonly dictionaries: _angular_core.Signal<FlowDictionaries>;
1374
1599
  readonly isLoaded: _angular_core.Signal<boolean>;
1375
- /** Idempotente: chiamabile da ogni componente che ne ha bisogno. */
1376
- load(): Promise<void>;
1600
+ /** Il `processType` dei dizionari attualmente in uso. */
1601
+ readonly processType: _angular_core.Signal<string | undefined>;
1602
+ /**
1603
+ * Idempotente: chiamabile da ogni componente che ne ha bisogno.
1604
+ * Con un `processType` diverso da quello in uso ricarica — dalla cache se c'e' già —
1605
+ * perche' cambiare tipo di flow cambia quali globali sono proponibili.
1606
+ */
1607
+ load(processType?: string): Promise<void>;
1377
1608
  readonly dataTypes: _angular_core.Signal<FlowDataTypeEntry[]>;
1378
1609
  readonly comparisonOperators: _angular_core.Signal<FlowComparisonOperatorEntry[]>;
1379
1610
  readonly assignmentOperators: _angular_core.Signal<_esfaenza_flow_builder.FlowAssignmentOperatorEntry[]>;
@@ -1390,6 +1621,8 @@ declare class FlowDictionaryStore {
1390
1621
  readonly transformTypes: _angular_core.Signal<FlowDictionaryEntry[]>;
1391
1622
  readonly transactionModels: _angular_core.Signal<FlowDictionaryEntry[]>;
1392
1623
  readonly waitEventTypes: _angular_core.Signal<FlowDictionaryEntry[]>;
1624
+ readonly stageStepTypes: _angular_core.Signal<FlowStageStepTypeEntry[]>;
1625
+ readonly assigneeTypes: _angular_core.Signal<FlowDictionaryEntry[]>;
1393
1626
  readonly conditionLogicModes: _angular_core.Signal<FlowDictionaryEntry[]>;
1394
1627
  readonly elementTypes: _angular_core.Signal<FlowElementTypeEntry[]>;
1395
1628
  /**
@@ -1423,6 +1656,22 @@ declare class FlowDictionaryStore {
1423
1656
  * Operatori applicabili al tipo del lato sinistro: `appliesTo` vuoto = qualunque tipo (§4.3).
1424
1657
  */
1425
1658
  operatorsFor(dataType: FlowDataType | undefined): FlowComparisonOperatorEntry[];
1659
+ /** La voce di `globalVariables` di uno scope: `$User`, `$Flow`, … (§4.1). */
1660
+ globalScope(scope: string | undefined | null): FlowGlobalVariableEntry | undefined;
1661
+ /**
1662
+ * §4.1 — la verificabilita' e' **per scope**: se lo scope dichiara almeno un percorso, uno
1663
+ * che non c'e' e' `GLOBAL_UNKNOWN`; se non ne dichiara nessuno, resta non verificabile, che
1664
+ * significa "non lo so", non "non esiste".
1665
+ */
1666
+ isGlobalScopeVerifiable(scope: string | undefined | null): boolean;
1667
+ /** I percorsi noti di uno scope, già prefissati: `$User.Email`. */
1668
+ globalPathsOf(scope: string | undefined | null): string[];
1669
+ /** §5.13 — la voce di `stageStepTypes` di un `actionType`. */
1670
+ stageStepType(value: string | undefined | null): FlowStageStepTypeEntry | undefined;
1671
+ /** `stepBackground` vuole `actionName`; il fallback serve se il dizionario non lo dichiara. */
1672
+ stageStepRequiresActionName(actionType: string | undefined | null): boolean;
1673
+ /** `stepInteractive` e `stepApproval` vogliono gli assegnatari (§5.13). */
1674
+ stageStepRequiresAssignees(actionType: string | undefined | null): boolean;
1426
1675
  dataType(value: string | undefined | null): FlowDataTypeEntry | undefined;
1427
1676
  /** §4.6 — `Object` ed `Enum` richiedono `objectType`. */
1428
1677
  requiresObjectType(dataType: string | undefined | null): boolean;
@@ -1868,6 +2117,12 @@ declare class ElementPaletteComponent {
1868
2117
  incompatibleHint(entry: FlowElementTypeEntry): string | null;
1869
2118
  /** Lo stesso glifo che l'elemento avra' sul canvas, così il trascinamento e' prevedibile. */
1870
2119
  iconOf(entry: FlowElementTypeEntry): string;
2120
+ /**
2121
+ * L'etichetta del ramo di fault, presa dalla mappa delle uscite invece di scrivere «ramo di
2122
+ * errore» per tutti: su uno stage di orchestrazione quel ramo **non** e' un guasto, e' lo step
2123
+ * rifiutato (§5.13). Un tipo nuovo eredita l'etichetta giusta senza toccare la palette.
2124
+ */
2125
+ faultLabel(entry: FlowElementTypeEntry): string | null;
1871
2126
  categoryClass(category: string): string;
1872
2127
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ElementPaletteComponent, never>;
1873
2128
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<ElementPaletteComponent, "fb-element-palette", never, { "processType": { "alias": "processType"; "required": false; "isSignal": true; }; }, { "elementPicked": "elementPicked"; }, never, never, true, never>;
@@ -1890,11 +2145,6 @@ declare class ReferencePickerComponent {
1890
2145
  * formula e' `TARGET_NOT_WRITABLE` (§4.6).
1891
2146
  */
1892
2147
  readonly writableOnly: _angular_core.InputSignal<boolean>;
1893
- /**
1894
- * `true` → aggiunge `$Flow.CurrentStage` e `$Flow.ActiveStages` alle destinazioni.
1895
- * Sono le sole variabili globali scrivibili, e solo se il flow dichiara stage (§5.2).
1896
- */
1897
- readonly allowStageTargets: _angular_core.InputSignal<boolean>;
1898
2148
  /**
1899
2149
  * `true` → a sinistra ci va il nome di un **node**, non di una risorsa: e' il caso di
1900
2150
  * `WasVisited` e `HasError` (§4.3).
@@ -1907,8 +2157,6 @@ declare class ReferencePickerComponent {
1907
2157
  readonly isOpen: _angular_core.WritableSignal<boolean>;
1908
2158
  readonly query: _angular_core.WritableSignal<string>;
1909
2159
  constructor();
1910
- /** Le due globali di stage, aggiunte alle destinazioni quando il flow dichiara stage. */
1911
- private readonly stageTargets;
1912
2160
  readonly options: _angular_core.Signal<FlowReference[]>;
1913
2161
  /** Le opzioni raggruppate per `kind`, così gli output automatici si distinguono. */
1914
2162
  readonly groups: _angular_core.Signal<{
@@ -1923,8 +2171,10 @@ declare class ReferencePickerComponent {
1923
2171
  * - `navigated`: la radice e' nota ma c'e' un percorso dopo il punto (campo di record,
1924
2172
  * output automatico navigato): la validazione non verifica i percorsi con il punto,
1925
2173
  * quindi si accetta senza segnalare;
1926
- * - `host`: scope dell'host, non verificabile per costruzione (§4.1);
1927
- * - `unknown`: nessuna corrispondenza: si avvisa, senza bloccare.
2174
+ * - `host`: scope del sistema ospite che **non dichiara percorsi**: non verificabile (§4.1);
2175
+ * - `unknown`: nessuna corrispondenza: si avvisa, senza bloccare. Ci finisce anche il
2176
+ * percorso inesistente di uno scope che i percorsi li dichiara, perche' lì il backend
2177
+ * risponderebbe `GLOBAL_UNKNOWN`.
1928
2178
  */
1929
2179
  readonly valueState: _angular_core.Signal<"empty" | "known" | "navigated" | "host" | "unknown">;
1930
2180
  readonly hint: _angular_core.Signal<string | null>;
@@ -1939,7 +2189,7 @@ declare class ReferencePickerComponent {
1939
2189
  clear(): void;
1940
2190
  describe(reference: FlowReference): string;
1941
2191
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ReferencePickerComponent, never>;
1942
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ReferencePickerComponent, "fb-reference-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "dataType": { "alias": "dataType"; "required": false; "isSignal": true; }; "isCollection": { "alias": "isCollection"; "required": false; "isSignal": true; }; "objectType": { "alias": "objectType"; "required": false; "isSignal": true; }; "writableOnly": { "alias": "writableOnly"; "required": false; "isSignal": true; }; "allowStageTargets": { "alias": "allowStageTargets"; "required": false; "isSignal": true; }; "elementsOnly": { "alias": "elementsOnly"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
2192
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ReferencePickerComponent, "fb-reference-picker", never, { "value": { "alias": "value"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "dataType": { "alias": "dataType"; "required": false; "isSignal": true; }; "isCollection": { "alias": "isCollection"; "required": false; "isSignal": true; }; "objectType": { "alias": "objectType"; "required": false; "isSignal": true; }; "writableOnly": { "alias": "writableOnly"; "required": false; "isSignal": true; }; "elementsOnly": { "alias": "elementsOnly"; "required": false; "isSignal": true; }; }, { "valueChange": "valueChange"; }, never, never, true, never>;
1943
2193
  }
1944
2194
 
1945
2195
  /** Le modalita' offerte: una per campo del modello. */
@@ -1975,12 +2225,24 @@ declare class ValueEditorComponent {
1975
2225
  readonly literalInputType: _angular_core.Signal<string>;
1976
2226
  readonly literalText: _angular_core.Signal<string>;
1977
2227
  readonly booleanValue: _angular_core.Signal<boolean>;
2228
+ /** Il fuso dichiarato nel valore data: `Z`, un offset, oppure niente = ora locale (§4.2). */
2229
+ readonly dateIsUtc: _angular_core.Signal<boolean>;
2230
+ private static readonly ZONE_PATTERN;
2231
+ private static hasZone;
2232
+ private static stripZone;
1978
2233
  readonly globalConstants: _angular_core.Signal<string[]>;
1979
- readonly numericScaleHint: _angular_core.Signal<"Usa Number per importi e quantita’: Integer troncherebbe i decimali." | null>;
2234
+ readonly numericHint: _angular_core.Signal<string | null>;
1980
2235
  setMode(mode: ValueMode): void;
1981
2236
  onReferenceChange(reference: string | undefined): void;
1982
2237
  onLiteralChange(raw: string): void;
1983
2238
  onBooleanChange(checked: boolean): void;
2239
+ private withDateZone;
2240
+ /**
2241
+ * Cambia il fuso **dichiarato**, non l'istante: `09:00Z` e `09:00` sono le nove in due fusi
2242
+ * diversi, e l'editor non converte al posto dell'utente. Riscrivere lo stesso orario con
2243
+ * l'altro fuso e' esattamente cio' che serve quando il valore e' stato inserito sbagliato.
2244
+ */
2245
+ setDateZone(utc: boolean): void;
1984
2246
  onFormulaChange(expression: string): void;
1985
2247
  onFormulaTypeChange(dataType: string): void;
1986
2248
  onGlobalConstantChange(value: string): void;
@@ -1994,23 +2256,55 @@ declare class ValueEditorComponent {
1994
2256
 
1995
2257
  declare class ConditionEditorComponent {
1996
2258
  private readonly dictionaries;
2259
+ private readonly api;
2260
+ private readonly store;
1997
2261
  /** Il contenitore: porta `conditions`, `conditionLogic` e, se serve, `formula`. */
1998
2262
  readonly holder: _angular_core.InputSignal<FlowConditionHolder>;
1999
2263
  readonly title: _angular_core.InputSignal<string>;
2000
2264
  /** `false` dove il modello non prevede la modalita' formula sull'elemento. */
2001
2265
  readonly allowFormula: _angular_core.InputSignal<boolean>;
2266
+ /**
2267
+ * `false` dove il modello porta **solo** la lista di condizioni, senza un campo per la
2268
+ * logica: gli `entryConditions` / `exitConditions` di uno step di orchestrazione (§5.13).
2269
+ * Mostrare i pulsanti della logica lì scriverebbe un campo che il contratto non prevede.
2270
+ */
2271
+ readonly allowLogic: _angular_core.InputSignal<boolean>;
2002
2272
  /** Path per ancorare i rilievi di validazione, es. `rules[Approvato]`. */
2003
2273
  readonly issuePath: _angular_core.InputSignal<string>;
2004
2274
  /** Emesso a ogni modifica: il chiamante applica la mutazione allo store. */
2005
2275
  readonly changed: _angular_core.OutputEmitterRef<(holder: FlowConditionHolder) => void>;
2006
2276
  readonly conditions: _angular_core.Signal<FlowCondition[]>;
2277
+ /**
2278
+ * I riferimenti del documento, per conoscere il tipo del lato sinistro. Non e' un doppione
2279
+ * del picker: serve **il tipo**, che e' l'unica cosa che permette di impedire il confronto
2280
+ * fra testo e numero prima che lo dica la validazione (§4.3).
2281
+ */
2282
+ private readonly references;
2283
+ constructor();
2284
+ /** Il tipo di un riferimento, `undefined` se navigato o ignoto: lì non si segnala (§4.3). */
2285
+ private typeOfReference;
2286
+ /** Il tipo del lato sinistro: guida il secondo operando. */
2287
+ leftDataType(condition: FlowCondition): FlowDataType | undefined;
2288
+ /** Il tipo del lato destro, dedotto dal campo valorizzato o dal riferimento scelto. */
2289
+ private rightDataType;
2290
+ /**
2291
+ * `true` quando i due lati sono incompatibili: e' `CONDITION_TYPE_MISMATCH`, un errore che
2292
+ * blocca l'attivazione. L'unica coppia vietata e' testo con numero (§4.3).
2293
+ */
2294
+ hasTypeMismatch(condition: FlowCondition): boolean;
2295
+ typeMismatchMessage(condition: FlowCondition): string;
2007
2296
  readonly logicMode: _angular_core.Signal<"and" | "or" | "formula" | "custom">;
2008
2297
  readonly customLogic: _angular_core.Signal<string>;
2009
2298
  /** Feedback immediato sull'espressione: la verita' resta della validazione backend. */
2010
2299
  readonly customLogicError: _angular_core.Signal<string | null>;
2011
2300
  /** Con `Formula` il campo `conditions` viene **ignorato** dal motore (§4.3). */
2012
2301
  readonly conditionsIgnored: _angular_core.Signal<boolean>;
2013
- readonly operators: _angular_core.Signal<_esfaenza_flow_builder.FlowComparisonOperatorEntry[]>;
2302
+ /**
2303
+ * Gli operatori applicabili al tipo del lato sinistro: `appliesTo` del dizionario, vuoto =
2304
+ * qualunque tipo (§4.3). L'operatore già scritto si tiene comunque nell'elenco, altrimenti
2305
+ * il `select` resterebbe vuoto pur avendo un valore.
2306
+ */
2307
+ operatorsFor(condition: FlowCondition): ReturnType<FlowDictionaryStore['operatorsFor']>;
2014
2308
  isUnary(condition: FlowCondition): boolean;
2015
2309
  appliesToElements(condition: FlowCondition): boolean;
2016
2310
  /** L'esito atteso di un operatore unario: assente equivale a `true` (§4.3). */
@@ -2022,8 +2316,13 @@ declare class ConditionEditorComponent {
2022
2316
  unarySummary(condition: FlowCondition): string;
2023
2317
  operatorLabel(operator: string | undefined): string;
2024
2318
  operatorDescription(operator: string | undefined): string | null;
2025
- /** `None` consente di salvare una condizione incompleta: a runtime vale sempre falso. */
2319
+ /**
2320
+ * `None` e' uno stato dell'editor, non un operatore: la **bozza si salva, l'attivazione no**
2321
+ * (`CONDITION_INCOMPLETE`, errore). A runtime vale sempre falso (§4.3, §13.14).
2322
+ */
2026
2323
  isPlaceholderOperator(condition: FlowCondition): boolean;
2324
+ /** Quante condizioni sono da completare: si dice in testa, non solo riga per riga. */
2325
+ readonly incompleteCount: _angular_core.Signal<number>;
2027
2326
  addCondition(): void;
2028
2327
  removeCondition(index: number): void;
2029
2328
  moveCondition(index: number, direction: -1 | 1): void;
@@ -2035,7 +2334,7 @@ declare class ConditionEditorComponent {
2035
2334
  setRightValue(index: number, value: FlowValue | undefined): void;
2036
2335
  setUnaryExpectation(index: number, expectation: boolean): void;
2037
2336
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<ConditionEditorComponent, never>;
2038
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConditionEditorComponent, "fb-condition-editor", never, { "holder": { "alias": "holder"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "allowFormula": { "alias": "allowFormula"; "required": false; "isSignal": true; }; "issuePath": { "alias": "issuePath"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, never, never, true, never>;
2337
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<ConditionEditorComponent, "fb-condition-editor", never, { "holder": { "alias": "holder"; "required": true; "isSignal": true; }; "title": { "alias": "title"; "required": false; "isSignal": true; }; "allowFormula": { "alias": "allowFormula"; "required": false; "isSignal": true; }; "allowLogic": { "alias": "allowLogic"; "required": false; "isSignal": true; }; "issuePath": { "alias": "issuePath"; "required": false; "isSignal": true; }; }, { "changed": "changed"; }, never, never, true, never>;
2039
2338
  }
2040
2339
 
2041
2340
  /** Il contenitore dei filtri, qualunque elemento sia. */
@@ -2343,6 +2642,98 @@ declare class StartInspectorComponent {
2343
2642
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<StartInspectorComponent, "fb-start-inspector", never, {}, {}, never, never, true, never>;
2344
2643
  }
2345
2644
 
2645
+ /** I due contenitori di condizioni di uno step, come li vuole l'editor condiviso. */
2646
+ interface StepConditionHolders {
2647
+ entry: FlowConditionHolder;
2648
+ exit: FlowConditionHolder;
2649
+ }
2650
+ declare class OrchestratedStageInspectorComponent extends NodeInspectorBase {
2651
+ private readonly api;
2652
+ readonly elementType: FlowElementType;
2653
+ readonly stage: _angular_core.Signal<FlowOrchestratedStage>;
2654
+ readonly steps: _angular_core.Signal<FlowStageStep[]>;
2655
+ /** I tre tipi di step: `stageStepTypes` e' l'elenco autoritativo (§6.4). */
2656
+ readonly stepTypes: _angular_core.Signal<_esfaenza_flow_builder.FlowStageStepTypeEntry[]>;
2657
+ readonly assigneeTypes: _angular_core.Signal<_esfaenza_flow_builder.FlowDictionaryEntry[]>;
2658
+ /** L'output che il runtime legge da un evaluation flow di condizione. */
2659
+ readonly conditionOutputName = "isOrchestrationConditionMet";
2660
+ /**
2661
+ * I flow proponibili come step in background o come evaluation flow. Una lista vuota
2662
+ * significa "non lo so": in quel caso il campo resta scrivibile a mano (§5.9, §7).
2663
+ */
2664
+ private readonly flowCandidates;
2665
+ constructor();
2666
+ readonly candidates: _angular_core.Signal<FlowSummary[]>;
2667
+ /** L'id del `datalist`: dipende dall'elemento, per non collidere con un altro stage. */
2668
+ readonly flowListId: _angular_core.Signal<string>;
2669
+ /**
2670
+ * I contenitori di condizioni, uno per step, calcolati **una volta** per documento: costruirli
2671
+ * nel template creerebbe un oggetto nuovo a ogni ciclo di change detection.
2672
+ */
2673
+ readonly conditionHolders: _angular_core.Signal<StepConditionHolders[]>;
2674
+ requiresActionName(step: FlowStageStep): boolean;
2675
+ requiresAssignees(step: FlowStageStep): boolean;
2676
+ /** Il rifiuto e' un esito previsto solo per l'approvazione: e' lì che serve il ramo. */
2677
+ supportsRejection(step: FlowStageStep): boolean;
2678
+ stepTypeDescription(step: FlowStageStep): string | null;
2679
+ /** Un `actionType` che il dizionario non conosce: sarebbe `STAGE_STEP_TYPE_UNKNOWN`. */
2680
+ isUnknownStepType(step: FlowStageStep): boolean;
2681
+ /**
2682
+ * Il nome dello step: stessa regola dei node, sullo spazio dei nomi comune (§3.3).
2683
+ * L'unicita' si conta sulle occorrenze in `usedNames`, che gli step li comprende già: una
2684
+ * sola occorrenza e' questo step, due sono un omonimo.
2685
+ */
2686
+ stepNameError(step: FlowStageStep): string | null;
2687
+ /**
2688
+ * Il nome dello step il cui output una condizione sta leggendo: e' irrisolvibile finche'
2689
+ * quello step non ha girato (§5.13, punto 4). `undefined` quando va tutto bene.
2690
+ */
2691
+ stepOutputInConditions(step: FlowStageStep): string | undefined;
2692
+ /** Lo step tiene un output senza destinazione: e' lecito, ma vale la pena dirlo. */
2693
+ hasSimulatedOutputs(step: FlowStageStep): boolean;
2694
+ addStep(): void;
2695
+ removeStep(index: number): void;
2696
+ /** Sposta lo step nell'ordine d'**esame**: non e' un ordine di esecuzione (§5.13). */
2697
+ moveStep(index: number, direction: -1 | 1): void;
2698
+ private patchStep;
2699
+ setStepLabel(index: number, label: string): void;
2700
+ setStepName(index: number, name: string): void;
2701
+ setStepDescription(index: number, description: string): void;
2702
+ /**
2703
+ * Cambiare tipo cambia cosa lo step pretende: gli assegnatari non hanno senso su uno step in
2704
+ * background, e `actionName` non ne ha su uno assegnato. I campi che il nuovo tipo non
2705
+ * prevede si rimuovono, invece di restare nel documento a dire una cosa che non vale piu'.
2706
+ */
2707
+ setStepType(index: number, actionType: string): void;
2708
+ setStepActionName(index: number, actionName: string): void;
2709
+ setMultiMemberApproval(index: number, required: boolean): void;
2710
+ isMultiMemberApproval(step: FlowStageStep): boolean;
2711
+ setSimulateStep(index: number, simulate: boolean): void;
2712
+ assigneesOf(step: FlowStageStep): FlowStageStepAssignee[];
2713
+ addAssignee(index: number): void;
2714
+ removeAssignee(stepIndex: number, assigneeIndex: number): void;
2715
+ setAssigneeType(stepIndex: number, assigneeIndex: number, assigneeType: string): void;
2716
+ setAssigneeValue(stepIndex: number, assigneeIndex: number, value: FlowValue | undefined): void;
2717
+ /** Assegnatario senza tipo o senza valore: e' `STAGE_STEP_ASSIGNEE_INVALID`. */
2718
+ isAssigneeIncomplete(assignee: FlowStageStepAssignee): boolean;
2719
+ /**
2720
+ * Le condizioni di uno step sono condizioni come le altre (§4.3), ma il modello porta solo
2721
+ * la lista: `conditionLogic` e `formula` non esistono e non vanno scritti.
2722
+ */
2723
+ onEntryConditionsChanged(index: number, mutate: (holder: FlowConditionHolder) => void): void;
2724
+ onExitConditionsChanged(index: number, mutate: (holder: FlowConditionHolder) => void): void;
2725
+ private applyConditions;
2726
+ setEntryActionName(index: number, actionName: string): void;
2727
+ setExitActionName(index: number, actionName: string): void;
2728
+ onParametersChanged(index: number, mutate: (holder: ParameterHolder) => void): void;
2729
+ /** Il ramo del rifiuto e' disegnato: senza, un rifiuto fa fallire l'interview (§5.13). */
2730
+ readonly hasRejectionBranch: _angular_core.Signal<boolean>;
2731
+ /** C'e' almeno uno step il cui rifiuto e' un esito previsto. */
2732
+ readonly hasApprovalStep: _angular_core.Signal<boolean>;
2733
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<OrchestratedStageInspectorComponent, never>;
2734
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<OrchestratedStageInspectorComponent, "fb-orchestrated-stage-inspector", never, {}, {}, never, never, true, never>;
2735
+ }
2736
+
2346
2737
  interface ResourceKindDescriptor {
2347
2738
  collection: FlowResourceCollection;
2348
2739
  label: string;
@@ -2471,6 +2862,13 @@ declare class DebugPanelComponent {
2471
2862
  readonly status: _angular_core.Signal<string | null>;
2472
2863
  readonly pendingScreen: _angular_core.Signal<_esfaenza_flow_builder.FlowPendingScreen | null>;
2473
2864
  readonly isWaitingForScreen: _angular_core.Signal<boolean>;
2865
+ /** §5.13 — l'attesa e' su uno step assegnato a una persona, non su un evento. */
2866
+ readonly isWaitingForStageStep: _angular_core.Signal<boolean>;
2867
+ readonly stageSteps: _angular_core.Signal<FlowStageStepState[]>;
2868
+ /** Lo step su cui c'e' un work item aperto: e' quello che si puo' concludere. */
2869
+ readonly waitingStageSteps: _angular_core.Signal<FlowStageStepState[]>;
2870
+ /** I valori con cui si conclude uno step, per nome di output. */
2871
+ readonly stepOutputs: _angular_core.WritableSignal<Record<string, string>>;
2474
2872
  readonly trace: _angular_core.Signal<_esfaenza_flow_builder.FlowTraceEntry[]>;
2475
2873
  /** Le risorse come righe ordinate: il tipo dichiarato vince in lettura (§6.5). */
2476
2874
  readonly resourceRows: _angular_core.Signal<{
@@ -2499,6 +2897,14 @@ declare class DebugPanelComponent {
2499
2897
  private coerceInputs;
2500
2898
  start(): Promise<void>;
2501
2899
  respond(navigation: FlowScreenNavigation): Promise<void>;
2900
+ setStepOutput(name: string, value: string): void;
2901
+ /** Gli output dichiarati dallo step, per generare i campi da compilare. */
2902
+ stepOutputNames(stepName: string | undefined): string[];
2903
+ /**
2904
+ * Conclude uno step come farebbe l'assegnatario. `Rejected` non e' un errore: e' l'esito che
2905
+ * prende il ramo «Step rifiutato» dello stage — e se quel ramo non c'e', l'interview fallisce.
2906
+ */
2907
+ completeStep(stepName: string | undefined, status: FlowStageStepStatus): Promise<void>;
2502
2908
  private apply;
2503
2909
  private handleError;
2504
2910
  reset(): void;
@@ -2588,8 +2994,11 @@ declare class FlowBuilderComponent {
2588
2994
  readonly hasScreensInAutoLaunched: _angular_core.Signal<boolean>;
2589
2995
  /** Un flow `Screen` senza screen e' `SCREEN_FLOW_WITHOUT_SCREENS`. */
2590
2996
  readonly hasNoScreensInScreenFlow: _angular_core.Signal<boolean>;
2591
- /** `Orchestration` non e' eseguibile dal motore. */
2592
- readonly isOrchestration: _angular_core.Signal<boolean>;
2997
+ /**
2998
+ * Un flow `Orchestration` senza stage di orchestrazione e' un **avviso**
2999
+ * (`ORCHESTRATION_WITHOUT_STAGES`): il tipo dichiara un'orchestrazione che non c'e' (§3.1).
3000
+ */
3001
+ readonly isOrchestrationWithoutStages: _angular_core.Signal<boolean>;
2593
3002
  /**
2594
3003
  * Click singolo sul canvas: seleziona. Con la dialog il form **non** si apre qui: un click
2595
3004
  * capita anche solo per spostare un node, e una finestra che si apre a ogni click sarebbe
@@ -2662,5 +3071,5 @@ declare class SelectValueDirective implements AfterViewChecked {
2662
3071
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<SelectValueDirective, "select[fbValue]", never, { "fbValue": { "alias": "fbValue"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
2663
3072
  }
2664
3073
 
2665
- export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_ELEMENT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_RESOURCE_COLLECTIONS, FieldAssignmentEditorComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, HttpFlowBuilderApi, NodeInspectorBase, ParameterEditorComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, canvasNodeId, checkConditionLogic, checkFlowName, elementIcon, emptyFlowDefinition, flowNodeWidth, flowNodeWidthClass, isCustomConditionLogic, isGlobalReference, isValidFlowName, moveCondition, outletByKey, outletsOf, parseCanvasNodeId, parseSourceConnectorId, parseTargetConnectorId, referenceRoot, remapConditionLogic, removeCondition, slugifyFlowName, sourceConnectorId, targetConnectorId, uniqueFlowName };
2666
- export type { FieldAssignmentHolder, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormula, FlowGlobalVariableEntry, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowReference, FlowReferenceKind, FlowReferenceQuery, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenNavigation, FlowScreenResponseRequest, FlowScriptPluginCall, FlowSortOption, FlowSortOrder, FlowStage, FlowStart, FlowStartInterviewRequest, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, ParameterHolder, ValueMode };
3074
+ export { ConditionEditorComponent, ConnectorEditorComponent, DebugPanelComponent, ElementDialogComponent, ElementInspectorComponent, ElementPaletteComponent, FALLBACK_COLLECTION_BY_TYPE, FALLBACK_TYPE_LABEL, FLOW_BUILDER_HTTP_CONFIG, FLOW_ELEMENT_ICONS, FLOW_ERROR_FALLBACK_MESSAGE, FLOW_ERROR_HTTP_STATUS, FLOW_NAME_PATTERN, FLOW_NODE_COLLECTIONS, FLOW_NODE_HEIGHT, FLOW_NODE_WIDTH, FLOW_RESOURCE_COLLECTIONS, FieldAssignmentEditorComponent, FlowApiError, FlowBuilderApi, FlowBuilderComponent, FlowCanvasComponent, FlowCatalogStore, FlowDictionaryStore, FlowDocumentStore, FlowEditorSession, FlowLayoutService, FlowValidationStore, HttpFlowBuilderApi, NodeInspectorBase, ORCHESTRATION_CONDITION_OUTPUT, OrchestratedStageInspectorComponent, ParameterEditorComponent, ProblemsPanelComponent, RecordFilterEditorComponent, ReferencePickerComponent, ResourcePanelComponent, START_NODE_NAME, SelectValueDirective, StartInspectorComponent, TYPES_WITH_AUTOMATIC_OUTPUT, TYPE_BY_COLLECTION, UNSUPPORTED_TYPES, ValueEditorComponent, VersionPanelComponent, areTypesComparable, canvasNodeId, checkConditionLogic, checkFlowName, elementIcon, emptyFlowDefinition, flowNodeWidth, flowNodeWidthClass, isCustomConditionLogic, isGlobalReference, isNumericType, isTypeCheckedOperator, isValidFlowName, moveCondition, outletByKey, outletsOf, parseCanvasNodeId, parseInvariantNumber, parseSourceConnectorId, parseTargetConnectorId, referenceRoot, remapConditionLogic, removeCondition, slugifyFlowName, sourceConnectorId, stageStepNames, stageStepOutputReferenced, stepsOf, targetConnectorId, uniqueFlowName };
3075
+ export type { FieldAssignmentHolder, FilterHolder, FlowActionCall, FlowAnyNode, FlowAssignment, FlowAssignmentItem, FlowAssignmentOperator, FlowAssignmentOperatorEntry, FlowBuilderHttpConfig, FlowCanvasEdge, FlowCanvasNode, FlowCatalogEntry, FlowCatalogParameter, FlowChoice, FlowCloneRequest, FlowCollectionProcessor, FlowCollectionProcessorType, FlowComparisonOperator, FlowComparisonOperatorEntry, FlowCondition, FlowConditionHolder, FlowConditionLogic, FlowConflictState, FlowConnectionKind, FlowConnector, FlowConnectorTarget, FlowConstant, FlowCreateRequest, FlowCustomError, FlowCustomErrorMessage, FlowCustomProperty, FlowDataType, FlowDataTypeEntry, FlowDecision, FlowDecisionRule, FlowDefinition, FlowDictionaries, FlowDictionaryEntry, FlowDynamicChoiceSet, FlowEdge, FlowElementType, FlowElementTypeEntry, FlowErrorCategory, FlowExportQuery, FlowFieldDescription, FlowFieldUsage, FlowFieldValue, FlowFormula, FlowGlobalVariableEntry, FlowInputFieldAssignment, FlowInputParameter, FlowInterviewResult, FlowInterviewStatus, FlowIssueSeverity, FlowLayoutDirection, FlowLayoutNodeInput, FlowLayoutOptions, FlowLayoutResult, FlowListQuery, FlowLoop, FlowNameCheck, FlowNameProblem, FlowNewVersionRequest, FlowNodeBase, FlowNodeCollection, FlowNodeRef, FlowObjectDescription, FlowObjectSummary, FlowOffsetUnit, FlowOrchestratedStage, FlowOutlet, FlowOutline, FlowOutlineConnection, FlowOutlineNode, FlowOutputFieldAssignment, FlowOutputParameter, FlowPendingScreen, FlowProcessType, FlowRecordCreate, FlowRecordDelete, FlowRecordFilter, FlowRecordFilterOperator, FlowRecordLookup, FlowRecordRollback, FlowRecordTriggerType, FlowRecordUpdate, FlowReference, FlowReferenceKind, FlowReferenceQuery, FlowResourceCollection, FlowResourceKindEntry, FlowResourceRef, FlowResumeRequest, FlowSaveRequest, FlowSaveResult, FlowSchedule, FlowScheduledPath, FlowScreen, FlowScreenNavigation, FlowScreenResponseRequest, FlowScriptPluginCall, FlowSortOption, FlowSortOrder, FlowStage, FlowStageStep, FlowStageStepActionType, FlowStageStepAssignee, FlowStageStepConditionActionType, FlowStageStepRequest, FlowStageStepState, FlowStageStepStatus, FlowStageStepTypeEntry, FlowStart, FlowStartInterviewRequest, FlowSubflow, FlowSubflowInputAssignment, FlowSubflowOutputAssignment, FlowSummary, FlowTextTemplate, FlowTraceEntry, FlowTransactionModel, FlowTransform, FlowTransformType, FlowTransformValue, FlowTransformValueAction, FlowTriggerType, FlowTypedValue, FlowUnsupportedNode, FlowValidationIssue, FlowValidationResult, FlowValue, FlowVariable, FlowVersionStatus, FlowVersionSummary, FlowWait, FlowWaitEvent, ParameterHolder, ValueMode };