@outbuild-company/schedule-core 1.6.3 → 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.cts 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;
@@ -279,14 +289,22 @@ type NumberOperator = 'equals' | 'notEquals' | 'greaterThan' | 'lessThan' | 'gre
279
289
  type DateOperator = 'after' | 'before';
280
290
  type MembershipOperator = 'someOf' | 'notSomeOf';
281
291
  type FilterOperator = StringOperator | NumberOperator | DateOperator | MembershipOperator;
282
- 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;
283
300
  type FilterScalarValue = string | number | Date;
284
- type FilterCriterionValue = FilterScalarValue | ReadonlyArray<string | number>;
285
- interface FilterCriterion {
286
- readonly field: FilterField;
287
- readonly operator: FilterOperator;
288
- 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;
289
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>>;
290
308
  interface FilterDateRange {
291
309
  readonly start: Date;
292
310
  readonly end: Date;
@@ -341,6 +359,10 @@ type LinksBatchOperation = {
341
359
  kind: 'delete';
342
360
  linkId: LinkId;
343
361
  };
362
+ interface ReconciledActivityProgress {
363
+ readonly activityId: string;
364
+ readonly progress: number;
365
+ }
344
366
  interface PersistedEntityIdentity {
345
367
  readonly id: string;
346
368
  readonly proplannerId: number;
@@ -373,9 +395,28 @@ interface ActivityBatchAction {
373
395
  }
374
396
 
375
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
+ } | {
376
410
  kind: 'persistence-acknowledge';
377
411
  activities?: ReadonlyArray<PersistedEntityIdentity>;
378
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>;
379
420
  } | {
380
421
  kind: 'baseline-apply';
381
422
  points: ReadonlyArray<BaselinePoint>;
@@ -454,6 +495,15 @@ type DispatchAction = {
454
495
  kind: 'activity-set-progress';
455
496
  activityId: ActivityId;
456
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';
457
507
  eventSource?: string;
458
508
  } | {
459
509
  kind: 'selection-toggle';
@@ -485,6 +535,13 @@ type DispatchAction = {
485
535
  activityId: ActivityId;
486
536
  pendingRequests: ReadonlyArray<PendingRequest>;
487
537
  eventSource?: string;
538
+ } | {
539
+ kind: 'sir-approve';
540
+ activityId: ActivityId;
541
+ approvedRequestId: string;
542
+ startDate: unknown;
543
+ endDate: unknown;
544
+ eventSource?: string;
488
545
  } | {
489
546
  kind: 'activity-lookahead-sync';
490
547
  activityIds: ReadonlyArray<ActivityId>;
@@ -492,38 +549,32 @@ type DispatchAction = {
492
549
  hasLookaheadTasks: boolean;
493
550
  acknowledgePersistedLookahead?: boolean;
494
551
  eventSource?: string;
495
- } | {
496
- kind: 'activity-paste';
497
- destination: {
498
- parentId: ActivityId | '0';
499
- index: number;
500
- } | {
501
- afterSiblingId: ActivityId;
502
- };
503
- referenceActivityId: ActivityId;
504
- activities: ReadonlyArray<PastedActivityInput>;
505
- links: ReadonlyArray<PastedLinkInput>;
506
- eventSource?: string;
507
552
  };
508
553
  type InternalDispatchAction = DispatchAction | ActivityBatchAction;
509
- interface PastedActivityInput {
510
- readonly originalId: ActivityId;
511
- readonly originalParentId: ActivityId | '0';
512
- readonly activityId?: ActivityId;
513
- readonly overrides: CreationOverrides;
514
- readonly baselineSnapshot?: ActivityBaselineSnapshot | null;
515
- }
516
- interface PastedLinkInput {
517
- readonly source: ActivityId;
518
- readonly target: ActivityId;
519
- readonly type: LinkType;
520
- readonly lag: number;
521
- readonly linkId?: LinkId;
522
- }
523
554
  interface DispatchOptions {
524
555
  skipAutoSchedule?: boolean;
525
556
  skipCriticalPath?: boolean;
526
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;
527
578
  }
528
579
  type DispatchResult = {
529
580
  ok: true;
@@ -531,6 +582,8 @@ type DispatchResult = {
531
582
  verdicts?: ReadonlyArray<DatesBatchVerdict>;
532
583
  activityVerdicts?: ReadonlyArray<DatesBatchVerdict>;
533
584
  linkVerdicts?: ReadonlyArray<LinkBatchVerdict>;
585
+ /** Present only when dispatched with `DispatchOptions.preview`. */
586
+ preview?: PreviewDispatchInfo;
534
587
  } | {
535
588
  ok: false;
536
589
  reason: string;
@@ -746,6 +799,7 @@ interface ScheduleCoreInput extends BackendScheduleInput {
746
799
  clock?: () => Date;
747
800
  criticalPathOnLoad?: boolean;
748
801
  statusCriteria?: StatusCriteria;
802
+ ganttId?: number;
749
803
  reporter?: ScheduleCoreReporter;
750
804
  }
751
805
 
@@ -764,12 +818,20 @@ interface DateGesturePreview {
764
818
  } | null;
765
819
  }
766
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
+ }
767
828
  interface UndoOptions {
768
829
  readonly skipCriticalPath?: boolean;
769
830
  readonly expectedUndoDepth?: number;
770
831
  }
771
832
 
772
833
  declare class ScheduleCore {
834
+ private readonly _activityClipboard;
773
835
  private _status;
774
836
  private readonly coreRuntime;
775
837
  private readonly _undo;
@@ -811,9 +873,18 @@ declare class ScheduleCore {
811
873
  getActivityView(id: ActivityId): Readonly<CoreActivity> | null;
812
874
  createDateGesturePreview(gesture: DateGesture): DateGesturePreview;
813
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[];
814
884
  getChildrenView(parentId: ActivityId | '0'): ReadonlyArray<Readonly<CoreActivity>>;
815
885
  getLinkView(id: LinkId): Readonly<Link> | null;
816
886
  getAllLinksView(): ReadonlyArray<Readonly<Link>>;
887
+ auditEffectiveGraph(): EffectiveGraphAudit;
817
888
  getProperty<Property extends keyof CoreActivity>(activityId: ActivityId, property: Property): CoreActivity[Property] | null;
818
889
  getAllIds(): readonly string[];
819
890
  forEachActivityId(visit: (id: string) => void): void;
@@ -832,6 +903,26 @@ declare class ScheduleCore {
832
903
  getModifiedLinks(): ReadonlyArray<Readonly<Link>>;
833
904
  getModifiedActivities(): ReadonlyArray<Readonly<CoreActivity>>;
834
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>;
835
926
  getDeletedActivitiesSinceLastSave(): ReadonlyArray<Readonly<DeletedActivitySnapshot>>;
836
927
  getDeletedLinksSinceLastSave(): ReadonlyArray<Readonly<DeletedLinkSnapshot>>;
837
928
  private _enqueue;
@@ -1029,6 +1120,9 @@ declare const DEFAULT_HOURS_PER_DAY = 8;
1029
1120
 
1030
1121
  type DispatchActionKind = DispatchAction['kind'];
1031
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";
1032
1126
  readonly PERSISTENCE_ACKNOWLEDGE: "persistence-acknowledge";
1033
1127
  readonly BASELINE_APPLY: "baseline-apply";
1034
1128
  readonly PONDERATOR_CRITERION_SET: "ponderator-criterion-set";
@@ -1046,13 +1140,13 @@ declare const DISPATCH_ACTION_KIND: {
1046
1140
  readonly ACTIVITY_INDENT: "activity-indent";
1047
1141
  readonly ACTIVITY_OUTDENT: "activity-outdent";
1048
1142
  readonly ACTIVITY_SET_PROGRESS: "activity-set-progress";
1049
- readonly ACTIVITY_PASTE: "activity-paste";
1050
1143
  readonly SELECTION_TOGGLE: "selection-toggle";
1051
1144
  readonly SELECTION_REPLACE: "selection-replace";
1052
1145
  readonly VISIBILITY_SET: "visibility-set";
1053
1146
  readonly FILTER_SET: "filter-set";
1054
1147
  readonly SORT_SET: "sort-set";
1055
1148
  readonly SIR_SYNC: "sir-sync";
1149
+ readonly SIR_APPROVE: "sir-approve";
1056
1150
  readonly ACTIVITY_LOOKAHEAD_SYNC: "activity-lookahead-sync";
1057
1151
  };
1058
1152
  declare const DISPATCH_ACTION_KINDS: ReadonlyArray<DispatchActionKind>;
@@ -1077,13 +1171,19 @@ declare const REJECTION_REASON: {
1077
1171
  readonly ACTIVITY_NOT_FOUND: "activity_not_found";
1078
1172
  readonly PARENT_NOT_FOUND: "parent_not_found";
1079
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";
1080
1177
  readonly ANCHOR_SIBLING_CONFLICT: "anchor_sibling_conflict";
1081
1178
  readonly ANCHOR_SIBLING_NOT_FOUND: "anchor_sibling_not_found";
1082
1179
  readonly ANCHOR_SIBLING_WRONG_PARENT: "anchor_sibling_wrong_parent";
1083
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";
1084
1183
  readonly CANNOT_MOVE_INTO_OWN_DESCENDANT: "cannot_move_into_own_descendant";
1085
1184
  readonly INDENT_NO_ELIGIBLE_SIBLING: "indent_no_eligible_sibling";
1086
1185
  readonly OUTDENT_ROOT_LEVEL_NOT_EDITABLE: "outdent_root_level_not_editable";
1186
+ readonly HIERARCHY_CYCLE: "hierarchy_cycle";
1087
1187
  readonly INVALID_PROGRESS_VALUE: "invalid_progress_value_must_be_0_or_100";
1088
1188
  };
1089
1189
  type DispatchRejectReason = (typeof REJECTION_REASON)[keyof typeof REJECTION_REASON];
@@ -1097,4 +1197,4 @@ declare const DISPATCH_TRACK_EVENT: {
1097
1197
  };
1098
1198
  type DispatchTrackEvent = (typeof DISPATCH_TRACK_EVENT)[keyof typeof DISPATCH_TRACK_EVENT];
1099
1199
 
1100
- 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 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 PastedActivityInput, type PastedLinkInput, type PendingRequest, type PersistedEntityIdentity, type PipelineColumnName, 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 };
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 };
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;
@@ -279,14 +289,22 @@ type NumberOperator = 'equals' | 'notEquals' | 'greaterThan' | 'lessThan' | 'gre
279
289
  type DateOperator = 'after' | 'before';
280
290
  type MembershipOperator = 'someOf' | 'notSomeOf';
281
291
  type FilterOperator = StringOperator | NumberOperator | DateOperator | MembershipOperator;
282
- 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;
283
300
  type FilterScalarValue = string | number | Date;
284
- type FilterCriterionValue = FilterScalarValue | ReadonlyArray<string | number>;
285
- interface FilterCriterion {
286
- readonly field: FilterField;
287
- readonly operator: FilterOperator;
288
- 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;
289
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>>;
290
308
  interface FilterDateRange {
291
309
  readonly start: Date;
292
310
  readonly end: Date;
@@ -341,6 +359,10 @@ type LinksBatchOperation = {
341
359
  kind: 'delete';
342
360
  linkId: LinkId;
343
361
  };
362
+ interface ReconciledActivityProgress {
363
+ readonly activityId: string;
364
+ readonly progress: number;
365
+ }
344
366
  interface PersistedEntityIdentity {
345
367
  readonly id: string;
346
368
  readonly proplannerId: number;
@@ -373,9 +395,28 @@ interface ActivityBatchAction {
373
395
  }
374
396
 
375
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
+ } | {
376
410
  kind: 'persistence-acknowledge';
377
411
  activities?: ReadonlyArray<PersistedEntityIdentity>;
378
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>;
379
420
  } | {
380
421
  kind: 'baseline-apply';
381
422
  points: ReadonlyArray<BaselinePoint>;
@@ -454,6 +495,15 @@ type DispatchAction = {
454
495
  kind: 'activity-set-progress';
455
496
  activityId: ActivityId;
456
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';
457
507
  eventSource?: string;
458
508
  } | {
459
509
  kind: 'selection-toggle';
@@ -485,6 +535,13 @@ type DispatchAction = {
485
535
  activityId: ActivityId;
486
536
  pendingRequests: ReadonlyArray<PendingRequest>;
487
537
  eventSource?: string;
538
+ } | {
539
+ kind: 'sir-approve';
540
+ activityId: ActivityId;
541
+ approvedRequestId: string;
542
+ startDate: unknown;
543
+ endDate: unknown;
544
+ eventSource?: string;
488
545
  } | {
489
546
  kind: 'activity-lookahead-sync';
490
547
  activityIds: ReadonlyArray<ActivityId>;
@@ -492,38 +549,32 @@ type DispatchAction = {
492
549
  hasLookaheadTasks: boolean;
493
550
  acknowledgePersistedLookahead?: boolean;
494
551
  eventSource?: string;
495
- } | {
496
- kind: 'activity-paste';
497
- destination: {
498
- parentId: ActivityId | '0';
499
- index: number;
500
- } | {
501
- afterSiblingId: ActivityId;
502
- };
503
- referenceActivityId: ActivityId;
504
- activities: ReadonlyArray<PastedActivityInput>;
505
- links: ReadonlyArray<PastedLinkInput>;
506
- eventSource?: string;
507
552
  };
508
553
  type InternalDispatchAction = DispatchAction | ActivityBatchAction;
509
- interface PastedActivityInput {
510
- readonly originalId: ActivityId;
511
- readonly originalParentId: ActivityId | '0';
512
- readonly activityId?: ActivityId;
513
- readonly overrides: CreationOverrides;
514
- readonly baselineSnapshot?: ActivityBaselineSnapshot | null;
515
- }
516
- interface PastedLinkInput {
517
- readonly source: ActivityId;
518
- readonly target: ActivityId;
519
- readonly type: LinkType;
520
- readonly lag: number;
521
- readonly linkId?: LinkId;
522
- }
523
554
  interface DispatchOptions {
524
555
  skipAutoSchedule?: boolean;
525
556
  skipCriticalPath?: boolean;
526
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;
527
578
  }
528
579
  type DispatchResult = {
529
580
  ok: true;
@@ -531,6 +582,8 @@ type DispatchResult = {
531
582
  verdicts?: ReadonlyArray<DatesBatchVerdict>;
532
583
  activityVerdicts?: ReadonlyArray<DatesBatchVerdict>;
533
584
  linkVerdicts?: ReadonlyArray<LinkBatchVerdict>;
585
+ /** Present only when dispatched with `DispatchOptions.preview`. */
586
+ preview?: PreviewDispatchInfo;
534
587
  } | {
535
588
  ok: false;
536
589
  reason: string;
@@ -746,6 +799,7 @@ interface ScheduleCoreInput extends BackendScheduleInput {
746
799
  clock?: () => Date;
747
800
  criticalPathOnLoad?: boolean;
748
801
  statusCriteria?: StatusCriteria;
802
+ ganttId?: number;
749
803
  reporter?: ScheduleCoreReporter;
750
804
  }
751
805
 
@@ -764,12 +818,20 @@ interface DateGesturePreview {
764
818
  } | null;
765
819
  }
766
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
+ }
767
828
  interface UndoOptions {
768
829
  readonly skipCriticalPath?: boolean;
769
830
  readonly expectedUndoDepth?: number;
770
831
  }
771
832
 
772
833
  declare class ScheduleCore {
834
+ private readonly _activityClipboard;
773
835
  private _status;
774
836
  private readonly coreRuntime;
775
837
  private readonly _undo;
@@ -811,9 +873,18 @@ declare class ScheduleCore {
811
873
  getActivityView(id: ActivityId): Readonly<CoreActivity> | null;
812
874
  createDateGesturePreview(gesture: DateGesture): DateGesturePreview;
813
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[];
814
884
  getChildrenView(parentId: ActivityId | '0'): ReadonlyArray<Readonly<CoreActivity>>;
815
885
  getLinkView(id: LinkId): Readonly<Link> | null;
816
886
  getAllLinksView(): ReadonlyArray<Readonly<Link>>;
887
+ auditEffectiveGraph(): EffectiveGraphAudit;
817
888
  getProperty<Property extends keyof CoreActivity>(activityId: ActivityId, property: Property): CoreActivity[Property] | null;
818
889
  getAllIds(): readonly string[];
819
890
  forEachActivityId(visit: (id: string) => void): void;
@@ -832,6 +903,26 @@ declare class ScheduleCore {
832
903
  getModifiedLinks(): ReadonlyArray<Readonly<Link>>;
833
904
  getModifiedActivities(): ReadonlyArray<Readonly<CoreActivity>>;
834
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>;
835
926
  getDeletedActivitiesSinceLastSave(): ReadonlyArray<Readonly<DeletedActivitySnapshot>>;
836
927
  getDeletedLinksSinceLastSave(): ReadonlyArray<Readonly<DeletedLinkSnapshot>>;
837
928
  private _enqueue;
@@ -1029,6 +1120,9 @@ declare const DEFAULT_HOURS_PER_DAY = 8;
1029
1120
 
1030
1121
  type DispatchActionKind = DispatchAction['kind'];
1031
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";
1032
1126
  readonly PERSISTENCE_ACKNOWLEDGE: "persistence-acknowledge";
1033
1127
  readonly BASELINE_APPLY: "baseline-apply";
1034
1128
  readonly PONDERATOR_CRITERION_SET: "ponderator-criterion-set";
@@ -1046,13 +1140,13 @@ declare const DISPATCH_ACTION_KIND: {
1046
1140
  readonly ACTIVITY_INDENT: "activity-indent";
1047
1141
  readonly ACTIVITY_OUTDENT: "activity-outdent";
1048
1142
  readonly ACTIVITY_SET_PROGRESS: "activity-set-progress";
1049
- readonly ACTIVITY_PASTE: "activity-paste";
1050
1143
  readonly SELECTION_TOGGLE: "selection-toggle";
1051
1144
  readonly SELECTION_REPLACE: "selection-replace";
1052
1145
  readonly VISIBILITY_SET: "visibility-set";
1053
1146
  readonly FILTER_SET: "filter-set";
1054
1147
  readonly SORT_SET: "sort-set";
1055
1148
  readonly SIR_SYNC: "sir-sync";
1149
+ readonly SIR_APPROVE: "sir-approve";
1056
1150
  readonly ACTIVITY_LOOKAHEAD_SYNC: "activity-lookahead-sync";
1057
1151
  };
1058
1152
  declare const DISPATCH_ACTION_KINDS: ReadonlyArray<DispatchActionKind>;
@@ -1077,13 +1171,19 @@ declare const REJECTION_REASON: {
1077
1171
  readonly ACTIVITY_NOT_FOUND: "activity_not_found";
1078
1172
  readonly PARENT_NOT_FOUND: "parent_not_found";
1079
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";
1080
1177
  readonly ANCHOR_SIBLING_CONFLICT: "anchor_sibling_conflict";
1081
1178
  readonly ANCHOR_SIBLING_NOT_FOUND: "anchor_sibling_not_found";
1082
1179
  readonly ANCHOR_SIBLING_WRONG_PARENT: "anchor_sibling_wrong_parent";
1083
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";
1084
1183
  readonly CANNOT_MOVE_INTO_OWN_DESCENDANT: "cannot_move_into_own_descendant";
1085
1184
  readonly INDENT_NO_ELIGIBLE_SIBLING: "indent_no_eligible_sibling";
1086
1185
  readonly OUTDENT_ROOT_LEVEL_NOT_EDITABLE: "outdent_root_level_not_editable";
1186
+ readonly HIERARCHY_CYCLE: "hierarchy_cycle";
1087
1187
  readonly INVALID_PROGRESS_VALUE: "invalid_progress_value_must_be_0_or_100";
1088
1188
  };
1089
1189
  type DispatchRejectReason = (typeof REJECTION_REASON)[keyof typeof REJECTION_REASON];
@@ -1097,4 +1197,4 @@ declare const DISPATCH_TRACK_EVENT: {
1097
1197
  };
1098
1198
  type DispatchTrackEvent = (typeof DISPATCH_TRACK_EVENT)[keyof typeof DISPATCH_TRACK_EVENT];
1099
1199
 
1100
- 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 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 PastedActivityInput, type PastedLinkInput, type PendingRequest, type PersistedEntityIdentity, type PipelineColumnName, 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 };
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 };