@outbuild-company/schedule-core 1.6.2 → 1.7.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.
package/dist/index.d.ts CHANGED
@@ -134,6 +134,14 @@ interface CoreActivity {
134
134
  recursiveDurationHours: number;
135
135
  isCritical: boolean;
136
136
  freeSlackHours: number | null;
137
+ /**
138
+ * Días de calendario crudos entre start y end (incluye no laborables). Es una
139
+ * columna del grid, así que la posee el core (decisión del owner 2026-08-03):
140
+ * estado derivado que el core mantiene al nacer la actividad y al escribir
141
+ * start/end/type (`internal/state/calendar-duration.ts`), y que por eso fluye
142
+ * solo por vistas, ChangeSets y undo. Milestone → 0; fechas inválidas → null.
143
+ */
144
+ calendarDuration?: number | null;
137
145
  expectedProgress: number | null;
138
146
  expectedProgressBaseline: number | null;
139
147
  status: ActivityStatus | null;
@@ -193,6 +201,8 @@ interface SectorMetadata {
193
201
  updateDurationForPrimaveraEndDate?: boolean;
194
202
  activityCreter?: ActivityCreter;
195
203
  statusCriteria: StatusCriteria;
204
+ /** Declared by the loader input; never derived from the backend payload. */
205
+ ganttId: number | null;
196
206
  }
197
207
  interface EntityChange<T> {
198
208
  id: string;
@@ -204,6 +214,26 @@ interface EntityChange<T> {
204
214
  after: Readonly<T> | null;
205
215
  }
206
216
 
217
+ declare const EDITABLE: {
218
+ readonly TEXT: "text";
219
+ readonly DESCRIPTION: "description";
220
+ readonly DURATION: "duration";
221
+ readonly PROGRESS: "progress";
222
+ readonly COST: "cost";
223
+ readonly USED_COST: "used_cost";
224
+ readonly HH_WORK_TIME: "hhWorkTime";
225
+ readonly START_DATE: "start_date";
226
+ readonly END_DATE: "end_date";
227
+ readonly CONSTRAINT_TYPE: "constraint_type";
228
+ readonly CONSTRAINT_DATE: "constraint_date";
229
+ readonly CALENDAR_ID: "calendar_id";
230
+ readonly CUSTOM_ID: "custom_id";
231
+ readonly SUBCONTRACT_ID: "subcontractId";
232
+ readonly RESPONSABLES: "responsables";
233
+ readonly TAGS: "tags";
234
+ readonly CUSTOM_PREDECESSORS: "custom_predecessors";
235
+ readonly CUSTOM_SUCESSORS: "custom_sucessors";
236
+ };
207
237
  declare const COLUMN: {
208
238
  readonly REAL_WORK: "real_work";
209
239
  readonly REAL_COST: "real_cost";
@@ -245,8 +275,11 @@ declare const COLUMN: {
245
275
  readonly CUSTOM_PREDECESSORS: "custom_predecessors";
246
276
  readonly CUSTOM_SUCESSORS: "custom_sucessors";
247
277
  };
278
+ type EditableColumnName = (typeof EDITABLE)[keyof typeof EDITABLE];
248
279
  type ColumnName = (typeof COLUMN)[keyof typeof COLUMN];
249
280
 
281
+ type PipelineColumnName = Exclude<(typeof EDITABLE)[keyof typeof EDITABLE], typeof COLUMN.CUSTOM_PREDECESSORS | typeof COLUMN.CUSTOM_SUCESSORS>;
282
+
250
283
  declare const CREATION_OVERRIDE_FIELD_LIST: readonly ["name", "description", "type", "startDate", "durationHours", "constraintType", "constraintDate", "calendarId", "assignedDefaultCalendar", "autoScheduling", "progress", "cost", "usedCost", "realCost", "workHours", "realWorkHours", "ponderator", "hasCustomPonderator", "customId", "subcontractId", "responsableIds", "tagIds", "isLookahead"];
251
284
  type CreationOverrideField = (typeof CREATION_OVERRIDE_FIELD_LIST)[number];
252
285
  type CreationOverrides = Partial<Pick<CoreActivity, CreationOverrideField>>;
@@ -256,14 +289,22 @@ type NumberOperator = 'equals' | 'notEquals' | 'greaterThan' | 'lessThan' | 'gre
256
289
  type DateOperator = 'after' | 'before';
257
290
  type MembershipOperator = 'someOf' | 'notSomeOf';
258
291
  type FilterOperator = StringOperator | NumberOperator | DateOperator | MembershipOperator;
259
- type FilterField = 'name' | 'description' | 'customId' | 'correlativeId' | 'uniqueCorrelativeId' | 'progress' | 'durationDays' | 'calendarDuration' | 'cost' | 'usedCost' | 'realCost' | 'workHours' | 'realWorkHours' | 'ponderator' | 'freeSlackDays' | 'totalSlackDays' | 'expectedProgressBaseline' | 'baselineDurationDays' | 'baselineCost' | 'baselineWorkHours' | 'startDate' | 'endDate' | 'constraintDate' | 'baselineStartDate' | 'baselineEndDate' | 'earlyStart' | 'earlyFinish' | 'lateStart' | 'lateFinish' | 'responsableIds' | 'tagIds' | 'status' | 'constraintType' | 'calendarId' | 'subcontractId' | 'isCritical';
292
+ type StringFilterField = 'name' | 'description' | 'customId';
293
+ type NumberFilterField = 'correlativeId' | 'uniqueCorrelativeId' | 'progress' | 'durationDays' | 'calendarDuration' | 'cost' | 'usedCost' | 'realCost' | 'workHours' | 'realWorkHours' | 'ponderator' | 'freeSlackDays' | 'totalSlackDays' | 'expectedProgressBaseline' | 'baselineDurationDays' | 'baselineCost' | 'baselineWorkHours';
294
+ type DateFilterField = 'startDate' | 'endDate' | 'constraintDate' | 'baselineStartDate' | 'baselineEndDate' | 'earlyStart' | 'earlyFinish' | 'lateStart' | 'lateFinish';
295
+ type IdArrayFilterField = 'responsableIds' | 'tagIds';
296
+ type EnumFilterField = 'status' | 'constraintType';
297
+ type ReferenceFilterField = 'calendarId' | 'subcontractId';
298
+ type BooleanFilterField = 'isCritical';
299
+ type FilterField = StringFilterField | NumberFilterField | DateFilterField | IdArrayFilterField | EnumFilterField | ReferenceFilterField | BooleanFilterField;
260
300
  type FilterScalarValue = string | number | Date;
261
- type FilterCriterionValue = FilterScalarValue | ReadonlyArray<string | number>;
262
- interface FilterCriterion {
263
- readonly field: FilterField;
264
- readonly operator: FilterOperator;
265
- readonly value: FilterCriterionValue;
301
+ type FilterCriterionValue = FilterScalarValue | ReadonlyArray<string | number | boolean>;
302
+ interface Criterion<Field extends FilterField, Operator, Value> {
303
+ readonly field: Field;
304
+ readonly operator: Operator;
305
+ readonly value: Value;
266
306
  }
307
+ type FilterCriterion = Criterion<StringFilterField, StringOperator, string> | Criterion<NumberFilterField, NumberOperator, string | number> | Criterion<DateFilterField, DateOperator, string | number | Date> | Criterion<IdArrayFilterField, MembershipOperator, ReadonlyArray<string | number>> | Criterion<EnumFilterField, MembershipOperator, ReadonlyArray<string>> | Criterion<ReferenceFilterField, MembershipOperator, ReadonlyArray<string | number>> | Criterion<BooleanFilterField, MembershipOperator, ReadonlyArray<boolean>>;
267
308
  interface FilterDateRange {
268
309
  readonly start: Date;
269
310
  readonly end: Date;
@@ -318,6 +359,10 @@ type LinksBatchOperation = {
318
359
  kind: 'delete';
319
360
  linkId: LinkId;
320
361
  };
362
+ interface ReconciledActivityProgress {
363
+ readonly activityId: string;
364
+ readonly progress: number;
365
+ }
321
366
  interface PersistedEntityIdentity {
322
367
  readonly id: string;
323
368
  readonly proplannerId: number;
@@ -350,9 +395,28 @@ interface ActivityBatchAction {
350
395
  }
351
396
 
352
397
  type DispatchAction = {
398
+ kind: 'activity-copy';
399
+ eventSource?: string;
400
+ } | {
401
+ kind: 'activity-clipboard-clear';
402
+ eventSource?: string;
403
+ } | {
404
+ kind: 'activity-paste-copied';
405
+ destination: {
406
+ afterSiblingId: ActivityId;
407
+ };
408
+ eventSource?: string;
409
+ } | {
353
410
  kind: 'persistence-acknowledge';
354
411
  activities?: ReadonlyArray<PersistedEntityIdentity>;
355
412
  links?: ReadonlyArray<PersistedEntityIdentity>;
413
+ /**
414
+ * CP19 (ISSUE-070): valores que el backend normalizo al guardar (hoy solo
415
+ * progress). El motor los reconcilia — aplica los que difieren, ignora
416
+ * los iguales — para que el core refleje lo persistido. Sin undo: el
417
+ * acuse es clear-on-success y el tracker snapshotea despues.
418
+ */
419
+ reconciledProgress?: ReadonlyArray<ReconciledActivityProgress>;
356
420
  } | {
357
421
  kind: 'baseline-apply';
358
422
  points: ReadonlyArray<BaselinePoint>;
@@ -365,7 +429,7 @@ type DispatchAction = {
365
429
  } | {
366
430
  kind: 'inline-edit';
367
431
  activityId: ActivityId;
368
- column: string;
432
+ column: EditableColumnName;
369
433
  newValue: unknown;
370
434
  } | {
371
435
  kind: 'dates-batch';
@@ -378,7 +442,7 @@ type DispatchAction = {
378
442
  kind: 'bulk-edit';
379
443
  edits: ReadonlyArray<{
380
444
  activityId: ActivityId;
381
- column: string;
445
+ column: PipelineColumnName;
382
446
  newValue: unknown;
383
447
  }>;
384
448
  eventSource?: string;
@@ -431,6 +495,15 @@ type DispatchAction = {
431
495
  kind: 'activity-set-progress';
432
496
  activityId: ActivityId;
433
497
  newValue: 0 | 100;
498
+ /**
499
+ * CP15 (ISSUE-066): el origen se DECLARA, no se adivina (mismo patron
500
+ * que inputUnit). 'action-button' es el unico origen con salvoconducto
501
+ * de negocio para actividades en Lookahead (espejo del flag
502
+ * progressChangedByActionButton que consume parseToUpdate en el
503
+ * backend; guia agents/progreso-lookahead.md). Sin origen declarado
504
+ * aplica el canEdit completo del pipeline.
505
+ */
506
+ origin?: 'action-button';
434
507
  eventSource?: string;
435
508
  } | {
436
509
  kind: 'selection-toggle';
@@ -462,6 +535,13 @@ type DispatchAction = {
462
535
  activityId: ActivityId;
463
536
  pendingRequests: ReadonlyArray<PendingRequest>;
464
537
  eventSource?: string;
538
+ } | {
539
+ kind: 'sir-approve';
540
+ activityId: ActivityId;
541
+ approvedRequestId: string;
542
+ startDate: unknown;
543
+ endDate: unknown;
544
+ eventSource?: string;
465
545
  } | {
466
546
  kind: 'activity-lookahead-sync';
467
547
  activityIds: ReadonlyArray<ActivityId>;
@@ -469,38 +549,32 @@ type DispatchAction = {
469
549
  hasLookaheadTasks: boolean;
470
550
  acknowledgePersistedLookahead?: boolean;
471
551
  eventSource?: string;
472
- } | {
473
- kind: 'activity-paste';
474
- destination: {
475
- parentId: ActivityId | '0';
476
- index: number;
477
- } | {
478
- afterSiblingId: ActivityId;
479
- };
480
- referenceActivityId: ActivityId;
481
- activities: ReadonlyArray<PastedActivityInput>;
482
- links: ReadonlyArray<PastedLinkInput>;
483
- eventSource?: string;
484
552
  };
485
553
  type InternalDispatchAction = DispatchAction | ActivityBatchAction;
486
- interface PastedActivityInput {
487
- readonly originalId: ActivityId;
488
- readonly originalParentId: ActivityId | '0';
489
- readonly activityId?: ActivityId;
490
- readonly overrides: CreationOverrides;
491
- readonly baselineSnapshot?: ActivityBaselineSnapshot | null;
492
- }
493
- interface PastedLinkInput {
494
- readonly source: ActivityId;
495
- readonly target: ActivityId;
496
- readonly type: LinkType;
497
- readonly lag: number;
498
- readonly linkId?: LinkId;
499
- }
500
554
  interface DispatchOptions {
501
555
  skipAutoSchedule?: boolean;
502
556
  skipCriticalPath?: boolean;
503
557
  inputUnit?: 'days' | 'hours';
558
+ /**
559
+ * Reversible preview mode (SIR). The edit mutates internal state with the
560
+ * exact same scheduling rules as a real edit (calendar, link/autoschedule
561
+ * propagation, parents, derived fields), but leaves no session trace: no
562
+ * save-tracker dirty, no undo entry, no SIR auto-reject effect or
563
+ * pendingRequestIds mutation, and the schedule revision does not move.
564
+ * The result carries `preview` with the exact inverse ChangeSet; exiting
565
+ * the preview is `ScheduleCore.applyPreviewInverse(inverse)`.
566
+ */
567
+ preview?: boolean;
568
+ }
569
+ interface PreviewDispatchInfo {
570
+ /**
571
+ * Exact inverse of `changes`. Note its `after` images were captured while
572
+ * the preview edit was still applied; project the ChangeSet RETURNED by
573
+ * `applyPreviewInverse`, which re-reads them from the restored state.
574
+ */
575
+ inverse: ChangeSet;
576
+ /** `getScheduleRevision()` at the time the preview was computed. */
577
+ revision: number;
504
578
  }
505
579
  type DispatchResult = {
506
580
  ok: true;
@@ -508,6 +582,8 @@ type DispatchResult = {
508
582
  verdicts?: ReadonlyArray<DatesBatchVerdict>;
509
583
  activityVerdicts?: ReadonlyArray<DatesBatchVerdict>;
510
584
  linkVerdicts?: ReadonlyArray<LinkBatchVerdict>;
585
+ /** Present only when dispatched with `DispatchOptions.preview`. */
586
+ preview?: PreviewDispatchInfo;
511
587
  } | {
512
588
  ok: false;
513
589
  reason: string;
@@ -561,14 +637,15 @@ interface ViewStateChange {
561
637
  readonly checked?: ViewStatePropChange;
562
638
  readonly visible?: ViewStatePropChange;
563
639
  }
640
+ type ChangeSetSource = InternalDispatchAction | {
641
+ kind: 'init';
642
+ } | {
643
+ kind: 'undo';
644
+ } | {
645
+ kind: 'redo';
646
+ };
564
647
  interface ChangeSet {
565
- source: InternalDispatchAction | {
566
- kind: 'init';
567
- } | {
568
- kind: 'undo';
569
- } | {
570
- kind: 'redo';
571
- };
648
+ source: ChangeSetSource;
572
649
  activities: ReadonlyArray<EntityChange<CoreActivity>>;
573
650
  links: ReadonlyArray<EntityChange<Link>>;
574
651
  calendars: ReadonlyArray<EntityChange<Calendar>>;
@@ -647,7 +724,6 @@ interface BackendActivityInput {
647
724
  has_childs: boolean;
648
725
  isOnLookahead: boolean;
649
726
  sumOfDurationRecursively: number | null;
650
- freeSlack: number | null;
651
727
  is_critical: boolean;
652
728
  newActivitiesArray: string | (string | number)[] | null;
653
729
  hasNewActivities: boolean | null;
@@ -712,12 +788,18 @@ interface ScheduleCoreReporter {
712
788
  }
713
789
 
714
790
  type ScheduleCoreStatus = 'ready' | 'destroyed' | 'poisoned';
791
+ declare const SCHEDULE_CORE_STATUS: {
792
+ readonly READY: "ready";
793
+ readonly DESTROYED: "destroyed";
794
+ readonly POISONED: "poisoned";
795
+ };
715
796
  interface ScheduleCoreInput extends BackendScheduleInput {
716
797
  skipInitialAutoSchedule?: boolean;
717
798
  baselinePoints?: readonly BaselinePoint[];
718
799
  clock?: () => Date;
719
800
  criticalPathOnLoad?: boolean;
720
801
  statusCriteria?: StatusCriteria;
802
+ ganttId?: number;
721
803
  reporter?: ScheduleCoreReporter;
722
804
  }
723
805
 
@@ -736,12 +818,20 @@ interface DateGesturePreview {
736
818
  } | null;
737
819
  }
738
820
 
821
+ interface EffectiveGraphAudit {
822
+ readonly activityCount: number;
823
+ readonly logicalLinkCount: number;
824
+ readonly effectiveEdgeCount: number;
825
+ readonly circularComponents: ReadonlyArray<ReadonlyArray<string>>;
826
+ readonly largestComponentSize: number;
827
+ }
739
828
  interface UndoOptions {
740
829
  readonly skipCriticalPath?: boolean;
741
830
  readonly expectedUndoDepth?: number;
742
831
  }
743
832
 
744
833
  declare class ScheduleCore {
834
+ private readonly _activityClipboard;
745
835
  private _status;
746
836
  private readonly coreRuntime;
747
837
  private readonly _undo;
@@ -783,9 +873,18 @@ declare class ScheduleCore {
783
873
  getActivityView(id: ActivityId): Readonly<CoreActivity> | null;
784
874
  createDateGesturePreview(gesture: DateGesture): DateGesturePreview;
785
875
  getAllActivitiesView(): ReadonlyArray<Readonly<CoreActivity>>;
876
+ /**
877
+ * Read del plan de indent (ISSUE-080): los padres destino DISTINTOS bajo los
878
+ * que quedarían las actividades si se indentaran ahora. Es exactamente la
879
+ * planificación que ejecuta el handler (`planIndentMoves`, autoridad única),
880
+ * expuesta para que la frontera pueda correr el protocolo de conversión a
881
+ * madre (chequeo backend + modal) ANTES de despachar. Solo lecturas.
882
+ */
883
+ getIndentTargetParentIds(activityIds: ReadonlyArray<ActivityId | string>): readonly string[];
786
884
  getChildrenView(parentId: ActivityId | '0'): ReadonlyArray<Readonly<CoreActivity>>;
787
885
  getLinkView(id: LinkId): Readonly<Link> | null;
788
886
  getAllLinksView(): ReadonlyArray<Readonly<Link>>;
887
+ auditEffectiveGraph(): EffectiveGraphAudit;
789
888
  getProperty<Property extends keyof CoreActivity>(activityId: ActivityId, property: Property): CoreActivity[Property] | null;
790
889
  getAllIds(): readonly string[];
791
890
  forEachActivityId(visit: (id: string) => void): void;
@@ -804,6 +903,26 @@ declare class ScheduleCore {
804
903
  getModifiedLinks(): ReadonlyArray<Readonly<Link>>;
805
904
  getModifiedActivities(): ReadonlyArray<Readonly<CoreActivity>>;
806
905
  hasUnsavedChanges(): boolean;
906
+ /**
907
+ * Read-only view of the internal schedule revision. It moves once per
908
+ * substantive CANONICAL mutation (dispatch, undo, redo). It does NOT move
909
+ * for a preview dispatch nor for `applyPreviewInverse`: comparing the value
910
+ * captured in `PreviewDispatchInfo.revision` against the current one
911
+ * answers "did the schedule change while the preview was open".
912
+ */
913
+ getScheduleRevision(): number;
914
+ /**
915
+ * Exit channel for a preview dispatch (`DispatchOptions.preview`): applies
916
+ * the inverse ChangeSet the preview returned, restoring the canonical
917
+ * state exactly. Like the preview itself it leaves no session trace: no
918
+ * save-tracker dirty, no undo entry, no effects, and the schedule revision
919
+ * does not move (see `getScheduleRevision`).
920
+ *
921
+ * Returns the ChangeSet to project to the view layer: the same changes as
922
+ * `inverse`, but with `after` images re-read from the restored state (the
923
+ * ones inside `inverse` were captured while the preview edit was applied).
924
+ */
925
+ applyPreviewInverse(inverse: ChangeSet): Promise<ChangeSet>;
807
926
  getDeletedActivitiesSinceLastSave(): ReadonlyArray<Readonly<DeletedActivitySnapshot>>;
808
927
  getDeletedLinksSinceLastSave(): ReadonlyArray<Readonly<DeletedLinkSnapshot>>;
809
928
  private _enqueue;
@@ -927,16 +1046,15 @@ declare class ScheduleCore {
927
1046
  private _rollback;
928
1047
  }
929
1048
 
930
- interface ViewStateSeed {
931
- readonly hiddenIds: readonly ActivityId[];
932
- }
933
1049
  interface ParsedInput {
934
1050
  sector: SectorMetadata;
935
1051
  activities: CoreActivity[];
936
1052
  links: Link[];
937
1053
  calendars: Calendar[];
938
1054
  baseCalendars: Calendar[];
939
- viewStateSeed: ViewStateSeed;
1055
+ viewStateSeed: {
1056
+ readonly hiddenIds: readonly ActivityId[];
1057
+ };
940
1058
  }
941
1059
  declare function parseFromBackend(input: BackendScheduleInput, reporter?: ScheduleCoreReporter): ParsedInput;
942
1060
 
@@ -1002,6 +1120,9 @@ declare const DEFAULT_HOURS_PER_DAY = 8;
1002
1120
 
1003
1121
  type DispatchActionKind = DispatchAction['kind'];
1004
1122
  declare const DISPATCH_ACTION_KIND: {
1123
+ readonly ACTIVITY_CLIPBOARD_CLEAR: "activity-clipboard-clear";
1124
+ readonly ACTIVITY_COPY: "activity-copy";
1125
+ readonly ACTIVITY_PASTE_COPIED: "activity-paste-copied";
1005
1126
  readonly PERSISTENCE_ACKNOWLEDGE: "persistence-acknowledge";
1006
1127
  readonly BASELINE_APPLY: "baseline-apply";
1007
1128
  readonly PONDERATOR_CRITERION_SET: "ponderator-criterion-set";
@@ -1019,13 +1140,13 @@ declare const DISPATCH_ACTION_KIND: {
1019
1140
  readonly ACTIVITY_INDENT: "activity-indent";
1020
1141
  readonly ACTIVITY_OUTDENT: "activity-outdent";
1021
1142
  readonly ACTIVITY_SET_PROGRESS: "activity-set-progress";
1022
- readonly ACTIVITY_PASTE: "activity-paste";
1023
1143
  readonly SELECTION_TOGGLE: "selection-toggle";
1024
1144
  readonly SELECTION_REPLACE: "selection-replace";
1025
1145
  readonly VISIBILITY_SET: "visibility-set";
1026
1146
  readonly FILTER_SET: "filter-set";
1027
1147
  readonly SORT_SET: "sort-set";
1028
1148
  readonly SIR_SYNC: "sir-sync";
1149
+ readonly SIR_APPROVE: "sir-approve";
1029
1150
  readonly ACTIVITY_LOOKAHEAD_SYNC: "activity-lookahead-sync";
1030
1151
  };
1031
1152
  declare const DISPATCH_ACTION_KINDS: ReadonlyArray<DispatchActionKind>;
@@ -1050,13 +1171,19 @@ declare const REJECTION_REASON: {
1050
1171
  readonly ACTIVITY_NOT_FOUND: "activity_not_found";
1051
1172
  readonly PARENT_NOT_FOUND: "parent_not_found";
1052
1173
  readonly ACTIVITY_IDS_EMPTY: "activity_ids_empty";
1174
+ readonly NO_ACTIVITY_SELECTION: "no_activity_selection";
1175
+ readonly CLIPBOARD_EMPTY: "clipboard_empty";
1176
+ readonly ACTIVITY_PASTE_INVARIANT_FAILED: "activity_paste_invariant_failed";
1053
1177
  readonly ANCHOR_SIBLING_CONFLICT: "anchor_sibling_conflict";
1054
1178
  readonly ANCHOR_SIBLING_NOT_FOUND: "anchor_sibling_not_found";
1055
1179
  readonly ANCHOR_SIBLING_WRONG_PARENT: "anchor_sibling_wrong_parent";
1056
1180
  readonly PARENT_FROZEN_BY_SIR: "parent_frozen_by_sir";
1181
+ readonly SIR_REQUEST_NOT_PENDING: "sir_request_not_pending";
1182
+ readonly PREVIEW_UNSUPPORTED_ACTION: "preview_unsupported_action";
1057
1183
  readonly CANNOT_MOVE_INTO_OWN_DESCENDANT: "cannot_move_into_own_descendant";
1058
1184
  readonly INDENT_NO_ELIGIBLE_SIBLING: "indent_no_eligible_sibling";
1059
1185
  readonly OUTDENT_ROOT_LEVEL_NOT_EDITABLE: "outdent_root_level_not_editable";
1186
+ readonly HIERARCHY_CYCLE: "hierarchy_cycle";
1060
1187
  readonly INVALID_PROGRESS_VALUE: "invalid_progress_value_must_be_0_or_100";
1061
1188
  };
1062
1189
  type DispatchRejectReason = (typeof REJECTION_REASON)[keyof typeof REJECTION_REASON];
@@ -1070,4 +1197,4 @@ declare const DISPATCH_TRACK_EVENT: {
1070
1197
  };
1071
1198
  type DispatchTrackEvent = (typeof DISPATCH_TRACK_EVENT)[keyof typeof DISPATCH_TRACK_EVENT];
1072
1199
 
1073
- export { ACTIVITY_TYPE, type ActivityBatchAction, type ActivityBatchItem, type ActivityBatchLinkInput, type ActivityBatchMode, type ActivityBatchParentReference, type ActivityBatchReference, type ActivityCreter, type ActivityId, type ActivityType, type BackendActivityInput, type BackendCalendarInput, type BackendLinkInput, type BackendScheduleInput, type BackendSectorInput, type BaselinePoint, type BaselineVersion, type BranchOrderChange, CALENDAR_UNIT, COLUMN, CONSTRAINT_TYPE, CONSTRAINT_TYPE_TO_LABEL, CREATION_KIND, type Calendar, type CalendarId, type CalendarUnit, type CalendarWorktime, type ChangeSet, type ColumnName, type ConstraintType, type ConstraintWarning, type CoreActivity, type CreationKind, DEFAULT_HOURS_PER_DAY, DISPATCH_ACTION_KIND, DISPATCH_ACTION_KINDS, DISPATCH_TRACK_EVENT, type DateGesture, type DateGesturePreview, type DeletedActivitySnapshot, type DeletedLinkSnapshot, type DispatchAction, type DispatchActionKind, type DispatchOptions, type DispatchRejectReason, type DispatchResult, type DispatchTrackEvent, type EntityChange, type FilterCriterion, type FilterDateRange, type FilterField, type FilterState, LINK_CODE_TO_TYPE, LINK_TYPE, LINK_TYPE_CODE, type Link, type LinkId, type LinkType, type LinkTypeCode, type LinksBatchOperation, NEW_ACTIVITY_DEFAULTS, type OrderRule, type OrderState, type ParsedInput, type PastedActivityInput, type PastedLinkInput, type PendingRequest, type PersistedEntityIdentity, REJECTION_REASON, ROOT_PARENT_ID, ScheduleCore, type ScheduleCoreInput, type ScheduleCoreReporter, type ScheduleCoreStatus, type ScheduleEffect, type SectorMetadata, type StatusCriteria, type TrackingEvent, type UndoOptions, WORK_TIME_DIRECTION, type WorkTimeDirection, checkNoUpdatedLinks, computeExpectedProgress, expectedProgressFromBaseline, getActiveBaseline, getUnsavedActivities, isRootParent, normalizeParentKey, parseFromBackend, willRunCriticalPath, yieldToBrowser };
1200
+ export { ACTIVITY_TYPE, type ActivityBaselineSnapshot, type ActivityBatchAction, type ActivityBatchItem, type ActivityBatchLinkInput, type ActivityBatchMode, type ActivityBatchParentReference, type ActivityBatchReference, type ActivityCreter, type ActivityId, type ActivityStatus, type ActivityType, type BackendActivityInput, type BackendCalendarExceptionInput, type BackendCalendarInput, type BackendLinkInput, type BackendScheduleInput, type BackendSectorInput, type BackendShiftInput, type BaselinePoint, type BaselineVersion, type BranchOrderChange, CALENDAR_UNIT, COLUMN, CONSTRAINT_TYPE, CONSTRAINT_TYPE_TO_LABEL, CREATION_KIND, type Calendar, type CalendarId, type CalendarLike, type CalendarUnit, type CalendarWorktime, type ChangeSet, type ChangeSetSource, type ColumnName, type ConstraintType, type ConstraintWarning, type CoreActivity, type CoreBaselinePoint, type CreationKind, type CreationOverrides, type CriticalPathResult, DEFAULT_HOURS_PER_DAY, DISPATCH_ACTION_KIND, DISPATCH_ACTION_KINDS, DISPATCH_TRACK_EVENT, type DateGesture, type DateGesturePreview, type DatesBatchVerdict, type DeletedActivitySnapshot, type DeletedLinkSnapshot, type DispatchAction, type DispatchActionKind, type DispatchOptions, type DispatchRejectReason, type DispatchResult, type DispatchTrackEvent, type EditableColumnName, type EffectiveGraphAudit, type EntityChange, type ExpectedProgressAdapter, type FilterCriterion, type FilterCriterionValue, type FilterDateRange, type FilterField, type FilterOperator, type FilterState, LINK_CODE_TO_TYPE, LINK_TYPE, LINK_TYPE_CODE, type Link, type LinkBatchVerdict, type LinkId, type LinkType, type LinkTypeCode, type LinksBatchOperation, NEW_ACTIVITY_DEFAULTS, type OrderRule, type OrderState, type ParsedInput, type PendingRequest, type PersistedEntityIdentity, type PipelineColumnName, type PreviewDispatchInfo, type ProjectWorkHours, REJECTION_REASON, ROOT_PARENT_ID, SCHEDULE_CORE_STATUS, STATUS, ScheduleCore, type ScheduleCoreInput, type ScheduleCoreReporter, type ScheduleCoreStatus, type ScheduleEffect, type SectorMetadata, type StaticActivityDefaults, type StatusCriteria, type TrackingEvent, type UndoOptions, type ViewStateChange, type ViewStatePropChange, WORK_TIME_DIRECTION, type WithProplannerId, type WorkTimeDirection, checkNoUpdatedLinks, computeExpectedProgress, expectedProgressFromBaseline, getActiveBaseline, getUnsavedActivities, isRootParent, normalizeParentKey, parseFromBackend, willRunCriticalPath, yieldToBrowser };