@outbuild-company/schedule-core 1.0.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/README.md +59 -0
- package/dist/cdn/schedule-core.global.js +2 -0
- package/dist/cdn/schedule-core.global.js.map +1 -0
- package/dist/index.cjs +18665 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +2122 -0
- package/dist/index.d.ts +2122 -0
- package/dist/index.js +18633 -0
- package/dist/index.js.map +1 -0
- package/package.json +64 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/queue.ts","../src/internal/selection/compute-selection-update.ts","../src/internal/selection/is-frozen.ts","../src/dispatch/reasons.ts","../src/dispatch/selection.ts","../src/dispatch/visibility.ts","../src/columns/text/constants.ts","../src/columns/description/constants.ts","../src/columns/duration/constants.ts","../src/columns/progress/constants.ts","../src/columns/cost/constants.ts","../src/columns/used-cost/constants.ts","../src/columns/hh-work-time/constants.ts","../src/columns/start-date/constants.ts","../src/columns/end-date/constants.ts","../src/columns/constraint-type/constants.ts","../src/columns/constraint-date/constants.ts","../src/columns/calendar-id/constants.ts","../src/columns/custom-id/constants.ts","../src/columns/subcontract-id/constants.ts","../src/columns/responsables/constants.ts","../src/columns/tags/constants.ts","../src/columns/predecessors/constants.ts","../src/columns/successors/constants.ts","../src/columns/real-work/constants.ts","../src/columns/real-cost/constants.ts","../src/columns/expected-progress/constants.ts","../src/columns/expected-progress-base/constants.ts","../src/columns/start-base/constants.ts","../src/columns/end-base/constants.ts","../src/columns/duration-base/constants.ts","../src/columns/cost-base/constants.ts","../src/columns/work-base/constants.ts","../src/columns/calendar-duration/constants.ts","../src/columns/critical-path/constants.ts","../src/columns/correlative-id/constants.ts","../src/columns/unique-correlative-id/constants.ts","../src/columns/ponderator/constants.ts","../src/columns/status/constants.ts","../src/constants/columns.ts","../src/shared/assert-never.ts","../src/autoscheduler/utils/cancellation.ts","../src/types.ts","../src/constraints/index.ts","../src/autoscheduler/types.ts","../src/autoscheduler/constants.ts","../src/shared/timing.ts","../src/autoscheduler/utils/timing.ts","../src/autoscheduler/graph/topological-sort.ts","../src/autoscheduler/graph/topo-cache.ts","../src/activity-types/behavior.ts","../src/activity-types/predicates.ts","../src/activity-types/transitions.ts","../src/autoscheduler/utils/parent-link-expansion.ts","../src/autoscheduler/utils/expanded-links-cache.ts","../src/autoscheduler/graph/connected-groups.ts","../src/constants/progress.ts","../src/autoscheduler/engine/link-calculator.ts","../src/autoscheduler/engine/constraint-resolver.ts","../src/autoscheduler/engine/multi-drag.ts","../src/autoscheduler/engine/asap-pass.ts","../src/internal/hierarchy/root-parent.ts","../src/autoscheduler/engine/alap-pass.ts","../src/shared/reporter.ts","../src/autoscheduler/integration/apply-results.ts","../src/constants/workday.ts","../src/autoscheduler/links/link-display.ts","../src/columns/shared/cycle-detection.ts","../src/autoscheduler/links/apply-link-operation.ts","../src/autoscheduler/links/parse-predecessor-string.ts","../src/autoscheduler/links/diff-links.ts","../src/autoscheduler/links/lag-units.ts","../src/autoscheduler/date-math/impl-current.ts","../src/autoscheduler/date-math/types.ts","../src/autoscheduler/date-math/index.ts","../src/autoscheduler/index.ts","../src/internal/post-processors/adjust-link-lag-on-task-move.ts","../src/propagations/upward/update-parent-duration.ts","../src/internal/post-processors/update-activity-duration.ts","../src/columns/shared/weighted-progress.ts","../src/propagations/upward/parent-bounds.ts","../src/internal/post-processors/runner.ts","../src/columns/results.ts","../src/columns/text/text-pipeline.ts","../src/columns/description/description-pipeline.ts","../src/columns/shared/activity-predicates.ts","../src/columns/shared/duration.ts","../src/columns/end-date/setter.ts","../src/columns/shared/date-normalize.ts","../src/columns/constraint-type/setter.ts","../src/columns/constraint-date/setter.ts","../src/columns/shared/constraint-validation.ts","../src/columns/duration/duration-pipeline.ts","../src/columns/progress/progress-pipeline.ts","../src/columns/cost/cost-pipeline.ts","../src/columns/used-cost/used-cost-pipeline.ts","../src/columns/real-work/setter.ts","../src/columns/hh-work-time/hh-work-time-pipeline.ts","../src/columns/shared/date-comparison.ts","../src/columns/duration/setter.ts","../src/columns/start-date/start-date-pipeline.ts","../src/columns/end-date/end-date-pipeline.ts","../src/columns/constraint-type/constraint-type-pipeline.ts","../src/columns/constraint-date/constraint-date-pipeline.ts","../src/columns/calendar-id/calendar-id-pipeline.ts","../src/generators/custom-id/constants.ts","../src/columns/custom-id/custom-id-pipeline.ts","../src/columns/subcontract-id/subcontract-id-pipeline.ts","../src/columns/responsables/responsables-pipeline.ts","../src/columns/tags/tags-pipeline.ts","../src/columns/registry.ts","../src/dispatch/shared/constraint-warnings.ts","../src/constants/activity-properties.ts","../src/internal/state/dynamic-writes.ts","../src/dispatch/conversion.ts","../src/dispatch/shared/snapshots.ts","../src/shared/backend-date.ts","../src/columns/shared/expected-progress-formula.ts","../src/columns/expected-progress/compute.ts","../src/columns/status/compute.ts","../src/internal/hierarchy/visual-order.ts","../src/internal/hierarchy/recompute-correlative-ids.ts","../src/init/initial-passes.ts","../src/critical-path/legacy/shims/moment.js","../src/critical-path/legacy/helpers/isValidDate.js","../src/critical-path/legacy/helpers/addDurationToDate.js","../src/critical-path/legacy/helpers/getNextWorkingHour.js","../src/critical-path/legacy/helpers/filters.js","../src/critical-path/legacy/constants/constraints.js","../src/critical-path/legacy/constants/linkTypes.js","../src/critical-path/legacy/constants/linkByCode.js","../src/critical-path/legacy/base/identifiers/secondLevelActivities.js","../src/critical-path/legacy/base/identifiers/initialActivities.js","../src/critical-path/legacy/base/identifiers/identifyParentsWithAndWithoutLinks.js","../src/critical-path/legacy/base/identifiers/identifyForbiddenActivities.js","../src/critical-path/legacy/base/identifiers/index.js","../src/critical-path/legacy/forward-path/helpers/getMaxEarlyStartSet.js","../src/critical-path/legacy/base/parents-calculations/helpers.js","../src/critical-path/legacy/base/parents-calculations/forward.js","../src/critical-path/legacy/base/parents-calculations/backward.js","../src/critical-path/legacy/base/calculators/parentWithLinks.js","../src/critical-path/legacy/base/calculators/parentWithNoLinks.js","../src/critical-path/legacy/base/calculators/index.js","../src/critical-path/legacy/base/calculation-of-parent/index.js","../src/critical-path/legacy/base/third-level-activities/index.js","../src/critical-path/legacy/base/generic-calculations.js","../src/critical-path/legacy/forward-path/helpers/restrictionCalculation.js","../src/critical-path/legacy/forward-path/base/LinksRulesCalculationsMethods.js","../src/critical-path/legacy/forward-path/calculators/LinksConstraintCalculator.js","../src/critical-path/legacy/base/get-activities-to-calculate/index.js","../src/critical-path/legacy/utils/cancellation.js","../src/critical-path/legacy/utils/validation.js","../src/critical-path/legacy/utils/timing.js","../src/critical-path/legacy/utils/iterativeCalculation.js","../src/critical-path/legacy/forward-path/index.js","../src/critical-path/legacy/backward-path/base/CalculationsGenericMethods.js","../src/critical-path/legacy/backward-path/calculators/LinksConstraintCalculator.js","../src/critical-path/legacy/backward-path/helpers/restrictionCalculation.js","../src/critical-path/legacy/backward-path/index.js","../src/critical-path/legacy/shims/sentry.js","../src/critical-path/legacy/shims/getGanttInstance.js","../src/critical-path/legacy/floats/buildParams.js","../src/critical-path/legacy/total-float/index.js","../src/critical-path/legacy/free-float/index.js","../src/critical-path/legacy/floats/calculate.js","../src/critical-path/legacy/floats/process.js","../src/critical-path/legacy/index.js","../src/critical-path/gantt-adapter.ts","../src/critical-path/run-critical-path.ts","../src/propagations/shared/get-active-baseline.ts","../src/propagations/upward/real-cost.ts","../src/columns/critical-path/recompute-policy.ts","../src/columns/expected-progress/recompute-policy.ts","../src/dispatch/shared/derived-passes.ts","../src/dispatch/shared/post-mutation.ts","../src/dispatch/handlers/revert-no-op-constraint-edit.ts","../src/dispatch/shared/constraint-settle.ts","../src/dispatch/sir-auto-reject.ts","../src/dispatch/shared/change-set.ts","../src/dispatch/shared/helpers.ts","../src/dispatch/handlers/inline-edit.ts","../src/dispatch/handlers/link.ts","../src/dispatch/tracking-events.ts","../src/propagations/upward/recompute-hh-cascade.ts","../src/propagations/upward/recompute-used-cost-cascade.ts","../src/propagations/upward/recompute-cost-cascade.ts","../src/creation/defaults.ts","../src/creation/activity-creation-pipeline.ts","../src/creation/parent-mutation-pipeline.ts","../src/dispatch/shared/positional.ts","../src/dispatch/handlers/activity-create.ts","../src/dispatch/handlers/activity-paste.ts","../src/dispatch/handlers/sir-sync.ts","../src/propagations/upward/recompute-rollup-cascades.ts","../src/propagations/shared/traversal-helpers.ts","../src/internal/hierarchy/parent-demotion.ts","../src/internal/hierarchy/parent-new-activities-cleanup.ts","../src/dispatch/handlers/activity-delete.ts","../src/internal/hierarchy/invalid-links.ts","../src/dispatch/handlers/activity-move.ts","../src/dispatch/handlers/activity-indent.ts","../src/dispatch/handlers/activity-outdent.ts","../src/dispatch/handlers/set-progress.ts","../src/dispatch/handlers/dates-batch.ts","../src/dispatch/handlers/bulk-edit.ts","../src/dispatch/dispatch.ts","../src/dispatch/shared/public-units.ts","../src/init/read-api.ts","../src/propagations/downward/recompute-ponderator-for-parent.ts","../src/propagations/downward/recompute-all-ponderators.ts","../src/propagations/upward/progress-rollup.ts","../src/columns/expected-progress-base/compute.ts","../src/baselines/apply-baseline-points.ts","../src/columns/start-base/from-active-baseline.ts","../src/columns/end-base/from-active-baseline.ts","../src/columns/duration-base/from-active-baseline.ts","../src/columns/cost-base/from-active-baseline.ts","../src/columns/work-base/from-active-baseline.ts","../src/baselines/baseline-snapshot.ts","../src/baselines/apply-baseline-overlay.ts","../src/init/recompute-api.ts","../src/internal/state/project-work-hours.ts","../src/calendar/adapter.ts","../src/calendar/engine/utils.js","../src/calendar/engine/formatters-and-date.js","../src/calendar/engine/calendar-module.js","../src/calendar/engine/locale.js","../src/calendar/engine/shim.js","../src/calendar/engine/index.js","../src/internal/state/state-ports.ts","../src/internal/state/pipeline-context.ts","../src/dispatch/shared/staleness-policy.ts","../src/dispatch/undo/undo-entry.ts","../src/dispatch/undo/undo-recorder.ts","../src/boundary/save/activity-changes.ts","../src/boundary/save/save-tracker.ts","../src/boundary/backend/constants.ts","../src/boundary/backend/parse-from-backend.ts","../src/generators/activity-id-generator.ts","../src/generators/link-id-generator.ts","../src/generators/unique-correlative-id-generator.ts","../src/generators/custom-id/id-analyzers.ts","../src/generators/custom-id/suffix-utils.ts","../src/generators/custom-id/generation-strategies.ts","../src/generators/custom-id/tracker.ts","../src/columns/shared/field-types.ts","../src/internal/state/write-capture.ts","../src/internal/state/calendar-calculator.ts","../src/internal/state/hierarchy-index.ts","../src/internal/state/schedule-state.ts","../src/internal/post-processors/demote-childless-summaries.ts","../src/init/build-state-snapshot.ts","../src/init/initialize-core.ts","../src/init/schedule-core.ts","../src/boundary/save/link-changes.ts","../src/boundary/save/unsaved.ts","../src/boundary/backend/inverses.ts","../src/dispatch/action-kinds.ts","../src/creation/creation-kinds.ts"],"names":["isFrozen","CONSTRAINT_TYPE","isSummary","date","isSummaryActivity","START_BASED_CONSTRAINTS","checkConstraintViolation","buildConstraintNotification","value","isValidDate","getArrayOfLinkedActivities","lsSucessor","calculateRestriction","createIsCurrent","yieldIfNeeded","LinksConstraintCalculator","min","restrictionCalculation_default","ls","lf","parentLinkCalcualation","PROGRESS","LINK_TYPE","hasProgress","constraint","CONSTRAINT_DATE","beforeLink","parsed","readNumber","NOT_SET_SORT_VALUE","parentId","applyOneEdit","mergeBeforeSnapshots","depthOf","isProject","v","recomputeAllPonderators","recomputeAllProgressRollup","isDate","createCalendar","parseError","window","uid","candidate","generatedId","generated","resolveCalendarId","DEFAULT_HOURS_PER_DAY"],"mappings":"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","file":"index.js","sourcesContent":["/**\n * FIFO queue with an O(1) amortized dequeue.\n *\n * `Array.prototype.shift()` is O(n): it re-indexes every remaining element on\n * each call, so draining a queue of N items with `shift()` inside a loop is\n * O(n²). At scale that is catastrophic — the autoscheduler's Kahn frontier can\n * reach 50k on a 100k-activity graph, where the cumulative shift cost is ~5×10⁹\n * ops (see `autoscheduler/graph/topological-sort.ts`, where this class first\n * lived). A head pointer trades that for O(1) dequeue and keeps every BFS/Kahn\n * drain at O(N).\n *\n * This is the ONE sanctioned queue in the package. Per `.claude/rules/\n * algorithms.md`, `Array.shift()` as a queue drain is banned — use this.\n *\n * Memory note: dequeued slots are not reclaimed until the whole queue is GC'd.\n * That is correct for per-operation queues (built, drained, discarded), which is\n * every current use. Do not hold one alive across dispatches expecting the\n * backing array to shrink.\n */\nexport class Queue<Item> {\n private readonly items: Item[] = [];\n private head = 0;\n\n enqueue(item: Item): void {\n this.items.push(item);\n }\n\n /** Removes and returns the oldest item, or `undefined` when empty. */\n dequeue(): Item | undefined {\n if (this.head >= this.items.length) return undefined;\n const item = this.items[this.head];\n this.head += 1;\n return item;\n }\n\n /** The oldest item without removing it, or `undefined` when empty. */\n peek(): Item | undefined {\n if (this.head >= this.items.length) return undefined;\n return this.items[this.head];\n }\n\n get size(): number {\n return this.items.length - this.head;\n }\n\n isEmpty(): boolean {\n return this.head >= this.items.length;\n }\n}\n","/**\n * Decisión PURA de selección por checkbox (intent `selection-toggle`).\n *\n * Portada del bridge de react_client (2026-06-06, rediseño \"una sola\n * fuente de verdad\"): el core es la autoridad del estado de chequeo y\n * esta función concentra TODA la propagación — sin DOM, sin DHTMLX, sin\n * Redux. Reglas pineadas en compute-selection-update.test.ts:\n *\n * - check: el nodo + todos los descendientes no-congelados, a cualquier\n * profundidad (un congelado NO protege a sus hijos checkeables).\n * - check de parent con descendiente congelado → `parentBlocked`: el\n * parent NO entra (y se REMUEVE si estaba — sin herencia fantasma)\n * pero los válidos sí; sin propagación ascendente.\n * - uncheck: el nodo + descendientes no-congelados; los congelados no se\n * tocan.\n * - ascendente: ancestro seleccionado ⇔ hijos checkeables > 0, ninguno\n * congelado, todos seleccionados. Al marcar la subida está gateada por\n * `autoCheckParents`; al desmarcar siempre corre. Un ancestro\n * congelado corta la subida.\n * - ids inexistentes (`exists(id) === false`) se excluyen del censo y no\n * cuentan como congelados.\n *\n * \"Congelado\" = con SIR pendiente (`pendingRequests`). El llamador decide\n * la fuente (frozenIds del runtime DHTMLX vía bridge, o los snapshots del\n * core — ver dispatch/selection.ts).\n */\nimport { Queue } from '../../shared/queue.js';\nimport type { ActivityId } from '../../types.js';\n\ninterface SelectionHierarchy {\n /** Hijos directos (ids). Debe aceptar el id como string. */\n getChildrenIds(id: ActivityId | '0'): ReadonlyArray<ActivityId>;\n /** Parent id, o null para raíces. */\n getParentId(id: ActivityId): ActivityId | null;\n}\n\ninterface SelectionUpdateInput {\n clickedId: ActivityId;\n /** Estado del checkbox TRAS el click del usuario. */\n isChecked: boolean;\n /** Selección actual (ids). No se muta. */\n currentSelection: ReadonlySet<string>;\n hierarchy: SelectionHierarchy;\n isFrozen(id: string): boolean;\n exists(id: string): boolean;\n autoCheckParents: boolean;\n}\n\ninterface SelectionUpdateResult {\n nextSelection: Set<string>;\n changed: { checked: string[]; unchecked: string[] };\n parentBlocked: boolean;\n}\n\nconst toId = (id: ActivityId | string): string => String(id);\n\nexport function computeSelectionUpdate(\n input: SelectionUpdateInput\n): SelectionUpdateResult {\n const {\n clickedId,\n isChecked,\n currentSelection,\n hierarchy,\n isFrozen,\n exists,\n autoCheckParents\n } = input;\n\n const id = toId(clickedId);\n const before = new Set<string>([...currentSelection].map(String));\n const next = new Set<string>(before);\n\n const descendants = collectDescendants(id, hierarchy).filter(exists);\n const checkableDescendants = descendants.filter((d) => !isFrozen(d));\n const parentBlocked =\n isChecked && checkableDescendants.length < descendants.length;\n\n if (isChecked && !parentBlocked) {\n next.add(id);\n } else {\n // uncheck, o check bloqueado (sin herencia fantasma)\n next.delete(id);\n }\n for (const descendant of checkableDescendants) {\n if (isChecked) next.add(descendant);\n else next.delete(descendant);\n }\n\n if (!parentBlocked) {\n propagateToAncestors({\n id,\n isChecked,\n autoCheckParents,\n hierarchy,\n isFrozen,\n exists,\n next\n });\n }\n\n return {\n nextSelection: next,\n changed: diffSelections(before, next),\n parentBlocked\n };\n}\n\n/** BFS de descendientes (SIN incluir el nodo raíz). */\nfunction collectDescendants(\n id: string,\n hierarchy: SelectionHierarchy\n): string[] {\n const result: string[] = [];\n const queue = new Queue<string>();\n queue.enqueue(id);\n const visited = new Set<string>([id]);\n\n while (!queue.isEmpty()) {\n const current = queue.dequeue()!;\n for (const childId of hierarchy.getChildrenIds(current as ActivityId)) {\n const child = toId(childId);\n if (visited.has(child)) continue;\n visited.add(child);\n result.push(child);\n queue.enqueue(child);\n }\n }\n return result;\n}\n\n/**\n * Subida unificada: ancestro seleccionado ⇔ hijos checkeables > 0,\n * ninguno congelado, todos seleccionados. Corta en el primer ancestro\n * congelado o cuyo estado no cambia.\n */\nfunction propagateToAncestors(args: {\n id: string;\n isChecked: boolean;\n autoCheckParents: boolean;\n hierarchy: SelectionHierarchy;\n isFrozen(id: string): boolean;\n exists(id: string): boolean;\n next: Set<string>;\n}): void {\n const { id, isChecked, autoCheckParents, hierarchy, isFrozen, exists, next } =\n args;\n\n let ancestorId = hierarchy.getParentId(id as ActivityId);\n while (ancestorId !== null && typeof ancestorId !== 'undefined') {\n const ancestor = toId(ancestorId);\n if (isFrozen(ancestor)) return;\n\n const children = hierarchy\n .getChildrenIds(ancestor as ActivityId)\n .map(toId)\n .filter(exists);\n const hasFrozenChild = children.some(isFrozen);\n const checkableChildren = children.filter((child) => !isFrozen(child));\n const allSelected =\n checkableChildren.length > 0 &&\n checkableChildren.every((child) => next.has(child));\n const shouldBeSelected = allSelected && !hasFrozenChild;\n\n if (isChecked) {\n if (!autoCheckParents) return;\n if (!shouldBeSelected || next.has(ancestor)) return;\n next.add(ancestor);\n } else {\n if (shouldBeSelected || !next.has(ancestor)) return;\n next.delete(ancestor);\n }\n\n ancestorId = hierarchy.getParentId(ancestor as ActivityId);\n }\n}\n\nfunction diffSelections(\n before: ReadonlySet<string>,\n after: ReadonlySet<string>\n): { checked: string[]; unchecked: string[] } {\n const checked: string[] = [];\n const unchecked: string[] = [];\n for (const id of after) if (!before.has(id)) checked.push(id);\n for (const id of before) if (!after.has(id)) unchecked.push(id);\n return { checked, unchecked };\n}\n","import type { PendingRequest } from '../../types.js';\n\n/**\n * An activity is \"frozen\" by a pending SIR (Schedule Impact Request) when it\n * has at least one entry in `pendingRequests`. The schedule load path already\n * filters these to `state==='pending'` (see `SIR_MAP.md`), so presence ⇒\n * frozen — equivalent to the legacy `pendingRequests.length > 0` gate.\n *\n * Typed accessor: replaces the ad-hoc `as Record<string, unknown>` cast that\n * read `pendingRequests` off snapshots before the field was typed. SIR freeze\n * authority (A2).\n */\nexport function isFrozen(activity: {\n readonly pendingRequests?: readonly PendingRequest[] | undefined;\n}): boolean {\n return (activity.pendingRequests?.length ?? 0) > 0;\n}\n","/**\n * Canonical catalog of dispatch rejection reasons.\n *\n * `DispatchResult.reason` stays `string` on purpose: it is the cross-domain\n * bag that also carries pipeline gate codes (`ParseErrorCode`,\n * `ValidationReason`, `EditDenialReason`) and the link-engine rejected\n * verdicts. This module covers the reasons DISPATCH ITSELF produces, so\n * producers and tests share one compile-checked source. The string VALUES\n * are a frozen contract — the bridge matches on them.\n */\n\nexport const REJECTION_REASON = {\n // Pipeline-gate fallbacks (used when a gate rejects without a reason).\n CANNOT_EDIT: 'cannot_edit',\n PARSE_ERROR: 'parse_error',\n INVALID: 'invalid',\n // Inline-edit / link validation.\n CUSTOM_ID_DUPLICATE: 'custom_id_duplicate',\n INVALID_LINK_TYPE: 'invalid_link_type',\n INVALID_LINK_LAG: 'invalid_link_lag',\n INVALID_VALUE: 'invalid_value',\n // Bulk-edit: the column has no registered pipeline (unknown column, or a\n // link column like custom_predecessors that dispatches as link intents).\n NO_PIPELINE_FOR_COLUMN: 'no_pipeline_for_column',\n // Entity lookups.\n ACTIVITY_NOT_FOUND: 'activity_not_found',\n PARENT_NOT_FOUND: 'parent_not_found',\n ACTIVITY_IDS_EMPTY: 'activity_ids_empty',\n // Anchored positioning (create / move).\n ANCHOR_SIBLING_CONFLICT: 'anchor_sibling_conflict',\n ANCHOR_SIBLING_NOT_FOUND: 'anchor_sibling_not_found',\n ANCHOR_SIBLING_WRONG_PARENT: 'anchor_sibling_wrong_parent',\n // SIR freeze: cannot add a child under an activity with a pending SIR.\n PARENT_FROZEN_BY_SIR: 'parent_frozen_by_sir',\n // Hierarchy rules.\n CANNOT_MOVE_INTO_OWN_DESCENDANT: 'cannot_move_into_own_descendant',\n INDENT_NO_ELIGIBLE_SIBLING: 'indent_no_eligible_sibling',\n OUTDENT_ROOT_LEVEL_NOT_EDITABLE: 'outdent_root_level_not_editable',\n // Progress button.\n INVALID_PROGRESS_VALUE: 'invalid_progress_value_must_be_0_or_100'\n} as const;\n\nexport type DispatchRejectReason =\n (typeof REJECTION_REASON)[keyof typeof REJECTION_REASON];\n","/**\n * Dispatch handlers de selección por checkbox (2026-06-06).\n *\n * `selection-toggle`: corre la propagación completa\n * (`computeSelectionUpdate`, pura) contra la jerarquía del core y\n * escribe el bit de chequeo (`checked`/`visibleChecked`/\n * `mustApplyVisibleChecked`, siempre iguales) sobre los snapshots.\n * `selection-replace`: fija el set exacto sin propagación.\n *\n * Ambos emiten un ChangeSet **prop-only** (sin autoscheduler, sin\n * critical path, sin parent bounds): el bridge lo aplica en lote a\n * DHTMLX vía `applyChangeSetToDhtmlx` (escritura silent al store +\n * repaint solo del viewport). Cero `selectTask`/`unselectTask` nativos —\n * ese era el cuello de botella del flujo anterior (el plugin multiselect\n * de @dhx/gantt paga `getSelected()`+sort por unselect).\n *\n * La fuente de verdad de la selección es el propio estado del core: un\n * id está seleccionado ⇔ su snapshot tiene `checked === true`. No hay\n * Set paralelo que mantener — borrar una activity la saca de la\n * selección gratis (ver selection.test.ts GS-2).\n */\nimport type { ActivityId, Activity } from '../types.js';\nimport type { EngineActivitySnapshot } from '../autoscheduler/types.js';\nimport type { ActivityReader } from '../internal/state/roles.js';\nimport { computeSelectionUpdate } from '../internal/selection/compute-selection-update.js';\nimport { isFrozen } from '../internal/selection/is-frozen.js';\nimport { REJECTION_REASON } from './reasons.js';\nimport type {\n ChangeSet,\n DispatchAction,\n DispatchResult,\n EntityChange\n} from './types.js';\n\ninterface SelectionDeps {\n adapter: ActivityReader;\n}\n\nconst isSelectedSnapshot = (snapshot: EngineActivitySnapshot): boolean =>\n snapshot.checked === true;\n\nconst snapshotIsFrozen = (adapter: ActivityReader, id: string): boolean => {\n const snapshot = adapter.getActivity(id);\n return snapshot != null && isFrozen(snapshot);\n};\n\n/** Ids seleccionados según el estado del core (checked === true). */\nexport function collectSelectedIds(adapter: ActivityReader): string[] {\n const ids: string[] = [];\n adapter.forEachActivity((snapshot, id) => {\n if (isSelectedSnapshot(snapshot)) ids.push(id);\n });\n return ids;\n}\n\n/**\n * Builder LIVIANO del ChangeSet de selección. El builder genérico\n * (`snapshotActivities` + `buildActivityChanges`) hace structuredClone +\n * diff de todas las keys + materialización completa POR activity — para\n * un toggle de un parent grande eso congela la UI. Acá el cambio es un\n * bit conocido: `fields` lleva solo los 3 props y `after` es un objeto\n * mínimo (el bridge tiene un fast-path prop-only que asigna `fields`\n * directo al store — ver applyChangeSet.ts).\n */\nconst buildSelectionChangeSet = (\n action: DispatchAction,\n deps: SelectionDeps,\n changed: { checked: string[]; unchecked: string[] }\n): ChangeSet => {\n const activities: EntityChange<Activity>[] = [];\n\n const emit = (id: string, value: boolean) => {\n const snapshot = deps.adapter.getActivity(id);\n if (!snapshot) return;\n const before = {\n checked: snapshot.checked,\n visibleChecked: snapshot.visibleChecked,\n mustApplyVisibleChecked: snapshot.mustApplyVisibleChecked\n };\n snapshot.checked = value;\n snapshot.visibleChecked = value;\n snapshot.mustApplyVisibleChecked = value;\n activities.push({\n id,\n kind: 'updated',\n fields: {\n checked: { before: before.checked, after: value },\n visibleChecked: { before: before.visibleChecked, after: value },\n mustApplyVisibleChecked: {\n before: before.mustApplyVisibleChecked,\n after: value\n }\n },\n after: {\n id,\n checked: value,\n visibleChecked: value,\n mustApplyVisibleChecked: value\n } as unknown as Activity\n });\n };\n\n for (const id of changed.checked) emit(id, true);\n for (const id of changed.unchecked) emit(id, false);\n\n return {\n source: action,\n activities,\n links: [],\n calendars: [],\n trackingEvents: []\n };\n};\n\nexport function dispatchSelectionToggle(\n action: Extract<DispatchAction, { kind: 'selection-toggle' }>,\n deps: SelectionDeps\n): DispatchResult {\n const { adapter } = deps;\n const clickedId = action.activityId;\n\n if (!adapter.getActivity(clickedId)) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_NOT_FOUND };\n }\n\n const frozenSet = action.frozenIds ? new Set(action.frozenIds) : null;\n const isFrozen = frozenSet\n ? (id: string) => frozenSet.has(id)\n : (id: string) => snapshotIsFrozen(adapter, id);\n\n const update = computeSelectionUpdate({\n clickedId: clickedId as ActivityId,\n isChecked: action.isChecked,\n currentSelection: new Set(collectSelectedIds(adapter)),\n hierarchy: {\n // String(...) normalizes the engine's string|number ids to the string\n // ids computeSelectionUpdate works with (runtime-neutral: it re-Strings).\n getChildrenIds: (id) => adapter.getChildren(id as ActivityId),\n getParentId: (id) => {\n const parent = adapter.getParentId(id as ActivityId);\n return !parent || parent === '0' ? null : String(parent);\n }\n },\n isFrozen,\n exists: (id) => adapter.activityExists(id as ActivityId),\n autoCheckParents: action.autoCheckParents ?? false\n });\n\n return {\n ok: true,\n changes: buildSelectionChangeSet(action, deps, update.changed)\n };\n}\n\nexport function dispatchSelectionReplace(\n action: Extract<DispatchAction, { kind: 'selection-replace' }>,\n deps: SelectionDeps\n): DispatchResult {\n const { adapter } = deps;\n // Frozen ids (pending SIR) are non-selectable — excluded from the replaced\n // set for parity with selection-toggle and the legacy native handler (A7).\n const target = new Set(\n action.activityIds\n .map(String)\n .filter((id) => adapter.activityExists(id as ActivityId))\n .filter((id) => !snapshotIsFrozen(adapter, id))\n );\n const current = new Set(collectSelectedIds(adapter));\n\n const changed = {\n checked: [...target].filter((id) => !current.has(id)),\n unchecked: [...current].filter((id) => !target.has(id))\n };\n\n return {\n ok: true,\n changes: buildSelectionChangeSet(action, deps, changed)\n };\n}\n","/**\n * Dispatch handler del intent `visibility-set` (Fase 1 del view-model de\n * visibilidad, 2026-07-04). Clon del contrato de `selection-replace`:\n *\n * La UI manda el SET COMPLETO de ids visibles después de correr sus\n * filtros; el core es la autoridad del bit `visible` sobre los snapshots\n * (`visible !== false` = visible, default true) y emite un ChangeSet\n * **prop-only** con SOLO las activities cuya visibilidad cambió y SOLO el\n * campo `visible` (mismo builder liviano que la selección: nada de\n * structuredClone ni materialización completa — a 100K activities eso\n * congela la UI). Ids inexistentes se ignoran silenciosamente. Sin\n * autoscheduler, sin critical path, sin paso de undo (ver\n * `isUndoableAction` en undo-entry.ts).\n */\nimport type { Activity } from '../types.js';\nimport type { EngineActivitySnapshot } from '../autoscheduler/types.js';\nimport type { ActivityReader } from '../internal/state/roles.js';\nimport type {\n ChangeSet,\n DispatchAction,\n DispatchResult,\n EntityChange\n} from './types.js';\n\ninterface VisibilityDeps {\n adapter: ActivityReader;\n}\n\n/** Predicado canónico: visible salvo `false` explícito. */\nexport const isVisibleSnapshot = (snapshot: EngineActivitySnapshot): boolean =>\n snapshot.visible !== false;\n\nexport function dispatchVisibilitySet(\n action: Extract<DispatchAction, { kind: 'visibility-set' }>,\n deps: VisibilityDeps\n): DispatchResult {\n const { adapter } = deps;\n // Ids inexistentes quedan fuera solos: el diff itera los snapshots vivos,\n // nunca el set de entrada.\n const targetVisible = new Set(action.visibleIds.map(String));\n\n const activities: EntityChange<Activity>[] = [];\n adapter.forEachActivity((snapshot, activityId) => {\n const willBeVisible = targetVisible.has(String(activityId));\n if (isVisibleSnapshot(snapshot) === willBeVisible) return;\n const before = snapshot.visible;\n snapshot.visible = willBeVisible;\n activities.push({\n id: activityId,\n kind: 'updated',\n fields: {\n visible: { before, after: willBeVisible }\n },\n after: {\n id: activityId,\n visible: willBeVisible\n } as unknown as Activity\n });\n });\n\n const changes: ChangeSet = {\n source: action,\n activities,\n links: [],\n calendars: [],\n trackingEvents: []\n };\n return { ok: true, changes };\n}\n","export const TEXT = 'text' as const;\n","export const DESCRIPTION = 'description' as const;\n","export const DURATION = 'duration' as const;\nexport const FOR_DISABLE_MILESTONE_DURATION =\n 'for_disable_milestone_duration' as const;\n\n/** Prevents DHTMLX from auto-promoting constraint_type when dates shift during an inline edit (dhtmlxgantt.js:50201). */\nexport const KEEP_CONSTRAINTS = '$keep_constraints' as const;\n","export const PROGRESS = 'progress' as const;\n\n// DHTMLX-bridge marker — flags the progress change as coming from the\n// action-button (complete/uncomplete), triggering recursive cascade in the\n// DHTMLX event layer; candidate for removal once DHTMLX retires.\n/** Flags a recursive complete/uncomplete progress change triggered by the action-button flow. */\nexport const PROGRESS_CHANGED_BY_ACTION_BUTTON =\n 'progressChangedByActionButton' as const;\n","export const COST = 'cost' as const;\n","export const USED_COST = 'used_cost' as const;\n","export const HH_WORK_TIME = 'hhWorkTime' as const;\n","export const START_DATE = 'start_date' as const;\n\n// DHTMLX-bridge marker — captures the pre-edit start_date so the DHTMLX\n// layer and undo/drag-validation checks can see where the activity started;\n// candidate for removal once DHTMLX retires.\n/** Captures the pre-edit start_date so DHTMLX drag/undo validation can diff against the original position. */\nexport const LAST_START_DATE = 'last_start_date' as const;\n","export const END_DATE = 'end_date' as const;\n","export const CONSTRAINT_TYPE = 'constraint_type' as const;\nexport const REAL_CONSTRAINT_TYPE = 'real_constraint_type' as const;\nexport const CONSTRAINT_TYPE_OLD = 'constraint_type_old' as const;\n\n// DHTMLX-bridge marker — echoes the constraint_type into the DHTMLX field\n// that the legacy onAfterTaskUpdate / drag-validation reads to determine the\n// \"last known\" constraint before a resize or inline edit; candidate for removal\n// once DHTMLX retires.\n/** Mirrors the current constraint_type into the DHTMLX bridge field read by drag/edit validation. */\nexport const LAST_CONSTRAINT = 'last_constraint' as const;\n","export const CONSTRAINT_DATE = 'constraint_date' as const;\nexport const LAST_CONSTRAINT_DATE = 'last_constraint_date' as const;\n","export const CALENDAR_ID = 'calendar_id' as const;\n","/** Column key. */\nexport const CUSTOM_ID = 'custom_id' as const;\n","export const SUBCONTRACT_ID = 'subcontractId' as const;\n","export const RESPONSABLES = 'responsables' as const;\n","export const TAGS = 'tags' as const;\n","export const CUSTOM_PREDECESSORS = 'custom_predecessors' as const;\n","export const CUSTOM_SUCESSORS = 'custom_sucessors' as const;\n","/**\n * `real_work` — derived \"Trabajo Real\" (HH executed = hhWorkTime × progress/100).\n * Written by the hh-work-time pipeline (leaf + ancestor rollup). Owned here so\n * any future foreign writer is caught by the ownership auditor.\n */\nexport const REAL_WORK = 'real_work' as const;\n","export const REAL_COST = 'real_cost' as const;\n","export const EXPECTED_PROGRESS = 'expected_progress' as const;\n","export const EXPECTED_PROGRESS_BASE = 'expected_progress_base' as const;\n","/**\n * `start_base` — read-only baseline column. Value produced by\n * @see src/baselines/baseline-snapshot.ts `emitBaselineSnapshotColumns`.\n * Also mapped during backend load in\n * @see src/boundary/backend/parseFromBackend.ts.\n * Not edited; not written by any column pipeline.\n */\nexport const START_BASE = 'start_base' as const;\n","/**\n * `end_base` — read-only baseline column. Value produced by\n * @see src/baselines/baseline-snapshot.ts `emitBaselineSnapshotColumns`.\n * Also mapped during backend load in\n * @see src/boundary/backend/parseFromBackend.ts.\n * Not edited; not written by any column pipeline.\n */\nexport const END_BASE = 'end_base' as const;\n","/**\n * `duration_base` — read-only baseline column. Value produced by\n * @see src/baselines/baseline-snapshot.ts `emitBaselineSnapshotColumns`.\n * Also mapped during backend load in\n * @see src/boundary/backend/parseFromBackend.ts.\n * Not edited; not written by any column pipeline.\n */\nexport const DURATION_BASE = 'duration_base' as const;\n","/**\n * `cost_base` — read-only baseline column. Value produced by\n * @see src/baselines/baseline-snapshot.ts `emitBaselineSnapshotColumns`.\n * Also mapped during backend load in\n * @see src/boundary/backend/parseFromBackend.ts.\n * Not edited; not written by any column pipeline.\n */\nexport const COST_BASE = 'cost_base' as const;\n","/**\n * `work_base` — read-only baseline column. Value produced by\n * @see src/baselines/baseline-snapshot.ts `emitBaselineSnapshotColumns`.\n * Also mapped during backend load in\n * @see src/boundary/backend/parseFromBackend.ts.\n * Not edited; not written by any column pipeline.\n */\nexport const WORK_BASE = 'work_base' as const;\n","export const CALENDAR_DURATION = 'calendarDuration' as const;\n","export const IS_CRITICAL = 'is_critical' as const;\nexport const EARLY_START = 'earlyStart' as const;\nexport const EARLY_FINISH = 'earlyFinish' as const;\nexport const LATE_START = 'lateStart' as const;\nexport const LATE_FINISH = 'lateFinish' as const;\nexport const FREE_SLACK = 'freeSlack' as const;\nexport const TOTAL_SLACK = 'totalSlack' as const;\n","export const CORRELATIVE_ID = 'correlative_id' as const;\n","export const UNIQUE_CORRELATIVE_ID = 'unique_correlative_id' as const;\n","export const PONDERATOR = 'ponderator' as const;\n","export const STATUS_COLUMN = 'status' as const;\n\n/**\n * Valores del `status` (semáforo) de una activity. Port de `ACTIVITY_STATUS`\n * del cliente. `Doing` es inalcanzable (la rama Overdue lo intercepta), se\n * preserva por fidelidad con el legacy. Ver `docs/domain/columns/COLUMN_status.md`.\n */\nexport const STATUS = {\n DONE: 'Done',\n OVERDUE: 'Overdue',\n ADVANCEMENT: 'Advancement',\n WAITING: 'Waiting',\n DOING: 'Doing'\n} as const;\n\nexport type ActivityStatus = (typeof STATUS)[keyof typeof STATUS];\n\nimport type { StatusCriteria } from '../../types.js';\nexport type { StatusCriteria };\n\n/** Default criterio de status (default del cliente; no es campo del backend). */\nexport const DEFAULT_STATUS_CRITERIA: StatusCriteria = 'Baseline';\n\n/**\n * Control único del valor de `status_criteria`: normaliza cualquier entrada\n * (incluye undefined y valores JS no tipados del cliente) a un `StatusCriteria`\n * válido. Se llama en los boundaries de confianza (init + toggle); adentro el\n * valor ya está garantizado, no se vuelve a defaultear.\n */\nexport function resolveStatusCriteria(value: unknown): StatusCriteria {\n return value === 'Actual' ? 'Actual' : DEFAULT_STATUS_CRITERIA;\n}\n","import { TEXT } from '../columns/text/constants.js';\nimport { DESCRIPTION } from '../columns/description/constants.js';\nimport { DURATION } from '../columns/duration/constants.js';\nimport { PROGRESS } from '../columns/progress/constants.js';\nimport { COST } from '../columns/cost/constants.js';\nimport { USED_COST } from '../columns/used-cost/constants.js';\nimport { HH_WORK_TIME } from '../columns/hh-work-time/constants.js';\nimport { START_DATE } from '../columns/start-date/constants.js';\nimport { END_DATE } from '../columns/end-date/constants.js';\nimport { CONSTRAINT_TYPE } from '../columns/constraint-type/constants.js';\nimport { CONSTRAINT_DATE } from '../columns/constraint-date/constants.js';\nimport { CALENDAR_ID } from '../columns/calendar-id/constants.js';\nimport { CUSTOM_ID } from '../columns/custom-id/constants.js';\nimport { SUBCONTRACT_ID } from '../columns/subcontract-id/constants.js';\nimport { RESPONSABLES } from '../columns/responsables/constants.js';\nimport { TAGS } from '../columns/tags/constants.js';\nimport { CUSTOM_PREDECESSORS } from '../columns/predecessors/constants.js';\nimport { CUSTOM_SUCESSORS } from '../columns/successors/constants.js';\nimport { REAL_WORK } from '../columns/real-work/constants.js';\nimport { REAL_COST } from '../columns/real-cost/constants.js';\nimport { EXPECTED_PROGRESS } from '../columns/expected-progress/constants.js';\nimport { EXPECTED_PROGRESS_BASE } from '../columns/expected-progress-base/constants.js';\nimport { START_BASE } from '../columns/start-base/constants.js';\nimport { END_BASE } from '../columns/end-base/constants.js';\nimport { DURATION_BASE } from '../columns/duration-base/constants.js';\nimport { COST_BASE } from '../columns/cost-base/constants.js';\nimport { WORK_BASE } from '../columns/work-base/constants.js';\nimport { CALENDAR_DURATION } from '../columns/calendar-duration/constants.js';\nimport {\n IS_CRITICAL,\n EARLY_START,\n EARLY_FINISH,\n LATE_START,\n LATE_FINISH,\n FREE_SLACK,\n TOTAL_SLACK\n} from '../columns/critical-path/constants.js';\nimport { CORRELATIVE_ID } from '../columns/correlative-id/constants.js';\nimport { UNIQUE_CORRELATIVE_ID } from '../columns/unique-correlative-id/constants.js';\nimport { PONDERATOR } from '../columns/ponderator/constants.js';\nimport { STATUS_COLUMN } from '../columns/status/constants.js';\n\nconst EDITABLE = {\n TEXT,\n DESCRIPTION,\n DURATION,\n PROGRESS,\n COST,\n USED_COST,\n HH_WORK_TIME,\n START_DATE,\n END_DATE,\n CONSTRAINT_TYPE,\n CONSTRAINT_DATE,\n CALENDAR_ID,\n CUSTOM_ID,\n SUBCONTRACT_ID,\n RESPONSABLES,\n TAGS,\n CUSTOM_PREDECESSORS,\n CUSTOM_SUCESSORS\n} as const;\n\nconst READ_ONLY = {\n REAL_WORK,\n REAL_COST,\n EXPECTED_PROGRESS,\n EXPECTED_PROGRESS_BASE,\n START_BASE,\n END_BASE,\n DURATION_BASE,\n COST_BASE,\n WORK_BASE,\n CALENDAR_DURATION,\n IS_CRITICAL,\n EARLY_START,\n EARLY_FINISH,\n LATE_START,\n LATE_FINISH,\n FREE_SLACK,\n TOTAL_SLACK,\n CORRELATIVE_ID,\n UNIQUE_CORRELATIVE_ID,\n PONDERATOR,\n STATUS: STATUS_COLUMN\n} as const;\n\nexport const COLUMN = { ...EDITABLE, ...READ_ONLY } as const;\n\nexport type ColumnName = (typeof COLUMN)[keyof typeof COLUMN];\n","/**\n * Compile-time exhaustiveness gate. Call it on a value the type system\n * should have narrowed to `never` (e.g. after handling every variant of a\n * discriminated union): adding a new variant without a handler turns the\n * call site into a compile error instead of a silent runtime fallthrough.\n */\nexport function assertNever(value: never, message: string): never {\n void value;\n throw new Error(message);\n}\n","import type { IsCurrent } from '../types.js';\n\n/**\n * Creates a closure that returns true as long as `getCurrentId` matches the\n * captured `id`. A newer scheduling run increments the id, causing stale\n * runs to detect the mismatch and abort.\n *\n * Pattern reused from critical_path/utils/cancellation.js.\n */\nexport function createIsCurrent(\n id: number,\n getCurrentId: () => number\n): IsCurrent {\n return () => getCurrentId() === id;\n}\n","/**\n * Public internal model types — the normalized form the core works with\n * after parsing the backend payload.\n *\n * Field naming follows snake_case for entity fields (matches backend +\n * DHTMLX convention) and camelCase for everything else, per Q14 in\n * SCHEDULE_CORE_API.md.\n */\n\nexport type ActivityId = string;\nexport type LinkId = string;\nexport type CalendarId = string;\n\nexport type ActivityType = 'project' | 'task' | 'milestone';\n\n// Constraint vocabulary is owned by `src/constraints` (single source of\n// truth). Re-exported here so the public model keeps exposing it.\nimport type { ConstraintType } from './constraints/index.js';\nexport type { ConstraintType };\n\n/** DHTMLX link kinds: 0 = FS, 1 = SS, 2 = FF, 3 = SF. */\nexport type LinkType = '0' | '1' | '2' | '3';\n\n/**\n * Critical-path output flag. Carries two historical shapes: `parseFromBackend`\n * stores a boolean, and the critical-path pass (`initial-passes.ts`) overwrites\n * it with the DHTMLX string `'Si'`/`'No'`. Both are observed at runtime (the\n * CP / paste tests assert against `'Si'`/`'No'`; `parseFromBackend` against\n * boolean), so the type unions all three rather than lying with a bare boolean.\n */\nexport type CriticalFlag = boolean | 'Si' | 'No';\n\n/** Direction for closest-work-time snapping. */\nexport type WorkTimeDirection = 'future' | 'past';\n\nexport const WORK_TIME_DIRECTION = {\n FUTURE: 'future',\n PAST: 'past'\n} as const satisfies Record<string, WorkTimeDirection>;\n\n/** Calendar query granularity (the engine boundary adds 'minute'/'any'). */\nexport type CalendarUnit = 'hour' | 'day';\n\nexport const CALENDAR_UNIT = {\n HOUR: 'hour',\n DAY: 'day'\n} as const satisfies Record<string, CalendarUnit>;\n\n/**\n * Project-level criterion used to redistribute `ponderator` (weight) among\n * sibling activities. Backend stores it lowercase on `projects.activity_creter`\n * (`'duration' | 'cost' | 'hh'`, default `'duration'`); the core normalizes\n * to uppercase. See `getActiveBaseline` / `recomputePonderatorsForParent`.\n */\nexport type ActivityCreter = 'DURATION' | 'COST' | 'HH';\n\n/** Criterion for the `status` column: compare progress against baseline or live expected. */\nexport type StatusCriteria = 'Baseline' | 'Actual';\n\n/**\n * A versioned container of baseline points for a sector\n * (backend `sectorbaselineversion` model). Exactly one version per sector\n * has `active: true` — that is the one the ponderator computation and the\n * baseline columns read.\n */\nexport interface BaselineVersion {\n id?: number;\n name?: string | null;\n /** Marks the live baseline. Exactly one active version per sector. */\n active?: boolean;\n visible?: boolean;\n /** Backend extras passed through opaquely. */\n [key: string]: unknown;\n}\n\n/**\n * A single baseline data point for an activity, as stored by the backend\n * (`sectorbaselinepoint` model) and carried verbatim through the core.\n * Snapshots the activity's planned start/end/duration/cost/work at the\n * moment a baseline version was saved. The schedule reads the ACTIVE point\n * (see `getActiveBaseline`) to derive `ponderator` (baseline-only, no\n * fallback — see memory `project_ponderator_baseline_fix`).\n *\n * Casing note: the frontend baseline columns (`startBaseCol` …\n * `durationBaseCol`) read these fields directly off the activity, so the\n * core preserves the backend snake_case exactly (passthrough, not parsed).\n *\n * Unit trap: `duration` is in DAYS (backend unit), unlike the activity's\n * `duration` which the core models in working hours — convert with the\n * sector's hours-per-day before arithmetic (legacy `transformDaysToHours`).\n */\nexport interface BaselinePoint {\n /** Planned start, backend date string `\"YYYY/MM/DD H:MM\"` or ISO. */\n start_date: string;\n /** Planned end (inclusive). */\n end_date: string;\n /** Planned duration in DAYS (backend unit). */\n duration: number;\n /** Planned cost. May arrive as a numeric string. */\n cost: number | string;\n /** Planned work hours (HH). May arrive as a numeric string. */\n hh_work: number | string;\n /** The version this point belongs to; `.active` selects the live one. */\n sectorbaselineversion?: BaselineVersion;\n sectorbaselineversionId?: number;\n baseCalendarId?: number;\n hoursPerDay?: number;\n hoursPerWeek?: number;\n /** Backend extras passed through opaquely. */\n [key: string]: unknown;\n}\n\n/**\n * Pure-domain activity model produced by `parseFromBackend`. Snake_case\n * matches the backend convention. No index signature — every field is\n * explicit. New backend fields must be added here (or to\n * `ACTIVITY_PASSTHROUGH_FIELDS` in `parseFromBackend.ts` and here).\n *\n * Companion type for runtime mutations: see `ActivityRuntime` below,\n * which extends this with `DhtmlxHeritageFields`.\n */\n/**\n * A pending SIR freezing an activity, reduced to the only field the core\n * needs: its id (equal to the backend SIR id and the front's Redux item id).\n * The schedule load already filters to pending, so presence ⇒ pending.\n */\nexport interface PendingRequest {\n id: string;\n}\n\n/**\n * PUBLIC persisted domain model — what `core.getActivityView()` returns and\n * what the backend payload parses into. Fields are snake_case (backend +\n * DHTMLX convention); `duration` is in DAYS at this boundary.\n *\n * The package has three activity shapes — one per layer:\n * - `Activity` (this): public, persisted, snake_case.\n * - `ActivitySnapshot` (`src/columns/types.ts`): camelCase + derived\n * fields (hasChildren, isMilestone…); what column pipelines read.\n * Built per-read by `state-ports.ts`; never persisted.\n * - `EngineActivitySnapshot` (`src/autoscheduler/types.ts`): raw DHTMLX\n * row (snake_case + `parent`/`$source`/`$target`, hours-based\n * duration); what `ScheduleState` stores and the scheduler engine\n * consumes. Translation Activity ↔ engine: `src/dispatch/conversion.ts`.\n */\nexport interface Activity {\n // ─── Identity ────────────────────────────────────────────────────\n id: ActivityId;\n /** Parent's `id`, or `'0'` when the activity is a root. */\n parent: ActivityId | '0';\n text: string;\n description: string;\n type: ActivityType;\n\n // ─── Scheduling ──────────────────────────────────────────────────\n start_date: Date;\n end_date: Date;\n duration: number;\n constraint_type: ConstraintType | null;\n constraint_date: Date | null;\n auto_scheduling: boolean;\n calendar_id: CalendarId | null;\n /**\n * True when the activity had no valid calendar of its own and inherited the\n * project default at load (its backend `calendarId` was null/undefined or a\n * dangling reference). Set by `parseFromBackend` when `resolveCalendarId`\n * falls back. The legacy DHTMLX worker computed this; the core owns calendar\n * assignment now, so it owns the flag. The UI uses it to surface\n * default-assigned activities. See `CALENDARS.md`.\n */\n assignedDefaultCalendar?: boolean;\n\n // ─── Progress / money / work ─────────────────────────────────────\n progress: number;\n cost: number;\n used_cost: number;\n real_cost: number;\n hhWorkTime: number;\n real_work: number;\n ponderator: number;\n\n // ─── Tree / lookahead state ──────────────────────────────────────\n correlative_id: number;\n is_lookahead: boolean;\n /**\n * Bit de visibilidad del view-model (filtros de UI); ex `should_be_showed`\n * del task DHTMLX. `visible !== false` = visible; default true. Escrito por\n * el intent `visibility-set` (prop-only) y por `parseFromBackend` al load.\n */\n visible?: boolean;\n newActivitiesArray: ActivityId[];\n activityModifications: unknown[];\n\n // ─── Passthrough fields (preserved verbatim from backend) ────────\n // Source of truth for this list: `ACTIVITY_PASSTHROUGH_FIELDS` in\n // `backend/parseFromBackend.ts`. Keep both in sync.\n /**\n * Backend DB row id (distinct from the core `id`, which is `unique_id`).\n * Captured from `a.id` in `parseActivity`; `undefined` for activities\n * created in-session (no backend id yet). Used by save dirty-detection to\n * tell persisted activities from new ones. Mirrors `Link.proplannerId`.\n */\n proplannerId?: number;\n unique_correlative_id: string;\n ganttId: number;\n sectorId: number;\n companyId: number;\n subcontractId: number | null;\n subcontract: unknown;\n custom_id: string | null;\n hasCustomPonderator: boolean;\n has_childs: boolean;\n sumOfDurationRecursively: number;\n /**\n * Critical-path outputs (poblados cuando corre el CP: en background tras la\n * carga vía `criticalPathReady`, o tras cada dispatch). `undefined` si el CP\n * aún no corrió. `is_critical` es string DHTMLX (`'Si'`/`'No'`) post-CP,\n * boolean recién parseado del backend — ver `CriticalFlag`.\n */\n earlyStart?: Date | null;\n earlyFinish?: Date | null;\n lateStart?: Date | null;\n lateFinish?: Date | null;\n totalSlack?: number | null;\n freeSlack: number | null;\n is_critical: CriticalFlag;\n hasNewActivities: boolean;\n isNewActivity: true | null;\n /**\n * Active-baseline snapshots for this activity (backend\n * `sectorbaselinepoint[]`). Passthrough — carried verbatim so the\n * frontend baseline columns and the ponderator computation can read the\n * ACTIVE point via `getActiveBaseline`. `undefined` when the activity has\n * no baseline (e.g. created in-session after the snapshot).\n */\n baseline_points?: BaselinePoint[];\n tasks: unknown[];\n responsables: unknown[];\n tags: unknown[];\n /**\n * Pending Schedule Impact Requests (SIRs) freezing this activity. The\n * schedule load path (`sector.controller.js`) already filters to\n * `state==='pending'` and sends `{ id }` only, so the core stores just the\n * id — enough to name the SIR when emitting a `sir-auto-reject` effect.\n * Non-empty ⇒ the activity is frozen (`isFrozen`). The full SIR record lives\n * in the front's Redux, not here. See `SIR_MAP.md`.\n */\n pendingRequests: PendingRequest[];\n createdAt: string;\n updatedAt: string;\n}\n\n/**\n * Fields the **scheduler / runtime** layers attach to an activity to\n * preserve DHTMLX semantics or to support legacy gantt change-detection\n * patterns. They are NOT part of the pure domain model and never come\n * from the backend payload.\n *\n * - `$source` / `$target`: convención DHTMLX para los link refs por\n * activity. La engine los mantiene para alinear con el comportamiento\n * original del autoscheduler.\n * - `dragged`: drag-in-flight flag lifted from DHTMLX runtime.\n * - `old_*_registered`: change-detection mirrors copiados del flujo\n * `updateParentDuration` del gantt legacy. Permiten que post-processors\n * detecten \"qué cambió\" sin un diff completo.\n *\n * Deuda: estos campos viven porque el scheduler interno fue lifted del\n * DHTMLX legacy. Conforme migremos las pipelines a un modelo pure-domain,\n * cada uno se va a poder borrar de acá. Buscar `DhtmlxHeritageFields`\n * para encontrar dónde se usan.\n */\nexport interface DhtmlxHeritageFields {\n $source?: LinkId[];\n $target?: LinkId[];\n dragged?: boolean;\n old_progress_registered?: number;\n old_duration_registered?: number;\n old_cost_registered?: number;\n old_used_cost_registered?: number;\n old_real_cost_registered?: number;\n old_hhWorkTime_registered?: number;\n}\n\n/**\n * Activity como la manipula el scheduler internamente: el modelo público\n * `Activity` más los campos heredados de DHTMLX / legacy gantt.\n *\n * El boundary del core público (`getActivity`, `getAllActivities`) devuelve\n * `Activity` (sin estos campos), no `ActivityRuntime`.\n */\nexport type ActivityRuntime = Activity & DhtmlxHeritageFields;\n\nexport interface Link {\n id: LinkId;\n source: ActivityId;\n target: ActivityId;\n type: LinkType;\n lag: number;\n\n // ─── Passthrough fields preserved verbatim from the backend ──────\n // Optional because synthetic test inputs may omit them. Production\n // payloads always include them. See `parseLink` in `parseFromBackend.ts`.\n ganttId?: number;\n sectorId?: number;\n /** BE row id (distinct from the schedule-level `id`/`unique_id`). */\n proplannerId?: number;\n}\n\nexport interface CalendarWorktime {\n /**\n * Per-weekday working hours, length 7 — index 0 = Sunday.\n *\n * - `false` → non-working day\n * - `string[]` → working day with these `\"HH:MM-HH:MM\"` windows\n * (supports per-day variation, e.g. a short Friday,\n * and multi-shift split days like `[\"8-12\",\"13-17\"]`)\n *\n * Single source of truth: this is exactly what `parseFromBackend` emits —\n * a working day ALWAYS carries its resolved windows (the parser resolves\n * the default-hours fallback at parse time). The vendored work-calendar\n * engine natively also accepts a boolean `true` per day (DHTMLX\n * contract), but that form never appears in the domain `Calendar`; it is\n * reserved for the engine-facing internals (`SnapshotWorktime`,\n * synthetic replay fixtures).\n *\n * The work-calendar engine consumes each weekday independently, so\n * different days can carry different windows.\n */\n days: Array<false | string[]>;\n /**\n * Default working-hour windows (`\"HH:MM-HH:MM\"`). Used as the engine's\n * global fallback. `parseFromBackend` sets it to the first working day's\n * windows.\n */\n hours: string[];\n /**\n * Per-date exceptions: holidays (non-working) and date-level shift\n * overrides. Keys are `Date.UTC(year, month, day)` (UTC midnight epoch\n * ms) stringified — this matches the lookup the work-calendar engine\n * performs internally at `calendar.dates[dateValue]`.\n *\n * Value semantics:\n * - `false` → the day is non-working\n * - `string[]` → use these `\"HH:MM-HH:MM\"` windows instead\n * of the default `hours`\n *\n * Source: `BackendCalendar.exceptiondays[]` after the adapter expands\n * `from_date`/`to_date` ranges into individual UTC days.\n */\n dates?: Record<string, false | string[]>;\n /** Optional per-week overrides for advanced calendars. */\n customWeeks?: Record<string, unknown>;\n}\n\nexport interface Calendar {\n id: CalendarId;\n /** Display name. Used by the DHTMLX calendar-selector column. */\n name: string;\n worktime: CalendarWorktime;\n is_default: boolean;\n /**\n * True for \"base\" calendars (baseline comparison). The backend ships\n * these with an `id` suffixed `-base` and `baseDefault` instead of\n * `is_default`. The bridge uses this to set `gantt.defaultBaseCalendar`\n * and to keep base calendars out of the selector dropdown.\n */\n baseDefault?: boolean;\n /**\n * Date-keyed map of exceptions (holidays, working overrides).\n * Keys are `YYYY-MM-DD` UTC.\n */\n exceptions?: Record<string, { working: boolean; hours?: string[] }>;\n}\n\n/** Sector metadata the core respects from the backend. */\nexport interface SectorMetadata {\n id: string;\n name: string;\n hoursPerDay: number;\n hoursPerWeek: number;\n dateFormat: string;\n projectId: number;\n companyId: number;\n /**\n * Project's `custom_id_prefix` (Outbuild project setting). Used by the\n * CustomIdTracker to generate ids for new activities. Falls back to\n * `'A'` if not provided.\n */\n customIdPrefix?: string;\n /**\n * Project's `custom_id_increment` (Outbuild project setting), as a\n * string so leading zeros are preserved. Used by the CustomIdTracker\n * to choose the next suffix step. Falls back to `'10'` if not provided.\n */\n customIdIncrement?: string;\n /**\n * Legacy Primavera-import flag. When true, the core recomputes each\n * activity's `duration` from its start/end against its calendar at load\n * (Primavera stores end-driven durations that may not match the\n * calendar). Mirrors the legacy `fixPrimaveraDurations`. See CALENDARS.md.\n */\n updateDurationForPrimaveraEndDate?: boolean;\n /**\n * Project's `activity_creter` — criterion for ponderator redistribution\n * (`'DURATION' | 'COST' | 'HH'`). Lives at the project level; arrives via\n * the sector payload's pass-through bucket. `parseSector` always sets it,\n * defaulting to `'DURATION'` (the backend default) when absent/unknown.\n */\n activityCreter?: ActivityCreter;\n /**\n * Project's status criterion for the `status` column — `'Baseline'` compares\n * `progress` against `expected_progress_base`, `'Actual'` against\n * `expected_progress`. Mutable at runtime via `ScheduleCore.setStatusCriteria`\n * (the Baseline↔Actual toggle). Not a backend field (client-only session\n * setting); a complete sector always carries it — `parseSector` sets the\n * default and `resolveStatusCriteria` normalizes the client override at init.\n * See `docs/domain/columns/COLUMN_status.md`.\n */\n statusCriteria: StatusCriteria;\n}\n\n/**\n * A single entity mutation record emitted by a dispatch ChangeSet.\n * Layer-neutral: contains no dispatch-specific dependencies and is used\n * both by `dispatch/` and by `internal/tracking/`.\n */\nexport interface EntityChange<T> {\n id: string;\n kind: 'created' | 'updated' | 'deleted';\n fields?: Record<string, { before: unknown; after: unknown }> | undefined;\n after: Readonly<T> | null;\n}\n","/**\n * Constraint Rules — single source of truth.\n *\n * This module owns the definition of constraint types and the rules that\n * govern them. Both the autoscheduler and the manual scheduling pipelines\n * (column edits, drag, bulk) consume the same primitives from here.\n *\n * Two surfaces:\n *\n * (a) Manual scheduling — pipelines call `checkConstraintViolation()` after\n * a user types a new value, to decide whether to emit a warning.\n * Surface: scalar Date inputs, no adapter needed.\n *\n * (b) Autoscheduler — `computeConstraintBounds()` derives the four date\n * boundaries (earliest/latest × start/end) an activity's constraint\n * imposes. `isStartWithinBounds()` and `isEndWithinBounds()` are used\n * by `limitPlanDates()` to decide whether a candidate date (from a\n * link) respects the constraint.\n *\n * Domain invariant the autoscheduler must respect:\n * The autoscheduler never moves an activity to a date that violates that\n * activity's own constraint. If a cascade via a link would push the\n * activity outside its constraint bounds, the activity stays put.\n *\n * Manual scheduling does NOT enforce this — a user is allowed to type a\n * value that violates their own constraint. The pipeline applies the edit\n * and emits a warning; the UI decides what to do with the warning (typically\n * shows a \"constraint violation detected\" modal and offers to revert).\n */\n\nimport type {\n EngineActivitySnapshot,\n AutoSchedulerPort\n} from '../autoscheduler/types.js';\nimport type { WorkTimeDirection } from '../types.js';\nimport { WORK_TIME_DIRECTION } from '../types.js';\n\n// ─── Constraint type vocabulary ────────────────────────────────\n\nexport type ConstraintType =\n | 'asap'\n | 'alap'\n | 'snet'\n | 'snlt'\n | 'fnet'\n | 'fnlt'\n | 'mso'\n | 'mfo';\n\nexport const CONSTRAINT_TYPE = {\n ASAP: 'asap',\n ALAP: 'alap',\n SNET: 'snet',\n SNLT: 'snlt',\n FNET: 'fnet',\n FNLT: 'fnlt',\n MSO: 'mso',\n MFO: 'mfo'\n} as const satisfies Record<string, ConstraintType>;\n\n// ─── Output shapes ─────────────────────────────────────────────\n\n/** Date boundaries an activity's constraint imposes on the autoscheduler. */\nexport interface ConstraintBounds {\n readonly earliestStart: Date | null;\n readonly latestStart: Date | null;\n readonly earliestEnd: Date | null;\n readonly latestEnd: Date | null;\n}\n\n/** Result of checking whether a projected date violates a constraint. */\nexport interface ViolationCheck {\n readonly violated: boolean;\n readonly constraintType?: ConstraintType;\n readonly constraintDate?: Date;\n}\n\n/** Notification payload pipelines emit when a manual edit violates. */\nexport interface ConstraintNotification {\n readonly type: 'constraint';\n readonly messageKey: string;\n readonly data?: {\n constraintType: ConstraintType;\n constraintDate: Date;\n /** The user-projected date that violated (start or end per type). */\n projectedDate?: Date;\n };\n}\n\n// ─── Violation rules ───────────────────────────────────────────\n\ntype ViolationRule = (constraintDate: Date, projected: Date) => boolean;\n\n/**\n * Truth table for \"does this projected date violate the constraint?\".\n *\n * Note: MSO/MFO return `true` unconditionally here because the callers\n * (manual pipelines) only invoke this when the user changed a value AWAY\n * from the constraint date. The autoscheduler uses `computeConstraintBounds`\n * + `isStartWithinBounds` instead, which handles MSO/MFO via pinned bounds.\n */\nconst VIOLATION_RULES: Readonly<Record<string, ViolationRule>> = {\n mso: () => true,\n mfo: () => true,\n snlt: (constraint, projected) => constraint < projected,\n snet: (constraint, projected) => constraint > projected,\n fnlt: (constraint, projected) => constraint < projected,\n fnet: (constraint, projected) => constraint > projected\n};\n\n/**\n * Used by manual pipelines (column edits) to detect that a user-typed value\n * violates the activity's constraint. ASAP/ALAP/null always return\n * `violated: false` (they don't carry a constraint date).\n */\nexport function checkConstraintViolation(\n constraintType: ConstraintType,\n constraintDate: Date | null,\n projectedDate: Date\n): ViolationCheck {\n if (!constraintDate) return { violated: false };\n\n const rule = VIOLATION_RULES[constraintType];\n if (!rule) return { violated: false };\n\n if (rule(constraintDate, projectedDate)) {\n return { violated: true, constraintType, constraintDate };\n }\n return { violated: false };\n}\n\n/**\n * Which projected date each constraint type is checked against. Parity with\n * legacy `checkIfActivityViolateConstraint.js`: MSO/SNET/SNLT compare the\n * projected START; MFO/FNET/FNLT compare the projected END.\n */\nconst START_BASED_CONSTRAINTS: ReadonlySet<ConstraintType> = new Set([\n 'mso',\n 'snet',\n 'snlt'\n]);\n\n/** Picks the per-type projected date (start vs end) for violation checks. */\nexport function pickProjectedDateForConstraint(\n constraintType: ConstraintType,\n projectedStart: Date,\n projectedEnd: Date\n): Date {\n return START_BASED_CONSTRAINTS.has(constraintType)\n ? projectedStart\n : projectedEnd;\n}\n\n/** Builds the notification payload pipelines emit on violation. */\nexport function buildConstraintNotification(\n constraintType: ConstraintType,\n constraintDate: Date,\n projectedDate?: Date\n): ConstraintNotification {\n return {\n type: 'constraint',\n messageKey: 'constraint_violation',\n data: {\n constraintType,\n constraintDate,\n ...(projectedDate ? { projectedDate } : {})\n }\n };\n}\n\n// ─── Working-day adjustment ────────────────────────────────────\n\n/**\n * Per-constraint configuration for resolving the constraint date to a working\n * instant. Faithful port of the legacy `CONSTRAINT_CASES` in\n * `react_client/src/views/schedule/utils/getEffectiveConstraintDate/index.js`:\n * - `startOfDay`: true → START constraints resolve to the day's shift_start;\n * false → FINISH constraints resolve to the day's shift_end.\n * - `direction`: which way to search for the effective working day when the\n * typed day is NON-working.\n *\n * (Previously this was a `{ direction }`-only table fed to a single\n * `getClosestWorkTime` call — an incomplete port that dropped the legacy's\n * working-day early-return and the start/end distinction, so a FINISH\n * constraint whose date sits at shift_end rolled forward to the next day's\n * shift_start. See behavior-guides/fnet-constraint-resolution.md.)\n */\nconst CONSTRAINT_CASES: Readonly<\n Partial<\n Record<\n ConstraintType,\n { startOfDay: boolean; direction: WorkTimeDirection }\n >\n >\n> = {\n snet: { startOfDay: true, direction: WORK_TIME_DIRECTION.FUTURE },\n snlt: { startOfDay: true, direction: WORK_TIME_DIRECTION.PAST },\n fnet: { startOfDay: false, direction: WORK_TIME_DIRECTION.FUTURE },\n fnlt: { startOfDay: false, direction: WORK_TIME_DIRECTION.PAST },\n mso: { startOfDay: true, direction: WORK_TIME_DIRECTION.FUTURE },\n mfo: { startOfDay: false, direction: WORK_TIME_DIRECTION.PAST }\n};\n\nconst startOfUtcDay = (d: Date): Date =>\n new Date(Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate()));\nconst addUtcDays = (d: Date, n: number): Date =>\n new Date(d.getTime() + n * 86_400_000);\nconst sameUtcDay = (a: Date, b: Date): boolean =>\n a.getUTCFullYear() === b.getUTCFullYear() &&\n a.getUTCMonth() === b.getUTCMonth() &&\n a.getUTCDate() === b.getUTCDate();\n\n/**\n * Resolves the activity's `constraint_date` to a working instant on its\n * calendar, replicating the legacy `getEffectiveConstraintDate` verbatim.\n * Returns null if there's no constraint or no date.\n *\n * 1. Working typed day → return the constraint_date UNCHANGED (it already\n * carries the calendar's shift hour: shift_start for start constraints,\n * shift_end for finish constraints).\n * 2. Non-working typed day → move to the effective working day in the\n * constraint's `direction`, then resolve to that day's shift_start\n * (`startOfDay`) or shift_end (finish constraints).\n *\n * \"Working day\" is derived from `getClosestWorkTime` (no extra adapter method):\n * the first work instant at/after the day's UTC midnight lands on the same day\n * iff the day has working time.\n */\nexport function getEffectiveConstraintDate(\n activity: EngineActivitySnapshot,\n adapter: AutoSchedulerPort\n): Date | null {\n if (!activity.constraint_date || !activity.constraint_type) return null;\n const config = CONSTRAINT_CASES[activity.constraint_type];\n if (!config) return activity.constraint_date;\n\n const cd = activity.constraint_date;\n const firstWorkOfDay = adapter.getClosestWorkTime({\n date: startOfUtcDay(cd),\n dir: WORK_TIME_DIRECTION.FUTURE,\n task: activity\n });\n if (sameUtcDay(firstWorkOfDay, cd)) return cd;\n\n const effectiveMidnight = startOfUtcDay(\n adapter.getClosestWorkTime({\n date: cd,\n dir: config.direction,\n task: activity\n })\n );\n if (config.startOfDay) {\n return adapter.getClosestWorkTime({\n date: effectiveMidnight,\n dir: WORK_TIME_DIRECTION.FUTURE,\n task: activity\n });\n }\n return adapter.getClosestWorkTime({\n date: addUtcDays(effectiveMidnight, 1),\n dir: WORK_TIME_DIRECTION.PAST,\n task: activity\n });\n}\n\n// ─── Boundary computation (autoscheduler) ──────────────────────\n\n/**\n * Computes the four constraint boundaries for an activity. ASAP/ALAP/null\n * return all-null bounds (the autoscheduler treats them as unconstrained).\n *\n * The boundaries are paired:\n * - SNET sets `earliestStart` and derives `earliestEnd`.\n * - SNLT sets `latestStart` and derives `latestEnd`.\n * - FNET sets `earliestEnd` and derives `earliestStart` (backward).\n * - FNLT sets `latestEnd` and derives `latestStart` (backward).\n * - MSO pins both start bounds (earliestStart === latestStart === date).\n * - MFO pins both end bounds.\n */\nexport function computeConstraintBounds(\n activity: EngineActivitySnapshot,\n adapter: AutoSchedulerPort\n): ConstraintBounds {\n const empty: ConstraintBounds = {\n earliestStart: null,\n latestStart: null,\n earliestEnd: null,\n latestEnd: null\n };\n\n const type = activity.constraint_type;\n if (!type || type === 'asap' || type === 'alap') return empty;\n\n const constraintDate = getEffectiveConstraintDate(activity, adapter);\n if (!constraintDate) return empty;\n\n const endFromStart = (start: Date): Date =>\n adapter.calculateEndDate({\n start_date: start,\n duration: activity.duration,\n task: activity\n });\n const startFromEnd = (end: Date): Date =>\n adapter.calculateEndDate({\n start_date: end,\n duration: -activity.duration,\n task: activity\n });\n\n switch (type) {\n case 'snet':\n return {\n earliestStart: constraintDate,\n latestStart: null,\n earliestEnd: endFromStart(constraintDate),\n latestEnd: null\n };\n case 'snlt':\n return {\n earliestStart: null,\n latestStart: constraintDate,\n earliestEnd: null,\n latestEnd: endFromStart(constraintDate)\n };\n case 'fnet':\n return {\n earliestStart: startFromEnd(constraintDate),\n latestStart: null,\n earliestEnd: constraintDate,\n latestEnd: null\n };\n case 'fnlt':\n return {\n earliestStart: null,\n latestStart: startFromEnd(constraintDate),\n earliestEnd: null,\n latestEnd: constraintDate\n };\n case 'mso': {\n const end = endFromStart(constraintDate);\n return {\n earliestStart: constraintDate,\n latestStart: constraintDate,\n earliestEnd: end,\n latestEnd: end\n };\n }\n case 'mfo': {\n const start = startFromEnd(constraintDate);\n return {\n earliestStart: start,\n latestStart: start,\n earliestEnd: constraintDate,\n latestEnd: constraintDate\n };\n }\n default:\n return empty;\n }\n}\n\n// ─── Bound predicates ──────────────────────────────────────────\n\n/** True if `start` lies within the [earliestStart, latestStart] window. */\nexport function isStartWithinBounds(\n start: Date,\n bounds: ConstraintBounds\n): boolean {\n if (bounds.earliestStart && start < bounds.earliestStart) return false;\n if (bounds.latestStart && start > bounds.latestStart) return false;\n return true;\n}\n\n/**\n * Returns the date within `[earliestStart, latestStart]` that is closest to\n * `candidate`. Used by the autoscheduler when a link cascade wants to push\n * the activity outside its admissible range — instead of leaving it where\n * it was (which would ignore the cascade pressure entirely), the activity\n * is moved to the boundary of the range. This matches legacy DHTMLX:\n *\n * - If `candidate > latestStart` → return `latestStart` (clamp down).\n * - If `candidate < earliestStart` → return `earliestStart` (clamp up).\n * - Otherwise → return `candidate` unchanged.\n *\n * The activity still never violates its constraint: the returned date is\n * by construction within the admissible window.\n */\nexport function clampStartToBounds(\n candidate: Date,\n bounds: ConstraintBounds\n): Date {\n if (bounds.latestStart && candidate > bounds.latestStart) {\n return bounds.latestStart;\n }\n if (bounds.earliestStart && candidate < bounds.earliestStart) {\n return bounds.earliestStart;\n }\n return candidate;\n}\n","/**\n * Shared types for the custom AutoScheduler and its satellite packages\n * (recording, replay, shadow, discovery).\n *\n * This file is the single seam between all components. All scheduler code\n * depends ONLY on these types — never on the DHTMLX gantt object directly.\n */\n\nexport type ActivityId = string;\n// `LinkId`/`CalendarId` are always strings at runtime: the boundary coerces\n// every id with `String(...)` (parseFromBackend, build-state-snapshot) before\n// it reaches the scheduler. The former `string | number` union was vestigial —\n// no runtime value ever inhabited the `number` arm.\nexport type LinkId = string;\nexport type CalendarId = string;\n\n// Constraint vocabulary is owned by `src/constraints` (single source of\n// truth for both the autoscheduler and the manual pipelines). Re-exported\n// here so scheduler code keeps importing from its own seam.\nimport type { ConstraintType } from '../constraints/index.js';\n\nexport type { ConstraintType };\nexport { CONSTRAINT_TYPE } from '../constraints/index.js';\n\n// LinkType / ActivityType vocabulary is owned by the root model\n// (`src/types.ts`). Re-exported here so scheduler code keeps importing\n// from its own seam.\nimport type {\n ActivityType,\n BaselinePoint,\n LinkType,\n PendingRequest,\n WorkTimeDirection\n} from '../types.js';\n\nexport type { ActivityType, LinkType };\n\n/** Value constants for link types. Matches `gantt.config.links`. */\nexport const LINK_TYPE = {\n FINISH_TO_START: '0',\n START_TO_START: '1',\n FINISH_TO_FINISH: '2',\n START_TO_FINISH: '3'\n} as const satisfies Record<string, LinkType>;\n\n/**\n * RAW DHTMLX row as the scheduler engine and `ScheduleState` see it:\n * snake_case fields, `parent` with the numeric-0 root sentinel,\n * `$source`/`$target` link id arrays, `duration` in HOURS, ids\n * `string | number`. Dates are real Date objects (not ISO strings);\n * serialization for JSON fixtures happens in the recording layer.\n * Sibling shapes: persisted `Activity` (`src/types.ts`) and the\n * pipelines' camelCase `ActivitySnapshot` (`src/columns/types.ts`) —\n * see the `Activity` docblock for the full map.\n */\nexport interface EngineActivitySnapshot {\n id: ActivityId;\n start_date: Date;\n end_date: Date;\n duration: number;\n type: ActivityType;\n parent: ActivityId | 0;\n constraint_type: ConstraintType | null;\n constraint_date: Date | null;\n progress: number;\n auto_scheduling: boolean;\n calendar_id: CalendarId | null;\n /** Outgoing link ids (this activity is the link source) */\n $source: LinkId[];\n /** Incoming link ids (this activity is the link target) */\n $target: LinkId[];\n /** Mirrors `Activity.is_critical` (`CriticalFlag`): boolean fresh from the\n * backend, `'Si'`/`'No'` after the critical-path pass. */\n is_critical?: boolean | 'Si' | 'No';\n dragged?: boolean;\n /**\n * Display/domain fields carried at runtime via the activityToSnapshot `...a`\n * spread; declared so state-ports reads them typed instead of casting.\n */\n text?: string;\n description?: string;\n cost?: number;\n used_cost?: number;\n real_cost?: number;\n hhWorkTime?: number;\n real_work?: number;\n ponderator?: number;\n tasks?: unknown[];\n real_constraint_type?: ConstraintType | null;\n last_constraint?: ConstraintType | null;\n last_constraint_date?: Date | null;\n last_start_date?: Date | null;\n date_origin?: Date | null;\n /**\n * Backend DB row id (distinct from `id` which is `unique_id`). Optional\n * because activities created in-session have no backend row yet.\n */\n proplannerId?: number;\n /** Sequential display index used as a short human-readable activity label.\n * `| undefined` is explicit: rollback before-images assign the prior value,\n * which is `undefined` for an activity that had no correlative_id yet. */\n correlative_id?: number | undefined;\n /**\n * Project-scoped unique identifier string, user-visible (e.g. \"A-0001\").\n * Null for activities that have not been assigned one yet.\n */\n custom_id?: string | null;\n /**\n * UUID-like correlative assigned by Outbuild. May be string or number\n * depending on the backend version; absent on in-session-created activities.\n */\n unique_correlative_id?: string | number | null;\n /**\n * Working-hours mirror of `duration` used by the Duration column renderer to\n * avoid re-computing hours from days on every render. Stamped by\n * `parseFromBackend`, `activityCreationPipeline`, and parent-bounds.\n */\n for_disable_milestone_duration?: number;\n /**\n * View-model visibility bit (UI filters); ex `should_be_showed` of the\n * DHTMLX task. `visible !== false` = visible; default true.\n */\n visible?: boolean;\n /** Checkbox-selection bit owned by the selection pipeline. */\n checked?: boolean;\n /** Visible (UI-layer) checkbox state, kept in sync with `checked`. */\n visibleChecked?: boolean;\n /** Signal to the bridge that `visibleChecked` was set this dispatch. */\n mustApplyVisibleChecked?: boolean;\n /**\n * Pending Schedule Impact Requests freezing this activity (id-only\n * reduction; non-empty ⇒ frozen). Carried verbatim from the backend payload.\n * Only for dynamic setActivityField writes + arbitrary backend passthrough;\n * all known fields are declared above.\n */\n pendingRequests?: PendingRequest[];\n // ─── Critical-path outputs ────────────────────────────────────────────────\n earlyStart?: Date | null;\n earlyFinish?: Date | null;\n lateStart?: Date | null;\n lateFinish?: Date | null;\n totalSlack?: number | null;\n freeSlack?: number | null;\n /** Expected-progress baseline output, written by the expected-progress pass. */\n expected_progress?: number;\n\n // ─── Backend passthrough (carried verbatim via the activityToSnapshot `...a`\n // spread; preserved across the round-trip even when the core never reads them) ─\n /** Lookahead membership; the core derives it in promote/demote (R4). */\n is_lookahead?: boolean;\n /** Client-side \"new, unsaved\" marker (not persisted as such). */\n isNewActivity?: true | null;\n /** Descendant new-activity id bookkeeping (R15, temporal). */\n newActivitiesArray?: ActivityId[];\n /** `newActivitiesArray.length > 0` mirror (R15, temporal). */\n hasNewActivities?: boolean;\n /** Activity modification log carried from the backend. */\n activityModifications?: unknown[];\n /** Load-derived: the activity fell back to the default calendar. */\n assignedDefaultCalendar?: boolean;\n /** Backend flag: has persisted children. */\n has_childs?: boolean;\n /** Backend flag: ponderator set manually (not auto-distributed). */\n hasCustomPonderator?: boolean;\n /** Backend aggregate: recursive duration sum. */\n sumOfDurationRecursively?: number;\n /** Backend row ids (distinct from the domain `id`). */\n ganttId?: number;\n sectorId?: number;\n companyId?: number;\n /** Subcontract column id + its raw backend object. */\n subcontractId?: number | null;\n subcontract?: unknown;\n /** Responsibility / tag columns (arrays of backend rows). */\n responsables?: unknown[];\n tags?: unknown[];\n /** Active baseline points overlaid at load. */\n baseline_points?: BaselinePoint[];\n /** Backend timestamps. */\n createdAt?: string;\n updatedAt?: string;\n\n // ─── DHTMLX heritage: pre-edit \"registered\" mirrors for change detection ────\n old_progress_registered?: number;\n old_duration_registered?: number;\n old_cost_registered?: number;\n old_used_cost_registered?: number;\n old_real_cost_registered?: number;\n old_hhWorkTime_registered?: number;\n\n // ─── Type-flip + constraint markers (duration / constraint / parent-mutation\n // pipelines) ────────────────────────────────────────────────────────────────\n /** Mirror of the constraint before the last change (constraint cluster). */\n constraint_type_old?: ConstraintType | null;\n /** `type === 'milestone'` cache flipped by the duration pipeline. */\n is_milestone?: boolean;\n /** DHTMLX markers consumed by the bridge / render layer. */\n $keep_constraints?: boolean;\n $rendered_type?: ActivityType;\n $no_start?: boolean;\n $no_end?: boolean;\n\n // ─── Visualization (progress pipeline's applyVisualization) ─────────────────\n status?: 'Waiting' | 'Doing' | 'Done';\n progressSolidColor?: string;\n color?: string;\n /** Flags a recursive complete/uncomplete from the action-button flow. */\n progressChangedByActionButton?: boolean;\n\n // ─── Link mirror columns (rendered predecessor / successor strings) ─────────\n custom_predecessors?: string;\n /** Backend typo preserved (single 'c'). */\n custom_sucessors?: string;\n\n // ─── Baseline snapshot columns (baseline cascade) ───────────────────────────\n start_base?: Date;\n end_base?: Date;\n duration_base?: number;\n cost_base?: number;\n work_base?: number;\n expected_progress_base?: number;\n}\n\nexport interface LinkSnapshot {\n id: LinkId;\n source: ActivityId;\n target: ActivityId;\n type: LinkType;\n lag: number;\n /**\n * Precomputed lag components for a VIRTUAL summary-expanded link. When\n * present, the link calculator uses them verbatim instead of deriving the\n * components from leaf durations (the normal `normalize` switch).\n *\n * These exist so an FF/SF link INTO a summary can carry the SUMMARY's\n * duration (`_targetLag = -summary.duration`) and the per-leaf offset from\n * the summary's start (`_trueLag = userLag + off_tgt(leaf)`), matching legacy\n * `_getImplicitLinks`/`_convertToFinishToStartLink` under\n * `auto_scheduling_move_projects`. Computed ONCE at expansion time\n * (`parent-link-expansion.ts`), never per scheduling tick.\n *\n * All three must be set together (or none): a half-populated link would mix\n * precomputed and derived components. Only the FF/SF-into-summary path emits\n * them; every other link leaves them undefined and hits the fast path.\n */\n _sourceLag?: number;\n _targetLag?: number;\n _trueLag?: number;\n // ─── Backend passthrough (preserved verbatim via the buildStoreLink `...link`\n // spread; mirrors the public `Link` passthrough) ────────────────────────────\n ganttId?: number;\n sectorId?: number;\n /** BE row id (distinct from the schedule-level `id`). */\n proplannerId?: number;\n}\n\n/**\n * Gantt-wide flags that influence scheduling decisions. Captured at the\n * boundary of every scheduling run.\n */\nexport interface ScheduleFlags {\n isPasting: boolean;\n isBulkOperation: boolean;\n dragWithMultiple: boolean;\n draggingSingleMilestone: boolean;\n creatingActivity: boolean;\n avoidAutoScheduleBeforeDrag: boolean;\n maxPerformance: boolean;\n allCheckedTaskIds: ActivityId[];\n}\n\n/**\n * A cancellation probe — returns true if the current operation should\n * continue, false if a newer run has superseded it. Pattern copied from\n * critical_path/utils/cancellation.js.\n */\nexport type IsCurrent = () => boolean;\n\n// ---------------------------------------------------------------------------\n// Scheduling result types\n// ---------------------------------------------------------------------------\n\n/**\n * The pre-computed plan for a single activity after a scheduling pass.\n * Stored in a Map keyed by ActivityId during algorithm execution.\n */\nexport interface SchedulePlan {\n /** Activity this plan belongs to */\n activityId: ActivityId;\n start_date: Date;\n end_date: Date;\n /** Link that determined the start date in the ASAP pass, if any */\n drivingLinkId: LinkId | null;\n /** Which pass produced the current dates */\n kind: 'asap' | 'alap';\n /** Whether the plan is in conflict (always seeded false at construction) */\n conflict: boolean;\n /** Constraint boundary fields populated by constraint-resolver */\n earliestStart?: Date | null;\n latestStart?: Date | null;\n earliestEnd?: Date | null;\n latestEnd?: Date | null;\n earliestSchedulingStart?: Date | null;\n latestSchedulingStart?: Date | null;\n earliestSchedulingEnd?: Date | null;\n latestSchedulingEnd?: Date | null;\n}\n\nexport interface ScheduleOptions {\n /** Id of the activity that triggered this run, if any */\n triggerId?: ActivityId | null;\n /** Cancellation probe; abort if it returns false */\n isCurrent?: IsCurrent;\n /** Ids of the activities being dragged together (multi-drag) */\n draggedIds?: ActivityId[];\n}\n\nexport interface ScheduleResult {\n /** Final plan per activity (resolved dates + constraint boundaries) */\n plans: Map<ActivityId, SchedulePlan>;\n /** Ids of activities whose dates changed */\n updatedIds: ActivityId[];\n /** Cycles detected — each entry is the node list of one cycle */\n cycles: ActivityId[][];\n /** Whether the run was aborted by a newer run */\n cancelled: boolean;\n}\n\n// ---------------------------------------------------------------------------\n// AutoSchedulerPort — the only seam the scheduler depends on\n// ---------------------------------------------------------------------------\n\n/**\n * Interface between the scheduler and the gantt. Implemented by:\n * - the consuming bridge (DHTMLX wrapper, lives in the app)\n * - MockGanttAdapter (in-memory, in specs/)\n * - MockGanttAdapter for replay (hydrated from StateSnapshot, in replay/)\n */\nexport interface AutoSchedulerPort {\n // -- Data access --\n\n getAllActivities(): ReadonlyArray<EngineActivitySnapshot>;\n getAllLinks(): LinkSnapshot[];\n getAllIds(): ActivityId[];\n getActivity(activityId: ActivityId): EngineActivitySnapshot | null;\n getLink(linkId: LinkId): LinkSnapshot | null;\n activityExists(activityId: ActivityId): boolean;\n\n // -- Hierarchy --\n\n getChildren(parentId: ActivityId): ActivityId[];\n isChildOf(childId: ActivityId, parentId: ActivityId): boolean;\n getParent(activityId: ActivityId): EngineActivitySnapshot | null;\n\n // -- Calendar operations --\n\n getClosestWorkTime(params: {\n date: Date;\n dir: WorkTimeDirection;\n task: EngineActivitySnapshot;\n }): Date;\n\n calculateEndDate(params: {\n start_date: Date;\n duration: number;\n task: EngineActivitySnapshot;\n }): Date;\n\n calculateDuration(params: {\n start_date: Date;\n end_date: Date;\n task: EngineActivitySnapshot;\n }): number;\n\n // -- Apply mutations --\n\n batchUpdate(fn: () => void): void;\n /**\n * Signals that the activity at `activityId` was mutated and the underlying\n * gantt should refresh it. No-op for in-place stores (`ScheduleState`,\n * `MockGanttAdapter`), where the live object is mutated directly; a real\n * DHTMLX-backed adapter needs it to trigger a re-render after a scheduler\n * pass. Called by `applyResults` after writing `start_date`/`end_date`.\n */\n updateActivity(activityId: ActivityId): void;\n /** Returns the live (mutable) activity from the underlying gantt */\n getLiveActivity(activityId: ActivityId): EngineActivitySnapshot | null;\n\n // -- State flags --\n\n getFlags(): ScheduleFlags;\n\n // -- Config --\n\n getProjectEnd(): Date | null;\n}\n","import type { ActivityType, ConstraintType } from './types.js';\n\nexport { CONSTRAINT_TYPE, LINK_TYPE } from './types.js';\n\n/** Constraint types that fix dates (non-flexible) */\nexport const FIXED_CONSTRAINT_TYPES = [\n 'mso',\n 'mfo'\n] as const satisfies readonly ConstraintType[];\n\n/** Constraint types that force slack to 0 */\nexport const ZERO_SLACK_CONSTRAINT_TYPES = [\n 'mso',\n 'mfo',\n 'alap'\n] as const satisfies readonly ConstraintType[];\n\n/** Activity types */\nexport const ACTIVITY_TYPE = {\n TASK: 'task',\n PROJECT: 'project',\n MILESTONE: 'milestone'\n} as const satisfies Record<string, ActivityType>;\n\n/** Debounce timings (ms) */\nexport const TIMING = {\n ALAP_DEBOUNCE_MS: 1000,\n CRITICAL_PATH_DEBOUNCE_MS: 1000,\n // 16ms = full frame budget; 8ms = yield twice per frame so the\n // browser still has half a frame to paint and handle input.\n YIELD_SLICE_MS: 8\n} as const;\n","/**\n * Environment-guarded cooperative yield — the package's sanctioned exception\n * to the \"zero browser globals\" rule (see CLAUDE.md §Identidad y contrato).\n *\n * `setTimeout(fn, 0)` is clamped to ~4ms in browsers and is deprioritised\n * vs input/animation, so it does NOT keep the page responsive under load.\n * `MessageChannel` posts a message to ourselves: the browser schedules the\n * `onmessage` callback as soon as the current task drains, typically in\n * <0.1ms, and the slot stays on the event loop ahead of `setTimeout`. The\n * browser gets to paint, handle input, and run animation frames between\n * yields.\n *\n * Node has no `MessageChannel` global pre-15, and yielding on the backend\n * delivers no UX value anyway — fall back to a zero-cost no-op there.\n */\n\nconst isNode = typeof window === 'undefined';\nconst channel: MessageChannel | null =\n !isNode && typeof MessageChannel !== 'undefined'\n ? new MessageChannel()\n : null;\n\nexport { isNode };\n\n/**\n * Returns a microtask-priority yield. Resolves on the next event-loop\n * tick — the browser is free to paint, handle input, or process other\n * tasks in between.\n */\nexport function yieldToBrowser(): Promise<void> {\n if (isNode || !channel) return Promise.resolve();\n return new Promise<void>((resolve) => {\n channel.port1.onmessage = () => resolve();\n channel.port2.postMessage(null);\n });\n}\n","import { TIMING } from '../constants.js';\nimport type { IsCurrent } from '../types.js';\nimport { isNode, yieldToBrowser } from '../../shared/timing.js';\n\n/**\n * Cooperative yielding for long-running scheduler phases. The primitive\n * (`yieldToBrowser`) lives in `src/shared/timing.ts` — these helpers add\n * the scheduler-specific slice budget and cancellation semantics.\n */\n\nexport { yieldToBrowser };\n\n/**\n * Yields if more than `YIELD_SLICE_MS` have elapsed since `sliceStart`.\n * Returns `aborted: true` when the calculation was cancelled while\n * yielding, so the caller can bail out.\n */\nexport async function yieldIfNeeded(\n sliceStart: number,\n isCurrent: IsCurrent\n): Promise<{ aborted: boolean; newSliceStart: number }> {\n const elapsed = performance.now() - sliceStart;\n\n if (elapsed < TIMING.YIELD_SLICE_MS) {\n return { aborted: false, newSliceStart: sliceStart };\n }\n\n await yieldToBrowser();\n\n if (!isCurrent()) {\n return { aborted: true, newSliceStart: performance.now() };\n }\n\n return { aborted: false, newSliceStart: performance.now() };\n}\n\n/**\n * Unconditional yield between scheduler phases. Phase transitions are\n * natural \"let the browser breathe\" points: even if neither side of the\n * transition iterates long enough to hit the slice budget, the cumulative\n * work between yields can easily exceed a frame.\n */\nexport async function yieldBetweenPhases(\n isCurrent: IsCurrent\n): Promise<{ aborted: boolean }> {\n if (isNode) return { aborted: false };\n await yieldToBrowser();\n if (!isCurrent()) return { aborted: true };\n return { aborted: false };\n}\n","import { Queue } from '../../shared/queue.js';\nimport type { ActivityId, LinkSnapshot } from '../types.js';\n\n/**\n * Result of the topological sort. If `hasCycles` is true, `cycleNodes`\n * contains the IDs of activities that participate in at least one cycle.\n */\nexport interface TopologicalResult {\n /** Activities in dependency order (predecessors before successors) */\n ordered: ActivityId[];\n /** Reverse of `ordered` (successors before predecessors) */\n reversed: ActivityId[];\n /** True when at least one cycle was detected */\n hasCycles: boolean;\n /** Activity IDs that are part of a cycle */\n cycleNodes: ActivityId[];\n}\n\n/**\n * Kahn's algorithm for topological sorting of a DAG derived from links.\n *\n * Iterative (no recursion) to safely handle 100K+ activities without\n * stack overflow.\n *\n * @param activityIds All activity IDs to consider\n * @param links All links (already filtered / expanded)\n */\nexport function topologicalSort(\n activityIds: ActivityId[],\n links: LinkSnapshot[]\n): TopologicalResult {\n const { inDegree, successors } = buildAdjacency(activityIds, links);\n const queue = seedZeroInDegreeQueue(inDegree);\n const ordered = drainKahnQueue(queue, inDegree, successors);\n\n const hasCycles = ordered.length < activityIds.length;\n const cycleNodes = hasCycles ? collectCycleNodes(activityIds, ordered) : [];\n const reversed = [...ordered].reverse();\n\n return { ordered, reversed, hasCycles, cycleNodes };\n}\n\ninterface Adjacency {\n inDegree: Map<ActivityId, number>;\n successors: Map<ActivityId, ActivityId[]>;\n}\n\nfunction buildAdjacency(\n activityIds: ActivityId[],\n links: LinkSnapshot[]\n): Adjacency {\n const inDegree = new Map<ActivityId, number>();\n const successors = new Map<ActivityId, ActivityId[]>();\n\n for (const id of activityIds) {\n inDegree.set(id, 0);\n successors.set(id, []);\n }\n\n for (const link of links) {\n const src = link.source;\n const tgt = link.target;\n if (!inDegree.has(src) || !inDegree.has(tgt)) continue;\n\n successors.get(src)!.push(tgt);\n inDegree.set(tgt, (inDegree.get(tgt) ?? 0) + 1);\n }\n\n return { inDegree, successors };\n}\n\nfunction seedZeroInDegreeQueue(\n inDegree: Map<ActivityId, number>\n): Queue<ActivityId> {\n const queue = new Queue<ActivityId>();\n for (const [id, deg] of inDegree) {\n if (deg === 0) queue.enqueue(id);\n }\n return queue;\n}\n\nfunction drainKahnQueue(\n queue: Queue<ActivityId>,\n inDegree: Map<ActivityId, number>,\n successors: Map<ActivityId, ActivityId[]>\n): ActivityId[] {\n const ordered: ActivityId[] = [];\n\n while (!queue.isEmpty()) {\n const current = queue.dequeue()!;\n ordered.push(current);\n\n for (const next of successors.get(current) ?? []) {\n const newDeg = (inDegree.get(next) ?? 1) - 1;\n inDegree.set(next, newDeg);\n if (newDeg === 0) queue.enqueue(next);\n }\n }\n\n return ordered;\n}\n\nfunction collectCycleNodes(\n activityIds: ActivityId[],\n ordered: ActivityId[]\n): ActivityId[] {\n const orderedSet = new Set(ordered);\n return activityIds.filter((id) => !orderedSet.has(id));\n}\n","import { topologicalSort, type TopologicalResult } from './topological-sort.js';\nimport type { ActivityId, LinkSnapshot } from '../types.js';\n\n/**\n * Caches the topological sort of the full graph. Invalidated by\n * structural mutations (link create/delete, activity create/delete/move,\n * parent change). Inline / value-only edits reuse the cached order.\n *\n * Why caching the FULL topo is safe for scoped scheduling: filtering a\n * topologically-ordered array by membership in a subset preserves the\n * ordering. So `scoped.ordered = globalTopo.ordered.filter(id => scoped.has(id))`\n * is itself a valid topological order of the subgraph induced by `scoped`.\n */\nexport class TopoCache {\n private cached: TopologicalResult | null = null;\n\n invalidate(): void {\n this.cached = null;\n }\n\n get(activityIds: ActivityId[], links: LinkSnapshot[]): TopologicalResult {\n if (this.cached) return this.cached;\n this.cached = topologicalSort(activityIds, links);\n return this.cached;\n }\n}\n\n/**\n * Filters a cached topological order to a subset of activity ids while\n * preserving the topological property.\n */\nexport function filterTopoOrder(\n order: ActivityId[],\n scopedIds: Set<ActivityId>\n): ActivityId[] {\n const filtered: ActivityId[] = [];\n for (const id of order) {\n if (scopedIds.has(id)) filtered.push(id);\n }\n return filtered;\n}\n","/**\n * Behavior table for the three activity types — the single place that\n * answers \"what does being a `project` / `task` / `milestone` mean?\".\n *\n * Each entry encodes TYPE-ONLY facts (facts that depend on having children\n * belong to the `isSummary` predicate, not here). Every field cites the\n * code that enforces it so the table stays honest: if an enforcement point\n * moves, update the citation in the same change.\n *\n * The `satisfies Record<ActivityType, …>` clause makes the table\n * exhaustive: adding a fourth type to `ActivityType` fails compilation\n * until its row exists.\n */\n\nimport type { ActivityType } from '../types.js';\n\nexport interface ActivityTypeBehavior {\n /**\n * Summary regardless of children. Leaf types only become summaries by\n * gaining children (see `isSummary` in `predicates.ts`). Summaries are\n * skipped by the ASAP/ALAP passes and their dates derive from children\n * (`recomputeParentFromChildren`, dispatch step 7b).\n */\n readonly alwaysSummary: boolean;\n /**\n * Whether the type can hold a scheduling constraint. Projects can't —\n * their dates are aggregated from children, so a constraint has no\n * semantic anchor (D6; `parentMutationPipeline` resets to ASAP on\n * promote, indent re-forces it in `dispatch.ts`).\n */\n readonly holdsConstraint: boolean;\n /**\n * Leaf-only custom_id rule: projects never carry one. Cleared on promote\n * (`parentMutationPipeline`), regenerated from the previous sibling on\n * demote (move/outdent handlers in `dispatch.ts`).\n */\n readonly carriesCustomId: boolean;\n /**\n * Duration the core forces on the type, or `null` when duration is free.\n * Milestones are pinned to 0 by `runUpdateActivityDuration`\n * (`internal/post-processors/runner.ts`) and by the duration-pipeline\n * type flip (`typeForNewDuration` in `transitions.ts`).\n */\n readonly forcedDuration: number | null;\n /**\n * Weight contributed under the DURATION ponderator criterion\n * (`recompute-ponderator-for-parent.ts`): leaves weigh their own\n * baseline duration, projects the recursive sum of their leaf\n * descendants' baselines, milestones weigh zero.\n */\n readonly ponderatorWeight: 'own-baseline' | 'recursive-leaf-sum' | 'zero';\n /**\n * Promotes to `'project'` when it gains its first child (DHTMLX\n * auto-promotion, owned by `buildParentMutations`). Milestones are\n * in-scope: legacy handled them via `adjustParentMilestone`; the core\n * owns the rule. Consumed via `isPromotableLeafType` so the create,\n * move and indent paths can never disagree on who promotes.\n */\n readonly promotesToProjectOnFirstChild: boolean;\n}\n\nexport const ACTIVITY_TYPE_BEHAVIOR = {\n project: {\n alwaysSummary: true,\n holdsConstraint: false,\n carriesCustomId: false,\n forcedDuration: null,\n ponderatorWeight: 'recursive-leaf-sum',\n promotesToProjectOnFirstChild: false\n },\n task: {\n alwaysSummary: false,\n holdsConstraint: true,\n carriesCustomId: true,\n forcedDuration: null,\n ponderatorWeight: 'own-baseline',\n promotesToProjectOnFirstChild: true\n },\n milestone: {\n alwaysSummary: false,\n holdsConstraint: true,\n carriesCustomId: true,\n forcedDuration: 0,\n ponderatorWeight: 'zero',\n promotesToProjectOnFirstChild: true\n }\n} as const satisfies Record<ActivityType, ActivityTypeBehavior>;\n\nexport function behaviorOf(type: ActivityType): ActivityTypeBehavior {\n return ACTIVITY_TYPE_BEHAVIOR[type];\n}\n","/**\n * Canonical type predicates — the single definition of \"summary\",\n * \"milestone (by type)\" and \"promotable leaf\". Every other layer\n * (columns, state, autoscheduler engine, dispatch) delegates here;\n * hand-rolling `type === 'project' || hasChildren` anywhere else is a\n * regression.\n *\n * Signatures take primitives (`type` + `hasChildren`) instead of an\n * activity shape because the callers live on three different snapshot\n * models (columns `ActivitySnapshot`, autoscheduler `ActivitySnapshot`,\n * raw `Activity`) that only share these facts. `type` is accepted as\n * `string | undefined` because adapter/fixture surfaces carry it untyped.\n */\n\nimport type { ActivityType } from '../types.js';\nimport { ACTIVITY_TYPE_BEHAVIOR } from './behavior.js';\n\nexport function isActivityType(value: unknown): value is ActivityType {\n return value === 'project' || value === 'task' || value === 'milestone';\n}\n\n/**\n * Summary = derived row: its dates/progress aggregate from children, the\n * scheduler skips it, and most columns are read-only on it. A `project`\n * is always a summary; a leaf type is a summary only while it has\n * children (transient state right before promote/demote settles it).\n */\nexport function isSummary(\n type: string | undefined,\n hasChildren: boolean\n): boolean {\n return (\n hasChildren ||\n (isActivityType(type) && ACTIVITY_TYPE_BEHAVIOR[type].alwaysSummary)\n );\n}\n\n/**\n * Milestone by TYPE — the canonical check. The legacy `duration === 0`\n * proxy survives only where DHTMLX parity demands it (snap-to-past in\n * `link-calculator.ts`) and in the columns predicate kept for the\n * boundary (`activityPredicates.isMilestone`); do not add new uses.\n */\nexport function isMilestoneType(type: string | undefined): boolean {\n return type === 'milestone';\n}\n\n/**\n * Leaf types that auto-promote to `'project'` on gaining their first\n * child (task AND milestone). Used by `buildParentMutations` and by the\n * create/move/indent dispatch paths — sharing this predicate is what\n * keeps the three paths from drifting.\n */\nexport function isPromotableLeafType(type: string | undefined): boolean {\n return (\n isActivityType(type) &&\n ACTIVITY_TYPE_BEHAVIOR[type].promotesToProjectOnFirstChild\n );\n}\n","/**\n * Type-transition rules — the full map of how an activity changes type:\n *\n * task ⇄ milestone duration edited to 0 / from 0 (`typeForNewDuration`,\n * consumed by `durationPipeline`)\n * task → project gains first child (promote — `buildParentMutations`,\n * milestone → project gated by `isPromotableLeafType`)\n * project → task loses last child (demote — `buildParentDemotionMutations`;\n * ALWAYS to task, never back to milestone)\n *\n * No other transition exists. Side effects of promote/demote (constraint\n * reset, custom_id clear/regen, progress reset, visual flags) stay owned\n * by `creation/parentMutationPipeline.ts` and\n * `internal/hierarchy/parent-demotion.ts`.\n */\n\nimport type { ActivityType } from '../types.js';\n\n/** Type assigned on promote (gaining the first child). */\nexport const PROMOTION_TARGET_TYPE = 'project' satisfies ActivityType;\n\n/**\n * Type assigned on demote (losing the last child). Always `'task'` — a\n * demoted parent never returns to `'milestone'`, even if it was one\n * before promotion (canonical rule, see `parent-demotion.ts` header and\n * the vault `RULE_promote_demote_2026-05-25.md`).\n */\nexport const DEMOTION_TARGET_TYPE = 'task' satisfies ActivityType;\n\n/**\n * task ⇄ milestone flip driven by the duration column (commit f49b116):\n * any activity whose duration becomes 0 turns `'milestone'`; a\n * zero-duration activity given positive duration turns `'task'`.\n * Returns `null` when the edit implies no type change.\n */\nexport function typeForNewDuration(\n currentDuration: number,\n newDuration: number\n): ActivityType | null {\n if (newDuration === 0) return 'milestone';\n if (currentDuration === 0 && newDuration > 0) return 'task';\n return null;\n}\n","import { isSummary as isSummaryByType } from '../../activity-types/index.js';\nimport { LINK_TYPE } from '../types.js';\nimport type { ActivityId, AutoSchedulerPort, LinkSnapshot } from '../types.js';\n\n/**\n * Expands links that connect to summary (parent/project) activities into\n * links to their leaf children.\n *\n * When a link points to/from a summary activity, DHTMLX internally creates\n * virtual links to each leaf child. Outbuild customizes this via\n * `getParentLinkedLinks`.\n *\n * Additionally, summary-to-summary links are SKIPPED entirely (matching\n * patchSummaryLinkExpansion.ts) because summary dates derive from children\n * and direct summary links produce no scheduling constraints.\n */\n\ntype LinksByActivity = Map<string, LinkSnapshot[]>;\n\nfunction isSummary(id: ActivityId, adapter: AutoSchedulerPort): boolean {\n const activity = adapter.getActivity(id);\n if (!activity) return false;\n return isSummaryByType(activity.type, adapter.getChildren(id).length > 0);\n}\n\n/**\n * Checks whether `childId` is a descendant of `ancestorId` (direct or nested).\n * Mirrors DHTMLX's `gantt.isChildOf`.\n */\nfunction isDescendantOf(\n childId: ActivityId,\n ancestorId: ActivityId,\n adapter: AutoSchedulerPort\n): boolean {\n const ancestor = String(ancestorId);\n let current = adapter.getActivity(childId);\n while (current?.parent && String(current.parent) !== '0') {\n if (String(current.parent) === ancestor) return true;\n current = adapter.getActivity(current.parent);\n }\n return false;\n}\n\n/**\n * Recursively collects all leaf (non-summary) descendants of a parent.\n */\nfunction getLeafDescendants(\n parentId: ActivityId,\n adapter: AutoSchedulerPort\n): ActivityId[] {\n const leaves: ActivityId[] = [];\n const stack: ActivityId[] = [parentId];\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n const children = adapter.getChildren(current);\n\n if (children.length === 0) {\n if (String(current) !== String(parentId)) {\n leaves.push(current);\n }\n continue;\n }\n\n for (const childId of children) {\n stack.push(childId);\n }\n }\n\n return leaves;\n}\n\n/**\n * Builds the source/target → links index once per `expandParentLinks` call.\n *\n * Previously `filterToChainEndpoints` rebuilt this Map on every invocation,\n * yielding quadratic cost when many summaries had to be filtered.\n */\nfunction buildLinksByActivity(links: LinkSnapshot[]): LinksByActivity {\n const index: LinksByActivity = new Map();\n for (const link of links) {\n appendToBucket(index, String(link.source), link);\n appendToBucket(index, String(link.target), link);\n }\n return index;\n}\n\nfunction appendToBucket(\n index: LinksByActivity,\n key: string,\n link: LinkSnapshot\n): void {\n const bucket = index.get(key);\n if (bucket) {\n bucket.push(link);\n return;\n }\n index.set(key, [link]);\n}\n\n/**\n * D7: Chain pruning (mirrors DHTMLX's `_getImplicitLinks` lines 25892-25902).\n *\n * When expanding a summary's leaves into virtual links, a leaf is skipped if\n * it belongs to a chain inside the same summary — only chain endpoints are\n * relevant for scheduling. A leaf is considered chain-interior when:\n * 1. It has at least one sibling link in the same parent\n * 2. The sibling link's lag is smaller than the sibling's duration\n * (indicating a normal chain link, not a skip / large-lag link)\n */\nfunction filterToChainEndpoints(\n leaves: ActivityId[],\n adapter: AutoSchedulerPort,\n linksByActivity: LinksByActivity\n): ActivityId[] {\n if (leaves.length <= 1) return leaves;\n\n const leafSet = new Set(leaves.map(String));\n const keptLeaves: ActivityId[] = [];\n\n for (const leafId of leaves) {\n if (!shouldSkipMidChainLeaf(leafId, leafSet, adapter, linksByActivity)) {\n keptLeaves.push(leafId);\n }\n }\n\n // Fallback: if pruning eliminated every leaf, keep all — matches DHTMLX\n // behaviour where at least the leaves themselves would still drive scheduling.\n return keptLeaves.length > 0 ? keptLeaves : leaves;\n}\n\nfunction shouldSkipMidChainLeaf(\n leafId: ActivityId,\n leafSet: Set<string>,\n adapter: AutoSchedulerPort,\n linksByActivity: LinksByActivity\n): boolean {\n const leafKey = String(leafId);\n const leafTask = adapter.getActivity(leafId);\n if (!leafTask) return false;\n if (leafTask.auto_scheduling === false) return false;\n\n const linksOnThis = linksByActivity.get(leafKey) ?? [];\n for (const siblingLink of linksOnThis) {\n if (isSelfLink(siblingLink)) continue;\n\n const otherId = otherEndOf(siblingLink, leafKey);\n if (!leafSet.has(String(otherId))) continue;\n\n const siblingTask = adapter.getActivity(otherId);\n if (!siblingTask) continue;\n if (siblingTask.auto_scheduling === false) continue;\n\n if (\n linkConnectsMidChain(siblingLink, leafId, leafTask, otherId, siblingTask)\n ) {\n return true;\n }\n }\n return false;\n}\n\nfunction isSelfLink(link: LinkSnapshot): boolean {\n return link.source === link.target;\n}\n\nfunction otherEndOf(link: LinkSnapshot, knownEndKey: string): ActivityId {\n return String(link.source) === knownEndKey ? link.target : link.source;\n}\n\nfunction linkConnectsMidChain(\n link: LinkSnapshot,\n leafId: ActivityId,\n leafTask: { duration: number },\n otherId: ActivityId,\n siblingTask: { duration: number }\n): boolean {\n const lag = link.lag ?? 0;\n const absLag = Math.abs(lag);\n if (link.target === leafId && absLag <= leafTask.duration) return true;\n if (link.target === otherId && absLag <= siblingTask.duration) return true;\n return false;\n}\n\n/**\n * Expands a set of links, replacing any link that touches a summary with\n * virtual links to the summary's leaf descendants.\n *\n * Returns a new array — the input is not mutated.\n */\nexport function expandParentLinks(\n links: LinkSnapshot[],\n adapter: AutoSchedulerPort\n): LinkSnapshot[] {\n const expanded: LinkSnapshot[] = [];\n const linksByActivity = buildLinksByActivity(links);\n let virtualIdCounter = 0;\n\n for (const link of links) {\n const sourceIsSummary = isSummary(link.source, adapter);\n const targetIsSummary = isSummary(link.target, adapter);\n\n if (sourceIsSummary && targetIsSummary) continue;\n\n if (\n (targetIsSummary && isDescendantOf(link.source, link.target, adapter)) ||\n (sourceIsSummary && isDescendantOf(link.target, link.source, adapter))\n ) {\n continue;\n }\n\n if (!sourceIsSummary && !targetIsSummary) {\n expanded.push(link);\n continue;\n }\n\n let sourceIds = sourceIsSummary\n ? getLeafDescendants(link.source, adapter)\n : [link.source];\n let targetIds = targetIsSummary\n ? getLeafDescendants(link.target, adapter)\n : [link.target];\n\n if (sourceIsSummary) {\n // GAP B fix: do NOT run chain pruning (filterToChainEndpoints) before\n // selecting the bound-defining leaf on the SOURCE side. Chain pruning is a\n // performance optimization only (vault `migration autoschedule/04 -\n // Divergence Analysis.md:51-55,137`), never a correctness mechanism — and\n // it can remove the latest-ending leaf when that leaf is mid-chain, so the\n // link would anchor on an earlier leaf. Selecting the bound-definer over\n // the FULL leaf set anchors on the leaf whose end_date defines the project\n // end, matching legacy getParentLinkedLinks (autoschedule/index.js, which\n // does NO pruning on this path). keepBoundDefiningLeaves collapses to ~1\n // leaf here, so skipping pruning has no perf or date downside.\n //\n // A link OUT of a summary is anchored at the summary's FINISH, which is\n // defined by the leaf(s) that end last. Only those drive the dependent.\n //\n // NOTE: the `startBound=false` (latest-ending) choice is correct for\n // FS/FF links out of a summary; SS/SF links semantically anchor on the\n // summary's START (earliest-starting leaf) and would need\n // `startBound=true`. That link-type asymmetry is a separate known gap and\n // is intentionally OUT OF SCOPE here.\n sourceIds = keepBoundDefiningLeaves(sourceIds, false, adapter);\n }\n if (targetIsSummary) {\n const chainEndpoints = filterToChainEndpoints(\n targetIds,\n adapter,\n linksByActivity\n );\n\n // FF/SF links into a summary constrain the summary's FINISH. Legacy\n // `_getImplicitLinks` (dhtmlxgantt.js:25868) expands such a link onto\n // EVERY surviving chain-START endpoint leaf and gives each a virtual lag\n // that preserves its offset from the summary's start, so the subtree's\n // internal positions are kept (`auto_scheduling_move_projects`). We model\n // that with precomputed lag components on the virtual links: `_targetLag`\n // carries the SUMMARY's duration (not the leaf's) and `_trueLag` carries\n // `userLag + off_tgt(leaf)`. The finish is reproduced by the summary's own\n // internal chain (head leaf → … → finish leaf), not by pinning the finish\n // leaf — so the finish-defining leaf, when it is mid-chain, is pruned and\n // carries NO virtual link (no off_tgt double-count). FS/SS keep the\n // single-leaf bound-defining path below.\n if (\n link.type === LINK_TYPE.FINISH_TO_FINISH ||\n link.type === LINK_TYPE.START_TO_FINISH\n ) {\n virtualIdCounter = pushOffsetPreservingLinks(\n expanded,\n sourceIds,\n chainEndpoints,\n link,\n link.target,\n adapter,\n virtualIdCounter\n );\n continue;\n }\n\n // FS/SS bind the summary's START → only the earliest-starting leaf is\n // constrained. An interior leaf that starts later is not constrained and\n // must not inherit the virtual link (otherwise an ASAP leaf with a later\n // stored start gets pulled early). Mirrors legacy getParentLinkedLinks.\n targetIds = keepBoundDefiningLeaves(chainEndpoints, true, adapter);\n }\n\n virtualIdCounter = pushExpandedLinks(\n expanded,\n sourceIds,\n targetIds,\n link,\n virtualIdCounter\n );\n }\n\n return expanded;\n}\n\n/**\n * Pushes one virtual link per chain-endpoint leaf for an FF/SF link INTO a\n * summary, with precomputed lag components that preserve each leaf's offset\n * from the summary's start.\n *\n * Per surviving leaf (legacy `_getImplicitLinks` + `_convertToFinishToStartLink`,\n * forward scheduling):\n * - `_targetLag = -summary.duration` (the SUMMARY's duration, not the leaf's;\n * converts \"constrain the summary finish\" into \"constrain this leaf's start\")\n * - `_trueLag = userLag + off_tgt` where\n * `off_tgt = calculateDuration({summaryStart → leaf.start})` measured on the\n * SOURCE (predecessor) calendar — legacy passes `task: source` (25834).\n * For a single linear chain the only surviving endpoint is the chain head,\n * whose `off_tgt` is 0.\n * - `_sourceLag = 0` (forward ⇒ no source offset)\n *\n * `summaryStart` is the summary's snapshot start_date, which equals the min leaf\n * start (the pre-schedule rollup) — matching legacy `getSubtaskDates(target).start`.\n */\nfunction pushOffsetPreservingLinks(\n expanded: LinkSnapshot[],\n sourceIds: ActivityId[],\n leafIds: ActivityId[],\n originalLink: LinkSnapshot,\n summaryId: ActivityId,\n adapter: AutoSchedulerPort,\n virtualIdCounter: number\n): number {\n const summary = adapter.getActivity(summaryId);\n const summaryStart = summary?.start_date;\n const summaryDuration = summary?.duration ?? 0;\n const userLag = originalLink.lag ?? 0;\n const source = adapter.getActivity(originalLink.source);\n\n let counter = virtualIdCounter;\n for (const srcId of sourceIds) {\n for (const tgtId of leafIds) {\n if (String(srcId) === String(tgtId)) continue;\n\n const leaf = adapter.getActivity(tgtId);\n const offTarget =\n summaryStart && leaf && source\n ? adapter.calculateDuration({\n start_date: summaryStart,\n end_date: leaf.start_date,\n task: source\n })\n : 0;\n\n expanded.push({\n id: `virtual_${originalLink.id}_${counter}`,\n source: srcId,\n target: tgtId,\n type: originalLink.type,\n lag: originalLink.lag,\n _sourceLag: 0,\n _targetLag: -summaryDuration,\n _trueLag: userLag + offTarget\n });\n counter += 1;\n }\n }\n return counter;\n}\n\n/**\n * Restricts a summary's expanded leaves to the one(s) that define its scheduling\n * bound: the EARLIEST-starting leaf for a link into the summary (`startBound`),\n * or the LATEST-ending leaf for a link out of it. Interior leaves that start\n * later / end earlier are not constrained by the summary-level link and must not\n * inherit the virtual link. Computed from the leaves' own snapshot dates (the\n * pre-schedule positions), independent of the summary's stored bound.\n */\nfunction keepBoundDefiningLeaves(\n leaves: ActivityId[],\n startBound: boolean,\n adapter: AutoSchedulerPort\n): ActivityId[] {\n if (leaves.length <= 1) return leaves;\n let best: number | null = null;\n for (const id of leaves) {\n const a = adapter.getActivity(id);\n const d = startBound ? a?.start_date : a?.end_date;\n if (!d) continue;\n const t = d.getTime();\n if (best === null) best = t;\n else if (startBound ? t < best : t > best) best = t;\n }\n if (best === null) return leaves;\n const kept = leaves.filter((id) => {\n const a = adapter.getActivity(id);\n const d = startBound ? a?.start_date : a?.end_date;\n return d != null && d.getTime() === best;\n });\n return kept.length > 0 ? kept : leaves;\n}\n\nfunction pushExpandedLinks(\n expanded: LinkSnapshot[],\n sourceIds: ActivityId[],\n targetIds: ActivityId[],\n originalLink: LinkSnapshot,\n virtualIdCounter: number\n): number {\n let counter = virtualIdCounter;\n for (const srcId of sourceIds) {\n for (const tgtId of targetIds) {\n if (String(srcId) === String(tgtId)) continue;\n expanded.push({\n id: `virtual_${originalLink.id}_${counter}`,\n source: srcId,\n target: tgtId,\n type: originalLink.type,\n lag: originalLink.lag\n });\n counter += 1;\n }\n }\n return counter;\n}\n","import type { AutoSchedulerPort, LinkSnapshot } from '../types.js';\nimport { expandParentLinks } from './parent-link-expansion.js';\n\n/**\n * Caches the output of `expandParentLinks(rawLinks, snapshot)` so that\n * dispatches with no structural mutation can skip the summary-to-leaf\n * expansion (which is quadratic on summary-heavy trees).\n *\n * Currently DISABLED: 3 fixture regressions in `59485-main-schedule` show\n * cascade behaviour diverging when the cache survives across inline edits\n * on `start_date` and `duration`. The legacy expansion appears to read\n * more activity state than the four documented dependencies (link\n * structure, parent structure, duration, auto_scheduling); until the\n * additional dependency is pinned down, `get` always recomputes.\n *\n * The class is kept (and wired into the scheduler + dispatch) so flipping\n * back to caching is a one-line change once the invalidation set is\n * complete. See AUDIT_2026-05-21_8agents_findings.md §1.3, §1.4.\n */\nexport class ExpandedLinksCache {\n invalidate(): void {\n // no-op while the cache is disabled\n }\n\n get(rawLinks: LinkSnapshot[], adapter: AutoSchedulerPort): LinkSnapshot[] {\n return expandParentLinks(rawLinks, adapter);\n }\n}\n","import { Queue } from '../../shared/queue.js';\nimport type { ActivityId, LinkId, LinkSnapshot } from '../types.js';\n\n// ---------------------------------------------------------------------------\n// Adjacency map builder\n// ---------------------------------------------------------------------------\n\nexport interface AdjacencyMap {\n /** link IDs keyed by activity ID (both directions) */\n neighbors: Map<ActivityId, Set<LinkId>>;\n}\n\nexport function buildAdjacencyMap(links: LinkSnapshot[]): AdjacencyMap {\n const neighbors = new Map<ActivityId, Set<LinkId>>();\n\n const ensureSet = (id: ActivityId) => {\n if (!neighbors.has(id)) neighbors.set(id, new Set());\n return neighbors.get(id)!;\n };\n\n for (const link of links) {\n ensureSet(link.source).add(link.id);\n ensureSet(link.target).add(link.id);\n }\n\n return { neighbors };\n}\n\n// ---------------------------------------------------------------------------\n// BFS to collect all links in a connected component\n// ---------------------------------------------------------------------------\n\nexport function bfsCollectLinks(\n rootId: ActivityId,\n links: Map<LinkId, LinkSnapshot>,\n adjacency: AdjacencyMap\n): LinkSnapshot[] {\n const visited = new Set<string>();\n const collected = new Map<string, LinkSnapshot>();\n const queue = new Queue<ActivityId>();\n queue.enqueue(rootId);\n\n while (!queue.isEmpty()) {\n const current = queue.dequeue()!;\n const key = String(current);\n if (visited.has(key)) continue;\n visited.add(key);\n\n const neighborLinkIds = adjacency.neighbors.get(current);\n if (!neighborLinkIds) continue;\n\n for (const linkId of neighborLinkIds) {\n const link = links.get(linkId);\n if (!link) continue;\n\n const hashKey = `${link.source}-${link.target}-${link.type}`;\n if (!collected.has(hashKey)) {\n collected.set(hashKey, link);\n }\n\n const neighbor = String(link.source) === key ? link.target : link.source;\n if (!visited.has(String(neighbor))) {\n queue.enqueue(neighbor);\n }\n }\n }\n\n return Array.from(collected.values());\n}\n\n// ---------------------------------------------------------------------------\n// Find the connected component containing a specific trigger activity\n// ---------------------------------------------------------------------------\n\nexport interface TriggerGroup {\n /** All activity IDs in the connected component (including the trigger) */\n activityIds: Set<string>;\n /** All links in the connected component */\n links: LinkSnapshot[];\n}\n\n/**\n * Finds the connected component containing `triggerId`.\n *\n * Mirrors DHTMLX's `connectedGroups.getConnectedGroupRelations(id)` which\n * BFS-walks the dependency graph from `id` through all links to collect only\n * the activities and links in the same connected component.\n *\n * When `triggerId` is not part of any link, returns a group with just the\n * trigger itself (so constraints on isolated activities still get processed).\n */\nexport function findConnectedGroupForTrigger(\n triggerId: ActivityId,\n links: LinkSnapshot[]\n): TriggerGroup {\n const linkMap = new Map<LinkId, LinkSnapshot>();\n for (const link of links) linkMap.set(link.id, link);\n\n const adjacency = buildAdjacencyMap(links);\n const groupLinks = bfsCollectLinks(triggerId, linkMap, adjacency);\n\n const activityIds = new Set<string>([String(triggerId)]);\n for (const link of groupLinks) {\n activityIds.add(String(link.source));\n activityIds.add(String(link.target));\n }\n\n return { activityIds, links: groupLinks };\n}\n","/**\n * Progress completion vocabulary — genuine cross-component primitive\n * (autoscheduler engine skips completed activities; column pipelines and\n * predicates compare against it). Comparison sites only — the /100 percent\n * divisors are a DIFFERENT concept and stay untouched.\n */\nexport const COMPLETED_PROGRESS = 100;\n","import { LINK_TYPE } from '../constants.js';\nimport type {\n EngineActivitySnapshot,\n AutoSchedulerPort,\n LinkSnapshot\n} from '../types.js';\n\n/**\n * Computed successor start date from a single predecessor link.\n */\nexport interface LinkDateResult {\n /** The computed start date for the successor */\n successorStart: Date;\n /** The link that produced this result */\n link: LinkSnapshot;\n}\n\n/**\n * Normalized link components (mirrors DHTMLX's _convertToFinishToStartLink).\n *\n * All link types are conceptually converted to FS by decomposing the lag\n * into three parts that are each applied on a specific calendar:\n *\n * successorStart = snap(predecessor.end_date, baseTask)\n * + sourceLag (on predecessor calendar)\n * + targetLag (on successor calendar)\n * + trueLag (on successor calendar)\n *\n * where `baseTask` depends on link type:\n * - FS links: baseTask = successor (snap on successor calendar)\n * - SS/FF/SF: baseTask = predecessor (snap on predecessor calendar)\n *\n * For FS links, all three lag components are zero except trueLag = user lag.\n * For SS: sourceLag = -predecessor.duration\n * For FF: targetLag = -successor.duration\n * For SF: sourceLag = -predecessor.duration, targetLag = -successor.duration\n *\n * This matches DHTMLX's CORE-169 rewrite (calculateSuccessorStartWithLag).\n */\ninterface NormalizedLink {\n sourceLag: number;\n targetLag: number;\n trueLag: number;\n isFS: boolean;\n isFF: boolean;\n isZeroDurationCase: boolean;\n}\n\nfunction normalize(\n predecessor: EngineActivitySnapshot,\n successor: EngineActivitySnapshot,\n link: LinkSnapshot\n): NormalizedLink {\n const isFS = link.type === LINK_TYPE.FINISH_TO_START;\n const isFF = link.type === LINK_TYPE.FINISH_TO_FINISH;\n\n // Virtual summary-expanded link with precomputed lag components: use them\n // verbatim. This single additive check lets an FF/SF link INTO a summary\n // carry the SUMMARY's duration (not the leaf's) and the leaf's offset from\n // the summary start, computed once at expansion time. The `isFS`/`isFF`\n // flags still come from `link.type` (kept on the virtual link), so the\n // calendar-selection and zero-duration branches downstream are unchanged.\n // Every non-virtual link skips this and hits the fast path below.\n if (link._targetLag !== undefined) {\n return {\n sourceLag: link._sourceLag ?? 0,\n targetLag: link._targetLag,\n trueLag: link._trueLag ?? link.lag ?? 0,\n isFS,\n isFF,\n isZeroDurationCase: false\n };\n }\n\n const trueLag = link.lag ?? 0;\n\n switch (link.type) {\n case LINK_TYPE.FINISH_TO_START:\n return {\n sourceLag: 0,\n targetLag: 0,\n trueLag,\n isFS,\n isFF,\n isZeroDurationCase: false\n };\n case LINK_TYPE.START_TO_START:\n return {\n sourceLag: -predecessor.duration,\n targetLag: 0,\n trueLag,\n isFS,\n isFF,\n isZeroDurationCase: false\n };\n case LINK_TYPE.FINISH_TO_FINISH:\n return {\n sourceLag: 0,\n targetLag: -successor.duration,\n trueLag,\n isFS,\n isFF,\n isZeroDurationCase: false\n };\n case LINK_TYPE.START_TO_FINISH:\n return {\n sourceLag: -predecessor.duration,\n targetLag: -successor.duration,\n trueLag,\n isFS,\n isFF,\n isZeroDurationCase: false\n };\n default:\n return {\n sourceLag: 0,\n targetLag: 0,\n trueLag,\n isFS,\n isFF,\n isZeroDurationCase: false\n };\n }\n}\n\n/**\n * Calculates the successor's start date from a single predecessor link.\n *\n * Mirrors DHTMLX's CORE-169 getEarliestStartDate exactly:\n *\n * - Has lag path (calculateSuccessorStartWithLag):\n * 1. Snap predEnd with baseTask calendar (successor for FS, predecessor otherwise)\n * 2. Add sourceLag on predecessor calendar\n * 3. Add targetLag on successor calendar\n * 4. Add trueLag on successor calendar\n *\n * - No lag path (calculateSuccessorStartWithoutLag):\n * - If successor.duration === 0 AND (FF or FS): snap to PAST on successor calendar\n * - Else: snap to FUTURE on successor calendar\n */\nexport function calculateSuccessorStartFromLink(\n predecessor: EngineActivitySnapshot,\n successor: EngineActivitySnapshot,\n link: LinkSnapshot,\n adapter: AutoSchedulerPort\n): LinkDateResult {\n const { sourceLag, targetLag, trueLag, isFS, isFF } = normalize(\n predecessor,\n successor,\n link\n );\n\n // DHTMLX \"hasLag\" test: any non-zero lag component triggers the lag path.\n // Note: DHTMLX originally checks `relation.lag` (the total) which for\n // SS/FF/SF is never zero even without user lag (because sourceLag/targetLag\n // are negative durations). So SS/FF/SF ALWAYS take the lag path.\n const hasLag = sourceLag !== 0 || targetLag !== 0 || trueLag !== 0;\n\n if (!hasLag) {\n // No-lag path: FS with lag=0\n const isFForFS = isFS || isFF;\n if (successor.duration === 0 && isFForFS) {\n // Zero-duration successor (milestone) with FF/FS → snap to PAST\n return {\n successorStart: adapter.getClosestWorkTime({\n date: predecessor.end_date,\n dir: 'past',\n task: successor\n }),\n link\n };\n }\n return {\n successorStart: adapter.getClosestWorkTime({\n date: predecessor.end_date,\n dir: 'future',\n task: successor\n }),\n link\n };\n }\n\n // Lag path: snap predEnd on baseTask calendar.\n // For FS: baseTask = successor. For SS/FF/SF: baseTask = predecessor.\n const baseTask = isFS ? successor : predecessor;\n let date = adapter.getClosestWorkTime({\n date: predecessor.end_date,\n dir: 'future',\n task: baseTask\n });\n\n if (sourceLag !== 0) {\n date = adapter.calculateEndDate({\n start_date: date,\n duration: sourceLag,\n task: predecessor // sourceLag always on predecessor calendar\n });\n }\n\n if (targetLag !== 0) {\n date = adapter.calculateEndDate({\n start_date: date,\n duration: targetLag,\n task: successor // targetLag always on successor calendar\n });\n }\n\n if (trueLag !== 0) {\n date = adapter.calculateEndDate({\n start_date: date,\n duration: trueLag,\n task: successor // trueLag always on successor calendar\n });\n }\n\n // Zero-duration successors (milestones): the legacy decides the snap by the\n // driving link type (DHTMLX adjustForMilestone, BUGS_milestones MIL-B6).\n // - FS/FF → anchor at the predecessor's finish instant: snap PAST (a lag\n // landing on shift_end stays there instead of rolling to the next day).\n // - SS/SF → discard the time-of-day and snap to the day's shift_start:\n // zero to the candidate day's UTC midnight, then snap FUTURE.\n // Non-zero successors must start on a workable instant → snap FUTURE.\n if (successor.duration === 0) {\n if (isFS || isFF) {\n return {\n successorStart: adapter.getClosestWorkTime({\n date,\n dir: 'past',\n task: successor\n }),\n link\n };\n }\n const dayStart = new Date(\n Date.UTC(date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate())\n );\n return {\n successorStart: adapter.getClosestWorkTime({\n date: dayStart,\n dir: 'future',\n task: successor\n }),\n link\n };\n }\n\n // Snap forward to the successor calendar's next working start. If the lag\n // sums up to exactly the shift_end of a working day, the activity should\n // start the NEXT working day (no activity ever starts at shift_end —\n // that's the boundary where the working day ends). Idempotent when `date`\n // already falls on a working start. See:\n // pp2-schedule/newPlanSchedule/RULE_link_lag_snap_to_next_work_start.md\n return {\n successorStart: adapter.getClosestWorkTime({\n date,\n dir: 'future',\n task: successor\n }),\n link\n };\n}\n\n/**\n * Calculates the latest predecessor end date from a single successor link.\n * Used in the backward (ALAP) pass.\n *\n * Applies the lag decomposition in reverse:\n * predecessorEnd = snap(successor.start_date, past)\n * - trueLag (on successor calendar)\n * - targetLag (on successor calendar)\n * - sourceLag (on predecessor calendar)\n */\nexport function calculatePredecessorEndFromLink(\n successor: EngineActivitySnapshot,\n predecessor: EngineActivitySnapshot,\n link: LinkSnapshot,\n adapter: AutoSchedulerPort\n): Date {\n const { sourceLag, targetLag, trueLag } = normalize(\n predecessor,\n successor,\n link\n );\n\n // Start from successor's start date, snapped backward on successor calendar\n let date = adapter.getClosestWorkTime({\n date: successor.start_date,\n dir: 'past',\n task: successor\n });\n\n if (trueLag !== 0) {\n date = adapter.calculateEndDate({\n start_date: date,\n duration: -trueLag,\n task: successor\n });\n }\n\n if (targetLag !== 0) {\n date = adapter.calculateEndDate({\n start_date: date,\n duration: -targetLag,\n task: successor\n });\n }\n\n if (sourceLag !== 0) {\n date = adapter.calculateEndDate({\n start_date: date,\n duration: -sourceLag,\n task: predecessor\n });\n }\n\n return date;\n}\n","import { CONSTRAINT_TYPE } from '../constants.js';\nimport type {\n ActivityId,\n EngineActivitySnapshot,\n AutoSchedulerPort,\n SchedulePlan\n} from '../types.js';\nimport {\n clampStartToBounds,\n computeConstraintBounds,\n isStartWithinBounds,\n type ConstraintBounds\n} from '../../constraints/index.js';\n\n/**\n * processConstraints — pre-pass that seeds the plans Map with each\n * activity's constraint boundaries.\n *\n * For every activity with a non-ASAP/non-ALAP constraint, computes the four\n * boundary dates (earliest/latest × start/end) using the canonical\n * `computeConstraintBounds()` from `src/constraints`. The ASAP and ALAP\n * passes later consult these boundaries via `limitPlanDates()` to decide\n * what dates are admissible for each activity.\n *\n * Activities without a constraint (or with ASAP/ALAP) are skipped — they\n * carry no boundary pressure and the autoscheduler is free to place them\n * wherever links and the calendar suggest.\n */\nexport function processConstraints(\n activityIds: ActivityId[],\n adapter: AutoSchedulerPort,\n plans: Map<ActivityId, SchedulePlan>\n): void {\n for (const id of activityIds) {\n const activity = adapter.getActivity(id);\n if (!activity) continue;\n\n const type = activity.constraint_type;\n if (\n !type ||\n type === CONSTRAINT_TYPE.ASAP ||\n type === CONSTRAINT_TYPE.ALAP\n ) {\n continue;\n }\n\n const bounds = computeConstraintBounds(activity, adapter);\n // No usable bounds (no constraint_date, unknown type, etc.)\n if (\n !bounds.earliestStart &&\n !bounds.latestStart &&\n !bounds.earliestEnd &&\n !bounds.latestEnd\n ) {\n continue;\n }\n\n plans.set(id, {\n activityId: id,\n start_date: activity.start_date,\n end_date: activity.end_date,\n drivingLinkId: null,\n kind: 'asap',\n conflict: false,\n earliestStart: bounds.earliestStart,\n latestStart: bounds.latestStart,\n earliestEnd: bounds.earliestEnd,\n latestEnd: bounds.latestEnd\n });\n }\n}\n\n/**\n * limitPlanDates — decides the final scheduled `start_date` for an activity\n * by combining its constraint admissible range with any link-derived\n * cascade pressure.\n *\n * Domain invariant\n * ────────────────\n * The autoscheduler never produces a `start_date` that violates the\n * activity's own constraint. The admissible range comes from\n * `[earliestStart, latestStart]` (computed by `processConstraints` from the\n * activity's constraint type + date):\n *\n * - SNET / FNET → `earliestStart` set (open ceiling)\n * - SNLT / FNLT → `latestStart` set (open floor)\n * - MSO / MFO → both pinned to the same date (single point)\n * - ASAP / ALAP / no constraint → both null (any date admissible)\n *\n * Decision (matches legacy DHTMLX clamp-to-boundary):\n *\n * 1. If there is NO link cascade pressing on this activity, the\n * autoscheduler leaves it at its snapshot position — but still clamps\n * it back inside the admissible range if the snapshot is stale and\n * already out of bounds.\n * 2. If a link cascade proposes a `linkCandidate`:\n * a. If the candidate is inside `[earliestStart, latestStart]`, apply\n * it directly.\n * b. If the candidate is outside, the activity moves to the boundary\n * of the range nearest to the candidate (`clampStartToBounds`).\n * The activity gets as close as the constraint allows but never\n * past it.\n *\n * Downstream cascade follows naturally: each successor reads this\n * activity's final plan dates and computes its own from there. If this\n * activity ends up at a constraint boundary, the link upstream is left\n * \"stretched\" (the predecessor may finish well after this activity\n * starts) — that's the visible signal that the constraint blocked the\n * cascade.\n */\nexport function limitPlanDates(\n activity: EngineActivitySnapshot,\n plan: SchedulePlan,\n adapter: AutoSchedulerPort\n): void {\n const bounds: ConstraintBounds = {\n earliestStart: plan.earliestStart ?? null,\n latestStart: plan.latestStart ?? null,\n earliestEnd: plan.earliestEnd ?? null,\n latestEnd: plan.latestEnd ?? null\n };\n\n // A link \"candidate\" is the date some link (predecessor or successor)\n // would have this activity start at. The ASAP pass seeds this in\n // `earliestSchedulingStart`; the ALAP pass seeds it in\n // `latestSchedulingStart`. Only one of the two is set per pass.\n const linkCandidate =\n plan.earliestSchedulingStart ?? plan.latestSchedulingStart ?? null;\n\n let resolvedStart: Date;\n\n if (linkCandidate === null) {\n // No link pressure. Keep the snapshot — only clamp back into range\n // if the snapshot itself was out of bounds (defensive).\n resolvedStart = clampStartToBounds(activity.start_date, bounds);\n } else if (isStartWithinBounds(linkCandidate, bounds)) {\n // Link candidate respects the constraint → apply.\n resolvedStart = linkCandidate;\n } else {\n // Link candidate violates the constraint → go to the nearest\n // admissible boundary instead of leaving the activity at its snapshot.\n // This matches legacy DHTMLX semantics: the constraint acts as a hard\n // wall and the activity is pushed against it.\n resolvedStart = clampStartToBounds(linkCandidate, bounds);\n }\n\n plan.start_date = resolvedStart;\n plan.end_date = adapter.calculateEndDate({\n start_date: resolvedStart,\n duration: activity.duration,\n task: activity\n });\n}\n\n/**\n * Validates a milestone's date against its constraint.\n *\n * Mirrors the legacy logic in events/utils/constraintValidationsForDrag.js.\n * Called during the ASAP pass when the activity is a milestone, before the\n * general `limitPlanDates` clamping runs.\n */\nexport function validateMilestoneConstraint(\n activity: EngineActivitySnapshot,\n successorStart: Date\n): Date {\n if (!activity || !successorStart) return new Date();\n\n const { constraint_type: constraintType, constraint_date: constraintDate } =\n activity;\n if (!constraintType || !constraintDate) return successorStart;\n\n switch (constraintType) {\n case CONSTRAINT_TYPE.MSO:\n case CONSTRAINT_TYPE.MFO:\n return new Date(constraintDate);\n\n case CONSTRAINT_TYPE.SNET:\n case CONSTRAINT_TYPE.FNET:\n return constraintDate > successorStart\n ? new Date(constraintDate)\n : successorStart;\n\n case CONSTRAINT_TYPE.SNLT:\n case CONSTRAINT_TYPE.FNLT:\n return constraintDate < successorStart\n ? new Date(constraintDate)\n : successorStart;\n\n default:\n return successorStart;\n }\n}\n","import type {\n ActivityId,\n EngineActivitySnapshot,\n ScheduleFlags\n} from '../types.js';\n\n/**\n * Multi-drag awareness for predecessor end date calculation.\n *\n * When multiple activities are being dragged simultaneously, and the\n * predecessor is also in the dragged set, we use the predecessor's\n * CURRENT start_date instead of recalculating from its own predecessors.\n * This preserves relative positions during multi-drag.\n *\n * Absorbs logic from the CORE-169 getSuccessorStartDate rewrite:\n * isDraggingAllLinkedTasks + getPredecessorEndDateConditionally.\n */\n\n/**\n * Returns true when a specific predecessor is part of the currently\n * dragged set of activities.\n */\nexport function isPredecessorBeingDragged(\n predecessorId: ActivityId,\n draggedIds: ActivityId[]\n): boolean {\n if (!draggedIds.length) return false;\n return draggedIds.some((id) => String(id) === String(predecessorId));\n}\n\n/**\n * Determines the effective predecessor end date during multi-drag.\n *\n * - If the predecessor IS being dragged together → use its current dates\n * (they move together, so no recalculation needed)\n * - If the predecessor is NOT being dragged → use its scheduled end_date\n * (normal behavior)\n */\nexport function getEffectivePredecessorDates(\n predecessor: EngineActivitySnapshot,\n flags: ScheduleFlags,\n draggedIds: ActivityId[]\n): { start_date: Date; end_date: Date } {\n if (\n flags.dragWithMultiple &&\n predecessor.dragged &&\n isPredecessorBeingDragged(predecessor.id, draggedIds)\n ) {\n // Both are moving together → keep current dates\n return {\n start_date: predecessor.start_date,\n end_date: predecessor.end_date\n };\n }\n\n // Normal: use the (possibly recalculated) dates\n return {\n start_date: predecessor.start_date,\n end_date: predecessor.end_date\n };\n}\n\n/**\n * Determines whether lag calculations should be skipped during multi-drag.\n * When dragging multiple activities together, lag between them is\n * preserved implicitly by not recalculating.\n */\nexport function shouldSkipLagForMultiDrag(\n predecessorId: ActivityId,\n flags: ScheduleFlags,\n draggedIds: ActivityId[]\n): boolean {\n return (\n flags.dragWithMultiple &&\n isPredecessorBeingDragged(predecessorId, draggedIds)\n );\n}\n","import { isSummary } from '../../activity-types/index.js';\nimport { COMPLETED_PROGRESS } from '../../constants/progress.js';\nimport type {\n ActivityId,\n EngineActivitySnapshot,\n AutoSchedulerPort,\n IsCurrent,\n LinkSnapshot,\n ScheduleOptions,\n SchedulePlan\n} from '../types.js';\nimport { ACTIVITY_TYPE, CONSTRAINT_TYPE } from '../constants.js';\nimport { calculateSuccessorStartFromLink } from './link-calculator.js';\nimport {\n limitPlanDates,\n validateMilestoneConstraint\n} from './constraint-resolver.js';\nimport {\n getEffectivePredecessorDates,\n shouldSkipLagForMultiDrag\n} from './multi-drag.js';\nimport { yieldIfNeeded } from '../utils/timing.js';\n\n/**\n * ASAP Forward Pass\n *\n * Processes activities in topological order (predecessors first).\n * For each activity, computes the earliest possible start date\n * considering all incoming links, constraints, multi-drag state,\n * and milestone-specific rules.\n *\n * D3+D4: expects `plans` Map to be pre-seeded by `processConstraints`\n * with constraint boundaries (earliestStart/latestStart/etc). Uses\n * `limitPlanDates` to clamp the link-derived date against all boundaries.\n *\n * D2: processes activities without predecessors as well, so constraints\n * and project_start floor can still apply.\n */\nexport async function asapPass(\n orderedIds: ActivityId[],\n links: LinkSnapshot[],\n adapter: AutoSchedulerPort,\n options: ScheduleOptions,\n isCurrent: IsCurrent,\n plans: Map<ActivityId, SchedulePlan>\n): Promise<Map<ActivityId, SchedulePlan>> {\n // Build link index: target → incoming links\n const incomingLinks = new Map<string, LinkSnapshot[]>();\n for (const link of links) {\n const key = String(link.target);\n if (!incomingLinks.has(key)) incomingLinks.set(key, []);\n incomingLinks.get(key)!.push(link);\n }\n\n // Helper: resolve dates from plan (if scheduled) or snapshot\n const getActivityDates = (\n id: ActivityId\n ): { start_date: Date; end_date: Date } => {\n const plan = plans.get(id);\n if (plan?.start_date && plan.end_date) {\n return { start_date: plan.start_date, end_date: plan.end_date };\n }\n const snap = adapter.getActivity(id);\n if (snap) return { start_date: snap.start_date, end_date: snap.end_date };\n return { start_date: new Date(), end_date: new Date() };\n };\n\n const flags = adapter.getFlags();\n const draggedIds = options.draggedIds ?? [];\n let sliceStart = performance.now();\n\n for (const activityId of orderedIds) {\n const yieldResult = await yieldIfNeeded(sliceStart, isCurrent);\n if (yieldResult.aborted) return plans;\n sliceStart = yieldResult.newSliceStart;\n\n const activity = adapter.getActivity(activityId);\n if (!activity) continue;\n\n // Skip conditions\n if (!activity.auto_scheduling) continue;\n if (activity.progress === COMPLETED_PROGRESS) continue;\n if (isSummaryActivity(activity, adapter)) continue;\n\n // Collect incoming links for this activity\n const incoming = incomingLinks.get(String(activityId)) ?? [];\n\n // Calculate earliest start from predecessors\n let maxStart: Date | null = null;\n let drivingLinkId: ActivityId | null = null;\n\n for (const link of incoming) {\n const predecessorSnap = adapter.getActivity(link.source);\n if (!predecessorSnap) continue;\n\n // Use already-scheduled dates if predecessor was processed\n const predDates = getActivityDates(link.source);\n const effectivePred: EngineActivitySnapshot = {\n ...predecessorSnap,\n start_date: predDates.start_date,\n end_date: predDates.end_date\n };\n\n // Multi-drag: if predecessor is also being dragged, use its current dates\n const multiDragDates = getEffectivePredecessorDates(\n effectivePred,\n flags,\n draggedIds\n );\n const adjustedPred: EngineActivitySnapshot = {\n ...effectivePred,\n start_date: multiDragDates.start_date,\n end_date: multiDragDates.end_date\n };\n\n // Skip lag for multi-drag when predecessor is in the dragged set\n const effectiveLink = shouldSkipLagForMultiDrag(\n link.source,\n flags,\n draggedIds\n )\n ? { ...link, lag: 0 }\n : link;\n\n const result = calculateSuccessorStartFromLink(\n adjustedPred,\n activity,\n effectiveLink,\n adapter\n );\n\n if (!maxStart || result.successorStart > maxStart) {\n maxStart = result.successorStart;\n drivingLinkId = String(link.id);\n }\n }\n\n // Retrieve existing plan (pre-seeded by processConstraints if there's a\n // non-ASAP constraint) or create a fresh one.\n const existing = plans.get(activityId);\n const plan: SchedulePlan = existing\n ? { ...existing }\n : {\n activityId,\n start_date: activity.start_date,\n end_date: activity.end_date,\n drivingLinkId: null,\n kind: 'asap',\n conflict: false\n };\n\n // No link-derived start and no constraints to process → keep current\n const hasConstraintBounds =\n plan.earliestStart ||\n plan.latestStart ||\n plan.earliestEnd ||\n plan.latestEnd;\n\n if (!maxStart && !hasConstraintBounds) {\n continue;\n }\n\n // Seed link-derived start/end into the plan\n if (maxStart) {\n // Milestone constraint validation (applies milestone-specific\n // logic before general constraint clamping).\n let linkStart = maxStart;\n if (activity.type === ACTIVITY_TYPE.MILESTONE) {\n // The link-derived snap direction is already decided by\n // calculateSuccessorStartFromLink: PAST for a zero-duration FS/FF\n // successor (it sits at the predecessor's finish instant, e.g.\n // shift_end 16:00) and FUTURE otherwise. validateMilestoneConstraint\n // only clamps to a (work-aligned) constraint_date. Re-snapping to\n // 'future' here would OVERRIDE the correct PAST snap and push an\n // FS/FF milestone to the next working day's shift_start — diverging\n // from the legacy (DHTMLX adjustForMilestone keeps it at the\n // predecessor's finish). See BUGS_milestones MIL-B6.\n linkStart = validateMilestoneConstraint(activity, maxStart);\n }\n\n plan.drivingLinkId = drivingLinkId;\n plan.start_date = linkStart;\n plan.end_date = adapter.calculateEndDate({\n start_date: linkStart,\n duration: activity.duration,\n task: activity\n });\n\n // D3/D4: expose the link-derived date as earliestSchedulingStart so\n // limitPlanDates can use it to override constraint clamps.\n plan.earliestSchedulingStart = linkStart;\n plan.earliestSchedulingEnd = plan.end_date;\n } else if (activity.constraint_type === CONSTRAINT_TYPE.MSO) {\n // MSO with no predecessors: anchor at latest/earliestStart (same value)\n if (plan.earliestStart) {\n plan.start_date = plan.earliestStart;\n plan.end_date =\n plan.earliestEnd ??\n adapter.calculateEndDate({\n start_date: plan.earliestStart,\n duration: activity.duration,\n task: activity\n });\n }\n } else if (activity.constraint_type === CONSTRAINT_TYPE.MFO) {\n if (plan.latestStart) {\n plan.start_date = plan.latestStart;\n plan.end_date =\n plan.latestEnd ??\n adapter.calculateEndDate({\n start_date: plan.latestStart,\n duration: activity.duration,\n task: activity\n });\n }\n }\n\n // D3/D4: clamp against all four boundary layers (constraints + scheduling).\n limitPlanDates(activity, plan, adapter);\n\n // Store the plan (even if dates didn't change — plan carries constraint\n // boundaries for downstream successors and for the diff phase).\n plans.set(activityId, plan);\n }\n\n return plans;\n}\n\nfunction isSummaryActivity(\n activity: EngineActivitySnapshot,\n adapter: AutoSchedulerPort\n): boolean {\n return isSummary(activity.type, adapter.getChildren(activity.id).length > 0);\n}\n","/**\n * Root-parent sentinel — single source of truth.\n *\n * Root-level activities have meant \"root\" under several shapes across the\n * codebase and the recorded data: string `'0'` (post-parse domain model),\n * numeric `0` (DHTMLX / engine seam), and nullish. `isRootParent` accepts\n * all of them; `normalizeParentKey` collapses them to the canonical `'0'`.\n *\n * NOTE: `'0'` is overloaded elsewhere in the domain (FS link-type code,\n * correlative ids). These constants are ONLY for the parent axis.\n */\n\n/** Canonical root-parent id in the post-parse domain model. */\nexport const ROOT_PARENT_ID = '0' as const;\n\n/** Backend correlative of the synthetic root project. */\nexport const ROOT_PROJECT_CORRELATIVE_ID = 0 as const;\n\n/** True when `parent` denotes the root level, under any historical shape. */\nexport function isRootParent(parent: unknown): boolean {\n return parent == null || parent === 0 || parent === ROOT_PARENT_ID;\n}\n\n/** Collapse any root shape to the canonical `'0'`; stringify the rest. */\nexport function normalizeParentKey(parent: unknown): string {\n return isRootParent(parent) ? ROOT_PARENT_ID : String(parent);\n}\n","import { isSummary } from '../../activity-types/index.js';\nimport { COMPLETED_PROGRESS } from '../../constants/progress.js';\nimport type {\n ActivityId,\n EngineActivitySnapshot,\n AutoSchedulerPort,\n IsCurrent,\n LinkSnapshot,\n ScheduleOptions,\n SchedulePlan\n} from '../types.js';\nimport { CONSTRAINT_TYPE, LINK_TYPE } from '../constants.js';\nimport { isRootParent } from '../../internal/hierarchy/root-parent.js';\nimport { calculatePredecessorEndFromLink } from './link-calculator.js';\nimport { limitPlanDates } from './constraint-resolver.js';\nimport { yieldIfNeeded } from '../utils/timing.js';\n\n/**\n * ALAP Backward Pass\n *\n * Processes ALAP-constrained activities in reverse topological order.\n * Each ALAP activity is pushed as late as possible within its parent's\n * end date boundary (NOT the project end — this is the key Outbuild\n * custom behavior).\n *\n * Key differences from vanilla DHTMLX:\n * - Boundary = parent.end_date (not gantt.config.project_end)\n * - Links with negative lag are skipped\n * - Predecessor end is clamped to parent boundary\n */\nexport async function alapPass(\n reversedIds: ActivityId[],\n links: LinkSnapshot[],\n asapPlans: Map<ActivityId, SchedulePlan>,\n adapter: AutoSchedulerPort,\n // NOTE: the ALAP pass currently ignores `options` (e.g. draggedIds) that\n // the ASAP pass honors — possible asymmetry, tracked separately.\n _options: ScheduleOptions,\n isCurrent: IsCurrent\n): Promise<Map<ActivityId, SchedulePlan>> {\n const plans = new Map<ActivityId, SchedulePlan>(asapPlans);\n\n // Find all ALAP activities\n const allActivities = adapter.getAllActivities();\n const activityCount = allActivities.length;\n const alapActivityIds: ActivityId[] = [];\n for (const activity of allActivities) {\n if (activity.constraint_type === CONSTRAINT_TYPE.ALAP) {\n alapActivityIds.push(activity.id);\n }\n }\n\n if (alapActivityIds.length === 0) return plans;\n\n // Build outgoing links index: source → links going out\n const outgoingLinks = new Map<string, LinkSnapshot[]>();\n // Build incoming links index: target → links coming in. Used to determine a\n // milestone's kind (FS/FF-successor = finish marker; SS/SF = start marker).\n const incomingLinks = new Map<string, LinkSnapshot[]>();\n for (const link of links) {\n const sKey = String(link.source);\n if (!outgoingLinks.has(sKey)) outgoingLinks.set(sKey, []);\n outgoingLinks.get(sKey)!.push(link);\n const tKey = String(link.target);\n if (!incomingLinks.has(tKey)) incomingLinks.set(tKey, []);\n incomingLinks.get(tKey)!.push(link);\n }\n\n // Helper: get the current computed dates (from plans or adapter)\n const getActivityDates = (\n id: ActivityId\n ): { start_date: Date; end_date: Date } => {\n const plan = plans.get(id);\n if (plan) return { start_date: plan.start_date, end_date: plan.end_date };\n const snap = adapter.getActivity(id);\n if (snap) return { start_date: snap.start_date, end_date: snap.end_date };\n return { start_date: new Date(), end_date: new Date() };\n };\n\n // Helper: get parent end date (the ALAP boundary)\n const getParentBoundary = (activity: EngineActivitySnapshot): Date | null => {\n if (!activity.parent || isRootParent(activity.parent)) {\n return adapter.getProjectEnd();\n }\n const parentDates = getActivityDates(activity.parent);\n return parentDates.end_date;\n };\n\n // Helper: is `candidateId` inside the subtree rooted at `rootParentId`?\n // True iff `rootParentId` appears on the candidate's `.parent` chain (or the\n // candidate IS that parent). Used to decide whether a binding successor lives\n // in the SAME parent group as the ALAP leaf (in-subtree) or in a DIFFERENT\n // branch (cross-branch). Walks the snapshot `.parent` links; guarded against\n // malformed cycles.\n const isInSubtree = (\n candidateId: ActivityId,\n rootParentId: ActivityId\n ): boolean => {\n let cursor: ActivityId | undefined = candidateId;\n let guard = 0;\n while (cursor && !isRootParent(cursor) && guard++ < activityCount + 1) {\n if (String(cursor) === String(rootParentId)) return true;\n const node = adapter.getActivity(cursor);\n if (!node || !node.parent) break;\n cursor = node.parent;\n }\n return false;\n };\n\n let sliceStart = performance.now();\n\n // Process ALAP activities in reverse topological order\n for (const activityId of reversedIds) {\n const yieldResult = await yieldIfNeeded(sliceStart, isCurrent);\n if (yieldResult.aborted) return plans;\n sliceStart = yieldResult.newSliceStart;\n\n const activity = adapter.getActivity(activityId);\n if (!activity) continue;\n if (activity.constraint_type !== CONSTRAINT_TYPE.ALAP) continue;\n if (!activity.auto_scheduling) continue;\n if (activity.progress === COMPLETED_PROGRESS) continue;\n\n // Skip summary activities\n if (isSummary(activity.type, adapter.getChildren(activityId).length > 0))\n continue;\n\n // Get the ALAP boundary: parent's end date\n const boundary = getParentBoundary(activity);\n if (!boundary) continue;\n\n // Start from the boundary and work backward\n let latestEnd = boundary;\n let successorAnchor: Date | null = null;\n // Whether the EARLIEST-needed (binding) successor lives in the same parent\n // subtree as this leaf. Tracked alongside `successorAnchor` so the clamp\n // decision below can distinguish in-subtree from cross-branch successors.\n let anchorInSubtree = false;\n\n // Check all successor links to constrain the ALAP date\n const outgoing = outgoingLinks.get(String(activityId)) ?? [];\n for (const link of outgoing) {\n // Skip negative lag links (custom Outbuild behavior)\n if ((link.lag ?? 0) < 0) continue;\n\n const successorSnap = adapter.getActivity(link.target);\n if (!successorSnap) continue;\n if (successorSnap.auto_scheduling === false) continue;\n\n const successorDates = getActivityDates(link.target);\n const effectiveSuccessor: EngineActivitySnapshot = {\n ...successorSnap,\n start_date: successorDates.start_date,\n end_date: successorDates.end_date\n };\n\n // Calculate what the predecessor end must be for this successor\n const predecessorEnd = calculatePredecessorEndFromLink(\n effectiveSuccessor,\n activity,\n link,\n adapter\n );\n\n if (predecessorEnd < latestEnd) {\n latestEnd = predecessorEnd;\n }\n // Track the earliest successor constraint independently of the parent\n // boundary. For ALAP \"as late as possible\" the binding successor is the\n // earliest-needed one.\n if (successorAnchor === null || predecessorEnd < successorAnchor) {\n successorAnchor = predecessorEnd;\n anchorInSubtree =\n activity.parent && !isRootParent(activity.parent)\n ? isInSubtree(link.target, activity.parent)\n : false;\n }\n }\n\n if (successorAnchor !== null) {\n if (anchorInSubtree) {\n // IN-SUBTREE successor: anchor at it, no parent-end cap. A descendant of\n // this leaf's own parent group legitimately pulls the leaf late; the\n // parent end grows by rollup to contain BOTH (it cannot bound a child\n // against another child of itself). Preserves alap-successor-anchor\n // (dfa0e59) for the in-group case.\n latestEnd = successorAnchor;\n } else {\n // CROSS-BRANCH successor: it may only pull the leaf EARLIER than the\n // parent end, never later. Clamp to the parent end. But the parent end\n // must be the LIVE rolled-up value — DHTMLX summary bounds are the live\n // max of children, INCLUDING this leaf's own natural (ASAP) position.\n // The snapshot/ASAP parent end can be STALE (lower than where this\n // leaf's own ASAP pass already places it: prod 41406/94254 parent 29\n // end is a stale 08-19 while its child 32 already lands 08-20). Folding\n // the leaf's own ASAP end into the boundary reconstructs the live\n // rollup floor, so the clamp anchors 41406 correctly (08-20, == oracle)\n // AND clamps the genuinely-late cross-branch cases (3944: 34 leaves\n // whose successors land months past their parent end → all clamp to the\n // parent end, == oracle). Empirically verified vs prod-load-tree on both\n // seeds (41406 1/1, recorder-juneau-3944 34/34). See\n // behavior-guides/alap-successor-anchor.md.\n const ownAsapEnd = getActivityDates(activityId).end_date;\n const effectiveParentEnd =\n ownAsapEnd.getTime() > boundary.getTime() ? ownAsapEnd : boundary;\n latestEnd =\n successorAnchor < effectiveParentEnd\n ? successorAnchor\n : effectiveParentEnd;\n }\n } else {\n // ALAP WITHOUT successors floats to the end of its parent group. Clamp\n // to the parent boundary (the legacy AlapStrategy fallback).\n if (latestEnd > boundary) {\n latestEnd = boundary;\n }\n }\n\n // D9: snap END to FUTURE working time FIRST (matches DHTMLX's\n // resolveRelationDate line 48684), then derive start from it.\n // This differs from our previous derive-then-snap-past approach and\n // produces identical results at working-time edges.\n //\n // Milestones (dur 0): the snap direction follows the milestone's KIND,\n // determined by its incoming (driving) link — the same rule the forward\n // pass uses (calculateSuccessorStartFromLink). An FS/FF-successor milestone\n // is a FINISH marker (renders at a shift_end); an SS/SF-successor (or one\n // with no incoming link) is a START marker (shift_start). The ALAP pass\n // moves the milestone to its late position but must preserve that kind:\n // - finish-kind: zero latestEnd to its UTC day-start and snap PAST → the\n // END of the previous working interval (e.g. 16:00 the day before). A\n // bare past-snap would be idempotent at a shift_start (08:00).\n // - start-kind: snap FUTURE → shift_start.\n // Mirrors the legacy dur-0 AlapStrategy (dhtmlxgantt.js:48688) combined with\n // the dur-0 FS/FF→past milestone rule. Verified live vs production projects\n // 29681/69599 (incoming FS → 16:00) and 24265/60784 (incoming SS → 08:00).\n // See behavior-guides/alap-milestone-kind-snap.md.\n let snappedEnd: Date;\n if (activity.duration === 0 && successorAnchor === null) {\n // Fallback to parent end (no constraining successor): keep the milestone\n // AT the parent's end instant (shift_end). Past-snap is idempotent there.\n // Mirrors legacy relations-empty branch (dhtmlxgantt.js:48672 + 48688\n // past-snap). Without this an SS/start-kind milestone would future-snap to\n // the next day's shift_start (importacion 103801: 2028-02-29 17:00 vs the\n // wrong 2028-03-01 08:00).\n snappedEnd = adapter.getClosestWorkTime({\n date: latestEnd,\n dir: 'past',\n task: activity\n });\n } else if (activity.duration === 0) {\n const incoming = incomingLinks.get(String(activityId)) ?? [];\n const isFinishKind = incoming.some(\n (l) =>\n l.type === LINK_TYPE.FINISH_TO_START ||\n l.type === LINK_TYPE.FINISH_TO_FINISH\n );\n if (isFinishKind) {\n const dayStart = new Date(\n Date.UTC(\n latestEnd.getUTCFullYear(),\n latestEnd.getUTCMonth(),\n latestEnd.getUTCDate()\n )\n );\n snappedEnd = adapter.getClosestWorkTime({\n date: dayStart,\n dir: 'past',\n task: activity\n });\n } else {\n snappedEnd = adapter.getClosestWorkTime({\n date: latestEnd,\n dir: 'future',\n task: activity\n });\n }\n } else {\n snappedEnd = adapter.getClosestWorkTime({\n date: latestEnd,\n dir: 'future',\n task: activity\n });\n }\n\n const snappedStart = adapter.calculateEndDate({\n start_date: snappedEnd,\n duration: -activity.duration,\n task: activity\n });\n\n // Start from any pre-seeded plan (constraint boundaries from\n // processConstraints) and layer the ALAP-derived dates on top so\n // limitPlanDates can clamp them.\n const existing = plans.get(activityId);\n const plan: SchedulePlan = existing\n ? { ...existing }\n : {\n activityId,\n start_date: snappedStart,\n end_date: snappedEnd,\n drivingLinkId: null,\n kind: 'alap',\n conflict: false\n };\n\n plan.start_date = snappedStart;\n plan.end_date = snappedEnd;\n plan.drivingLinkId = null;\n plan.kind = 'alap';\n\n // The ASAP pass also visits ALAP activities and seeds\n // `earliestSchedulingStart` from any incoming FS link cascade. For\n // ALAP we must ignore that (validated against production 2026-05-18:\n // ALAP target with FS predecessor goes to parent end, not source.end +\n // lag). Clear it so `limitPlanDates` reads our ALAP-derived candidate.\n plan.earliestSchedulingStart = null;\n plan.earliestSchedulingEnd = null;\n\n // D10: ALAP bound expressed as latestSchedulingStart so limitPlanDates\n // can clamp against constraint boundaries.\n plan.latestSchedulingStart = snappedStart;\n plan.latestSchedulingEnd = snappedEnd;\n\n limitPlanDates(activity, plan, adapter);\n\n plans.set(activityId, plan);\n }\n\n return plans;\n}\n","/**\n * Injected reporting port. The core is UI-agnostic: it cannot `console.*`,\n * show UI, or know about Sentry. When it hits a recoverable data-quality\n * issue (`warn`) or a failure it could not complete (`error`), it calls this\n * port; the consumer (react_client) implements it and decides the outcome\n * (Sentry, toast, nothing). Same injected-port pattern as `AutoSchedulerPort`.\n */\nexport interface ScheduleCoreReporter {\n /** Recoverable data-quality issue; the core continues with its fallback. */\n warn(message: string, context?: unknown): void;\n /** A real failure the core could not complete. */\n error(message: string, cause?: unknown): void;\n}\n\n/**\n * Default when the consumer injects no reporter: the core neither breaks nor\n * pollutes stdout. Keeps tests and existing consumers non-breaking.\n */\nexport const noopReporter: ScheduleCoreReporter = {\n warn(): void {},\n error(): void {}\n};\n","import type { AutoSchedulerPort, ScheduleResult } from '../types.js';\n\n/**\n * Applies scheduling results back to the gantt instance.\n *\n * Only activities whose dates actually changed are updated.\n * Uses batchUpdate to suppress intermediate renders.\n */\nexport function applyResults(\n adapter: AutoSchedulerPort,\n result: ScheduleResult\n): void {\n if (result.cancelled || result.updatedIds.length === 0) return;\n\n adapter.batchUpdate(() => {\n for (const id of result.updatedIds) {\n const plan = result.plans.get(id);\n if (!plan) continue;\n\n const liveActivity = adapter.getLiveActivity(id);\n if (!liveActivity) continue;\n\n liveActivity.start_date = plan.start_date;\n liveActivity.end_date = plan.end_date;\n\n adapter.updateActivity(id);\n }\n });\n}\n","/**\n * Working-day vocabulary — genuine cross-component primitive (creation\n * defaults, internal/state context fallbacks, link lag display). The value\n * is the FALLBACK only; a sector- or calendar-provided hoursPerDay always\n * takes precedence at every consumer.\n */\nexport const DEFAULT_HOURS_PER_DAY = 8;\n","/**\n * Canonical bidirectional map between DHTMLX link kinds ('0'-'3') and the\n * backend/display two-letter codes (fs/ss/ff/sf), plus the predecessor\n * display-string vocabulary.\n *\n * Single source of truth — replaces the hand-maintained copies that lived in\n * parse-predecessor-string (code→number), apply-link-operation\n * (number→code), boundary/backend parseFromBackend (code→number) and\n * inverses (number→code). The mutual `satisfies Record<…>` constraints make\n * omitting or typo'ing a key on either side a compile error.\n */\n\nimport { LINK_TYPE } from '../types.js';\nimport type { LinkType } from '../types.js';\n\n/** Backend/display two-letter link codes. */\nexport type LinkTypeCode = 'fs' | 'ss' | 'ff' | 'sf';\n\n/** DHTMLX numeric kind → backend/display code. */\nexport const LINK_TYPE_CODE = {\n [LINK_TYPE.FINISH_TO_START]: 'fs',\n [LINK_TYPE.START_TO_START]: 'ss',\n [LINK_TYPE.FINISH_TO_FINISH]: 'ff',\n [LINK_TYPE.START_TO_FINISH]: 'sf'\n} as const satisfies Record<LinkType, LinkTypeCode>;\n\n/** Backend/display code → DHTMLX numeric kind (inverse of LINK_TYPE_CODE). */\nexport const LINK_CODE_TO_TYPE = {\n fs: LINK_TYPE.FINISH_TO_START,\n ss: LINK_TYPE.START_TO_START,\n ff: LINK_TYPE.FINISH_TO_FINISH,\n sf: LINK_TYPE.START_TO_FINISH\n} as const satisfies Record<LinkTypeCode, LinkType>;\n\n/** Default link code when a predecessor spec omits the type. */\nexport const DEFAULT_LINK_CODE = 'fs' as const satisfies LinkTypeCode;\n\n/**\n * Tolerant code→kind lookup for boundary inputs: accepts the backend code\n * ('fs'…) or an already-numeric kind ('0'…); returns undefined otherwise.\n */\nexport function parseLinkTypeCode(raw: string): LinkType | undefined {\n if (raw in LINK_CODE_TO_TYPE) {\n return LINK_CODE_TO_TYPE[raw as LinkTypeCode];\n }\n return undefined;\n}\n\n/** Separator between predecessor entries in the display string. */\nexport const LINK_ENTRY_SEPARATOR = ';';\n\n/**\n * Single-entry regex for predecessor specs. Allows optional type, optional\n * signed lag with optional decimal, optional trailing 'd'.\n */\nexport const ENTRY_RE = /^(\\d+)(fs|ss|ff|sf)?(?:([+-]?)(\\d+(?:\\.\\d+)?)d?)?$/i;\n","/**\n * Cycle detection for link graphs. Reuses the topological-sort algorithm\n * already proven in `/auto-scheduler/graph/topological-sort.ts` (Kahn's).\n *\n * Usage:\n * const wouldCycle = wouldIntroduceCycle(existingLinks, proposedLink);\n */\n\nimport { Queue } from '../../shared/queue.js';\n\nexport interface LinkEdge {\n readonly source: string | number;\n readonly target: string | number;\n}\n\n/**\n * Returns true if adding `proposedLink` to the `existingLinks` graph would\n * create a cycle (a dependency path that loops back to itself).\n *\n * A \"cycle\" here means: there is already a path from proposedLink.target\n * back to proposedLink.source. If the proposedLink is a self-link\n * (source === target) we treat that as a cycle too.\n */\nexport function wouldIntroduceCycle(\n existingLinks: readonly LinkEdge[],\n proposedLink: LinkEdge\n): boolean {\n const src = String(proposedLink.source);\n const tgt = String(proposedLink.target);\n if (src === tgt) return true;\n\n // Build adjacency from existing links.\n const adjacency = new Map<string, string[]>();\n for (const link of existingLinks) {\n const s = String(link.source);\n const t = String(link.target);\n const list = adjacency.get(s) ?? [];\n list.push(t);\n adjacency.set(s, list);\n }\n\n // Is there already a path target → source? If yes, adding source → target\n // closes a cycle.\n return hasPath(adjacency, tgt, src);\n}\n\n/** BFS search: true if node `from` can reach node `to` following edges. */\nfunction hasPath(\n adjacency: Map<string, string[]>,\n from: string,\n to: string\n): boolean {\n if (from === to) return true;\n const visited = new Set<string>([from]);\n const queue = new Queue<string>();\n queue.enqueue(from);\n while (!queue.isEmpty()) {\n const current = queue.dequeue()!;\n const neighbors = adjacency.get(current) ?? [];\n for (const neighbor of neighbors) {\n if (neighbor === to) return true;\n if (visited.has(neighbor)) continue;\n visited.add(neighbor);\n queue.enqueue(neighbor);\n }\n }\n return false;\n}\n","/**\n * Canonical link applier — validates a single `LinkOperation`, mutates\n * the underlying link graph, and syncs the display strings\n * (`custom_predecessors` / `custom_sucessors`) on the affected tasks.\n *\n * See `pp2-schedule/links/00-canonical-link-pipeline.md` (phase 4).\n *\n * DEPENDENCY INJECTION\n * ────────────────────\n * Instead of reaching into `AutoSchedulerPort` (which doesn't expose link\n * mutation), callers pass a `LinkGraphPort` that encapsulates what the\n * applier actually needs. Replay's `ScheduleState` already exposes\n * these methods; a production port (`GanttAdapterImpl`) gets written\n * later when we wire this into the real gantt (phase 7+).\n *\n * VALIDATION\n * ──────────\n * - self-link → rejected\n * - activity-missing (source or target doesn't exist) → rejected\n * - cycle (new link would introduce a dependency loop) → rejected\n * - duplicate (same source+target+type already exists) → rejected\n *\n * STRING SYNC\n * ───────────\n * After a successful create/delete, the applier re-derives\n * `custom_predecessors` on the target activity from its `$target` links\n * (and `custom_sucessors` on the source from `$source`). This is the\n * piece that's MISSING in the legacy drag flow — drag-created links\n * leave `custom_predecessors` stale. The canonical applier fixes that.\n *\n * Lag updates do NOT need a string resync because the string format\n * includes lag and we rebuild it from the link.\n */\n\nimport { DEFAULT_HOURS_PER_DAY } from '../../constants/workday.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { LINK_TYPE_CODE } from './link-display.js';\nimport {\n wouldIntroduceCycle,\n type LinkEdge\n} from '../../columns/shared/cycle-detection.js';\nimport type {\n ActivityId,\n EngineActivitySnapshot,\n LinkId,\n LinkSnapshot,\n LinkType\n} from '../types.js';\nimport type { LinkOperation, LinkOperationResult } from './types.js';\n\n/**\n * Minimal port the applier needs from its host. Replay's mock adapter\n * implements this naturally; a real gantt adapter would wrap\n * `gantt.addLink` / `gantt.deleteLink` / `gantt.updateLink`.\n */\nexport interface LinkGraphPort {\n getActivity(id: ActivityId): EngineActivitySnapshot | null;\n getLink(id: LinkId): LinkSnapshot | null;\n getAllLinks(): readonly LinkSnapshot[];\n addLink(link: LinkSnapshot): void;\n removeLink(id: LinkId): void;\n /** Mutate a single field on a live activity (used for string sync) */\n setActivityField(id: ActivityId, field: string, value: unknown): void;\n /** Mutate a single field on a live link (used for lag updates) */\n setLinkField?(id: LinkId, field: string, value: unknown): void;\n /**\n * Returns the working hours per day of the calendar assigned to the\n * activity. Used by the string-sync helpers to convert the internal lag\n * unit (working hours) into the working-days display unit. Calendars\n * vary (M-F 08-16 = 8h/day, M-F 07-13 = 6h/day, double-shift = 16h/day);\n * never assume 8 — always ask the port. Optional: mock adapters that\n * don't expose calendars can omit it; the formatter falls back to 8.\n * See: pp2-schedule/newPlanSchedule/RULE_link_lag_display_format.md\n */\n getWorkingHoursPerDayForActivity?(activityId: ActivityId): number;\n}\n\nexport interface ApplyDeps {\n readonly port: LinkGraphPort;\n /**\n * Generates a unique id for newly-created links. Defaults to a\n * timestamp-based generator; tests can pass a deterministic one.\n */\n readonly newLinkId?: () => LinkId;\n}\n\nexport function applyLinkOperation(\n op: LinkOperation,\n deps: ApplyDeps\n): LinkOperationResult {\n switch (op.kind) {\n case 'create':\n return applyCreate(op, deps);\n case 'update':\n return applyUpdate(op, deps);\n case 'delete':\n return applyDelete(op, deps);\n }\n}\n\n// ---------------------------------------------------------------------------\n// CREATE\n// ---------------------------------------------------------------------------\n\nfunction applyCreate(\n op: Extract<LinkOperation, { kind: 'create' }>,\n deps: ApplyDeps\n): LinkOperationResult {\n const { port } = deps;\n\n // 1. Validate: self-link\n if (String(op.source) === String(op.target)) {\n return { applied: false, rejected: 'self-link' };\n }\n\n // 2. Validate: activities exist\n const src = port.getActivity(op.source);\n const tgt = port.getActivity(op.target);\n if (!src || !tgt) {\n return { applied: false, rejected: 'activity-missing' };\n }\n\n // 3. Validate: duplicate (same source, target, type already present)\n const existingLinks = port.getAllLinks();\n for (const l of existingLinks) {\n if (\n String(l.source) === String(op.source) &&\n String(l.target) === String(op.target) &&\n l.type === op.type\n ) {\n return { applied: false, rejected: 'duplicate', linkId: l.id };\n }\n }\n\n // 4. Validate: cycle detection\n const asEdges: LinkEdge[] = existingLinks.map((l) => ({\n source: l.source,\n target: l.target\n }));\n if (wouldIntroduceCycle(asEdges, { source: op.source, target: op.target })) {\n return { applied: false, rejected: 'cycle' };\n }\n\n // 5. Mutate\n const id = (deps.newLinkId ?? defaultNewLinkId)();\n const link: LinkSnapshot = {\n id,\n source: op.source,\n target: op.target,\n type: op.type,\n lag: op.lag\n };\n port.addLink(link);\n\n // 6. Sync display strings on both affected activities\n syncPredecessorsString(port, op.target);\n syncSuccessorsString(port, op.source);\n\n return { applied: true, linkId: id };\n}\n\n// ---------------------------------------------------------------------------\n// UPDATE (lag / type change)\n// ---------------------------------------------------------------------------\n\nfunction applyUpdate(\n op: Extract<LinkOperation, { kind: 'update' }>,\n deps: ApplyDeps\n): LinkOperationResult {\n const { port } = deps;\n const link = port.getLink(op.linkId);\n if (!link) return { applied: false, rejected: 'link-missing' };\n\n // Update-in-place via setLinkField if available; otherwise fall back to\n // remove + add with the same id.\n if (port.setLinkField) {\n if (op.lag !== undefined) port.setLinkField(op.linkId, 'lag', op.lag);\n if (op.type !== undefined) port.setLinkField(op.linkId, 'type', op.type);\n } else {\n port.removeLink(op.linkId);\n port.addLink({\n ...link,\n lag: op.lag ?? link.lag,\n type: op.type ?? link.type\n });\n }\n\n // Lag change doesn't move the link source/target but DOES change how\n // the string renders (lag is part of the formatted predecessor spec).\n syncPredecessorsString(port, link.target);\n syncSuccessorsString(port, link.source);\n\n return { applied: true, linkId: op.linkId };\n}\n\n// ---------------------------------------------------------------------------\n// DELETE\n// ---------------------------------------------------------------------------\n\nfunction applyDelete(\n op: Extract<LinkOperation, { kind: 'delete' }>,\n deps: ApplyDeps\n): LinkOperationResult {\n const { port } = deps;\n const link = port.getLink(op.linkId);\n if (!link) return { applied: false, rejected: 'link-missing' };\n\n const targetId = link.target;\n const sourceId = link.source;\n\n port.removeLink(op.linkId);\n\n syncPredecessorsString(port, targetId);\n syncSuccessorsString(port, sourceId);\n\n return { applied: true, linkId: op.linkId };\n}\n\n// ---------------------------------------------------------------------------\n// String sync helpers\n// ---------------------------------------------------------------------------\n\n/**\n * Re-derive `custom_predecessors` for the given target activity by\n * iterating its `$target` links and formatting each as `<correlative><type><lag>`.\n * Matches the legacy string format that the inline editor produces.\n */\nfunction syncPredecessorsString(\n port: LinkGraphPort,\n activityId: ActivityId\n): void {\n const activity = port.getActivity(activityId);\n if (!activity) return;\n\n // Hours/day comes from the activity's own calendar. Used to convert the\n // internal lag (working hours) into the working-days display unit.\n const hoursPerDay = port.getWorkingHoursPerDayForActivity\n ? port.getWorkingHoursPerDayForActivity(activityId)\n : DEFAULT_HOURS_PER_DAY;\n\n const parts: string[] = [];\n for (const linkId of activity.$target) {\n const link = port.getLink(linkId);\n if (!link) continue;\n const srcActivity = port.getActivity(link.source);\n if (!srcActivity) continue;\n const correlative = String(\n srcActivity.correlative_id ?? srcActivity.id ?? link.source\n );\n parts.push(\n formatLinkAsPredecessor(correlative, link.type, link.lag, hoursPerDay)\n );\n }\n port.setActivityField(\n activityId,\n COLUMN.CUSTOM_PREDECESSORS,\n parts.join(';')\n );\n}\n\nfunction syncSuccessorsString(\n port: LinkGraphPort,\n activityId: ActivityId\n): void {\n const activity = port.getActivity(activityId);\n if (!activity) return;\n\n const parts: string[] = [];\n for (const linkId of activity.$source) {\n const link = port.getLink(linkId);\n if (!link) continue;\n const tgtActivity = port.getActivity(link.target);\n if (!tgtActivity) continue;\n const correlative = String(\n tgtActivity.correlative_id ?? tgtActivity.id ?? link.target\n );\n // Hours/day comes from the LINK TARGET's calendar (the activity that\n // consumes the lag), not the source. This matches DHTMLX's targetTask\n // semantics for lag rendering.\n const targetHoursPerDay = port.getWorkingHoursPerDayForActivity\n ? port.getWorkingHoursPerDayForActivity(link.target)\n : DEFAULT_HOURS_PER_DAY;\n parts.push(\n formatLinkAsPredecessor(\n correlative,\n link.type,\n link.lag,\n targetHoursPerDay\n )\n );\n }\n port.setActivityField(activityId, COLUMN.CUSTOM_SUCESSORS, parts.join(';'));\n}\n\n/**\n * Renders a single predecessor/sucessor as `<correlative><type><sign><lag>d`.\n * `lagInWorkingHours` is converted to working days using `hoursPerDay`\n * (read from the relevant activity's calendar). The `+0d` form is rendered\n * explicitly to match the legacy DHTMLX display convention — never elide\n * the lag component, even when zero.\n */\nfunction formatLinkAsPredecessor(\n correlative: string,\n type: LinkType,\n lagInWorkingHours: number,\n hoursPerDay: number\n): string {\n const suffix = LINK_TYPE_CODE[type];\n const lagInDays = hoursPerDay > 0 ? lagInWorkingHours / hoursPerDay : 0;\n const sign = lagInDays >= 0 ? '+' : '-';\n const abs = Math.abs(lagInDays);\n // Render integer when possible, two decimals otherwise.\n const display = Number.isInteger(abs) ? String(abs) : abs.toFixed(2);\n return `${correlative}${suffix}${sign}${display}d`;\n}\n\n// ---------------------------------------------------------------------------\n// Default id generator\n// ---------------------------------------------------------------------------\n//\n// Replica el formato `uid()` de DHTMLX (`dhtmlxgantt.js:61226`): seed lazy\n// con `Date.now()` en el primer llamado, increment por 1 en cada siguiente.\n// El output es un entero positivo en formato string, indistinguible de un\n// uid generado por DHTMLX. Permite que el `linkStore` contenga ids tanto\n// del core como de DHTMLX sin formato divergente.\n//\n// En producción casi siempre se inyecta un generador externo via `deps.newLinkId`\n// (el `linkIdGen` de `ScheduleCore`, que arranca con `knownIds` del backend\n// para evitar colisiones). Este default solo aplica para tests sueltos\n// del módulo y código que use `applyLinkOperation` directamente.\n\nlet _seed: number | null = null;\nfunction defaultNewLinkId(): LinkId {\n if (_seed === null) _seed = Date.now();\n _seed += 1;\n return String(_seed);\n}\n","/**\n * Parser for `custom_predecessors` / `custom_sucessors` strings. Ports\n * the behavior of `custom_gantt_fields/custom_predecessor.js:298-332` in\n * a cleaner, regex-first implementation.\n *\n * Accepted grammar (case-insensitive, per legacy):\n *\n * string := entry (';' entry)*\n * entry := correlative type? lag?\n * correlative := /\\d+/\n * type := 'fs' | 'ss' | 'ff' | 'sf' (default 'fs')\n * lag := sign digits ('.' digits)? 'd'? (default 0)\n * sign := '+' | '-'\n *\n * Examples:\n * \"3\" → [{ correlativeId: '3', type: '0', lag: 0 }] (plain int → FS)\n * \"3fs\" → [{ correlativeId: '3', type: '0', lag: 0 }]\n * \"3FS+2\" → [{ correlativeId: '3', type: '0', lag: 2 }] (case-insensitive)\n * \"3fs+2d\" → [{ correlativeId: '3', type: '0', lag: 2 }] (trailing 'd' ok)\n * \"3fs-1.5d\" → [{ correlativeId: '3', type: '0', lag: -1.5 }] (decimals ok)\n * \"3fs+2;5ff-1\" → two entries\n * \"\" / \" \" → [] (empty ok)\n *\n * Anything else returns `null` on `parsed` and the offending entry in\n * `errors`. Callers decide how to surface errors (legacy drops silently\n * + logs; we return structured errors for test coverage).\n *\n * LAG UNIT: returned as \"days\". Downstream (applier / scheduler) is\n * responsible for converting to the gantt's internal time unit. This\n * matches the legacy semantic where `gantt.formatter.parse(lag + ' days')`\n * happens later, not here.\n */\n\nimport {\n DEFAULT_LINK_CODE,\n ENTRY_RE,\n LINK_CODE_TO_TYPE,\n LINK_ENTRY_SEPARATOR,\n type LinkTypeCode\n} from './link-display.js';\nimport type { ParsedLinkSpec } from './types.js';\n\n// ^ (\\d+) correlative_id\n// (fs|ss|ff|sf)? type (optional, default fs)\n// ( lag group (optional)\n// ([+-]?) sign\n// (\\d+(?:\\.\\d+)?) magnitude (integer or decimal)\n// d? optional unit marker\n// )?\n// $\n\nexport interface ParseResult {\n /** Successfully parsed specs, in input order */\n readonly specs: ParsedLinkSpec[];\n /** Raw strings that did not match the grammar, in input order */\n readonly errors: string[];\n}\n\nexport function parsePredecessorString(input: string): ParseResult {\n const specs: ParsedLinkSpec[] = [];\n const errors: string[] = [];\n\n const trimmed = input.replace(/\\s+/g, '');\n if (trimmed.length === 0) return { specs, errors };\n\n for (const raw of trimmed.split(LINK_ENTRY_SEPARATOR)) {\n if (raw.length === 0) continue;\n const spec = parseEntry(raw);\n if (spec) specs.push(spec);\n else errors.push(raw);\n }\n\n return { specs, errors };\n}\n\nfunction parseEntry(entry: string): ParsedLinkSpec | null {\n const lower = entry.toLowerCase();\n const match = ENTRY_RE.exec(lower);\n if (!match) return null;\n\n const [, correlativeId, typeStr, sign, magnitude] = match;\n\n const type = typeStr\n ? LINK_CODE_TO_TYPE[typeStr as LinkTypeCode]\n : LINK_CODE_TO_TYPE[DEFAULT_LINK_CODE];\n\n let lag = 0;\n if (magnitude !== undefined) {\n const value = Number(magnitude);\n if (Number.isNaN(value)) return null;\n lag = sign === '-' ? -value : value;\n }\n\n return {\n // frozen logic: invariant guaranteed by ENTRY_RE — capture group 1 `(\\d+)`\n // is non-optional, so a successful match always defines correlativeId\n correlativeId: correlativeId!,\n type,\n lag\n };\n}\n","/**\n * Diff: given the CURRENT incoming links on a target activity and a list\n * of DESIRED specs (parsed from a `custom_predecessors` string), produce\n * the minimal sequence of `LinkOperation`s that transitions current →\n * desired.\n *\n * Used when the user edits the inline `custom_predecessors` column: the\n * parser emits `ParsedLinkSpec[]`, this module diffs against what exists,\n * and the applier executes the resulting operations.\n *\n * Ordering invariant: deletes emit first, then updates (lag changes),\n * then creates. Rationale: delete-then-create avoids transient duplicate\n * links from the perspective of downstream cycle-detection; it also\n * mirrors what `custom_predecessor.js` does (deletion loop then creation\n * loop) so behavior matches legacy under a single applier.\n *\n * PURE FUNCTION. No side effects. Fully unit-testable.\n */\n\nimport type { ActivityId, LinkSnapshot, LinkType } from '../types.js';\nimport type { LinkOperation, ParsedLinkSpec } from './types.js';\n\nexport interface DiffLinksInput {\n /** Activity that owns the `custom_predecessors` column being edited */\n readonly targetActivityId: ActivityId;\n /** The links CURRENTLY pointing INTO this activity (from `$target` lookup) */\n readonly currentLinks: readonly LinkSnapshot[];\n /** Parsed specs from the user-entered string (desired final state) */\n readonly desiredSpecs: readonly ParsedLinkSpec[];\n /**\n * Resolves `correlativeId` → `activityId`. Needed because the parser\n * only saw the correlative the user typed. Returns null if no\n * activity has that correlative (spec is dropped silently, matching\n * legacy).\n */\n readonly resolveActivityByCorrelative: (\n correlativeId: string\n ) => ActivityId | null;\n}\n\nexport interface DiffLinksResult {\n readonly operations: LinkOperation[];\n /**\n * Desired specs that could not be resolved to an activityId. Caller\n * can surface these for debugging; legacy drops them silently.\n */\n readonly unresolved: readonly ParsedLinkSpec[];\n}\n\nexport function diffLinks(input: DiffLinksInput): DiffLinksResult {\n const { targetActivityId, currentLinks, desiredSpecs } = input;\n\n // Resolve desired specs to concrete (source, type, lag) triples\n const unresolved: ParsedLinkSpec[] = [];\n const desired = new Map<\n string,\n { source: ActivityId; type: LinkType; lag: number }\n >();\n for (const spec of desiredSpecs) {\n const source = input.resolveActivityByCorrelative(spec.correlativeId);\n if (source == null) {\n unresolved.push(spec);\n continue;\n }\n // Identity key for matching against current: source + type\n // (lag is not part of identity — lag changes = UPDATE, not\n // DELETE+CREATE, matching legacy `get_link_if_exist` semantics).\n const key = linkKey(source, spec.type);\n // FIRST-WINS on a degenerate duplicate (source,type) pair (e.g.\n // \"21fs+0d;21fs-2d\"): legacy DHTMLX keeps the FIRST occurrence's lag\n // and discards the later conflicting one (verified vs the JUN-16\n // oracle: the resolved link keeps lag 0, not -2). Skip if already set.\n if (desired.has(key)) continue;\n desired.set(key, { source, type: spec.type, lag: spec.lag });\n }\n\n // Index current links by (source, type) for fast lookup\n const currentByKey = new Map<string, LinkSnapshot>();\n for (const link of currentLinks) {\n if (String(link.target) !== String(targetActivityId)) continue;\n currentByKey.set(linkKey(link.source, link.type), link);\n }\n\n const operations: LinkOperation[] = [];\n\n // 1. Deletes: current keys not in desired\n for (const [key, link] of currentByKey) {\n if (!desired.has(key)) {\n operations.push({ kind: 'delete', linkId: link.id });\n }\n }\n\n // 2. Updates: keys in both, lag differs\n for (const [key, spec] of desired) {\n const existing = currentByKey.get(key);\n if (!existing) continue;\n if (existing.lag !== spec.lag) {\n operations.push({ kind: 'update', linkId: existing.id, lag: spec.lag });\n }\n }\n\n // 3. Creates: desired keys not in current\n for (const [key, spec] of desired) {\n if (currentByKey.has(key)) continue;\n operations.push({\n kind: 'create',\n source: spec.source,\n target: targetActivityId,\n type: spec.type,\n lag: spec.lag\n });\n }\n\n return { operations, unresolved };\n}\n\nfunction linkKey(source: ActivityId, type: LinkType): string {\n return `${String(source)}::${type}`;\n}\n\n// ---------------------------------------------------------------------------\n// Outgoing variant — used when editing the `custom_sucessors` column\n// ---------------------------------------------------------------------------\n\n/**\n * Same shape as `DiffLinksInput` but the column owner is the SOURCE of the\n * outgoing links, and each spec's `correlativeId` resolves to the TARGET.\n */\nexport interface DiffOutgoingLinksInput {\n /** Activity that owns the `custom_sucessors` column being edited */\n readonly sourceActivityId: ActivityId;\n /** Links CURRENTLY emanating FROM this activity (from `$source` lookup) */\n readonly currentLinks: readonly LinkSnapshot[];\n /** Parsed specs from the user-entered string (desired final state) */\n readonly desiredSpecs: readonly ParsedLinkSpec[];\n readonly resolveActivityByCorrelative: (\n correlativeId: string\n ) => ActivityId | null;\n}\n\n/**\n * Outgoing-direction diff: each spec describes a desired outgoing edge\n * from `sourceActivityId` to the activity resolved via correlative_id.\n * Mirrors `diffLinks` with source/target inverted.\n */\nexport function diffOutgoingLinks(\n input: DiffOutgoingLinksInput\n): DiffLinksResult {\n const { sourceActivityId, currentLinks, desiredSpecs } = input;\n\n const unresolved: ParsedLinkSpec[] = [];\n const desired = new Map<\n string,\n { target: ActivityId; type: LinkType; lag: number }\n >();\n for (const spec of desiredSpecs) {\n const target = input.resolveActivityByCorrelative(spec.correlativeId);\n if (target == null) {\n unresolved.push(spec);\n continue;\n }\n // Identity key: target + type. Lag changes are UPDATE, not DELETE+CREATE.\n const key = linkKey(target, spec.type);\n // FIRST-WINS on a degenerate duplicate (target,type) pair, mirroring\n // the incoming diff (legacy DHTMLX keeps the FIRST occurrence's lag).\n if (desired.has(key)) continue;\n desired.set(key, { target, type: spec.type, lag: spec.lag });\n }\n\n const currentByKey = new Map<string, LinkSnapshot>();\n for (const link of currentLinks) {\n if (String(link.source) !== String(sourceActivityId)) continue;\n currentByKey.set(linkKey(link.target, link.type), link);\n }\n\n const operations: LinkOperation[] = [];\n\n for (const [key, link] of currentByKey) {\n if (!desired.has(key)) {\n operations.push({ kind: 'delete', linkId: link.id });\n }\n }\n for (const [key, spec] of desired) {\n const existing = currentByKey.get(key);\n if (!existing) continue;\n if (existing.lag !== spec.lag) {\n operations.push({ kind: 'update', linkId: existing.id, lag: spec.lag });\n }\n }\n for (const [key, spec] of desired) {\n if (currentByKey.has(key)) continue;\n operations.push({\n kind: 'create',\n source: sourceActivityId,\n target: spec.target,\n type: spec.type,\n lag: spec.lag\n });\n }\n\n return { operations, unresolved };\n}\n","/**\n * Link `lag` unit helpers.\n *\n * Contract of the core (INVARIANTS.md §1, mirrors `duration`): a link's\n * `lag` is stored in **working hours** internally (snapshot/engine). The\n * **public boundary** (facade exit: `_dispatchInner`, `createActivity`,\n * View getters) emits **days by DEFAULT**; consumers opt into hours via\n * `unit:'hours'` on getters or `outputUnit:'hours'` on `dispatch`. The\n * DHTMLX bridge is the ONLY consumer that opts in (via `dispatchCore` +\n * `getAllLinksView('hours')`). All others (save-tracker, baselines, undo,\n * activity card) see days.\n *\n * Conversion lives ONLY in `public-units.ts` (`toPublicLag` outbound).\n * These helpers are called exclusively by `public-units.ts` (outbound:\n * `lagHoursToDays`) and by intent handlers (inbound: `lagDaysToHours`).\n * `conversion-locality.test.ts` enforces this single-caller rule.\n *\n * Sibling of `columns/shared/duration.ts` (`durationToHours` /\n * `durationToDays`). Same fixed factor: `sector.hoursPerDay`.\n */\n\n/**\n * Convert a link `lag` (days) to working hours using the sector's hoursPerDay.\n *\n * Rounds to integer hours to match production's DurationFormatter. A lag stored\n * with 2-decimal days (e.g. `467.38`) would otherwise carry a sub-minute\n * fraction (`×8 = 3739.04h`); applied at a shift boundary that extra 0.04h rolls\n * the dependent activity a FULL working day late (verified live, project\n * 288/666: lag `3739h` → 2022-05-02, `3739.04h` → 2022-05-03). Production loads\n * the lag as integer hours (`467.38d → 3739h`).\n *\n * Uses |lag|×hpd round then re-sign (round-half-away-from-zero) so that negative\n * and positive lags with the same magnitude always produce the same magnitude of\n * hours. Plain Math.round rounds half toward +∞ (Math.round(-13.5) = -13), making\n * −1.5d@hpd9 → −13h but +1.5d@hpd9 → +14h — different stored magnitudes for the\n * same absolute lag value.\n */\nexport function lagDaysToHours(lagDays: number, hoursPerDay: number): number {\n return Math.sign(lagDays) * Math.round(Math.abs(lagDays) * hoursPerDay);\n}\n\n/** Inverse — used when reading the engine's hours lag back into the days domain. */\nexport function lagHoursToDays(lagHours: number, hoursPerDay: number): number {\n if (hoursPerDay <= 0) return 0;\n return lagHours / hoursPerDay;\n}\n","/**\n * Current (legacy-mirroring) implementation of IDateMath.\n *\n * This implementation replicates the behavior of the scattered legacy\n * date math in `onBeforeSave.js`, `workingHours.utils.js`, and\n * `modifyLagCustom.js`. The goal is byte-identical output for the\n * scenarios our fixtures already cover, so promoting the abstraction\n * layer to production doesn't change behavior.\n *\n * When we're ready to go TZ-independent, we'll add\n * `impl-utc.ts` and swap the factory in `index.ts`. No caller\n * changes required.\n */\n\nimport { CALENDAR_UNIT, WORK_TIME_DIRECTION } from '../../types.js';\nimport type { CalendarAPI } from '../../columns/types.js';\nimport type { IDateMath } from './types.js';\n\nexport const currentImpl: IDateMath = {\n /**\n * Legacy rule observed empirically from 4 fixtures:\n *\n * midnight = setHours(0, 0, 0, 0) on a copy of rawDate (local TZ)\n * if (midnight.getTime() === rawDate.getTime())\n * return calendar.getClosestWorkTime(raw, 'future') // snap forward\n * else\n * return midnight // preserve day\n *\n * Rationale (inferred): when the user types/picks a date AT local\n * midnight (e.g., Saturday 00:00 local = \"just Saturday\"), legacy\n * interprets it as \"start of the week/day\" and snaps to the next\n * working hour. When they pick a time WITHIN a day (e.g., Sunday\n * 08:00 local), legacy treats it as \"this specific day\" and preserves\n * the day at local midnight, even if the day is non-working.\n *\n * Fixture evidence:\n * - test3: raw=Apr 26 06:00Z (Sun 08:00 CEST) → Apr 25 22:00Z (Sun 00:00 CEST)\n * - create-rename-drag: raw=Apr 23 22:00Z (Fri 00:00 CEST) → Apr 24 06:00Z (snap)\n * - create-rename-drag: raw=Apr 25 22:00Z (Sun 00:00 CEST) → Apr 27 06:00Z (snap)\n *\n * UTC contract: `setUTCHours(0)` makes the normalization deterministic\n * regardless of the runtime's local TZ. The work-calendar package (and\n * any future strict-UTC calendar engine) requires UTC-keyed inputs, so\n * the day boundary must be computed in UTC too. Legacy fixtures\n * recorded under local-TZ midnight may need their `metadata.tz` honored\n * upstream — `pipeline-context.ts` plumbs that field but this function\n * does not yet consume it (its caller supplies a raw Date with the\n * recorded instant intact).\n */\n rawInputToConstraintDate(rawDate: Date, calendar: CalendarAPI): Date {\n const midnight = new Date(rawDate);\n midnight.setUTCHours(0, 0, 0, 0);\n if (midnight.getTime() === rawDate.getTime()) {\n // Exact midnight local → user picked a date at day granularity; snap\n // forward to the next working moment.\n return calendar.getClosestWorkTime({\n direction: WORK_TIME_DIRECTION.FUTURE,\n date: rawDate,\n unit: CALENDAR_UNIT.HOUR\n });\n }\n // Raw input carries a non-midnight time (DHTMLX normalized the user's\n // day-pick to workday start). Two legacy sub-rules, matched against\n // fixtures:\n // (a) working day + working hour → keep the raw value (e.g. Fri\n // 08:00 local stays Fri 08:00 local).\n // (b) non-working day → collapse to midnight local of that day\n // (e.g. Sun 08:00 local → Sun 00:00 local).\n if (calendar.isWorkTime(rawDate, CALENDAR_UNIT.HOUR)) {\n return rawDate;\n }\n return midnight;\n },\n\n /**\n * Legacy behavior replicated (from `modifyLagCustom.js:29-35`):\n * `calendar.calculateDuration(sourceDate, targetDate)`\n *\n * Returns working hours between the two dates according to the task's\n * calendar (working days + working hours range). Positive when\n * targetDate > sourceDate, zero when aligned. Negative branch\n * exists in calendar.calculateDuration (reverse walk) but our\n * current usage always has target after source post-move.\n */\n computeLagBetweenTasks(\n sourceDate: Date,\n targetDate: Date,\n calendar: CalendarAPI\n ): number {\n return calendar.calculateDuration(sourceDate, targetDate);\n }\n};\n","/**\n * Date-math abstraction layer. See\n * `architecture/temporal-abstraction/date-math-layer.md` for the full\n * design rationale.\n *\n * WHY THIS EXISTS\n * ───────────────\n * The scheduler stack has 200+ scattered date operations today, a mix of\n * local-TZ-dependent (`moment().hours(0)`, `date.getHours()`) and\n * UTC-only (`getUTCHours()`). Over time we want to go fully\n * calendar-driven + TZ-independent — but we can't do it in one shot\n * without breaking production.\n *\n * This module is the seam. Every \"derived date\" the scheduler needs\n * goes through ONE function here. Today's implementation replicates\n * legacy behavior (to keep fixtures passing). Tomorrow we swap the\n * implementation and the whole stack gets TZ-independent semantics.\n *\n * INVARIANTS\n * ──────────\n * - The interface is a pure function: `(Date, Calendar) → Date | number`.\n * No side effects, no global state, no clock reads.\n * - Implementations may use local-TZ helpers (as legacy does) or\n * UTC-only helpers (future). Callers don't care.\n * - The `calendar` parameter is the SOLE source of truth for working\n * days and working hours. Never read the JS runtime's TZ.\n */\n\nimport type { EngineActivitySnapshot, LinkType } from '../types.js';\nimport type { CalendarAPI } from '../../columns/types.js';\n\nexport interface IDateMath {\n /**\n * Given the RAW user input when editing a start_date column (before\n * any working-hour snap), compute the value that should go into\n * `constraint_date`. Legacy semantic: take the day the user picked\n * and normalize to midnight (local-midnight via moment today; will\n * switch to UTC-midnight when we migrate).\n *\n * Called by the `startDatePipeline` to fix the bug where we were\n * mirroring the SNAPPED start_date into constraint_date, losing the\n * user's day choice when they pick a non-working day.\n */\n rawInputToConstraintDate(rawDate: Date, calendar: CalendarAPI): Date;\n\n /**\n * Given two dates on two tasks joined by a link, compute the lag\n * (in working hours) that preserves their relative position. Used\n * by the `adjustLinkLagOnTaskMove` post-processor to keep a link's\n * lag coherent after the user manually moves a task.\n *\n * The caller picks `sourceDate` and `targetDate` based on link.type:\n * - FS (0): source.end_date, target.start_date\n * - SS (1): source.start_date, target.start_date\n * - FF (2): source.end_date, target.end_date\n * - SF (3): source.start_date, target.end_date\n *\n * Returns a positive number (working hours) if target is AFTER source,\n * negative if before. Zero when aligned.\n */\n computeLagBetweenTasks(\n sourceDate: Date,\n targetDate: Date,\n calendar: CalendarAPI\n ): number;\n}\n\n/**\n * Helper to pick the right date pair for a given link type. Exposed so\n * callers (post-processors) don't reimplement the mapping and diverge.\n */\nexport function pickDatesForLinkType(\n source: EngineActivitySnapshot,\n target: EngineActivitySnapshot,\n linkType: LinkType\n): { sourceDate: Date; targetDate: Date } {\n switch (linkType) {\n case '0': // FS\n return { sourceDate: source.end_date, targetDate: target.start_date };\n case '1': // SS\n return { sourceDate: source.start_date, targetDate: target.start_date };\n case '2': // FF\n return { sourceDate: source.end_date, targetDate: target.end_date };\n case '3': // SF\n return { sourceDate: source.start_date, targetDate: target.end_date };\n }\n}\n","/**\n * Public API of the date-math abstraction layer.\n *\n * Callers import `dateMath` and use it directly; they never touch the\n * concrete implementations. Swapping implementations is a one-line\n * change here (flip the factory selection) and affects the entire\n * scheduler stack at once.\n */\n\nimport { currentImpl } from './impl-current.js';\n\nexport { pickDatesForLinkType } from './types.js';\nexport type { IDateMath } from './types.js';\n\n/**\n * Singleton. When we add `impl-utc.ts`, this is the only line that\n * changes.\n */\nexport const dateMath = currentImpl;\n","import type {\n ActivityId,\n AutoSchedulerPort,\n ScheduleOptions,\n SchedulePlan,\n ScheduleResult\n} from './types.js';\nimport { createIsCurrent } from './utils/cancellation.js';\nimport { yieldBetweenPhases } from './utils/timing.js';\nimport { topologicalSort } from './graph/topological-sort.js';\nimport { TopoCache, filterTopoOrder } from './graph/topo-cache.js';\nimport type { expandParentLinks } from './utils/parent-link-expansion.js';\nimport { ExpandedLinksCache } from './utils/expanded-links-cache.js';\nimport { findConnectedGroupForTrigger } from './graph/connected-groups.js';\nimport { asapPass } from './engine/asap-pass.js';\nimport { alapPass } from './engine/alap-pass.js';\nimport { processConstraints } from './engine/constraint-resolver.js';\nimport type { ScheduleCoreReporter } from '../shared/reporter.js';\nimport { noopReporter } from '../shared/reporter.js';\n\n/**\n * Custom AutoScheduler that replaces DHTMLX's internal auto-scheduling.\n *\n * Runs entirely outside the DHTMLX library using only the public API\n * through the AutoSchedulerPort interface. Follows the same async/cancellable\n * pattern as the CriticalPath system.\n *\n * Algorithm phases:\n * 1. Graph — expand parent links, topological sort, cycles\n * 1.5 Constraints — pre-seed plans Map with constraint boundaries\n * 2. ASAP pass — forward pass in dependency order\n * 3. ALAP pass — backward pass for ALAP-constrained activities\n * 4. Diff — emit only changed activities as updatedIds\n *\n * No snapshot copy is taken. `_opQueue` in ScheduleCore serializes all\n * dispatches, so no mutation can start while the engine runs — the live\n * adapter is always a consistent read surface.\n *\n * Parent/summary date aggregation is intentionally NOT performed here —\n * DHTMLX's `updateTask()` triggers `_update_parents()` internally during\n * `batchUpdate`, which recalculates summary dates from the live children\n * in the gantt store. Duplicating that logic here risked divergence.\n */\nexport class AutoScheduler {\n private adapter: AutoSchedulerPort;\n private reporter: ScheduleCoreReporter;\n private currentCalculationId = 0;\n private topoCache = new TopoCache();\n private expandedLinksCache = new ExpandedLinksCache();\n\n constructor(\n adapter: AutoSchedulerPort,\n reporter: ScheduleCoreReporter = noopReporter\n ) {\n this.adapter = adapter;\n this.reporter = reporter;\n }\n\n getCurrentCalculationId(): number {\n return this.currentCalculationId;\n }\n\n /**\n * Invalidates the cached full-graph topological order. Call after any\n * structural mutation: link create/delete, activity create/delete,\n * activity reparent (indent/outdent/move).\n */\n invalidateTopoCache(): void {\n this.topoCache.invalidate();\n }\n\n /**\n * Invalidates the cached expanded parent-link set. Call on link create /\n * delete, activity reparent, activity create / delete, and on the rare\n * field edits that affect chain-pruning (`duration`, `auto_scheduling`).\n */\n invalidateExpandedLinksCache(): void {\n this.expandedLinksCache.invalidate();\n }\n\n /**\n * Convenience: invalidate every cache held by the scheduler.\n */\n invalidateAllCaches(): void {\n this.topoCache.invalidate();\n this.expandedLinksCache.invalidate();\n }\n\n /**\n * Main entry point. Runs the full scheduling algorithm.\n *\n * Returns a ScheduleResult with the plans, updated IDs, and status.\n * The caller (integration layer) is responsible for applying the results\n * back to gantt.\n */\n async schedule(options: ScheduleOptions = {}): Promise<ScheduleResult> {\n const calculationId = ++this.currentCalculationId;\n const isCurrent = createIsCurrent(\n calculationId,\n () => this.currentCalculationId\n );\n\n const emptyResult: ScheduleResult = {\n plans: new Map(),\n updatedIds: [],\n cycles: [],\n cancelled: false\n };\n\n try {\n // -------------------------------------------------------------------\n // Phase 0: clear in-dispatch caches (calendar API memoization)\n // -------------------------------------------------------------------\n maybeClearCalendarCache(this.adapter);\n\n // -------------------------------------------------------------------\n // Phase 1: Graph build\n // -------------------------------------------------------------------\n const phaseTotal = startPhase('schedule.total');\n const phaseExpand = startPhase('schedule.expandParentLinks');\n const rawLinks = this.adapter.getAllLinks();\n const expandedLinks = this.expandedLinksCache.get(rawLinks, this.adapter);\n endPhase(phaseExpand);\n\n // Activities with `auto_scheduling: false` (e.g. completed tasks with\n // progress=100, or manually flagged) are skipped from the processing\n // loop in `asap-pass.ts:81` — they keep their snapshot dates intact.\n // Their LINKS remain in the graph so successors can cascade from the\n // anchor dates of the unmoved predecessor. See:\n // pp2-schedule/newPlanSchedule/RULE_autoschedule_skip_vs_link_propagation.md\n const activeLinks = expandedLinks;\n\n if ((await yieldBetweenPhases(isCurrent)).aborted) {\n return { ...emptyResult, cancelled: true };\n }\n\n // D1: Connected-group scoping.\n // When triggerId is provided, only schedule the connected component\n // containing that activity. Mirrors DHTMLX's\n // connectedGroups.getConnectedGroupRelations(id).\n const phaseScope = startPhase('schedule.scoping');\n const allIds: ActivityId[] = this.adapter.getAllIds();\n let scopedLinks = activeLinks;\n let scopedIds: ActivityId[] = allIds;\n let scopedIdSet: Set<ActivityId> | null = null;\n\n if (options.triggerId !== undefined && options.triggerId !== null) {\n const group = findConnectedGroupForTrigger(\n options.triggerId,\n activeLinks\n );\n scopedLinks = group.links;\n scopedIds = Array.from(group.activityIds) as ActivityId[];\n scopedIdSet = new Set<ActivityId>(scopedIds);\n }\n endPhase(phaseScope);\n\n const phaseTopo = startPhase('schedule.topologicalSort');\n const topoResult = resolveTopoResult(\n this.topoCache,\n allIds,\n activeLinks,\n scopedIdSet\n );\n endPhase(phaseTopo);\n\n if (topoResult.hasCycles) {\n endPhase(phaseTotal);\n return {\n ...emptyResult,\n cycles: [topoResult.cycleNodes]\n };\n }\n\n if ((await yieldBetweenPhases(isCurrent)).aborted) {\n return { ...emptyResult, cancelled: true };\n }\n\n // -------------------------------------------------------------------\n // Phase 2.5: processConstraints pre-seed\n //\n // D3+D4: populate the plans Map with constraint boundaries for every\n // activity that has a non-ASAP/non-ALAP constraint. ASAP pass reads\n // these boundaries and limitPlanDates clamps against them.\n // -------------------------------------------------------------------\n const phaseConstraints = startPhase('schedule.processConstraints');\n const plans = new Map<ActivityId, SchedulePlan>();\n processConstraints(topoResult.ordered, this.adapter, plans);\n endPhase(phaseConstraints);\n\n if ((await yieldBetweenPhases(isCurrent)).aborted) {\n return { ...emptyResult, cancelled: true };\n }\n\n // -------------------------------------------------------------------\n // Phase 3: ASAP Forward Pass\n // -------------------------------------------------------------------\n const phaseAsap = startPhase('schedule.asapPass');\n const asapPlans = await asapPass(\n topoResult.ordered,\n scopedLinks,\n this.adapter,\n options,\n isCurrent,\n plans\n );\n endPhase(phaseAsap);\n\n if ((await yieldBetweenPhases(isCurrent)).aborted) {\n return { ...emptyResult, cancelled: true };\n }\n\n // -------------------------------------------------------------------\n // Phase 4: ALAP Backward Pass\n // -------------------------------------------------------------------\n const phaseAlap = startPhase('schedule.alapPass');\n const allPlans = await alapPass(\n topoResult.reversed,\n scopedLinks,\n asapPlans,\n this.adapter,\n options,\n isCurrent\n );\n endPhase(phaseAlap);\n\n if ((await yieldBetweenPhases(isCurrent)).aborted) {\n return { ...emptyResult, cancelled: true };\n }\n\n // -------------------------------------------------------------------\n // Phase 5: Diff — only include actually changed activities\n //\n // Parent aggregation is skipped intentionally. DHTMLX recomputes\n // summary dates internally when `updateTask()` fires during\n // batchUpdate, so emitting leaf updates is enough.\n // -------------------------------------------------------------------\n const phaseDiff = startPhase('schedule.diff');\n const updatedIds: ActivityId[] = [];\n for (const [id, plan] of allPlans) {\n const snap = this.adapter.getActivity(id);\n if (!snap) continue;\n\n const startChanged =\n snap.start_date.getTime() !== plan.start_date.getTime();\n const endChanged = snap.end_date.getTime() !== plan.end_date.getTime();\n\n if (startChanged || endChanged) {\n updatedIds.push(id);\n }\n }\n endPhase(phaseDiff);\n endPhase(phaseTotal);\n\n return {\n plans: allPlans,\n updatedIds,\n cycles: [],\n cancelled: false\n };\n } catch (error) {\n this.reporter.error('[AutoScheduler] Error during scheduling', error);\n return emptyResult;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Phase timing helpers\n//\n// Console logging is opt-in via globalThis.__SCHEDULER_PHASE_LOG__ (a flag\n// the host can set from devtools without touching code). Defaults: ON in\n// browser, OFF in Node — Node consumers run benchmarks that should not\n// have their stdout polluted.\n// ---------------------------------------------------------------------------\n\nconst SCHEDULER_PHASE_LOG_DEFAULT = false;\n\ninterface PhaseHandle {\n name: string;\n startedAt: number;\n}\n\nfunction isPhaseLoggingEnabled(): boolean {\n const override = (globalThis as { __SCHEDULER_PHASE_LOG__?: boolean })\n .__SCHEDULER_PHASE_LOG__;\n return typeof override === 'boolean' ? override : SCHEDULER_PHASE_LOG_DEFAULT;\n}\n\nfunction startPhase(name: string): PhaseHandle {\n return { name, startedAt: performance.now() };\n}\n\n/**\n * Clears the adapter's calendar-API cache if it has one. The cache lives\n * on `ScheduleState`, which extends `AutoSchedulerPort`. We probe via duck\n * typing so the scheduler does not need to import `ScheduleState`\n * directly (the interface contract stays the same).\n */\nfunction maybeClearCalendarCache(adapter: AutoSchedulerPort): void {\n const probe = adapter as { clearCalendarCache?: () => void };\n if (typeof probe.clearCalendarCache === 'function') {\n probe.clearCalendarCache();\n }\n}\n\nfunction endPhase(handle: PhaseHandle): void {\n if (!isPhaseLoggingEnabled()) return;\n const elapsed = performance.now() - handle.startedAt;\n // biome-ignore lint/suspicious/noConsole: deliberate opt-in phase-timing instrumentation, guarded by __SCHEDULER_PHASE_LOG__ (off by default in Node).\n console.log(`[scheduler] ${handle.name} ${elapsed.toFixed(1)}ms`);\n}\n\n/**\n * Returns a topological order suitable for this dispatch.\n *\n * When the dispatch is scoped to a connected component, the cached\n * full-graph order is filtered by the scoped id set — this preserves the\n * topological property without re-running Kahn. When no scope is provided,\n * the cached full-graph order is returned directly. A cycle anywhere in the\n * graph forces a fresh sort of the scoped subgraph so the cycle nodes are\n * reported for the actual subgraph the scheduler is processing.\n */\nfunction resolveTopoResult(\n cache: TopoCache,\n allIds: ActivityId[],\n allLinks: ReturnType<typeof expandParentLinks>,\n scopedIdSet: Set<ActivityId> | null\n) {\n const fullTopo = cache.get(allIds, allLinks);\n if (fullTopo.hasCycles) {\n const scopedIds = scopedIdSet ? Array.from(scopedIdSet) : allIds;\n return topologicalSort(scopedIds, allLinks);\n }\n if (!scopedIdSet) return fullTopo;\n\n const ordered = filterTopoOrder(fullTopo.ordered, scopedIdSet);\n return {\n ordered,\n reversed: [...ordered].reverse(),\n hasCycles: false,\n cycleNodes: []\n };\n}\n\n// ─── Component API ─────────────────────────────────────────────\n// Everything a consumer outside `autoscheduler/` needs is re-exported\n// here — no deep-imports into engine/, graph/, links/ or integration/.\n\nexport { applyResults } from './integration/apply-results.js';\nexport {\n applyLinkOperation,\n diffLinks,\n diffOutgoingLinks,\n parsePredecessorString,\n lagDaysToHours,\n lagHoursToDays\n} from './links/index.js';\nexport type { LinkOperation } from './links/types.js';\nexport { dateMath } from './date-math/index.js';\nexport { pickDatesForLinkType } from './date-math/types.js';\n","/**\n * Post-processor: adjust incoming-link lag when a task is manually moved.\n *\n * When the user edits a task's `start_date` (or similar), the task's\n * date may no longer align with its predecessor's natural end. Legacy\n * DHTMLX runs `modifyLagCustom.js` after drag/inline edits to recompute\n * each incoming link's `lag` so the link \"looks right\" at the new\n * position (preserves the user's visual intent).\n *\n * Rules (matching legacy):\n * - For each link ending at the moved task, compute the gap between\n * source-end (or start, depending on link type) and target-start\n * (or end) in working hours.\n * - Update the link's `lag` to that value via `applyLinkOperation({ kind: 'update' })`.\n * - Skip if the source task has `constraint_type === 'alap'` (legacy quirk\n * documented in modifyLagCustom.js:36-38).\n * - Skip when the computed value equals the current lag (no-op, avoids\n * spurious updates in the trigger stream).\n */\n\nimport { applyLinkOperation } from '../../autoscheduler/index.js';\n// Engine ActivityId (string | number): this post-processor walks\n// `ScheduleState` (engine seam), same as the runner that invokes it.\nimport type { ActivityId } from '../../autoscheduler/types.js';\nimport { dateMath, pickDatesForLinkType } from '../../autoscheduler/index.js';\nimport type { ActivityWriter, CalendarOps } from '../state/roles.js';\n\nexport function adjustLinkLagOnTaskMove(\n targetId: ActivityId,\n adapter: ActivityWriter & CalendarOps\n): void {\n const target = adapter.getActivity(targetId);\n if (!target) return;\n\n // Resolve the calendar to use for lag math. Tasks have their own\n // calendar_id; the reader falls back to the default for unknown ids, so it\n // never returns null here (the `!` reflects that invariant).\n const calendarApi = adapter.calendarReader.getCalendar(\n String(target.calendar_id)\n )!;\n\n for (const linkId of target.$target) {\n const link = adapter.getLink(linkId);\n if (!link) continue;\n const source = adapter.getActivity(link.source);\n if (!source) continue;\n\n // Legacy skip: ALAP predecessors don't participate in lag adjustment.\n if (source.constraint_type === 'alap') continue;\n\n const { sourceDate, targetDate } = pickDatesForLinkType(\n source,\n target,\n link.type\n );\n const newLag = dateMath.computeLagBetweenTasks(\n sourceDate,\n targetDate,\n calendarApi\n );\n\n // Idempotency: no-op if unchanged.\n if (newLag === link.lag) continue;\n\n applyLinkOperation(\n { kind: 'update', linkId: link.id, lag: newLag },\n { port: adapter }\n );\n }\n}\n","// The runner walks `ScheduleState` (engine seam), whose ids are\n// `string | number` — so it speaks the engine `ActivityId`, not the\n// public string one.\nimport type {\n ActivityId,\n EngineActivitySnapshot\n} from '../../autoscheduler/types.js';\nimport type { ActivityReader } from '../../internal/state/roles.js';\n\n/**\n * Port of `assets/js/events/onAfterTaskUpdate/updateParentDuration.js`.\n * After a duration / progress / hh / cost edit, update the activity's\n * `old_*_registered` snapshot fields to match the new values, then bubble\n * parent bounds up. The legacy code also invokes `editing_flow` which\n * triggers ponderator + cost rollup (handled by separate Outbuild\n * systems; out of scope for the scheduler replay).\n */\nexport function runUpdateParentDuration(\n activityId: ActivityId,\n adapter: ActivityReader\n): void {\n const a = adapter.getActivity(activityId) as\n | (EngineActivitySnapshot & Record<string, unknown>)\n | null;\n if (a) {\n // Mirror legacy `updateParentDuration`: short-circuit when NONE of the\n // tracked values changed vs. their `old_*_registered` snapshots, using\n // JS loose equality — so a rollup-coerced \"0.00\" vs. a previously\n // stored 0 counts as unchanged and preserves old_progress_registered.\n const didChange =\n // biome-ignore lint/suspicious/noDoubleEquals: intentional loose equality — a rollup-coerced \"0.00\" string must count as unchanged vs a stored 0 (legacy updateParentDuration parity, see comment above).\n a.progress != (a.old_progress_registered ?? 0) ||\n // biome-ignore lint/suspicious/noDoubleEquals: intentional loose equality — a rollup-coerced \"0.00\" string must count as unchanged vs a stored 0 (legacy updateParentDuration parity, see comment above).\n a.duration != (a.old_duration_registered ?? 0) ||\n // biome-ignore lint/suspicious/noDoubleEquals: intentional loose equality — a rollup-coerced \"0.00\" string must count as unchanged vs a stored 0 (legacy updateParentDuration parity, see comment above).\n (a.hhWorkTime as unknown) != (a.old_hhWorkTime_registered ?? 0) ||\n // biome-ignore lint/suspicious/noDoubleEquals: intentional loose equality — a rollup-coerced \"0.00\" string must count as unchanged vs a stored 0 (legacy updateParentDuration parity, see comment above).\n (a.cost as unknown) != (a.old_cost_registered ?? 0) ||\n // biome-ignore lint/suspicious/noDoubleEquals: intentional loose equality — a rollup-coerced \"0.00\" string must count as unchanged vs a stored 0 (legacy updateParentDuration parity, see comment above).\n (a.used_cost as unknown) != (a.old_used_cost_registered ?? 0) ||\n // biome-ignore lint/suspicious/noDoubleEquals: intentional loose equality — a rollup-coerced \"0.00\" string must count as unchanged vs a stored 0 (legacy updateParentDuration parity, see comment above).\n (a.real_cost as unknown) != (a.old_real_cost_registered ?? 0);\n if (didChange) {\n a.old_duration_registered = a.duration ?? 0;\n a.old_progress_registered = a.progress ?? 0;\n a.old_hhWorkTime_registered = (a.hhWorkTime as number | undefined) ?? 0;\n a.old_cost_registered = (a.cost as number | undefined) ?? 0;\n a.old_used_cost_registered = (a.used_cost as number | undefined) ?? 0;\n a.old_real_cost_registered = (a.real_cost as number | undefined) ?? 0;\n }\n }\n // Parent bounds bubble-up moved out of here: it must run AFTER the\n // autoscheduler so it sees the cascaded successor dates. See\n // `updateParentBoundsFromChildren` invoked at the end of `dispatch.ts`.\n}\n","// The runner walks `ScheduleState` (engine seam), whose ids are\n// `string | number` — so it speaks the engine `ActivityId`, not the\n// public string one.\nimport type { ActivityId } from '../../autoscheduler/types.js';\nimport type { ActivityReader } from '../state/roles.js';\n\nexport function runUpdateActivityDuration(\n activityId: ActivityId,\n adapter: ActivityReader\n): void {\n // Mirrors `updateActivityDuration` in postProcessorRunner.ts: if the\n // activity is a milestone, zero out duration fields.\n const activity = adapter.getActivity(activityId);\n if (!activity) return;\n if (activity.is_milestone || activity.type === 'milestone') {\n activity.duration = 0;\n activity.for_disable_milestone_duration = 0;\n }\n}\n","/**\n * THE weighted-progress formula — single source of truth.\n *\n * parent.progress = Σ(child.progress × child.ponderator / 100)\n *\n * A child contributes only with `ponderator > 0` (zero/missing/NaN never\n * contributed at any legacy site; negative ponderators don't exist in the\n * domain — weights are percentage shares).\n *\n * Returns `null` when NO child contributes. The caller owns that edge:\n * - dispatch step 7b (`recomputeParentFromChildren`) and the bulk\n * `recomputeAllProgressRollup` FREEZE the parent (legacy parity);\n * - the progress-edit ancestor cascade (`progressPipeline`) writes\n * `\"0.00\"` — it also owns the `.toFixed(2)` string formatting, which\n * is deliberately NOT done here (each site keeps its output shape;\n * see the golden tests pinning all three).\n */\n\nexport interface WeightedChild {\n readonly progress: number;\n readonly ponderator: number;\n}\n\nexport function computeWeightedProgressRollup(\n children: Iterable<WeightedChild>\n): number | null {\n let total = 0;\n let anyContribution = false;\n for (const child of children) {\n if (!(child.ponderator > 0)) continue;\n total += (child.ponderator / 100) * child.progress;\n anyContribution = true;\n }\n return anyContribution ? total : null;\n}\n\n/**\n * Round a rolled-up progress value to 2 decimals — the SAME per-level\n * rounding legacy applies. Legacy `check_progress` (editing-flow.js:192)\n * stores `parentTask.progress = totProgress.toFixed(2)` and then recurses\n * (`:200`); the next-higher ancestor re-reads that child via\n * `parseFloat(tempTask.progress)` (`:184`), so every level consumes its\n * children's 2-decimal-rounded value, not the full-precision one. The\n * numeric (non-string) write sites — `recomputeParentFromChildren`\n * (parent-bounds.ts) and `recomputeAllProgressRollup` — must round here\n * BEFORE the parent is read by its own parent, or a deep summary drifts\n * ±0.01 from legacy (MORNING_QUEUE.md — JUN-02). `progressPipeline` already\n * rounds (its `computeWeightedProgress` returns `.toFixed(2)` and feeds the\n * `Number()` of it forward), so it needs no change.\n */\nexport function roundProgressPerLevel(value: number): number {\n return Number(value.toFixed(2));\n}\n","import type {\n ActivityId,\n EngineActivitySnapshot\n} from '../../autoscheduler/types.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type {\n ActivityReader,\n ActivityWriter,\n CalendarOps\n} from '../../internal/state/roles.js';\nimport {\n computeWeightedProgressRollup,\n roundProgressPerLevel,\n type WeightedChild\n} from '../../columns/shared/weighted-progress.js';\nimport { yieldToBrowser } from '../../shared/timing.js';\nimport { isRootParent } from '../../internal/hierarchy/root-parent.js';\n\ninterface ParentBoundsOptions {\n recomputeProgress?: boolean;\n skipMilestoneDurationStamp?: boolean;\n recomputeRealWork?: boolean;\n}\n\nexport async function updateParentBoundsFromChildren(\n adapter: ActivityReader & CalendarOps & ActivityWriter,\n dirtyIds?: ReadonlySet<ActivityId> | null,\n recomputeProgress = true,\n options: ParentBoundsOptions = {}\n): Promise<void> {\n const parents = dirtyIds\n ? findAncestorsOfDirty(adapter, dirtyIds)\n : findAllParents(adapter);\n await recomputeParentsCooperatively(parents, adapter, recomputeProgress, {\n skipMilestoneDurationStamp: options.skipMilestoneDurationStamp ?? false,\n recomputeRealWork: options.recomputeRealWork ?? false\n });\n}\n\nexport function recomputeParentBoundsSync(\n adapter: ActivityReader & CalendarOps & ActivityWriter,\n dirtyIds: ReadonlySet<ActivityId>,\n recomputeProgress = true\n): void {\n const parents = findAncestorsOfDirty(adapter, dirtyIds);\n for (const parentId of parents) {\n recomputeParentFromChildren(parentId, adapter, recomputeProgress);\n }\n}\n\nexport function recomputeSingleParentDisplayBounds(\n parentId: ActivityId,\n adapter: ActivityReader & CalendarOps & ActivityWriter\n): void {\n recomputeParentFromChildren(parentId, adapter, false, true);\n}\n\nexport function restampMilestoneDurationMirror(adapter: ActivityWriter): void {\n adapter.forEachActivity((activity) => {\n if (activity.for_disable_milestone_duration === activity.duration) return;\n adapter.setActivityField(\n String(activity.id),\n 'for_disable_milestone_duration',\n activity.duration\n );\n });\n}\n\nasync function recomputeParentsCooperatively(\n parents: ActivityId[],\n adapter: ActivityReader & CalendarOps & ActivityWriter,\n recomputeProgress = true,\n options: {\n skipMilestoneDurationStamp: boolean;\n recomputeRealWork: boolean;\n } = {\n skipMilestoneDurationStamp: false,\n recomputeRealWork: false\n }\n): Promise<void> {\n const YIELD_EVERY_N_PARENTS = 200;\n let processed = 0;\n for (const parentId of parents) {\n recomputeParentFromChildren(\n parentId,\n adapter,\n recomputeProgress,\n options.skipMilestoneDurationStamp,\n options.recomputeRealWork\n );\n processed += 1;\n if (processed % YIELD_EVERY_N_PARENTS === 0) {\n await yieldToBrowser();\n }\n }\n}\n\nfunction findAncestorsOfDirty(\n adapter: ActivityReader,\n dirtyIds: ReadonlySet<ActivityId>\n): ActivityId[] {\n const ancestors = new Set<ActivityId>();\n for (const id of dirtyIds) walkAncestors(id, adapter, ancestors);\n if (ancestors.size === 0) return [];\n const ids = Array.from(ancestors);\n const depths = computeDepths(ids, adapter);\n return sortDeepestFirst(ids, depths);\n}\n\nfunction walkAncestors(\n id: ActivityId,\n adapter: ActivityReader,\n collector: Set<ActivityId>\n): void {\n let current: ActivityId | 0 = adapter.getParentId(id);\n while (current && !isRootParent(current)) {\n if (collector.has(current)) return;\n collector.add(current);\n current = adapter.getParentId(current);\n }\n}\n\ninterface ChildrenAggregate {\n minStart: number | null;\n maxEnd: number | null;\n realWorkSum: number;\n weightedChildren: WeightedChild[];\n}\n\nfunction aggregateChildren(\n childrenIds: readonly ActivityId[],\n adapter: ActivityReader,\n includeRealWork: boolean\n): ChildrenAggregate {\n let minStart: number | null = null;\n let maxEnd: number | null = null;\n let realWorkSum = 0;\n const weightedChildren: WeightedChild[] = [];\n for (const childId of childrenIds) {\n const child = adapter.getActivity(childId);\n if (!child) continue;\n const childStart = child.start_date.getTime();\n const childEnd = child.end_date.getTime();\n if (minStart === null || childStart < minStart) minStart = childStart;\n if (maxEnd === null || childEnd > maxEnd) maxEnd = childEnd;\n if (includeRealWork) realWorkSum += childRealWorkContribution(child);\n weightedChildren.push({\n progress: Number(child.progress ?? 0),\n ponderator: Number(child.ponderator ?? 0)\n });\n }\n return { minStart, maxEnd, realWorkSum, weightedChildren };\n}\n\nfunction recomputeParentFromChildren(\n parentId: ActivityId,\n adapter: ActivityReader & CalendarOps & ActivityWriter,\n recomputeProgress = true,\n skipMilestoneDurationStamp = false,\n recomputeRealWork = false\n): void {\n const parent = adapter.getActivity(parentId);\n if (!parent) return;\n\n const childrenIds = adapter.getChildren(parentId);\n if (childrenIds.length === 0) return;\n\n const aggregate = aggregateChildren(childrenIds, adapter, recomputeRealWork);\n if (aggregate.minStart === null || aggregate.maxEnd === null) return;\n\n const calendarId = String(parent.calendar_id ?? '');\n const calendar = adapter.calendarReader.getCalendar(calendarId)!;\n const newStart = new Date(aggregate.minStart);\n const newEnd = new Date(aggregate.maxEnd);\n const duration = calendar.calculateDuration(newStart, newEnd);\n\n adapter.setActivityField(parentId, COLUMN.START_DATE, newStart);\n adapter.setActivityField(parentId, COLUMN.END_DATE, newEnd);\n adapter.setActivityField(parentId, COLUMN.DURATION, duration);\n if (!skipMilestoneDurationStamp) {\n adapter.setActivityField(\n parentId,\n 'for_disable_milestone_duration',\n duration\n );\n }\n\n const progressRollup = computeWeightedProgressRollup(\n aggregate.weightedChildren\n );\n if (recomputeProgress && progressRollup !== null) {\n adapter.setActivityField(\n parentId,\n COLUMN.PROGRESS,\n roundProgressPerLevel(progressRollup)\n );\n }\n\n if (recomputeRealWork) {\n adapter.setActivityField(parentId, COLUMN.REAL_WORK, aggregate.realWorkSum);\n }\n}\n\nfunction childRealWorkContribution(child: EngineActivitySnapshot): number {\n const storedRealWork = Number(child.real_work);\n const hasStoredRealWork =\n Number.isFinite(storedRealWork) && storedRealWork !== 0;\n if (hasStoredRealWork) return storedRealWork;\n const laborHours = Number(child.hhWorkTime) || 0;\n const progress = Number(child.progress) || 0;\n return (laborHours * progress) / 100;\n}\n\nfunction findAllParents(adapter: ActivityReader): ActivityId[] {\n const parents = collectParentIds(adapter);\n const depthsById = computeDepths(parents, adapter);\n return sortDeepestFirst(parents, depthsById);\n}\n\nfunction collectParentIds(adapter: ActivityReader): ActivityId[] {\n const parents = new Set<ActivityId>();\n adapter.forEachActivity((activity) => {\n if (activity.parent && !isRootParent(activity.parent))\n parents.add(activity.parent);\n });\n return Array.from(parents);\n}\n\nfunction computeDepths(\n ids: ActivityId[],\n adapter: ActivityReader\n): Map<ActivityId, number> {\n const depths = new Map<ActivityId, number>();\n for (const id of ids) depths.set(id, depthOf(id, adapter));\n return depths;\n}\n\nfunction depthOf(id: ActivityId, adapter: ActivityReader): number {\n let depth = 0;\n let current: ActivityId | 0 = id;\n while (current && !isRootParent(current)) {\n if (!adapter.getActivity(current)) break;\n depth += 1;\n current = adapter.getParentId(current);\n }\n return depth;\n}\n\nfunction sortDeepestFirst(\n ids: ActivityId[],\n depths: Map<ActivityId, number>\n): ActivityId[] {\n return [...ids].sort((a, b) => (depths.get(b) ?? 0) - (depths.get(a) ?? 0));\n}\n","/**\n * Adapter-based post-processor runner for replay. Mirrors\n * `columnPipelines/wiring/postProcessorRunner.ts` but talks to\n * `ScheduleState` instead of the real DHTMLX gantt.\n *\n * Each post-processor here reimplements the observable effect of its legacy\n * counterpart — not its DHTMLX/Redux side-effects. Goal: reproduce the\n * mutations to activities/links that end up in the recorded `afterState`.\n *\n * Unmapped processors log a warning and no-op. We extend the table as\n * fixtures demand.\n *\n * Each processor's implementation lives in its own sibling file\n * (`update-parent-duration.ts`, `update-activity-duration.ts`,\n * `parent-bounds.ts`, `adjust-link-lag-on-task-move.ts`); this file owns\n * the name → implementation table and the runner entry points.\n */\n\n// The runner walks `ScheduleState` (engine seam), whose ids are\n// `string | number` — so it speaks the engine `ActivityId`, not the\n// public string one.\nimport type { ActivityId } from '../../autoscheduler/types.js';\nimport type { ScheduleState } from '../state/schedule-state.js';\nimport { adjustLinkLagOnTaskMove } from './adjust-link-lag-on-task-move.js';\nimport { runUpdateParentDuration } from '../../propagations/upward/update-parent-duration.js';\nimport { runUpdateActivityDuration } from './update-activity-duration.js';\nimport type { PostProcessorName } from '../../columns/shared/post-processors.js';\n\n// Parent-bounds aggregation entry points keep their stable import path\n// (`./runner.js`) for dispatch / init / tests; implementation lives in\n// `parent-bounds.ts`.\nexport {\n updateParentBoundsFromChildren,\n recomputeParentBoundsSync,\n restampMilestoneDurationMirror\n} from '../../propagations/upward/parent-bounds.js';\n\ntype AdapterPostProcessor = (\n activityId: ActivityId,\n adapter: ScheduleState\n) => void;\n\n// `satisfies Record<PostProcessorName, …>` keeps this table and the\n// pipeline-facing name vocabulary in lockstep: a pipeline emitting a name\n// with no implementation here (or a renamed key) fails to compile instead\n// of warning + no-opping at runtime.\nconst POST_PROCESSORS = {\n updateParentDuration: runUpdateParentDuration,\n updateActivityDuration: runUpdateActivityDuration,\n // `updateMilestoneData` eliminado del registro (2026-06-10, MIL-B2):\n // post-processor fantasma — ninguna pipeline lo emitía. Su garantía\n // (duration=0, end_date=start_date al convertir a milestone) vive en\n // durationPipeline (fix MIL-B1) + calculateEndDate(start, 0) === start\n // (test en calendar/adapter.test.ts). Ver BUGS_milestones_2026-06-10.md\n // (vault).\n // `executeFixForConstraints` NO vive en este registro (D1, 2026-06-20): no\n // es un post-processor por-pipeline sino un post-pass del DISPATCH de\n // constraint (corre tras la cascada del autoscheduler, comparando el\n // start_date SETTLED contra last_start_date). Se reimplementa como la REGLA\n // limpia `revertNoOpConstraintEdit`\n // (src/dispatch/handlers/revert-no-op-constraint-edit.ts), cableada en\n // inline-edit.ts (paso 8b) — NO una copia verbatim del mecanismo legacy\n // (que comparaba Dates por referencia). Reproduce JUN-10/JUN-15/JUN-17.\n updateTaskTiming: runNoOp('updateTaskTiming'),\n adjustLinkLagOnTaskMove\n} satisfies Record<PostProcessorName, AdapterPostProcessor>;\n\nexport function runPostProcessorsOnAdapter(\n activityId: ActivityId,\n processorNames: readonly string[],\n adapter: ScheduleState\n): void {\n for (const name of processorNames) {\n // `processorNames` stays `readonly string[]`: replay fixtures may carry\n // names recorded before a processor was removed — the warn path below\n // is the deliberate tolerance for that. Compile-time safety lives at the\n // emit side (`FieldChanges.postProcessors: readonly PostProcessorName[]`).\n const fn =\n name in POST_PROCESSORS\n ? POST_PROCESSORS[name as PostProcessorName]\n : undefined;\n if (!fn) {\n // biome-ignore lint/suspicious/noConsole: fixture-replay tooling diagnostic (not a production error path); intentionally not routed through ScheduleCoreReporter.\n console.warn(\n `[replay post-processors] unknown: ${name} — skipping. Add an ` +\n `entry in POST_PROCESSORS if a fixture needs it.`\n );\n continue;\n }\n fn(activityId, adapter);\n }\n}\n\nfunction runNoOp(name: string): AdapterPostProcessor {\n return (): void => {\n // biome-ignore lint/suspicious/noConsole: fixture-replay stub notice (not a production error path); intentionally not routed through ScheduleCoreReporter.\n console.debug(\n `[replay post-processors] ${name}: not yet ported to adapter — no-op.`\n );\n };\n}\n","import type {\n ParseResult,\n ValidationResult,\n EditResult,\n FieldChanges,\n NotificationConfig,\n EditAlertKey,\n EditDenialReason,\n ParseErrorCode,\n PostProcessorName,\n ValidationReason\n} from './types.js';\n\n// ─── Parse Results ──────────────────────────────────────────\n\nexport function parsed<T>(value: T, raw?: unknown): ParseResult<T> {\n if (raw !== undefined) {\n return { ok: true, value, raw };\n }\n return { ok: true, value };\n}\n\nexport function parseError(reason: ParseErrorCode): ParseResult<never> {\n return { ok: false, reason };\n}\n\n// ─── Validation Results ─────────────────────────────────────\n\nexport function valid(): ValidationResult {\n return { valid: true };\n}\n\nexport function invalid(\n reason: ValidationReason,\n notification?: NotificationConfig\n): ValidationResult {\n if (notification !== undefined) {\n return { valid: false, reason, notification };\n }\n return { valid: false, reason };\n}\n\n// ─── Edit Permission Results ────────────────────────────────\n\nexport function canEdit(): EditResult {\n return { allowed: true };\n}\n\nexport function cannotEdit(\n reason: EditDenialReason,\n alertKey?: EditAlertKey\n): EditResult {\n if (alertKey !== undefined) {\n return { allowed: false, reason, alertKey };\n }\n return { allowed: false, reason };\n}\n\n// ─── Field Changes Builder ──────────────────────────────────\n\nexport function fieldChanges(\n primaryValue: unknown,\n extraFields: Record<string, unknown> = {},\n options: {\n autoSchedule?: boolean;\n postProcessors?: readonly PostProcessorName[];\n cascadeMutations?:\n | ReadonlyArray<import('./types').CascadeMutation>\n | undefined;\n trackingEvents?: ReadonlyArray<import('./types').TrackingEvent> | undefined;\n } = {}\n): FieldChanges {\n return {\n primaryValue,\n extraFields,\n needsAutoSchedule: options.autoSchedule ?? false,\n postProcessors: options.postProcessors ?? [],\n ...(options.cascadeMutations !== undefined\n ? { cascadeMutations: options.cascadeMutations }\n : {}),\n ...(options.trackingEvents !== undefined\n ? { trackingEvents: options.trackingEvents }\n : {})\n };\n}\n","import type { ColumnPipeline } from '../types.js';\nimport { canEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\n\nexport const textPipeline: ColumnPipeline<string> = {\n canEdit() {\n return canEdit();\n },\n\n parseInput(rawValue) {\n if (typeof rawValue !== 'string') return parseError('not_a_string');\n\n // Match legacy DHTMLX: store the raw value verbatim (NO trim). Production\n // keeps user-typed leading/trailing whitespace; the core must too (parity).\n return parsed(rawValue);\n },\n\n validate() {\n return valid();\n },\n\n transform(_activity, newValue) {\n return fieldChanges(\n newValue,\n {},\n {\n autoSchedule: false,\n postProcessors: []\n }\n );\n },\n\n trackEvent: 'activity_name_entry'\n};\n","import type { ColumnPipeline } from '../types.js';\nimport { canEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\n\nexport const descriptionPipeline: ColumnPipeline<string> = {\n canEdit() {\n return canEdit();\n },\n\n parseInput(rawValue) {\n if (typeof rawValue !== 'string') return parseError('not_a_string');\n return parsed(rawValue.trim());\n },\n\n validate() {\n return valid();\n },\n\n transform(_activity, newValue) {\n return fieldChanges(\n newValue,\n {},\n {\n autoSchedule: false,\n postProcessors: []\n }\n );\n },\n\n trackEvent: 'activity_description_entry'\n};\n","import type { ActivitySnapshot } from '../types.js';\n\nimport { isSummary } from '../../activity-types/index.js';\nimport { COMPLETED_PROGRESS } from '../../constants/progress.js';\n\n/** Columns-facing alias of the shared completion value. */\nexport const PROGRESS_COMPLETE = COMPLETED_PROGRESS;\n\nexport function isCompletedActivity(\n activity: Readonly<ActivitySnapshot>\n): boolean {\n return activity.progress >= PROGRESS_COMPLETE;\n}\n\nexport function isSummaryActivity(\n activity: Readonly<ActivitySnapshot>\n): boolean {\n return isSummary(activity.type, activity.hasChildren);\n}\n\n/**\n * Legacy DHTMLX proxy: treats `duration === 0` as milestone even when the\n * type disagrees. The canonical type-only check is `isMilestoneType` in\n * `src/activity-types/` — prefer it for new code; this variant survives\n * for boundary parity only (TODO.md #4/#7).\n */\nexport function isMilestone(activity: Readonly<ActivitySnapshot>): boolean {\n return activity.type === 'milestone' || activity.duration === 0;\n}\n\nexport function hasProgress(activity: Readonly<ActivitySnapshot>): boolean {\n return activity.progress > 0;\n}\n\nexport function hasLookaheadTasks(\n activity: Readonly<ActivitySnapshot>\n): boolean {\n return activity.hasLookaheadTasks;\n}\n\nexport function hasChildren(activity: Readonly<ActivitySnapshot>): boolean {\n return activity.hasChildren;\n}\n","/**\n * Duration unit helpers.\n *\n * Contract of the core: `duration` is in **days** at every public boundary\n * (input via `dispatch`, output via `getActivity`, persisted shape from\n * `parseFromBackend`). The calendar engine, however, consumes WORKING HOURS\n * when computing end_dates. These helpers convert at that boundary and\n * nowhere else.\n */\n\n/**\n * Convert `duration` (days) to working hours using the sector's hoursPerDay.\n *\n * Rounds to an integer number of working hours, replicating production's\n * DurationFormatter.parse (`Math.round(transfer.fromMinutes(Math.ceil(minutes)))`,\n * dhtmlxgantt.js:16274). The backend stores duration in days rounded to 2\n * decimals (441h → 55.125 → \"55.13\"); a raw `days * hoursPerDay` reintroduces a\n * spurious fraction (55.13 * 8 = 441.04) that, fed to the calendar engine's\n * calculateEndDate, overshoots the last work instant and lands at midnight\n * (the Hergonsa/core-nexus parent-end bug). There are no genuinely fractional\n * working-hour durations in production — the fraction is always round-trip noise.\n */\nexport function durationToHours(\n durationDays: number,\n hoursPerDay: number\n): number {\n return Math.round(Math.ceil(durationDays * hoursPerDay * 60) / 60);\n}\n\n/** Inverse — used when reading hours from the engine back into the days domain. */\nexport function durationToDays(\n durationHours: number,\n hoursPerDay: number\n): number {\n if (hoursPerDay <= 0) return 0;\n return durationHours / hoursPerDay;\n}\n","import { END_DATE } from './constants.js';\n\nexport const setEndDate = (value: Date): { [END_DATE]: Date } => ({\n [END_DATE]: value\n});\n","import { CALENDAR_UNIT, WORK_TIME_DIRECTION } from '../../types.js';\nimport type { CalendarAPI } from '../../calendar/api.js';\nimport type { ConstraintType } from '../types.js';\n\n/**\n * Truncates a `Date` to `00:00:00.000Z` of its calendar day, interpreted in\n * the supplied IANA timezone.\n *\n * The pipeline uses this as a canonical internal representation of \"the day\"\n * the user picked. The result is transitory — never persisted, never exposed\n * to the UI. It exists only so date rules inside `transform()` can operate\n * without TZ ambiguity.\n *\n * **A4 — the core is UTC-strict.** Every core call passes `'UTC'` (the day\n * already arrives UTC-canonical from the edge: the bridge's UTC date editor /\n * `server_utc` drag), so `tz === 'UTC'` reads the day via `Intl` in UTC and is\n * deterministic on any machine. A non-`'UTC'` `tz` is for the EDGE only — the\n * replay harness passes the recording's `metadata.tz` to translate a recorded\n * wall-clock value into the UTC-canonical day BEFORE dispatching.\n *\n * NOTE (debt): omitting `tz` falls back to the JS runtime's LOCAL TZ\n * (`getFullYear/...`) — a vestige of the old browser-TZ model. The core must\n * NOT rely on it (always pass `'UTC'`). A few internal helpers (`nextWorkingDay`,\n * `shiftEnd`) still call without `tz`; harmless under UTC/CI but flaky on a\n * deeply-negative machine TZ. Tracked in `INVARIANTS.md` §2.\n */\nexport function truncateToUtcDay(date: Date, tz?: string): Date {\n if (tz) {\n const parts = new Intl.DateTimeFormat('en-CA', {\n timeZone: tz,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).formatToParts(date);\n const get = (kind: string) =>\n Number(parts.find((p) => p.type === kind)?.value);\n return new Date(Date.UTC(get('year'), get('month') - 1, get('day')));\n }\n return new Date(\n Date.UTC(date.getFullYear(), date.getMonth(), date.getDate())\n );\n}\n\n/**\n * The instant of 23:59:00.000 LOCAL on `date`'s calendar day, returned as the\n * corresponding UTC instant. Faithful port of legacy `calculateExpected`\n * (lookahead-common.js): when the schedule/master-plan computes expected\n * progress it sets `date_actual.setHours(23, 59)` — i.e. the comparison instant\n * is the END of the current LOCAL day, not the live clock instant.\n *\n * `tz` is the IANA timezone the caller treats `date` in. When omitted/`'UTC'`\n * the local day equals the UTC day, so it is `setUTCHours(23, 59, 0, 0)`.\n * Otherwise the local Y/M/D is read in `tz`, set to 23:59 local, and converted\n * back to the UTC instant (DST-safe via the measured tz offset at that day).\n */\nexport function endOfLocalDay(date: Date, tz?: string): Date {\n if (!tz || tz === 'UTC') {\n const eod = new Date(date);\n eod.setUTCHours(23, 59, 0, 0);\n return eod;\n }\n const parts = new Intl.DateTimeFormat('en-CA', {\n timeZone: tz,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit'\n }).formatToParts(date);\n const get = (kind: string) =>\n Number(parts.find((p) => p.type === kind)?.value);\n const y = get('year');\n const m = get('month');\n const d = get('day');\n // Measure the tz's UTC offset (minutes) for this calendar day at 23:59 local.\n // Build the naive-UTC instant for the local wall-clock, ask Intl what UTC\n // wall-clock that maps to, and correct by the delta (one iteration is exact\n // for fixed-offset days; DST transition days are not relevant to \"now\").\n const naive = Date.UTC(y, m - 1, d, 23, 59, 0, 0);\n const asUtcParts = new Intl.DateTimeFormat('en-CA', {\n timeZone: tz,\n year: 'numeric',\n month: '2-digit',\n day: '2-digit',\n hour: '2-digit',\n minute: '2-digit',\n second: '2-digit',\n hour12: false\n }).formatToParts(new Date(naive));\n const g = (kind: string) =>\n Number(asUtcParts.find((p) => p.type === kind)?.value);\n const renderedUtc = Date.UTC(\n g('year'),\n g('month') - 1,\n g('day'),\n g('hour') === 24 ? 0 : g('hour'),\n g('minute'),\n g('second')\n );\n const offsetMs = renderedUtc - naive;\n return new Date(naive - offsetMs);\n}\n\n// ─── D7 helpers — domain-named ops over CalendarAPI primitives ─────────────\n// These compose the existing CalendarAPI primitives. They live here (not as\n// methods on CalendarAPI) because they add no implementation-specific\n// behavior — only domain naming for call sites.\n\n/**\n * `domainDay` if it is a working day, else the next working day, always at\n * `00:00:00.000Z`. Used by pipelines applying D7 (snap user-picked\n * non-working day to next working day).\n */\nexport function nextWorkingDay(calendar: CalendarAPI, domainDay: Date): Date {\n let cursor = truncateToUtcDay(domainDay);\n while (!calendar.isWorkTime(cursor, CALENDAR_UNIT.DAY)) {\n cursor = new Date(cursor);\n cursor.setUTCDate(cursor.getUTCDate() + 1);\n cursor = truncateToUtcDay(cursor);\n }\n return cursor;\n}\n\n/**\n * First working instant of `domainDay` (or of next working day if domainDay\n * is non-working). Pipelines call this to expand a domain \"day\" into the\n * shift_start instant that gets persisted as `start_date` / `constraint_date`.\n */\nexport function shiftStart(calendar: CalendarAPI, domainDay: Date): Date {\n return calendar.getClosestWorkTime({\n direction: WORK_TIME_DIRECTION.FUTURE,\n date: domainDay,\n unit: CALENDAR_UNIT.HOUR\n });\n}\n\n/**\n * Last working instant of `domainDay` (or of next working day if domainDay\n * is non-working). Pipelines call this to expand a domain \"day\" into the\n * shift_end instant that gets persisted as `end_date` (D3 inclusive).\n */\nexport function shiftEnd(calendar: CalendarAPI, domainDay: Date): Date {\n const workingDay = nextWorkingDay(calendar, domainDay);\n const nextMidnight = new Date(workingDay);\n nextMidnight.setUTCDate(nextMidnight.getUTCDate() + 1);\n nextMidnight.setUTCHours(0, 0, 0, 0);\n return calendar.getClosestWorkTime({\n direction: WORK_TIME_DIRECTION.PAST,\n date: nextMidnight,\n unit: CALENDAR_UNIT.HOUR\n });\n}\n\n/** Constraint types whose `constraint_date` is anchored to the START of a day. */\nexport const START_BASED_CONSTRAINTS: ReadonlySet<ConstraintType> = new Set([\n 'snet',\n 'snlt',\n 'mso'\n]);\n\n/** Constraint types whose `constraint_date` is anchored to the END of a day. */\nexport const END_BASED_CONSTRAINTS: ReadonlySet<ConstraintType> = new Set([\n 'fnet',\n 'fnlt',\n 'mfo'\n]);\n\n/** ASAP/ALAP — schedule-driven, carry no `constraint_date`. */\nexport const DATELESS_CONSTRAINTS: ReadonlySet<ConstraintType> = new Set([\n 'asap',\n 'alap'\n]);\n\n/**\n * Implicit constraint applied when a date edit (start_date, end_date or\n * constraint_date) lands on an unconstrained (ASAP/ALAP) activity.\n */\nexport const IMPLIED_CONSTRAINT_ON_DATE_EDIT: ConstraintType = 'snet';\n\n/**\n * Canonical `constraint_date` shape (RULE_constraint_date_preserves_typed_day):\n * the typed DAY is preserved as-is (working or not); the HOUR comes from the\n * calendar shift — `shift_start` for start-based types, `shift_end` for\n * end-based ones. Shared by the constraint_date edit pipeline and the\n * load-time normalization pass (`ScheduleCore.runInitialPasses`), which\n * sanitizes the midnight constraint_dates production carries from the\n * historical bug the core does not replicate (paridad correctWrongDates #10,\n * CORRECT_WRONG_DATES_PARITY.md).\n */\nexport function normalizeConstraintDate(\n typedDay: Date,\n calendar: CalendarAPI,\n constraintType: ConstraintType\n): Date {\n // ASAP/ALAP have no associated date — callers normally filter them out\n // (the edit pipeline switches them to SNET; the parse nullifies their\n // date), but guard anyway.\n if (\n !START_BASED_CONSTRAINTS.has(constraintType) &&\n !END_BASED_CONSTRAINTS.has(constraintType)\n ) {\n return typedDay;\n }\n\n // Pick a reference instant on the calendar to read the shift time from.\n // `shiftStart`/`shiftEnd` snap to the nearest working day, which may\n // differ from `typedDay` when the typed day is non-working — that's fine,\n // we only read the time component (shift hours are the same across all\n // working days for the typical M-F calendar).\n const reference = START_BASED_CONSTRAINTS.has(constraintType)\n ? shiftStart(calendar, typedDay)\n : shiftEnd(calendar, typedDay);\n\n // Copy the time from the reference onto the typed day. The typed day\n // is preserved as-is — non-working days stay non-working.\n const result = new Date(typedDay);\n result.setUTCHours(\n reference.getUTCHours(),\n reference.getUTCMinutes(),\n reference.getUTCSeconds(),\n reference.getUTCMilliseconds()\n );\n return result;\n}\n","import type { ConstraintType } from '../types.js';\nimport { IMPLIED_CONSTRAINT_ON_DATE_EDIT } from '../shared/date-normalize.js';\nimport {\n CONSTRAINT_TYPE,\n REAL_CONSTRAINT_TYPE,\n CONSTRAINT_TYPE_OLD\n} from './constants.js';\n\n/**\n * The 3 type-cluster fields set when a date edit lands on an unconstrained\n * activity (implied SNET). Owned here so no other column writes these strings.\n */\nexport const setConstraintTypeImplied = (): {\n [CONSTRAINT_TYPE]: ConstraintType;\n [REAL_CONSTRAINT_TYPE]: ConstraintType;\n [CONSTRAINT_TYPE_OLD]: ConstraintType;\n} => ({\n [CONSTRAINT_TYPE]: IMPLIED_CONSTRAINT_ON_DATE_EDIT,\n [REAL_CONSTRAINT_TYPE]: IMPLIED_CONSTRAINT_ON_DATE_EDIT,\n [CONSTRAINT_TYPE_OLD]: IMPLIED_CONSTRAINT_ON_DATE_EDIT\n});\n\n/**\n * The 2 \"echo\" type-cluster fields (`real_constraint_type` and\n * `constraint_type_old`) set when a date edit lands on an already-constrained\n * activity (constraint_type unchanged — preserved as-is). Used by the\n * constraint-date pipeline so it never names the foreign field keys directly.\n */\nexport const setConstraintTypePreserved = (\n value: ConstraintType | null\n): {\n [REAL_CONSTRAINT_TYPE]: ConstraintType | null;\n [CONSTRAINT_TYPE_OLD]: ConstraintType | null;\n} => ({\n [REAL_CONSTRAINT_TYPE]: value,\n [CONSTRAINT_TYPE_OLD]: value\n});\n","import { CONSTRAINT_DATE, LAST_CONSTRAINT_DATE } from './constants.js';\n\n/**\n * `constraint_date` and `last_constraint_date` move together to the same\n * instant. Owned here so no other column writes these strings.\n */\nexport const setConstraintDate = (\n value: Date\n): { [CONSTRAINT_DATE]: Date; [LAST_CONSTRAINT_DATE]: Date } => ({\n [CONSTRAINT_DATE]: value,\n [LAST_CONSTRAINT_DATE]: value\n});\n\n/**\n * Writes only `constraint_date`. Use when `last_constraint_date` is either\n * not written in the same operation or written to a different value\n * (e.g. constraint-type pipeline derives them independently).\n */\nexport const setConstraintDateOnly = (\n value: Date | null\n): { [CONSTRAINT_DATE]: Date | null } => ({\n [CONSTRAINT_DATE]: value\n});\n\n/**\n * Writes only `last_constraint_date`. Use when preserving the outgoing\n * constraint date on a dateless-type transition (asap/alap).\n */\nexport const setLastConstraintDate = (\n value: Date\n): { [LAST_CONSTRAINT_DATE]: Date } => ({\n [LAST_CONSTRAINT_DATE]: value\n});\n","/**\n * Thin re-export of constraint primitives from the canonical module\n * (`src/constraints/`). Kept for backward-compat with existing pipeline\n * imports — new code should import from `../../constraints` directly.\n */\n\nimport {\n checkConstraintViolation as canonicalCheck,\n buildConstraintNotification as canonicalBuild,\n type ViolationCheck,\n type ConstraintNotification\n} from '../../constraints/index.js';\nimport type { ConstraintType, NotificationConfig } from '../types.js';\n\nexport { pickProjectedDateForConstraint } from '../../constraints/index.js';\n\nexport type ConstraintCheckResult = ViolationCheck;\n\nexport function checkConstraintViolation(\n constraintType: ConstraintType,\n constraintDate: Date | null,\n projectedDate: Date\n): ConstraintCheckResult {\n return canonicalCheck(constraintType, constraintDate, projectedDate);\n}\n\nexport function buildConstraintNotification(\n constraintType: ConstraintType,\n constraintDate: Date,\n projectedDate?: Date\n): NotificationConfig {\n return canonicalBuild(\n constraintType,\n constraintDate,\n projectedDate\n ) as NotificationConfig;\n}\n\nexport type { ConstraintNotification };\n","import type {\n ColumnPipeline,\n ActivitySnapshot,\n PipelineContext\n} from '../types.js';\nimport { typeForNewDuration } from '../../activity-types/index.js';\nimport { canEdit, cannotEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid, invalid } from '../results.js';\nimport { fieldChanges } from '../results.js';\nimport {\n isCompletedActivity,\n isSummaryActivity\n} from '../shared/activity-predicates.js';\nimport { durationToHours } from '../shared/duration.js';\nimport { setEndDate } from '../end-date/setter.js';\nimport { setConstraintTypeImplied } from '../constraint-type/setter.js';\nimport {\n setConstraintDate,\n setLastConstraintDate\n} from '../constraint-date/setter.js';\nimport { KEEP_CONSTRAINTS } from './constants.js';\nimport { LAST_CONSTRAINT } from '../constraint-type/constants.js';\nimport { LAST_START_DATE } from '../start-date/constants.js';\n\nimport {\n checkConstraintViolation,\n buildConstraintNotification,\n type ConstraintCheckResult\n} from '../shared/constraint-validation.js';\n\nexport const durationPipeline: ColumnPipeline<number> = {\n canEdit(activity) {\n if (isCompletedActivity(activity))\n return cannotEdit('completed', 'cant_edit_completed_activity');\n if (isSummaryActivity(activity))\n return cannotEdit('summary', 'summary_column_value');\n return canEdit();\n },\n\n parseInput(rawValue, _activity, ctx) {\n const numericValue = parseFloat(String(rawValue));\n if (Number.isNaN(numericValue)) return parseError('not_a_number');\n // Engine internally works in HOURS. Default contract: callers send DAYS\n // (backend, card, UI mental model) → convert here. But `inputUnit:'hours'`\n // means the caller already sent hours (the DHTMLX grid editor produces the\n // store unit via formatter.parse) → use verbatim, no double-conversion.\n return parsed(\n ctx.inputUnit === 'hours'\n ? numericValue\n : durationToHours(numericValue, ctx.hoursPerDay)\n );\n },\n\n validate(_activity, oldValue, newValue) {\n if (isNegativeDuration(newValue)) return invalid('negative_duration');\n if (isUnchangedValue(oldValue, newValue)) return invalid('unchanged');\n\n // R2 (decisión 2026-07-04, supersede el rechazo canónico del\n // 2026-05-18): una violación end-based NO rechaza — el edit aplica\n // (end = start + duration, sin pull-back mágico ni columna que miente)\n // y `transform` emite el constraintWarning para el modal.\n return valid();\n },\n\n transform(activity, newValue, ctx) {\n const constraintCheck = checkDurationAgainstConstraints(\n activity,\n newValue,\n ctx\n );\n const extraFields = buildDurationExtraFields(\n activity,\n newValue,\n ctx,\n constraintCheck.violated\n );\n return {\n ...fieldChanges(newValue, extraFields, {\n autoSchedule: true,\n postProcessors: ['updateParentDuration']\n }),\n ...(constraintCheck.violated\n ? {\n constraintWarning: buildConstraintNotification(\n constraintCheck.constraintType!,\n constraintCheck.constraintDate!,\n calculateEndDateForDuration(activity, newValue, ctx) ?? undefined\n )\n }\n : {})\n };\n },\n\n trackEvent: 'activity_duration_entry'\n};\n\n// ─── Named helpers ──────────────────────────────────────────\n\nfunction isNegativeDuration(value: number): boolean {\n return Math.sign(value) === -1;\n}\n\nfunction isUnchangedValue(oldValue: number, newValue: number): boolean {\n return oldValue === newValue;\n}\n\nfunction checkDurationAgainstConstraints(\n activity: Readonly<ActivitySnapshot>,\n newDuration: number,\n ctx: Readonly<PipelineContext>\n): ConstraintCheckResult {\n const calendar = ctx.calendars.getCalendar(activity.calendar_id);\n if (!calendar) return { violated: false };\n\n // Editing duration keeps start_date fixed and moves end_date. Only\n // end-based constraints (FNET/FNLT/MFO) can be violated by this. Start-\n // based constraints (SNET/SNLT/MSO) anchor on start, which is unchanged,\n // so they cannot be violated here. Validated against production\n // 2026-05-18 (sandbox 23670/84317): editing duration on an MSO activity\n // accepts the change and just extends end_date.\n const type = activity.constraint_type;\n if (type !== 'fnet' && type !== 'fnlt' && type !== 'mfo') {\n return { violated: false };\n }\n\n const projectedEnd = calendar.calculateEndDate(\n activity.start_date,\n newDuration\n );\n return checkConstraintViolation(type, activity.constraint_date, projectedEnd);\n}\n\nfunction buildDurationExtraFields(\n activity: Readonly<ActivitySnapshot>,\n newDuration: number,\n ctx: Readonly<PipelineContext>,\n violatesConstraint = false\n): Record<string, unknown> {\n const fields: Record<string, unknown> = {};\n\n // D-D (2026-07-04): la violación end-based se resuelve a SNET con el\n // start vigente (que no se mueve en un duration edit) — nunca el\n // downgrade ASAP del legacy.\n if (violatesConstraint) {\n Object.assign(\n fields,\n setConstraintTypeImplied(),\n setConstraintDate(activity.start_date)\n );\n }\n\n // task ⇄ milestone flip owned by activity-types/transitions.ts:\n // duration 0 ⇒ milestone; 0 → positive ⇒ task; otherwise no type change.\n const flippedType = typeForNewDuration(activity.duration, newDuration);\n fields.is_milestone = flippedType === 'milestone';\n if (flippedType) {\n fields.type = flippedType;\n }\n\n fields.duration = newDuration;\n fields.for_disable_milestone_duration = newDuration;\n // Ported from gantt-general-config.js onBeforeSave (duration branch):\n // capture the PRE-edit constraint + start_date so undo / post-schedule\n // checks can see where the activity came from.\n //\n // Legacy parity (JUN-03 120893): legacy stamps `last_constraint_date =\n // task.constraint_date`. For a DATELESS (asap/alap) activity the core\n // deliberately keeps `constraint_date = null` (tested), whereas legacy\n // retains the prior real constraint date — so a literal stamp would null\n // the mirror that the prior dateless-transition preserved. Fall back to the\n // existing `lastConstraintDate` when the live constraint_date is null so the\n // mirror keeps the last real constraint date, matching the oracle. This is\n // an edit/drag-validation mirror, not a CPM input.\n fields[LAST_CONSTRAINT] = activity.constraint_type;\n const lastConstraintDateValue =\n activity.constraint_date ?? activity.last_constraint_date;\n if (lastConstraintDateValue !== null) {\n Object.assign(fields, setLastConstraintDate(lastConstraintDateValue));\n }\n fields[LAST_START_DATE] = activity.start_date;\n\n // DHTMLX-internal marker: duration / linked-column inline edits set\n // $keep_constraints = true so the scheduler doesn't auto-promote the\n // constraint_type when dates shift (dhtmlxgantt.js:50201).\n fields[KEEP_CONSTRAINTS] = true;\n\n const endDate = calculateEndDateForDuration(activity, newDuration, ctx);\n if (endDate) {\n Object.assign(fields, setEndDate(endDate));\n }\n\n return fields;\n}\n\nfunction calculateEndDateForDuration(\n activity: Readonly<ActivitySnapshot>,\n newDuration: number,\n ctx: Readonly<PipelineContext>\n): Date | null {\n const calendar = ctx.calendars.getCalendar(activity.calendar_id);\n if (!calendar) return null;\n return calendar.calculateEndDate(activity.start_date, newDuration);\n}\n","import type {\n ActivitySnapshot,\n CascadeMutation,\n ColumnPipeline,\n PostProcessorName,\n TrackingEvent\n} from '../types.js';\nimport type { HierarchyReader } from '../ports/hierarchy-reader.js';\nimport { canEdit, cannotEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid, invalid } from '../results.js';\nimport { computeWeightedProgressRollup } from '../shared/weighted-progress.js';\nimport { fieldChanges } from '../results.js';\nimport {\n isSummaryActivity,\n hasLookaheadTasks,\n PROGRESS_COMPLETE\n} from '../shared/activity-predicates.js';\nimport { PROGRESS_CHANGED_BY_ACTION_BUTTON } from './constants.js';\n\nconst MIN_PROGRESS = 0;\nconst MAX_PROGRESS = PROGRESS_COMPLETE;\nconst PROGRESS_NONE = 0;\n\nexport const progressPipeline: ColumnPipeline<number> = {\n canEdit(activity) {\n if (hasLookaheadTasks(activity))\n return cannotEdit('has_lookahead_tasks', 'cant_edit_actvity_with_task');\n if (isSummaryActivity(activity))\n return cannotEdit('summary', 'summary_column_value');\n return canEdit();\n },\n\n parseInput(rawValue) {\n const numericValue = parseFloat(String(rawValue));\n if (Number.isNaN(numericValue)) return parseError('not_a_number');\n return parsed(numericValue);\n },\n\n validate(_activity, _oldValue, newValue) {\n if (isOutOfRange(newValue)) return invalid('out_of_range');\n return valid();\n },\n\n transform(activity, newValue, ctx) {\n const autoScheduling = determineAutoScheduling(newValue);\n const recursive = isRecursiveProgressChange(newValue);\n\n // Color y status NO se emiten desde el pipeline (T-19, 2026-07-10):\n // el status lo recalcula el post-processor de status del dispatch y el\n // color lo deriva el cliente al borde (recolorActiveSchemeChanges +\n // colorSetter) desde el status + esquema activo. El pipeline emite solo\n // dominio.\n const extraFields: Record<string, unknown> = {\n auto_scheduling: autoScheduling\n };\n if (recursive) {\n extraFields[PROGRESS_CHANGED_BY_ACTION_BUTTON] = true;\n }\n\n const descendantCascade = recursive\n ? buildDescendantCascade(\n activity,\n newValue,\n autoScheduling,\n ctx.hierarchy\n )\n : [];\n const ancestorCascade = recursive\n ? buildAncestorRollupCascade(activity, newValue, ctx.hierarchy)\n : [];\n const cascadeMutations =\n descendantCascade.length + ancestorCascade.length > 0\n ? [...descendantCascade, ...ancestorCascade]\n : undefined;\n\n // Rollup to ancestors is emitted as cascadeMutations above — the\n // transform pre-computes every ancestor's weighted-progress result\n // using the overlay of (self + descendants mutated to newValue).\n // The only post-processor left is `updateParentDuration` for the\n // old_*_registered bookkeeping + parent bounds aggregation.\n const postProcessors: PostProcessorName[] = ['updateParentDuration'];\n\n const trackingEvents = recursive\n ? buildRecursiveTrackingEvents(activity, newValue)\n : undefined;\n\n return fieldChanges(newValue, extraFields, {\n autoSchedule: false,\n postProcessors,\n cascadeMutations,\n trackingEvents\n });\n },\n\n trackEvent: 'activity_progress_entry'\n};\n\n// ─── Named helpers ──────────────────────────────────────────\n\nfunction isOutOfRange(value: number): boolean {\n return value < MIN_PROGRESS || value > MAX_PROGRESS;\n}\n\n/**\n * Legacy rule (`completeTaskRecursive` / `uncompleteTaskRecursive` in\n * `views/schedule/gantt-general-config.js`): auto_scheduling is `true`\n * only when progress is reset to 0; any other value disables it. Kept\n * identical so fixtures recorded against the legacy flow reproduce.\n */\nfunction determineAutoScheduling(progress: number): boolean {\n return progress === PROGRESS_NONE;\n}\n\n/**\n * Progress changes to 0 or 100 are treated as \"complete / uncomplete\"\n * and propagate atomically to every descendant — matches legacy\n * `completeTaskRecursive` semantics triggered from the progress button\n * and from inline edits with values 0 or 100 (`onEditEnd.js`).\n */\nfunction isRecursiveProgressChange(value: number): boolean {\n return value === PROGRESS_COMPLETE || value === PROGRESS_NONE;\n}\n\nfunction buildDescendantCascade(\n activity: Readonly<ActivitySnapshot>,\n newValue: number,\n autoScheduling: boolean,\n hierarchy: HierarchyReader\n): readonly CascadeMutation[] {\n const descendants = hierarchy.getDescendantIds(activity.id);\n return descendants.map((id) => ({\n activityId: id,\n // Descendants of a recursive progress change inherit the primary value.\n fields: descendantFields(newValue, autoScheduling)\n }));\n}\n\nfunction descendantFields(\n newValue: number,\n autoScheduling: boolean\n): Readonly<Record<string, unknown>> {\n return {\n progress: newValue,\n auto_scheduling: autoScheduling,\n [PROGRESS_CHANGED_BY_ACTION_BUTTON]: true\n };\n}\n\n/**\n * Emit a cascadeMutation per ancestor with the weighted-progress rollup\n * already computed. Mirrors legacy `check_progress` (editing-flow.js:\n * 154-197): `parent.progress = Σ(child.progress × child.ponderator / 100)`\n * stored as a `.toFixed(2)` string for downstream loose-equality checks\n * (`progress != old_progress_registered`) to behave identically.\n *\n * The overlay carries the progress value each descendant/self will have\n * AFTER applying this field-changes object — that way deeper ancestors\n * see post-cascade progress without needing a live applied state.\n */\nfunction buildAncestorRollupCascade(\n activity: Readonly<ActivitySnapshot>,\n newValue: number,\n hierarchy: HierarchyReader\n): readonly CascadeMutation[] {\n const overlay = new Map<string, number>();\n overlay.set(activity.id, newValue);\n for (const descendantId of hierarchy.getDescendantIds(activity.id)) {\n overlay.set(descendantId, newValue);\n }\n\n // Legacy's completeTaskRecursive sets `task.progress = newValue` sync\n // and then calls `check_progress(gantt, task)` ONCE. `check_progress`\n // starts at `task.parent` (editing-flow.js:160-162) — it never\n // recomputes the clicked activity itself. The clicked activity keeps\n // whatever primaryValue the user chose. So our chain walks ancestors\n // only, starting at the immediate parent.\n const chain: string[] = [];\n for (const ancestorId of hierarchy.getAncestorIds(activity.id)) {\n chain.push(ancestorId);\n }\n\n const mutations: CascadeMutation[] = [];\n for (const id of chain) {\n const rollup = computeWeightedProgress(id, overlay, hierarchy);\n overlay.set(id, Number(rollup));\n mutations.push({\n activityId: id,\n fields: { progress: rollup }\n });\n }\n return mutations;\n}\n\nfunction computeWeightedProgress(\n parentId: string,\n overlay: ReadonlyMap<string, number>,\n hierarchy: HierarchyReader\n): string {\n // Single source of the formula: weighted-progress.ts. This site owns\n // two edges the goldens pin: the overlay (edited values win over stale\n // snapshot progress) and the output shape — toFixed(2) STRING, with\n // \"0.00\" (not frozen) when nothing contributes.\n const children = hierarchy.getChildProgressInfo(parentId).map((child) => ({\n progress: overlay.has(child.id)\n ? (overlay.get(child.id) as number)\n : child.progress,\n ponderator: child.ponderator ?? 0\n }));\n return (computeWeightedProgressRollup(children) ?? 0).toFixed(2);\n}\n\n/**\n * Mirrors the Amplitude event the legacy `completeTaskRecursive` /\n * `uncompleteTaskRecursive` fire in `gantt-general-config.js:1900, 1945`:\n * 'activity_progress_update_radio_button'\n * with `progress_updated` set to the new value. Pipeline declares the\n * event; the wiring dispatches it via `trackingEvent()`.\n */\nfunction buildRecursiveTrackingEvents(\n activity: Readonly<ActivitySnapshot>,\n newValue: number\n): readonly TrackingEvent[] {\n return [\n {\n name: 'activity_progress_update_radio_button',\n properties: {\n activity_id: activity.id,\n activity_name: activity.text,\n progress_updated: newValue\n }\n }\n ];\n}\n","/**\n * `cost` (budgeted cost) column pipeline.\n *\n * When the user edits an activity's `cost`, this pipeline emits:\n * 1. `primaryValue` — the new cost value on the edited activity.\n * 2. `cascadeMutations` — ancestor rollup using the overlay pattern.\n * Each ancestor's new `cost` is the sum of its children's `cost`\n * (post-overlay).\n *\n * Mirrors legacy `updateCostAndHH` rollup. `real_cost` cascade is\n * deliberately NOT included here: legacy formula is\n * `real_cost = (progress / 100) × baseline.cost`, which depends on\n * baselines — not yet modeled in core. Deferred until the baselines\n * port lands (same constraint as ponderator).\n *\n * Divergence vs legacy (mirrors hh H1 / used_cost H1): legacy does NOT\n * recompute `cost` on indent/outdent/move — core fixes that via\n * `recomputeCostCascadeForParent` invoked from those dispatch branches.\n */\n\nimport type {\n ColumnPipeline,\n ActivitySnapshot,\n CascadeMutation\n} from '../types.js';\nimport type { HierarchyReader } from '../ports/hierarchy-reader.js';\nimport { canEdit, cannotEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\nimport { isSummaryActivity } from '../shared/activity-predicates.js';\n\nexport const costPipeline: ColumnPipeline<number> = {\n canEdit(activity) {\n if (isSummaryActivity(activity)) {\n return cannotEdit('summary', 'summary_column_value');\n }\n return canEdit();\n },\n\n parseInput(rawValue) {\n const numericValue = parseFloat(String(rawValue));\n if (Number.isNaN(numericValue)) return parseError('not_a_number');\n return parsed(numericValue);\n },\n\n validate() {\n return valid();\n },\n\n transform(activity, newValue, ctx) {\n const cascadeMutations = buildCostAncestorCascade(\n activity,\n newValue,\n ctx.hierarchy\n );\n\n return fieldChanges(\n newValue,\n {},\n {\n autoSchedule: false,\n postProcessors: ['updateParentDuration'],\n cascadeMutations\n }\n );\n },\n\n trackEvent: 'activity_cost_budgeted_entry'\n};\n\nfunction buildCostAncestorCascade(\n activity: Readonly<ActivitySnapshot>,\n newCost: number,\n hierarchy: HierarchyReader\n): readonly CascadeMutation[] {\n const overlay = new Map<string, number>();\n overlay.set(activity.id, newCost);\n\n const mutations: CascadeMutation[] = [];\n for (const ancestorId of hierarchy.getAncestorIds(activity.id)) {\n let sum = 0;\n for (const child of hierarchy.getChildCostInfo(ancestorId)) {\n sum += overlay.has(child.id)\n ? (overlay.get(child.id) as number)\n : child.cost;\n }\n overlay.set(ancestorId, sum);\n mutations.push({\n activityId: ancestorId,\n fields: { cost: sum }\n });\n }\n return mutations;\n}\n","/**\n * `used_cost` (spent budget) column pipeline.\n *\n * When the user edits an activity's `used_cost`, this pipeline emits:\n * 1. `primaryValue` — the new used_cost value on the edited activity.\n * 2. `cascadeMutations` — ancestor rollup using the same overlay pattern\n * as `hhWorkTimePipeline.buildHhAncestorCascade`. Each ancestor's\n * new `used_cost` is the sum of its children's `used_cost`\n * (post-overlay).\n *\n * Independent column: no derived field (no real_work / real_cost\n * counterpart computed from used_cost). Mirrors legacy `updateCostAndHH`\n * which sums `used_cost` directly to parents alongside cost/hh.\n *\n * Divergence vs legacy (mirrors hh H1): legacy does NOT recompute\n * `used_cost` on indent/outdent/move — core fixes that via\n * `recomputeUsedCostCascadeForParent` invoked from those dispatch\n * branches.\n */\n\nimport type {\n ColumnPipeline,\n ActivitySnapshot,\n CascadeMutation\n} from '../types.js';\nimport type { HierarchyReader } from '../ports/hierarchy-reader.js';\nimport { canEdit, cannotEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\nimport { isSummaryActivity } from '../shared/activity-predicates.js';\n\nexport const usedCostPipeline: ColumnPipeline<number> = {\n canEdit(activity) {\n if (isSummaryActivity(activity)) {\n return cannotEdit('summary', 'summary_column_value');\n }\n return canEdit();\n },\n\n parseInput(rawValue) {\n const numericValue = parseFloat(String(rawValue));\n if (Number.isNaN(numericValue)) return parseError('not_a_number');\n return parsed(numericValue);\n },\n\n validate() {\n return valid();\n },\n\n transform(activity, newValue, ctx) {\n const cascadeMutations = buildUsedCostAncestorCascade(\n activity,\n newValue,\n ctx.hierarchy\n );\n\n return fieldChanges(\n newValue,\n {},\n {\n autoSchedule: false,\n postProcessors: ['updateParentDuration'],\n cascadeMutations\n }\n );\n },\n\n trackEvent: 'activity_cost_spent_entry'\n};\n\nfunction buildUsedCostAncestorCascade(\n activity: Readonly<ActivitySnapshot>,\n newUsedCost: number,\n hierarchy: HierarchyReader\n): readonly CascadeMutation[] {\n const overlay = new Map<string, number>();\n overlay.set(activity.id, newUsedCost);\n\n const mutations: CascadeMutation[] = [];\n for (const ancestorId of hierarchy.getAncestorIds(activity.id)) {\n let sum = 0;\n for (const child of hierarchy.getChildUsedCostInfo(ancestorId)) {\n sum += overlay.has(child.id)\n ? (overlay.get(child.id) as number)\n : child.used_cost;\n }\n overlay.set(ancestorId, sum);\n mutations.push({\n activityId: ancestorId,\n fields: { used_cost: sum }\n });\n }\n return mutations;\n}\n","import { REAL_WORK } from './constants.js';\nexport const setRealWork = (value: number): { [REAL_WORK]: number } => ({\n [REAL_WORK]: value\n});\n","/**\n * `hhWorkTime` (labor hours) column pipeline.\n *\n * When the user edits an activity's `hhWorkTime`, this pipeline emits:\n * 1. `primaryValue` — the new hh value on the edited activity.\n * 2. `extraFields.real_work` — recomputed from `(hh × progress) / 100`.\n * Matches legacy `updateCostAndHH` semantics. If the activity carried\n * an explicit manual `real_work`, this edit overrides it (the\n * assumption is that updating hh invalidates the prior derived value).\n * 3. `cascadeMutations` — ancestor rollup using the same overlay pattern\n * as `progressPipeline.buildAncestorRollupCascade`. Each ancestor's\n * new `hhWorkTime` is the sum of its children's `hhWorkTime`\n * (post-overlay), and `real_work` is the sum of children's real_work\n * (post-overlay).\n *\n * Cascade follows legacy `updateCostAndHH`\n * (`react_client/src/assets/js/events/utils/updateCostAndHH.js`), which\n * walks ancestors summing children recursively.\n *\n * Divergence vs legacy (H1, see\n * Obsidian:newPlanSchedule/schedule-core-hh-work-time-plan.md):\n * - Legacy does NOT recompute hh on indent/outdent/move (latent bug).\n * - Core fixes that via `recomputeHhCascadeForParent` helper invoked\n * from those dispatch branches.\n */\n\nimport type {\n ColumnPipeline,\n ActivitySnapshot,\n CascadeMutation\n} from '../types.js';\nimport type { HierarchyReader } from '../ports/hierarchy-reader.js';\nimport { canEdit, cannotEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\nimport { isSummaryActivity } from '../shared/activity-predicates.js';\nimport { setRealWork } from '../real-work/setter.js';\n\nexport const hhWorkTimePipeline: ColumnPipeline<number> = {\n canEdit(activity) {\n if (isSummaryActivity(activity)) {\n return cannotEdit('summary', 'summary_column_value');\n }\n return canEdit();\n },\n\n parseInput(rawValue) {\n const numericValue = parseFloat(String(rawValue));\n if (Number.isNaN(numericValue)) return parseError('not_a_number');\n return parsed(numericValue);\n },\n\n validate() {\n return valid();\n },\n\n transform(activity, newValue, ctx) {\n const selfRealWork = computeRealWork(newValue, activity.progress);\n\n const cascadeMutations = buildHhAncestorCascade(\n activity,\n newValue,\n selfRealWork,\n ctx.hierarchy\n );\n\n return fieldChanges(\n newValue,\n { ...setRealWork(selfRealWork) },\n {\n autoSchedule: false,\n postProcessors: ['updateParentDuration'],\n cascadeMutations\n }\n );\n },\n\n trackEvent: 'activity_labor_hours_budgeted_entry'\n};\n\n// ─── Named helpers (pure) ───────────────────────────────────\n\nfunction computeRealWork(hhWorkTime: number, progress: number): number {\n // Legacy: real_work = (hhWorkTime × progress) / 100. Both inputs may\n // be 0; result is 0.\n return (hhWorkTime * progress) / 100;\n}\n\n/**\n * Walks ancestors from immediate parent up to root, emitting one\n * `CascadeMutation` per ancestor with its newly-computed `hhWorkTime`\n * (sum of children) and `real_work` (sum of children's real_work).\n *\n * The overlay maps `activityId → post-mutation value`; each ancestor\n * reads the overlay for each child, falling back to the live value\n * from `getChildHhInfo` when the child wasn't touched.\n *\n * Matches the pattern in `progressPipeline.buildAncestorRollupCascade`.\n */\nfunction buildHhAncestorCascade(\n activity: Readonly<ActivitySnapshot>,\n newHh: number,\n newRealWork: number,\n hierarchy: HierarchyReader\n): readonly CascadeMutation[] {\n const hhOverlay = new Map<string, number>();\n const rwOverlay = new Map<string, number>();\n hhOverlay.set(activity.id, newHh);\n rwOverlay.set(activity.id, newRealWork);\n\n const mutations: CascadeMutation[] = [];\n for (const ancestorId of hierarchy.getAncestorIds(activity.id)) {\n let hhSum = 0;\n let rwSum = 0;\n for (const child of hierarchy.getChildHhInfo(ancestorId)) {\n const childHh = hhOverlay.has(child.id)\n ? (hhOverlay.get(child.id) as number)\n : child.hhWorkTime;\n const childRw = rwOverlay.has(child.id)\n ? (rwOverlay.get(child.id) as number)\n : computeRealWork(child.hhWorkTime, child.progress);\n hhSum += childHh;\n rwSum += childRw;\n }\n hhOverlay.set(ancestorId, hhSum);\n rwOverlay.set(ancestorId, rwSum);\n mutations.push({\n activityId: ancestorId,\n fields: { hhWorkTime: hhSum, ...setRealWork(rwSum) }\n });\n }\n return mutations;\n}\n","/**\n * Mismo día de DOMINIO: getters UTC, no locales (fix TZ-02, track\n * onAfterTaskDrag F6). Los dos lados que comparan los pipelines viven en\n * día-UTC-como-día-de-dominio: los instantes almacenados los produce el\n * engine vía `Date.UTC` (shiftStart/shiftEnd → 08:00Z del día) y el input\n * parseado es la canónica `truncateToUtcDay` (00:00Z). Con getters locales\n * la comparación se desfasaba según la TZ del browser/runner: pares del\n * mismo día UTC se juzgaban distintos (y viceversa) → rejects 'unchanged'\n * erráticos.\n */\nexport function isSameDay(dateA: Date, dateB: Date): boolean {\n return (\n dateA.getUTCFullYear() === dateB.getUTCFullYear() &&\n dateA.getUTCMonth() === dateB.getUTCMonth() &&\n dateA.getUTCDate() === dateB.getUTCDate()\n );\n}\n\nexport function isBeforeDate(date: Date, reference: Date): boolean {\n return date.getTime() < reference.getTime();\n}\n\nexport function isValidDate(value: unknown): value is Date {\n return value instanceof Date && !Number.isNaN(value.getTime());\n}\n","import { DURATION, FOR_DISABLE_MILESTONE_DURATION } from './constants.js';\n\nexport const setDuration = (value: number): { [DURATION]: number } => ({\n [DURATION]: value\n});\n\nexport const setMilestoneDurationFlag = (\n value: number\n): { [FOR_DISABLE_MILESTONE_DURATION]: number } => ({\n [FOR_DISABLE_MILESTONE_DURATION]: value\n});\n","import type {\n ColumnPipeline,\n ActivitySnapshot,\n PipelineContext,\n NotificationConfig\n} from '../types.js';\nimport {\n canEdit,\n cannotEdit,\n parsed,\n parseError,\n valid,\n invalid,\n fieldChanges\n} from '../results.js';\nimport {\n isSummaryActivity,\n hasProgress\n} from '../shared/activity-predicates.js';\nimport { isSameDay, isValidDate } from '../shared/date-comparison.js';\nimport {\n checkConstraintViolation,\n buildConstraintNotification,\n pickProjectedDateForConstraint\n} from '../shared/constraint-validation.js';\nimport { truncateToUtcDay, shiftStart } from '../shared/date-normalize.js';\nimport { setEndDate } from '../end-date/setter.js';\nimport { setDuration, setMilestoneDurationFlag } from '../duration/setter.js';\nimport { setConstraintTypeImplied } from '../constraint-type/setter.js';\nimport { setConstraintDate } from '../constraint-date/setter.js';\nimport type { CalendarAPI } from '../../calendar/api.js';\n\n/**\n * `start_date` pipeline.\n *\n * The user's input represents *the day they picked*; the hour part of any\n * Date handed in is ignored (D5). The pipeline truncates the input to the\n * canonical UTC day, snaps to the next working day if needed (D7), expands\n * to the calendar's shift_start instant (D1), and recomputes `end_date` by\n * consuming `duration` working hours forward (D3).\n *\n * `constraint_date` y `last_constraint_date` siguen al `start_date` snapeado:\n * - Día: el día laboral al que `start_date` quedó snapeado (no el día\n * crudo tipeado por el usuario).\n * - Hora: `shift_start` del calendario (típicamente 08:00).\n *\n * Por lo tanto, al editar `start_date`, `constraint_date` SIEMPRE coincide\n * con `start_date` (mismo día laboral, misma hora). Si el usuario tipeó un\n * día no laboral (ej. domingo), tanto `start_date` como `constraint_date`\n * apuntan al próximo día laboral (lunes 08:00). Verificado en prod en vivo\n * 2026-06-19 (proyecto 925, app.outbuild.com): editar start→domingo siembra\n * constraint_date = lunes snapeado @08:00.\n *\n * ESTE es el escenario 1 (seed de constraint_date al editar start_date).\n * Es distinto del escenario 2 (edición DIRECTA de la columna\n * `constraint_date`, en `constraintDatePipeline`), donde el día tipeado SÍ\n * se preserva aunque sea no laboral — esa es la regla canónica\n * `RULE_constraint_date_preserves_typed_day.md`. NO confundir los dos paths.\n */\nexport const startDatePipeline: ColumnPipeline<Date> = {\n canEdit(activity) {\n if (isSummaryActivity(activity)) {\n return cannotEdit('summary', 'summary_column_value');\n }\n if (hasProgress(activity)) {\n return cannotEdit('has_progress', 'cant_edit_activity_with_progress');\n }\n return canEdit();\n },\n\n parseInput(rawValue, _activity, _ctx) {\n if (!isValidDate(rawValue)) {\n return parseError('invalid_date');\n }\n return parsed(truncateToUtcDay(rawValue, 'UTC'));\n },\n\n validate(activity, oldValue, newValue, ctx) {\n if (isSameDay(oldValue, newValue)) {\n return invalid('unchanged');\n }\n\n const parentViolation = checkParentStartConstraint(activity, newValue, ctx);\n if (parentViolation) {\n return parentViolation;\n }\n\n // Constraint violations do NOT reject — they apply the change and show\n // a modal that lets the user revert (optimistic apply pattern).\n return valid();\n },\n\n transform(activity, newValue, ctx) {\n const calendar = ctx.calendars.getCalendar(activity.calendar_id);\n if (!calendar) {\n // No calendar: fall back to the raw day so the pipeline still emits\n // a coherent FieldChanges; downstream code handles missing-calendar.\n return fieldChanges(\n newValue,\n { ...setConstraintTypeImplied(), ...setConstraintDate(newValue) },\n {\n autoSchedule: true,\n postProcessors: ['updateParentDuration', 'adjustLinkLagOnTaskMove']\n }\n );\n }\n\n const finalStart = shiftStart(calendar, newValue);\n // Regla milestone DECLARADA (MI-01/MI-02, track onAfterTaskDrag F5):\n // end = start y duration 0 SIEMPRE — defendida ante estado sucio\n // (type milestone con duration/end corruptos entra verbatim desde el\n // backend; antes \"funcionaba de carambola\" solo si duration ya era 0\n // y un estado corrupto se PROPAGABA).\n const milestoneActivity = activity.type === 'milestone';\n const finalEnd = milestoneActivity\n ? finalStart\n : calendar.calculateEndDate(finalStart, activity.duration);\n\n // `constraint_date` (y `last_constraint_date`) siguen al `start_date`\n // snapeado: usan el día laboral final (`finalStart`), no el día crudo\n // tipeado. Si el usuario tipeó un domingo, start_date snapea a lunes\n // 08:00 y constraint_date hace lo mismo. Verificado en prod 2026-06-19.\n // (Esto es el escenario 1 — distinto del edit directo de constraint_date,\n // que sí preserva el día tipeado.)\n const constraintDate = finalStart;\n\n return {\n ...fieldChanges(\n finalStart,\n {\n ...setEndDate(finalEnd),\n // Sanea la duration de un milestone corrupto en el mismo move.\n ...(milestoneActivity\n ? { ...setDuration(0), ...setMilestoneDurationFlag(0) }\n : {}),\n ...setConstraintTypeImplied(),\n ...setConstraintDate(constraintDate)\n },\n {\n autoSchedule: true,\n postProcessors: ['updateParentDuration', 'adjustLinkLagOnTaskMove']\n }\n ),\n constraintWarning: detectConstraintWarning(activity, finalStart, calendar)\n };\n },\n\n trackEvent: 'activity_start_date_entry'\n};\n\n// ─── helpers ─────────────────────────────────────────────────────────────\n\nfunction checkParentStartConstraint(\n activity: Readonly<ActivitySnapshot>,\n newDate: Date,\n ctx: Readonly<PipelineContext>\n): ReturnType<typeof invalid> | null {\n const parentStartDate = ctx.hierarchy.getParentStartDateIfHasPredecessors(\n activity.id\n );\n if (!parentStartDate) return null;\n\n // Compare on a day basis: both newDate (already canonical) and the parent\n // start truncated to its UTC day. This matches user intent (\"the day I\n // picked is on/after the parent's day\"), regardless of intra-day hours.\n const parentDay = truncateToUtcDay(parentStartDate);\n if (newDate.getTime() < parentDay.getTime()) {\n return invalid('before_parent_start');\n }\n\n return null;\n}\n\nfunction detectConstraintWarning(\n activity: Readonly<ActivitySnapshot>,\n finalStart: Date,\n calendar: CalendarAPI\n): NotificationConfig | undefined {\n const projectedEnd = calendar.calculateEndDate(finalStart, activity.duration);\n // Paridad legacy (checkIfActivityViolateConstraint): MSO/SNET/SNLT se\n // violan por START; MFO/FNET/FNLT por END. Antes se comparaba SIEMPRE el\n // end proyectado y una violación snet/snlt/mso podía pasar inadvertida.\n const projectedDate = pickProjectedDateForConstraint(\n activity.constraint_type,\n finalStart,\n projectedEnd\n );\n const check = checkConstraintViolation(\n activity.constraint_type,\n activity.constraint_date,\n projectedDate\n );\n if (check.violated) {\n return buildConstraintNotification(\n check.constraintType!,\n check.constraintDate!,\n projectedDate\n );\n }\n return undefined;\n}\n","import { CALENDAR_UNIT } from '../../types.js';\nimport type {\n ColumnPipeline,\n ActivitySnapshot,\n PipelineContext,\n ValidationResult\n} from '../types.js';\nimport { canEdit, cannotEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid, invalid } from '../results.js';\nimport { fieldChanges } from '../results.js';\nimport { isSummaryActivity } from '../shared/activity-predicates.js';\nimport {\n isSameDay,\n isBeforeDate,\n isValidDate\n} from '../shared/date-comparison.js';\nimport { typeForNewDuration } from '../../activity-types/transitions.js';\nimport {\n checkConstraintViolation,\n buildConstraintNotification,\n pickProjectedDateForConstraint\n} from '../shared/constraint-validation.js';\nimport type { NotificationConfig } from '../types.js';\nimport {\n truncateToUtcDay,\n shiftEnd,\n DATELESS_CONSTRAINTS\n} from '../shared/date-normalize.js';\nimport { setConstraintTypeImplied } from '../constraint-type/setter.js';\nimport { setConstraintDate } from '../constraint-date/setter.js';\nimport { setDuration, setMilestoneDurationFlag } from '../duration/setter.js';\n\nconst NEAR_COMPLETE_THRESHOLD = 99.999;\n\nexport const endDatePipeline: ColumnPipeline<Date> = {\n canEdit(activity) {\n if (isSummaryActivity(activity))\n return cannotEdit('summary', 'summary_column_value');\n if (isNearlyCompleted(activity))\n return cannotEdit('completed', 'cant_edit_completed_activity');\n return canEdit();\n },\n\n parseInput(rawValue, activity, ctx) {\n if (!isValidDate(rawValue)) return parseError('invalid_date');\n\n // Canonicalize to UTC midnight of the typed day. If that day is a\n // working day, expand to its shift_end (inclusive last working instant).\n // If non-working, leave at midnight so `validate` rejects with\n // `not_working_day`. NO `+ 1 day` arithmetic — input is already the\n // user's intended inclusive end day.\n const day = truncateToUtcDay(rawValue, 'UTC');\n const calendar = ctx.calendars.getCalendar(activity.calendar_id);\n if (!calendar) return parsed(day);\n if (!calendar.isWorkTime(day, CALENDAR_UNIT.DAY)) return parsed(day);\n return parsed(shiftEnd(calendar, day));\n },\n\n validate(activity, _oldValue, newValue, ctx) {\n if (isSameDay(activity.end_date, newValue)) return invalid('unchanged');\n if (isBeforeDateOrigin(newValue, activity))\n return invalid('before_date_origin');\n if (isBeforeStartDate(newValue, activity))\n return invalid('before_start_date');\n\n const workTimeCheck = checkIsWorkingDay(newValue, activity, ctx);\n if (workTimeCheck) return workTimeCheck;\n\n // R2 (decisión D-B 2026-07-04): una violación de constraint NO rechaza —\n // el edit aplica y `transform` emite el constraintWarning para el modal.\n return valid();\n },\n\n transform(activity, newValue, ctx) {\n const constraintWarning = detectEndDateConstraintWarning(\n activity,\n newValue\n );\n const extraFields = buildEndDateExtraFields(\n activity,\n newValue,\n ctx,\n Boolean(constraintWarning)\n );\n return {\n ...fieldChanges(newValue, extraFields, {\n autoSchedule: true,\n postProcessors: ['updateParentDuration', 'updateTaskTiming']\n }),\n ...(constraintWarning ? { constraintWarning } : {})\n };\n },\n\n trackEvent: 'activity_end_date_entry'\n};\n\n// ─── canEdit helpers ────────────────────────────────────────\n\nfunction isNearlyCompleted(activity: Readonly<ActivitySnapshot>): boolean {\n return activity.progress >= NEAR_COMPLETE_THRESHOLD;\n}\n\n// ─── validate helpers ───────────────────────────────────────\n\nfunction isBeforeDateOrigin(\n newDate: Date,\n activity: Readonly<ActivitySnapshot>\n): boolean {\n if (!activity.date_origin) return false;\n return isBeforeDate(newDate, activity.date_origin);\n}\n\nfunction isBeforeStartDate(\n newDate: Date,\n activity: Readonly<ActivitySnapshot>\n): boolean {\n return isBeforeDate(newDate, activity.start_date);\n}\n\nfunction checkIsWorkingDay(\n newDate: Date,\n activity: Readonly<ActivitySnapshot>,\n ctx: Readonly<PipelineContext>\n): ValidationResult | null {\n const calendar = ctx.calendars.getCalendar(activity.calendar_id);\n if (!calendar) return null;\n\n if (!calendar.isWorkTime(newDate, CALENDAR_UNIT.DAY)) {\n return invalid('not_working_day');\n }\n\n return null;\n}\n\n// ─── transform helpers ──────────────────────────────────────\n\n/**\n * Detección R2 contra el constraint PRE-edit. Per-type (paridad legacy\n * `checkIfActivityViolateConstraint`): un end edit no mueve el start, así\n * que los start-based (MSO/SNET/SNLT) se chequean contra el start intacto\n * y los end-based (MFO/FNET/FNLT) contra el end tipeado.\n */\nfunction detectEndDateConstraintWarning(\n activity: Readonly<ActivitySnapshot>,\n newEndDate: Date\n): NotificationConfig | undefined {\n const projectedDate = pickProjectedDateForConstraint(\n activity.constraint_type,\n activity.start_date,\n newEndDate\n );\n const check = checkConstraintViolation(\n activity.constraint_type,\n activity.constraint_date,\n projectedDate\n );\n if (!check.violated) return undefined;\n return buildConstraintNotification(\n check.constraintType!,\n check.constraintDate!,\n projectedDate\n );\n}\n\nfunction buildEndDateExtraFields(\n activity: Readonly<ActivitySnapshot>,\n newEndDate: Date,\n ctx: Readonly<PipelineContext>,\n violatesConstraint = false\n): Record<string, unknown> {\n const fields: Record<string, unknown> = {};\n\n // D-D (2026-07-04): un constraint violado se resuelve a SNET con el start\n // vigente — nunca el downgrade ASAP del legacy. Sin violación, se conserva\n // la regla previa (solo asap/alap pasan a snet).\n if (violatesConstraint || hasDatelessConstraintType(activity)) {\n Object.assign(\n fields,\n setConstraintTypeImplied(),\n setConstraintDate(activity.start_date)\n );\n }\n\n const newDuration = calculateNewDuration(activity, newEndDate, ctx);\n // Flip task ⇄ milestone con la MISMA regla canónica del durationPipeline\n // (`typeForNewDuration`): un end edit que da duration > 0 sobre un\n // milestone lo convierte a task — nunca queda milestone con duration > 0\n // (MIL-B3 / MI-03, track onAfterTaskDrag F5). end_date ES editable en\n // milestones (MILESTONES.md §16), así que el reject sería regresión.\n const flippedType = typeForNewDuration(activity.duration, newDuration);\n if (flippedType) {\n fields.type = flippedType;\n fields.is_milestone = flippedType === 'milestone';\n }\n Object.assign(\n fields,\n setDuration(newDuration),\n setMilestoneDurationFlag(newDuration)\n );\n fields.end_date = newEndDate;\n\n return fields;\n}\n\nfunction hasDatelessConstraintType(\n activity: Readonly<ActivitySnapshot>\n): boolean {\n return DATELESS_CONSTRAINTS.has(activity.constraint_type);\n}\n\nfunction calculateNewDuration(\n activity: Readonly<ActivitySnapshot>,\n newEndDate: Date,\n ctx: Readonly<PipelineContext>\n): number {\n const calendar = ctx.calendars.getCalendar(activity.calendar_id);\n if (!calendar) return activity.duration;\n\n return calendar.calculateDuration(activity.start_date, newEndDate);\n}\n","import type {\n ColumnPipeline,\n ActivitySnapshot,\n ConstraintType\n} from '../types.js';\nimport { canEdit, cannotEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\nimport {\n isCompletedActivity,\n isSummaryActivity\n} from '../shared/activity-predicates.js';\nimport {\n DATELESS_CONSTRAINTS,\n END_BASED_CONSTRAINTS,\n START_BASED_CONSTRAINTS\n} from '../shared/date-normalize.js';\nimport { CONSTRAINT_TYPE } from '../../constraints/index.js';\nimport type { ConstraintExtraFields } from '../shared/constraint-fields.js';\nimport {\n setConstraintDateOnly,\n setLastConstraintDate\n} from '../constraint-date/setter.js';\nimport { REAL_CONSTRAINT_TYPE, LAST_CONSTRAINT } from './constants.js';\n\nconst VALID_CONSTRAINT_TYPES: ReadonlySet<string> = new Set(\n Object.values(CONSTRAINT_TYPE)\n);\n\nexport const constraintTypePipeline: ColumnPipeline<ConstraintType> = {\n canEdit(activity) {\n if (isCompletedActivity(activity))\n return cannotEdit('completed', 'cant_edit_completed_activity');\n if (isSummaryActivity(activity))\n return cannotEdit('summary', 'summary_column_value');\n return canEdit();\n },\n\n parseInput(rawValue) {\n const value = String(rawValue).toLowerCase();\n if (!isValidConstraintType(value))\n return parseError('invalid_constraint_type');\n return parsed(value as ConstraintType);\n },\n\n validate() {\n return valid();\n },\n\n transform(activity, newValue) {\n const extraFields = buildConstraintTypeExtraFields(activity, newValue);\n // `executeFixForConstraints` retirado (2026-06-05, paridad\n // correctWrongDates #9): era el workaround del ALAP legacy (restaurar\n // constraint si start no cambió tras autoschedule) y además comparaba\n // Dates por referencia (`===`) → prácticamente nunca disparaba. El core\n // mantiene constraint_type inmutable durante el scheduling, así que el\n // escenario que parchaba no existe. Estaba registrado como runNoOp\n // (\"not yet ported\") — el retiro lo hace explícito.\n // Ver CORRECT_WRONG_DATES_PARITY.md (vault).\n return fieldChanges(newValue, extraFields, {\n autoSchedule: true\n });\n }\n};\n\n// ─── Named helpers ──────────────────────────────────────────\n\nfunction isValidConstraintType(value: string): boolean {\n return VALID_CONSTRAINT_TYPES.has(value);\n}\n\nfunction buildConstraintTypeExtraFields(\n activity: Readonly<ActivitySnapshot>,\n newType: ConstraintType\n): ConstraintExtraFields {\n // Legacy parity (JUN-04 121988): in the schedule app the constraint_type\n // column is NOT inline-editable (onBeforeEditStart returns false for it) —\n // the ONLY live path that changes constraint_type is the POPOVER\n // (constraintTypeCol.js `changeOption`), which sets constraint_type /\n // real_constraint_type / last_constraint / constraint_date but DOES NOT\n // touch constraint_type_old or constraint_date_old (those stay anchored to\n // the last date/inline edit). So the core does NOT stamp them here either.\n // `constraint_type_old` is read by the legacy onAfterTaskUpdate\n // updateConstraintDate, which early-returns when it is unset — matching prod.\n const fields: ConstraintExtraFields = {\n constraint_type: newType,\n [REAL_CONSTRAINT_TYPE]: newType,\n [LAST_CONSTRAINT]: newType,\n ...setConstraintDateOnly(deriveConstraintDate(activity, newType))\n };\n\n // Legacy parity (JUN-03 120893): switching TO a dateless constraint\n // (asap/alap) clears `constraint_date`, but legacy preserves the OUTGOING\n // constraint_date into `last_constraint_date` (the date that was active\n // before the type went dateless). Verified against the oracle progression:\n // `last_constraint_date` is stamped only on the dateless transition, never\n // on snet/fnet→fnet steps. It is read by edit/drag restoration validation,\n // not by CPM, so it has no scheduling effect.\n if (DATELESS_CONSTRAINTS.has(newType) && activity.constraint_date) {\n Object.assign(fields, setLastConstraintDate(activity.constraint_date));\n }\n\n return fields;\n}\n\nfunction deriveConstraintDate(\n activity: Readonly<ActivitySnapshot>,\n newType: ConstraintType\n): Date | null {\n if (DATELESS_CONSTRAINTS.has(newType)) return null;\n if (START_BASED_CONSTRAINTS.has(newType)) return activity.start_date;\n if (END_BASED_CONSTRAINTS.has(newType)) return activity.end_date;\n return activity.constraint_date;\n}\n","import type {\n ColumnPipeline,\n ActivitySnapshot,\n ConstraintType\n} from '../types.js';\nimport { canEdit, cannotEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\nimport {\n isCompletedActivity,\n isSummaryActivity\n} from '../shared/activity-predicates.js';\nimport { isValidDate } from '../shared/date-comparison.js';\nimport {\n DATELESS_CONSTRAINTS,\n IMPLIED_CONSTRAINT_ON_DATE_EDIT,\n normalizeConstraintDate\n} from '../shared/date-normalize.js';\nimport type { ConstraintExtraFields } from '../shared/constraint-fields.js';\nimport {\n setConstraintTypeImplied,\n setConstraintTypePreserved\n} from '../constraint-type/setter.js';\n\nexport const constraintDatePipeline: ColumnPipeline<Date> = {\n canEdit(activity) {\n if (isCompletedActivity(activity))\n return cannotEdit('completed', 'cant_edit_completed_activity');\n if (isSummaryActivity(activity))\n return cannotEdit('summary', 'summary_column_value');\n return canEdit();\n },\n\n parseInput(rawValue) {\n if (!isValidDate(rawValue)) return parseError('invalid_date');\n return parsed(rawValue);\n },\n\n validate() {\n return valid();\n },\n\n transform(activity, newValue, ctx) {\n // Resolve the FINAL constraint type after this edit. If the activity\n // is currently unconstrained (ASAP/ALAP/null), setting a constraint\n // date implicitly promotes to SNET.\n const finalType: ConstraintType = isUnconstrained(activity)\n ? IMPLIED_CONSTRAINT_ON_DATE_EDIT\n : activity.constraint_type;\n\n // Normalize the typed date to its canonical form:\n // - day typed by the user is preserved (even if non-working);\n // - time becomes shift_start (start-based constraints) or\n // shift_end (end-based constraints) of the activity's calendar.\n const calendar = ctx.calendars.getCalendar(activity.calendar_id);\n const canonicalDate = calendar\n ? normalizeConstraintDate(newValue, calendar, finalType)\n : newValue;\n\n const extraFields = buildConstraintDateExtraFields(activity, canonicalDate);\n // `executeFixForConstraints` retirado (2026-06-05, paridad\n // correctWrongDates #9) — ver justificación en constraintTypePipeline.\n return fieldChanges(canonicalDate, extraFields, {\n autoSchedule: true\n });\n }\n};\n\n// ─── Named helpers ──────────────────────────────────────────\n\n// `normalizeConstraintDate` (+ los sets START/END_BASED) viven ahora en\n// `shared/dateNormalize.ts` — compartidos con el pass de load\n// (`ScheduleCore.runInitialPasses`, paridad correctWrongDates #10). La regla\n// (día tipeado preservado + hora shift) y su justificación quedaron en el\n// docblock del helper compartido (RULE_constraint_date_preserves_typed_day).\n// El autoscheduler sigue snapeando vía `getEffectiveConstraintDate` al\n// calcular bounds; esta normalización solo afecta lo persistido/mostrado.\n\nfunction buildConstraintDateExtraFields(\n activity: Readonly<ActivitySnapshot>,\n newDate: Date\n): ConstraintExtraFields {\n const typeFields = isUnconstrained(activity)\n ? setConstraintTypeImplied()\n : setConstraintTypePreserved(activity.constraint_type);\n\n return {\n constraint_date: newDate,\n last_constraint_date: activity.constraint_date,\n ...typeFields\n };\n}\n\nfunction isUnconstrained(activity: Readonly<ActivitySnapshot>): boolean {\n return (\n DATELESS_CONSTRAINTS.has(activity.constraint_type) ||\n !activity.constraint_type\n );\n}\n","import type { ColumnPipeline } from '../types.js';\nimport { canEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid, invalid } from '../results.js';\nimport { fieldChanges } from '../results.js';\nimport { setEndDate } from '../end-date/setter.js';\n\nexport const calendarIdPipeline: ColumnPipeline<string> = {\n canEdit() {\n return canEdit();\n },\n\n parseInput(rawValue) {\n const value = String(rawValue).trim();\n if (isEmpty(value)) return parseError('empty_calendar');\n return parsed(value);\n },\n\n validate(activity, _oldValue, newValue) {\n if (isUnchangedCalendar(activity.calendar_id, newValue))\n return invalid('unchanged');\n return valid();\n },\n\n transform(activity, newValue, ctx) {\n const extraFields = buildCalendarExtraFields(activity, newValue, ctx);\n return fieldChanges(newValue, extraFields, {\n autoSchedule: true,\n postProcessors: ['updateParentDuration']\n });\n },\n\n trackEvent: 'activity_calendar_assignment'\n};\n\n// ─── Named helpers ──────────────────────────────────────────\n\nfunction isEmpty(value: string): boolean {\n return value === '';\n}\n\nfunction isUnchangedCalendar(currentId: string, newId: string): boolean {\n return currentId === newId;\n}\n\nfunction buildCalendarExtraFields(\n activity: Readonly<import('../types').ActivitySnapshot>,\n newCalendarId: string,\n ctx: Readonly<import('../types').PipelineContext>\n): Record<string, unknown> {\n const fields: Record<string, unknown> = {\n calendar_id: newCalendarId,\n assignedDefaultCalendar: false\n };\n\n const newCalendar = ctx.calendars.getCalendar(newCalendarId);\n if (newCalendar) {\n Object.assign(\n fields,\n setEndDate(\n newCalendar.calculateEndDate(activity.start_date, activity.duration)\n )\n );\n }\n\n return fields;\n}\n","/**\n * Custom ID generation constants.\n *\n * Ported from `react_client/src/utils/customIdTracker/constants.js`. The\n * legacy module read `custom_id_increment` from `getCurrentProject()`; in\n * the core the increment is injected at `CustomIdTracker` construction\n * time so the package stays project-agnostic.\n */\n\n/** Default suffix increment if the project doesn't override. */\nexport const DEFAULT_SUFFIX_INCREMENT = '10';\n\n/** Default prefix if the project doesn't override. */\nexport const DEFAULT_PREFIX = 'A';\n\n/** Used to calculate upper bound when searching for available suffixes. */\nexport const MAX_SEARCH_MULTIPLIER = 100;\n\n/** Hard ceiling on generation loops to prevent infinite recursion. */\nexport const MAX_GENERATION_ITERATIONS = 10000;\n\n/** Database + UI constraint. Strings longer than this are rejected. */\nexport const MAX_CUSTOM_ID_LENGTH = 20;\n","/**\n * `custom_id` column pipeline.\n *\n * The user types a human-readable identifier (e.g. `\"A10\"`, `\"PHASE-B\"`).\n * The pipeline:\n * - validates length (max 20 chars, same constraint as production).\n * - normalizes empty/whitespace → `null` (clears the field).\n * - emits `primaryValue` without scheduler/cascade effects.\n *\n * Duplicate detection (the new value must not collide with another\n * activity's `custom_id`) is enforced at dispatch time using the\n * `CustomIdTracker` injected in `DispatchDeps`. The tracker also gets\n * notified of the change so future generations skip the new value.\n *\n * Role-based edit gating (`SUPERADMIN/ADMIN/PROJECTLEADER/PLANNER`) lives\n * in the bridge — the core has no notion of the current user's role.\n */\n\nimport type { ColumnPipeline } from '../types.js';\nimport { canEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\nimport { MAX_CUSTOM_ID_LENGTH } from '../../generators/custom-id/constants.js';\n\n/**\n * `parseInput` output: a trimmed string OR `null` for clearing the cell.\n * The pipeline normalizes empties so consumers don't have to special-case\n * `\"\"` vs `\" \"` vs `null` vs `undefined`.\n */\ntype CustomIdValue = string | null;\n\nexport const customIdPipeline: ColumnPipeline<CustomIdValue> = {\n canEdit() {\n return canEdit();\n },\n\n parseInput(rawValue) {\n // Accept string, null, undefined, or number (defensive — backend may\n // serialize legacy data as number-ish).\n if (rawValue === null || rawValue === undefined) {\n return parsed(null);\n }\n if (typeof rawValue !== 'string') {\n return parseError('not_a_string');\n }\n const trimmed = rawValue.trim();\n if (trimmed.length === 0) {\n return parsed(null);\n }\n if (trimmed.length > MAX_CUSTOM_ID_LENGTH) {\n return parseError('exceeds_max_length');\n }\n return parsed(trimmed);\n },\n\n validate() {\n // Duplicate validation runs at dispatch time using the tracker. The\n // pipeline contract has no access to the tracker via `ctx` today, and\n // adding it would couple the column-pipeline shape to a specific\n // concern. The dispatch-level check is honest.\n return valid();\n },\n\n transform(_activity, newValue) {\n return fieldChanges(\n newValue,\n {},\n {\n autoSchedule: false,\n postProcessors: []\n }\n );\n },\n\n trackEvent: 'schedule_custom_id_edition'\n};\n","/**\n * `subcontractId` column pipeline.\n *\n * Assigns a subcontract id (FK to backend `subcontracts.id`) to an\n * activity. The legacy UI is a custom HTML dropdown — not a DHTMLX\n * inline editor — that mutates `task.subcontractId` directly and calls\n * `gantt.updateTask(task.id)`. When the React bridge reconnects, that\n * mutation point will go through `core.dispatch({ kind: 'inline-edit',\n * column: 'subcontractId', newValue: id | null })`.\n *\n * Independent column:\n * - No cascade. Parents and children carry independent values.\n * - No derived field. No effect on cost / hh / progress.\n * - No autoschedule trigger. Not in legacy `AUTOSCHEDULE_COLUMNS`.\n * - No post-processor.\n * - No tracking event. Legacy emits `activity_subcontract_creation_initiated`\n * only when the user clicks \"+\" to create a NEW subcontract (a\n * redux/UI flow), NOT when assigning one to an activity.\n *\n * Edit semantics:\n * - Legacy allows assigning subcontract to ANY activity, including\n * parents/summaries. We match that (no `isSummaryActivity` block).\n * - Legacy has no range/value validation: the dropdown only offers\n * valid IDs and the backend FK constraint catches anything else.\n * The pipeline accepts integer-or-null; rejection of unknown IDs\n * is delegated to backend persistence.\n * - \"Toggle to null when re-selecting the same id\" (legacy line\n * `utils.js:19-23`) is bridge-level UX, NOT pipeline logic. The\n * pipeline receives the final value and writes it.\n *\n * Naming note: the column name stays `subcontractId` (camelCase) for\n * parity with production (backend BD + legacy column + existing\n * `BackendActivityInput.subcontractId` in core). Snake-case unification is\n * deferred to a global pass once all columns are migrated.\n */\n\nimport type { ColumnPipeline } from '../types.js';\nimport { canEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\n\ntype SubcontractIdValue = number | null;\n\nexport const subcontractIdPipeline: ColumnPipeline<SubcontractIdValue> = {\n canEdit() {\n return canEdit();\n },\n\n parseInput(rawValue) {\n // null / undefined / '' all clear the assignment.\n if (rawValue === null || rawValue === undefined) {\n return parsed(null);\n }\n if (typeof rawValue === 'string') {\n const trimmed = rawValue.trim();\n if (trimmed.length === 0) {\n return parsed(null);\n }\n const n = Number(trimmed);\n if (!Number.isFinite(n) || !Number.isInteger(n)) {\n return parseError('not_an_integer');\n }\n return parsed(n);\n }\n if (typeof rawValue === 'number') {\n if (!Number.isFinite(rawValue) || !Number.isInteger(rawValue)) {\n return parseError('not_an_integer');\n }\n return parsed(rawValue);\n }\n return parseError('not_an_integer');\n },\n\n validate() {\n return valid();\n },\n\n transform(_activity, newValue) {\n return fieldChanges(\n newValue,\n {},\n {\n autoSchedule: false,\n postProcessors: []\n }\n );\n }\n};\n","/**\n * `responsables` column pipeline.\n *\n * Assigns a list of users (responsibles) to an activity. The field is\n * an array of user objects: `Array<{ id, name?, lastname?, subcontractId? }>`.\n *\n * Legacy UI (`responsibleCol/utils.js`) is a custom HTML multi-select\n * dropdown that maintains a toggle behavior: each click on a user adds\n * them if absent or removes them if present. The bridge owns that\n * toggle — when React reconnects, the bridge computes the resulting\n * array and calls `core.dispatch({ kind: 'inline-edit', column:\n * 'responsables', newValue: [...] })`. The pipeline receives the final\n * absolute array.\n *\n * Independent column:\n * - No cascade. Parents and children carry independent lists.\n * - No derived field. No effect on cost / hh / progress / dates.\n * - No autoschedule trigger. Not in legacy `AUTOSCHEDULE_COLUMNS`.\n * - No post-processor.\n * - No tracking event in legacy column (confirmed — no `trackingEvent(`\n * call in `responsibleCol/`).\n *\n * Edit semantics:\n * - Legacy allows assigning responsibles to ANY activity, including\n * parents/summaries. Match that.\n * - Item shape validation is delegated to the bridge / backend (Joi\n * `withIdSchema`). The pipeline trusts the array contents.\n * - `null` / `undefined` / `[]` all normalize to empty array.\n *\n * Bridge-only concerns (explicitly NOT here):\n * - Auto-assign subcontract from responsible (legacy\n * `assignSubByResponsible` in `responsibleCol/utils.js:54-80`):\n * role-gated and depends on the available subcontract list, both\n * outside the pipeline contract.\n * - Toggle add/remove on click: see comment above.\n */\n\nimport type { ColumnPipeline } from '../types.js';\nimport { canEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\n\ntype ResponsableItem = { readonly id: number | string; [key: string]: unknown };\ntype ResponsablesValue = ReadonlyArray<ResponsableItem>;\n\nexport const responsablesPipeline: ColumnPipeline<ResponsablesValue> = {\n canEdit() {\n return canEdit();\n },\n\n parseInput(rawValue) {\n if (rawValue === null || rawValue === undefined) {\n return parsed([]);\n }\n if (!Array.isArray(rawValue)) {\n return parseError('not_an_array');\n }\n // Trust shape of items — backend Joi validates `withIdSchema` at\n // persistence time. Empty array is valid (clears all responsibles).\n return parsed(rawValue as ResponsablesValue);\n },\n\n validate() {\n return valid();\n },\n\n transform(_activity, newValue) {\n return fieldChanges(\n newValue,\n {},\n {\n autoSchedule: false,\n postProcessors: []\n }\n );\n }\n};\n","/**\n * `tags` column pipeline.\n *\n * Assigns a list of tags to an activity. Field shape:\n * `Array<{ id, name?, description? }>`. `description` typically carries\n * the tag's visualization color (hex string) — used when\n * `visualizationColorActive === 'tags'` in the legacy renderer.\n *\n * Legacy UI (`tagsCol/utils.js`) is a custom HTML multi-select dropdown\n * with toggle add/remove behavior. The bridge owns that toggle — when\n * React reconnects, the bridge computes the resulting array and calls\n * `core.dispatch({ kind: 'inline-edit', column: 'tags', newValue: [...] })`.\n *\n * Independent column:\n * - No cascade. Parents and children carry independent lists.\n * - No derived field. No effect on cost / hh / progress / dates.\n * - No autoschedule trigger.\n * - No post-processor.\n * - No tracking event in legacy column.\n *\n * Edit semantics:\n * - Legacy allows assigning tags to ANY activity, including parents.\n * - Item shape validation delegated to bridge / backend.\n * - `null` / `undefined` / `[]` all normalize to empty array.\n *\n * Bridge-only concerns (explicitly NOT here):\n * - Toggle add/remove on click.\n * - Bar recoloring when `visualizationColorActive === 'tags'`\n * (`updateTaskBarStyle` in `tagsCol/utils.js:262-299`). Rendering\n * side effect — not data.\n */\n\nimport type { ColumnPipeline } from '../types.js';\nimport { canEdit } from '../results.js';\nimport { parsed, parseError } from '../results.js';\nimport { valid } from '../results.js';\nimport { fieldChanges } from '../results.js';\n\ntype TagItem = { readonly id: number | string; [key: string]: unknown };\ntype TagsValue = ReadonlyArray<TagItem>;\n\nexport const tagsPipeline: ColumnPipeline<TagsValue> = {\n canEdit() {\n return canEdit();\n },\n\n parseInput(rawValue) {\n if (rawValue === null || rawValue === undefined) {\n return parsed([]);\n }\n if (!Array.isArray(rawValue)) {\n return parseError('not_an_array');\n }\n return parsed(rawValue as TagsValue);\n },\n\n validate() {\n return valid();\n },\n\n transform(_activity, newValue) {\n return fieldChanges(\n newValue,\n {},\n {\n autoSchedule: false,\n postProcessors: []\n }\n );\n }\n};\n","import type { ColumnPipeline } from './types.js';\nimport { COLUMN, type ColumnName } from '../constants/columns.js';\nimport { textPipeline } from './text/text-pipeline.js';\nimport { descriptionPipeline } from './description/description-pipeline.js';\nimport { durationPipeline } from './duration/duration-pipeline.js';\nimport { progressPipeline } from './progress/progress-pipeline.js';\nimport { costPipeline } from './cost/cost-pipeline.js';\nimport { usedCostPipeline } from './used-cost/used-cost-pipeline.js';\nimport { hhWorkTimePipeline } from './hh-work-time/hh-work-time-pipeline.js';\nimport { startDatePipeline } from './start-date/start-date-pipeline.js';\nimport { endDatePipeline } from './end-date/end-date-pipeline.js';\nimport { constraintTypePipeline } from './constraint-type/constraint-type-pipeline.js';\nimport { constraintDatePipeline } from './constraint-date/constraint-date-pipeline.js';\nimport { calendarIdPipeline } from './calendar-id/calendar-id-pipeline.js';\nimport { customIdPipeline } from './custom-id/custom-id-pipeline.js';\nimport { subcontractIdPipeline } from './subcontract-id/subcontract-id-pipeline.js';\nimport { responsablesPipeline } from './responsables/responsables-pipeline.js';\nimport { tagsPipeline } from './tags/tags-pipeline.js';\n// NOTE: `custom_predecessors` / `custom_sucessors` do NOT have entries here\n// on purpose. They route to `dispatchInlineEditLinks` in `dispatch.ts`,\n// which parses the string + diffs against current links + delegates to\n// `dispatchLinkBatch` (the same applier used by drag/`link-create`). The\n// pipeline contract was a poor fit because these columns mutate the link\n// graph, not just one field on the activity. See [[schedule-core-create-activity-logic]].\n\n// Every entry carries an `as ColumnPipeline<unknown>` boundary cast:\n// `ColumnPipeline<T>` is invariant in T (T appears both in parameter position\n// — `validate(old, new)`, `transform(_, newValue)` — and in return position —\n// `parseInput → ParseResult<T>`), so `ColumnPipeline<string>` is NOT\n// assignable to `ColumnPipeline<unknown>` structurally. Dispatch only ever\n// feeds a pipeline values produced by that same pipeline's `parseInput`, so\n// erasing T at the registry boundary is safe.\n// The Map is CONSTRUCTED with `ColumnName` keys (compile check:\n// registering a pipeline under a name missing from `COLUMN` in\n// constants/columns.ts breaks the build) but DECLARED over `string` keys so\n// lookups keep accepting the arbitrary column strings dispatch feeds them\n// (unknown name → undefined).\nconst COLUMN_PIPELINES: ReadonlyMap<string, ColumnPipeline<unknown>> = new Map<\n ColumnName,\n ColumnPipeline<unknown>\n>([\n [COLUMN.TEXT, textPipeline as ColumnPipeline<unknown>],\n [COLUMN.DESCRIPTION, descriptionPipeline as ColumnPipeline<unknown>],\n [COLUMN.DURATION, durationPipeline as ColumnPipeline<unknown>],\n [COLUMN.PROGRESS, progressPipeline as ColumnPipeline<unknown>],\n [COLUMN.COST, costPipeline as ColumnPipeline<unknown>],\n [COLUMN.USED_COST, usedCostPipeline as ColumnPipeline<unknown>],\n [COLUMN.HH_WORK_TIME, hhWorkTimePipeline as ColumnPipeline<unknown>],\n [COLUMN.START_DATE, startDatePipeline as ColumnPipeline<unknown>],\n [COLUMN.END_DATE, endDatePipeline as ColumnPipeline<unknown>],\n [COLUMN.CONSTRAINT_TYPE, constraintTypePipeline as ColumnPipeline<unknown>],\n [COLUMN.CONSTRAINT_DATE, constraintDatePipeline as ColumnPipeline<unknown>],\n [COLUMN.CALENDAR_ID, calendarIdPipeline as ColumnPipeline<unknown>],\n [COLUMN.CUSTOM_ID, customIdPipeline as ColumnPipeline<unknown>],\n // Naming exception: `subcontractId` stays camelCase for parity with\n // production (backend BD + legacy column + `BackendActivityInput.subcontractId`).\n // Snake-case unification deferred to a global pass.\n [COLUMN.SUBCONTRACT_ID, subcontractIdPipeline as ColumnPipeline<unknown>],\n [COLUMN.RESPONSABLES, responsablesPipeline as ColumnPipeline<unknown>],\n [COLUMN.TAGS, tagsPipeline as ColumnPipeline<unknown>]\n]);\n\nexport function findPipelineForColumn(\n columnName: string\n): ColumnPipeline<unknown> | undefined {\n return COLUMN_PIPELINES.get(columnName);\n}\n\nexport function hasPipeline(columnName: string): boolean {\n return COLUMN_PIPELINES.has(columnName);\n}\n\n/**\n * Runtime view of the registered pipeline column names. Consumed by the\n * COLUMN ↔ registry bijection guard (`constants/columns.guard.test.ts`) — the\n * map itself stays private.\n */\nexport function listPipelineColumnNames(): ReadonlyArray<string> {\n return [...COLUMN_PIPELINES.keys()];\n}\n","/**\n * Maps a pipeline's `FieldChanges.constraintWarning` (NotificationConfig\n * with `data.{constraintType, constraintDate, projectedDate}`) into the\n * public `ChangeSet.warnings` entry. Shared by the direct-edit handlers\n * (inline-edit, dates-batch, bulk-edit) — the only sources allowed to emit\n * warnings (PRD R3; the autoscheduler never violates, R1).\n */\n\nimport type { NotificationConfig } from '../../columns/types.js';\nimport type { ConstraintType } from '../../constraints/index.js';\nimport type { ActivityId } from '../../types.js';\nimport type { ConstraintWarning } from '../types.js';\n\nexport function toConstraintWarning(\n activityId: ActivityId,\n notification: NotificationConfig | undefined\n): ConstraintWarning | null {\n if (!notification || notification.type !== 'constraint') return null;\n\n const data = notification.data as\n | {\n constraintType?: ConstraintType;\n constraintDate?: Date;\n projectedDate?: Date;\n }\n | undefined;\n if (!data?.constraintType || !data.constraintDate) return null;\n\n return {\n kind: 'constraint_violation',\n activityId,\n constraintType: data.constraintType,\n constraintDate: data.constraintDate,\n projectedDate: data.projectedDate ?? data.constraintDate,\n messageKey: notification.messageKey\n };\n}\n","export const ACTIVITY_PROPERTY = {\n ID: 'id',\n PARENT: 'parent',\n TYPE: 'type',\n AUTO_SCHEDULING: 'auto_scheduling',\n ASSIGNED_DEFAULT_CALENDAR: 'assignedDefaultCalendar',\n IS_LOOKAHEAD: 'is_lookahead',\n VISIBLE: 'visible',\n NEW_ACTIVITIES_ARRAY: 'newActivitiesArray',\n ACTIVITY_MODIFICATIONS: 'activityModifications',\n PROPLANNER_ID: 'proplannerId',\n GANTT_ID: 'ganttId',\n SECTOR_ID: 'sectorId',\n COMPANY_ID: 'companyId',\n SUBCONTRACT: 'subcontract',\n HAS_CUSTOM_PONDERATOR: 'hasCustomPonderator',\n HAS_CHILDS: 'has_childs',\n SUM_OF_DURATION_RECURSIVELY: 'sumOfDurationRecursively',\n HAS_NEW_ACTIVITIES: 'hasNewActivities',\n IS_NEW_ACTIVITY: 'isNewActivity'\n} as const;\n\nexport type ActivityPropertyName =\n (typeof ACTIVITY_PROPERTY)[keyof typeof ACTIVITY_PROPERTY];\n","/**\n * The single, explicit dynamic-write boundary for `ScheduleState`. The\n * column-pipeline `FieldChanges` / cascade plumbing and undo replay drive\n * `field` from a runtime string, which the typed\n * `setActivityField<K extends keyof EngineActivitySnapshot>` rejects. The cast\n * lives here ONCE instead of at every dynamic call site.\n *\n * Lives in `internal/state/` (next to the state it writes) so column and cascade\n * code reaches the write primitive without an upward import into `dispatch/`.\n */\n\nimport type { ActivityWriter } from './roles.js';\nimport type { ActivityId } from '../../types.js';\nimport type {\n EngineActivitySnapshot,\n LinkId,\n LinkSnapshot\n} from '../../autoscheduler/types.js';\n\nexport function setActivityFieldDynamic(\n state: ActivityWriter,\n activityId: ActivityId,\n field: string,\n value: unknown\n): void {\n state.setActivityField(\n activityId,\n field as keyof EngineActivitySnapshot,\n value as EngineActivitySnapshot[keyof EngineActivitySnapshot]\n );\n}\n\n/** Mirror of `setActivityFieldDynamic` for the callers (undo replay) that drive\n * a link `field` from a runtime string. */\nexport function setLinkFieldDynamic(\n state: ActivityWriter,\n linkId: LinkId,\n field: string,\n value: unknown\n): void {\n state.setLinkField(\n linkId,\n field as keyof LinkSnapshot,\n value as LinkSnapshot[keyof LinkSnapshot]\n );\n}\n","/**\n * Internal converters between the public `Activity` model and the\n * scheduler's `ActivitySnapshot` (which the internal `ScheduleState`\n * uses as its row shape).\n *\n * Differences are minor — primarily `parent: 0` (number, scheduler) vs\n * `parent: '0'` (string, public).\n */\n\nimport {\n ROOT_PARENT_ID,\n normalizeParentKey\n} from '../internal/hierarchy/root-parent.js';\nimport type {\n EngineActivitySnapshot,\n LinkSnapshot\n} from '../autoscheduler/types.js';\nimport type { Activity, ConstraintType, Link } from '../types.js';\nimport { durationToHours } from '../columns/shared/duration.js';\n\nexport function activityToSnapshot(\n activity: Activity,\n hoursPerDay: number\n): EngineActivitySnapshot {\n const parent = activity.parent === ROOT_PARENT_ID ? 0 : activity.parent;\n return {\n ...activity,\n id: activity.id,\n parent,\n type: activity.type,\n constraint_type: activity.constraint_type,\n constraint_date: activity.constraint_date,\n start_date: activity.start_date,\n end_date: activity.end_date,\n // Activity (public) carries duration in DAYS; ActivitySnapshot (internal\n // engine) carries it in HOURS.\n duration: durationToHours(activity.duration, hoursPerDay),\n progress: activity.progress,\n auto_scheduling: activity.auto_scheduling,\n calendar_id: activity.calendar_id,\n $source: [],\n $target: []\n };\n}\n\n/**\n * Materializes an engine snapshot into the public `Activity` shape.\n * `duration` is emitted in WORKING HOURS (the engine-native unit).\n * `toPublicActivity` in `dispatch/shared/public-units.ts` converts to days\n * at every public exit (facade getters, recompute-api, etc.).\n */\nexport function snapshotToActivity(snapshot: EngineActivitySnapshot): Activity {\n const parent = normalizeParentKey(snapshot.parent);\n // boundary cast: the engine snapshot carries every original Activity field\n // verbatim via its index signature (`...activity` in activityToSnapshot), but\n // the type system only sees the engine-known keys — the spread below restores\n // the full Activity shape at runtime.\n return {\n ...snapshot,\n id: snapshot.id,\n parent: parent as Activity['parent'],\n text: String(snapshot.text ?? ''),\n description: String(snapshot.description ?? ''),\n type: snapshot.type as Activity['type'],\n start_date: snapshot.start_date,\n end_date: snapshot.end_date,\n // Duration passes through in WORKING HOURS — conversion to the public\n // days unit happens at the facade boundary (toPublicActivity).\n duration: snapshot.duration,\n constraint_type: (snapshot.constraint_type ??\n null) as ConstraintType | null,\n constraint_date: snapshot.constraint_date,\n progress: snapshot.progress,\n cost: Number(snapshot.cost ?? 0),\n used_cost: Number(snapshot.used_cost ?? 0),\n hhWorkTime: Number(snapshot.hhWorkTime ?? 0),\n real_work: Number(snapshot.real_work ?? 0),\n ponderator: Number(snapshot.ponderator ?? 0),\n calendar_id:\n snapshot.calendar_id != null ? String(snapshot.calendar_id) : null,\n auto_scheduling: snapshot.auto_scheduling\n } as unknown as Activity;\n}\n\n/**\n * Materializes an internal link snapshot into the public `Link` shape.\n * `lag` is emitted in WORKING HOURS (the engine-native unit).\n * `toPublicLink` in `dispatch/shared/public-units.ts` converts to days at\n * every public exit (facade getters, ChangeSet boundary, etc.).\n */\nexport function snapshotToLink(l: LinkSnapshot): Link {\n const view = {\n id: String(l.id),\n source: String(l.source),\n target: String(l.target),\n type: l.type as Link['type'],\n lag: Number(l.lag)\n } as Link;\n if (l.proplannerId != null) view.proplannerId = Number(l.proplannerId);\n if (l.ganttId != null) view.ganttId = Number(l.ganttId);\n if (l.sectorId != null) view.sectorId = Number(l.sectorId);\n return view;\n}\n","/**\n * Snapshot/diff helpers shared by every dispatch handler: before/after\n * snapshot capture of the touched activities, field-level diff between the\n * two (`buildActivityChanges` → `EntityChange[]` for the ChangeSet),\n * application of pipeline `FieldChanges` to the adapter, and the dirty-id\n * set builders that scope `updateParentBoundsFromChildren`.\n */\n\nimport type {\n ActivityReader,\n ActivityWriter\n} from '../../internal/state/roles.js';\nimport type { ActivityId, Activity } from '../../types.js';\nimport type { CascadeMutation, FieldChanges } from '../../columns/types.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\nimport type { EntityChange } from '../types.js';\nimport type { CorrelativeShift } from '../../internal/hierarchy/recompute-correlative-ids.js';\nimport { setActivityFieldDynamic } from '../../internal/state/dynamic-writes.js';\nimport { snapshotToActivity } from '../conversion.js';\n\nexport function collectTouchedIds(\n primary: ActivityId,\n changes: FieldChanges\n): Set<string> {\n const ids = new Set<string>([String(primary)]);\n for (const m of changes.cascadeMutations ?? []) {\n ids.add(String((m as CascadeMutation).activityId));\n }\n return ids;\n}\n\nexport function snapshotActivities(\n adapter: ActivityReader,\n ids: Set<string>\n): Map<string, EngineActivitySnapshot> {\n const out = new Map<string, EngineActivitySnapshot>();\n for (const id of ids) {\n const a = adapter.getActivity(id);\n if (a) out.set(id, structuredCloneActivity(a));\n }\n return out;\n}\n\nexport function structuredCloneActivity(\n a: EngineActivitySnapshot\n): EngineActivitySnapshot {\n // Shallow clone with Date copies. Sufficient for diff purposes.\n return {\n ...a,\n start_date: new Date(a.start_date),\n end_date: new Date(a.end_date),\n constraint_date: a.constraint_date ? new Date(a.constraint_date) : null,\n $source: [...a.$source],\n $target: [...a.$target]\n };\n}\n\nexport function applyFieldChanges(\n adapter: ActivityWriter,\n activityId: ActivityId,\n primaryColumn: string,\n changes: FieldChanges\n): void {\n setActivityFieldDynamic(\n adapter,\n activityId,\n primaryColumn,\n changes.primaryValue\n );\n for (const [key, value] of Object.entries(changes.extraFields ?? {})) {\n setActivityFieldDynamic(adapter, activityId, key, value);\n }\n for (const m of changes.cascadeMutations ?? []) {\n const mutation = m as CascadeMutation;\n for (const [key, value] of Object.entries(mutation.fields)) {\n setActivityFieldDynamic(adapter, mutation.activityId, key, value);\n }\n }\n}\n\nexport function buildActivityChanges(\n adapter: ActivityReader,\n before: Map<string, EngineActivitySnapshot>,\n touched: Set<string>\n): ReadonlyArray<EntityChange<Activity>> {\n const out: EntityChange<Activity>[] = [];\n for (const id of touched) {\n const afterSnap = adapter.getActivity(id);\n if (!afterSnap) {\n out.push({ id, kind: 'deleted', after: null });\n continue;\n }\n const beforeSnap = before.get(id);\n const diff = diffActivity(beforeSnap, afterSnap);\n if (!beforeSnap) {\n out.push({\n id,\n kind: 'created',\n fields: diff,\n // `after` is in WORKING HOURS — `toPublicChangeSet` converts at the\n // facade boundary.\n after: snapshotToActivity(afterSnap)\n });\n } else {\n out.push({\n id,\n kind: 'updated',\n fields: diff,\n after: snapshotToActivity(afterSnap)\n });\n }\n }\n return out;\n}\n\nexport function diffActivity(\n before: EngineActivitySnapshot | undefined,\n after: EngineActivitySnapshot\n): Record<string, { before: unknown; after: unknown }> {\n const fields: Record<string, { before: unknown; after: unknown }> = {};\n const beforeRec: Record<string, unknown> = (before ?? {}) as Record<\n string,\n unknown\n >;\n const afterRec: Record<string, unknown> = after as unknown as Record<\n string,\n unknown\n >;\n const keys = new Set([...Object.keys(beforeRec), ...Object.keys(afterRec)]);\n for (const k of keys) {\n if (!shallowEqual(beforeRec[k], afterRec[k])) {\n fields[k] = { before: beforeRec[k], after: afterRec[k] };\n }\n }\n return fields;\n}\n\n/**\n * Builds the dirty-id set for an inline edit dispatch: the trigger\n * activity, every activity whose row was snapshotted before mutation\n * (pipeline cascade targets), and every activity the autoscheduler\n * actually moved. Passed to `updateParentBoundsFromChildren` so it only\n * walks ancestors of the activities that actually changed.\n */\nexport function collectDirtyForInlineEdit(\n triggerId: ActivityId,\n touchedIds: ReadonlySet<string>,\n scheduledIds: readonly string[]\n): Set<ActivityId> {\n const dirty = new Set<ActivityId>();\n dirty.add(triggerId);\n for (const id of touchedIds) dirty.add(id as ActivityId);\n for (const id of scheduledIds) dirty.add(id as ActivityId);\n return dirty;\n}\n\n/**\n * Builds the dirty-id set for a structural dispatch (create / delete /\n * move / indent / outdent / link-batch). The set unions every trigger\n * activity (the directly mutated ones) with every activity the\n * autoscheduler moved during the cascade.\n *\n * Used to scope `updateParentBoundsFromChildren` to ancestor chains\n * instead of walking every parent in the project (O(parents) vs.\n * O(dirty·depth)).\n */\nexport function collectDirtyForStructural(\n triggerIds: Iterable<ActivityId | string | number>,\n scheduledIds: readonly string[]\n): Set<ActivityId> {\n const dirty = new Set<ActivityId>();\n for (const id of triggerIds) dirty.add(String(id) as ActivityId);\n for (const id of scheduledIds) dirty.add(id as ActivityId);\n return dirty;\n}\n\nexport function foldCorrelativeShifts(\n adapter: ActivityReader,\n shifts: readonly CorrelativeShift[],\n excludeIds: ReadonlySet<string>,\n beforeSnap: Map<string, EngineActivitySnapshot>,\n touched: Set<string>\n): void {\n for (const shift of shifts) {\n if (excludeIds.has(shift.activityId)) continue;\n touched.add(shift.activityId);\n if (beforeSnap.has(shift.activityId)) continue;\n const liveActivity = adapter.getActivity(shift.activityId);\n if (!liveActivity) continue;\n const beforeImage = structuredCloneActivity(liveActivity);\n beforeImage.correlative_id = shift.before;\n beforeSnap.set(shift.activityId, beforeImage);\n }\n}\n\nexport function shallowEqual(a: unknown, b: unknown): boolean {\n if (a === b) return true;\n if (a instanceof Date && b instanceof Date)\n return a.getTime() === b.getTime();\n if (a == null || b == null) return false;\n if (typeof a !== typeof b) return false;\n if (Array.isArray(a) && Array.isArray(b)) {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) {\n if (!shallowEqual(a[i], b[i])) return false;\n }\n return true;\n }\n return false;\n}\n","/**\n * Backend date-string parsing — transversal helper shared by the boundary\n * parser and the time-dependent columns (`expected_progress*`), so neither has\n * to import across layers to read a backend date. Pure, dependency-free.\n */\n\n/** Backend activity date: `\"YYYY/MM/DD H:MM\"` (server-local wall clock, TZ=UTC). */\nconst BACKEND_DATE_FORMAT_REGEX =\n /^(\\d{4})\\/(\\d{1,2})\\/(\\d{1,2})\\s+(\\d{1,2}):(\\d{2})$/;\n\n/**\n * Backend dates use the custom format `\"YYYY/MM/DD H:MM\"` (e.g.\n * `\"2026/05/05 8:00\"`). The hours/minutes are interpreted as UTC — the\n * server has `TZ=UTC` configured and the format is unambiguous after\n * normalization.\n *\n * If a value is already an ISO 8601 string with Z, `new Date(s)` handles it.\n * If null/empty, that is a programmer error — throw rather than guess.\n */\nexport function parseBackendDate(raw: string): Date {\n if (raw == null || raw === '') {\n throw new Error(`[parseFromBackend] expected a date string, got \"${raw}\"`);\n }\n // ISO 8601 with timezone marker\n if (raw.includes('T') || raw.endsWith('Z')) {\n const iso = new Date(raw);\n if (Number.isNaN(iso.getTime())) {\n throw new Error(`[parseFromBackend] invalid ISO date \"${raw}\"`);\n }\n return iso;\n }\n // `\"YYYY/MM/DD H:MM\"` — split into parts and build a UTC instant.\n const match = raw.match(BACKEND_DATE_FORMAT_REGEX);\n if (!match) {\n throw new Error(\n `[parseFromBackend] unsupported date format \"${raw}\" (expected \"YYYY/MM/DD H:MM\" or ISO)`\n );\n }\n const [, y, m, d, hh, mm] = match;\n return new Date(\n Date.UTC(Number(y), Number(m) - 1, Number(d), Number(hh), Number(mm))\n );\n}\n","export interface CalendarLike {\n calculateDuration(start: Date, end: Date): number;\n}\n\n/**\n * Expected % a baseline-planned activity should have completed by `now`,\n * measured in working time against its baseline calendar. Faithful port of\n * legacy `calculateExpected` (lookahead-common.js): edge rules first, else the\n * working-time ratio. Returns 0..100. `now` should already be the comparison\n * instant the caller wants (e.g. end-of-day).\n *\n * Shared by the `expected_progress` (live) and `expected_progress_base` columns\n * (column-owns-everything: the formula is the one piece both columns share).\n */\nexport function expectedProgressFromBaseline(\n start: Date,\n end: Date,\n now: Date,\n calendar: CalendarLike\n): number {\n if (start.getTime() > now.getTime()) return 0;\n if (end.getTime() < now.getTime()) return 100;\n if (start.getTime() === end.getTime()) return 100;\n const actual = calendar.calculateDuration(start, now);\n const final = calendar.calculateDuration(start, end);\n if (final === 0) return 0;\n return (actual * 100) / final;\n}\n","import { parseBackendDate } from '../../shared/backend-date.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type {\n ActivityId,\n EngineActivitySnapshot\n} from '../../autoscheduler/types.js';\nimport type {\n ActivityWriter,\n CalendarOps\n} from '../../internal/state/roles.js';\nimport { expectedProgressFromBaseline } from '../shared/expected-progress-formula.js';\n\nconst isProject = (activity: EngineActivitySnapshot): boolean =>\n activity.type === 'project';\n\nconst leafExpectedLive = (\n activity: EngineActivitySnapshot,\n now: Date,\n state: CalendarOps\n): number => {\n const calendarId = activity.calendar_id;\n const calendar =\n calendarId != null\n ? state.calendarReader.getCalendar(String(calendarId))\n : null;\n if (!calendar) return 0;\n const toDate = (value: unknown): Date =>\n value instanceof Date ? value : parseBackendDate(String(value));\n return expectedProgressFromBaseline(\n toDate(activity.start_date),\n toDate(activity.end_date),\n now,\n calendar\n );\n};\n\n/**\n * `expected_progress` (live) — the planned % against the activity's CURRENT\n * scheduling calendar + its CURRENT (scheduled) dates, NOT the baseline. Leaves\n * from `calendar_id`; parents as `Σ(child × child.ponderator) / 100` (legacy\n * `updateExpectedGlobal` non-baseline branch). Needs no active baseline, so it\n * covers every project. MUST run AFTER the autoscheduler settles (it reads the\n * scheduled dates). Returns the ids whose value changed.\n */\nexport function computeExpectedProgressLive(\n rootIds: readonly string[],\n now: Date,\n state: ActivityWriter & CalendarOps\n): string[] {\n const changed: string[] = [];\n const writeIfChanged = (activityId: ActivityId, value: number) => {\n const activity = state.getActivity(activityId);\n if (!activity) return;\n if (activity.expected_progress !== value) {\n state.setActivityField(activityId, COLUMN.EXPECTED_PROGRESS, value);\n changed.push(String(activityId));\n }\n };\n const visit = (activityId: ActivityId): number => {\n const activity = state.getActivity(activityId);\n if (!activity) return 0;\n if (!isProject(activity)) {\n const value = leafExpectedLive(activity, now, state);\n writeIfChanged(activityId, value);\n return value;\n }\n let acc = 0;\n for (const childId of state.getChildren(activityId)) {\n const childExpected = visit(childId);\n const child = state.getActivity(childId);\n const weight =\n typeof child?.ponderator === 'number' ? child.ponderator : 0;\n acc += childExpected * weight;\n }\n const value = acc / 100;\n writeIfChanged(activityId, value);\n return value;\n };\n for (const activityId of rootIds) visit(activityId);\n return changed;\n}\n","/**\n * Columna `status` (semáforo) — cálculo en el motor.\n *\n * Deriva el estado de cada activity comparando `progress` real contra el\n * esperado (`expected_progress` vivo o `expected_progress_base`, según el\n * criterio del proyecto). Port fiel de la máquina legacy `updateGlobal`\n * (`updateExpectedGlobal.js`) — misma fórmula, mismos redondeos, misma rama\n * Doing inalcanzable. Contrato: `docs/domain/columns/COLUMN_status.md`.\n *\n * DEPENDE de que `expected_progress` / `expected_progress_base` ya estén\n * frescos: este pase corre DESPUÉS del de expected_progress.\n */\n\nimport { setActivityFieldDynamic } from '../../internal/state/dynamic-writes.js';\nimport type { ActivityWriter } from '../../internal/state/roles.js';\nimport {\n STATUS,\n STATUS_COLUMN,\n type ActivityStatus,\n type StatusCriteria\n} from './constants.js';\n\nconst roundToTwoDecimals = (value: number): number =>\n Math.round(value * 100) / 100;\n\n/**\n * Elige el esperado contra el que se compara: baseline cuando el criterio es\n * 'Baseline', si no el vivo. Puede ser undefined (activity sin baseline).\n */\nexport function resolveExpectedForStatus(\n activity: { expected_progress?: number; expected_progress_base?: number },\n criteria: StatusCriteria\n): number | undefined {\n return criteria === 'Baseline'\n ? activity.expected_progress_base\n : activity.expected_progress;\n}\n\n/**\n * Deriva el estado. `expectedProgress` undefined → NaN en las comparaciones →\n * cae en Waiting (paridad legacy).\n */\nexport function deriveActivityStatus(\n progress: number,\n expectedProgress: number | undefined\n): ActivityStatus {\n const roundedProgress = roundToTwoDecimals(progress);\n const roundedExpected = roundToTwoDecimals(expectedProgress as number);\n\n if (roundedProgress > 99.99) return STATUS.DONE;\n if (roundedExpected > roundedProgress) return STATUS.OVERDUE;\n if (progress > 0 && roundedProgress > roundedExpected) {\n return STATUS.ADVANCEMENT;\n }\n if (progress === 0 && expectedProgress === 0) return STATUS.WAITING;\n if (progress > 0 && roundedProgress < roundedExpected) return STATUS.DOING;\n return STATUS.WAITING;\n}\n\n/**\n * Recorre todas las activities, deriva el status y lo escribe si cambió.\n * Devuelve los ids que cambiaron (para la emisión prop-only del ChangeSet).\n * Es per-activity (sin recursión): status solo depende de la propia activity.\n */\nexport function applyStatusPass(\n state: ActivityWriter,\n criteria: StatusCriteria\n): string[] {\n const changed: string[] = [];\n state.forEachActivity((snapshot, id) => {\n const activity = snapshot as unknown as {\n progress?: number;\n expected_progress?: number;\n expected_progress_base?: number;\n status?: string;\n };\n const progress =\n typeof activity.progress === 'number' ? activity.progress : 0;\n const status = deriveActivityStatus(\n progress,\n resolveExpectedForStatus(activity, criteria)\n );\n if (activity.status !== status) {\n setActivityFieldDynamic(state, id, STATUS_COLUMN, status);\n changed.push(id);\n }\n });\n return changed;\n}\n","/**\n * Visual-order helpers — single source of truth for sibling ordering.\n *\n * The canonical rule (see Obsidian:newPlanSchedule/RULE_correlative_id_ordering.md):\n * the visual order is DFS pre-order from roots, sorting each parent's\n * children by `correlative_id` ASC, with a stable tiebreaker by `id`.\n *\n * These helpers replicate exactly what DHTMLX's `gantt.parse(data) +\n * gantt.sort('correlative_id', false) + gantt.eachTask(cb)` produces.\n * The legacy frontend uses that flow at every load (see\n * `react_client/src/views/schedule/init/initGanttOptimized.js:233`).\n */\n\nimport { ROOT_PARENT_ID, isRootParent } from './root-parent.js';\nimport type { ActivityReader } from '../state/roles.js';\nimport type { ActivityId } from '../../types.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\n\n/**\n * Sort sentinel for activities without `correlative_id` — they sink to the\n * end. Shared with recompute-correlative-ids (same DFS ordering contract).\n */\nexport const NOT_SET_SORT_VALUE = Number.MAX_SAFE_INTEGER;\n\n/** Root-level sentinel. Matches `Activity.parent === '0'`. */\n\n/**\n * Returns the children of `parentId` in visual order (correlative_id ASC,\n * stable tiebreaker by id). Use `'0'` for root.\n */\nexport function getChildrenInVisualOrder(\n parentId: ActivityId | '0',\n adapter: ActivityReader\n): ActivityId[] {\n const children = collectChildrenSnapshots(parentId, adapter);\n children.sort(byCorrelativeIdThenId);\n // String(...) normalizes the engine's string|number id to the public\n // string ActivityId (state ids are hydrated as strings).\n return children.map((a) => String(a.id));\n}\n\n/**\n * Returns ALL activities in the schedule in DFS pre-order — equivalent to\n * `gantt.eachTask(cb)` after `gantt.sort('correlative_id')`. Useful for\n * `recomputeCorrelativeIds` and any consumer that needs a flat ordered\n * list (e.g. the bridge populating DHTMLX from a ChangeSet).\n */\nexport function iterateInVisualOrder(\n adapter: ActivityReader\n): EngineActivitySnapshot[] {\n const result: EngineActivitySnapshot[] = [];\n const visit = (activity: EngineActivitySnapshot): void => {\n result.push(activity);\n const childIds = getChildrenInVisualOrder(String(activity.id), adapter);\n for (const childId of childIds) {\n const child = adapter.getActivity(childId);\n if (child) visit(child);\n }\n };\n const rootIds = getChildrenInVisualOrder(ROOT_PARENT_ID, adapter);\n for (const rootId of rootIds) {\n const root = adapter.getActivity(rootId);\n if (root) visit(root);\n }\n return result;\n}\n\n/** Returns the previous sibling (visual order), or null if first. */\nexport function findPrevSibling(\n taskId: ActivityId,\n adapter: ActivityReader\n): ActivityId | null {\n const activity = adapter.getActivity(taskId);\n if (!activity) return null;\n const parentKey = parentKeyOf(activity);\n const siblings = getChildrenInVisualOrder(parentKey, adapter);\n const idx = siblings.findIndex((id) => String(id) === String(taskId));\n if (idx <= 0) return null;\n return siblings[idx - 1] ?? null;\n}\n\n/** Returns the next sibling (visual order), or null if last. */\nexport function findNextSibling(\n taskId: ActivityId,\n adapter: ActivityReader\n): ActivityId | null {\n const activity = adapter.getActivity(taskId);\n if (!activity) return null;\n const parentKey = parentKeyOf(activity);\n const siblings = getChildrenInVisualOrder(parentKey, adapter);\n const idx = siblings.findIndex((id) => String(id) === String(taskId));\n if (idx < 0 || idx === siblings.length - 1) return null;\n return siblings[idx + 1] ?? null;\n}\n\n/**\n * Returns the closest previous sibling that is NOT in `selected`. Walks\n * backward through visual order. Used by `indent`: multi-indent skips\n * selected siblings so they all become children of the same anchor.\n */\nexport function findPreviousNonSelectedSibling(\n taskId: ActivityId,\n selected: ReadonlySet<ActivityId>,\n adapter: ActivityReader\n): ActivityId | null {\n const activity = adapter.getActivity(taskId);\n if (!activity) return null;\n const parentKey = parentKeyOf(activity);\n const siblings = getChildrenInVisualOrder(parentKey, adapter);\n const idx = siblings.findIndex((id) => String(id) === String(taskId));\n if (idx <= 0) return null;\n for (let i = idx - 1; i >= 0; i--) {\n const candidateId = siblings[i];\n if (candidateId === undefined) continue;\n if (!setHas(selected, candidateId)) return candidateId;\n }\n return null;\n}\n\n/**\n * Returns the visual index of `taskId` among its siblings (0-based), or\n * -1 if the activity does not exist.\n */\nexport function visualIndexInParent(\n taskId: ActivityId,\n adapter: ActivityReader\n): number {\n const activity = adapter.getActivity(taskId);\n if (!activity) return -1;\n const parentKey = parentKeyOf(activity);\n const siblings = getChildrenInVisualOrder(parentKey, adapter);\n return siblings.findIndex((id) => String(id) === String(taskId));\n}\n\n// ---------------------------------------------------------------------------\n// Internals (pure)\n// ---------------------------------------------------------------------------\n\nexport function collectChildrenSnapshots(\n parentId: ActivityId | '0',\n adapter: ActivityReader\n): EngineActivitySnapshot[] {\n const key = String(parentId);\n // ScheduleState._childrenByParent intentionally does NOT index root-parent\n // activities (they are skipped by rebuildChildrenIndex). For the root key\n // we filter getAllActivities directly. Everywhere else getChildren works.\n if (key === '0') {\n return adapter.getAllActivities().filter((a) => isRootParent(a.parent));\n }\n const childIds = adapter.getChildren(parentId);\n const out: EngineActivitySnapshot[] = [];\n for (const id of childIds) {\n const snap = adapter.getActivity(id);\n if (snap) out.push(snap);\n }\n return out;\n}\n\nfunction byCorrelativeIdThenId(\n a: EngineActivitySnapshot,\n b: EngineActivitySnapshot\n): number {\n const ac = correlativeIdOf(a);\n const bc = correlativeIdOf(b);\n if (ac !== bc) return ac - bc;\n return String(a.id).localeCompare(String(b.id));\n}\n\nfunction correlativeIdOf(activity: EngineActivitySnapshot): number {\n const raw = activity.correlative_id;\n const n = typeof raw === 'number' ? raw : Number(raw);\n return Number.isFinite(n) ? n : NOT_SET_SORT_VALUE;\n}\n\nfunction parentKeyOf(activity: EngineActivitySnapshot): ActivityId | '0' {\n const p = activity.parent;\n if (p == null || p === 0 || p === '0') return '0';\n return String(p) as ActivityId;\n}\n\nfunction setHas(set: ReadonlySet<ActivityId>, id: ActivityId): boolean {\n if (set.has(id)) return true;\n // Defensive: callers may store ids as `number` or `string`. Normalize.\n return set.has(String(id) as ActivityId);\n}\n","/**\n * `correlative_id` recompute helper.\n *\n * Walks the activity tree in DFS-order using each activity's CURRENT\n * `correlative_id` as the sibling sort key, then reassigns `correlative_id`\n * to `0, 1, 2, …, N-1` in visit order.\n *\n * Called after every operation that alters the tree structure (create,\n * move, delete). Matches the legacy `recalculateCorrelatives(bridge)`\n * behavior in\n * `react_client/src/views/schedule/operations/capabilities/taskCreationHelpers.ts:62-67`.\n *\n * Sibling sort key: the activity's existing `correlative_id`. Activities\n * without a `correlative_id` (newly created, not yet renumbered) sort\n * AFTER all numbered siblings, in insertion order — so a fresh `next()`\n * + insert appends at the end of the parent's children.\n *\n * Mutates the adapter in place. Idempotent — running twice on the same\n * tree produces the same result.\n *\n * No O(N) Map is built locally. Roots are gathered via `forEachActivity`\n * (zero extra allocation); children come from `collectChildrenSnapshots`\n * which delegates to `HierarchyIndex.getChildren` (O(1) per node).\n */\n\nimport type { ActivityReader } from '../state/roles.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\n\n/**\n * Owner (optional) of the memoized visual order — `ScheduleState` in\n * production; bare test adapters may omit it.\n */\ninterface VisualOrderCacheOwner {\n invalidateVisualOrderIds?(): void;\n /** Journal the pre-sweep correlative_id for transactional rollback. Optional —\n * bare test adapters omit it. `ScheduleState` implements it. */\n noteCorrelativeBefore?(activityId: string, before: number): void;\n}\nimport {\n NOT_SET_SORT_VALUE,\n collectChildrenSnapshots\n} from './visual-order.js';\nimport { isRootParent } from './root-parent.js';\n\n/**\n * Fila cuyo `correlative_id` cambió en el sweep, con su valor previo.\n * Permite a los handlers estructurales armar before-images SOLO de lo que\n * cambió, en vez del snapshot/diff global O(N) (`includeAllIds`).\n */\nexport interface CorrelativeShift {\n readonly activityId: string;\n readonly before: number | undefined;\n}\n\nexport function recomputeCorrelativeIds(\n adapter: ActivityReader & VisualOrderCacheOwner\n): CorrelativeShift[] {\n // This renumbering mutates `correlative_id` directly on the snapshots\n // (bypassing `setActivityField` — deliberate: N journal entries would\n // pollute the dispatch ChangeSet), so the state's memoized visual order\n // must be dropped here. Optional: test adapters without the cache are fine.\n adapter.invalidateVisualOrderIds?.();\n // Collect roots via forEachActivity — avoids the O(N) Array.from(Map.values())\n // that getAllActivities() would allocate.\n const roots: EngineActivitySnapshot[] = [];\n adapter.forEachActivity((activity) => {\n if (isRootParent(activity.parent)) roots.push(activity);\n });\n roots.sort(byCorrelativeId);\n\n // Iterative DFS pre-order traversal. Children are pushed in reverse so that\n // the first child is popped (and visited) first — preserving the order of\n // the original recursive walk. The recursive version risked stack overflow\n // at tree depths >10k.\n const stack: EngineActivitySnapshot[] = [];\n pushInReverseOrder(stack, roots);\n\n const shifts: CorrelativeShift[] = [];\n let counter = 0;\n while (stack.length > 0) {\n const activity = stack.pop()!;\n if (activity.correlative_id !== counter) {\n const before =\n typeof activity.correlative_id === 'number'\n ? activity.correlative_id\n : undefined;\n shifts.push({ activityId: String(activity.id), before });\n if (before !== undefined)\n adapter.noteCorrelativeBefore?.(String(activity.id), before);\n setCorrelativeId(activity, counter);\n }\n counter += 1;\n // collectChildrenSnapshots uses HierarchyIndex.getChildren — O(1) lookup,\n // no local Map rebuild. Returns insertion-order ids; sort for DFS ordering.\n const children = collectChildrenSnapshots(String(activity.id), adapter);\n children.sort(byCorrelativeId);\n pushInReverseOrder(stack, children);\n }\n return shifts;\n}\n\nfunction pushInReverseOrder(\n stack: EngineActivitySnapshot[],\n activities: EngineActivitySnapshot[]\n): void {\n for (let i = activities.length - 1; i >= 0; i -= 1) {\n // Non-null: `i` is bounded by `activities.length` — the assertion only\n // narrows noUncheckedIndexedAccess.\n stack.push(activities[i]!);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers (pure)\n// ---------------------------------------------------------------------------\n\nfunction getCorrelativeId(activity: EngineActivitySnapshot): number {\n const raw = activity.correlative_id;\n const n = typeof raw === 'number' ? raw : Number(raw);\n return Number.isFinite(n) ? n : NOT_SET_SORT_VALUE;\n}\n\nconst byCorrelativeId = (\n a: EngineActivitySnapshot,\n b: EngineActivitySnapshot\n): number => getCorrelativeId(a) - getCorrelativeId(b);\n\nfunction setCorrelativeId(\n activity: EngineActivitySnapshot,\n value: number\n): void {\n activity.correlative_id = value;\n}\n","import type { ScheduleState } from '../internal/state/schedule-state.js';\nimport type {\n ActivityReader,\n ActivityWriter,\n CalendarOps\n} from '../internal/state/roles.js';\nimport type { AutoScheduler } from '../autoscheduler/index.js';\nimport { applyResults } from '../autoscheduler/index.js';\nimport { updateParentBoundsFromChildren } from '../internal/post-processors/runner.js';\nimport { computeExpectedProgressLive } from '../columns/expected-progress/compute.js';\nimport { applyStatusPass } from '../columns/status/compute.js';\nimport { recomputeCorrelativeIds } from '../internal/hierarchy/recompute-correlative-ids.js';\nimport { normalizeConstraintDate } from '../columns/shared/date-normalize.js';\nimport type { ConstraintType } from '../columns/types.js';\nimport type { SectorMetadata } from '../types.js';\n\ninterface InitialPassesDeps {\n readonly state: ScheduleState;\n readonly sector: SectorMetadata;\n readonly scheduler: AutoScheduler;\n readonly skipAutoSchedule: boolean;\n readonly now?: Date | undefined;\n}\n\nexport async function runInitialPasses(deps: InitialPassesDeps): Promise<void> {\n const { state, sector, scheduler, skipAutoSchedule, now } = deps;\n\n recomputeCorrelativeIds(state);\n\n if (sector.updateDurationForPrimaveraEndDate) {\n recomputeDurationsFromDates(state);\n }\n\n normalizeLoadedConstraintDates(state);\n\n if (skipAutoSchedule) {\n if (now) {\n applyExpectedProgressLive(state, now);\n applyStatusPass(state, sector.statusCriteria);\n }\n return;\n }\n\n const result = await scheduler.schedule({});\n applyResults(state, result);\n normalizeMilestoneConstraintDatesForDisplay(state);\n recomputeSkippedLeafEnds(state);\n await updateParentBoundsFromChildren(state, undefined, false);\n\n if (now) {\n applyExpectedProgressLive(state, now);\n applyStatusPass(state, sector.statusCriteria);\n }\n}\n\nexport function applyExpectedProgressLive(\n state: ActivityWriter & CalendarOps,\n now: Date\n): void {\n const rootIds: string[] = [];\n state.forEachActivity((activity, activityId) => {\n if (\n activity.parent === 0 ||\n activity.parent === '0' ||\n activity.parent == null\n )\n rootIds.push(activityId);\n });\n computeExpectedProgressLive(rootIds, now, state);\n}\n\nfunction recomputeSkippedLeafEnds(state: ActivityReader & CalendarOps): void {\n state.forEachActivity((activity) => {\n if (activity.auto_scheduling) return;\n if (!activity.start_date || activity.duration == null) return;\n if (state.getChildren(activity.id).length > 0) return;\n activity.end_date = state.calculateEndDate({\n start_date: activity.start_date,\n duration: activity.duration,\n task: activity\n });\n });\n}\n\nfunction recomputeDurationsFromDates(\n state: ActivityReader & CalendarOps\n): void {\n state.forEachActivity((activity) => {\n if (!activity.start_date || !activity.end_date) return;\n activity.duration = state.calculateDuration({\n start_date: activity.start_date,\n end_date: activity.end_date,\n task: activity\n });\n });\n}\n\nfunction normalizeLoadedConstraintDates(\n state: ActivityReader & CalendarOps\n): void {\n state.forEachActivity((activity) => {\n const type = activity.constraint_type as ConstraintType | null;\n if (!type || !activity.constraint_date) return;\n const constraintDate = activity.constraint_date;\n if (\n activity.type === 'milestone' &&\n (constraintDate.getUTCHours() !== 0 ||\n constraintDate.getUTCMinutes() !== 0)\n ) {\n return;\n }\n const calendar = state.calendarReader.getCalendar(\n String(activity.calendar_id)\n );\n if (!calendar) return;\n activity.constraint_date = normalizeConstraintDate(\n activity.constraint_date,\n calendar,\n type\n );\n });\n}\n\nfunction normalizeMilestoneConstraintDatesForDisplay(\n state: ActivityReader & CalendarOps\n): void {\n state.forEachActivity((activity) => {\n if (activity.type !== 'milestone') return;\n const type = activity.constraint_type as ConstraintType | null;\n if (!type || !activity.constraint_date) return;\n const calendar = state.calendarReader.getCalendar(\n String(activity.calendar_id)\n );\n if (!calendar) return;\n activity.constraint_date = normalizeConstraintDate(\n activity.constraint_date,\n calendar,\n type\n );\n });\n}\n","/**\n * Shim mínimo de `moment` para el port literal del critical path.\n *\n * El legacy usa moment solo para clonar/resetear fechas y un type-guard. El\n * core es UTC-strict y el oráculo está normalizado a wall-clock UTC, así que los\n * setters operan en UTC (no en TZ local como el moment real). Implementa SOLO la\n * superficie que el CP usa: clone, hours/minutes/seconds/milliseconds (getter\n * sin arg + setter encadenable), isMoment, y valueOf/toDate para que\n * `new Date(m)` recupere el instante.\n */\nfunction moment(input) {\n const d =\n input instanceof Date\n ? new Date(input.getTime())\n : input && typeof input === 'object' && typeof input.valueOf === 'function'\n ? new Date(input.valueOf())\n : new Date(input);\n\n const accessor = (getUTC, setUTC) => (value) => {\n if (value === undefined) return d[getUTC]();\n d[setUTC](value);\n return api;\n };\n\n const api = {\n __isMomentShim: true,\n clone: () => moment(d),\n hours: accessor('getUTCHours', 'setUTCHours'),\n minutes: accessor('getUTCMinutes', 'setUTCMinutes'),\n seconds: accessor('getUTCSeconds', 'setUTCSeconds'),\n milliseconds: accessor('getUTCMilliseconds', 'setUTCMilliseconds'),\n valueOf: () => d.getTime(),\n toDate: () => new Date(d.getTime()),\n getTime: () => d.getTime(),\n };\n return api;\n}\n\nmoment.isMoment = (x) =>\n Boolean(x) && typeof x === 'object' && x.__isMomentShim === true;\n\nexport default moment;\n","function isDate(obj) {\n if (obj && obj.constructor === Date) {\n return Boolean(obj.getFullYear && obj.getMonth && obj.getDate);\n }\n return false;\n}\n\nfunction isValidDate(obj) {\n return isDate(obj) && !isNaN(obj.getTime());\n}\n\nexport { isValidDate };\n","import { isValidDate } from './isValidDate.js';\n/**\n * Adds a specified duration to a given date based on the activity's calendar.\n * @param {Object} activityCalendar - The calendar object associated with the activity.\n * @param {Date} date - The starting date for the calculation.\n * @param {number} duration - The duration to add to the date, in hours.\n * @param {Object} activity - The activity object associated with the date calculation.\n * @returns {Date} - The calculated end date after adding the duration.\n */\n\nfunction addDurationToDate(activityCalendar, date, duration, activity) {\n if (!isValidDate(new Date(date))) {\n throw new Error(\n `Invalid date argument for calculateEndDate method. Date: ${date}, Activity: ${JSON.stringify(activity)}`\n );\n }\n\n const dateToCalculate = date;\n return activityCalendar.calculateEndDate({\n start_date: new Date(dateToCalculate),\n duration: duration,\n unit: 'hour',\n task: activity\n });\n}\n\nexport { addDurationToDate };\n","import { isValidDate } from './isValidDate.js';\n/**\n * Gets the next working hour based on the given parameters.\n * @param {Object} activityParams - The parameters for the activity.\n * @param {Date} activityParams.dateBaseToCalculate - The base date to start the calculation from.\n * @param {Object} activityParams.activityCalendar - The calendar object associated with the activity.\n * @param {string} activityParams.direction - The direction of the calculation ('forward' or 'backward').\n * @param {Object} activityParams.activity - The activity object associated with the calculation.\n * @returns {Date} - The next working hour based on the calendar and direction.\n */\n\nfunction getNextWorkingHour(activityParams) {\n if (!isValidDate(new Date(activityParams.dateBaseToCalculate))) {\n throw new Error('Invalid date argument for getClosestWorkTime method');\n }\n\n const { dateBaseToCalculate, activityCalendar, direction, activity } =\n activityParams;\n const newDate = activityCalendar.$gantt.getClosestWorkTime({\n date: new Date(dateBaseToCalculate),\n dir: direction,\n unit: 'hour',\n task: activity\n });\n\n return newDate;\n}\n\nexport { getNextWorkingHour };\n","const byFirstLevel = (activity) => {\n if (!activity) return false;\n return activity['$level'] === 1;\n};\n\nconst filterByParentType = (activity) => activity.type === 'project';\nconst avoidSubproject = (activity) => activity['$level'] !== 0;\nconst byTaskType = (activity) => activity.type === 'task';\nconst byTaskTypeAndMilestone = (activity) =>\n activity.type === 'task' || activity.type === 'milestone';\n\nexport default {\n byFirstLevel,\n filterByParentType,\n avoidSubproject,\n byTaskType,\n byTaskTypeAndMilestone\n};\n","const CONSTRAINT_TYPES = Object.freeze({\n MFO: 'mfo',\n MSO: 'mso',\n FNLT: 'fnlt',\n FNET: 'fnet',\n SNET: 'snet',\n SNLT: 'snlt',\n ALAP: 'alap',\n ASAP: 'asap'\n});\n\nexport { CONSTRAINT_TYPES };\n","const LINK_TYPES = Object.freeze({\n FS: 'fs',\n SS: 'ss',\n FF: 'ff',\n SF: 'sf'\n});\n\nexport { LINK_TYPES };\n","function getLinkNameByCode(code) {\n const linkMap = {\n 0: 'fs',\n 1: 'ss',\n 2: 'ff',\n 3: 'sf'\n };\n return linkMap[Number(code)] || 'sf';\n}\n\nexport { getLinkNameByCode };\n","import { log } from '../../shims/monitor.js';\nimport filters from '../../helpers/filters.js';\n\n/**\n * Identifies second-level activities that can be calculated.\n * @param {Object} params - The parameters object.\n * @param {Object} params.gantt - The Gantt instance.\n * @param {Set<number>} params.pendingParentsWithNoLinks - Set of parent IDs with no links.\n * @param {Map<number, any>} params.calculations - Map of calculated activities.\n * @param {string} params.linkProperty - The link property ('$source' or '$target').\n * @param {Function} params.getArrayOfLinkedActivities - Function to get array of linked activities.\n * @param {Object} params.filters - Object containing filter functions.\n * @returns {Set<number>} Set of second-level activity IDs that can be calculated.\n */\nexport function identifySecondLevelActivities(params) {\n const { gantt, pendingParentsWithNoLinks, calculations, linkProperty } =\n params;\n\n try {\n const subprojectsWithNoLinks = getSubprojectsWithNoLinks({\n gantt,\n pendingParentsWithNoLinks\n });\n\n if (subprojectsWithNoLinks.length === 0) {\n return new Set();\n }\n\n const allChildrenFromParents = getAllChildrenFromParents({\n gantt,\n subprojectsWithNoLinks\n });\n\n const childrenThatCanBeCalculated = filterChildrenThatCanBeCalculated({\n gantt,\n childrenIds: allChildrenFromParents,\n linkProperty,\n getArrayOfLinkedActivities,\n calculations\n });\n\n return new Set(childrenThatCanBeCalculated.map((activity) => activity.id));\n } catch (e) {\n log('Critical Path', 'Error in identifySecondLevelActivities');\n throw e;\n }\n}\n\n/**\n * Retrieves subprojects (parent activities) with no links.\n * @param {Object} params - The parameters object.\n * @param {Object} params.gantt - The Gantt instance.\n * @param {Set<number>} params.pendingParentsWithNoLinks - Set of parent IDs with no links.\n * @returns {Array<number>} Array of subproject IDs with no links.\n */\nfunction getSubprojectsWithNoLinks(params) {\n const { gantt, pendingParentsWithNoLinks } = params;\n\n return gantt\n .getTaskByTime()\n .filter(filters.filterByParentType)\n .filter((activity) => pendingParentsWithNoLinks.has(activity.id))\n .map((activity) => activity.id);\n}\n\n/**\n * Retrieves all children from the given parent subprojects.\n * @param {Object} params - The parameters object.\n * @param {Object} params.gantt - The Gantt instance.\n * @param {Array<number>} params.subprojectsWithNoLinks - Array of subproject IDs.\n * @returns {Set<number>} Set of child activity IDs.\n */\nfunction getAllChildrenFromParents(params) {\n const { gantt, subprojectsWithNoLinks } = params;\n\n const allChildrenSet = new Set();\n\n for (const subprojectId of subprojectsWithNoLinks) {\n const childrenIds = gantt.getChildren(subprojectId);\n\n const validChildren = childrenIds.filter((childId) => {\n const childActivity = gantt.getTask(childId);\n const isTaskOrMilestone = filters.byTaskTypeAndMilestone(childActivity);\n const hasProgressLessThan100 = Number(childActivity.progress) < 100;\n return isTaskOrMilestone && hasProgressLessThan100;\n });\n\n validChildren.forEach((childId) => allChildrenSet.add(childId));\n }\n\n return [...allChildrenSet];\n}\n\n/**\n * Filters children activities that can be calculated.\n * @param {Object} params - The parameters object.\n * @param {Object} params.gantt - The Gantt instance.\n * @param {Array<number>} params.childrenIds - Array of child activity IDs.\n * @param {string} params.linkProperty - The link property ('$source' or '$target').\n * @param {Function} params.getArrayOfLinkedActivities - Function to get array of linked activities.\n * @param {Map<number, any>} params.calculations - Map of calculated activities.\n * @returns {Array<Object>} Array of child activities that can be calculated.\n */\nfunction filterChildrenThatCanBeCalculated(params) {\n const {\n gantt,\n childrenIds,\n linkProperty,\n getArrayOfLinkedActivities,\n calculations\n } = params;\n\n const calculableChildren = [];\n\n for (const childId of childrenIds) {\n const activity = gantt.getTask(childId);\n const links = activity[linkProperty] || [];\n const linkedActivities = getArrayOfLinkedActivities({\n gantt,\n links,\n linkDirection: linkProperty === '$source' ? 'target' : 'source'\n });\n\n const isLinkedWithCalculatedOrSibling = linkedActivities.every(\n (linkedActivityId) => calculations.has(linkedActivityId)\n );\n\n if (isLinkedWithCalculatedOrSibling) {\n calculableChildren.push(activity);\n }\n }\n\n return calculableChildren;\n}\n\n/**\n * Retrieves an array of linked activity IDs.\n * @param {Object} params - The parameters object.\n * @param {Object} params.gantt - The Gantt instance.\n * @param {Array<number>} params.links - Array of link IDs.\n * @param {string} params.linkDirection - The link direction ('source' or 'target').\n * @returns {Array<number>} Array of linked activity IDs.\n */\nfunction getArrayOfLinkedActivities(params) {\n const { gantt, links, linkDirection } = params;\n\n const linkedActivityIds = [];\n\n for (const linkId of links) {\n const link = gantt.getLink(linkId);\n if (!link) {\n log('Critical Path', `Link data not found with id ${linkId}`);\n continue;\n }\n const linkedActivityId = Number(link[linkDirection]);\n linkedActivityIds.push(linkedActivityId);\n }\n\n return linkedActivityIds;\n}\n","import { log } from '../../shims/monitor.js';\nimport filters from '../../helpers/filters.js';\n\n/**\n * Identifies the initial activities based on the direction and updates the chain start activities.\n * @param {Object} params - The parameters object.\n * @param {Object} params.gantt - The Gantt instance.\n * @param {string} params.linkProperty - The link property ('$target' or '$source').\n * @param {string} params.direction - The direction ('forward' or 'backward').\n * @returns {Object} An object containing the chain start activities and activities linked to linked parents.\n */\nexport function identifyInitialActivities({ gantt, linkProperty, direction }) {\n try {\n const chainStartActivities = getChainStartActivities(gantt, linkProperty);\n\n if (direction === 'forward') {\n return {\n chainStartActivities,\n activitiesStartChainButChildrenOfLinkedParents: null\n };\n }\n\n if (direction === 'backward') {\n return processBackwardActivities(\n chainStartActivities,\n gantt,\n linkProperty\n );\n }\n } catch (e) {\n console.log('Critical Path', e);\n log('Critical Path', 'Error in identifyInitialActivities');\n throw e;\n }\n}\n\n/**\n * Retrieves the chain start activities by filtering the tasks.\n * @param {Object} gantt - The Gantt instance.\n * @param {string} linkProperty - The link property ('$target' or '$source').\n * @returns {Array} An array of chain start activities.\n */\nfunction getChainStartActivities(gantt, linkProperty) {\n return gantt\n .getTaskByTime()\n .filter(filters.avoidSubproject)\n .filter(filters.byTaskTypeAndMilestone)\n .filter((activity) => !activity[linkProperty].length);\n}\n\n/**\n * Processes backward activities to separate those with and without linked parents.\n * @param {Array} chainStartActivities - The initial chain start activities.\n * @param {Object} gantt - The Gantt instance.\n * @param {string} linkProperty - The link property ('$target' or '$source').\n * @returns {Object} An object containing activities without linked parents and a set of activities linked to linked parents.\n */\nfunction processBackwardActivities(chainStartActivities, gantt, linkProperty) {\n const withoutLinkedParents = [];\n const activitiesStartChainButChildrenOfLinkedParents = new Set();\n\n chainStartActivities.forEach((activity) => {\n const parentId = Number(activity.parent);\n const parentActivity = gantt.getTask(parentId);\n\n if (!parentActivity) return;\n\n if (parentActivity[linkProperty].length > 0) {\n activitiesStartChainButChildrenOfLinkedParents.add(activity.id);\n } else if (parentActivity.constraint_type !== 'fnlt') {\n withoutLinkedParents.push(activity);\n }\n });\n\n return {\n chainStartActivities: withoutLinkedParents,\n activitiesStartChainButChildrenOfLinkedParents\n };\n}\n","import { log } from '../../shims/monitor.js';\nimport filters from '../../helpers/filters.js';\n\n/**\n * Identifies parents with and without links and updates the corresponding sets.\n * @param {Object} params - The parameters object.\n * @param {Object} params.gantt - The Gantt instance.\n * @param {string} params.direction - The calculation direction ('forward' or 'backward').\n * @param {string} params.linkProperty - The link property name ('$target' or '$source').\n * @returns {Object} An object containing:\n * - parentsWithFullProgress: Set of parent activity IDs with full progress.\n * - pendingParentsWithNoLinks: Set of parent activity IDs with no links.\n * - pendingParentsWithLinks: Set of parent activity IDs with links.\n */\nexport function identifyParentsWithAndWithoutLinks({\n gantt,\n direction,\n linkProperty\n}) {\n try {\n const allParentActivities = getAllParentActivities(gantt);\n const parentsWithFullProgress = new Set();\n const pendingParentsWithNoLinks = new Set();\n const pendingParentsWithLinks = new Set();\n\n if (direction === 'backward') {\n const parentsWithFullProgressArray =\n getParentsWithFullProgress(allParentActivities);\n parentsWithFullProgressArray.forEach((activity) => {\n parentsWithFullProgress.add(activity.id);\n });\n }\n\n const parentsWithNoLinks = getParentsWithNoLinks(\n allParentActivities,\n direction,\n linkProperty\n );\n\n const difference = getDifference(allParentActivities, parentsWithNoLinks);\n\n parentsWithNoLinks.forEach((activity) => {\n pendingParentsWithNoLinks.add(activity.id);\n });\n\n difference.forEach((activity) => {\n pendingParentsWithLinks.add(activity.id);\n });\n\n return {\n parentsWithFullProgress,\n pendingParentsWithNoLinks,\n pendingParentsWithLinks\n };\n } catch (e) {\n log('Critical Path', 'Error in identifyParentsWithAndWithoutLinks');\n throw e;\n }\n}\n\n/**\n * Retrieves all parent activities.\n * @param {Object} gantt - The Gantt instance.\n * @returns {Array} An array of parent activities.\n */\nexport function getAllParentActivities(gantt) {\n return gantt\n .getTaskByTime()\n .filter(filters.filterByParentType)\n .filter(filters.avoidSubproject);\n}\n\n/**\n * Retrieves parents with no links based on direction and link property.\n * @param {Array} activities - Array of activities.\n * @param {string} direction - The calculation direction ('forward' or 'backward').\n * @param {string} linkProperty - The link property name ('$target' or '$source').\n * @returns {Array} An array of parent activities with no links.\n */\nexport function getParentsWithNoLinks(activities, direction, linkProperty) {\n return activities.filter((activity) => {\n const links = activity[linkProperty];\n if (!Array.isArray(links)) {\n return false;\n }\n const hasLinks = links.length > 0;\n const constraintType = activity.constraint_type || '';\n const isNotFnlt = constraintType !== 'fnlt';\n\n if (direction === 'forward') {\n const isNotSnet = constraintType !== 'snet';\n return !hasLinks && isNotFnlt && isNotSnet;\n } else {\n return !hasLinks && isNotFnlt;\n }\n });\n}\n\n/**\n * Retrieves the difference between all activities and excluded activities.\n * @param {Array} allActivities - Array of all activities.\n * @param {Array} excludedActivities - Array of activities to exclude.\n * @returns {Array} An array of activities not in excludedActivities.\n */\nexport function getDifference(allActivities, excludedActivities) {\n const excludedIds = new Set(\n excludedActivities.map((activity) => activity.id)\n );\n return allActivities.filter((activity) => {\n return !excludedIds.has(activity.id);\n });\n}\n\n/**\n * Retrieves parents with full progress (100%).\n * @param {Array} activities - Array of activities.\n * @returns {Array} An array of parent activities with full progress.\n */\nexport function getParentsWithFullProgress(activities) {\n return activities.filter((activity) => {\n const progress = Number(activity.progress);\n if (Number.isNaN(progress)) {\n return false;\n }\n return progress === 100;\n });\n}\n","import { log } from '../../shims/monitor.js';\n/**\n * Identifies forbidden activities linked to parents with links.\n * @param {Object} params - The parameters object.\n * @param {Set<number>} params.pendingParentsWithLinks - Set of activity IDs that are pending parents with links.\n * @param {Object} params.gantt - The Gantt instance.\n * @param {string} params.direction - The calculation direction ('forward' or 'backward').\n * @returns {Set<number>} A set of forbidden activity IDs linked to parents with links.\n */\nexport function identifyForbiddenActivities({\n pendingParentsWithLinks,\n gantt,\n direction\n}) {\n try {\n const forbiddenActivities = new Set();\n\n pendingParentsWithLinks.forEach((activityId) => {\n const activity = gantt.getTask(activityId);\n const linkProperty = getLinkProperty(direction);\n const linkDirection = getLinkDirection(direction);\n\n const activityLinks = activity[linkProperty];\n\n if (!Array.isArray(activityLinks)) {\n return;\n }\n\n const linkedActivities = getArrayOfLinkedActivities(\n gantt,\n activityLinks,\n linkDirection\n );\n\n linkedActivities.forEach((linkedActivityId) => {\n forbiddenActivities.add(linkedActivityId);\n });\n });\n\n return forbiddenActivities;\n } catch (e) {\n log(\n 'Critical Path',\n 'Error in identifyForbiddenActivitiesLinkedToParentsWithLinks'\n );\n throw e;\n }\n}\n\n/**\n * Determines the link property based on the direction.\n * @param {string} direction - The calculation direction ('forward' or 'backward').\n * @returns {string} The link property ('$source' or '$target').\n */\nfunction getLinkProperty(direction) {\n return direction === 'forward' ? '$source' : '$target';\n}\n\n/**\n * Determines the link direction based on the calculation direction.\n * @param {string} direction - The calculation direction ('forward' or 'backward').\n * @returns {string} The link direction ('target' or 'source').\n */\nfunction getLinkDirection(direction) {\n return direction === 'forward' ? 'target' : 'source';\n}\n\nfunction getArrayOfLinkedActivities(gantt, links, direction) {\n return links.map((link) => {\n const linkData = gantt.getLink(link);\n const linkedActivity = linkData[direction];\n return Number(linkedActivity);\n });\n}\n","import { identifySecondLevelActivities } from './secondLevelActivities.js';\nimport { identifyInitialActivities } from './initialActivities.js';\nimport { identifyParentsWithAndWithoutLinks } from './identifyParentsWithAndWithoutLinks.js';\nimport { identifyForbiddenActivities } from './identifyForbiddenActivities.js';\n\nexport default {\n identifySecondLevelActivities,\n identifyInitialActivities,\n identifyParentsWithAndWithoutLinks,\n identifyForbiddenActivities\n};\n","/**\n * Function to find the set with the highest Early Start (ES).\n * @param {Array<Object>} arrayCalculatedLinks - Array of objects containing earlyFinish (EF) and earlyStart (ES).\n * @returns {Object|boolean} - The set with the highest Early Start (ES) or `false` if the array is empty.\n */\n\nfunction getMaxEarlyStartSet(arrayCalculatedLinks) {\n if (!arrayCalculatedLinks.length) {\n return false;\n }\n return arrayCalculatedLinks.reduce((maxObj, currentObj) =>\n currentObj.ef > maxObj.ef ? currentObj : maxObj\n );\n}\n\nexport { getMaxEarlyStartSet };\n","import { getNextWorkingHour } from '../../helpers/getNextWorkingHour.js';\nimport { addDurationToDate } from '../../helpers/addDurationToDate.js';\nimport { LINK_TYPES } from '../../constants/index.js';\n\n/**\n * Mutates a date based on the link type and lag provided. This function acts as an intermediary, deciding whether\n * to move the date to the future using `getNextWorkingHour` or to mutate it to the future or past using\n * `mutateTheDateToFutureOrPastInBaseRestriction`.\n *\n * @param {Object} params - The parameters for date mutation.\n * @param {string} params.linkType - The type of link (e.g., FS, SS) that determines the behavior of the date mutation.\n * @param {number} params.lag - The lag time that impacts how the date is mutated.\n * @param {Date} params.predecessorTime - The starting time from which the mutation begins.\n * @param {Object} params.activityCalendar - The calendar object used to calculate working hours.\n * @param {Object} params.activity - The activity object that may influence the date mutation logic.\n * @returns {Date} - The mutated date, adjusted according to the link type, lag, and activity calendar.\n */\nfunction mutateDate({\n linkType,\n lag,\n predecessorTime,\n activityCalendar,\n activity\n}) {\n if (linkType === LINK_TYPES.FS && lag === 0) {\n return getNextWorkingHour({\n predecessorTime,\n activityCalendar,\n direction: 'future',\n activity: activity\n });\n } else {\n return mutateTheDateToFutureOrPastInBaseRestriction(\n predecessorTime,\n linkType,\n activityCalendar,\n activity\n );\n }\n}\n\nfunction calculateRestriction({\n duration,\n constraintDate,\n activityCalendar,\n activity\n}) {\n let ef = new Date(constraintDate);\n let es = addDurationToDate(activityCalendar, ef, duration, activity);\n\n return { es, ef };\n}\n\nfunction calculateRestrictionSnet({\n duration,\n constraintDate,\n activityCalendar,\n activity\n}) {\n let es = new Date(constraintDate);\n let ef = addDurationToDate(activityCalendar, es, duration, activity);\n\n return { es, ef };\n}\n\nfunction mutateTheDateToFutureOrPastInBaseRestriction(\n dateBaseToCalculate,\n restrictionOfLink,\n activityCalendar,\n activity\n) {\n if (\n ![LINK_TYPES.FS, LINK_TYPES.SS, LINK_TYPES.FF].includes(restrictionOfLink)\n ) {\n return dateBaseToCalculate;\n }\n\n let constraintThatGoToNextWorkingHour = [LINK_TYPES.FS, LINK_TYPES.SS];\n let direction = constraintThatGoToNextWorkingHour.includes(restrictionOfLink)\n ? 'future'\n : 'past';\n\n return getNextWorkingHour({\n dateBaseToCalculate,\n activityCalendar,\n direction,\n activity\n });\n}\n\nexport {\n mutateDate,\n calculateRestriction,\n calculateRestrictionSnet,\n mutateTheDateToFutureOrPastInBaseRestriction\n};\n","// Import necessary modules and helpers\nimport { getLinkNameByCode } from '../../constants/index.js';\nimport { addDurationToDate } from '../../helpers/addDurationToDate.js';\nimport { getNextWorkingHour } from '../../helpers/getNextWorkingHour.js';\nimport { getMaxEarlyStartSet } from '../../forward-path/helpers/getMaxEarlyStartSet.js';\nimport {\n mutateDate,\n calculateRestriction,\n calculateRestrictionSnet,\n mutateTheDateToFutureOrPastInBaseRestriction\n} from './helpers.js';\n\nclass CalculateForwardParentsWithLinks {\n /**\n * Initializes the calculator with linked activities, the current activity, and the gantt instance.\n * @param {Array<Object>} linkedActivitiesData - Array of linked activities data.\n * @param {Object} activity - The current activity object.\n * @param {Object} gantt - The gantt instance.\n */\n constructor(linkedActivitiesData, activity, gantt) {\n this.linkedActivitiesData = linkedActivitiesData;\n this.activity = activity;\n this.gantt = gantt;\n\n this.activityCalendar = this.gantt.getCalendar(this.activity.calendar_id);\n if (!this.activityCalendar) {\n throw new Error(\n `Error trying to get calendar with id: ${this.activity.calendar_id}`\n );\n }\n }\n\n /**\n * Main method to perform the calculation.\n * @returns {Object} The calculation result.\n */\n calculate() {\n const calculationsFromLinks = this.calculateLinks();\n\n const maxEfFromLinks = getMaxEarlyStartSet(calculationsFromLinks);\n\n const constraintType = this.activity.constraint_type;\n\n if (constraintType === 'snet') {\n return this.handleSNETConstraint(maxEfFromLinks);\n }\n\n if (constraintType === 'fnlt') {\n return this.handleFNLTConstraint(maxEfFromLinks);\n }\n\n return maxEfFromLinks;\n }\n\n /**\n * Calculates the dates based on the linked activities.\n * @returns {Array<Object>} Array of calculation results from links.\n */\n calculateLinks() {\n const calculations = [];\n\n for (const linkedActivity of this.linkedActivitiesData) {\n const linkTypeCode = linkedActivity.linkType;\n const linkType = getLinkNameByCode(linkTypeCode);\n const lag = linkedActivity.linkLag;\n const predecessorEs = linkedActivity.es;\n const predecessorEf = linkedActivity.ef;\n\n let calculation = null;\n\n if (linkType === 'ss') {\n calculation = this.calculateSSLink({ lag, predecessorEs });\n } else if (linkType === 'ff') {\n calculation = this.calculateFFLink({ lag, predecessorEf });\n } else if (linkType === 'fs') {\n calculation = this.calculateFSLink({ lag, predecessorEf });\n } else if (linkType === 'sf') {\n calculation = this.calculateSFLink({\n lag,\n predecessorEs,\n predecessorEf\n });\n } else {\n continue;\n }\n\n if (calculation) {\n calculations.push(calculation);\n }\n }\n\n return calculations;\n }\n\n /**\n * Handles the 'Start No Earlier Than' (SNET) constraint.\n * @param {Object|null} maxEfFromLinks - The maximum early finish from links.\n * @returns {Object} The calculation result considering the constraint.\n */\n handleSNETConstraint(maxEfFromLinks) {\n const restriction = calculateRestrictionSnet({\n duration: this.activity.duration,\n constraintDate: this.activity.constraint_date,\n activityCalendar: this.activityCalendar,\n activity: this.activity\n });\n\n if (!maxEfFromLinks) {\n return restriction;\n }\n\n return maxEfFromLinks.ef > restriction.ef ? maxEfFromLinks : restriction;\n }\n\n /**\n * Handles the 'Finish No Later Than' (FNLT) constraint.\n * @param {Object|null} maxEfFromLinks - The maximum early finish from links.\n * @returns {Object} The calculation result considering the constraint.\n */\n handleFNLTConstraint(maxEfFromLinks) {\n const restriction = calculateRestriction({\n duration: -this.activity.duration,\n constraintDate: this.activity.constraint_date,\n activityCalendar: this.activityCalendar,\n activity: this.activity\n });\n\n if (!maxEfFromLinks) {\n return restriction;\n }\n\n return maxEfFromLinks.ef > restriction.ef ? restriction : maxEfFromLinks;\n }\n\n /**\n * Calculates dates for 'Start to Start' (SS) link type.\n * @param {Object} params - Parameters containing lag and predecessor early start.\n * @returns {Object} The calculation result.\n */\n calculateSSLink({ lag, predecessorEs }) {\n const esLinked = mutateDate({\n linkType: 'ss',\n lag,\n predecessorTime: predecessorEs,\n activityCalendar: this.activityCalendar,\n activity: this.activity\n });\n\n let es = addDurationToDate(\n this.activityCalendar,\n esLinked,\n lag,\n this.activity\n );\n\n if (lag > 0) {\n es = mutateTheDateToFutureOrPastInBaseRestriction(\n es,\n 'ss',\n this.activityCalendar,\n this.activity\n );\n }\n\n const ef = addDurationToDate(\n this.activityCalendar,\n es,\n this.activity.duration,\n this.activity\n );\n\n return { es, ef };\n }\n\n /**\n * Calculates dates for 'Finish to Finish' (FF) link type.\n * @param {Object} params - Parameters containing lag and predecessor early finish.\n * @returns {Object} The calculation result.\n */\n calculateFFLink({ lag, predecessorEf }) {\n const efLinked = mutateDate({\n linkType: 'ff',\n lag,\n predecessorTime: predecessorEf,\n activityCalendar: this.activityCalendar,\n activity: this.activity\n });\n\n const ef = addDurationToDate(\n this.activityCalendar,\n efLinked,\n lag,\n this.activity\n );\n\n let es = addDurationToDate(\n this.activityCalendar,\n ef,\n -this.activity.duration,\n this.activity\n );\n\n if (lag > 0) {\n es = mutateTheDateToFutureOrPastInBaseRestriction(\n es,\n 'ff',\n this.activityCalendar,\n this.activity\n );\n }\n\n return { es, ef };\n }\n\n /**\n * Calculates dates for 'Finish to Start' (FS) link type.\n * @param {Object} params - Parameters containing lag and predecessor early finish.\n * @returns {Object} The calculation result.\n */\n calculateFSLink({ lag, predecessorEf }) {\n let efLinked = predecessorEf;\n\n if (lag === 0) {\n efLinked = getNextWorkingHour({\n dateBaseToCalculate: predecessorEf,\n activityCalendar: this.activityCalendar,\n direction: 'future',\n activity: this.activity\n });\n }\n\n const es = addDurationToDate(\n this.activityCalendar,\n efLinked,\n lag,\n this.activity\n );\n\n const ef = addDurationToDate(\n this.activityCalendar,\n es,\n this.activity.duration,\n this.activity\n );\n\n return { es, ef };\n }\n\n /**\n * Calculates dates for 'Start to Finish' (SF) link type.\n * @param {Object} params - Parameters containing lag, predecessor early start, and finish.\n * @returns {Object} The calculation result.\n */\n calculateSFLink({ lag, predecessorEs }) {\n const ef = addDurationToDate(\n this.activityCalendar,\n predecessorEs,\n lag,\n this.activity\n );\n\n let es = addDurationToDate(\n this.activityCalendar,\n ef,\n -this.activity.duration,\n this.activity\n );\n\n if (lag > 0) {\n es = mutateTheDateToFutureOrPastInBaseRestriction(\n es,\n 'sf',\n this.activityCalendar,\n this.activity\n );\n }\n\n return { es, ef };\n }\n}\n\nexport default CalculateForwardParentsWithLinks;\n","import moment from '../../shims/moment.js';\nimport { getLinkNameByCode } from '../../constants/index.js';\nimport { addDurationToDate } from '../../helpers/addDurationToDate.js';\nimport { getNextWorkingHour } from '../../helpers/getNextWorkingHour.js';\n\nclass CalculateBackwardParentsLinks {\n constructor(calculationObject) {\n this.linkedActivitiesData = calculationObject.linksWithActivityData;\n this.activity = calculationObject.activity;\n this.gantt = calculationObject.gantt;\n }\n\n calculate() {\n this.activityCalendar = this.gantt.getCalendar(this.activity.calendar_id);\n if (!this.activityCalendar) {\n throw new Error(\n `Error trying to get calendar with id: ${this.activity.calendar_id}`\n );\n }\n\n const calculationsFromLinks = [];\n\n for (let linkedActivity of this.linkedActivitiesData) {\n const linkType = getLinkNameByCode(linkedActivity.linkType);\n\n if (\n linkedActivity.type === 'task' &&\n Number(linkedActivity.progress) > 0\n ) {\n continue;\n }\n\n if (\n linkedActivity.type === 'project' &&\n Number(linkedActivity.progress) === 100\n ) {\n continue;\n }\n\n const lag = linkedActivity.linkLag;\n let sucessorLs = linkedActivity.ls;\n let sucessorLf = linkedActivity.lf;\n if (linkType === 'ss') {\n const valuesToDoCalculation = {\n lag,\n workTime: sucessorLs,\n lsDataCalculation: -lag,\n lfDataCalculation: this.activity.duration\n };\n let { ls, lf } = this.calculateSSLink(valuesToDoCalculation);\n calculationsFromLinks.push({ ls, lf });\n }\n\n if (linkType === 'ff') {\n const valuesToDoCalculation = {\n lag,\n workTime: sucessorLf,\n lsDataCalculation: -this.activity.duration,\n lfDataCalculation: -lag\n };\n\n let { ls, lf } = this.calculateFFLink(valuesToDoCalculation);\n\n calculationsFromLinks.push({ ls, lf });\n }\n\n if (linkType === 'fs') {\n const valuesToDoCalculation = {\n lag,\n workTime: sucessorLs,\n lsDataCalculation: -this.activity.duration,\n lfDataCalculation: -lag\n };\n\n let { ls, lf } = this.calculateFsLink(valuesToDoCalculation);\n\n calculationsFromLinks.push({ ls, lf });\n }\n\n if (linkType === 'sf') {\n const valuesToDoCalculation = {\n lag,\n workTime: sucessorLf,\n lsDataCalculation: -lag,\n lfDataCalculation: this.activity.duration\n };\n\n let { ls, lf } = this.calculateSFLink(valuesToDoCalculation);\n\n calculationsFromLinks.push({ ls, lf });\n }\n }\n\n if (this.activity.constraint_type === 'fnlt') {\n const maxLfFromLinks = this.getMinLfFromLinks(calculationsFromLinks);\n\n let restriction = this.calculateSfRestrictionDates();\n\n if (!maxLfFromLinks) {\n return restriction;\n }\n return this.getMinLfFromLinks([restriction, maxLfFromLinks]);\n } else {\n const result = this.getMinLfFromLinks(calculationsFromLinks);\n if (result === false) {\n const projectDates = this.gantt.getSubtaskDates();\n return {\n ls: addDurationToDate(\n this.activityCalendar,\n projectDates.end_date,\n -this.activity.duration,\n this.activity\n ),\n lf: projectDates.end_date\n };\n }\n\n return result;\n }\n }\n\n calculateFFLink({ lag, workTime, lsDataCalculation, lfDataCalculation }) {\n let lfPred = null;\n let lsPred = null;\n\n if (lag === 0) {\n lfPred = addDurationToDate(\n this.activityCalendar,\n workTime,\n lfDataCalculation,\n this.activity\n );\n lsPred = addDurationToDate(\n this.activityCalendar,\n lfPred,\n lsDataCalculation,\n this.activity\n );\n return { ls: lsPred, lf: lfPred };\n }\n\n let lfSucessor = workTime;\n\n if (lag > 0) {\n lfSucessor = this.getLastWorkingHour(\n lfSucessor,\n this.activityCalendar,\n 'past'\n );\n }\n lfPred = addDurationToDate(\n this.activityCalendar,\n lfSucessor,\n lfDataCalculation,\n this.activity\n );\n lsPred = addDurationToDate(\n this.activityCalendar,\n lfPred,\n lsDataCalculation,\n this.activity\n );\n return { ls: lsPred, lf: lfPred };\n }\n\n calculateFsLink({\n lag,\n workTime,\n lsDataCalculation,\n lfDataCalculation,\n isMilestone = false\n }) {\n let lfPred = null;\n let lsPred = null;\n\n if (lag === 0) {\n const lsSucessor = this.getLastWorkingHour(\n workTime,\n this.activityCalendar,\n 'past'\n );\n\n lfPred = addDurationToDate(\n this.activityCalendar,\n lsSucessor,\n lfDataCalculation,\n this.activity\n );\n\n lfPred = this.getLastWorkingHour(lfPred, this.activityCalendar, 'past');\n\n lsPred = addDurationToDate(\n this.activityCalendar,\n lfPred,\n lsDataCalculation,\n this.activity\n );\n\n return { ls: lsPred, lf: lfPred };\n }\n\n let lsSucessor = workTime;\n\n if (!isMilestone) {\n lsSucessor = this.getLastWorkingHour(workTime, this.activityCalendar);\n }\n\n lfPred = addDurationToDate(\n this.activityCalendar,\n lsSucessor,\n lfDataCalculation,\n this.activity\n );\n\n lsPred = addDurationToDate(\n this.activityCalendar,\n lfPred,\n lsDataCalculation,\n this.activity\n );\n\n if (!isMilestone) {\n lfPred = this.getLastWorkingHour(lfPred, this.activityCalendar, 'past');\n }\n\n return { ls: lsPred, lf: lfPred };\n }\n\n calculateSFLink({ lag, workTime, lsDataCalculation, lfDataCalculation }) {\n let lfPred = null;\n let lsPred = null;\n let lfSucessor = workTime;\n\n lsPred = addDurationToDate(\n this.activityCalendar,\n lfSucessor,\n lsDataCalculation,\n this.activity\n );\n\n lfPred = addDurationToDate(\n this.activityCalendar,\n lsPred,\n lfDataCalculation,\n this.activity\n );\n\n return { ls: lsPred, lf: lfPred };\n }\n\n calculateSSLink({\n lag,\n workTime,\n lsDataCalculation,\n lfDataCalculation,\n isMilestone = false\n }) {\n let lfPred = null;\n let lsPred = null;\n\n if (lag === 0) {\n lsPred = addDurationToDate(\n this.activityCalendar,\n workTime,\n lsDataCalculation,\n this.activity\n );\n\n lfPred = addDurationToDate(\n this.activityCalendar,\n lsPred,\n lfDataCalculation,\n this.activity\n );\n\n return { ls: lsPred, lf: lfPred };\n }\n let lsSucessor = workTime;\n if (lag < 0 && !isMilestone) {\n lsSucessor = this.getLastWorkingHour(\n lsSucessor,\n this.activityCalendar,\n 'future'\n );\n }\n\n lsPred = addDurationToDate(\n this.activityCalendar,\n lsSucessor,\n lsDataCalculation,\n this.activity\n );\n lfPred = addDurationToDate(\n this.activityCalendar,\n lsPred,\n lfDataCalculation,\n this.activity\n );\n return { ls: lsPred, lf: lfPred };\n }\n\n getMinLfFromLinks(allLinksCalculations = []) {\n if (!allLinksCalculations.length) {\n return false;\n }\n return allLinksCalculations.reduce((min, activity) =>\n activity.lf < min.lf ? activity : min\n );\n }\n\n calculateSfRestrictionDates() {\n const lfRestriction = this.activity.constraint_date;\n const duration = this.activity.duration;\n const lsRestriction = addDurationToDate(\n this.activityCalendar,\n lfRestriction,\n -duration,\n this.activity\n );\n\n return { ls: lsRestriction, lf: lfRestriction };\n }\n\n getLastWorkingHour(date, activityCalendar, dir = 'past') {\n const normalizedDate = date instanceof Date ? date : new Date(date);\n let resetedDate = moment(normalizedDate).clone();\n\n if (\n this.isActivityInInitHour(activityCalendar, normalizedDate) &&\n dir === 'past'\n ) {\n resetedDate = resetedDate.hours(0).minutes(0).seconds(0).milliseconds(0);\n }\n\n let newDate = getNextWorkingHour({\n dateBaseToCalculate: new Date(resetedDate),\n direction: dir,\n activityCalendar: activityCalendar,\n activity: this.activity\n });\n return newDate;\n }\n\n /**\n * Determines if a given date corresponds to the initial work hour of an activity as defined in the activity calendar.\n * This function retrieves the first work interval from the activity calendar and compares the hour portion\n * of the input date to the start hour of the work interval.\n * @param {object} activityCalendar - The calendar object containing work hours and scheduling information for the activity.\n * @param {Date} date - The date to check against the activity's start hour.\n * @returns {boolean} True if the hour of the input date matches the initial work hour of the activity; otherwise, false.\n */\n isActivityInInitHour(activityCalendar, date) {\n const normalizedDate = date instanceof Date ? date : new Date(date);\n const shifts = activityCalendar.getWorkHours(normalizedDate);\n let firstWorkInterval = shifts[0];\n\n if (!firstWorkInterval) {\n return false;\n }\n\n if (!firstWorkInterval.includes('-')) return false;\n\n let workStartHour = firstWorkInterval.split('-')[0];\n\n if (!workStartHour.includes(':')) return false;\n\n let hoursMinutes = workStartHour.split(':');\n\n if (hoursMinutes.length < 2) return false;\n workStartHour = parseInt(hoursMinutes[0], 10);\n\n if (moment.isMoment(date)) {\n return date.hours() === workStartHour;\n }\n // UTC core: los instantes son UTC; usar getUTCHours (el legacy corría en TZ local).\n return normalizedDate.getUTCHours() === workStartHour;\n }\n}\n\nexport default CalculateBackwardParentsLinks;\n","import CalculateForwardParentsWithLinks from '../parents-calculations/forward.js';\nimport CalculateBackwardParentsLinks from '../parents-calculations/backward.js';\n/**\n * Calculates the parent activity when it has links.\n * @param {Object} params - The parameters object.\n * @param {Object} params.parent - The parent activity object.\n * @param {String} params.linkProperty - The link property (e.g., '$source' or '$target').\n * @param {String} params.linkDirection - The link direction (e.g., 'source' or 'target').\n * @param {Map<number, Object>} params.calculations - Map of calculated activities.\n * @param {Object} params.gantt - The Gantt instance.\n * @param {String} params.direction - Calculation direction ('forward' or 'backward').\n * @returns {Object} The calculation result for the parent activity.\n */\nexport function parentWithLinks(params) {\n const {\n parent,\n linkProperty,\n linkDirection,\n calculations,\n gantt,\n direction\n } = params;\n\n const linksArray = parent[linkProperty];\n const parentData = extractParentData(parent);\n\n let calculation = null;\n\n if (direction === 'forward') {\n const linksWithActivityData = getLinksWithActivityDataForward(\n linksArray,\n linkDirection,\n calculations,\n gantt\n );\n\n calculation = new CalculateForwardParentsWithLinks(\n linksWithActivityData,\n parent,\n gantt\n );\n\n calculation = calculation.calculate();\n } else {\n const linksWithActivityData = getLinksWithActivityDataBackward(\n linksArray,\n linkDirection,\n calculations,\n gantt\n );\n\n const backwardCalculation = new CalculateBackwardParentsLinks({\n linksWithActivityData,\n activity: parent,\n parentData,\n gantt\n });\n\n calculation = backwardCalculation.calculate();\n }\n\n return calculation;\n}\n\n/**\n * Extracts necessary data from the parent activity.\n * @param {Object} parent - The parent activity object.\n * @returns {Object} The extracted parent data.\n */\nfunction extractParentData(parent) {\n return {\n duration: parent.duration,\n calendarId: parent.calendar_id\n };\n}\n\n/**\n * Retrieves links with activity data for forward calculation.\n * @param {Array<number>} linksArray - Array of link IDs.\n * @param {String} linkDirection - The link direction ('source' or 'target').\n * @param {Map<number, Object>} calculations - Map of calculated activities.\n * @param {Object} gantt - The Gantt instance.\n * @returns {Array<Object>} Array of linked activity data.\n */\nfunction getLinksWithActivityDataForward(\n linksArray,\n linkDirection,\n calculations,\n gantt\n) {\n if (linksArray.length === 0) {\n return [];\n }\n\n return linksArray\n .map((linkId) => {\n const linkData = gantt.getLink(linkId);\n if (!linkData) {\n console.warn(`Link not found: ${linkId}`);\n return null;\n }\n const linkedActivityId = Number(linkData[linkDirection]);\n const calculationsOfLinkedActivity = calculations.get(linkedActivityId);\n if (!calculationsOfLinkedActivity) {\n console.warn(\n `Calculations not found for activity: ${linkedActivityId}`\n );\n return null;\n }\n return {\n es: calculationsOfLinkedActivity.es,\n ef: calculationsOfLinkedActivity.ef,\n linkLag: linkData.lag,\n linkType: linkData.type\n };\n })\n .filter(Boolean);\n}\n\n/**\n * Retrieves links with activity data for backward calculation.\n * @param {Array<number>} linksArray - Array of link IDs.\n * @param {String} linkDirection - The link direction ('source' or 'target').\n * @param {Map<number, Object>} calculations - Map of calculated activities.\n * @param {Object} gantt - The Gantt instance.\n * @returns {Array<Object>} Array of linked activity data.\n */\nfunction getLinksWithActivityDataBackward(\n linksArray,\n linkDirection,\n calculations,\n gantt\n) {\n if (linksArray.length === 0) {\n return [];\n }\n\n return linksArray\n .map((linkId) => {\n const linkData = gantt.getLink(linkId);\n if (!linkData) {\n console.warn(`Link not found: ${linkId}`);\n return null;\n }\n const linkedActivityId = Number(linkData[linkDirection]);\n const calculationsOfLinkedActivity = calculations.get(linkedActivityId);\n if (!calculationsOfLinkedActivity) {\n return null;\n }\n const linkedTask = gantt.getTask(linkedActivityId);\n if (!linkedTask) {\n return null;\n }\n return {\n ls: calculationsOfLinkedActivity.ls,\n lf: calculationsOfLinkedActivity.lf,\n linkLag: linkData.lag || 0,\n linkType: linkData.type,\n progress: linkedTask.progress,\n type: linkedTask.type\n };\n })\n .filter(Boolean);\n}\n","/**\n * Calculates parent activity with no links.\n * @param {Object} activityData - The parent activity object.\n * @param {Map<number, Object>} calculations - Map of calculated activities.\n * @param {Map<number, Object>} singleParents - Map containing parent activities and their children.\n * @param {string} direction - Calculation direction ('forward' or 'backward').\n * @returns {Object|null} Calculation result for the parent activity, or null if not calculable.\n */\nexport function parentWithNoLinks(params) {\n const { activityData, calculations, singleParents, direction } = params;\n if (hasActivityBeenCalculated(activityData.id, calculations)) return null;\n\n const childrenIds = getChildrenIds(activityData.id, singleParents);\n const childrenCalculations = getCalculatedChildren(childrenIds, calculations);\n\n if (childrenCalculations.length === 0) return null;\n\n const parentCalculation = computeParentCalculation(\n childrenCalculations,\n direction\n );\n\n return parentCalculation;\n}\n\n/**\n * Checks if the activity has already been calculated.\n * @param {number} activityId - The ID of the activity.\n * @param {Map<number, Object>} calculations - Map of calculated activities.\n * @returns {boolean} True if the activity has been calculated, false otherwise.\n */\nfunction hasActivityBeenCalculated(activityId, calculations) {\n return calculations.has(activityId);\n}\n\n/**\n * Retrieves the IDs of the child activities for a given parent activity ID.\n * @param {number} parentId - The ID of the parent activity.\n * @param {Map<number, Object>} singleParents - Map containing parent activities and their children.\n * @returns {Array<number>} Array of child activity IDs.\n */\nfunction getChildrenIds(parentId, singleParents) {\n const parent = singleParents.get(parentId);\n return parent ? parent.childrens : [];\n}\n\n/**\n * Collects calculations of child activities that have been calculated.\n * @param {Array<number>} childrenIds - Array of child activity IDs.\n * @param {Map<number, Object>} calculations - Map of calculated activities.\n * @returns {Array<Object>} Array of child activity calculations.\n */\nfunction getCalculatedChildren(childrenIds, calculations) {\n return childrenIds\n .filter((childId) => calculations.has(childId))\n .map((childId) => calculations.get(childId));\n}\n\n/**\n * Computes the calculation for the parent activity based on its children's calculations.\n * @param {Array<Object>} childrenCalculations - Array of child activity calculations.\n * @param {string} direction - Calculation direction ('forward' or 'backward').\n * @returns {Object} The calculated values for the parent activity.\n */\nfunction computeParentCalculation(childrenCalculations, direction) {\n if (direction === 'forward') {\n const earliestStart = calculateEarliestDate(childrenCalculations, 'es');\n const latestFinish = calculateLatestDate(childrenCalculations, 'ef');\n\n return { es: earliestStart, ef: latestFinish };\n } else {\n const latestStart = calculateEarliestDate(childrenCalculations, 'ls');\n const latestFinish = calculateLatestDate(childrenCalculations, 'lf');\n\n return { ls: latestStart, lf: latestFinish };\n }\n}\n\n/**\n * Calculates the earliest date from an array of calculations based on the specified property.\n * @param {Array<Object>} calculationsArray - Array of calculations.\n * @param {string} property - The property to find the earliest date for.\n * @returns {Date} The earliest date.\n */\nfunction calculateEarliestDate(calculationsArray, property) {\n return calculationsArray.reduce((earliest, current) => {\n return current[property] < earliest[property] ? current : earliest;\n })[property];\n}\n\n/**\n * Calculates the latest date from an array of calculations based on the specified property.\n * @param {Array<Object>} calculationsArray - Array of calculations.\n * @param {string} property - The property to find the latest date for.\n * @returns {Date} The latest date.\n */\nfunction calculateLatestDate(calculationsArray, property) {\n return calculationsArray.reduce((latest, current) => {\n return current[property] > latest[property] ? current : latest;\n })[property];\n}\n","import { parentWithLinks } from './parentWithLinks.js';\nimport { parentWithNoLinks } from './parentWithNoLinks.js';\n\nexport default {\n parentWithLinks,\n parentWithNoLinks\n};\n","import { log } from '../../shims/monitor.js';\nimport calculators from '../calculators/index.js';\nimport { CONSTRAINT_TYPES } from '../../constants/index.js';\n\nclass CalculationOfParent {\n constructor(params) {\n this.activity = params.activity;\n this.direction = params.direction;\n this.linkProperty = params.direction === 'forward' ? '$target' : '$source';\n this.linkDirection = params.direction === 'forward' ? 'source' : 'target';\n this.calculationsOfParentThatImpactChildrens =\n params.calculationsOfParentThatImpactChildrens;\n this.calculations = params.calculations;\n this.calculationOfParentsFromLinks = params.calculationOfParentsFromLinks;\n this.singleParents = params.singleParents;\n this.parentCalculationFromChildren = params.parentCalculationFromChildren;\n this.gantt = params.gantt;\n }\n\n handleParentWithLinks() {\n try {\n const allLinkedTasks = this.getArrayOfIdOfLinkedActivities(\n this.activity[this.linkProperty]\n );\n\n if (this.direction === 'backward') {\n const restrictions = [CONSTRAINT_TYPES.FNLT];\n\n if (this.shouldCalculateParentWithLinksBackward(restrictions)) {\n this.calculateAndStoreParentWithLinks(this.activity);\n return;\n }\n\n if (this.shouldSetDatesToParentsWithLinks(restrictions)) {\n this.setDatesToParentsWithLinksBackward();\n return;\n }\n }\n\n const areAllLinksCalculated = this.areAllLinksCalculated(allLinkedTasks);\n\n if (\n areAllLinksCalculated &&\n this.calculationsOfParentThatImpactChildrens.has(this.activity.id)\n ) {\n if (this.direction === 'forward') {\n this.setDatesToParentsWithLinks();\n }\n if (this.direction === 'backward') {\n this.setDatesToParentsWithLinksBackward();\n }\n return;\n }\n\n this.calculateAndStoreParentWithLinks(this.activity);\n } catch (e) {\n log('Critical Path', 'Error in handleParentWithLinks');\n throw e;\n }\n }\n\n shouldCalculateParentWithLinksBackward(restrictions) {\n const constraintTypeMatches = restrictions.includes(\n this.activity.constraint_type\n );\n const parentNotCalculatedFromLinks =\n !this.calculationOfParentsFromLinks.has(this.activity.id);\n\n return constraintTypeMatches && parentNotCalculatedFromLinks;\n }\n\n calculateAndStoreParentWithLinks(activity) {\n const calculation = calculators.parentWithLinks({\n parent: activity,\n linkProperty: this.linkProperty,\n linkDirection: this.linkDirection,\n gantt: this.gantt,\n calculations: this.calculations,\n direction: this.direction\n });\n\n this.calculationsOfParentThatImpactChildrens.set(activity.id, calculation);\n this.calculationOfParentsFromLinks.add(activity.id);\n }\n\n areAllLinksCalculated(allLinkedTasks) {\n return allLinkedTasks.every((activityId) => {\n return this.calculations.has(activityId);\n });\n }\n\n shouldSetDatesToParentsWithLinks(restrictions) {\n const constraintTypeMatches = restrictions.includes(\n this.activity.constraint_type\n );\n const parentCalculatedFromLinks = this.calculationOfParentsFromLinks.has(\n this.activity.id\n );\n\n return constraintTypeMatches && parentCalculatedFromLinks;\n }\n\n handleParentWithNoLinks() {\n const values = calculators.parentWithNoLinks({\n activityData: this.activity,\n gantt: this.gantt,\n singleParents: this.singleParents,\n calculations: this.calculations,\n direction: this.direction\n });\n\n if (values) {\n this.calculations.set(this.activity.id, values);\n }\n }\n\n setDatesToParentsWithLinks() {\n if (!this.activity) {\n throw new Error('Error trying to get parent', {\n cause: { parentActivity: this.activity }\n });\n }\n let childrens = this.singleParents.get(this.activity.id)?.childrens;\n\n let arrayOfDatesOfAllTheChildrens = Array.from(this.calculations).filter(\n (activity) => {\n return childrens.includes(activity[0]);\n }\n );\n let arrayOfEsAndEf = arrayOfDatesOfAllTheChildrens.map((activity) => {\n return activity[1];\n });\n\n const { minEs, maxEf } = arrayOfEsAndEf.reduce(\n (acc, { es, ef }) => ({\n minEs: new Date(Math.min(acc.minEs.getTime(), new Date(es).getTime())),\n maxEf: new Date(Math.max(acc.maxEf.getTime(), new Date(ef).getTime()))\n }),\n {\n minEs: new Date(arrayOfEsAndEf[0].es),\n maxEf: new Date(arrayOfEsAndEf[0].ef)\n }\n );\n\n this.calculations.set(this.activity.id, {\n es: minEs,\n ef: maxEf\n });\n this.parentCalculationFromChildren.add(this.activity.id);\n }\n\n setDatesToParentsWithLinksBackward() {\n if (!this.activity) {\n throw new Error('Error trying to get parent', {\n cause: { parentActivity: this.activity }\n });\n }\n let childrens = this.singleParents.get(this.activity.id)?.childrens;\n\n let arrayOfDatesOfAllTheChildrens = Array.from(this.calculations).filter(\n (activity) => {\n return childrens.includes(activity[0]);\n }\n );\n\n let arrayOfEsAndEf = arrayOfDatesOfAllTheChildrens.map((activity) => {\n return activity[1];\n });\n\n const { minLs, maxLf } = arrayOfEsAndEf.reduce(\n (acc, { ls, lf }) => ({\n minLs: new Date(Math.min(acc.minLs.getTime(), new Date(ls).getTime())),\n maxLf: new Date(Math.max(acc.maxLf.getTime(), new Date(lf).getTime()))\n }),\n {\n minLs: new Date(arrayOfEsAndEf[0].ls),\n maxLf: new Date(arrayOfEsAndEf[0].lf)\n }\n );\n\n this.calculations.set(this.activity.id, {\n ls: minLs,\n lf: maxLf\n });\n }\n\n getArrayOfIdOfLinkedActivities(links, direction = false) {\n return links.map((link) => {\n const linkData = this.gantt.getLink(link);\n const linkedActivity =\n linkData[direction ? direction : this.linkDirection];\n return Number(linkedActivity);\n });\n }\n}\n\nexport default CalculationOfParent;\n","import filters from '../../helpers/filters.js';\nimport { log } from '../../shims/monitor.js';\n\nclass ThirdLevelActivityIdentifier {\n /**\n * Constructs the ThirdLevelActivityIdentifier class.\n * @param {Object} params - The parameters object.\n * @param {Object} params.gantt - The Gantt chart instance.\n * @param {Object} params.filters - Filters for tasks.\n * @param {string} params.linkProperty - The property name for links.\n */\n constructor({ gantt, linkProperty }) {\n this.gantt = gantt;\n this.linkProperty = linkProperty;\n this.structureOfParents = new Map();\n this.singleParents = new Map();\n }\n\n /**\n * Identifies third-level activities and populates the structureOfParents map.\n */\n identifyThirdLevelActivities() {\n try {\n const parents = this.getFirstLevelParents();\n\n for (const parent of parents) {\n const processPayload = this.processEachActivity(parent);\n\n const { activitiesByLevel } = processPayload;\n\n const allLevels = this.getAllLevels(activitiesByLevel);\n const deepestLevel = this.getDeepestLevel(allLevels);\n\n const result = this.createResult(\n parent,\n processPayload,\n deepestLevel,\n allLevels\n );\n\n this.structureOfParents.set(parent.id, result);\n }\n\n return {\n structureOfParents: this.structureOfParents,\n singleParents: this.singleParents\n };\n } catch (e) {\n log('Critical Path', 'Error in ThirdLevelActivityIdentifier');\n throw e;\n }\n }\n\n /**\n * Retrieves the first-level parent tasks.\n * @returns {Array<Object>} Array of parent tasks.\n */\n getFirstLevelParents() {\n return this.gantt\n .getTaskByTime()\n .filter(filters.byFirstLevel)\n .filter(filters.filterByParentType);\n }\n\n /**\n * Processes each activity under a parent task.\n * @param {Object} parentActivity - The parent activity to process.\n * @returns {Object} Processed data including parentsIds, allTasks, activitiesByLevel.\n */\n processEachActivity(parentActivity) {\n const parentsIds = new Set();\n const allTasks = new Set();\n const activitiesByLevel = new Map();\n\n this.initializeParent(parentActivity);\n\n this.gantt.eachTask((activity) => {\n this.processActivity(activity, parentsIds, allTasks, activitiesByLevel);\n }, parentActivity.id);\n\n return {\n parentsIds,\n allTasks,\n activitiesByLevel\n };\n }\n\n /**\n * Initializes the parent activity in singleParents map.\n * @param {Object} parentActivity - The parent activity.\n */\n initializeParent(parentActivity) {\n const parentId = Number(parentActivity.id);\n const hasLink = Boolean(parentActivity[this.linkProperty]?.length);\n const level = parentActivity['$level'];\n\n this.singleParents.set(parentId, {\n level,\n hasLink,\n childrens: []\n });\n }\n\n /**\n * Processes a single activity.\n * @param {Object} activity - The activity to process.\n * @param {Set<number>} parentsIds - Set of parent IDs.\n * @param {Set<number>} allTasks - Set of all task IDs.\n * @param {Map<number, Map<number, Array<Object>>>} activitiesByLevel - Activities grouped by level.\n */\n processActivity(activity, parentsIds, allTasks, activitiesByLevel) {\n const activityId = Number(activity.id);\n const parentId = Number(activity.parent);\n allTasks.add(activityId);\n\n const isProjectActivity = this.isProjectActivity(activity);\n\n if (isProjectActivity) {\n this.addParentInfo(activity, parentsIds);\n }\n\n const parentExists = this.doesParentExist(parentId);\n if (parentId != null && parentExists) {\n this.addChildToParent(parentId, activityId);\n }\n\n this.addActivityToLevel(activity, activitiesByLevel);\n }\n\n /**\n * Checks if an activity is a project (parent activity).\n * @param {Object} activity - The activity to check.\n * @returns {boolean} True if the activity is a project.\n */\n isProjectActivity(activity) {\n return activity.type === 'project';\n }\n\n /**\n * Checks if an activity has a link.\n * @param {Object} activity - The activity to check.\n * @returns {boolean} True if the activity has a link.\n */\n hasLink(activity) {\n return Boolean(activity[this.linkProperty]?.length);\n }\n\n /**\n * Adds parent information to singleParents map.\n * @param {Object} activity - The parent activity.\n * @param {Set<number>} parentsIds - Set of parent IDs.\n */\n addParentInfo(activity, parentsIds) {\n const parentId = Number(activity.id);\n const level = activity['$level'];\n const hasLink = this.hasLink(activity);\n\n const parentInfo = {\n level,\n hasLink,\n childrens: []\n };\n\n parentsIds.add(parentId);\n this.singleParents.set(parentId, parentInfo);\n }\n\n /**\n * Checks if a parent exists in singleParents map.\n * @param {number} parentId - The parent ID to check.\n * @returns {boolean} True if the parent exists.\n */\n doesParentExist(parentId) {\n return this.singleParents.has(parentId);\n }\n\n /**\n * Adds a child activity to its parent in singleParents map.\n * @param {number} parentId - The parent ID.\n * @param {number} activityId - The child activity ID.\n */\n addChildToParent(parentId, activityId) {\n this.singleParents.get(parentId).childrens.push(activityId);\n }\n\n /**\n * Adds an activity to the activitiesByLevel map.\n * @param {Object} activity - The activity to add.\n * @param {Map<number, Map<number, Array<Object>>>} activitiesByLevel - Activities grouped by level.\n */\n addActivityToLevel(activity, activitiesByLevel) {\n const levelKey = activity['$level'];\n const parentKey = Number(activity.parent);\n\n if (!activitiesByLevel.has(levelKey)) {\n activitiesByLevel.set(levelKey, new Map());\n }\n\n const levelMap = activitiesByLevel.get(levelKey);\n\n if (!levelMap.has(parentKey)) {\n levelMap.set(parentKey, []);\n }\n\n levelMap.get(parentKey).push({\n id: Number(activity.id),\n isParent: this.isProjectActivity(activity),\n calculated: false\n });\n }\n\n /**\n * Retrieves all levels from activitiesByLevel map.\n * @param {Map<number, Map<number, Array<Object>>>} activitiesByLevel - Activities grouped by level.\n * @returns {Set<number>} Set of all levels.\n */\n getAllLevels(activitiesByLevel) {\n return new Set(activitiesByLevel.keys());\n }\n\n /**\n * Determines the deepest level from a set of levels.\n * @param {Set<number>} allLevels - Set of all levels.\n * @returns {number} The deepest level.\n */\n getDeepestLevel(allLevels) {\n if (allLevels.size === 0) {\n return 0;\n }\n return Math.max(...allLevels);\n }\n\n /**\n * Creates the result object for a parent activity.\n * @param {Object} parent - The parent activity.\n * @param {Object} processPayload - The processed data.\n * @param {number} deepestLevel - The deepest level found.\n * @param {Set<number>} allLevels - Set of all levels.\n * @returns {Object} The result object.\n */\n createResult(parent, processPayload, deepestLevel, allLevels) {\n const { activitiesByLevel, parentsIds, allTasks } = processPayload;\n\n return {\n parent: parent.id,\n isALinkedParent: this.hasLink(parent),\n levels: allLevels,\n allParentChildrens: parentsIds,\n allChildrens: allTasks,\n childrensByLevel: activitiesByLevel,\n currentResolutionLevel: deepestLevel,\n canBeCalculated: false\n };\n }\n}\n\nexport default ThirdLevelActivityIdentifier;\n","import moment from '../shims/moment.js';\nimport { log } from '../shims/monitor.js';\nimport { addDurationToDate, filters } from '../helpers/index.js';\nimport { CONSTRAINT_TYPES } from '../constants/index.js';\nimport identifiers from './identifiers/index.js';\nimport CalculationOfParent from './calculation-of-parent/index.js';\nimport ThirdLevelActivityIdentifier from './third-level-activities/index.js';\n\nclass CriticalPathHelpers {\n constructor(ganttInstace, direction) {\n this.direction = direction;\n this.gantt = ganttInstace;\n this.linkProperty = this.direction === 'forward' ? '$target' : '$source';\n this.linkDirection = this.direction === 'forward' ? 'source' : 'target';\n this.projectDates = ganttInstace.getSubtaskDates();\n }\n\n tryToCalculateLastLevelChildrens() {\n this.structureOfParents.forEach((firstLevelParent) => {\n const { currentResolutionLevel, childrensByLevel, isALinkedParent } =\n firstLevelParent;\n if (isALinkedParent) return;\n const innerParents = childrensByLevel.get(currentResolutionLevel);\n\n for (let [parentId, childrens] of innerParents) {\n const childrensNotCalculated = childrens.filter((child) => {\n return !this.calculations.has(child.id);\n });\n\n if (childrensNotCalculated.length === 0) {\n let parent = this.gantt.getTask(parentId);\n this.calculateParentWithNoLinks(parent, childrens);\n return;\n }\n }\n });\n }\n\n initActivitiesWaitingForCalculation() {\n try {\n this.gantt\n .getTaskByTime()\n .filter(filters.avoidSubproject)\n .forEach((activity) => {\n this.activitiesWaitingForCalculation.add(activity.id);\n });\n } catch (e) {\n log('Critical Path', 'Cant init activities for calculation');\n throw e;\n }\n }\n\n identifyParentsWithAndWithoutLinks() {\n try {\n const {\n parentsWithFullProgress,\n pendingParentsWithNoLinks,\n pendingParentsWithLinks\n } = identifiers.identifyParentsWithAndWithoutLinks({\n gantt: this.gantt,\n direction: this.direction,\n linkProperty: this.linkProperty\n });\n\n this.parentsWithFullProgress = parentsWithFullProgress;\n this.pendingParentsWithNoLinks = pendingParentsWithNoLinks;\n this.pendingParentsWithLinks = pendingParentsWithLinks;\n } catch (e) {\n log('Critical Path', 'Cant identify parents');\n throw e;\n }\n }\n\n identifyForbiddenActivitiesLinkedToParentsWithLinks() {\n try {\n this.forbiddenActivitiesLinkedToParentsWithLinks =\n identifiers.identifyForbiddenActivities({\n pendingParentsWithLinks: this.pendingParentsWithLinks,\n gantt: this.gantt,\n direction: this.direction\n });\n } catch (e) {\n log('Critical Path', 'Cant identify activities linked to parent');\n throw e;\n }\n }\n\n getArrayOfIdOfLinkedActivities(links, direction = false) {\n return links.map((link) => {\n const linkData = this.gantt.getLink(link);\n const linkedActivity =\n linkData[direction ? direction : this.linkDirection];\n return Number(linkedActivity);\n });\n }\n\n async identifyThirdLevelActivities() {\n try {\n const { structureOfParents, singleParents } =\n new ThirdLevelActivityIdentifier({\n gantt: this.gantt,\n linkProperty: this.linkProperty\n }).identifyThirdLevelActivities();\n\n this.structureOfParents = structureOfParents;\n this.singleParents = singleParents;\n } catch (e) {\n log('Critical Path', 'Cant identify third level activities');\n throw e;\n }\n }\n\n processEachActivity(parentActivity) {\n let parentsIds = new Set();\n let allTasks = new Set();\n let activitiesByLevel = new Map();\n let singleParents = new Map();\n\n this.singleParents.set(Number(parentActivity.id), {\n level: parentActivity['$level'],\n hasLink: Boolean(parentActivity[this.linkProperty].length),\n childrens: []\n });\n\n return new Promise((resolve, reject) => {\n this.gantt.eachTask(\n function (activity) {\n const parentId = Number(activity.parent);\n allTasks.add(activity.id);\n\n if (activity.type === 'project') {\n const parentInfo = {\n level: activity['$level'],\n hasLink: Boolean(activity[this.linkProperty].length),\n childrens: []\n };\n parentsIds.add(activity.id);\n this.singleParents.set(Number(activity.id), parentInfo);\n }\n\n if (parentId && this.singleParents.has(parentId)) {\n this.singleParents.get(parentId).childrens.push(activity.id);\n }\n\n if (!activitiesByLevel.has(activity['$level'])) {\n activitiesByLevel.set(activity['$level'], new Map());\n }\n\n const level = activitiesByLevel.get(activity['$level']);\n\n if (!level.has(Number(activity.parent))) {\n level.set(Number(activity.parent), []);\n }\n\n level.get(Number(activity.parent)).push({\n id: activity.id,\n isParent: activity.type === 'project',\n calculated: false\n });\n }.bind(this),\n parentActivity.id\n );\n resolve({\n parentsIds,\n allTasks,\n activitiesByLevel,\n singleParents\n });\n });\n }\n\n identifySecondLevelActivities() {\n try {\n const secondLevelActivitiesSet =\n identifiers.identifySecondLevelActivities({\n gantt: this.gantt,\n pendingParentsWithNoLinks: this.pendingParentsWithNoLinks,\n calculations: this.calculations,\n linkProperty: this.linkProperty\n });\n\n this.secondLevelActivities = new Set([\n ...this.secondLevelActivities,\n ...secondLevelActivitiesSet\n ]);\n } catch (e) {\n log('Critical Path', 'Cant identify second level activities');\n throw e;\n }\n }\n\n /**\n * Identifies and sets the initial activities for the chain based on the specified direction.\n *\n * This function determines the starting activities of a chain by filtering activities from\n * the Gantt chart. The filtering is based on the specified direction (`forward` or `backward`).\n * - For `forward` direction, activities with an empty `$target` property are selected.\n * - For `backward` direction, activities with an empty `$source` property are selected.\n *\n * The function excludes activities of type `project` from the results.\n * The resulting activity IDs are stored in the `chainStartActivities` property.\n *\n * If an error occurs during the process, `chainStartActivities` is set to an empty array,\n * and the error is rethrown.\n *\n * @throws {Error} If an error occurs during the identification process.\n */\n identifyInitialActivities() {\n try {\n const {\n chainStartActivities,\n activitiesStartChainButChildrenOfLinkedParents\n } = identifiers.identifyInitialActivities({\n gantt: this.gantt,\n linkProperty: this.linkProperty,\n direction: this.direction\n });\n\n this.chainStartActivities = chainStartActivities;\n\n if (activitiesStartChainButChildrenOfLinkedParents) {\n this.activitiesStartChainButChildrenOfLinkedParents =\n activitiesStartChainButChildrenOfLinkedParents;\n }\n } catch (e) {\n log('Critical Path', 'Cant find initial activities');\n throw new Error('Error in identifyInitialActivities', { cause: e });\n }\n }\n\n calculateSecondLevelActivities() {\n try {\n if (this.direction === 'forward') {\n this.recursiveCalculateEfAndEs(\n Array.from(this.secondLevelActivities),\n 0,\n 'secondLevel'\n );\n } else {\n this.recursiveCalculateLfAndLs(Array.from(this.secondLevelActivities));\n }\n } catch (e) {\n log('Critical Path', 'Cant calculate second level activities');\n throw e;\n }\n }\n\n calculateStartAndFinishOfActivitiesThatStartChain() {\n try {\n this.chainStartActivities.forEach((activity) => {\n if (!activity) return;\n if (activity.progress > 100) return;\n if (activity.type === 'project') return;\n\n const dates = this.calculateStartAndFinishOfChainOrigin(\n activity,\n this.direction\n );\n\n if (this.direction === 'forward') {\n let { es, ef } = dates;\n this.calculations.set(activity.id, { es, ef, text: activity.text });\n this.activitiesWaitingForCalculation.delete(activity.id);\n } else {\n let { ls, lf } = dates;\n this.calculations.set(activity.id, { ls, lf, text: activity.text });\n this.activitiesWaitingForCalculation.delete(activity.id);\n }\n });\n } catch (e) {\n log('Critical Path', 'Cant calculate activities that init chain');\n throw e;\n }\n }\n\n buildDependencyGraph(activitiesToBuild) {\n const graph = new Map();\n const calculatedActivities = new Set(this.calculations.keys());\n const activityMap = new Map();\n activitiesToBuild.forEach((activity) => {\n if (activity) {\n activityMap.set(activity.id, activity);\n }\n });\n\n activityMap.forEach((activity, activityId) => {\n if (calculatedActivities.has(activityId)) return;\n let dependencies = [];\n const linkIds = activity[this.linkDirection] || [];\n linkIds.forEach((linkId) => {\n const link = this.gantt.getLink(linkId);\n if (link) {\n const dependencyId = Number(link[this.linkProperty]);\n dependencies.push(dependencyId);\n }\n });\n dependencies = dependencies.filter(\n (depId) => activityMap.has(depId) || calculatedActivities.has(depId)\n );\n\n graph.set(activityId, dependencies);\n });\n\n return { graph, activityMap, calculatedActivities };\n }\n\n topologicalSort(graph, calculatedActivities) {\n const visited = new Set();\n const tempMarks = new Set();\n const sorted = [];\n\n const visit = (nodeId) => {\n if (tempMarks.has(nodeId)) {\n throw new Error('Cyclical dependency detected', { cause: { nodeId } });\n }\n\n if (!visited.has(nodeId) && !calculatedActivities.has(nodeId)) {\n tempMarks.add(nodeId);\n\n const dependencies = graph.get(nodeId) || [];\n for (const depId of dependencies) {\n visit(depId);\n }\n\n tempMarks.delete(nodeId);\n visited.add(nodeId);\n sorted.push(nodeId);\n }\n };\n\n for (const nodeId of graph.keys()) {\n if (!visited.has(nodeId) && !calculatedActivities.has(nodeId)) {\n visit(nodeId);\n }\n }\n\n return sorted.reverse();\n }\n\n /**\n * Calculates the start and finish dates for the origin of a chain activity.\n *\n * This function calculates the start and finish dates for an activity based on the provided direction\n * (`forward` or `backward`). For forward direction, it calculates the earliest start (ES) and earliest\n * finish (EF). For backward direction, it calculates the latest start (LS) and latest finish (LF),\n * handling different progress states (0%, 100%, and between 0% and 100%).\n *\n * @param {Object} [activityFromLink=null] - The activity object to calculate dates for.\n * @param {string} [customDirection=null] - The direction for the calculation (`forward` or `backward`).\n * @returns {Object} An object containing the calculated dates (ES, EF, LS, LF) based on the direction and progress.\n *\n * @example\n * // Assuming activity is an object with start_date, end_date, progress, and calendar_id properties\n * // and direction is 'forward'\n * const dates = calculateStartAndFinishOfChainOrigin(activity, 'forward');\n * console.log()\n // { es: activity.start_date, ef: activity.end_date }\n *\n * @throws {Error} If the activity's calendar cannot be retrieved or other errors occur during calculation.\n */\n calculateStartAndFinishOfChainOrigin(\n activityFromLink = null,\n customDirection = null\n ) {\n try {\n let activity = activityFromLink;\n let progress = Number(activity.progress);\n if (progress === '0.00') {\n progress = 0;\n }\n let activityCalendar = this.gantt.getCalendar(activity.calendar_id);\n if (!activityCalendar) {\n throw new Error(\n `Error trying to get calendar with id: ${activity.calendar_id}`\n );\n }\n let direction = customDirection || this.direction;\n\n if (direction === 'forward') {\n let es = activity.start_date;\n let ef = activity.end_date;\n return {\n es,\n ef\n };\n } else {\n if (progress >= 100) {\n return {\n ls: moment(activity.start_date).clone(),\n lf: moment(activity.end_date).clone()\n };\n }\n\n if (progress === 0) {\n return this.calculateBackwardWhenZeroProgress(\n activity,\n activityCalendar\n );\n }\n\n if (progress < 100 && progress > 0) {\n return this.calculateWhenProgressIsBetweenZeroAndOneHundred(\n activity,\n activityCalendar\n );\n }\n }\n } catch (e) {\n throw e;\n }\n }\n /**\n * Calculates the latest start (LS) and latest finish (LF) dates for an activity with zero progress.\n *\n * This function determines the LS and LF dates based on the activity's constraint type and duration,\n * using the provided calendar. It handles different types of constraints, adjusting the start and finish\n * dates accordingly.\n *\n * @param {Object} activity - The activity object to calculate dates for, which should include start_date, end_date, duration, and constraint_type.\n * @param {Object} calendar - The calendar object used to adjust dates based on working days and hours.\n * @returns {Object} An object containing the calculated latest start (LS) and latest finish (LF) dates.\n *\n * @example\n * // Assuming activity is an object with the required properties and a calendar object is provided\n * const dates = calculateBackwardWhenZeroProgress(activity, calendar);\n * console.log()\n // { ls: moment(...), lf: moment(...) }\n *\n * @throws {Error} If an error occurs during the calculation.\n */\n calculateBackwardWhenZeroProgress(activity, calendar) {\n let lateStart = moment(activity.start_date).clone();\n let lateFinish = moment(activity.end_date).clone();\n let duration = activity.duration;\n let endDateProjectConstraints = [\n CONSTRAINT_TYPES.ASAP,\n CONSTRAINT_TYPES.ALAP,\n CONSTRAINT_TYPES.SNET,\n CONSTRAINT_TYPES.FNET\n ];\n let constraint = activity.constraint_type || CONSTRAINT_TYPES.ASAP;\n\n if (endDateProjectConstraints.includes(constraint)) {\n lateFinish = this.projectDates.end_date;\n lateStart = addDurationToDate(calendar, lateFinish, -duration, activity);\n } else {\n let plusDuration = [CONSTRAINT_TYPES.SNLT, CONSTRAINT_TYPES.MSO];\n let minusDuration = [CONSTRAINT_TYPES.FNLT, CONSTRAINT_TYPES.MFO];\n if (plusDuration.includes(constraint)) {\n lateStart = activity.constraint_date;\n lateFinish = addDurationToDate(calendar, lateStart, duration, activity);\n }\n\n if (minusDuration.includes(constraint)) {\n lateFinish = activity.constraint_date;\n lateStart = addDurationToDate(\n calendar,\n lateFinish,\n -duration,\n activity\n );\n }\n }\n\n return {\n ls: lateStart,\n lf: lateFinish\n };\n }\n /**\n * Calculates the latest start (LS) and latest finish (LF) dates for an activity with progress between 0% and 100%.\n *\n * This function determines the LS and LF dates based on the activity's constraint type and progress,\n * considering the end date of the project and various constraints.\n *\n * @param {Object} activity - The activity object to calculate dates for, which should include start_date, end_date, and constraint_type.\n * @returns {Object} An object containing the calculated latest start (LS) and latest finish (LF) dates.\n *\n * @example\n * // Assuming activity is an object with the required properties\n * const dates = calculateWhenProgressIsBetweenZeroAndOneHundred(activity);\n * console.log()\n // { ls: activity.start_date, lf: calculatedLateFinish }\n *\n * @throws {Error} If an error occurs during the calculation.\n */\n calculateWhenProgressIsBetweenZeroAndOneHundred(activity) {\n let lateStart = activity.start_date;\n let lateFinish = null;\n let constraint = activity.constraint_type || CONSTRAINT_TYPES.ASAP;\n let endDateOfTheProject = this.projectDates.end_date;\n let endDateActivityConstraints = [\n CONSTRAINT_TYPES.ASAP,\n CONSTRAINT_TYPES.ALAP,\n CONSTRAINT_TYPES.SNET,\n CONSTRAINT_TYPES.FNET\n ];\n let endDateActivityWithLagConstraints = [\n CONSTRAINT_TYPES.SNLT,\n CONSTRAINT_TYPES.FNLT\n ];\n\n if (endDateActivityConstraints.includes(constraint)) {\n lateFinish = Math.max(activity.end_date, endDateOfTheProject);\n } else if (constraint === CONSTRAINT_TYPES.MSO) {\n lateFinish = activity.end_date;\n } else if (\n constraint === CONSTRAINT_TYPES.MFO ||\n endDateActivityWithLagConstraints.includes(constraint)\n ) {\n const minDateBetween = Math.min(\n endDateOfTheProject,\n activity.constraint_date\n );\n\n lateFinish = Math.max(minDateBetween, activity.end_date);\n }\n\n return {\n ls: lateStart,\n lf: new Date(lateFinish)\n };\n }\n\n initializeActivitiesWithFullProgress() {\n try {\n const activitiesWithFullProgress = Array.from(\n this.activitiesWaitingForCalculation\n ).filter((activity) => {\n return Number(this.gantt.getTask(activity).progress) === 100;\n });\n const arrayOfActivitiesObject = activitiesWithFullProgress.map(\n (activity) => {\n return this.gantt.getTask(activity);\n }\n );\n arrayOfActivitiesObject.forEach((activity) => {\n const isAParent = activity.type === 'project';\n this.setDatesForActivityWithFullProgress(activity);\n this.activitiesWaitingForCalculation.delete(activity.id);\n if (isAParent && this.pendingParentsWithLinks.has(activity.id)) {\n this.parentCalculationFromChildren.add(activity.id);\n this.calculationsOfParentThatImpactChildrens.set(activity.id, {\n [this.direction === 'forward' ? 'es' : 'ls']: activity.start_date,\n [this.direction === 'forward' ? 'ef' : 'lf']: activity.end_date\n });\n this.calculationOfParentsFromLinks.add(activity.id);\n }\n });\n } catch (e) {\n log('Critical Path', 'Cant initialize activities with full progress');\n throw e;\n }\n }\n\n // Main function\n doCalculationForParentType(activity) {\n const calculationOfParent = new CalculationOfParent({\n activity: activity,\n direction: this.direction,\n calculationsOfParentThatImpactChildrens:\n this.calculationsOfParentThatImpactChildrens,\n calculations: this.calculations,\n calculationOfParentsFromLinks: this.calculationOfParentsFromLinks,\n singleParents: this.singleParents,\n parentCalculationFromChildren: this.parentCalculationFromChildren,\n gantt: this.gantt\n });\n if (this.pendingParentsWithLinks.has(activity.id)) {\n calculationOfParent.handleParentWithLinks();\n } else {\n calculationOfParent.handleParentWithNoLinks();\n }\n }\n}\n\nexport default CriticalPathHelpers;\n","import { addDurationToDate } from '../../helpers/index.js';\nimport { CONSTRAINT_TYPES } from '../../constants/index.js';\n/**\n * Calculates the restriction dates based on the activity constraint type.\n * @param {Object} activity - The activity object containing constraint date and duration.\n * @param {string} constraint - The type of constraint (e.g., 'snet', 'snlt', 'fnlt', 'fnet', 'mso', 'mfo').\n * @param {Object} activityCalendar - The calendar object associated with the activity.\n * @returns {Object} - An object containing the calculated early start (es) and early finish (ef) dates.\n */\nfunction calculateRestriction(activity, constraint, activityCalendar) {\n const restriction = { es: null, ef: null };\n\n if (!activity) return restriction;\n\n if ([CONSTRAINT_TYPES.SNET, CONSTRAINT_TYPES.SNLT].includes(constraint)) {\n const constraintDate = new Date(activity.constraint_date);\n restriction.es = constraintDate;\n restriction.ef = addDurationToDate(\n activityCalendar,\n constraintDate,\n activity.duration,\n activity\n );\n } else if (\n [CONSTRAINT_TYPES.FNLT, CONSTRAINT_TYPES.FNET].includes(constraint)\n ) {\n const constraintDate = new Date(activity.constraint_date);\n\n restriction.es = addDurationToDate(\n activityCalendar,\n constraintDate,\n -activity.duration,\n activity\n );\n\n restriction.ef = constraintDate;\n } else if (constraint === CONSTRAINT_TYPES.MSO) {\n const constraintDate = new Date(activity.constraint_date);\n restriction.es = constraintDate;\n restriction.ef = addDurationToDate(\n activityCalendar,\n constraintDate,\n activity.duration,\n activity\n );\n } else if (constraint === CONSTRAINT_TYPES.MFO) {\n const constraintDate = new Date(activity.constraint_date);\n restriction.es = addDurationToDate(\n activityCalendar,\n constraintDate,\n -activity.duration,\n activity\n );\n restriction.ef = constraintDate;\n }\n\n return restriction;\n}\n\nexport default calculateRestriction;\n","import { addDurationToDate, getNextWorkingHour } from '../../helpers/index.js';\nimport { LINK_TYPES } from '../../constants/index.js';\n\nclass LinksRulesCalculationsMethods {\n constructor(calculationObject) {\n this.referenceActivity = calculationObject.activity;\n this.activityToCalculate = null;\n this.links = calculationObject.links;\n this.calculatedActivities = calculationObject.calculatedActivitiesMap;\n this.alapMap = calculationObject.calculatedAlapsMap;\n this.parentsWithLinks = calculationObject.parentsWithLinks;\n this.parentsCalculations = calculationObject.parentsCalculations;\n this.gantt = calculationObject.ganttInstance;\n }\n /**\n * Retrieves the earliest start (ES) and earliest finish (EF) dates for a given activity from previously calculated activities.\n *\n * This function checks if the activity exists in the `alapMap`. If it does, it returns the data from `alapMap`.\n * If the activity is not found in `alapMap`, it retrieves and returns the data from `calculatedActivities`.\n *\n * @param {string|number} activity - The ID of the activity for which to retrieve ES and EF dates.\n * @returns {Object|null} The ES and EF dates for the activity, or null if not found.\n *\n * @example\n * // Assuming alapMap and calculatedActivities are Maps with activity data\n * const esEf = getEsAndEfFromPreviousCalculatedActivities(1);\n // { es: ..., ef: ..., text: ... } or null\n *\n * @throws {Error} If an error occurs during the retrieval process.\n */\n getEsAndEfFromPreviousCalculatedActivities(activity) {\n const isAlap = this.alapMap.has(activity);\n\n if (isAlap) {\n return this.alapMap.get(Number(activity));\n }\n\n return this.calculatedActivities.get(Number(activity));\n }\n /**\n * Calculates the earliest start (ES) and earliest finish (EF) times for a successor activity.\n *\n * This function calculates the ES and EF times for a successor activity based on the provided predecessor time,\n * data calculations for ES and EF, lag time, and the type of link restriction. It adjusts the dates according\n * to the activity's calendar and the specified restrictions.\n *\n * @param {Date} predecessorTime - The time of the predecessor activity.\n * @param {number} esDataCalculation - The amount of time to add to the predecessor time to calculate the earliest start.\n * @param {number} [efDataCalculation=0] - The amount of time to add to calculate the earliest finish.\n * @param {number} lag - The lag time between the predecessor and successor activities.\n * @param {string} [restrictionOfLink='fs'] - The type of link restriction between the activities.\n * @returns {Object} An object containing the calculated earliest start (ES) and earliest finish (EF) times.\n * @property {Date} es - The earliest start time.\n * @property {Date} ef - The earliest finish time.\n *\n * @example\n * // Assuming predecessorTime is a Date object, esDataCalculation is 5, efDataCalculation is 10, lag is 2, and restrictionOfLink is 'fs'\n * const result = calculateSucessorTimes(new Date(), 5, 10, 2, 'fs');\n // { es: Date, ef: Date }\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n calculateSucessorTimes(\n predecessorTime,\n esDataCalculation,\n efDataCalculation = 0,\n lag,\n restrictionOfLink = LINK_TYPES.FS\n ) {\n const activityCalendar = this.gantt.getCalendar(\n this.referenceActivity.calendar_id\n );\n if (!activityCalendar) {\n throw new Error(\n `Error trying to get calendar with id: ${this.referenceActivity.calendar_id}`\n );\n }\n let dateBaseToCalculate = predecessorTime;\n let es = null;\n let ef = null;\n const isAMilestone = this.referenceActivity.type === 'milestone';\n\n if (!isAMilestone) {\n if (restrictionOfLink === LINK_TYPES.FS && lag === 0) {\n dateBaseToCalculate = getNextWorkingHour({\n dateBaseToCalculate,\n activityCalendar,\n direction: 'future',\n activity: this.referenceActivity\n });\n } else {\n dateBaseToCalculate = this.mutateTheDateToFutureOrPastInBaseRestriction(\n predecessorTime,\n restrictionOfLink,\n activityCalendar\n );\n }\n }\n\n if ([LINK_TYPES.FF, LINK_TYPES.SF].includes(restrictionOfLink)) {\n ef = addDurationToDate(\n activityCalendar,\n dateBaseToCalculate,\n efDataCalculation,\n this.referenceActivity\n );\n\n es = addDurationToDate(\n activityCalendar,\n ef,\n esDataCalculation,\n this.referenceActivity\n );\n\n if (!isAMilestone && lag > 0) {\n es = this.mutateTheDateToFutureOrPastInBaseRestriction(\n es,\n restrictionOfLink,\n activityCalendar\n );\n }\n } else {\n es = addDurationToDate(\n activityCalendar,\n dateBaseToCalculate,\n esDataCalculation,\n this.referenceActivity\n );\n\n if (!isAMilestone && lag > 0) {\n es = this.mutateTheDateToFutureOrPastInBaseRestriction(\n es,\n restrictionOfLink,\n activityCalendar\n );\n }\n\n ef = addDurationToDate(\n activityCalendar,\n es,\n efDataCalculation,\n this.referenceActivity\n );\n }\n\n return { es, ef };\n }\n /**\n * Calculates the earliest start (ES) and earliest finish (EF) times for a Start-to-Start (SS) relationship.\n *\n * This function calculates the ES and EF times for a successor activity based on a Start-to-Start (SS) relationship\n * with the predecessor activity. It uses the predecessor's ES time and adjusts it based on the link's lag and the\n * activity's duration.\n *\n * @param {Object} link - The link object representing the relationship between the predecessor and successor activities.\n * @param {number} link.source - The ID of the predecessor activity.\n * @param {number} [link.lag=0] - The lag time between the predecessor and successor activities.\n * @returns {Object} An object containing the calculated earliest start (ES) and earliest finish (EF) times.\n * @property {Date} es - The earliest start time.\n * @property {Date} ef - The earliest finish time.\n *\n * @example\n * // Assuming link is an object with a source property (predecessor ID) and an optional lag property\n * const result = calculateSS({ source: 1, lag: 2 });\n // { es: Date, ef: Date }\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n calculateSS(link) {\n const predecessorCalculatedEsAndEf =\n this.getEsAndEfFromPreviousCalculatedActivities(Number(link.source));\n const esDataCalculation = link.lag || 0;\n const duration = this.referenceActivity.duration;\n const efDataCalculation = duration;\n const lag = link.lag || 0;\n\n return this.calculateSucessorTimes(\n predecessorCalculatedEsAndEf.es,\n esDataCalculation,\n efDataCalculation,\n lag,\n LINK_TYPES.SS\n );\n }\n /**\n * Calculates the earliest start (ES) and earliest finish (EF) times for a Finish-to-Finish (FF) relationship.\n *\n * This function calculates the ES and EF times for a successor activity based on a Finish-to-Finish (FF) relationship\n * with the predecessor activity. It uses the predecessor's EF time and adjusts it based on the link's lag and the\n * activity's duration.\n *\n * @param {Object} link - The link object representing the relationship between the predecessor and successor activities.\n * @param {number} link.source - The ID of the predecessor activity.\n * @param {number} [link.lag=0] - The lag time between the predecessor and successor activities.\n * @returns {Object} An object containing the calculated earliest start (ES) and earliest finish (EF) times.\n * @property {Date} es - The earliest start time.\n * @property {Date} ef - The earliest finish time.\n *\n * @example\n * // Assuming link is an object with a source property (predecessor ID) and an optional lag property\n * const result = calculateFF({ source: 1, lag: 2 });\n // { es: Date, ef: Date }\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n calculateFF(link) {\n const predecessorCalculatedEsAndEf =\n this.getEsAndEfFromPreviousCalculatedActivities(Number(link.source));\n\n const duration = this.referenceActivity.duration;\n const esDataCalculation = -duration;\n const efDataCalculation = link.lag || 0;\n const lag = link.lag || 0;\n\n return this.calculateSucessorTimes(\n predecessorCalculatedEsAndEf.ef,\n esDataCalculation,\n efDataCalculation,\n lag,\n LINK_TYPES.FF\n );\n }\n /**\n * Calculates the earliest start (ES) and earliest finish (EF) times for a Finish-to-Start (FS) relationship.\n *\n * This function calculates the ES and EF times for a successor activity based on a Finish-to-Start (FS) relationship\n * with the predecessor activity. It uses the predecessor's EF time and adjusts it based on the link's lag and the\n * activity's duration.\n *\n * @param {Object} link - The link object representing the relationship between the predecessor and successor activities.\n * @param {number} link.source - The ID of the predecessor activity.\n * @param {number} [link.lag=0] - The lag time between the predecessor and successor activities.\n * @returns {Object} An object containing the calculated earliest start (ES) and earliest finish (EF) times.\n * @property {Date} es - The earliest start time.\n * @property {Date} ef - The earliest finish time.\n *\n * @example\n * // Assuming link is an object with a source property (predecessor ID) and an optional lag property\n * const result = calculateFS({ source: 1, lag: 2 });\n // { es: Date, ef: Date }\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n calculateFS(link) {\n const predecessorCalculatedEsAndEf =\n this.getEsAndEfFromPreviousCalculatedActivities(Number(link.source));\n const esDataCalculation = link.lag || 0;\n const duration = this.referenceActivity.duration;\n const efDataCalculation = duration;\n const lag = link.lag || 0;\n\n return this.calculateSucessorTimes(\n predecessorCalculatedEsAndEf.ef,\n esDataCalculation,\n efDataCalculation,\n lag,\n LINK_TYPES.FS\n );\n }\n /**\n * Calculates the earliest start (ES) and earliest finish (EF) times for a Start-to-Finish (SF) relationship.\n *\n * This function calculates the ES and EF times for a successor activity based on a Start-to-Finish (SF) relationship\n * with the predecessor activity. It uses the predecessor's EF time and adjusts it based on the link's lag and the\n * activity's duration.\n *\n * @param {Object} link - The link object representing the relationship between the predecessor and successor activities.\n * @param {number} link.source - The ID of the predecessor activity.\n * @param {number} [link.lag=0] - The lag time between the predecessor and successor activities.\n * @returns {Object} An object containing the calculated earliest start (ES) and earliest finish (EF) times.\n * @property {Date} es - The earliest start time.\n * @property {Date} ef - The earliest finish time.\n *\n * @example\n * // Assuming link is an object with a source property (predecessor ID) and an optional lag property\n * const result = calculateSF({ source: 1, lag: 2 });\n // { es: Date, ef: Date }\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n calculateSF(link) {\n const predecessorCalculatedEsAndEf =\n this.getEsAndEfFromPreviousCalculatedActivities(Number(link.source));\n const duration = this.referenceActivity.duration;\n const esDataCalculation = -duration;\n const efDataCalculation = link.lag || 0;\n const lag = link.lag || 0;\n\n return this.calculateSucessorTimes(\n predecessorCalculatedEsAndEf.es,\n esDataCalculation,\n efDataCalculation,\n lag,\n LINK_TYPES.SF\n );\n }\n\n /**\n * Adjusts a date to the next working hour based on the type of link restriction and the activity's calendar.\n *\n * This function adjusts the provided date either to a future or past working hour based on the specified link restriction.\n * It uses the activity's calendar to determine the working hours and calculates the appropriate date.\n *\n * @param {Date} dateBaseToCalculate - The initial date that needs to be adjusted.\n * @param {string} restrictionOfLink - The type of link restriction (e.g., 'fs', 'ss', 'ff').\n * @param {Object} activityCalendar - The calendar associated with the activity, used to determine working hours.\n * @returns {Date} The adjusted date based on the link restriction and activity calendar.\n *\n * @example\n * // Assuming dateBaseToCalculate is a Date object, restrictionOfLink is 'fs', and activityCalendar is a valid calendar object\n * const adjustedDate = mutateTheDateToFutureOrPastInBaseRestriction(new Date(), 'fs', activityCalendar);\n // The date adjusted to the next working hour in the future\n *\n * @throws {Error} If an error occurs during the date adjustment process.\n */\n mutateTheDateToFutureOrPastInBaseRestriction(\n dateBaseToCalculate,\n restrictionOfLink,\n activityCalendar\n ) {\n if (\n ![LINK_TYPES.FS, LINK_TYPES.SS, LINK_TYPES.FF].includes(restrictionOfLink)\n ) {\n return dateBaseToCalculate;\n }\n\n const constraintThatGoToNextWorkingHour = [LINK_TYPES.FS, LINK_TYPES.SS];\n const direction = constraintThatGoToNextWorkingHour.includes(\n restrictionOfLink\n )\n ? 'future'\n : 'past';\n\n return getNextWorkingHour({\n dateBaseToCalculate,\n activityCalendar,\n direction,\n activity: this.referenceActivity\n });\n }\n}\n\nexport default LinksRulesCalculationsMethods;\n","import LinksRulesCalculationsMethods from '../base/LinksRulesCalculationsMethods.js';\nimport { getMaxEarlyStartSet } from '../helpers/getMaxEarlyStartSet.js';\nimport CriticalPathHelpers from '../../base/generic-calculations.js';\nimport { addDurationToDate } from '../../helpers/index.js';\nclass LinksConstraintCalculator extends LinksRulesCalculationsMethods {\n constructor(calculationObject) {\n super(calculationObject);\n }\n /**\n * Calculates the earliest start dates for all links and returns the maximum early start set.\n *\n * This function processes each link in the `links` array, retrieves the necessary link data, and calculates\n * the earliest start dates using the `calculateLink` method. It then returns the maximum early start set\n * by calling `getMaxEarlyStartSet`.\n *\n * @returns {Object} The maximum early start set calculated from all links.\n *\n * @example\n * // Assuming links is an array of link IDs [1, 2, 3]\n * // and gantt.getLink(id) returns link data for each ID\n * const result = calculate();\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n calculate() {\n if (this.links.length === 0) {\n return new CriticalPathHelpers(\n this.gantt,\n 'forward'\n ).calculateStartAndFinishOfChainOrigin(this.referenceActivity);\n }\n const allLinksCalculations = this.links.map((link) => {\n const linkData = this.gantt.getLink(link);\n if (!linkData) {\n throw new Error('Link data not found', { cause: { linkId: link } });\n }\n return this.calculateLink(linkData);\n });\n\n const parent = Number(this.referenceActivity.parent);\n if (this.parentsWithLinks.has(parent)) {\n const activityCalendar = this.gantt.getCalendar(\n this.referenceActivity.calendar_id\n );\n const es = this.parentsCalculations.get(parent).es;\n\n const ef = addDurationToDate(\n activityCalendar,\n es,\n this.referenceActivity.duration,\n this.referenceActivity\n );\n\n allLinksCalculations.push({ es, ef });\n }\n\n return getMaxEarlyStartSet(allLinksCalculations);\n }\n /**\n * Calculates the link based on its type.\n *\n * This function determines the appropriate calculation method for the link based on its type and executes it.\n * The link type is mapped to specific calculation methods: Finish-to-Start (FS), Start-to-Start (SS),\n * Finish-to-Finish (FF), and Start-to-Finish (SF).\n *\n * @param {Object} linkData - The data of the link to be calculated. It should include a `type` property that indicates the type of link.\n * @returns {*} The result of the calculation based on the link type.\n *\n * @example\n * // Assuming linkData is an object with a type property\n * const result = calculateLink({ type: 0, ...otherLinkProperties });\n * // This will call the calculateFS method with the linkData and return the result\n *\n * @throws {Error} If the link type is not recognized.\n */\n calculateLink(linkData) {\n const calculationMapping = {\n 0: () => this.calculateFS(linkData),\n 1: () => this.calculateSS(linkData),\n 2: () => this.calculateFF(linkData),\n 3: () => this.calculateSF(linkData)\n };\n\n return calculationMapping[linkData.type]();\n }\n}\n\nexport { LinksConstraintCalculator };\n","class ActivityCalculator {\n constructor(options) {\n this.gantt = options.gantt;\n this.direction = options.direction;\n this.pendingParentsWithNoLinks = options.pendingParentsWithNoLinks;\n this.pendingParentsWithLinks = options.pendingParentsWithLinks;\n this.calculationOfParentsFromLinks = options.calculationOfParentsFromLinks;\n this.singleParents = options.singleParents;\n this.calculations = options.calculations;\n this.activitiesStartChainButChildrenOfLinkedParents =\n options.activitiesStartChainButChildrenOfLinkedParents;\n this.linkProperty = options.linkProperty;\n this.linkDirection = options.linkDirection;\n }\n\n /**\n * Checks which activities can now be calculated based on their dependencies.\n * @param {Set<number>} pendingToCalculate - Set of activity IDs pending calculation.\n * @returns {Object} An object containing activities that can be calculated and remaining pending activities.\n */\n checkActivitiesThatNowCanBeCalculated(pendingToCalculate) {\n const activitiesThatCanBeCalculated = new Set();\n const pendingActivities = new Set(pendingToCalculate);\n\n for (const activityId of pendingToCalculate) {\n const activityData = this.gantt.getTask(activityId);\n if (activityData.type === 'project') {\n this.handleProjectActivity(\n activityId,\n activityData,\n activitiesThatCanBeCalculated,\n pendingActivities\n );\n } else {\n this.handleNonProjectActivity(\n activityId,\n activityData,\n activitiesThatCanBeCalculated,\n pendingActivities\n );\n }\n }\n\n return {\n activitiesThatCanBeCalculated,\n pendingActivities\n };\n }\n\n /**\n * Handles logic for project-type activities.\n */\n handleProjectActivity(\n activityId,\n activityData,\n activitiesThatCanBeCalculated,\n pendingActivities\n ) {\n const isPendingParentWithNoLinks =\n this.pendingParentsWithNoLinks.has(activityId);\n const isPendingParentWithLinks =\n this.pendingParentsWithLinks.has(activityId);\n const hasCalculationFromLinks =\n this.calculationOfParentsFromLinks.has(activityId);\n\n if (isPendingParentWithNoLinks) {\n const children = this.singleParents.get(activityId)?.childrens;\n if (!children) {\n return;\n }\n const areChildrenCalculated = children.every((childId) =>\n this.calculations.has(childId)\n );\n\n if (areChildrenCalculated) {\n activitiesThatCanBeCalculated.add(activityId);\n pendingActivities.delete(activityId);\n }\n return;\n }\n\n if (isPendingParentWithLinks && hasCalculationFromLinks) {\n const children = this.singleParents.get(activityId)?.childrens;\n if (!children) {\n return;\n }\n const areChildrenCalculated = children.every((childId) =>\n this.calculations.has(childId)\n );\n\n if (areChildrenCalculated) {\n activitiesThatCanBeCalculated.add(activityId);\n pendingActivities.delete(activityId);\n }\n return;\n }\n\n if (isPendingParentWithLinks && !hasCalculationFromLinks) {\n const canBeCalculated = this.canCalculateParentActivity(activityData);\n\n if (canBeCalculated) {\n activitiesThatCanBeCalculated.add(activityId);\n pendingActivities.delete(activityId);\n }\n }\n }\n\n /**\n * Determines if a parent activity can be calculated.\n */\n canCalculateParentActivity(activityData) {\n const hasNoLinks = (activityData[this.linkProperty] || []).length === 0;\n const constraintType = activityData.constraint_type;\n const isSpecialConstraintType =\n this.direction === 'forward'\n ? constraintType === 'fnlt' || constraintType === 'snlt'\n : constraintType === 'fnlt';\n\n if (isSpecialConstraintType && hasNoLinks) {\n return true;\n }\n\n const linkedActivities = this.getArrayOfLinkedActivities(\n activityData[this.linkProperty]\n );\n return linkedActivities.every((activityId) =>\n this.calculations.has(activityId)\n );\n }\n\n /**\n * Handles logic for non-project activities.\n */\n handleNonProjectActivity(\n activityId,\n activityData,\n activitiesThatCanBeCalculated,\n pendingActivities\n ) {\n const parentId = Number(activityData.parent);\n const isParentPendingWithLinks = this.pendingParentsWithLinks.has(parentId);\n const hasParentCalculationFromLinks =\n this.calculationOfParentsFromLinks.has(parentId);\n if (isParentPendingWithLinks && !hasParentCalculationFromLinks) {\n return;\n }\n\n if (this.direction === 'backward') {\n const isStartChainChildOfLinkedParent =\n this.activitiesStartChainButChildrenOfLinkedParents.has(activityId);\n if (isStartChainChildOfLinkedParent && !hasParentCalculationFromLinks) {\n return;\n }\n }\n\n if (\n activityData['$target'].length === 0 &&\n activityData['$source'].length === 0\n ) {\n activitiesThatCanBeCalculated.add(activityId);\n pendingActivities.delete(activityId);\n return;\n }\n\n const linkedActivities = this.getLinkedActivities(\n activityData[this.linkProperty]\n );\n const arePredecessorsCalculated = linkedActivities.every((act) =>\n this.calculations.has(act.id)\n );\n\n if (this.direction === 'backward') {\n const hasNoLinkedActivities = linkedActivities.length === 0;\n\n if (\n (hasNoLinkedActivities || arePredecessorsCalculated) &&\n hasParentCalculationFromLinks\n ) {\n activitiesThatCanBeCalculated.add(activityId);\n pendingActivities.delete(activityId);\n return;\n }\n }\n\n if (arePredecessorsCalculated) {\n activitiesThatCanBeCalculated.add(activityId);\n pendingActivities.delete(activityId);\n }\n }\n\n /**\n * Retrieves linked activities based on link property.\n */\n getLinkedActivities(predecessors) {\n if (!Array.isArray(predecessors)) {\n return [];\n }\n\n const linkedActivities = [];\n\n for (const linkId of predecessors) {\n const linkData = this.gantt.getLink(linkId);\n\n if (!linkData) {\n continue;\n }\n\n const linkedActivityId = linkData[this.linkDirection];\n const linkedActivity = this.gantt.getTask(linkedActivityId);\n\n if (linkedActivity) {\n linkedActivities.push(linkedActivity);\n }\n }\n\n return linkedActivities;\n }\n\n /**\n * Retrieves an array of linked activity IDs.\n */\n getArrayOfLinkedActivities(links) {\n if (!Array.isArray(links)) {\n return [];\n }\n const linkedActivityIds = [];\n\n for (const linkId of links) {\n const linkData = this.gantt.getLink(linkId);\n\n if (!linkData) {\n continue;\n }\n\n linkedActivityIds.push(Number(linkData[this.linkDirection]));\n }\n\n return linkedActivityIds;\n }\n}\n\nexport default ActivityCalculator;\n","export const createIsCurrent = (calculationId, getCurrentId) => () =>\n getCurrentId() === calculationId;\n","export const shouldAbortCalculation = (gantt) =>\n !gantt?.fullyParsed ||\n // environment guard: en el core no hay `window` (el bridge en react_client sí).\n (typeof window !== 'undefined' &&\n window.to_use_react_gantt?.conversionMode?.isActive);\n","// Deliberate divergence from the verbatim legacy port (yield MECHANISM only,\n// output-identical): the original used `setTimeout(resolve, 0)`, which the\n// browser clamps to ~4ms and deprioritises — at 100k that clamp alone adds\n// ~1.75s of overhead across the CP passes. Route through the core's sanctioned\n// `yieldToBrowser` (MessageChannel in the browser: <0.1ms, ahead of setTimeout\n// on the event loop; a no-op in Node). This also removes the core's forbidden\n// `setTimeout` from production code. The slice budget and cancellation semantics\n// are unchanged, so the computed critical-path values are identical.\nimport { yieldToBrowser } from '../../../shared/timing.js';\n\nexport const TIME_BUDGET_MS = 16;\n\nexport const yieldIfNeeded = async (sliceStartTime) => {\n if (performance.now() - sliceStartTime > TIME_BUDGET_MS) {\n await yieldToBrowser();\n return performance.now();\n }\n return sliceStartTime;\n};\n","import { yieldIfNeeded } from './timing.js';\n\nexport const iterativeCalculate = async ({\n pending,\n activityCalculator,\n calculateFn,\n shouldKeepPending,\n isCalculated,\n onActivityProcessed,\n isCurrent\n}) => {\n let currentPending = new Set(pending);\n let sliceStartTime = performance.now();\n\n while (currentPending.size > 0) {\n if (!isCurrent()) return;\n sliceStartTime = await yieldIfNeeded(sliceStartTime);\n\n const { activitiesThatCanBeCalculated, pendingActivities } =\n activityCalculator.checkActivitiesThatNowCanBeCalculated(currentPending);\n\n if (activitiesThatCanBeCalculated.size === 0) break;\n\n for (const activityId of activitiesThatCanBeCalculated) {\n if (!isCurrent()) return;\n sliceStartTime = await yieldIfNeeded(sliceStartTime);\n calculateFn([activityId]);\n }\n\n for (const activity of activitiesThatCanBeCalculated) {\n if (!isCurrent()) return;\n\n if (shouldKeepPending(activity)) {\n pendingActivities.add(activity);\n }\n\n onActivityProcessed(activity);\n\n if (isCalculated(activity)) {\n pendingActivities.delete(activity);\n }\n }\n\n currentPending = pendingActivities;\n }\n};\n","import CriticalPathHelpers from '../base/generic-calculations.js';\nimport calculateRestriction from './helpers/restrictionCalculation.js';\nimport { LinksConstraintCalculator } from './calculators/LinksConstraintCalculator.js';\nimport { CONSTRAINT_TYPES } from '../constants/index.js';\nimport ActivityCalculator from '../base/get-activities-to-calculate/index.js';\nimport { iterativeCalculate } from '../utils/index.js';\n\nclass ForwardPath extends CriticalPathHelpers {\n constructor(gantt) {\n super(gantt, 'forward');\n this.gantt = gantt;\n this.chainStartActivities = new Set();\n this.secondLevelActivities = new Set();\n this.pendingParentsWithLinks = new Set();\n this.pendingParentsWithNoLinks = new Set();\n this.structureOfParents = new Map();\n this.singleParents = new Map();\n this.calculations = new Map();\n this.calculationsOfParentThatImpactChildrens = new Map();\n this.alapMap = new Map();\n this.activitiesWaitingForCalculation = new Set();\n this.constraintsMap = new Map();\n this.totalFloatSnltFnlt = new Map();\n this.totalFloatForMsoMfo = new Map();\n this.totalFloatForAsap = new Map();\n this.calculationOfParentsFromLinks = new Set();\n this.parentCalculationFromChildren = new Set();\n this.forbiddenActivitiesLinkedToParentsWithLinks = new Set();\n this.activitiesStartChainButChildrenOfLinkedParents = new Set();\n this.identifyInitialActivities();\n this.initActivitiesWaitingForCalculation();\n }\n\n async calculateAsync(isCurrent) {\n this.identifyParentsWithAndWithoutLinks();\n if (!isCurrent()) return;\n\n this.identifyForbiddenActivitiesLinkedToParentsWithLinks();\n if (!isCurrent()) return;\n\n this.initializeActivitiesWithFullProgress();\n if (!isCurrent()) return;\n\n this.calculateStartAndFinishOfActivitiesThatStartChain();\n if (!isCurrent()) return;\n\n this.identifySecondLevelActivities();\n if (!isCurrent()) return;\n\n this.identifyThirdLevelActivities();\n if (!isCurrent()) return;\n\n await this.iterativeCalculateEfAndEs(isCurrent);\n }\n\n async iterativeCalculateEfAndEs(isCurrent) {\n const activityCalculator = new ActivityCalculator({\n gantt: this.gantt,\n direction: this.direction,\n pendingParentsWithNoLinks: this.pendingParentsWithNoLinks,\n pendingParentsWithLinks: this.pendingParentsWithLinks,\n calculationOfParentsFromLinks: this.calculationOfParentsFromLinks,\n singleParents: this.singleParents,\n calculations: this.calculations,\n activitiesStartChainButChildrenOfLinkedParents:\n this.activitiesStartChainButChildrenOfLinkedParents,\n linkProperty: this.linkProperty,\n linkDirection: this.linkDirection\n });\n\n await iterativeCalculate({\n pending: this.activitiesWaitingForCalculation,\n activityCalculator,\n calculateFn: (ids) => this.calculateStartAndFinishTimes(ids),\n shouldKeepPending: (activity) =>\n this.calculationOfParentsFromLinks.has(activity) &&\n !this.calculations.has(activity),\n isCalculated: (activity) => this.calculations.has(activity),\n onActivityProcessed: (activity) =>\n this.activitiesWaitingForCalculation.delete(activity),\n isCurrent\n });\n }\n\n /**\n * Calculates the earliest start (ES) and earliest finish (EF) dates for a list of activities.\n *\n * This function processes each activity in the `activitiesToCalculate` list, retrieves the necessary\n * information, and calculates the ES and EF dates based on the activity's progress and constraint type.\n * It handles various constraints and updates the calculations accordingly.\n * It also do calculation according to the activities links\n *\n * @param {Array<string|number>} activitiesToCalculate - A list of activity IDs for which to calculate ES and EF dates.\n * @returns {void} This function does not return a value.\n *\n * @example\n * // Assuming activitiesToCalculate is an array containing activity IDs [1, 2, 3]\n * calculateStartAndFinishTimes([1, 2, 3]);\n * // This will calculate the ES and EF dates for the activities and update the internal calculations map.\n *\n * @throws {Error} If an error occurs during the process.\n */\n\n calculateStartAndFinishTimes(activitiesToCalculate) {\n activitiesToCalculate.forEach((activity) => {\n const activityReference = this.gantt.getTask(activity);\n\n if (activityReference.type === 'project') {\n return this.doCalculationForParentType(activityReference);\n }\n\n if (!activityReference) {\n throw new Error('Error trying to get activity', {\n cause: { activityId: activity }\n });\n }\n const linksWithPredecessors = activityReference.$target;\n\n const constraintType =\n activityReference.constraint_type || CONSTRAINT_TYPES.ASAP;\n const constraintThatNeedToBeRecalculated = [\n CONSTRAINT_TYPES.SNET,\n CONSTRAINT_TYPES.SNLT,\n CONSTRAINT_TYPES.FNLT,\n CONSTRAINT_TYPES.FNET\n ];\n const recalculation = [\n CONSTRAINT_TYPES.ASAP,\n CONSTRAINT_TYPES.ALAP,\n CONSTRAINT_TYPES.SNET,\n CONSTRAINT_TYPES.FNET,\n CONSTRAINT_TYPES.SNLT,\n CONSTRAINT_TYPES.FNLT\n ];\n\n const activityCalendar = this.gantt.getCalendar(\n activityReference.calendar_id\n );\n if (!activityCalendar) {\n throw new Error(\n `Error trying to get calendar with id: ${activityReference.calendar_id}`\n );\n }\n const progress = Number(activityReference.progress);\n let es = null;\n let ef = null;\n let calculationsFromLinks = null;\n\n if (progress === 100) {\n this.setDatesForActivityWithFullProgress(activityReference);\n return;\n }\n\n if (progress > 0 && recalculation.includes(constraintType)) {\n ({ es, ef } =\n this.getDatesForActivityWithZeroProgress(activityReference));\n calculationsFromLinks = new LinksConstraintCalculator({\n links: linksWithPredecessors,\n activity: activityReference,\n calculatedActivitiesMap: this.calculations,\n calculatedAlapsMap: this.alapMap,\n constraint: constraintType,\n parentsWithLinks: this.pendingParentsWithLinks,\n parentsCalculations: this.calculationsOfParentThatImpactChildrens,\n ganttInstance: this.gantt\n }).calculate();\n\n if (constraintType === CONSTRAINT_TYPES.ASAP) {\n this.totalFloatForAsap.set(activity, {\n es: calculationsFromLinks.es,\n ef: calculationsFromLinks.ef,\n text: activityReference.text\n });\n }\n } else {\n ({ es, ef } = new LinksConstraintCalculator({\n links: linksWithPredecessors,\n activity: activityReference,\n calculatedActivitiesMap: this.calculations,\n calculatedAlapsMap: this.alapMap,\n constraint: constraintType,\n parentsWithLinks: this.pendingParentsWithLinks,\n parentsCalculations: this.calculationsOfParentThatImpactChildrens,\n ganttInstance: this.gantt\n }).calculate());\n }\n\n if (constraintType === CONSTRAINT_TYPES.ALAP) {\n this.alapMap.set(activity, {\n es: activityReference.start_date,\n ef: activityReference.end_date,\n text: activityReference.text\n });\n }\n const restriction = calculateRestriction(\n activityReference,\n constraintType,\n activityCalendar\n );\n\n if (constraintThatNeedToBeRecalculated.includes(constraintType)) {\n this.constraintsMap.set(activity, restriction);\n this.totalFloatSnltFnlt.set(activity, { es, ef });\n ({ es, ef } = this.recalculateInBaseConstraint(\n constraintType,\n restriction,\n { es, ef }\n ));\n }\n\n if (\n [CONSTRAINT_TYPES.MSO, CONSTRAINT_TYPES.MFO].includes(constraintType)\n ) {\n this.totalFloatForMsoMfo.set(activity, { es, ef });\n this.constraintsMap.set(activity, restriction);\n\n if (activityReference.progress === 0) {\n es = restriction.es;\n ef = restriction.ef;\n } else {\n let maxEfConstraint = activityReference.end_date;\n\n if (constraintType === CONSTRAINT_TYPES.MFO) {\n maxEfConstraint = Math.max(\n restriction.ef,\n activityReference.end_date\n );\n }\n\n es = activityReference.start_date;\n ef = maxEfConstraint;\n }\n }\n\n this.calculations.set(activity, {\n es,\n ef\n });\n\n this.activitiesWaitingForCalculation.delete(activity);\n });\n }\n\n /**\n * Gets the greatest date between a restriction and a link calculation.\n * @param {Object} restriction - The restriction object.\n * @param {Object} linkCalculation - The link calculation object.\n * @param {string} [comparisonType='greater'] - The type of comparison ('greater' or 'less').\n * @returns {Object} - The object with the greatest date.\n */\n getTheGreatesDateBetweenRestrictionAndEsEf(\n restriction,\n linkCalculation,\n comparisonType = 'greater'\n ) {\n if (comparisonType === 'greater') {\n return linkCalculation.ef > restriction.ef\n ? linkCalculation\n : restriction;\n }\n\n if (comparisonType === 'less') {\n return linkCalculation.ef < restriction.ef\n ? linkCalculation\n : restriction;\n }\n }\n\n /**\n * Set ES and EF dates for an activity with full progress.\n * @param {Object} activity - The activity object.\n */\n setDatesForActivityWithFullProgress(activity) {\n this.calculations.set(activity.id, {\n es: activity.start_date,\n ef: activity.end_date\n });\n }\n\n /**\n * Calculates ES and EF dates for an activity with progress greater than zero.\n * @param {Object} activity - The activity object.\n * @returns {Object} - The calculated ES and EF dates.\n */\n\n getDatesForActivityWithZeroProgress(activity) {\n return {\n es: activity.start_date,\n ef: activity.end_date\n };\n }\n\n /**\n * Recalculates ES and EF dates based on a constraint.\n * @param {string} constraintType - The type of constraint.\n * @param {Object} calculatedRestriction - The calculated restriction object.\n * @param {Object} calculatedEsEf - The calculated ES and EF object.\n * @returns {Object} - The recalculated ES and EF dates.\n */\n recalculateInBaseConstraint(\n constraintType,\n calculatedRestriction,\n calculatedEsEf\n ) {\n const comparisontype = [\n CONSTRAINT_TYPES.SNET,\n CONSTRAINT_TYPES.FNET\n ].includes(constraintType)\n ? 'greater'\n : 'less';\n const { es, ef } = this.getTheGreatesDateBetweenRestrictionAndEsEf(\n calculatedRestriction,\n calculatedEsEf,\n comparisontype\n );\n\n return { es, ef };\n }\n\n cleanAllActivityParentsFromLinks(links) {\n return links\n .map((link) => {\n const ganttActivityLink = this.gantt.getLink(link);\n if (!ganttActivityLink) {\n throw new Error('Error trying to get link', { cause: { linkId: link } });\n }\n const sourceId = ganttActivityLink.source;\n const targetId = ganttActivityLink.target;\n if (\n !this.gantt.getTask(sourceId) ||\n this.gantt.getTask(sourceId)?.type === 'project'\n )\n return;\n if (\n !this.gantt.getTask(targetId) ||\n this.gantt.getTask(targetId)?.type === 'project'\n )\n return;\n\n return link;\n })\n .filter(Boolean);\n }\n}\n\nexport default ForwardPath;\n","import moment from '../../shims/moment.js';\nimport { addDurationToDate, getNextWorkingHour } from '../../helpers/index.js';\nimport { CONSTRAINT_TYPES, LINK_TYPES } from '../../constants/index.js';\n\nclass CalculationsGenericMethods {\n constructor(calculationObject) {\n this.activity = calculationObject.activity;\n this.links = calculationObject.links;\n this.calculatedActivities = calculationObject.calculatedActivitiesMap;\n this.forwardPathCalculations =\n calculationObject.calculatedForwardActivitiesMap;\n this.gantt = calculationObject.ganttInstance;\n }\n\n /**\n * Retrieves the late start (LS) and late finish (lf) dates for a given activity from previously calculated activities.\n *\n * @param {string|number} activity - The ID of the activity for which to retrieve LS and lf dates.\n * @param {string} [constraint=null] - The constraint type to use for the calculation (e.g., 'alap').\n * @returns {Object|null} The LS and lf dates for the activity, or null if not found.\n * @throws {Error} If an error occurs during the retrieval process.\n */\n getForwardOrBackwardCalculations(activity, constraint = null) {\n if (constraint === CONSTRAINT_TYPES.ALAP) {\n return this.forwardPathCalculations.get(activity);\n }\n\n return this.calculatedActivities.get(activity);\n }\n /**\n * Calculates the LS (Latest Start) and LF (Latest Finish) times for the successor activity.\n * @param {Date} successorTime - The time of the successor activity.\n * @param {number} lsDataCalculation - The duration for LS calculation.\n * @param {number} [lfDataCalculation=0] - The duration for LF calculation, default is 0.\n * @param {number} lag - The lag time.\n * @param {string} [type='FS'] - The type of link ('FS', 'FF', 'SS', 'SF'), default is 'FS'.\n * @returns {Object} Returns an object containing the LS and LF times for the successor activity.\n * @throws Will throw an error if there's an issue with the calculation.\n */\n calculateSuccessorTimes(\n sucessorTime,\n lsDataCalculation,\n lfDataCalculation = 0,\n lag,\n type = LINK_TYPES.FS\n ) {\n let activityCalendar = this.gantt.getCalendar(this.activity.calendar_id);\n if (!activityCalendar) {\n throw new Error(\n `Error trying to get calendar with id: ${this.activity.calendar_id}`\n );\n }\n const workTime = sucessorTime;\n let isMilestone = this.activity.type === 'milestone';\n\n if (isMilestone && lag === 0) {\n let lsPred = addDurationToDate(\n activityCalendar,\n workTime,\n lsDataCalculation,\n this.activity\n );\n\n let lfPred = addDurationToDate(\n activityCalendar,\n lsPred,\n lfDataCalculation,\n this.activity\n );\n\n return { ls: lsPred, lf: lfPred };\n }\n const valuesToDoCalculation = {\n lag,\n workTime,\n activityCalendar,\n lsDataCalculation,\n lfDataCalculation,\n isMilestone\n };\n\n if (type === LINK_TYPES.FS) {\n let { ls, lf } = this.calculateFsLink(valuesToDoCalculation);\n return { ls, lf };\n }\n if (type === LINK_TYPES.FF) {\n let { ls, lf } = this.calculateFFLink(valuesToDoCalculation);\n return { ls, lf };\n }\n\n if (type === LINK_TYPES.SS) {\n let { ls, lf } = this.calculateSSlink(valuesToDoCalculation);\n return { ls, lf };\n }\n\n if (type === LINK_TYPES.SF) {\n let { ls, lf } = this.calculateSFLink(valuesToDoCalculation);\n return { ls, lf };\n }\n }\n /**\n * Calculates the LS (Latest Start) and LF (Latest Finish) times for the successor activity in a SS (Start-to-Start) link.\n * @param {Object} link - The link object containing information about the relationship.\n * @param {boolean} [alap=false] - Indicates whether to calculate based on ALAP (As Late As Possible) constraint, default is false.\n * @returns {Object} Returns an object containing the calculated LS and LF times for the successor activity.\n * @throws Will throw an error if there's an issue with the calculation.\n */\n calculateSS(link, alap = false) {\n let lsSuc = this.getValueForSS(link, alap);\n let lsDataForCalculation = -link.lag || 0;\n let lfDataForCalculation = this.activity.duration;\n let lag = link.lag;\n\n return this.calculateSuccessorTimes(\n lsSuc,\n lsDataForCalculation,\n lfDataForCalculation,\n lag,\n LINK_TYPES.SS\n );\n }\n\n /**\n * Calculates the LS (Latest Start) and LF (Latest Finish) times for the successor activity in a FF (Finish-to-Finish) link.\n * @param {Object} link - The link object containing information about the relationship.\n * @returns {Object} Returns an object containing the calculated LS and LF times for the successor activity.\n * @throws Will throw an error if there's an issue with the calculation.\n */\n calculateFF(link, constraint) {\n const succesorDate = this.getForwardOrBackwardCalculations(\n Number(link.target)\n );\n const propertToAcess = constraint === CONSTRAINT_TYPES.ALAP ? 'ef' : 'lf';\n let sucessorDate = succesorDate[propertToAcess];\n\n let lsDataForCalculation = -this.activity.duration;\n let lfDataForCalculation = -link.lag || 0;\n let lag = link.lag;\n\n return this.calculateSuccessorTimes(\n sucessorDate,\n lsDataForCalculation,\n lfDataForCalculation,\n lag,\n LINK_TYPES.FF\n );\n }\n /**\n * Calculates the LS (Latest Start) and LF (Latest Finish) times for the successor activity in a FS (Finish-to-Start) link.\n * @param {Object} link - The link object containing information about the relationship.\n * @param {string} constraint - The constraint type.\n * @returns {Object} Returns an object containing the calculated LS and LF times for the successor activity.\n * @throws Will throw an error if there's an issue with the calculation.\n */\n calculateFS(link, constraint) {\n let propertyToCalculate = 'ls';\n propertyToCalculate = constraint === CONSTRAINT_TYPES.ALAP ? 'es' : 'ls';\n\n let lateFinishPredecessor = this.getForwardOrBackwardCalculations(\n Number(link.target),\n constraint\n );\n\n let lsDataForCalculation = -this.activity.duration;\n const lag = link.lag || 0;\n let lfDataForCalculation = -link.lag || 0;\n\n return this.calculateSuccessorTimes(\n lateFinishPredecessor[propertyToCalculate],\n lsDataForCalculation,\n lfDataForCalculation,\n lag,\n LINK_TYPES.FS\n );\n }\n /**\n * Calculates the LS (Latest Start) and LF (Latest Finish) times for the successor activity in a SF (Start-to-Finish) link.\n * @param {Object} link - The link object containing information about the relationship.\n * @param {boolean} getFromForward - Whether to calculate LS using the early start from the forward path.\n * @returns {Object} Returns an object containing the calculated LS and LF times for the successor activity.\n * @throws Will throw an error if there's an issue with the calculation.\n */\n calculateSF(link, getFromForward = false) {\n let lateFinishSucessor = getFromForward\n ? this.getEarlyStartFromForwardPath(Number(link.target)).ef\n : this.getForwardOrBackwardCalculations(Number(link.target)).lf;\n\n let lsDataForCalculation = -link.lag || 0;\n let lfDataForCalculation = this.activity.duration;\n let lag = link.lag;\n\n return this.calculateSuccessorTimes(\n lateFinishSucessor,\n lsDataForCalculation,\n lfDataForCalculation,\n lag,\n LINK_TYPES.SF\n );\n }\n /**\n * Retrieves the early start time from the forward path calculations for the current activity.\n * @returns {number} The early start time for the activity.\n */\n getEarlyStartFromForwardPath(link) {\n return this.forwardPathCalculations.get(link);\n }\n /**\n * Retrieves the value for the specified scheduling state (SS).\n * @param {object} link - The link object representing the dependency.\n * @param {boolean} alap - Flag indicating if the scheduling state is As Late As Possible (ALAP).\n * @returns {number} The value representing the specified scheduling state.\n */\n getValueForSS(link, alap) {\n if (alap) {\n return this.getEarlyStartFromForwardPath(Number(link.target)).es;\n }\n\n let propertyToCalculate = 'ls';\n\n let sucessor = this.getForwardOrBackwardCalculations(Number(link.target));\n return sucessor[propertyToCalculate];\n }\n /**\n * Calculates the end date based on the provided activity calendar, starting date, and duration.\n * @param {object} activityCalendar - The calendar object containing activity scheduling information.\n * @param {Date} date - The starting date for the activity.\n * @param {number} duration - The duration of the activity in days.\n * @returns {Date} The end date of the activity.\n */\n calculateDate(activityCalendar, date, duration) {\n let resetedDate = moment(date).clone();\n\n return addDurationToDate(\n activityCalendar,\n new Date(resetedDate),\n duration,\n this.activity\n );\n }\n\n /**\n * Retrieves the last working hour based on the provided date and activity calendar.\n * @param {Date} date - The date for which to find the last working hour.\n * @param {object} activityCalendar - The calendar object containing activity scheduling information.\n * @param {string} [dir='past'] - The direction in which to search for the last working hour. Default is 'past'.\n * @throws {Error} Throws an error if the provided date is not valid.\n * @returns {Date} The last working hour relative to the provided date.\n */\n getLastWorkingHour(date, activityCalendar, dir = 'past') {\n const normalizedDate = date instanceof Date ? date : new Date(date);\n let resetedDate = moment(normalizedDate).clone();\n if (\n this.isActivityInInitHour(activityCalendar, normalizedDate) &&\n dir === 'past'\n ) {\n resetedDate = resetedDate.hours(0).minutes(0).seconds(0).milliseconds(0);\n }\n\n let newDate = getNextWorkingHour({\n dateBaseToCalculate: new Date(resetedDate),\n direction: dir,\n activityCalendar: activityCalendar,\n activity: this.activity\n });\n return newDate;\n }\n /**\n * Determines if a given date corresponds to the initial work hour of an activity as defined in the activity calendar.\n * This function retrieves the first work interval from the activity calendar and compares the hour portion\n * of the input date to the start hour of the work interval.\n * @param {object} activityCalendar - The calendar object containing work hours and scheduling information for the activity.\n * @param {Date} date - The date to check against the activity's start hour.\n * @returns {boolean} True if the hour of the input date matches the initial work hour of the activity; otherwise, false.\n */\n isActivityInInitHour(activityCalendar, date) {\n const normalizedDate = date instanceof Date ? date : new Date(date);\n const shifts = activityCalendar.getWorkHours(normalizedDate);\n let firstWorkInterval = shifts[0];\n if (!firstWorkInterval) {\n return false;\n }\n\n if (!firstWorkInterval.includes('-')) return false;\n\n let workStartHour = firstWorkInterval.split('-')[0];\n\n if (!workStartHour.includes(':')) return false;\n\n let hoursMinutes = workStartHour.split(':');\n\n if (hoursMinutes.length < 2) return false;\n\n workStartHour = parseInt(hoursMinutes[0], 10);\n if (moment.isMoment(date)) {\n return date.hours() === workStartHour;\n }\n\n // UTC core: los instantes son UTC; usar getUTCHours (el legacy corría en TZ local).\n return normalizedDate.getUTCHours() === workStartHour;\n }\n /**\n * Calculates the forward start (FS) and forward finish (FF) dates based on the provided parameters.\n * @param {object} options - An object containing the necessary parameters for the calculation.\n * @param {number} options.lag - The lag duration for the calculation.\n * @param {Date} options.workTime - The starting work time for the calculation.\n * @param {object} options.activityCalendar - The calendar object containing activity scheduling information.\n * @param {number} options.lsDataCalculation - The duration for calculating the forward start date.\n * @param {number} options.lfDataCalculation - The duration for calculating the forward finish date.\n * @param {boolean} [options.isMilestone=false] - Flag indicating if the activity is a milestone. Default is false.\n * @returns {object} An object containing the forward start (FS) and forward finish (FF) dates.\n */\n calculateFsLink({\n lag,\n workTime,\n activityCalendar,\n lsDataCalculation,\n lfDataCalculation,\n isMilestone = false\n }) {\n let lfPred = null;\n let lsPred = null;\n\n if (lag === 0) {\n const lsSucessor = this.getLastWorkingHour(\n workTime,\n activityCalendar,\n 'past'\n );\n lfPred = addDurationToDate(\n activityCalendar,\n lsSucessor,\n lfDataCalculation,\n this.activity\n );\n lfPred = this.getLastWorkingHour(lfPred, activityCalendar, 'past');\n\n lsPred = addDurationToDate(\n activityCalendar,\n lfPred,\n lsDataCalculation,\n this.activity\n );\n\n return { ls: lsPred, lf: lfPred };\n }\n\n let lsSucessor = workTime;\n\n if (!isMilestone) {\n lsSucessor = this.getLastWorkingHour(workTime, activityCalendar);\n }\n\n lfPred = addDurationToDate(\n activityCalendar,\n lsSucessor,\n lfDataCalculation,\n this.activity\n );\n\n lsPred = addDurationToDate(\n activityCalendar,\n lfPred,\n lsDataCalculation,\n this.activity\n );\n\n if (!isMilestone) {\n lfPred = this.getLastWorkingHour(lfPred, activityCalendar, 'past', true);\n }\n\n return { ls: lsPred, lf: lfPred };\n }\n /**\n * Calculates the forward finish (FF) dates based on the provided parameters.\n * @param {object} options - An object containing the necessary parameters for the calculation.\n * @param {number} options.lag - The lag duration for the calculation.\n * @param {Date} options.workTime - The starting work time for the calculation.\n * @param {object} options.activityCalendar - The calendar object containing activity scheduling information.\n * @param {number} options.lsDataCalculation - The duration for calculating the forward start date.\n * @param {number} options.lfDataCalculation - The duration for calculating the forward finish date.\n * @returns {object} An object containing the forward start (FS) and forward finish (FF) dates.\n */\n calculateFFLink({\n lag,\n workTime,\n activityCalendar,\n lsDataCalculation,\n lfDataCalculation\n }) {\n let lfPred = null;\n let lsPred = null;\n\n if (lag === 0) {\n lfPred = addDurationToDate(\n activityCalendar,\n workTime,\n lfDataCalculation,\n this.activity\n );\n lsPred = addDurationToDate(\n activityCalendar,\n lfPred,\n lsDataCalculation,\n this.activity\n );\n return { ls: lsPred, lf: lfPred };\n }\n\n let lfSucessor = workTime;\n\n if (lag > 0) {\n lfSucessor = this.getLastWorkingHour(\n lfSucessor,\n activityCalendar,\n 'past'\n );\n }\n lfPred = addDurationToDate(\n activityCalendar,\n lfSucessor,\n lfDataCalculation,\n this.activity\n );\n lsPred = addDurationToDate(\n activityCalendar,\n lfPred,\n lsDataCalculation,\n this.activity\n );\n return { ls: lsPred, lf: lfPred };\n }\n\n /**\n * Calculates the start and finish times for an activity based on the specified lag and work time.\n * If the lag is zero, the function directly calculates the times using the provided work time.\n * If the lag is negative and the activity is not a milestone, it adjusts the work time based on future working hours.\n * @param {object} options - Configuration object containing parameters needed for the calculation.\n * @param {number} options.lay - The lag time affecting the start and finish calculations.\n * @param {Date} options.workTime - The reference time from which calculations begin.\n * @param {object} options.activityCalendar - The calendar used to check work hours and holidays.\n * @param {number} options.lsDataCalculation - Duration to calculate the start time from the reference point.\n * @param {number} options.lfDataCalculation - Duration to calculate the finish time from the calculated start time.\n * @param {boolean} [options.isMilestone=false] - Indicates whether the current activity is a milestone.\n * @returns {object} An object with properties `ls` (start time) and `lf` (finish time).\n */\n calculateSSlink({\n lag,\n workTime,\n activityCalendar,\n lsDataCalculation,\n lfDataCalculation,\n isMilestone = false\n }) {\n let lfPred = null;\n let lsPred = null;\n\n if (lag === 0) {\n lsPred = addDurationToDate(\n activityCalendar,\n workTime,\n lsDataCalculation,\n this.activity\n );\n\n lfPred = addDurationToDate(\n activityCalendar,\n lsPred,\n lfDataCalculation,\n this.activity\n );\n return { ls: lsPred, lf: lfPred };\n }\n let lsSucessor = workTime;\n if (lag < 0 && !isMilestone) {\n lsSucessor = this.getLastWorkingHour(\n lsSucessor,\n activityCalendar,\n 'future'\n );\n }\n\n lsPred = addDurationToDate(\n activityCalendar,\n lsSucessor,\n lsDataCalculation,\n this.activity\n );\n lfPred = addDurationToDate(\n activityCalendar,\n lsPred,\n lfDataCalculation,\n this.activity\n );\n return { ls: lsPred, lf: lfPred };\n }\n /**\n * Calculates the start (SF) and finish (LF) times for an activity based on the specified lag and work time.\n * This function handles both cases where lag is zero and when it's not, calculating times based on the given work time.\n * @param {object} options - Configuration object containing the necessary parameters for the calculation.\n * @param {number} options.lag - The lag time that influences the scheduling.\n * @param {Date} options.workBlock - The reference time from which scheduling starts.\n * @param {object} options.activityCalendar - The calendar object containing activity scheduling information.\n * @param {number} options.lsDataCalculation - The duration to calculate the start time.\n * @param {number} options.lfDataCalculation - The duration to calculate the finish time.\n * @returns {object} An object containing the start (ls) and finish (lf) times of the activity.\n */\n calculateSFLink({\n lag,\n workTime,\n activityCalendar,\n lsDataCalculation,\n lfDataCalculation\n }) {\n let lfPred = null;\n let lsPred = null;\n\n if (lag === 0) {\n lsPred = addDurationToDate(activityCalendar, workTime, lsDataCalculation);\n\n lfPred = addDurationToDate(\n activityCalendar,\n lsPred,\n lfDataCalculation,\n this.activity\n );\n return { ls: lsPred, lf: lfPred };\n }\n let lfSucessor = workTime;\n lsPred = addDurationToDate(\n activityCalendar,\n lfSucessor,\n lsDataCalculation,\n this.activity\n );\n lfPred = addDurationToDate(\n activityCalendar,\n lsPred,\n lfDataCalculation,\n this.activity\n );\n return { ls: lsPred, lf: lfPred };\n }\n}\n\nexport default CalculationsGenericMethods;\n","import CalculationsGenericMethods from '../base/CalculationsGenericMethods.js';\nimport { addDurationToDate } from '../../helpers/addDurationToDate.js';\nimport { CONSTRAINT_TYPES } from '../../constants/index.js';\nimport CriticalPathHelpers from '../../base/generic-calculations.js';\n\nclass LinksConstraintCalculator extends CalculationsGenericMethods {\n constructor(calculationObject) {\n super(calculationObject);\n this.constraint = calculationObject.constraint || CONSTRAINT_TYPES.ASAP;\n this.parentsWithFullProgress = calculationObject.parentsWithFullProgress;\n this.parentsThatImpactChildrens =\n calculationObject.parentsThatImpactChildrens;\n this.projectDates = this.gantt.getSubtaskDates();\n }\n /**\n * Calculates the latest start (LS) and latest finish (LF) times for an activity.\n *\n * This function calculates the LS and LF times for an activity based on its progress and the links associated with it.\n * It takes into account various conditions and constraints to determine the final LS and LF times.\n *\n * @returns {Object} An object containing the calculated latest start (LS) and latest finish (LF) times.\n * @property {Date} ls - The calculated latest start time.\n * @property {Date} lf - The calculated latest finish time.\n *\n * @example\n * // Assuming this function is part of a class with access to the required properties and methods\n * const result = calculate();\n // { ls: Date, lf: Date }\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n calculate() {\n if (this.links.length === 0) {\n return new CriticalPathHelpers(\n this.gantt,\n 'backward'\n ).calculateStartAndFinishOfChainOrigin(this.activity);\n }\n\n let activityProgressMajorThanZeroButLessThanOneHundred =\n this.activity.progress > 0 && this.activity.progress < 100;\n const activityParent = this.gantt.getTask(this.activity.parent);\n let shouldTakeIntoAccountTheParent = false;\n\n if (activityParent) {\n shouldTakeIntoAccountTheParent = this.parentsThatImpactChildrens.has(\n Number(this.activity.parent)\n );\n }\n\n const allLinksCalculations = this.links\n .map((link) => {\n const linkData = this.gantt.getLink(link);\n\n if (!linkData) {\n throw new Error('Link not found', { cause: { linkId: link } });\n }\n\n if (this.parentsWithFullProgress.has(Number(linkData.target))) {\n return;\n }\n return this.calculateLink(linkData);\n })\n .filter((link) => link);\n\n if (allLinksCalculations.length !== 0) {\n const minStartValuesFromLinks =\n this.getMinLfFromLinks(allLinksCalculations);\n allLinksCalculations.push(this.calculateTheLsAndLfForTheActivity());\n\n if (shouldTakeIntoAccountTheParent) {\n const parentValues = this.parentsThatImpactChildrens.get(\n Number(this.activity.parent)\n );\n allLinksCalculations.push(\n this.calculateTheLsAndLfForTheActivity(parentValues)\n );\n }\n\n let minStartValues = this.getMinDateFromLinks(allLinksCalculations);\n\n let finalLs = minStartValues.ls;\n let finalLf = minStartValues.lf;\n\n if (activityProgressMajorThanZeroButLessThanOneHundred) {\n finalLs = this.activity.start_date;\n finalLf = this.getMinCalculationLogic(minStartValues);\n }\n\n return {\n ls: finalLs,\n lf: finalLf,\n minFromLinks: minStartValuesFromLinks\n };\n }\n\n if (shouldTakeIntoAccountTheParent) {\n allLinksCalculations.push(this.calculateTheLsAndLfForTheActivity());\n const parentValues = this.parentsThatImpactChildrens.get(\n Number(this.activity.parent)\n );\n let finalLf = parentValues.lf;\n let finalLs = addDurationToDate(\n this.gantt.getCalendar(this.activity.calendar_id),\n finalLf,\n -this.activity.duration,\n this.activity\n );\n allLinksCalculations.push({ ls: finalLs, lf: finalLf });\n\n let minStartValues = this.getMinDateFromLinks(allLinksCalculations);\n\n return {\n ls: minStartValues.ls,\n lf: minStartValues.lf,\n minFromLinks: minStartValues\n };\n }\n\n const calculation = this.calculateTheLsAndLfForTheActivity();\n return {\n ls: calculation.ls,\n lf: calculation.lf,\n minFromLinks: calculation\n };\n }\n /**\n * Calculates the Late Start (LS) and Late Finish (LF) for the current activity.\n * @returns {Object} An object containing the Late Start (LS) and Late Finish (LF) dates.\n * @throws {Error} If there's an issue with retrieving the calendar or calculating the dates.\n */\n calculateTheLsAndLfForTheActivity(parentDates = null) {\n try {\n const duration = this.activity.duration;\n const activityCalendar = this.gantt.getCalendar(\n this.activity.calendar_id\n );\n if (!activityCalendar) {\n throw new Error(\n `Calendar not found with id ${this.activity.calendar_id}`\n );\n }\n const lf = parentDates ? parentDates.lf : this.projectDates.end_date;\n if (!lf) {\n throw new Error('End date not found for activity', { cause: { activityId: this.activity.id } });\n }\n const ls = addDurationToDate(\n activityCalendar,\n lf,\n -duration,\n this.activity\n );\n\n return { ls, lf };\n } catch (error) {\n throw Error(error.message);\n }\n }\n /**\n * Calculates the minimum between the minimum date from links and the end date of the project\n * or the end date of the activity, depending on the constraint type.\n * @param {Object} minCalculatedDateFromLinks - The minimum calculated date from links.\n * @returns {Date} The minimum date between the calculated date from links and the end date.\n */\n SnetSnltMsoMinDate(minCalculatedDateFromLinks) {\n const minDateOfEndOfProjectAndLinks = Math.min(\n minCalculatedDateFromLinks.lf,\n this.projectDates.end_date\n );\n\n return new Date(\n Math.max(minDateOfEndOfProjectAndLinks, this.activity.end_date)\n );\n }\n /**\n * Calculates the successor and/or predecessor times based on the link type and constraints.\n * @param {Object} linkData - The link data object containing information about the link.\n * @returns {void} Returns nothing if the calculation is avoided based on the progress of the target activity.\n * @throws {Error} Throws an error if activity data is not found or if an error occurs during calculation.\n */\n calculateLink(linkData) {\n const activityFromLink = this.gantt.getTask(linkData.target);\n if (!activityFromLink) {\n return;\n }\n if (activityFromLink.progress > 0 && activityFromLink.type !== 'project') {\n return;\n }\n\n const specialParamForFS =\n this.getSpecialCalculationParamForConstraintLink();\n const specialParamForSf = this.getSpecialParamForSf();\n const specialParamForFF = this.getSpecialParamForFF();\n const calculationMapping = {\n 0: () => this.calculateFS(linkData, specialParamForFS),\n 1: () => this.calculateSS(linkData),\n 2: () => this.calculateFF(linkData, specialParamForFF),\n 3: () => this.calculateSF(linkData, specialParamForSf)\n };\n\n return calculationMapping[linkData.type]();\n }\n /**\n * Determines the special calculation parameter based on the constraint type.\n * @returns {string|undefined} Returns a special parameter for specific constraint types, or undefined if no special parameter is needed.\n */\n getSpecialCalculationParamForConstraintLink() {\n if (this.constraint === CONSTRAINT_TYPES.ALAP) return CONSTRAINT_TYPES.ALAP;\n if (\n this.constraint === CONSTRAINT_TYPES.FNET ||\n this.constraint === CONSTRAINT_TYPES.SNET\n )\n return 'snet-fnet';\n if (this.constraint === CONSTRAINT_TYPES.FNLT) return CONSTRAINT_TYPES.FNLT;\n }\n /**\n * Determines the special calculation parameter based on the constraint type.\n * @returns {string|undefined} Returns a special parameter for specific constraint types, or undefined if no special parameter is needed.\n */\n getSpecialParamForSf() {\n const constriantThatNeedSpecialParam = [CONSTRAINT_TYPES.ALAP];\n if (constriantThatNeedSpecialParam.includes(this.constraint)) return true;\n\n return false;\n }\n /**\n * Determines the special calculation parameter based on the constraint type.\n * @returns {string|undefined} Returns a special parameter for specific constraint types, or undefined if no special parameter is needed.\n */\n getSpecialParamForFF() {\n const constraintsThatNeedSpecialFFParam = [\n CONSTRAINT_TYPES.MFO,\n CONSTRAINT_TYPES.MSO\n ];\n if (constraintsThatNeedSpecialFFParam.includes(this.constraint))\n return true;\n\n return false;\n }\n /**\n * Determines the minimum calculation logic based on the constraint type.\n * @param {Object} minCalculateFromLinks - The minimum calculation data from links.\n * @returns {Date} Returns the minimum calculation date based on the constraint type.\n */\n getMinCalculationLogic(minCalculateFromLinks) {\n if (this.constraint === CONSTRAINT_TYPES.ALAP) {\n return this.getMinDateBasedOnConstraint(minCalculateFromLinks);\n }\n if (this.constraint === CONSTRAINT_TYPES.FNET) {\n return this.getMinDateBasedOnConstraint(minCalculateFromLinks);\n }\n if (this.constraint === CONSTRAINT_TYPES.FNLT) {\n return this.getMinDateBasedOnConstraint(minCalculateFromLinks);\n }\n if (this.constraint === CONSTRAINT_TYPES.MFO) {\n return this.getMinDateBasedOnConstraint(minCalculateFromLinks);\n }\n\n if (\n this.constraint === CONSTRAINT_TYPES.SNET ||\n this.constraint === CONSTRAINT_TYPES.SNLT ||\n this.constraint === CONSTRAINT_TYPES.MSO\n ) {\n return this.SnetSnltMsoMinDate(minCalculateFromLinks);\n }\n\n if (this.constraint === CONSTRAINT_TYPES.ASAP) {\n return this.getMinDateBasedOnConstraint(minCalculateFromLinks);\n }\n }\n /**\n * Calculates the minimum date from the list of link calculations based on the constraint type.\n * @param {Array} allLinksCalculations - The list of all link calculations.\n * @returns {Object} Returns the minimum date from the link calculations.\n */\n getMinDateFromLinks(allLinksCalculations) {\n try {\n if (\n this.constraint === CONSTRAINT_TYPES.ALAP ||\n this.constraint === CONSTRAINT_TYPES.ASAP\n ) {\n const min = allLinksCalculations.reduce((min, activity) =>\n activity.lf < min.lf ? activity : min\n );\n\n return min;\n }\n\n return allLinksCalculations.reduce((min, activity) =>\n activity.ls < min.ls ? activity : min\n );\n } catch (error) {\n throw new Error(\n `Function: getMinDateFromLinks in LinksConstraintCalculator - ${error.message}`\n );\n }\n }\n\n getMinLfFromLinks(allLinksCalculations) {\n return allLinksCalculations.reduce((min, activity) =>\n activity.lf < min.lf ? activity : min\n );\n }\n\n /**\n * Gets the minimum date between the links' minimum date and the end of the project based on the constraint type.\n *\n * @param {Object} minCalculatedDateFromLinks - The minimum calculated date from links.\n * @param {Date} minCalculatedDateFromLinks.lf - The latest finish date from links.\n * @param {string} constraintType - The constraint type of the activity.\n * @returns {Date} The calculated minimum date based on the constraint type.\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n getMinDateBasedOnConstraint(\n minCalculatedDateFromLinks,\n constraintType = this.constraint\n ) {\n const minDateOfEndOfProjectAndLinks = Math.min(\n minCalculatedDateFromLinks.lf,\n this.projectDates.end_date\n );\n\n const activityEndDate = this.activity.end_date;\n const constraintDate = this.activity.constraint_date;\n\n if (constraintType === CONSTRAINT_TYPES.ASAP) {\n return new Date(Math.max(minDateOfEndOfProjectAndLinks, activityEndDate));\n }\n\n if (\n constraintType === CONSTRAINT_TYPES.FNET ||\n constraintType === CONSTRAINT_TYPES.FNLT\n ) {\n const minDateBetweenConstraintDateAndLinks = Math.min(\n minDateOfEndOfProjectAndLinks,\n constraintDate\n );\n return new Date(\n Math.max(\n minDateOfEndOfProjectAndLinks,\n minDateBetweenConstraintDateAndLinks\n )\n );\n }\n\n if (constraintType === CONSTRAINT_TYPES.ALAP) {\n return new Date(Math.min(minDateOfEndOfProjectAndLinks, activityEndDate));\n }\n }\n}\n\nexport default LinksConstraintCalculator;\n","import { addDurationToDate } from '../../helpers/index.js';\nimport { CONSTRAINT_TYPES } from '../../constants/index.js';\n/**\n * Calculates the restriction dates based on the activity constraint type.\n * @param {Object} activity - The activity object containing constraint date and duration.\n * @param {string} constraint - The type of constraint (e.g., 'snet', 'snlt', 'fnlt', 'fnet', 'mso', 'mfo').\n * @param {Object} activityCalendar - The calendar object associated with the activity.\n * @returns {Object} - An object containing the calculated early start (es) and early finish (ef) dates.\n */\n\nfunction calculateRestriction(activityCalendar, activity, constraint) {\n let restriction = { ls: null, lf: null };\n\n if (constraint === CONSTRAINT_TYPES.MSO) {\n restriction.ls = activity.constraint_date;\n restriction.lf = addDurationToDate(\n activityCalendar,\n restriction.ls,\n activity.duration,\n activity\n );\n }\n\n if (constraint === CONSTRAINT_TYPES.MFO) {\n restriction.lf = activity.constraint_date;\n restriction.ls = addDurationToDate(\n activityCalendar,\n restriction.lf,\n -activity.duration,\n activity\n );\n }\n\n return restriction;\n}\n\nexport default calculateRestriction;\n","import CriticalPathHelpers from '../base/generic-calculations.js';\nimport { CONSTRAINT_TYPES } from '../constants/index.js';\nimport LinksConstraintCalculator from './calculators/LinksConstraintCalculator.js';\nimport calculateRestriction from './helpers/restrictionCalculation.js';\nimport { addDurationToDate } from '../helpers/index.js';\nimport ActivityCalculator from '../base/get-activities-to-calculate/index.js';\nimport calculateRestrictionAsForward from '../forward-path/helpers/restrictionCalculation.js';\nimport { iterativeCalculate } from '../utils/index.js';\n\nclass BackwardPath extends CriticalPathHelpers {\n constructor(ganttInstance, forwardPathCalculations, forwardConstraintsMap) {\n super(ganttInstance, 'backward');\n this.gantt = ganttInstance;\n this.chainStartActivities = new Set();\n this.secondLevelActivities = new Set();\n this.pendingParentsWithLinks = new Set();\n this.pendingParentsWithNoLinks = new Set();\n this.structureOfParents = new Map();\n this.singleParents = new Map();\n this.calculationsOfParentThatImpactChildrens = new Map();\n this.activitiesWaitingForCalculation = new Set();\n this.calculations = new Map();\n this.mapOfRelationsWithActivitiesIds = new Map();\n this.activitiesWaitingForCalculation = new Set();\n this.forwardPathCalculations = forwardPathCalculations;\n this.forwardConstraintsMap = forwardConstraintsMap;\n this.constraintMap = new Map();\n this.minFromLinks = new Map();\n this.activitiesStartChainButChildrenOfLinkedParents = new Set();\n this.calculationOfParentsFromLinks = new Set();\n this.parentCalculationFromChildren = new Set();\n this.parentsWithFullProgress = new Set();\n this.forbiddenActivitiesLinkedToParentsWithLinks = new Set();\n this.identifyInitialActivities();\n this.initActivitiesWaitingForCalculation();\n }\n\n async calculateAsync(isCurrent) {\n this.identifyParentsWithAndWithoutLinks();\n if (!isCurrent()) return;\n\n this.identifyForbiddenActivitiesLinkedToParentsWithLinks();\n if (!isCurrent()) return;\n\n this.initializeActivitiesWithFullProgress();\n if (!isCurrent()) return;\n\n this.calculateStartAndFinishOfActivitiesThatStartChain();\n if (!isCurrent()) return;\n\n this.identifySecondLevelActivities();\n if (!isCurrent()) return;\n\n this.identifyThirdLevelActivities();\n if (!isCurrent()) return;\n\n await this.iterativeCalculateLfAndLs(isCurrent);\n }\n\n async iterativeCalculateLfAndLs(isCurrent) {\n const activityCalculator = new ActivityCalculator({\n gantt: this.gantt,\n direction: this.direction,\n pendingParentsWithNoLinks: this.pendingParentsWithNoLinks,\n pendingParentsWithLinks: this.pendingParentsWithLinks,\n calculationOfParentsFromLinks: this.calculationOfParentsFromLinks,\n singleParents: this.singleParents,\n calculations: this.calculations,\n activitiesStartChainButChildrenOfLinkedParents:\n this.activitiesStartChainButChildrenOfLinkedParents,\n linkProperty: this.linkProperty,\n linkDirection: this.linkDirection\n });\n\n await iterativeCalculate({\n pending: this.activitiesWaitingForCalculation,\n activityCalculator,\n calculateFn: (ids) => this.calculateStartAndFinishTimes(ids),\n shouldKeepPending: (activity) =>\n this.calculationOfParentsFromLinks.has(activity) &&\n !this.calculations.has(activity),\n isCalculated: (activity) => this.calculations.has(activity),\n onActivityProcessed: (activity) =>\n this.activitiesWaitingForCalculation.delete(activity),\n isCurrent\n });\n }\n\n setDatesToParentsWithLinks(parentData) {\n if (!parentData) {\n throw new Error('Error trying to get parent', {\n cause: { receivedParentData: parentData }\n });\n }\n let childrens = this.singleParents.get(parentData.id).childrens;\n\n let arrayOfDatesOfAllTheChildrens = Array.from(this.calculations).filter(\n (activity) => {\n return childrens.includes(activity[0]);\n }\n );\n\n let arrayOfEsAndEf = arrayOfDatesOfAllTheChildrens.map((activity) => {\n return activity[1];\n });\n\n const { minLs, maxLf } = arrayOfEsAndEf.reduce(\n (acc, { ls, lf }) => ({\n minLs: new Date(Math.min(acc.minLs.getTime(), new Date(ls).getTime())),\n maxLf: new Date(Math.max(acc.maxLf.getTime(), new Date(lf).getTime()))\n }),\n {\n minLs: new Date(arrayOfEsAndEf[0].ls),\n maxLf: new Date(arrayOfEsAndEf[0].lf)\n }\n );\n\n this.calculations.set(parentData.id, {\n ls: minLs,\n lf: maxLf\n });\n }\n /**\n * Calculates the latest start (LS) and latest finish (LF) times for a list of activities.\n *\n * This function processes each activity in the `activitiesToCalculate` list, retrieves the necessary\n * information, and calculates the LS and LF times based on the activity's progress and constraint type.\n * It handles various constraints and updates the calculations accordingly.\n *\n * @param {Array<string|number>} activitiesToCalculate - A list of activity IDs for which to calculate LS and LF times.\n * @returns {void} This function does not return a value.\n *\n * @example\n * // Assuming activitiesToCalculate is an array containing activity IDs [1, 2, 3]\n * calculateStartAndFinishTimes([1, 2, 3]);\n * // This will calculate the LS and LF times for the activities and update the internal calculations map.\n *\n * @throws {Error} If an error occurs during the process.\n */\n calculateStartAndFinishTimes(activitiesToCalculate) {\n activitiesToCalculate.forEach((activityId) => {\n let activityReference = this.gantt.getTask(activityId);\n\n if (!activityReference) {\n throw new Error('Activity not found', { cause: { activityId } });\n }\n let linksWithSucessors = activityReference.$source;\n let constraintType =\n activityReference.constraint_type || CONSTRAINT_TYPES.ASAP;\n\n const progress = Number(activityReference.progress);\n\n if (this.activitiesStartChainButChildrenOfLinkedParents.has(activityId)) {\n if (\n this.calculationsOfParentThatImpactChildrens.has(\n Number(activityReference.parent)\n ) &&\n this.calculationsOfParentThatImpactChildrens.get(\n Number(activityReference.parent)\n ) === false\n ) {\n let { ls, lf } = this.calculateStartAndFinishOfChainOrigin(\n activityReference,\n this.direction\n );\n\n this.setCalculations(activityReference, ls, lf);\n return;\n }\n\n return this.doCalculationForActivitiesThatStartLinkButHisParentIsLinked(\n activityReference\n );\n }\n\n if (activityReference.type === 'project') {\n return this.doCalculationForParentType(activityReference);\n }\n\n if (progress === 100) {\n this.setDatesForActivityWithFullProgress(activityReference);\n return;\n }\n\n if (\n this.allLinkedActivitiesHasProgress(\n linksWithSucessors,\n activityReference\n )\n ) {\n this.setWhenAllLinkedActivitiesHasProgress(activityReference);\n return;\n }\n\n if (progress > 0 && progress < 100) {\n if (\n constraintType === CONSTRAINT_TYPES.MSO ||\n constraintType === CONSTRAINT_TYPES.MFO\n ) {\n this.setWhenActivitiesHasProgressButLessThanOneHundred(\n activityReference,\n constraintType\n );\n return;\n }\n }\n\n if (\n constraintType === CONSTRAINT_TYPES.MSO ||\n constraintType === CONSTRAINT_TYPES.MFO\n ) {\n this.recalculateInBaseRestriction(activityReference, constraintType);\n\n return;\n }\n\n let { ls, lf, minFromLinks } = this.calculateLfandLsFromLinks(\n linksWithSucessors,\n activityReference,\n constraintType,\n this.parentsWithFullProgress,\n this.calculationsOfParentThatImpactChildrens\n );\n\n if (\n constraintType === CONSTRAINT_TYPES.SNLT ||\n constraintType === CONSTRAINT_TYPES.FNLT\n ) {\n ({ ls, lf } = this.getTheLessLateInBasEsEfConstraint(\n activityReference.id,\n {\n ls,\n lf\n },\n constraintType\n ));\n }\n\n this.setCalculations(activityReference, ls, lf);\n this.minFromLinks.set(activityReference.id, {\n ls: minFromLinks.ls,\n lf: minFromLinks.lf\n });\n });\n }\n\n /**\n * Determines the least late time for an activity based on ES and EF constraints.\n *\n * This function compares the latest finish (LF) time from links with the earliest finish (EF) constraint\n * for the activity. If the LF from links is less than the EF constraint, it returns the LF from links.\n * Otherwise, it returns the ES and EF constraints.\n *\n * @param {string|number} activity - The ID of the activity.\n * @param {Object} lfFromLinks - An object containing LS (latest start) and LF (latest finish) times from links.\n * @param {Date} lfFromLinks.ls - The latest start time from links.\n * @param {Date} lfFromLinks.lf - The latest finish time from links.\n * @returns {Object} An object containing the least late LS and LF times.\n * @property {Date} ls - The least late latest start time.\n * @property {Date} lf - The least late latest finish time.\n *\n * @example\n * // Assuming forwardConstraintsMap contains the ES and EF constraints for the activity\n * const result = getTheLessLateInBasEsEfConstraint(1, { ls: new Date(), lf: new Date() });\n * console.log()\n // { ls: Date, lf: Date }\n *\n * @throws {Error} If an error occurs during the process.\n */\n getTheLessLateInBasEsEfConstraint(activity, lfFromLinks, constraintType) {\n let esEfFromConstraint = this.forwardConstraintsMap.get(activity);\n if (!esEfFromConstraint) {\n const activityReference = this.gantt.getTask(activity);\n const activityCalendar = this.gantt.getCalendar(\n activityReference.calendar_id\n );\n esEfFromConstraint = calculateRestrictionAsForward(\n activityReference,\n constraintType,\n activityCalendar\n );\n }\n\n if (lfFromLinks.lf < esEfFromConstraint.ef) {\n return lfFromLinks;\n }\n\n return { ls: esEfFromConstraint.es, lf: esEfFromConstraint.ef };\n }\n /**\n * Checks whether all activities linked to the given set of activities have progress greater than 0.\n *\n * This function iterates over the linked activities, retrieves their data, and checks if all of them have progress greater than 0.\n * If any linked activity has 0 progress, the function returns false. If all linked activities have progress, it returns true.\n *\n * @param {Array<string|number>} linkedActivities - An array of linked activity IDs.\n * @returns {boolean} True if all linked activities have progress greater than 0, otherwise false.\n *\n * @example\n * // Assuming linkedActivities is an array containing linked activity IDs [1, 2, 3]\n * const allHaveProgress = allLinkedActivitiesHasProgress([1, 2, 3]);\n * console.log()\n // true or false based on the progress of the linked activities\n *\n * @throws {Error} If an error occurs during the process, such as missing link data or activity data.\n */\n allLinkedActivitiesHasProgress(linkedActivities) {\n try {\n let allLinkedHasProgress = true;\n\n for (let link of linkedActivities) {\n const linkData = this.gantt.getLink(link);\n if (!linkData) {\n continue;\n }\n\n const activityData = this.gantt.getTask(linkData.target);\n if (!activityData) {\n continue;\n }\n if (activityData.type === 'project') {\n allLinkedHasProgress = false;\n }\n if (activityData.progress === 0) {\n allLinkedHasProgress = false;\n }\n }\n\n return allLinkedHasProgress;\n } catch (error) {\n throw new Error(error.message);\n }\n }\n\n /**\n * Sets the calculations for an activity that has 100% progress.\n *\n * This function uses the activity's start and end dates to set the calculations for the activity.\n * It is assumed that the activity has 100% progress.\n *\n * @param {Object} activity - The activity object containing the details of the activity.\n * @param {Date} activity.start_date - The start date of the activity.\n * @param {Date} activity.end_date - The end date of the activity.\n * @returns {void} This function does not return a value.\n *\n * @example\n * // Assuming activity is an object with start_date and end_date properties\n * setDatesForActivityWithFullProgress({\n * start_date: new Date('2023-01-01'),\n * end_date: new Date('2023-01-10')\n * });\n * // This will set the calculations for the activity using its start and end dates.\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n setDatesForActivityWithFullProgress(activity) {\n this.setCalculations(activity, activity.start_date, activity.end_date);\n }\n /**\n * Sets the calculations for an activity when all its linked activities have progress.\n *\n * This function calculates the latest start (LS) and latest finish (LF) times for the activity using a backward direction,\n * and sets these values in the internal calculations.\n *\n * @param {Object} activity - The activity object containing the details of the activity.\n * @returns {void} This function does not return a value.\n *\n * @example\n * // Assuming activity is an object with necessary properties for calculation\n * setWhenAllLinkedActivitiesHasProgress(activity);\n * // This will calculate LS and LF for the activity and set these values in the internal calculations.\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n setWhenAllLinkedActivitiesHasProgress(activity) {\n const parent = Number(activity.parent);\n\n let { ls, lf } = this.calculateStartAndFinishOfChainOrigin(\n activity,\n 'backward'\n );\n if (this.calculationsOfParentThatImpactChildrens.has(parent)) {\n ls = activity.start_date;\n\n const parentCalculation =\n this.calculationsOfParentThatImpactChildrens.get(parent);\n\n if (\n parentCalculation &&\n typeof parentCalculation === 'object' &&\n parentCalculation.lf != null\n ) {\n lf = new Date(Math.min(lf, parentCalculation.lf));\n }\n }\n\n this.setCalculations(activity, ls, lf);\n return;\n }\n /**\n * Sets the calculations for an activity with progress greater than 0% but less than 100%.\n *\n * This function handles activities based on their constraint type when the progress is between 0% and 100%.\n * It sets the calculations accordingly using the activity's start and end dates, or the constraint dates.\n *\n * @param {Object} activity - The activity object containing the details of the activity.\n * @param {string} constraintType - The constraint type of the activity, such as 'mso' or 'mfo'.\n * @returns {void} This function does not return a value.\n *\n * @example\n * // Assuming activity is an object with start_date, end_date, and constraint_date properties, and constraintType is 'mso'\n * setWhenActivitiesHasProgressButLessThanOneHundred(activity, 'mso');\n * // This will set the calculations for the activity using its start and end dates.\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n setWhenActivitiesHasProgressButLessThanOneHundred(activity, constraintType) {\n if (constraintType === CONSTRAINT_TYPES.MSO) {\n this.setCalculations(activity, activity.start_date, activity.end_date);\n return;\n }\n\n if (constraintType === CONSTRAINT_TYPES.MFO) {\n const minDateBetween = Math.min(\n activity.constraint_date,\n this.projectDates.end_date\n );\n const maxBetween = new Date(Math.max(minDateBetween, activity.end_date));\n this.setCalculations(activity, activity.start_date, maxBetween);\n return;\n }\n }\n /**\n * Sets the latest start (LS) and latest finish (LF) times for a given activity in the internal calculations map.\n *\n * This function stores the LS and LF times, along with the activity's text, in the internal `calculations` map\n * using the activity's ID as the key.\n *\n * @param {Object} activity - The activity object containing the details of the activity.\n * @param {Date} ls - The latest start time for the activity.\n * @param {Date} lf - The latest finish time for the activity.\n * @returns {void} This function does not return a value.\n *\n * @example\n * // Assuming activity is an object with id and text properties, and ls and lf are Date objects\n * setCalculations(activity, new Date('2023-01-01'), new Date('2023-01-10'));\n * // This will store the LS and LF times in the calculations map for the given activity.\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n setCalculations(activity, ls, lf) {\n this.calculations.set(activity.id, {\n ls,\n lf,\n text: activity.text\n });\n }\n /**\n * Calculates the latest start (LS) and latest finish (LF) times for an activity based on its links with successors and the given constraint type.\n *\n * This function creates a new instance of the `LinksConstraintCalculator` class with the provided parameters and calls its `calculate` method\n * to determine the LS and LF times for the activity.\n *\n * @param {Array<string|number>} linksWithSucessors - An array of links to successor activities.\n * @param {Object} activityReference - The activity object for which to calculate LS and LF times.\n * @param {string} constraintType - The constraint type of the activity.\n * @returns {Object} An object containing the calculated latest start (LS) and latest finish (LF) times.\n * @property {Date} ls - The calculated latest start time.\n * @property {Date} lf - The calculated latest finish time.\n *\n * @example\n * // Assuming linksWithSucessors is an array of link IDs, activityReference is an activity object,\n * // and constraintType is a string representing the constraint type\n * const result = calculateLfandLsFromLinks([1, 2, 3], activityReference, 'mso');\n * console.log()\n // { ls: Date, lf: Date }\n *\n * @throws {Error} If an error occurs during the calculation process.\n */\n calculateLfandLsFromLinks(\n linksWithSucessors,\n activityReference,\n constraintType,\n parentsWithFullProgress,\n parentsThatImpactChildrens\n ) {\n return new LinksConstraintCalculator({\n links: linksWithSucessors,\n activity: activityReference,\n calculatedActivitiesMap: this.calculations,\n calculatedForwardActivitiesMap: this.forwardPathCalculations,\n constraint: constraintType,\n parentsWithFullProgress,\n parentsThatImpactChildrens,\n ganttInstance: this.gantt\n }).calculate();\n }\n /**\n * Recalculates the latest start (LS) and latest finish (LF) times for an activity based on its constraint type.\n *\n * This function fetches the activity's calendar, calculates the restriction based on the constraint type,\n * updates the constraint map, and sets the new calculations for the activity.\n *\n * @param {Object} activity - The activity object containing the details of the activity.\n * @param {string} constraintType - The constraint type of the activity.\n * @returns {void} This function does not return a value.\n *\n * @example\n * // Assuming activity is an object with calendar_id property, and constraintType is 'mso'\n * recalculateInBaseRestriction(activity, 'mso');\n * // This will recalculate the LS and LF times for the activity based on the constraint type and update the internal calculations.\n *\n * @throws {Error} If an error occurs during the calculation process, such as missing calendar data.\n */\n recalculateInBaseRestriction(activity, constraintType) {\n try {\n const activityCalendar = this.gantt.getCalendar(activity.calendar_id);\n if (!activityCalendar) {\n throw new Error(\n `Error trying to get calendar with id: ${activity.calendar_id}`\n );\n }\n let restriction = calculateRestriction(\n activityCalendar,\n activity,\n constraintType\n );\n this.constraintMap.set(activity, restriction);\n this.setCalculations(activity, restriction.ls, restriction.lf);\n } catch (error) {\n throw new Error(error.message);\n }\n }\n\n cleanAllActivityParentsFromLinks(links) {\n //Temporary code for parent activities\n return links\n .map((link) => {\n let sourceId = this.gantt.getLink(link).source;\n let targetId = this.gantt.getLink(link).target;\n if (\n !this.gantt.getTask(sourceId) ||\n this.gantt.getTask(sourceId)?.type === 'project'\n )\n return;\n if (\n !this.gantt.getTask(targetId) ||\n this.gantt.getTask(targetId)?.type === 'project'\n )\n return;\n\n return link;\n })\n .filter(Boolean);\n }\n\n doCalculationForActivitiesThatStartLinkButHisParentIsLinked(activity) {\n const parent = Number(activity.parent);\n const parentLinkCalcualation =\n this.calculationsOfParentThatImpactChildrens.get(parent);\n\n let ls = 0;\n let lf = 0;\n if (\n [\n CONSTRAINT_TYPES.ASAP,\n CONSTRAINT_TYPES.ALAP,\n CONSTRAINT_TYPES.SNET,\n CONSTRAINT_TYPES.FNET\n ].includes(activity.constraint_type)\n ) {\n if (Number(activity.progress) > 0) {\n const endDateOfProject = this.projectDates.end_date;\n lf = new Date(Math.min(endDateOfProject, parentLinkCalcualation.lf));\n ls = activity.start_date;\n } else {\n lf = parentLinkCalcualation.lf;\n ls = addDurationToDate(\n this.gantt.getCalendar(activity.calendar_id),\n lf,\n -activity.duration,\n activity\n );\n }\n }\n\n if ([CONSTRAINT_TYPES.SNLT].includes(activity.constraint_type)) {\n const constraintDate = activity.constraint_date;\n const parentLinkCalcualation =\n this.calculationsOfParentThatImpactChildrens.get(parent);\n\n const lsToComparison = addDurationToDate(\n this.gantt.getCalendar(activity.calendar_id),\n parentLinkCalcualation.lf,\n -activity.duration,\n activity\n );\n\n ls = new Date(\n Math.min(constraintDate.getTime(), lsToComparison.getTime())\n );\n lf = addDurationToDate(\n this.gantt.getCalendar(activity.calendar_id),\n ls,\n activity.duration,\n activity\n );\n }\n if ([CONSTRAINT_TYPES.FNLT].includes(activity.constraint_type)) {\n const constraintDate = activity.constraint_date;\n const parentLinkCalcualation =\n this.calculationsOfParentThatImpactChildrens.get(parent);\n\n ls = new Date(\n Math.min(constraintDate.getTime(), parentLinkCalcualation.lf.getTime())\n );\n lf = addDurationToDate(\n this.gantt.getCalendar(activity.calendar_id),\n ls,\n activity.duration,\n activity\n );\n }\n\n if ([CONSTRAINT_TYPES.MSO].includes(activity.constraint_type)) {\n ls = activity.constraint_date;\n lf = addDurationToDate(\n this.gantt.getCalendar(activity.calendar_id),\n ls,\n activity.duration,\n activity\n );\n }\n\n if ([CONSTRAINT_TYPES.MFO].includes(activity.constraint_type)) {\n lf = activity.constraint_date;\n ls = addDurationToDate(\n this.gantt.getCalendar(activity.calendar_id),\n lf,\n -activity.duration,\n activity\n );\n }\n\n const endDateOfTheProject = this.projectDates.end_date;\n const allCalculations = [\n {\n ls,\n lf\n }\n ];\n allCalculations.push({\n ls: addDurationToDate(\n this.gantt.getCalendar(activity.calendar_id),\n endDateOfTheProject,\n -activity.duration,\n activity\n ),\n lf: endDateOfTheProject\n });\n const minDates = this.getMinLfFromLinks(allCalculations);\n this.calculations.set(activity.id, {\n ls: minDates.ls,\n lf: minDates.lf,\n text: activity.text\n });\n }\n\n getMinLfFromLinks(allLinksCalculations = []) {\n if (!allLinksCalculations.length) {\n return false;\n }\n return allLinksCalculations.reduce((min, activity) =>\n activity.lf < min.lf ? activity : min\n );\n }\n}\n\nexport default BackwardPath;\n","/**\n * Shim no-op de `@sentry/react` para el port literal del critical path. El core\n * no reporta a Sentry directamente (lo hace el host vía su reporter); aquí solo\n * se traga la excepción igual que el catch del legacy.\n */\nexport function captureException() {}\n","/**\n * Shim de `getGanttInstance` para el port literal. En el core el \"gantt\" es el\n * adapter, siempre inyectado explícitamente en `CriticalPath.calculate(gantt)`,\n * así que el fallback global nunca se usa.\n */\nexport function getGanttInstance() {\n return null;\n}\n","export const buildFloatParams = ({\n forward,\n backward,\n id,\n activity,\n gantt,\n projectDates\n}) => ({\n totalFloat: {\n es: forward.calculations.get(id)?.es || 0,\n ef: forward.calculations.get(id)?.ef || 0,\n ls: backward.calculations.get(id)?.ls || 0,\n lf: backward.calculations.get(id)?.lf || 0,\n constraintsMap: forward.constraintsMap.get(id),\n totalFloatSnltFnlt: forward.totalFloatSnltFnlt.get(id),\n totalFloatForMsoMfo: forward.totalFloatForMsoMfo.get(id),\n minFromLinks: backward.minFromLinks.get(id),\n activity,\n gantt\n },\n freeFloat: {\n forwardMap: forward.calculations || new Map(),\n backwardMap: backward.calculations || new Map(),\n activity,\n projectDates,\n gantt\n }\n});\n","import { CONSTRAINT_TYPES } from '../constants/index.js';\nclass TotalFloat {\n constructor(paramsForCalculation) {\n this.gantt = paramsForCalculation.gantt;\n this.activity = paramsForCalculation.activity;\n this.es = paramsForCalculation.es;\n this.ef = paramsForCalculation.ef;\n this.ls = paramsForCalculation.ls;\n this.lf = paramsForCalculation.lf;\n this.constrainstMap = paramsForCalculation.constraintsMap;\n this.totalFloatSnltFnlt = paramsForCalculation.totalFloatSnltFnlt;\n this.totalFloatForMsoMfo = paramsForCalculation.totalFloatForMsoMfo;\n this.minFromLinks = paramsForCalculation.minFromLinks;\n }\n\n getTotalFloat() {\n let { constraint_type } = this.activity;\n const progress = Number(this.activity.progress);\n\n if (progress === 100) {\n return 0;\n }\n\n if (!constraint_type) {\n constraint_type = CONSTRAINT_TYPES.ASAP;\n }\n if (constraint_type === CONSTRAINT_TYPES.ASAP || !constraint_type) {\n return progress === 0\n ? this.calculateAsap()\n : this.calculateAsapWithProgress();\n }\n if (constraint_type === CONSTRAINT_TYPES.ALAP) {\n return progress === 0\n ? this.calculateAlap()\n : this.calculateAlapWithProgress();\n }\n if (\n constraint_type === CONSTRAINT_TYPES.SNET ||\n constraint_type === CONSTRAINT_TYPES.FNET\n ) {\n return progress === 0\n ? this.calculateSnetFet()\n : this.calculateSnetFnetSnltWithProgress();\n }\n if (constraint_type === CONSTRAINT_TYPES.SNLT) {\n return progress === 0\n ? this.calculateSnltFnlt()\n : this.calculateSnetFnetSnltWithProgress();\n }\n if (constraint_type === CONSTRAINT_TYPES.FNLT) {\n return progress === 0\n ? this.calculateSnltFnlt()\n : this.calculateFnltWithProgress();\n }\n if (\n constraint_type === CONSTRAINT_TYPES.MSO ||\n constraint_type === CONSTRAINT_TYPES.MFO\n ) {\n return progress === 0\n ? this.calculateMsoMfo()\n : this.calculateMsoMfoWithProgress();\n }\n }\n\n calculateAsap() {\n const totalFloatStart = this.calculationWithCalendar(this.ls, this.es);\n const totalFloatFinish = this.calculationWithCalendar(this.lf, this.ef);\n return (\n this.getMinValue(totalFloatStart, totalFloatFinish) /\n this.gantt.config.hoursPerDay\n );\n }\n\n calculateAsapWithProgress() {\n const totalFloatFinish = this.calculationWithCalendar(this.lf, this.ef);\n\n if (this.minFromLinks) {\n const lfMin = this.calculationWithCalendar(this.minFromLinks.lf, this.ef);\n return (\n this.getMinValue(totalFloatFinish, lfMin) /\n this.gantt.config.hoursPerDay\n );\n }\n return totalFloatFinish / this.gantt.config.hoursPerDay;\n }\n\n calculateAlap() {\n const totalFloatStart = this.calculationWithCalendar(this.ls, this.es);\n const totalFloatFinish = this.calculationWithCalendar(this.lf, this.ef);\n const totalFloatDatesMin = this.getMinValue(\n totalFloatStart,\n totalFloatFinish\n );\n const totaltFloatRestriction = this.calculationWithCalendar(\n this.lf,\n this.activity.end_date\n );\n return (\n this.getMinValue(totalFloatDatesMin, totaltFloatRestriction) /\n this.gantt.config.hoursPerDay\n );\n }\n\n calculateAlapWithProgress() {\n return (\n this.calculationWithCalendar(this.lf, this.ef) /\n this.gantt.config.hoursPerDay\n );\n }\n\n calculateSnetFnetSnltWithProgress() {\n const totalFinish = this.calculationWithCalendar(this.lf, this.ef);\n\n if (this.minFromLinks) {\n const totalFloatMin = this.calculationWithCalendar(\n this.minFromLinks.lf,\n this.ef\n );\n\n return (\n this.getMinValue(totalFinish, totalFloatMin) /\n this.gantt.config.hoursPerDay\n );\n }\n return totalFinish / this.gantt.config.hoursPerDay;\n }\n\n calculateFnltWithProgress() {\n const totalStart = this.calculationWithCalendar(this.lf, this.ef);\n\n const totalFloatConstraint = this.calculationWithCalendar(\n this.activity.constraint_date,\n this.ef\n );\n\n if (this.minFromLinks) {\n const totalFloatLFmin = this.calculationWithCalendar(\n this.minFromLinks.lf,\n this.ef\n );\n return (\n this.getMinValue(totalStart, totalFloatConstraint, totalFloatLFmin) /\n this.gantt.config.hoursPerDay\n );\n }\n return (\n this.getMinValue(totalStart, totalFloatConstraint) /\n this.gantt.config.hoursPerDay\n );\n }\n\n calculateMsoMfoWithProgress() {\n const totalFloatFinish = this.calculationWithCalendar(this.lf, this.ef);\n return totalFloatFinish / this.gantt.config.hoursPerDay;\n }\n\n calculateSnetFet() {\n const totalFloatStart = this.calculationWithCalendar(this.ls, this.es);\n const totalFloatFinish = this.calculationWithCalendar(this.lf, this.ef);\n\n return (\n this.getMinValue(totalFloatStart, totalFloatFinish) /\n this.gantt.config.hoursPerDay\n );\n }\n\n calculateSnltFnlt() {\n const totalFloatStart = this.calculationWithCalendar(this.ls, this.es);\n const totalFloatFinish = this.calculationWithCalendar(this.lf, this.ef);\n const minTotalFloat = this.getMinValue(totalFloatStart, totalFloatFinish);\n if (!this.totalFloatSnltFnlt && !this.constrainstMap) {\n return (\n this.getMinValue(totalFloatStart, totalFloatFinish) /\n this.gantt.config.hoursPerDay\n );\n }\n\n let totalFloatRestriction = 0;\n\n if (this.activity.constraint_type === CONSTRAINT_TYPES.SNLT) {\n totalFloatRestriction = this.calculationWithCalendar(\n this.constrainstMap.es,\n this.totalFloatSnltFnlt.es\n );\n } else {\n totalFloatRestriction = this.calculationWithCalendar(\n this.constrainstMap.ef,\n this.totalFloatSnltFnlt.ef\n );\n }\n\n return (\n this.getMinValue(totalFloatRestriction, minTotalFloat) /\n this.gantt.config.hoursPerDay\n );\n }\n\n calculateMsoMfo() {\n const totalFloatStart = this.calculationWithCalendar(this.ls, this.es);\n const totalFloatFinish = this.calculationWithCalendar(this.lf, this.ef);\n const datesTotalFloat = this.getMinValue(totalFloatStart, totalFloatFinish);\n if (!this.totalFloatForMsoMfo && !this.constrainstMap) {\n return (\n this.getMinValue(totalFloatStart, totalFloatFinish) /\n this.gantt.config.hoursPerDay\n );\n }\n let totalFloatRestriction = 0;\n\n if (this.activity.constraint_type === CONSTRAINT_TYPES.MSO) {\n totalFloatRestriction = this.calculationWithCalendar(\n this.constrainstMap.es,\n this.totalFloatForMsoMfo.es\n );\n } else {\n totalFloatRestriction = this.calculationWithCalendar(\n this.constrainstMap.ef,\n this.totalFloatForMsoMfo.ef\n );\n }\n\n return (\n this.getMinValue(totalFloatRestriction, datesTotalFloat) /\n this.gantt.config.hoursPerDay\n );\n }\n\n getMinValue(...values) {\n return Math.min(...values);\n }\n\n calculationWithCalendar(dateOne, dateTwo) {\n const calendar = this.gantt.getCalendar(this.activity.calendar_id);\n const calcualteDate = calendar.calculateDuration({\n start_date: new Date(dateTwo),\n end_date: new Date(dateOne)\n });\n\n return calcualteDate;\n }\n}\n\nexport default TotalFloat;\n","import { CONSTRAINT_TYPES } from '../constants/index.js';\nimport { getLinkNameByCode } from '../constants/linkByCode.js';\nclass FreeFloat {\n constructor(paramsForCalculation) {\n this.gantt = paramsForCalculation.gantt;\n this.activity = paramsForCalculation.activity;\n this.forwardMap = paramsForCalculation.forwardMap;\n this.backwardMap = paramsForCalculation.backwardMap;\n this.projectDates = paramsForCalculation.projectDates;\n this.linksFreeFloatArray = [];\n this.linksFreeFloatObject = {};\n this.durationCache = new Map();\n }\n\n getFreeFloat() {\n const PROGRESS = Number(this.activity.progress);\n const CONSTRAINT = this.getConstraintType();\n this.calculateFreeFloatOfLink(CONSTRAINT);\n const activityFreeFloat =\n PROGRESS === 100 ? 0 : this.getFreeFloatBaseConstraint(CONSTRAINT);\n return {\n activityFreeFloat,\n linksFreeFloat: this.linksFreeFloatObject\n };\n }\n\n getFreeFloatBaseConstraint(constraint) {\n if (\n constraint === CONSTRAINT_TYPES.MSO ||\n constraint === CONSTRAINT_TYPES.MFO\n ) {\n return this.calculateMsoMfo(constraint);\n }\n return this.calculateGeneral(constraint);\n }\n\n calculateFreeFloatOfLink(constraint = CONSTRAINT_TYPES.ASAP) {\n const FREE_FLOAT_FROM_LINKS = this.activity['$source']\n .map((source) => {\n const { LINK, LINK_TYPE } = this.getLinkData(source);\n const sucessor = this.gantt.getTask(LINK.target);\n if (!sucessor) {\n return {\n linkId: LINK.id,\n freeFloat: null,\n hasProgress: false\n };\n }\n const hasProgress = Number(sucessor.progress) > 0;\n\n const { sucessorDateToCalculate, predecessorDateToCalculate } =\n this.getDatesFromSucessorAndPredecessor(\n LINK_TYPE,\n constraint,\n sucessor\n );\n\n const differenceBetweenDates = this.calculationWithCalendar(\n sucessorDateToCalculate,\n predecessorDateToCalculate\n );\n\n const finalResult =\n this.parseHoursToDays(differenceBetweenDates) -\n this.parseHoursToDays(LINK.lag);\n const nonNegativeResult = Math.max(0, finalResult);\n this.linksFreeFloatObject[LINK.id] = nonNegativeResult;\n\n return {\n linkId: LINK.id,\n freeFloat: nonNegativeResult,\n hasProgress\n };\n })\n .filter(\n (linkData) =>\n linkData.freeFloat !== null && linkData.freeFloat !== undefined\n );\n\n this.linksFreeFloatArray = FREE_FLOAT_FROM_LINKS;\n\n return FREE_FLOAT_FROM_LINKS;\n }\n\n calculateGeneral(constraint = CONSTRAINT_TYPES.ASAP) {\n const MIN_FLOAT_FROM_LINKS = this.getMinFloat(this.linksFreeFloatArray);\n\n const FREE_FLOAT_END_OF_PROJECT =\n this.calculateFreeFloatForEndOfProject(constraint);\n\n let totalMinusFloat = 0;\n\n if ([CONSTRAINT_TYPES.SNLT, CONSTRAINT_TYPES.FNLT].includes(constraint)) {\n totalMinusFloat = this.doCalculationForSnltFnlt(\n constraint,\n FREE_FLOAT_END_OF_PROJECT,\n MIN_FLOAT_FROM_LINKS\n );\n } else {\n totalMinusFloat = this.doGeneralCalculation(\n FREE_FLOAT_END_OF_PROJECT,\n MIN_FLOAT_FROM_LINKS\n );\n }\n\n return Math.max(0, totalMinusFloat);\n }\n\n getConstraintType() {\n let { constraint_type } = this.activity;\n\n if (!constraint_type) {\n constraint_type = CONSTRAINT_TYPES.ASAP;\n }\n\n return constraint_type;\n }\n\n getDatesFromSucessorAndPredecessor(linkType, constraint, sucessor) {\n const isSuscessorAlap = sucessor.constraint_type === CONSTRAINT_TYPES.ALAP;\n\n const constraintData = this.getSucessorAndPredecessorDates({\n constraint,\n isSuscessorAlap,\n sucessorId: sucessor.id,\n predecessorId: this.activity.id\n });\n\n let sucessorDateToCalculate = new Date();\n let predecessorDateToCalculate = new Date();\n\n sucessorDateToCalculate = constraintData[linkType].sucessor;\n predecessorDateToCalculate = constraintData[linkType].predecessor;\n\n return {\n sucessorDateToCalculate,\n predecessorDateToCalculate\n };\n }\n\n doGeneralCalculation(freeFloatEndOfProject, floatFromLinks) {\n if (floatFromLinks === null) {\n return freeFloatEndOfProject;\n }\n\n return this.getMinValue(floatFromLinks, freeFloatEndOfProject);\n }\n\n doCalculationForSnltFnlt(constraint, freeFloatEndOfProject, floatFromLinks) {\n const restrictionFreeFloat =\n this.calculateFreeFloatOfRestriction(constraint);\n\n return this.getMinValue(\n floatFromLinks,\n freeFloatEndOfProject,\n restrictionFreeFloat\n );\n }\n\n calculateFreeFloatForEndOfProject(constraint) {\n return this.parseHoursToDays(\n this.calculationWithCalendar(\n this.gantt.getSubtaskDates().end_date,\n constraint === CONSTRAINT_TYPES.ALAP\n ? this.backwardMap.get(this.activity.id).lf\n : this.forwardMap.get(this.activity.id).ef\n )\n );\n }\n\n calculateFreeFloatOfRestriction(constraint) {\n return this.parseHoursToDays(\n this.calculationWithCalendar(\n this.activity.constraint_date,\n constraint === CONSTRAINT_TYPES.FNLT\n ? this.forwardMap.get(this.activity.id).ef\n : this.forwardMap.get(this.activity.id).es\n )\n );\n }\n\n getLinkData(linkId) {\n const LINK = this.gantt.getLink(linkId) || {};\n const LINK_TYPE = getLinkNameByCode(LINK.type);\n\n return {\n LINK,\n LINK_TYPE\n };\n }\n\n getSucessorAndPredecessorDates({\n constraint,\n isSuscessorAlap,\n sucessorId,\n predecessorId\n }) {\n const getPredecessorDate = ({\n direction,\n constraint = CONSTRAINT_TYPES.ASAP\n }) => {\n if (constraint === CONSTRAINT_TYPES.ALAP) {\n return this.backwardMap.get(predecessorId)[direction];\n }\n return this.forwardMap.get(predecessorId)[direction];\n };\n\n if (\n constraint === CONSTRAINT_TYPES.ASAP ||\n constraint === CONSTRAINT_TYPES.SNET ||\n constraint === CONSTRAINT_TYPES.FNET ||\n constraint === CONSTRAINT_TYPES.MSO ||\n constraint === CONSTRAINT_TYPES.MFO\n ) {\n return {\n fs: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).ls\n : this.forwardMap.get(sucessorId).es,\n predecessor: getPredecessorDate({ direction: 'ef' })\n },\n ss: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).ls\n : this.forwardMap.get(sucessorId).es,\n predecessor: getPredecessorDate({ direction: 'es' })\n },\n ff: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).lf\n : this.forwardMap.get(sucessorId).ef,\n predecessor: getPredecessorDate({ direction: 'ef' })\n },\n sf: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).lf\n : this.forwardMap.get(sucessorId).ef,\n predecessor: getPredecessorDate({ direction: 'es' })\n }\n };\n }\n\n if (constraint === CONSTRAINT_TYPES.ALAP) {\n return {\n fs: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).ls\n : this.forwardMap.get(sucessorId).es,\n predecessor: getPredecessorDate({\n constraint: CONSTRAINT_TYPES.ALAP,\n direction: 'lf'\n })\n },\n ss: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).ls\n : this.forwardMap.get(sucessorId).es,\n predecessor: getPredecessorDate({\n constraint: CONSTRAINT_TYPES.ALAP,\n direction: 'ls'\n })\n },\n ff: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).lf\n : this.forwardMap.get(sucessorId).ef,\n predecessor: getPredecessorDate({\n constraint: CONSTRAINT_TYPES.ALAP,\n direction: 'lf'\n })\n },\n sf: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).lf\n : this.forwardMap.get(sucessorId).ef,\n predecessor: getPredecessorDate({\n constraint: CONSTRAINT_TYPES.ALAP,\n direction: 'ls'\n })\n }\n };\n }\n\n if (constraint === CONSTRAINT_TYPES.SNLT) {\n return {\n fs: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).ls\n : this.forwardMap.get(sucessorId).es,\n predecessor: getPredecessorDate({ direction: 'ef' })\n },\n ss: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).ls\n : this.forwardMap.get(sucessorId).es,\n predecessor: getPredecessorDate({ direction: 'es' })\n },\n ff: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).lf\n : this.forwardMap.get(sucessorId).ef,\n predecessor: getPredecessorDate({ direction: 'ef' })\n },\n sf: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).lf\n : this.forwardMap.get(sucessorId).ef,\n predecessor: getPredecessorDate({ direction: 'es' })\n }\n };\n }\n\n if (constraint === CONSTRAINT_TYPES.FNLT) {\n return {\n fs: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).ls\n : this.forwardMap.get(sucessorId).es,\n predecessor: getPredecessorDate({ direction: 'ef' })\n },\n ss: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).ls\n : this.forwardMap.get(sucessorId).es,\n predecessor: getPredecessorDate({ direction: 'es' })\n },\n ff: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).lf\n : this.forwardMap.get(sucessorId).ef,\n predecessor: getPredecessorDate({ direction: 'ef' })\n },\n sf: {\n sucessor: isSuscessorAlap\n ? this.backwardMap.get(sucessorId).lf\n : this.forwardMap.get(sucessorId).ef,\n predecessor: getPredecessorDate({ direction: 'es' })\n }\n };\n }\n }\n\n calculateMsoMfo(constraint) {\n const CONSTRAINT_DATE = this.activity.constraint_date || new Date();\n const DATE_TO_CALCULATE =\n constraint === CONSTRAINT_TYPES.MSO\n ? this.forwardMap.get(this.activity.id).es\n : this.forwardMap.get(this.activity.id).ef;\n\n const freeSlack = this.calculationWithCalendar(\n CONSTRAINT_DATE,\n DATE_TO_CALCULATE\n );\n\n return Math.max(0, this.parseHoursToDays(freeSlack));\n }\n\n getMinValue(...values) {\n const filterValues = values.filter(\n (value) => value !== undefined && value !== null\n );\n return filterValues.length ? Math.min(...filterValues) : 0;\n }\n\n calculationWithCalendar(dateOne, dateTwo) {\n const key = `${dateTwo.getTime()}_${dateOne.getTime()}`;\n\n if (this.durationCache.has(key)) {\n return this.durationCache.get(key);\n }\n\n const calendar = this.gantt.getCalendar(this.activity.calendar_id);\n const result = calendar.calculateDuration({\n start_date: new Date(dateTwo),\n end_date: new Date(dateOne)\n });\n\n this.durationCache.set(key, result);\n return result;\n }\n\n parseHoursToDays(date) {\n if (!date) {\n return 0;\n }\n return date / this.gantt.config.hoursPerDay;\n }\n\n getMinFloat(arrayCalculatedSlacks) {\n if (!arrayCalculatedSlacks?.length) {\n return null;\n }\n\n const slacksWithoutParents = arrayCalculatedSlacks\n .filter((linkData) => !linkData.hasProgress)\n .map((linkData) => linkData.freeFloat);\n\n if (slacksWithoutParents.length === 0) {\n return null;\n }\n\n return Math.min(...slacksWithoutParents);\n }\n}\nexport default FreeFloat;\n","import TotalFloat from '../total-float/index.js';\nimport FreeFloat from '../free-float/index.js';\n\nexport const calculateActivityFloats = (params) => ({\n totalFloat: new TotalFloat(params.totalFloat).getTotalFloat(),\n freeFloat: new FreeFloat(params.freeFloat).getFreeFloat()\n});\n","import { yieldIfNeeded } from '../utils/timing.js';\nimport { buildFloatParams } from './buildParams.js';\nimport { calculateActivityFloats } from './calculate.js';\n\nexport const processActivityFloats = async ({\n activityIds,\n forward,\n backward,\n gantt,\n projectDates,\n isCurrent\n}) => {\n let sliceStartTime = performance.now();\n const totalFloatMap = new Map();\n const freeFloatMap = new Map();\n\n for (const id of activityIds) {\n if (isCurrent && !isCurrent()) {\n return { totalFloatMap, freeFloatMap };\n }\n\n const activity = gantt.getTask(id);\n if (!activity) continue;\n\n const params = buildFloatParams({\n forward,\n backward,\n id,\n activity,\n gantt,\n projectDates\n });\n const { totalFloat, freeFloat } = calculateActivityFloats(params);\n\n totalFloatMap.set(id, totalFloat);\n freeFloatMap.set(id, freeFloat);\n sliceStartTime = await yieldIfNeeded(sliceStartTime);\n }\n\n return { totalFloatMap, freeFloatMap };\n};\n","import ForwardPath from './forward-path/index.js';\nimport BackwardPath from './backward-path/index.js';\nimport * as Sentry from './shims/sentry.js';\nimport { getGanttInstance } from './shims/getGanttInstance.js';\nimport { createIsCurrent, shouldAbortCalculation } from './utils/index.js';\nimport { processActivityFloats } from './floats/index.js';\n\nclass CriticalPath {\n constructor(ganttInstance) {\n this.gantt = ganttInstance;\n this.forwardPathCalculations = null;\n this.backwardPathCalculations = null;\n this.totalFloat = new Map();\n this.freeFloat = new Map();\n this.currentCalculationId = 0;\n }\n\n getCurrentCalculationId = () => this.currentCalculationId;\n\n async calculate(gantt) {\n const calculationId = ++this.currentCalculationId;\n const isCurrent = createIsCurrent(\n calculationId,\n this.getCurrentCalculationId\n );\n\n try {\n const providedGantt = gantt || this.gantt;\n this.gantt = providedGantt || getGanttInstance();\n\n if (shouldAbortCalculation(this.gantt)) {\n return false;\n }\n\n const forwardPath = new ForwardPath(this.gantt);\n await forwardPath.calculateAsync(isCurrent);\n\n if (!isCurrent()) return false;\n\n const forwardPathCalculations = forwardPath.calculations;\n const forwardPathConstraints = forwardPath.constraintsMap;\n\n const backwardPath = new BackwardPath(\n this.gantt,\n forwardPathCalculations,\n forwardPathConstraints\n );\n\n await backwardPath.calculateAsync(isCurrent);\n\n if (!isCurrent()) return false;\n\n this.forwardPathCalculations = forwardPathCalculations;\n this.backwardPathCalculations = backwardPath.calculations;\n\n const { totalFloatMap, freeFloatMap } = await this.calculateFloatsAsync(\n forwardPath,\n backwardPath,\n isCurrent\n );\n\n if (!isCurrent()) return false;\n\n this.totalFloat = totalFloatMap;\n this.freeFloat = freeFloatMap;\n this.gantt.refreshData();\n return true;\n } catch (error) {\n Sentry.captureException(error, {\n tags: { module: 'critical-path' },\n extra: {\n calculationId,\n activitiesCount: this.forwardPathCalculations?.size || 0\n }\n });\n return false;\n }\n }\n\n async calculateFloatsAsync(forward, backward, isCurrent) {\n try {\n const projectDates = this.gantt.getSubtaskDates();\n const activityIds = Array.from(this.forwardPathCalculations.keys());\n\n return await processActivityFloats({\n activityIds,\n forward,\n backward,\n gantt: this.gantt,\n projectDates,\n isCurrent\n });\n } catch (error) {\n Sentry.captureException(error, {\n tags: { module: 'critical-path-floats' },\n extra: {\n activitiesCount: this.forwardPathCalculations?.size || 0\n }\n });\n return { totalFloatMap: new Map(), freeFloatMap: new Map() };\n }\n }\n}\n\nexport default CriticalPath;\n","/**\n * Adapter gantt → schedule-core para el port LITERAL del critical path.\n *\n * El motor legacy (`legacy/`) habla con un objeto \"gantt\" DHTMLX: `getTask`,\n * `getCalendar`, `getLink`, `getChildren`, `eachTask`, `getSubtaskDates`,\n * `config.hoursPerDay`, `refreshData`, `fullyParsed`. Este adapter expone esa\n * superficie sobre el `ScheduleState` del core, sin tocar el algoritmo.\n *\n * El calendario legacy usa args-objeto (`calculateEndDate({start_date, duration,\n * unit})`, `$gantt.getClosestWorkTime({date, dir, unit})`) mientras el\n * `CalendarAPI` del core es posicional (`calculateEndDate(start, hours)`,\n * `getClosestWorkTime({date, direction, unit})`). El wrapper traduce las firmas.\n */\nimport { yieldToBrowser } from '../shared/timing.js';\nimport type { CalendarAPI, CalendarReader } from '../calendar/api.js';\nimport type {\n ActivityId,\n EngineActivitySnapshot,\n LinkId,\n LinkSnapshot\n} from '../autoscheduler/types.js';\n\n/** Calendario con la forma que el motor legacy espera. */\ninterface LegacyCalendar {\n calculateEndDate(args: {\n start_date: Date;\n duration: number;\n unit?: string;\n }): Date;\n calculateDuration(args: {\n start_date: Date;\n end_date: Date;\n unit?: string;\n }): number;\n getWorkHours(date: Date): string[];\n /** El legacy alcanza getClosestWorkTime vía `calendar.$gantt`. */\n $gantt: {\n getClosestWorkTime(args: {\n date: Date;\n dir: 'future' | 'past';\n unit?: string;\n }): Date;\n };\n}\n\n/** Lo mínimo del ScheduleState que el adapter consume. */\nexport interface GanttAdapterState {\n forEachActivity(\n cb: (activity: EngineActivitySnapshot, id: ActivityId) => void\n ): void;\n getActivity(id: ActivityId): EngineActivitySnapshot | null;\n getLink(id: LinkId): LinkSnapshot | null;\n getChildren(parentId: ActivityId): ActivityId[];\n getAllActivities(): ReadonlyArray<EngineActivitySnapshot>;\n calendarReader: CalendarReader;\n}\n\n/**\n * Task con la forma que el motor legacy lee: ids NUMÉRICOS (el legacy hace\n * `Number(activity.parent)` / `Number(link.source)`) + `$level` (profundidad en\n * el árbol, DHTMLX). El core usa ids string; este es el shape traducido que\n * alimenta al verbatim — un tipo honesto en vez de castear `EngineActivitySnapshot`.\n */\nexport type LegacyTask = Omit<EngineActivitySnapshot, 'id' | 'parent'> & {\n id: number;\n parent: number;\n $level: number;\n};\n\n/** Link con ids numéricos (el legacy hace `Number(link.source)`). */\nexport type LegacyLink = Omit<LinkSnapshot, 'source' | 'target'> & {\n source: number;\n target: number;\n};\n\n/** Envuelve un `CalendarAPI` del core en la forma del calendario legacy. */\nfunction toLegacyCalendar(api: CalendarAPI): LegacyCalendar {\n return {\n calculateEndDate: ({ start_date, duration }) =>\n api.calculateEndDate(start_date, duration),\n calculateDuration: ({ start_date, end_date }) =>\n api.calculateDuration(start_date, end_date),\n getWorkHours: (date) => api.getWorkHours(date),\n $gantt: {\n getClosestWorkTime: ({ date, dir, unit }) =>\n api.getClosestWorkTime({\n date,\n direction: dir,\n unit: (unit as 'hour') ?? 'hour'\n })\n }\n };\n}\n\n/**\n * `$level` (profundidad en el árbol DHTMLX) por id: 0 en la raíz, +1 por nivel.\n * El snapshot del core no lo trae. Recursivo con cache + guard de ciclos\n * (un ciclo corta en nivel 0 para no colgar).\n */\nexport function computeLevels(state: GanttAdapterState): Map<string, number> {\n const activitiesById = new Map<string, EngineActivitySnapshot>();\n state.forEachActivity((activity, id) =>\n activitiesById.set(String(id), activity)\n );\n\n const levelById = new Map<string, number>();\n const resolveLevel = (id: string, guard: Set<string>): number => {\n const cached = levelById.get(id);\n if (cached != null) return cached;\n const activity = activitiesById.get(id);\n const parent = activity ? (activity.parent as ActivityId | 0) : 0;\n const isRoot = parent === 0 || parent === '0' || parent == null;\n let level = 0;\n if (!isRoot && !guard.has(id)) {\n guard.add(id);\n level = resolveLevel(String(parent), guard) + 1;\n }\n levelById.set(id, level);\n return level;\n };\n\n for (const id of activitiesById.keys()) resolveLevel(id, new Set());\n return levelById;\n}\n\n/**\n * Tasks del core traducidos a `LegacyTask` (ids numéricos + `$level`), indexados\n * por id string. El legacy indexa `calculations` por el id del task y lee\n * `Number(parent)` / `Number(link.source)`; numberizar acá hace que ambos lados\n * coincidan. (`$target`/`$source` son arrays de link-ids; se dejan intactos.)\n */\nexport function toLegacyTasks(\n state: GanttAdapterState\n): Map<string, LegacyTask> {\n const levelById = computeLevels(state);\n const leveled = new Map<string, LegacyTask>();\n state.forEachActivity((activity, id) => {\n const key = String(id);\n leveled.set(key, {\n ...activity,\n id: Number(id),\n parent: Number(activity.parent),\n $level: levelById.get(key) ?? 0\n });\n });\n return leveled;\n}\n\n/**\n * Orden de árbol (DFS pre-order: padre, luego sus hijos recursivamente) — replica\n * el `eachTask` de DHTMLX. El legacy depende de este orden para registrar\n * `singleParents.childrens` (ver nota en `createGanttAdapter`). Las raíces son\n * `parent === 0`. Huérfanos/ciclos se appendean al final (defensa: nunca perder\n * un task del set).\n */\nexport function orderByTree(leveled: Map<string, LegacyTask>): LegacyTask[] {\n const childrenByParent = new Map<number, LegacyTask[]>();\n for (const task of leveled.values()) {\n const siblings = childrenByParent.get(task.parent);\n if (siblings) siblings.push(task);\n else childrenByParent.set(task.parent, [task]);\n }\n\n const ordered: LegacyTask[] = [];\n const seen = new Set<LegacyTask>();\n\n // Iterative pre-order DFS with an explicit stack — a self-recursive `visit`\n // here blows the JS call stack once tree depth exceeds ~10k (measured:\n // `RangeError: Maximum call stack size exceeded`), and this runs at load on\n // the whole tree. Children are pushed in reverse so they pop left-to-right,\n // reproducing the recursive pre-order byte-for-byte. `singleParents.childrens`\n // in the legacy engine depends on this exact order (see `createGanttAdapter`).\n const stack: LegacyTask[] = [];\n const pushChildrenReversed = (nodes: LegacyTask[] | undefined): void => {\n if (!nodes) return;\n for (let index = nodes.length - 1; index >= 0; index -= 1) {\n stack.push(nodes[index]!);\n }\n };\n pushChildrenReversed(childrenByParent.get(0)); // raíces (parent '0' → Number → 0)\n while (stack.length > 0) {\n const node = stack.pop()!;\n if (seen.has(node)) continue;\n seen.add(node);\n ordered.push(node);\n pushChildrenReversed(childrenByParent.get(node.id));\n }\n\n if (ordered.length < leveled.size) {\n for (const task of leveled.values())\n if (!seen.has(task)) ordered.push(task);\n }\n return ordered;\n}\n\n/** {start_date, end_date} del proyecto = min(start)/max(end) sobre el árbol. */\nexport function projectBounds(state: GanttAdapterState): {\n start_date: Date;\n end_date: Date;\n} {\n let min: number | null = null;\n let max: number | null = null;\n state.forEachActivity((activity) => {\n if (activity.start_date) {\n const start = activity.start_date.getTime();\n min = min == null ? start : Math.min(min, start);\n }\n if (activity.end_date) {\n const end = activity.end_date.getTime();\n max = max == null ? end : Math.max(max, end);\n }\n });\n return { start_date: new Date(min ?? 0), end_date: new Date(max ?? 0) };\n}\n\nexport interface GanttLikeAdapter {\n fullyParsed: boolean;\n config: { hoursPerDay: number };\n getTask(id: ActivityId): LegacyTask | null;\n getLink(id: LinkId): LegacyLink | null;\n getCalendar(calendarId: ActivityId | null): LegacyCalendar;\n getChildren(parentId: ActivityId): number[];\n eachTask(cb: (activity: LegacyTask) => void): void;\n /** Todos los tasks ordenados por tiempo (DHTMLX `getTaskByTime()` sin args). */\n getTaskByTime(): LegacyTask[];\n getSubtaskDates(): { start_date: Date; end_date: Date };\n refreshData(): void;\n}\n\n/**\n * Construye el adapter gantt-like sobre el ScheduleState del core.\n *\n * Async porque encadena varias pasadas O(N) (projectBounds, toLegacyTasks,\n * sort, orderByTree) que, sin ceder, formaban un bloque sincrónico de ~0.8s a\n * 100k. Cede el hilo entre pasadas (no-op en Node). Ver PERFORMANCE.md §100k.\n */\nexport async function createGanttAdapter(\n state: GanttAdapterState,\n hoursPerDay: number\n): Promise<GanttLikeAdapter> {\n const calendarCache = new Map<string, LegacyCalendar>();\n const resolveCalendar = (calendarId: ActivityId | null): LegacyCalendar => {\n const key = calendarId == null ? '__default__' : String(calendarId);\n const cached = calendarCache.get(key);\n if (cached) return cached;\n // The reader falls back to the default calendar for unknown ids, so it\n // never returns null here (the `!` reflects that invariant).\n const api = state.calendarReader.getCalendar(String(calendarId))!;\n const legacy = toLegacyCalendar(api);\n calendarCache.set(key, legacy);\n return legacy;\n };\n\n const bounds = projectBounds(state);\n await yieldToBrowser();\n const leveled = toLegacyTasks(state);\n await yieldToBrowser();\n const byTime = [...leveled.values()].sort(\n (a, b) => (a.start_date?.getTime() ?? 0) - (b.start_date?.getTime() ?? 0)\n );\n await yieldToBrowser();\n // `eachTask` debe entregar en ORDEN DE ÁRBOL (padre antes que sus hijos), igual\n // que el `eachTask` de DHTMLX (DFS pre-order). El motor legacy arma\n // `singleParents.childrens` empujando cada hijo a su padre SOLO si el padre ya\n // fue registrado en esta pasada (`generic-calculations.js:140-143`); con el orden\n // de inserción del snapshot (no garantiza padre-antes-que-hijo) un padre cuyos\n // hijos se iteran antes queda con `childrens:[]` y el cálculo de padre-con-links\n // crashea (`calculationOfParent.js:140`, lee `.es` de un array vacío) → todo el CP\n // devuelve vacío. Reordenar acá (no en el verbatim) alimenta el grafo bien.\n const treeOrdered = orderByTree(leveled);\n\n return {\n fullyParsed: true,\n config: { hoursPerDay },\n getTask: (id) => leveled.get(String(id)) ?? null,\n getLink: (id) => {\n const link = state.getLink(id);\n if (!link) return null;\n // ids numéricos, igual que getTask (el legacy hace Number(link.source)).\n return {\n ...link,\n source: Number(link.source),\n target: Number(link.target)\n };\n },\n getCalendar: resolveCalendar,\n getChildren: (parentId) =>\n state.getChildren(parentId).map((childId) => Number(childId)),\n eachTask: (cb) => {\n for (const task of treeOrdered) cb(task);\n },\n getTaskByTime: () => byTime,\n getSubtaskDates: () => bounds,\n refreshData: () => {}\n };\n}\n","/**\n * Entry del port LITERAL del critical path: corre el motor legacy (`legacy/`)\n * contra el adapter gantt→core, ESCRIBE los 7 campos de CP en cada actividad y\n * devuelve un `CriticalPathResult` por id. UNA sola pasada: computa, escribe (vía\n * `setActivityField` → write-capture → ChangeSet) y colecta el resultado en el\n * mismo loop. El Map devuelto lo consume el test de paridad; producción usa las\n * escrituras. El algoritmo es el legacy verbatim; aquí solo se inyecta el adapter\n * y se recogen sus mapas (`forwardPathCalculations`, `backwardPathCalculations`,\n * `totalFloat`, `freeFloat`).\n */\n// @ts-expect-error — legacy JS sin tipos (port literal)\nimport CriticalPath from './legacy/index.js';\nimport { yieldToBrowser } from '../shared/timing.js';\nimport { createGanttAdapter } from './gantt-adapter.js';\n\n// Yield to the browser every this many field-writes so the 7-field write of a\n// 100k-activity CP result never becomes one multi-hundred-ms synchronous block.\n// ~1000 writes ≈ one frame's worth of work; a no-op in Node (yieldToBrowser).\nconst CP_WRITE_YIELD_EVERY = 1000;\nimport type { ActivityWriter, CalendarOps } from '../internal/state/roles.js';\nimport type { ActivityId } from '../autoscheduler/types.js';\n\nexport interface CriticalPathResult {\n earlyStart: Date | null;\n earlyFinish: Date | null;\n lateStart: Date | null;\n lateFinish: Date | null;\n totalSlack: number | null;\n freeSlack: number | null;\n isCritical: boolean;\n}\n\n/**\n * Corre el critical path legacy, escribe los 7 campos en cada actividad y\n * devuelve el `CriticalPathResult` por id. Una sola pasada (computa + escribe +\n * colecta). Las escrituras van por `setActivityField` para que los 7 campos\n * entren al write-capture journal y se folden en un ChangeSet repintable\n * (`assembleChangeSet` → `peekWriteCapture`). `is_critical = totalSlack <= 0` Y\n * la actividad NO completa (regla legacy del pillar, sin epsilon).\n */\nexport async function applyCriticalPathAtLoad(\n state: ActivityWriter & CalendarOps,\n hoursPerDay: number\n): Promise<Map<ActivityId, CriticalPathResult>> {\n const gantt = await createGanttAdapter(state, hoursPerDay);\n const criticalPath = new CriticalPath(gantt);\n const calculated = await criticalPath.calculate(gantt);\n\n const results = new Map<ActivityId, CriticalPathResult>();\n if (!calculated) return results;\n\n const forward = criticalPath.forwardPathCalculations as Map<\n ActivityId,\n { es: Date; ef: Date }\n > | null;\n const backward = criticalPath.backwardPathCalculations as Map<\n ActivityId,\n { ls: Date; lf: Date }\n > | null;\n const totalFloat = criticalPath.totalFloat as Map<ActivityId, number>;\n // El motor guarda freeFloat como objeto {activityFreeFloat, linksFreeFloat};\n // el valor de la actividad (= freeSlack que muestra prod) es activityFreeFloat.\n const freeFloat = criticalPath.freeFloat as Map<\n ActivityId,\n { activityFreeFloat: number; linksFreeFloat: Record<string, number> }\n >;\n\n // El backward pass puede devolver fechas envueltas en el shim de moment;\n // `new Date(value)` las normaliza (via valueOf) igual que un Date real.\n const toDate = (value: unknown): Date | null =>\n value == null ? null : new Date(value as number);\n\n // El motor legacy indexa por id numérico; el resto del core usa string.\n const activityIds = new Set<ActivityId>([...(forward?.keys() ?? [])]);\n let sinceYield = 0;\n for (const activityId of activityIds) {\n // Cooperative yield: the write loop itself is O(N) and, unlike the engine\n // passes, did not yield — one uninterrupted block that froze the UI at 100k.\n if (++sinceYield >= CP_WRITE_YIELD_EVERY) {\n sinceYield = 0;\n await yieldToBrowser();\n }\n const activity = state.getActivity(activityId);\n if (!activity) continue;\n const forwardCalc = forward?.get(activityId);\n const backwardCalc = backward?.get(activityId);\n const totalSlack = totalFloat.get(activityId);\n // Regla de criticidad del pillar (setupCriticalPathPillar.js:44-48):\n // crítica si totalFloat <= 0 Y la actividad NO está completa; las\n // actividades con progress === 100 nunca son críticas.\n const progress = Number(activity.progress ?? 0);\n const result: CriticalPathResult = {\n earlyStart: toDate(forwardCalc?.es),\n earlyFinish: toDate(forwardCalc?.ef),\n lateStart: toDate(backwardCalc?.ls),\n lateFinish: toDate(backwardCalc?.lf),\n totalSlack: totalSlack ?? null,\n freeSlack: freeFloat.get(activityId)?.activityFreeFloat ?? null,\n isCritical: progress < 100 && totalSlack != null && totalSlack <= 0\n };\n\n // Computar, escribir y colectar en la MISMA pasada (no un loop aparte).\n // Un solo bulk write (getActivity + note una vez) en vez de 7 setActivityField.\n // is_critical persists as the DHTMLX string ('Si'/'No'), not a boolean.\n const key = String(activityId) as ActivityId;\n results.set(key, result);\n state.setActivityFields(key, {\n earlyStart: result.earlyStart,\n earlyFinish: result.earlyFinish,\n lateStart: result.lateStart,\n lateFinish: result.lateFinish,\n totalSlack: result.totalSlack,\n freeSlack: result.freeSlack,\n is_critical: result.isCritical ? 'Si' : 'No'\n });\n }\n return results;\n}\n","import type { BaselinePoint } from '../../types.js';\n\n/**\n * Returns the ACTIVE baseline point of an activity, or null.\n *\n * Ported verbatim from the legacy selector used across the schedule\n * (`react_client/src/views/ganttContainer/gantt/gantt.helper.js`\n * calculatePonderators / getDurationRecursively, and the baseline columns\n * `startBaseCol`…`durationBaseCol`):\n *\n * activity.baseline_points.find(b => b.sectorbaselineversion?.active)\n *\n * Exactly one version per sector is active. Returns null when the activity\n * has no `baseline_points`, an empty array, or no point whose version is\n * active — matching the legacy behavior where such activities get\n * `ponderator = 0` (baseline-only, no fallback to real values; see memory\n * `project_ponderator_baseline_fix`).\n *\n * The `active` flag is treated as truthy (not strictly `=== true`) to match\n * the legacy `if (base.sectorbaselineversion.active)` check.\n */\nexport function getActiveBaseline(\n activity: { baseline_points?: unknown } | null | undefined\n): BaselinePoint | null {\n const points = activity?.baseline_points;\n if (!Array.isArray(points) || points.length === 0) return null;\n return points.find((p) => Boolean(p?.sectorbaselineversion?.active)) ?? null;\n}\n","import type { ActivityWriter } from '../../internal/state/roles.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { getActiveBaseline } from '../shared/get-active-baseline.js';\n\n/**\n * `real_cost` (earned cost): leaf = `(progress/100) × activeBaseline.cost`\n * (0 without an active baseline), parent = `Σ child.real_cost`. Faithful to\n * legacy `updateExpectedGlobal` (real_cost branch). `progress` is the frozen\n * backend value; no calendar / scheduled dates involved. Post-order walk.\n */\nexport function emitRealCost(state: ActivityWriter): string[] {\n const rootIds: string[] = [];\n const changed: string[] = [];\n state.forEachActivity((activity, activityId) => {\n if (\n activity.parent === 0 ||\n activity.parent === '0' ||\n activity.parent == null\n )\n rootIds.push(String(activityId));\n });\n const visit = (activityId: string): number => {\n const activity = state.getActivity(String(activityId)) as unknown as Record<\n string,\n unknown\n > | null;\n if (!activity) return 0;\n const childIds = [...state.getChildren(String(activityId))];\n let value: number;\n if (childIds.length === 0) {\n const active = getActiveBaseline(\n activity as unknown as { baseline_points?: never }\n );\n const cost = active ? Number(active.cost) || 0 : 0;\n const progress = Number(activity.progress) || 0;\n value = (progress / 100) * cost;\n } else {\n let childrenTotal = 0;\n for (const childId of childIds) childrenTotal += visit(String(childId));\n value = childrenTotal;\n }\n state.setActivityField(String(activityId), COLUMN.REAL_COST, value);\n changed.push(String(activityId));\n return value;\n };\n for (const activityId of rootIds) visit(activityId);\n return changed;\n}\n","import type { DispatchAction } from '../../dispatch/types.js';\n\n/**\n * Dispatch kinds that, in production (legacy DHTMLX), leave the critical path\n * (totalSlack / freeSlack / lateStart / lateFinish / earlyStart / earlyFinish /\n * is_critical) STALE rather than recomputing it.\n *\n * A pure structural reparent (`activity-outdent`) is performed via\n * `gantt.moveTask` (gantt-general-config.js `actions.outdent`), which fires only\n * the tree-move events `onBeforeTaskMove`/`onAfterTaskMove`. Legacy's\n * auto-scheduling extension binds `autoSchedule()` exclusively to link\n * add/update/delete, `onParse` (schedule_on_parse) and the date/constraint-gated\n * `onAfterTaskUpdate` — NEVER to `onAfterTaskMove`, `onRowDragEnd` or\n * `onAfterTaskAdd` (verified against @dhx/gantt 9.1.3 runtime). The CPM recompute\n * (`gantt.calculateAsyncCriticalPath`) runs ONLY inside `criticalPathRefresh`,\n * reachable solely via `onAfterAutoSchedule → refreshCriticalPath`. Therefore a\n * pure outdent never recomputes the CPM in prod; the recorded oracle keeps the\n * pre-outdent value (every recording emits `critical-path-recalc` only after a\n * date/duration/constraint/link edit, never after the outdent — Item B / D3-#2,\n * reading (ii), MORNING_QUEUE.md). The core must leave it stale to match.\n *\n * `activity-indent` shares this exactly (added 2026-06-21, MORNING_QUEUE.md —\n * JUN-18): legacy's `actions.indent` (gantt-general-config.js) also runs purely\n * through `gantt.moveTask` (`onBeforeTaskMove`/`onAfterTaskMove` + a slack-cache\n * drop, never a CPM recompute), so the recorder-juneau-17312 oracle keeps the\n * new summary parent's CPM fields STALE at their pre-indent leaf values\n * (earlyStart 06-11 even predates the parent's own re-rolled start_date 06-13).\n *\n * This is the CPM analogue of `STRUCTURAL_KINDS_LEAVING_EXPECTED_PROGRESS_STALE`\n * (D4) and shares the same scope rationale: only the PROVEN structural reparents\n * (`activity-outdent`, `activity-indent`).\n *\n * Lives with the critical-path column (column-owns-everything): the dispatch\n * gate (`post-mutation.ts`) consults it but the rule is the CP column's own.\n */\nexport const STRUCTURAL_KINDS_LEAVING_CRITICAL_PATH_STALE: ReadonlySet<\n DispatchAction['kind']\n> = new Set(['activity-outdent', 'activity-indent']);\n","import type { DispatchAction } from '../../dispatch/types.js';\n\n/**\n * Dispatch kinds that, in production (legacy DHTMLX), leave `expected_progress`\n * STALE rather than recomputing it. A structural reparent (`activity-outdent`)\n * updates the moved activity's bounds + correlatives (its own handler does that)\n * but legacy's rollup never re-derives `expected_progress` for the affected\n * ancestors on the reparent — the recorded oracle keeps the pre-outdent value\n * byte-identical before and after the gesture (MORNING_QUEUE.md — D4). The core\n * therefore must NOT run the expected_progress pass for these kinds, otherwise\n * the post-reparent (now mismatched) ponderator weights over-accumulate the\n * summaries' `expected_progress` past the stale legacy value.\n *\n * Scoped to the PROVEN cases (`activity-outdent`, `activity-indent`).\n * `activity-indent` was added 2026-06-21 (MORNING_QUEUE.md — JUN-18): the\n * recorder-juneau-17312 oracle leaves the new summary parent's\n * `expected_progress` STALE at its pre-indent leaf value (oracle 100 vs the\n * core's fresh 0) — legacy's pure-reparent path (gantt-general-config.js\n * `actions.indent`, via `gantt.moveTask`) fires no `autoSchedule()` /\n * `onAfterAutoSchedule`, so the live expected_progress is never re-derived.\n * `activity-move` / reparenting `activity-delete` MAY share this staleness, but\n * are only added here once a recording proves it (none yet). Progress edits\n * (`activity-set-progress`, progress-affecting `inline-edit`) are deliberately\n * EXCLUDED — they MUST recompute `expected_progress`.\n *\n * Lives with the column (column-owns-everything): the dispatch gate\n * (`post-mutation.ts`) consults it but the rule is the expected_progress\n * column's own knowledge.\n */\nexport const STRUCTURAL_KINDS_LEAVING_EXPECTED_PROGRESS_STALE: ReadonlySet<\n DispatchAction['kind']\n> = new Set(['activity-outdent', 'activity-indent']);\n","import type { DispatchAction, DispatchOptions } from '../types.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { STRUCTURAL_KINDS_LEAVING_CRITICAL_PATH_STALE } from '../../columns/critical-path/recompute-policy.js';\nimport { STRUCTURAL_KINDS_LEAVING_EXPECTED_PROGRESS_STALE } from '../../columns/expected-progress/recompute-policy.js';\n\n/**\n * Inline-edit columns that are PURELY non-scheduling — pure data/display values\n * that never feed dates, duration or the critical-path inputs, so legacy never\n * fires `gantt.autoSchedule()` / `onAfterAutoSchedule` on their edit and the\n * core must NOT re-derive CPM / live expected_progress for them. Otherwise a\n * later edit of one of these would resurrect a value an indent/outdent left\n * stale (MORNING_QUEUE.md — JUN-18: a `text` rename of the indented child\n * re-derived the new summary parent's stale CPM/expected_progress).\n *\n * A DENY-list (not an allow-list) is deliberate: every scheduling-relevant\n * column — start_date/end_date/duration/hh_work_time (dates), constraint_type/\n * constraint_date/calendar_id (autoschedule), and `progress` (the `is_critical`\n * formula reads progress) — keeps its prior always-recompute behavior, so only\n * these few data columns change. Mirrors the legacy `onAfterAutoSchedule` set.\n */\nexport const NON_SCHEDULING_INLINE_COLUMNS: ReadonlySet<string> = new Set([\n COLUMN.TEXT,\n COLUMN.DESCRIPTION,\n COLUMN.COST,\n COLUMN.USED_COST,\n COLUMN.CUSTOM_ID,\n COLUMN.RESPONSABLES,\n COLUMN.SUBCONTRACT_ID,\n COLUMN.TAGS\n]);\n\nconst PROP_ONLY_KINDS: ReadonlySet<DispatchAction['kind']> = new Set([\n 'selection-toggle',\n 'selection-replace',\n 'visibility-set',\n 'sir-sync'\n]);\n\nfunction editsOnlyNonSchedulingColumns(action: DispatchAction): boolean {\n if (action.kind === 'inline-edit') {\n return NON_SCHEDULING_INLINE_COLUMNS.has(action.column);\n }\n if (action.kind === 'bulk-edit') {\n return action.edits.every((edit) =>\n NON_SCHEDULING_INLINE_COLUMNS.has(edit.column)\n );\n }\n return false;\n}\n\nfunction isSchedulingDispatch(\n action: DispatchAction,\n structuralStaleKinds: ReadonlySet<DispatchAction['kind']>\n): boolean {\n if (PROP_ONLY_KINDS.has(action.kind)) return false;\n if (structuralStaleKinds.has(action.kind)) return false;\n if (editsOnlyNonSchedulingColumns(action)) return false;\n return true;\n}\n\nexport function resolveRunCriticalPath(action: DispatchAction): boolean {\n return isSchedulingDispatch(\n action,\n STRUCTURAL_KINDS_LEAVING_CRITICAL_PATH_STALE\n );\n}\n\nexport function resolveRunExpectedProgress(action: DispatchAction): boolean {\n return isSchedulingDispatch(\n action,\n STRUCTURAL_KINDS_LEAVING_EXPECTED_PROGRESS_STALE\n );\n}\n\n/**\n * Does this dispatch change an activity's `progress`? `real_cost` is a pure\n * function of `progress` and the (fixed) active-baseline cost, so it only needs\n * re-deriving when `progress` moved: an inline `progress` edit, or a\n * complete/uncomplete (`activity-set-progress`, which sets progress 0/100 and\n * cascades to descendants + ancestors). Every other dispatch leaves `real_cost`\n * unchanged (a `cost` edit changes the BUDGET, not the baseline cost the earned\n * figure is derived from — mirror of legacy, where `updateExpectedGlobal` runs\n * from the progress `onEditEnd`, not the cost one).\n */\nexport function dispatchChangesProgress(action: DispatchAction): boolean {\n if (action.kind === 'activity-set-progress') return true;\n if (action.kind === 'inline-edit') return action.column === COLUMN.PROGRESS;\n if (action.kind === 'bulk-edit') {\n return action.edits.some((edit) => edit.column === COLUMN.PROGRESS);\n }\n return false;\n}\n\nexport function resolveRunRealCost(action: DispatchAction): boolean {\n return resolveRunExpectedProgress(action) && dispatchChangesProgress(action);\n}\n\n/**\n * Columns whose edit rolls the parent's weighted progress up to ancestors.\n * Mirrors the legacy allow-list driving `check_progress` / `updateParentDuration`\n * (`['progress','hhWorkTime','duration','cost','used_cost','real_cost']`).\n * Editing any other column (start_date, end_date, constraint_date,\n * calendar_id, …) leaves the parent progress FROZEN at its stored value.\n */\nconst PROGRESS_AFFECTING_COLUMNS: ReadonlySet<string> = new Set([\n COLUMN.PROGRESS,\n COLUMN.HH_WORK_TIME,\n COLUMN.DURATION,\n COLUMN.COST,\n COLUMN.USED_COST,\n COLUMN.REAL_COST\n]);\n\n/**\n * Decides whether a dispatch should recompute ancestor `progress` from\n * children. Legacy only recomputes parent progress on the complete/uncomplete\n * buttons (`activity-set-progress`) and on inline edits of a progress-affecting\n * column. Date / constraint / calendar / structural dispatches PRESERVE the\n * parent's stored progress (frozen — matching the backend/oracle value).\n */\nexport function shouldRecomputeParentProgress(action: DispatchAction): boolean {\n if (action.kind === 'activity-set-progress') return true;\n if (action.kind === 'inline-edit') {\n return PROGRESS_AFFECTING_COLUMNS.has(action.column);\n }\n // Bulk edits mirror the inline-edit policy in aggregate: any edit on a\n // progress-affecting column rolls the weighted progress up to ancestors.\n if (action.kind === 'bulk-edit') {\n return action.edits.some((edit) =>\n PROGRESS_AFFECTING_COLUMNS.has(edit.column)\n );\n }\n return false;\n}\n\nconst LINK_EDIT_INLINE_COLUMNS: ReadonlySet<string> = new Set([\n COLUMN.CUSTOM_PREDECESSORS,\n COLUMN.CUSTOM_SUCESSORS\n]);\n\nfunction isLinkColumnsInlineEdit(action: DispatchAction): boolean {\n return (\n action.kind === 'inline-edit' && LINK_EDIT_INLINE_COLUMNS.has(action.column)\n );\n}\n\nexport interface AutoScheduleOutcome {\n requested: boolean;\n ran: boolean;\n}\n\n/**\n * The derived propagations that run after a mutation, in the fixed order\n * `post-mutation.ts` consumes them. A single vocabulary for everything that\n * propagates: the autoscheduler, the parent rollups, the milestone mirrors,\n * and the load-style recomputes (expected progress + status, real cost,\n * critical path). `resolveDerivedPasses` is the one place that decides which\n * of these run for a given dispatch.\n */\nexport const DERIVED_PASS = {\n AUTOSCHEDULE: 'autoschedule',\n PARENT_BOUNDS: 'parent-bounds',\n PARENT_PROGRESS: 'parent-progress',\n REAL_WORK: 'real-work',\n MILESTONE_MIRROR_ANCESTORS: 'milestone-mirror-ancestors',\n MILESTONE_MIRROR_GLOBAL: 'milestone-mirror-global',\n EXPECTED_PROGRESS: 'expected-progress',\n REAL_COST: 'real-cost',\n CRITICAL_PATH: 'critical-path'\n} as const;\n\nexport type DerivedPass = (typeof DERIVED_PASS)[keyof typeof DERIVED_PASS];\n\n/**\n * Re-stamp `for_disable_milestone_duration` on the dirty ancestors during the\n * bounds rollup. Skipped only when an indent leaves the mirror deliberately\n * stale (JUN-18), and — for inline/bulk edits — only when the pipeline asked\n * for an autoschedule (a non-date-moving edit must not overwrite a stale value).\n */\nfunction stampsMilestoneMirrorOnAncestors(\n action: DispatchAction,\n autoSchedule: AutoScheduleOutcome\n): boolean {\n if (isLinkColumnsInlineEdit(action)) return true;\n if (action.kind === 'activity-indent') return false;\n const isColumnEdit =\n action.kind === 'inline-edit' || action.kind === 'bulk-edit';\n if (isColumnEdit) return autoSchedule.requested;\n return true;\n}\n\n/**\n * Re-stamp `for_disable_milestone_duration = duration` for the WHOLE tree\n * (legacy `reloadDuration` inside `onAfterAutoSchedule`). Only the paths that\n * fire a real `gantt.autoSchedule()` in legacy — column edits, set-progress,\n * delete — AND only when an autoschedule actually ran this dispatch. The pure\n * reparents (indent/outdent) never fire it (JUN-18/JUN-14).\n */\nfunction restampsMilestoneMirrorGlobally(\n action: DispatchAction,\n autoSchedule: AutoScheduleOutcome\n): boolean {\n if (isLinkColumnsInlineEdit(action)) return false;\n const firesLegacyAutoSchedule =\n action.kind === 'activity-delete' ||\n action.kind === 'activity-set-progress' ||\n action.kind === 'inline-edit' ||\n action.kind === 'bulk-edit';\n return firesLegacyAutoSchedule && autoSchedule.ran;\n}\n\n/**\n * THE single decision point: which derived passes run for this dispatch.\n * Returns the set of `DERIVED_PASS` keywords; `post-mutation.ts` runs them in\n * its fixed order, gating each step on `has(...)`. The only runtime inputs\n * beyond the action are the autoschedule outcome (did it run?) and the caller's\n * `skip*` options — everything else is a pure function of the action.\n */\nexport function resolveDerivedPasses(\n action: DispatchAction,\n autoSchedule: AutoScheduleOutcome,\n options: DispatchOptions\n): ReadonlySet<DerivedPass> {\n const passes = new Set<DerivedPass>();\n\n if (autoSchedule.ran) passes.add(DERIVED_PASS.AUTOSCHEDULE);\n passes.add(DERIVED_PASS.PARENT_BOUNDS);\n if (shouldRecomputeParentProgress(action)) {\n passes.add(DERIVED_PASS.PARENT_PROGRESS);\n }\n if (dispatchChangesProgress(action)) passes.add(DERIVED_PASS.REAL_WORK);\n if (stampsMilestoneMirrorOnAncestors(action, autoSchedule)) {\n passes.add(DERIVED_PASS.MILESTONE_MIRROR_ANCESTORS);\n }\n if (restampsMilestoneMirrorGlobally(action, autoSchedule)) {\n passes.add(DERIVED_PASS.MILESTONE_MIRROR_GLOBAL);\n }\n\n // The load-style recomputes are additionally suppressed by skipAutoSchedule\n // (they share the write-capture window with the autoscheduler).\n const runsLoadRecomputes = !options.skipAutoSchedule;\n if (runsLoadRecomputes && resolveRunExpectedProgress(action)) {\n passes.add(DERIVED_PASS.EXPECTED_PROGRESS);\n }\n if (runsLoadRecomputes && resolveRunRealCost(action)) {\n passes.add(DERIVED_PASS.REAL_COST);\n }\n const runsCriticalPath =\n runsLoadRecomputes &&\n resolveRunExpectedProgress(action) &&\n resolveRunCriticalPath(action) &&\n !options.skipCriticalPath;\n if (runsCriticalPath) passes.add(DERIVED_PASS.CRITICAL_PATH);\n\n return passes;\n}\n","import type { ScheduleState } from '../../internal/state/schedule-state.js';\nimport type {\n ScheduleOptions,\n ScheduleResult\n} from '../../autoscheduler/types.js';\nimport { applyResults } from '../../autoscheduler/index.js';\nimport {\n updateParentBoundsFromChildren,\n restampMilestoneDurationMirror\n} from '../../internal/post-processors/runner.js';\nimport {\n collectDirtyForStructural,\n structuredCloneActivity\n} from './snapshots.js';\nimport type { DispatchAction, DispatchOptions } from '../types.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\nimport type { ActivityId, SectorMetadata } from '../../types.js';\nimport { applyExpectedProgressLive } from '../../init/initial-passes.js';\nimport { applyStatusPass } from '../../columns/status/compute.js';\nimport { applyCriticalPathAtLoad } from '../../critical-path/run-critical-path.js';\nimport { emitRealCost } from '../../propagations/upward/real-cost.js';\nimport { DERIVED_PASS, resolveDerivedPasses } from './derived-passes.js';\nimport type { DerivedPass } from './derived-passes.js';\n\ntype AutoscheduleFrom = ActivityId | 'roots' | null;\n\nexport interface PostMutationDeps {\n adapter: ScheduleState;\n scheduler: {\n schedule(options?: ScheduleOptions): Promise<ScheduleResult>;\n };\n sector: SectorMetadata;\n}\n\nexport interface PostMutationArgs {\n action: DispatchAction;\n autoscheduleFrom: AutoscheduleFrom;\n recomputeParentsFrom: Iterable<ActivityId | string>;\n collectDirty?: (scheduledIds: readonly string[]) => Set<ActivityId>;\n now: Date | null;\n options: DispatchOptions;\n}\n\ninterface ScheduleOutcome {\n scheduledIds: string[];\n scheduledBeforeImages: Map<string, EngineActivitySnapshot>;\n}\n\nexport async function runPostMutation(\n deps: PostMutationDeps,\n args: PostMutationArgs\n): Promise<ScheduleOutcome> {\n const passes = resolvePasses(args);\n\n const schedule = passes.has(DERIVED_PASS.AUTOSCHEDULE)\n ? await runAutoschedule(deps, args.autoscheduleFrom)\n : emptySchedule();\n\n await rollUpParentBounds(deps.adapter, args, schedule.scheduledIds, passes);\n\n if (passes.has(DERIVED_PASS.MILESTONE_MIRROR_GLOBAL)) {\n restampMilestoneDurationMirror(deps.adapter);\n }\n\n await runDerivedRecomputes(deps, passes, args.now);\n\n return schedule;\n}\n\nfunction resolvePasses(args: PostMutationArgs): ReadonlySet<DerivedPass> {\n const requested = args.autoscheduleFrom !== null;\n const ran = !args.options.skipAutoSchedule && requested;\n return resolveDerivedPasses(args.action, { requested, ran }, args.options);\n}\n\nasync function runAutoschedule(\n deps: PostMutationDeps,\n autoscheduleFrom: AutoscheduleFrom\n): Promise<ScheduleOutcome> {\n const options: ScheduleOptions =\n autoscheduleFrom === 'roots' ? {} : { triggerId: autoscheduleFrom };\n const result = await deps.scheduler.schedule(options);\n\n const outcome = captureScheduledRows(deps.adapter, result.updatedIds);\n applyResults(deps.adapter, result);\n\n return outcome;\n}\n\nfunction captureScheduledRows(\n adapter: ScheduleState,\n updatedIds: readonly (string | number)[]\n): ScheduleOutcome {\n const scheduledIds: string[] = [];\n const scheduledBeforeImages = new Map<string, EngineActivitySnapshot>();\n for (const id of updatedIds) {\n const activityId = String(id);\n scheduledIds.push(activityId);\n const snap = adapter.getActivity(activityId);\n if (snap) {\n scheduledBeforeImages.set(activityId, structuredCloneActivity(snap));\n // Journal the pre-applyResults state so a throw AFTER the autoschedule\n // still rolls back the scheduler's direct date writes.\n adapter.noteScheduledBefore(activityId, snap);\n }\n }\n return { scheduledIds, scheduledBeforeImages };\n}\n\nfunction emptySchedule(): ScheduleOutcome {\n return { scheduledIds: [], scheduledBeforeImages: new Map() };\n}\n\nasync function rollUpParentBounds(\n adapter: ScheduleState,\n args: PostMutationArgs,\n scheduledIds: readonly string[],\n passes: ReadonlySet<DerivedPass>\n): Promise<void> {\n const dirty = args.collectDirty\n ? args.collectDirty(scheduledIds)\n : collectDirtyForStructural(args.recomputeParentsFrom, scheduledIds);\n await updateParentBoundsFromChildren(\n adapter,\n dirty,\n passes.has(DERIVED_PASS.PARENT_PROGRESS),\n {\n skipMilestoneDurationStamp: !passes.has(\n DERIVED_PASS.MILESTONE_MIRROR_ANCESTORS\n ),\n recomputeRealWork: passes.has(DERIVED_PASS.REAL_WORK)\n }\n );\n}\n\nasync function runDerivedRecomputes(\n deps: PostMutationDeps,\n passes: ReadonlySet<DerivedPass>,\n now: Date | null\n): Promise<void> {\n if (passes.has(DERIVED_PASS.EXPECTED_PROGRESS) && now !== null) {\n applyExpectedProgressLive(deps.adapter, now);\n applyStatusPass(deps.adapter, deps.sector.statusCriteria);\n }\n if (passes.has(DERIVED_PASS.REAL_COST)) {\n emitRealCost(deps.adapter);\n }\n if (passes.has(DERIVED_PASS.CRITICAL_PATH)) {\n await applyCriticalPathAtLoad(deps.adapter, deps.sector.hoursPerDay);\n }\n}\n","/**\n * `revertNoOpConstraintEdit` — clean post-pass for the constraint-type /\n * constraint-date dispatch path (dispatch step 8b, runs AFTER the\n * autoscheduler cascade has settled).\n *\n * RULE (the intent, NOT legacy's `executeFixForConstraints` mechanism):\n *\n * A SOFT constraint edit that does NOT reposition the activity is a no-op —\n * it must preserve the PRIOR constraint date, not the freshly-seeded one.\n * Concretely, after the cascade settles, if the edited activity's\n * `start_date` is unchanged from its pre-edit `last_start_date` (value\n * comparison, `.getTime()`), restore `constraint_date` to the PRE-EDIT\n * constraint_date (the value before this edit seeded a new one), re-anchored\n * to the constraint type's calendar shift.\n *\n * Why \"soft only\" — MSO / MFO are the MUST (hard-pin) constraints\n * (`computeConstraintBounds` pins both earliest AND latest to the date): the\n * user deliberately pins the activity, so the seed is never a no-op and must\n * survive. SNET / SNLT / FNET / FNLT are one-sided (soft): when the activity\n * already sits where it would without the seed, the seeded date is redundant\n * and legacy drops it (so it can't later wrongly cap the activity / its\n * downstream cascade).\n *\n * Why PRE-EDIT constraint_date (not `last_constraint_date`) — for the named\n * oracles the two coincide, but the pre-edit value is the robust target: a\n * flip onto an activity that ALREADY carries a real constraint date (e.g.\n * SNLT after a surviving MSO seed) must keep THAT date, which\n * `last_constraint_date` (a stale edit/drag mirror) does not always hold.\n *\n * Verified against prod oracles JUN-10 (FNET → prior date, end-shift),\n * JUN-15 (FNET → null), JUN-17 (SNLT corr 13 → null; SNET/MSO/SNLT corr 12\n * chain preserved). The constraint-type pipeline already stamps\n * `last_constraint = newType`, so the TYPE is never reverted — only the date.\n *\n * Value comparison only: settled dates are fresh objects, so referential\n * `===` (legacy's literal check) would almost never fire.\n */\n\nimport type { ActivityWriter } from '../../internal/state/roles.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type { ActivityId, ConstraintType } from '../../types.js';\nimport type { CalendarReader } from '../../calendar/api.js';\nimport {\n DATELESS_CONSTRAINTS,\n normalizeConstraintDate\n} from '../../columns/shared/date-normalize.js';\n\n/** Columns whose dispatch this post-pass applies to. */\nconst CONSTRAINT_EDIT_COLUMNS: ReadonlySet<string> = new Set([\n COLUMN.CONSTRAINT_TYPE,\n COLUMN.CONSTRAINT_DATE\n]);\n\n/**\n * MUST (hard-pin) constraints — `computeConstraintBounds` pins both earliest\n * AND latest to the date. A must-pin is a deliberate user choice, never a\n * no-op: its seeded date always survives.\n */\nconst MUST_CONSTRAINTS: ReadonlySet<ConstraintType> = new Set(['mso', 'mfo']);\n\nexport function isConstraintEditColumn(column: string): boolean {\n return CONSTRAINT_EDIT_COLUMNS.has(column);\n}\n\n/**\n * Reverts a no-op SOFT constraint edit on `activityId` in place.\n *\n * `priorConstraintDate` is the activity's constraint_date BEFORE this edit\n * (captured from the pre-edit snapshot) — the value the revert restores.\n *\n * Returns `true` when the revert changed `constraint_date`, so the caller can\n * re-run the autoscheduler cascade to let downstream activities re-settle off\n * the now non-binding (or reverted) constraint. Returns `false` otherwise\n * (must-pin type, the edit DID reposition the activity, or nothing changed).\n */\nexport function revertNoOpConstraintEdit(\n activityId: ActivityId,\n priorConstraintDate: Date | null,\n adapter: ActivityWriter,\n calendars: CalendarReader\n): boolean {\n const activity = adapter.getActivity(activityId);\n if (!activity) return false;\n\n const currentType = (activity.constraint_type ??\n null) as ConstraintType | null;\n // Dateless (asap/alap) carry no date; must-pins (mso/mfo) deliberately pin.\n if (!currentType || DATELESS_CONSTRAINTS.has(currentType)) return false;\n if (MUST_CONSTRAINTS.has(currentType)) return false;\n\n const lastStartDate = asDate(activity.last_start_date);\n const startDate = asDate(activity.start_date);\n // No baseline to compare against ⇒ cannot decide it was a no-op ⇒ leave it.\n if (!lastStartDate || !startDate) return false;\n\n // The edit repositioned the activity ⇒ NOT a no-op ⇒ keep the seeded state.\n if (startDate.getTime() !== lastStartDate.getTime()) return false;\n\n const revertedDate = normalizePriorConstraintDate(\n priorConstraintDate,\n currentType,\n String(activity.calendar_id ?? ''),\n calendars\n );\n\n const currentDate = asDate(activity.constraint_date);\n if (sameDate(currentDate, revertedDate)) return false;\n\n adapter.setActivityField(activityId, COLUMN.CONSTRAINT_DATE, revertedDate);\n return true;\n}\n\n// ─── helpers ───────────────────────────────────────────────────────────────\n\n/**\n * The prior `constraint_date` re-anchored to the (kept) constraint type's\n * calendar shift (START_BASED→shift_start, END_BASED→shift_end). The prior\n * date may have been stamped under a different shift (e.g. a start-based 08:00\n * from an end_date edit); restoring it under an END_BASED type (FNET) must\n * re-anchor it to shift_end (16:00) — the same normalization the seed path\n * applies (oracle JUN-10: 2026-09-18T16:00).\n */\nfunction normalizePriorConstraintDate(\n priorDate: Date | null,\n type: ConstraintType,\n calendarId: string,\n calendars: CalendarReader\n): Date | null {\n if (priorDate === null) return null;\n const calendar = calendars.getCalendar(calendarId);\n if (!calendar) return priorDate;\n return normalizeConstraintDate(priorDate, calendar, type);\n}\n\nfunction asDate(value: unknown): Date | null {\n if (value instanceof Date) return value;\n if (typeof value === 'string' || typeof value === 'number') {\n const d = new Date(value);\n return Number.isNaN(d.getTime()) ? null : d;\n }\n return null;\n}\n\nfunction sameDate(a: Date | null, b: Date | null): boolean {\n if (a === null && b === null) return true;\n if (a === null || b === null) return false;\n return a.getTime() === b.getTime();\n}\n","import type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\nimport type { ActivityId } from '../../types.js';\nimport { runPostMutation } from './post-mutation.js';\nimport type { PostMutationArgs, PostMutationDeps } from './post-mutation.js';\nimport { resolveRunCriticalPath } from './derived-passes.js';\n\nexport interface ConstraintRevertTarget {\n activityId: ActivityId;\n priorConstraintDate: Date | null;\n}\n\nexport interface ConstraintSettleArgs {\n postMutationArgs: PostMutationArgs;\n revertTargets: readonly ConstraintRevertTarget[];\n revert: (activityId: ActivityId, priorConstraintDate: Date | null) => boolean;\n}\n\nexport interface ConstraintSettleResult {\n scheduledIds: string[];\n scheduledBeforeImages: Map<string, EngineActivitySnapshot>;\n}\n\nexport async function settleConstraintEdits(\n deps: PostMutationDeps,\n { postMutationArgs, revertTargets, revert }: ConstraintSettleArgs\n): Promise<ConstraintSettleResult> {\n let { scheduledIds, scheduledBeforeImages } = await runPostMutation(\n deps,\n withCriticalPathSuppressed(postMutationArgs)\n );\n\n let someEditReverted = false;\n for (const { activityId, priorConstraintDate } of revertTargets) {\n const reverted = revert(activityId, priorConstraintDate);\n someEditReverted = someEditReverted || reverted;\n }\n\n if (someEditReverted) {\n const resettled = await runPostMutation(\n deps,\n withCriticalPathSuppressed(postMutationArgs)\n );\n scheduledIds = mergeScheduledIds(scheduledIds, resettled.scheduledIds);\n scheduledBeforeImages = mergeScheduledBeforeImagesFirstWins(\n scheduledBeforeImages,\n resettled.scheduledBeforeImages\n );\n }\n\n if (resolveRunCriticalPath(postMutationArgs.action)) {\n await runPostMutation(deps, criticalPathOnlyArgs(postMutationArgs));\n }\n\n return { scheduledIds, scheduledBeforeImages };\n}\n\n/** Args del settle con el critical path suprimido (settles intermedios). */\nfunction withCriticalPathSuppressed(args: PostMutationArgs): PostMutationArgs {\n return {\n ...args,\n options: { ...args.options, skipCriticalPath: true }\n };\n}\n\n/**\n * Final pass que corre SOLO el critical path: sin autoschedule\n * (`autoscheduleFrom: null`) y con `now: null` para saltar expected_progress.\n * real_cost queda fuera solo (los edits de constraint no cambian progress).\n */\nfunction criticalPathOnlyArgs(args: PostMutationArgs): PostMutationArgs {\n return {\n action: args.action,\n autoscheduleFrom: null,\n recomputeParentsFrom: [],\n now: null,\n options: args.options\n };\n}\n\n/** Unión de los ids movidos por los dos settles (orden: primero el settle 1). */\nfunction mergeScheduledIds(\n firstSettleIds: readonly string[],\n secondSettleIds: readonly string[]\n): string[] {\n const merged = new Set<string>(firstSettleIds);\n for (const scheduledId of secondSettleIds) merged.add(scheduledId);\n return [...merged];\n}\n\n/**\n * Merge first-wins de before-images: un dependiente movido por AMBOS settles\n * conserva su imagen del primero (adyacente al estado pre-batch). Si ganara\n * la del re-settle, el diff produciría un entry fantasma para un dependiente\n * que volvió a su posición original y el undo restauraría el estado\n * INTERMEDIO, no el pre-batch.\n */\nfunction mergeScheduledBeforeImagesFirstWins(\n firstSettleImages: Map<string, EngineActivitySnapshot>,\n secondSettleImages: Map<string, EngineActivitySnapshot>\n): Map<string, EngineActivitySnapshot> {\n const merged = new Map(firstSettleImages);\n for (const [imageId, image] of secondSettleImages) {\n if (!merged.has(imageId)) merged.set(imageId, image);\n }\n return merged;\n}\n","import type { EngineActivitySnapshot } from '../autoscheduler/types.js';\nimport { isFrozen } from '../internal/selection/is-frozen.js';\nimport type { ActivityWriter } from '../internal/state/roles.js';\nimport type { ActivityId } from '../types.js';\nimport type { ScheduleEffect } from './types.js';\n\n/**\n * Whether a mutation moved the activity's schedule. A SIR freezes its\n * activity's dates; if any of these changed, the SIR is stale and must be\n * auto-rejected (parity with backend `rejectSirByActivity`, which triggers on\n * start/end date change). `duration` is included because editing it shifts\n * `end_date`.\n */\nfunction datesChanged(\n before: EngineActivitySnapshot,\n after: EngineActivitySnapshot\n): boolean {\n const toTime = (value: Date): number => value.getTime();\n return (\n toTime(before.start_date) !== toTime(after.start_date) ||\n toTime(before.end_date) !== toTime(after.end_date) ||\n before.duration !== after.duration\n );\n}\n\n/**\n * Detect SIR auto-rejects for a dispatch and clear the freeze in the core.\n *\n * For every activity that was frozen in `beforeSnap` AND whose dates changed\n * (or which was deleted), emit one `sir-auto-reject` effect per pending SIR.\n * For surviving (non-deleted) activities, also clear their `pendingRequests`\n * in the adapter — the SIR is rejected, so the activity is no longer frozen;\n * this keeps the core self-consistent and lets the resulting ChangeSet diff\n * carry `pendingRequests: []` so the bridge unfreezes the DHTMLX task too.\n * Deleted activities are gone, so nothing to clear.\n *\n * Must run BEFORE `buildActivityChanges` so the cleared field shows in the\n * diff. The mutation itself is never blocked (legacy parity). SIR (A5).\n * See `SIR_MAP.md` §10.\n */\nexport function detectSirAutoReject(\n beforeSnap: ReadonlyMap<string, EngineActivitySnapshot>,\n adapter: ActivityWriter,\n touchedIds: Iterable<string>\n): ScheduleEffect[] {\n const effects: ScheduleEffect[] = [];\n\n for (const id of touchedIds) {\n const before = beforeSnap.get(id);\n if (!before) continue;\n const pendingRequests = before.pendingRequests ?? [];\n if (!isFrozen({ pendingRequests })) continue;\n\n const after = adapter.getActivity(id);\n const deleted = after == null;\n if (!deleted && !datesChanged(before, after)) continue;\n\n const reason: ScheduleEffect['reason'] = deleted\n ? 'activity_deleted'\n : 'date_changed';\n for (const pending of pendingRequests) {\n effects.push({\n kind: 'sir-auto-reject',\n activityId: id,\n sirId: pending.id,\n reason\n });\n }\n\n if (!deleted) {\n adapter.setActivityField(id as ActivityId, 'pendingRequests', []);\n }\n }\n\n return effects;\n}\n","/**\n * ChangeSet assembly — the shared closing sequence of every dispatch\n * handler (dispatch step 9): union the touched ids with what the\n * autoscheduler moved (and, for structural mutations, every alive id),\n * optionally run the SIR auto-reject detection, diff before/after\n * snapshots into `EntityChange[]`, and wrap the result in the canonical\n * ChangeSet literal. Extracted from the per-handler duplicates in\n * `dispatch.ts` (Fase 4, 2026-06-12).\n */\n\nimport type {\n ActivityWriter,\n WriteJournal\n} from '../../internal/state/roles.js';\nimport type {\n EngineActivitySnapshot,\n ActivityId\n} from '../../autoscheduler/types.js';\nimport type { Link } from '../../types.js';\nimport type {\n ChangeSet,\n ConstraintWarning,\n DispatchAction,\n EntityChange,\n TrackingEvent\n} from '../types.js';\nimport { detectSirAutoReject } from '../sir-auto-reject.js';\nimport { buildActivityChanges, diffActivity } from './snapshots.js';\n\ninterface AssembleChangeSetArgs {\n source:\n | DispatchAction\n | { kind: 'init' }\n | { kind: 'undo' }\n | { kind: 'redo' };\n /** Pre-mutation snapshots — ids absent here diff as `created`. */\n beforeSnap: Map<string, EngineActivitySnapshot>;\n /** Ids the handler touched directly (snapshotted before mutating). */\n touchedIds: Iterable<string>;\n /** Ids the autoscheduler moved (already string-normalized). */\n scheduledIds: readonly string[];\n /**\n * Structural mutations (delete / move / indent / outdent / paste /\n * create) also union every alive id: the correlative_id sweep can shift\n * positions tree-wide. `buildActivityChanges` diffs against\n * `beforeSnap`, so unchanged ids drop out.\n */\n includeAllIds?: boolean;\n /**\n * SIR freeze authority (A5): a frozen activity whose dates changed\n * auto-rejects its pending SIR(s) and is unfrozen in the core (clears\n * `pendingRequests`). The mutation is NOT blocked (parity). See\n * SIR_MAP §10.\n *\n * - `'before-diff'` (inline-edit, move): runs BEFORE\n * `buildActivityChanges` so the cleared field shows in the diff.\n * - `'after-diff'` (delete): preserves that handler's historical order —\n * deleted activities are gone, so there is nothing to unfreeze and\n * only effects are emitted.\n * - omitted: no detection (structural handlers that can't move frozen\n * dates through this path).\n */\n sirDetection?: 'before-diff' | 'after-diff';\n /** Link entity changes; defaults to none. */\n links?: ReadonlyArray<EntityChange<Link>>;\n /** Amplitude events riding the ChangeSet; defaults to none. */\n trackingEvents?: ReadonlyArray<TrackingEvent>;\n /**\n * Constraint-violation warnings collected from the pipelines'\n * `FieldChanges.constraintWarning` (direct edits only, PRD R2/R3);\n * defaults to none.\n */\n warnings?: ReadonlyArray<ConstraintWarning>;\n hoursPerDay: number;\n /**\n * Before-images of activities the autoscheduler moved, captured by\n * `runPostMutation` before `applyResults` applied the mutations. Provides\n * correct before-images for scheduled activities without requiring a full\n * O(N) snapshot. Merged additively — `beforeSnap` and WriteCapture entries\n * (which hold earlier before-images) take priority.\n */\n scheduledBeforeImages?:\n | ReadonlyMap<ActivityId | string, EngineActivitySnapshot>\n | undefined;\n}\n\nexport function assembleChangeSet(\n adapter: ActivityWriter & WriteJournal,\n args: AssembleChangeSetArgs\n): ChangeSet {\n const allTouched = new Set<string>();\n for (const id of args.touchedIds) allTouched.add(id);\n for (const id of args.scheduledIds) allTouched.add(id);\n if (args.includeAllIds) {\n for (const id of adapter.getAllIds()) allTouched.add(id);\n }\n\n // B1 / F4: fold in any activity mutated through `setActivityField` that the\n // handler did NOT enumerate — e.g. a predecessor's `custom_sucessors`\n // re-rendered by the lag-absorb post-processor. The store's per-dispatch\n // write journal is the authoritative set of touched rows; merge its\n // pre-mutation clones so the diff has a baseline. Only rows that genuinely\n // changed are folded in (a no-op write must not create a phantom entry).\n // Guard: skip ids already in allTouched — those have a definitive before-image\n // from beforeSnap (pre-existing activity) or are intentionally absent (newly\n // created this dispatch → before.get(id) == undefined → kind: 'created').\n const before = new Map(args.beforeSnap);\n const captured = adapter.peekWriteCapture();\n if (captured) {\n for (const id of captured.dirty) {\n if (allTouched.has(id)) continue;\n const beforeImg = captured.before.get(id);\n const live = adapter.getActivity(id);\n if (!beforeImg || !live) continue;\n if (Object.keys(diffActivity(beforeImg, live)).length === 0) continue;\n before.set(id, beforeImg);\n allTouched.add(id);\n }\n }\n\n // Merge before-images for activities the autoscheduler moved. applyResults\n // bypasses WriteCapture (direct mutation), so runPostMutation captures these\n // explicitly. Additive merge: beforeSnap and WriteCapture entries (earlier\n // in the dispatch) take priority over these post-handler images.\n if (args.scheduledBeforeImages) {\n for (const [id, img] of args.scheduledBeforeImages) {\n const sid = String(id);\n if (!before.has(sid)) {\n before.set(sid, img);\n allTouched.add(sid);\n }\n }\n }\n\n const beforeDiffEffects =\n args.sirDetection === 'before-diff'\n ? detectSirAutoReject(before, adapter, allTouched)\n : [];\n\n const activityChanges = buildActivityChanges(adapter, before, allTouched);\n\n const effects =\n args.sirDetection === 'after-diff'\n ? detectSirAutoReject(before, adapter, allTouched)\n : beforeDiffEffects;\n\n const warnings = args.warnings ?? [];\n\n return {\n source: args.source,\n activities: activityChanges,\n links: args.links ?? [],\n calendars: [], // dispatch never mutates calendars\n trackingEvents: args.trackingEvents ?? [],\n ...(effects.length > 0 ? { effects } : {}),\n ...(warnings.length > 0 ? { warnings } : {})\n };\n}\n","/**\n * Cross-handler helpers — small utilities used by 2+ dispatch handlers\n * (pure moves from `dispatch.ts`, Fase 4). Handler-private helpers stay\n * in their handler module; this file is only for the genuinely shared.\n */\n\nimport type { ActivityReader } from '../../internal/state/roles.js';\nimport type { Link, LinkId } from '../../types.js';\nimport type {\n LinkId as EngineLinkId,\n LinkSnapshot\n} from '../../autoscheduler/types.js';\nimport type { LinkOperation } from '../../autoscheduler/index.js';\nimport { snapshotToLink } from '../conversion.js';\nimport type { EntityChange } from '../types.js';\nimport type { CustomIdTracker } from '../../generators/custom-id/tracker.js';\n\n// Internal link `lag` is WORKING HOURS. The ChangeSet emits hours;\n// `toPublicChangeSet` in `dispatch/shared/public-units.ts` converts to days\n// at the facade boundary. No conversion here.\nexport function buildLinkChangesForBatch(\n applied: ReadonlyArray<{\n op: LinkOperation;\n finalLinkId: LinkId | null;\n rejected: string | null;\n }>,\n beforeLinks: ReadonlyMap<EngineLinkId, LinkSnapshot>,\n adapter: ActivityReader\n): ReadonlyArray<EntityChange<Link>> {\n const out: EntityChange<Link>[] = [];\n for (const { op, finalLinkId, rejected } of applied) {\n if (rejected !== null) continue;\n\n if (op.kind === 'create') {\n if (!finalLinkId) continue;\n const after = adapter.getLink(finalLinkId);\n if (!after) continue;\n out.push({\n id: String(finalLinkId),\n kind: 'created',\n fields: {\n source: { before: undefined, after: String(after.source) },\n target: { before: undefined, after: String(after.target) },\n type: { before: undefined, after: after.type },\n lag: { before: undefined, after: Number(after.lag) }\n },\n after: snapshotToLink(after)\n });\n continue;\n }\n\n if (op.kind === 'delete') {\n const beforeLink = beforeLinks.get(op.linkId);\n out.push({\n id: String(op.linkId),\n kind: 'deleted',\n fields: beforeLink\n ? {\n source: { before: String(beforeLink.source), after: undefined },\n target: { before: String(beforeLink.target), after: undefined },\n type: { before: beforeLink.type, after: undefined },\n lag: { before: Number(beforeLink.lag), after: undefined }\n }\n : undefined,\n after: null\n });\n continue;\n }\n\n // update\n const beforeLink = beforeLinks.get(op.linkId);\n const afterLink = adapter.getLink(op.linkId);\n if (!afterLink) continue;\n const fields: Record<string, { before: unknown; after: unknown }> = {};\n if (beforeLink && beforeLink.type !== afterLink.type) {\n fields.type = { before: beforeLink.type, after: afterLink.type };\n }\n if (beforeLink && Number(beforeLink.lag) !== Number(afterLink.lag)) {\n fields.lag = {\n before: Number(beforeLink.lag),\n after: Number(afterLink.lag)\n };\n }\n out.push({\n id: String(op.linkId),\n kind: 'updated',\n fields,\n after: snapshotToLink(afterLink)\n });\n }\n return out;\n}\n\n/**\n * Lags de los links ENTRANTES de una activity ($target), capturados antes\n * de correr los post-processors. Par de `diffIncomingLinkLagChanges`:\n * juntos transportan al ChangeSet la mutación del lag absorbente\n * (`adjust-link-lag-on-task-move`) — sin esto el lag nuevo quedaba solo\n * en el adapter, DHTMLX no lo veía y la persistencia quedaba en duda\n * (gap F4 del track onAfterTaskDrag). Usado por inline-edit y dates-batch.\n */\nexport function snapshotIncomingLinkLags(\n adapter: ActivityReader,\n activityId: string\n): Map<string, number> {\n const out = new Map<string, number>();\n const activity = adapter.getActivity(activityId);\n if (!activity) return out;\n for (const linkId of activity.$target) {\n const link = adapter.getLink(linkId);\n if (link) out.set(String(link.id), Number(link.lag));\n }\n return out;\n}\n\n/**\n * Diff post-post-processors → EntityChange<Link> por cada lag mutado.\n *\n * `beforeLags` y los lags vivos están en HORAS (interno); el EntityChange\n * también sale en HORAS — `toPublicChangeSet` convierte a días en la\n * frontera pública (facade, read-api).\n */\nexport function diffIncomingLinkLagChanges(\n beforeLags: ReadonlyMap<string, number>,\n adapter: ActivityReader,\n activityId: string\n): ReadonlyArray<EntityChange<Link>> {\n const out: EntityChange<Link>[] = [];\n const activity = adapter.getActivity(activityId);\n if (!activity) return out;\n for (const linkId of activity.$target) {\n const link = adapter.getLink(linkId);\n if (!link) continue;\n const before = beforeLags.get(String(link.id));\n if (before === undefined || before === Number(link.lag)) continue;\n out.push({\n id: String(link.id),\n kind: 'updated',\n fields: {\n lag: {\n before,\n after: Number(link.lag)\n }\n },\n after: snapshotToLink(link)\n });\n }\n return out;\n}\n\nexport interface TrackingEventOut {\n name: string;\n properties: Record<string, unknown>;\n}\n\n/**\n * Releases a parent's old custom_id back to the tracker pool when promotion\n * clears it. Ported from legacy `clearCustomIdOnParentConversion` (the\n * `releaseCustomId` half — the `null` half is done by the promotion). No-op\n * when the parent had no custom_id. Used by move/indent promotion (create\n * releases via the generation strategy).\n */\nexport function releaseClearedCustomId(\n oldCustomId: unknown,\n customIdTracker: CustomIdTracker\n): void {\n if (typeof oldCustomId === 'string' && oldCustomId.length > 0) {\n customIdTracker.releaseCustomId(oldCustomId);\n }\n}\n","/**\n * Inline-edit handler — the canonical 10-step column-pipeline path of\n * `core.dispatch(...)` (canEdit → parseInput → validate → transform →\n * snapshot → apply → post-processors → autoscheduler/bounds/CP →\n * ChangeSet). Pure move from `dispatch.ts` (Fase 4); the order is\n * contract — see CURSOR.md \"Flujo de core.dispatch paso a paso\".\n */\n\nimport { REJECTION_REASON } from '../reasons.js';\nimport { runPostProcessorsOnAdapter } from '../../internal/post-processors/runner.js';\nimport { findPipelineForColumn } from '../../columns/registry.js';\nimport { toConstraintWarning } from '../shared/constraint-warnings.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { ACTIVITY_PROPERTY } from '../../constants/activity-properties.js';\nimport type { FieldChanges } from '../../columns/types.js';\nimport type {\n DispatchAction,\n DispatchOptions,\n DispatchResult\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport {\n snapshotActivities,\n applyFieldChanges,\n collectTouchedIds,\n collectDirtyForInlineEdit\n} from '../shared/snapshots.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport {\n isConstraintEditColumn,\n revertNoOpConstraintEdit\n} from './revert-no-op-constraint-edit.js';\nimport { settleConstraintEdits } from '../shared/constraint-settle.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport {\n snapshotIncomingLinkLags,\n diffIncomingLinkLagChanges\n} from '../shared/helpers.js';\n\nexport async function dispatchInlineEdit(\n action: Extract<DispatchAction, { kind: 'inline-edit' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, ctx, scheduler, sector } = deps;\n const pipeline = findPipelineForColumn(action.column);\n if (!pipeline) {\n throw new Error(\n `[ScheduleCore] no pipeline registered for column \"${action.column}\"`\n );\n }\n if (columnInvalidatesExpandedLinks(action.column)) {\n scheduler.invalidateExpandedLinksCache();\n }\n if (action.column === ACTIVITY_PROPERTY.PARENT) {\n scheduler.invalidateAllCaches();\n }\n\n const activitySnap = ctx.activityReader.getActivity(action.activityId);\n if (!activitySnap) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_NOT_FOUND };\n }\n\n // ── 1. canEdit ────────────────────────────────────────────────────────\n const editGate = pipeline.canEdit(activitySnap);\n if (!editGate.allowed) {\n return {\n ok: false,\n reason: editGate.reason ?? REJECTION_REASON.CANNOT_EDIT,\n alertKey: editGate.alertKey\n };\n }\n\n // ── 2. parseInput ─────────────────────────────────────────────────────\n const parsed = pipeline.parseInput(action.newValue, activitySnap, ctx);\n if (!parsed.ok) {\n return { ok: false, reason: parsed.reason ?? REJECTION_REASON.PARSE_ERROR };\n }\n\n // ── 3. validate ───────────────────────────────────────────────────────\n const oldValue = Reflect.get(activitySnap, action.column);\n const validation = pipeline.validate(\n activitySnap,\n oldValue as never,\n parsed.value as never,\n ctx\n );\n if (!validation.valid) {\n return {\n ok: false,\n reason: validation.reason ?? REJECTION_REASON.INVALID,\n alertKey: validation.notification?.messageKey\n };\n }\n\n // ── 3b. Cross-pipeline check: custom_id must not collide with another\n // activity's custom_id. Uses the dispatch's tracker because the\n // pipeline's `ctx` has no tracker access (intentional — keeps the\n // column-pipeline contract narrow). Read the previous value from the\n // adapter (the snapshot from ctx is lean and doesn't carry custom_id).\n if (action.column === COLUMN.CUSTOM_ID && parsed.value !== null) {\n const liveActivity = adapter.getActivity(action.activityId);\n const oldCustomIdRaw = liveActivity ? liveActivity.custom_id : null;\n const oldCustomId =\n typeof oldCustomIdRaw === 'string' ? oldCustomIdRaw : null;\n if (\n deps.customIdTracker.isCustomIdInUse(String(parsed.value), oldCustomId)\n ) {\n return { ok: false, reason: REJECTION_REASON.CUSTOM_ID_DUPLICATE };\n }\n }\n\n // ── 4. transform ──────────────────────────────────────────────────────\n const changes: FieldChanges = pipeline.transform(\n activitySnap,\n parsed.value as never,\n ctx,\n parsed.raw\n );\n\n // ── 5. Snapshot before-state for the touched ids (atomicity + diff) ──\n const touchedIds = collectTouchedIds(action.activityId, changes);\n const beforeSnap = snapshotActivities(adapter, touchedIds);\n // Los lags entrantes TAMBIÉN se snapshotean: el post-processor del lag\n // absorbente los muta y la mutación debe viajar en el ChangeSet (F4).\n const beforeLinkLags = snapshotIncomingLinkLags(\n adapter,\n String(action.activityId)\n );\n\n // ── 6. Apply mutations ───────────────────────────────────────────────\n applyFieldChanges(adapter, action.activityId, action.column, changes);\n runPostProcessorsOnAdapter(\n action.activityId,\n changes.postProcessors ?? [],\n adapter\n );\n const linkChanges = diffIncomingLinkLagChanges(\n beforeLinkLags,\n adapter,\n String(action.activityId)\n );\n\n // ── 6b. Keep the CustomIdTracker in sync with custom_id edits.\n // We computed `oldCustomId` before applying (above, in 3b), but we\n // didn't keep it in scope. Re-read from the beforeSnap which has the\n // full pre-mutation activity (snapshotActivities preserves all fields).\n if (action.column === COLUMN.CUSTOM_ID) {\n const beforeBucket = beforeSnap.get(String(action.activityId));\n const oldRaw = beforeBucket ? beforeBucket.custom_id : null;\n const oldCustomId = typeof oldRaw === 'string' ? oldRaw : null;\n const newCustomId = typeof parsed.value === 'string' ? parsed.value : null;\n if (oldCustomId !== newCustomId) {\n deps.customIdTracker.trackCustomIdChange(oldCustomId, newCustomId);\n }\n }\n\n // ── 7. Autoscheduler (Q11 implicit unless skipped) ──────────────────\n // ── 7b. Recompute parent (summary) bounds from children ─────────────\n // Single source of truth for parent dates: bubble up AFTER the\n // autoscheduler has settled. Runs unconditionally because date-moving\n // pipelines without `needsAutoSchedule` (rare) still require parents to\n // be coherent. Idempotent — if nothing changed, parents stay put.\n // ── 8. CP (Q11 implicit unless skipped or no runner injected) ───────\n\n const buildPostMutationArgs = () => ({\n action,\n autoscheduleFrom: changes.needsAutoSchedule\n ? String(action.activityId)\n : null,\n recomputeParentsFrom: [] as string[],\n collectDirty: (sids: readonly string[]) =>\n collectDirtyForInlineEdit(action.activityId, touchedIds, sids),\n now: deps.now,\n options\n });\n\n // The constraint-edit path (step 8b) runs the shared constraint settle\n // sequence: settle (CP suppressed) → no-op revert → re-settle if it flipped\n // a binding constraint → CP once at the end. A SOFT constraint edit that did\n // not reposition the activity preserves the prior constraint date — the\n // seeded constraint_date must not wrongly cap the activity (and its\n // downstream cascade). The revert runs AFTER the cascade so it compares the\n // SETTLED start_date to the pre-edit last_start_date. See\n // `revert-no-op-constraint-edit.ts` and `constraint-settle.ts`.\n const isConstraintPath = isConstraintEditColumn(action.column);\n\n // `scheduledBeforeImages` es CLAVE para el ChangeSet correcto: los dependientes\n // que el autoscheduler mueve (cascada de un edit de fecha/duración) no están en\n // `beforeSnap`, así que sin su before-image `buildActivityChanges` los marca\n // FALSE-CREATED → el undo los invierte a `deleted` y los BORRA. Espejamos lo que\n // ya hacen move/indent/outdent. (Bug reproducido: editar start_date → undo\n // borraba el sucesor con \"Task not found\".)\n const { scheduledIds, scheduledBeforeImages } = await (isConstraintPath\n ? settleConstraintEdits(\n { adapter, scheduler, sector: deps.sector },\n {\n postMutationArgs: buildPostMutationArgs(),\n revertTargets: [\n {\n activityId: action.activityId,\n priorConstraintDate: activitySnap.constraint_date\n }\n ],\n revert: (activityId, priorConstraintDate) =>\n revertNoOpConstraintEdit(\n activityId,\n priorConstraintDate,\n adapter,\n ctx.calendars\n )\n }\n )\n : runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n buildPostMutationArgs()\n ));\n\n // ── 9. Build ChangeSet from before/after snapshots ────────────────────\n // SIR freeze authority (A5): a frozen activity whose dates changed auto-\n // rejects its pending SIR(s) and is unfrozen in the core (clears\n // pendingRequests). 'before-diff' runs it BEFORE buildActivityChanges so\n // the cleared field shows in the diff. The mutation is NOT blocked\n // (parity). See SIR_MAP §10. Links: el lag absorbente SÍ los muta — los\n // diffs viajan en `links` (F4); calendars nunca.\n const trackingEvents = (changes.trackingEvents ?? []).map((e) => ({\n name: e.name,\n properties: (e.properties as Record<string, unknown>) ?? {}\n }));\n\n const constraintWarning = toConstraintWarning(\n action.activityId,\n changes.constraintWarning\n );\n\n return {\n ok: true,\n changes: assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds,\n scheduledIds,\n scheduledBeforeImages,\n sirDetection: 'before-diff',\n links: linkChanges,\n trackingEvents,\n ...(constraintWarning ? { warnings: [constraintWarning] } : {}),\n hoursPerDay: sector.hoursPerDay\n })\n };\n}\n\n/**\n * Returns true when an inline edit on the given column would change which\n * parent-virtual links survive `filterToChainEndpoints`. Chain pruning\n * compares `|lag| <= duration` and skips leaves with `auto_scheduling=false`,\n * so edits to those two fields invalidate the cached expansion.\n */\nfunction columnInvalidatesExpandedLinks(column: string): boolean {\n return (\n column === COLUMN.DURATION || column === ACTIVITY_PROPERTY.AUTO_SCHEDULING\n );\n}\n","// ---------------------------------------------------------------------------\n// Link operations (create / update / delete)\n// ---------------------------------------------------------------------------\n\nimport type { ActivityReader } from '../../internal/state/roles.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { REJECTION_REASON } from '../reasons.js';\nimport { LINK_TYPE } from '../../autoscheduler/types.js';\nimport {\n applyLinkOperation,\n diffLinks,\n diffOutgoingLinks,\n parsePredecessorString,\n lagDaysToHours\n} from '../../autoscheduler/index.js';\nimport type { LinkOperation } from '../../autoscheduler/index.js';\nimport type { ActivityId, LinkId } from '../../types.js';\nimport type {\n LinkId as EngineLinkId,\n LinkSnapshot\n} from '../../autoscheduler/types.js';\nimport type {\n DispatchAction,\n DispatchOptions,\n DispatchResult,\n LinksBatchOperation\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport {\n snapshotActivities,\n structuredCloneActivity\n} from '../shared/snapshots.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport { buildLinkChangesForBatch } from '../shared/helpers.js';\n\nexport async function dispatchLink(\n action: Extract<\n DispatchAction,\n { kind: 'link-create' | 'link-update' | 'link-delete' }\n >,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n // Runtime validation of link type. TypeScript enforces the LinkType union at\n // compile-time but runtime callers (e.g. UI parser passing through) may slip\n // an invalid type. Production legacy rejects unknown types silently (no link\n // created, no persistence); core matches that with an explicit rejection.\n if (action.kind === 'link-create' || action.kind === 'link-update') {\n const type = action.type;\n if (\n type !== undefined &&\n !Object.values(LINK_TYPE).some((t) => t === type)\n ) {\n return { ok: false, reason: REJECTION_REASON.INVALID_LINK_TYPE };\n }\n const lag = action.lag;\n if (lag !== undefined && !Number.isFinite(lag)) {\n return { ok: false, reason: REJECTION_REASON.INVALID_LINK_LAG };\n }\n }\n\n return dispatchLinkBatch(\n [toLinkOperation(action, deps.sector.hoursPerDay)],\n action,\n options,\n deps,\n action.kind === 'link-create' && action.linkId\n ? new Map([[0, action.linkId]])\n : undefined\n );\n}\n\nexport async function dispatchLinksBatch(\n action: Extract<DispatchAction, { kind: 'links-batch' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { hoursPerDay } = deps.sector;\n const operations = action.operations.map((op) =>\n batchOpToLinkOperation(op, hoursPerDay)\n );\n const deterministicIds = collectDeterministicIds(action.operations);\n return dispatchLinkBatch(operations, action, options, deps, deterministicIds);\n}\n\nfunction collectDeterministicIds(\n operations: ReadonlyArray<LinksBatchOperation>\n): ReadonlyMap<number, LinkId> | undefined {\n const ids = new Map<number, LinkId>();\n operations.forEach((op, index) => {\n if (op.kind === 'create' && op.linkId) ids.set(index, op.linkId);\n });\n return ids.size > 0 ? ids : undefined;\n}\n\nfunction batchOpToLinkOperation(\n op: LinksBatchOperation,\n hoursPerDay: number\n): LinkOperation {\n if (op.kind === 'create') {\n return {\n kind: 'create',\n source: op.source,\n target: op.target,\n type: op.type,\n lag: lagDaysToHours(op.lag ?? 0, hoursPerDay)\n };\n }\n if (op.kind === 'update') {\n return {\n kind: 'update',\n linkId: op.linkId,\n type: op.type,\n lag:\n op.lag === undefined ? undefined : lagDaysToHours(op.lag, hoursPerDay)\n };\n }\n return { kind: 'delete', linkId: op.linkId };\n}\n\n// ---------------------------------------------------------------------------\n// Canonical batch applier — shared by `dispatchLink` (single op) and the\n// inline-edit handler for `custom_predecessors` / `custom_sucessors` (N ops).\n// Applies each LinkOperation via `applyLinkOperation`, snapshots pre/post\n// state, runs autoscheduler + parent bounds + CP ONCE, returns ChangeSet.\n// ---------------------------------------------------------------------------\n\nasync function dispatchLinkBatch(\n operations: ReadonlyArray<LinkOperation>,\n source: DispatchAction,\n options: DispatchOptions,\n deps: DispatchDeps,\n // Optional: map from op-array index → deterministic linkId (for tests).\n // Only honored for 'create' ops; ignored otherwise.\n deterministicIds?: ReadonlyMap<number, LinkId>\n): Promise<DispatchResult> {\n const { adapter, scheduler, sector, linkIdGen } = deps;\n scheduler.invalidateAllCaches();\n\n // 1. Collect every activity that may be touched (source + target of each\n // op). For 'update' and 'delete', resolve the link to find them BEFORE\n // mutating.\n const affectedActivityIds = new Set<string>();\n const beforeLinks = new Map<EngineLinkId, LinkSnapshot>();\n for (const op of operations) {\n if (op.kind === 'create') {\n affectedActivityIds.add(String(op.source));\n affectedActivityIds.add(String(op.target));\n } else {\n const link = adapter.getLink(op.linkId);\n if (link) {\n affectedActivityIds.add(String(link.source));\n affectedActivityIds.add(String(link.target));\n beforeLinks.set(op.linkId, { ...link });\n }\n }\n }\n\n const beforeActivities = snapshotActivities(adapter, affectedActivityIds);\n\n // 2. Apply each operation, recording per-op result for the link diff.\n type AppliedOp = {\n op: LinkOperation;\n finalLinkId: LinkId | null;\n rejected: string | null;\n };\n const applied: AppliedOp[] = [];\n\n for (let i = 0; i < operations.length; i++) {\n const op = operations[i]!;\n const detId =\n op.kind === 'create' && deterministicIds\n ? deterministicIds.get(i)\n : undefined;\n const result = applyLinkOperation(op, {\n port: adapter,\n // Si el caller pasó un id deterministic (test override, o el bridge\n // pasando el id que DHTMLX iba a usar), lo respetamos. Si no, el\n // generador del core arranca desde Date.now() — mismo formato que\n // DHTMLX uid(). Ver `generators/link-id-generator.ts`.\n newLinkId: detId ? () => detId : linkIdGen.next\n });\n applied.push({\n op,\n finalLinkId: result.applied ? (result.linkId as LinkId) : null,\n rejected: result.applied ? null : (result.rejected ?? 'link_op_rejected')\n });\n }\n\n // If the batch came from a single-op dispatch (link-create/update/delete)\n // and the op was rejected, surface the reason. For multi-op (inline-edit\n // batch) we tolerate per-op rejections and continue — they're reported in\n // the ChangeSet via missing link entries.\n if (\n operations.length === 1 &&\n applied[0] &&\n applied[0].rejected !== null &&\n source.kind !== 'inline-edit'\n ) {\n return { ok: false, reason: applied[0].rejected };\n }\n\n // 3. Autoscheduler — trigger on the FIRST applied operation's target.\n // `pickAutoscheduleTrigger` is a pure read; null (no applied op)\n // skips the scheduling pass, never the bounds rollup.\n const triggerId = pickAutoscheduleTrigger(applied, beforeLinks, adapter);\n const { scheduledIds } = await runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n {\n action: source,\n autoscheduleFrom: triggerId,\n recomputeParentsFrom: affectedActivityIds,\n now: deps.now,\n options\n }\n );\n\n // 4. Build activity diff. Quirk (preserved): scheduled ids that weren't\n // snapshotted up-front get a POST-state backfill, so they diff as\n // `updated` with empty fields instead of `created`.\n for (const id of scheduledIds) {\n if (!beforeActivities.has(id)) {\n const a = adapter.getActivity(id);\n if (a) beforeActivities.set(id, structuredCloneActivity(a));\n }\n }\n\n // 5. Build link diff — one EntityChange per applied op.\n const linkChanges = buildLinkChangesForBatch(applied, beforeLinks, adapter);\n\n const beforeLinksByStringId = new Map<string, LinkSnapshot>();\n for (const [linkId, snap] of beforeLinks) {\n beforeLinksByStringId.set(String(linkId), snap);\n }\n\n return {\n ok: true,\n __beforeLinks: beforeLinksByStringId,\n changes: assembleChangeSet(adapter, {\n source,\n beforeSnap: beforeActivities,\n touchedIds: affectedActivityIds,\n scheduledIds,\n links: linkChanges,\n hoursPerDay: sector.hoursPerDay\n })\n };\n}\n\nfunction pickAutoscheduleTrigger(\n applied: ReadonlyArray<{\n op: LinkOperation;\n finalLinkId: LinkId | null;\n rejected: string | null;\n }>,\n beforeLinks: ReadonlyMap<EngineLinkId, LinkSnapshot>,\n adapter: ActivityReader\n): string | null {\n for (const a of applied) {\n if (a.rejected !== null) continue;\n if (a.op.kind === 'create') return String(a.op.target);\n if (a.op.kind === 'delete') {\n const snap = beforeLinks.get(a.op.linkId);\n if (snap) return String(snap.target);\n }\n if (a.op.kind === 'update') {\n const link = adapter.getLink(a.op.linkId);\n if (link) return String(link.target);\n }\n }\n return null;\n}\n\n// The `link-create`/`link-update` intents carry `lag` in DAYS (the public\n// boundary unit — see `dispatch/types.ts`). Convert to WORKING HOURS here so\n// the operation stored by `applyLinkOperation` matches the internal unit.\nfunction toLinkOperation(\n action: Extract<\n DispatchAction,\n { kind: 'link-create' | 'link-update' | 'link-delete' }\n >,\n hoursPerDay: number\n): LinkOperation {\n if (action.kind === 'link-create') {\n return {\n kind: 'create',\n source: action.source,\n target: action.target,\n type: action.type,\n lag: lagDaysToHours(action.lag, hoursPerDay)\n };\n }\n if (action.kind === 'link-update') {\n return {\n kind: 'update',\n linkId: action.linkId,\n type: action.type,\n lag:\n action.lag === undefined\n ? undefined\n : lagDaysToHours(action.lag, hoursPerDay)\n };\n }\n return { kind: 'delete', linkId: action.linkId };\n}\n\n// Helpers `collectActivitiesAffectedByLinkOp`, `snapshotLinksForOp`,\n// `buildLinkChanges` were removed — their responsibilities are now inside\n// `dispatchLinkBatch`, which handles N operations uniformly.\n\n// ---------------------------------------------------------------------------\n// Inline-edit on `custom_predecessors` / `custom_sucessors`\n// ---------------------------------------------------------------------------\n//\n// User types `\"3FS+2\"` into the cell. This handler parses the string,\n// resolves correlative_id → activityId, diffs against the activity's\n// current incoming (predecessors) or outgoing (successors) links, and\n// hands the resulting `LinkOperation[]` to `dispatchLinkBatch` — the\n// same canonical applier that `dispatchLink` uses for the drag flow.\n//\n// No duplicate logic: parse + diff are scheduler/links/* utilities;\n// apply + autoscheduler + CP + ChangeSet are dispatchLinkBatch.\n\nexport async function dispatchInlineEditLinks(\n action: Extract<DispatchAction, { kind: 'inline-edit' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, sector } = deps;\n\n if (typeof action.newValue !== 'string') {\n return { ok: false, reason: REJECTION_REASON.INVALID_VALUE };\n }\n\n const activity = adapter.getActivity(action.activityId);\n if (!activity) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_NOT_FOUND };\n }\n\n const isPredecessors = action.column === COLUMN.CUSTOM_PREDECESSORS;\n\n // 1. Parse the string. Malformed entries silently dropped (matches legacy).\n // `parsePredecessorString` returns lag in DAYS; the diff compares against\n // the storage lag, which is WORKING HOURS — convert each spec to hours\n // BEFORE diffing, or every link would diff as a false update.\n const { specs: specsInDays } = parsePredecessorString(action.newValue);\n const specs = specsInDays.map((spec) => ({\n ...spec,\n lag: lagDaysToHours(spec.lag, sector.hoursPerDay)\n }));\n\n // 2. Build a correlative_id → activityId resolver. Iterates the adapter\n // once; for huge schedules a per-instance index would be a perf win\n // but this matches legacy `gantt.getTaskBy('correlative_id', ...)`.\n const byCorrelative = new Map<string, ActivityId>();\n adapter.forEachActivity((a) => {\n if (a.correlative_id == null) return;\n byCorrelative.set(String(a.correlative_id), a.id);\n });\n const resolve = (corr: string): ActivityId | null =>\n byCorrelative.get(corr) ?? null;\n\n // 3. Pull the current incident links (incoming for predecessors,\n // outgoing for successors).\n const incidentLinkIds = isPredecessors ? activity.$target : activity.$source;\n const currentLinks: LinkSnapshot[] = [];\n for (const linkId of incidentLinkIds) {\n const link = adapter.getLink(linkId);\n if (link) currentLinks.push(link);\n }\n\n // 4. Diff: produce the minimal sequence of LinkOperations.\n const diff = isPredecessors\n ? diffLinks({\n targetActivityId: action.activityId,\n currentLinks,\n desiredSpecs: specs,\n resolveActivityByCorrelative: resolve\n })\n : diffOutgoingLinks({\n sourceActivityId: action.activityId,\n currentLinks,\n desiredSpecs: specs,\n resolveActivityByCorrelative: resolve\n });\n\n // 5. Delegate to the canonical batch applier. Same code path as\n // dispatchLink — autoscheduler, parent bounds, CP, ChangeSet are\n // built identically. Source is the inline-edit action so the\n // ChangeSet preserves the entry point.\n return dispatchLinkBatch(diff.operations, action, options, deps);\n}\n","/**\n * Amplitude event names emitted by the dispatch layer (structure mutations).\n * Analytics CONTRACT — values must stay byte-identical to production.\n * Column-level entry events live in `columns/shared/trackingEvents.ts`.\n */\n\nexport const DISPATCH_TRACK_EVENT = {\n ACTIVITY_CREATION: 'schedule_activity_creation',\n ACTIVITY_DELETION: 'schedule_activity_deletion',\n ACTIVITY_MOVE: 'schedule_activity_move',\n ACTIVITY_INDENT: 'schedule_activity_indent',\n ACTIVITY_OUTDENT: 'schedule_activity_outdent'\n} as const;\n\nexport type DispatchTrackEvent =\n (typeof DISPATCH_TRACK_EVENT)[keyof typeof DISPATCH_TRACK_EVENT];\n","/**\n * Recompute `hhWorkTime` + `real_work` cascading from a parent up to the\n * root. Used after tree-mutation operations (create / delete / indent /\n * outdent / move) where the structure changed and ancestor sums become\n * stale.\n *\n * Direct rollup against the adapter — no overlay needed because the\n * mutation has already been applied. The helper is the equivalent of\n * the `cascadeMutations` emitted by `hhWorkTimePipeline.transform` for\n * inline-edits.\n *\n * Legacy parallel: `updateCostAndHH` in\n * `react_client/src/assets/js/events/utils/updateCostAndHH.js`.\n */\n\nimport { isRootParent } from '../../internal/hierarchy/root-parent.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type { ActivityId } from '../../types.js';\nimport type { ActivityWriter } from '../../internal/state/roles.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\n\n/**\n * Starting from `startParentId`, walks upward (towards root) recomputing\n * each ancestor's `hhWorkTime` (sum of children) and `real_work` (sum of\n * children's real_work, where each child's real_work is its explicit\n * value or `hhWorkTime × progress / 100` if absent).\n *\n * If `startParentId` is `'0'` or null/undefined, no-op. If a parent is\n * the root, no recompute happens (the root has no parent to roll up to).\n */\nexport function recomputeHhCascadeForParent(\n startParentId: ActivityId | '0' | null | undefined,\n adapter: ActivityWriter\n): void {\n if (!startParentId || startParentId === '0') return;\n\n let currentParentId: ActivityId | null = String(startParentId) as ActivityId;\n while (currentParentId !== null) {\n const childIds = adapter.getChildren(currentParentId);\n\n let hhSum = 0;\n let rwSum = 0;\n for (const childId of childIds) {\n const child = adapter.getActivity(childId);\n if (!child) continue;\n const hh = readNumber(child, COLUMN.HH_WORK_TIME);\n const explicitRw = readMaybeNumber(child, COLUMN.REAL_WORK);\n const rw =\n explicitRw !== undefined\n ? explicitRw\n : (hh * readNumber(child, COLUMN.PROGRESS)) / 100;\n hhSum += hh;\n rwSum += rw;\n }\n\n adapter.setActivityField(currentParentId, COLUMN.HH_WORK_TIME, hhSum);\n adapter.setActivityField(currentParentId, COLUMN.REAL_WORK, rwSum);\n\n // Walk to grandparent.\n const parentSnap = adapter.getActivity(currentParentId);\n if (!parentSnap) break;\n const grandParent = parentSnap.parent;\n if (!grandParent || grandParent === '0') break;\n currentParentId = String(grandParent) as ActivityId;\n }\n}\n\n/**\n * Same as `recomputeHhCascadeForParent` but takes the activity whose\n * subtree changed (e.g., the newly-created or just-moved activity) and\n * starts the cascade from its parent. Convenience wrapper for the\n * dispatch branches.\n */\nexport function recomputeHhCascadeForActivity(\n activityId: ActivityId,\n adapter: ActivityWriter\n): void {\n const activity = adapter.getActivity(activityId);\n if (!activity) return;\n const parent = activity.parent;\n if (!parent || isRootParent(parent)) return;\n recomputeHhCascadeForParent(String(parent) as ActivityId, adapter);\n}\n\nfunction readNumber(\n activity: EngineActivitySnapshot,\n key: keyof EngineActivitySnapshot\n): number {\n const v = activity[key];\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n return 0;\n}\n\nfunction readMaybeNumber(\n activity: EngineActivitySnapshot,\n key: keyof EngineActivitySnapshot\n): number | undefined {\n const v = activity[key];\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n return undefined;\n}\n","/**\n * Recompute `used_cost` cascading from a parent up to the root. Used\n * after tree-mutation operations (create / delete / indent / outdent /\n * move) where structure changed and ancestor sums become stale.\n *\n * Direct rollup against the adapter — no overlay needed because the\n * mutation has already been applied. Mirrors the cascade emitted by\n * `usedCostPipeline.transform` for inline-edits.\n *\n * Legacy parallel: `updateCostAndHH` in\n * `react_client/src/assets/js/events/utils/updateCostAndHH.js`, which\n * also sums `used_cost` from children. Core fixes the latent bug where\n * legacy did not invoke this after indent/outdent/move.\n */\n\nimport { isRootParent } from '../../internal/hierarchy/root-parent.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type { ActivityId } from '../../types.js';\nimport type { ActivityWriter } from '../../internal/state/roles.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\n\nexport function recomputeUsedCostCascadeForParent(\n startParentId: ActivityId | '0' | null | undefined,\n adapter: ActivityWriter\n): void {\n if (!startParentId || startParentId === '0') return;\n\n let currentParentId: ActivityId | null = String(startParentId) as ActivityId;\n while (currentParentId !== null) {\n const childIds = adapter.getChildren(currentParentId);\n\n let sum = 0;\n for (const childId of childIds) {\n const child = adapter.getActivity(childId);\n if (!child) continue;\n sum += readNumber(child, COLUMN.USED_COST);\n }\n\n adapter.setActivityField(currentParentId, COLUMN.USED_COST, sum);\n\n const parentSnap = adapter.getActivity(currentParentId);\n if (!parentSnap) break;\n const grandParent = parentSnap.parent;\n if (!grandParent || grandParent === '0') break;\n currentParentId = String(grandParent) as ActivityId;\n }\n}\n\nexport function recomputeUsedCostCascadeForActivity(\n activityId: ActivityId,\n adapter: ActivityWriter\n): void {\n const activity = adapter.getActivity(activityId);\n if (!activity) return;\n const parent = activity.parent;\n if (!parent || isRootParent(parent)) return;\n recomputeUsedCostCascadeForParent(String(parent) as ActivityId, adapter);\n}\n\nfunction readNumber(\n activity: EngineActivitySnapshot,\n key: keyof EngineActivitySnapshot\n): number {\n const v = activity[key];\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n return 0;\n}\n","/**\n * Recompute `cost` cascading from a parent up to the root. Used after\n * tree-mutation operations (create / delete / indent / outdent / move)\n * where structure changed and ancestor sums become stale.\n *\n * Direct rollup against the adapter — no overlay needed because the\n * mutation has already been applied. Mirrors the cascade emitted by\n * `costPipeline.transform` for inline-edits.\n *\n * Legacy parallel: `updateCostAndHH` in\n * `react_client/src/assets/js/events/utils/updateCostAndHH.js`. Core\n * fixes the latent bug where legacy did not invoke this after\n * indent/outdent/move.\n *\n * `real_cost` cascade is deliberately omitted (baselines not modeled\n * in core yet).\n */\n\nimport { isRootParent } from '../../internal/hierarchy/root-parent.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type { ActivityId } from '../../types.js';\nimport type { ActivityWriter } from '../../internal/state/roles.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\n\nexport function recomputeCostCascadeForParent(\n startParentId: ActivityId | '0' | null | undefined,\n adapter: ActivityWriter\n): void {\n if (!startParentId || startParentId === '0') return;\n\n let currentParentId: ActivityId | null = String(startParentId) as ActivityId;\n while (currentParentId !== null) {\n const childIds = adapter.getChildren(currentParentId);\n\n let sum = 0;\n for (const childId of childIds) {\n const child = adapter.getActivity(childId);\n if (!child) continue;\n sum += readNumber(child, COLUMN.COST);\n }\n\n adapter.setActivityField(currentParentId, COLUMN.COST, sum);\n\n const parentSnap = adapter.getActivity(currentParentId);\n if (!parentSnap) break;\n const grandParent = parentSnap.parent;\n if (!grandParent || grandParent === '0') break;\n currentParentId = String(grandParent) as ActivityId;\n }\n}\n\nexport function recomputeCostCascadeForActivity(\n activityId: ActivityId,\n adapter: ActivityWriter\n): void {\n const activity = adapter.getActivity(activityId);\n if (!activity) return;\n const parent = activity.parent;\n if (!parent || isRootParent(parent)) return;\n recomputeCostCascadeForParent(String(parent) as ActivityId, adapter);\n}\n\nfunction readNumber(\n activity: EngineActivitySnapshot,\n key: keyof EngineActivitySnapshot\n): number {\n const v = activity[key];\n if (typeof v === 'number' && Number.isFinite(v)) return v;\n return 0;\n}\n","/**\n * Defaults for newly-created activities — the **canonical template** that\n * `buildNewActivity` spreads before applying caller-provided overrides.\n *\n * Single source of truth: any documentation that says \"a new activity\n * starts as X\" must reference this constant, never inline literals.\n *\n * The shape produced by spreading this constant + the runtime-computed\n * fields below is a complete Activity (every field in the `Activity`\n * interface from `../../types.ts` is accounted for).\n *\n * Fields NOT in this constant are computed at runtime because they depend\n * on input or context:\n * - `id` → allocated by `ActivityIdGenerator.next()`\n * - `parent` → from `DispatchAction.parentId` (or `'0'`)\n * - `start_date` → inherited from parent or `fallbackStartDate`,\n * then snapped to the calendar's next\n * working-time boundary\n * - `end_date` → calendar-aware via `adapter.calculateEndDate`\n * - `duration` → override > `sector.hoursPerDay` > `8`\n * - `calendar_id` → override > `sector.defaultCalendar`\n * - `unique_correlative_id` → allocated by `UniqueCorrelativeIdGenerator.next()`\n * - `custom_id` → allocated by `customIdTracker`\n * - `text` → `'New Master Plan'` when this is the very\n * first activity of the sector, `'New Activity'`\n * otherwise (override beats both)\n * - `correlative_id` → assigned by `recomputeCorrelativeIds` after\n * the new activity has been inserted in the\n * parent's children list\n *\n * The `real_constraint_type` field is set AFTER the spread of overrides so\n * it always mirrors the (possibly overridden) `constraint_type`.\n */\n\nimport type { NewActivityFields } from './types.js';\n\nexport const NEW_ACTIVITY_DEFAULTS: Readonly<\n Omit<\n NewActivityFields,\n // Runtime-computed — never read from defaults.\n | 'id'\n | 'parent'\n | 'start_date'\n | 'end_date'\n | 'duration'\n | 'calendar_id'\n | 'unique_correlative_id'\n | 'text'\n | 'start_date_backup'\n >\n> = Object.freeze({\n // ── Domain fields (Activity interface) ────────────────────────────────\n description: '',\n type: 'task',\n progress: 0,\n // D3 fix (2026-05-19): match production DHTMLX default 'asap' instead\n // of null. See DIVERGENCES_activity_create.md D3.\n constraint_type: 'asap',\n constraint_date: null,\n auto_scheduling: true,\n cost: 0,\n used_cost: 0,\n // Earned cost: (progress/100) × activeBaseline.cost. A fresh leaf has\n // progress 0 and no active baseline → 0, matching the load-path emitRealCost.\n // Without this the field is undefined and surfaces as NaN downstream.\n real_cost: 0,\n hhWorkTime: 0,\n real_work: 0,\n ponderator: 0,\n\n // ── Outbuild-specific model fields ────────────────────────────────────\n responsables: [],\n tags: [],\n subcontractId: null,\n real_constraint_type: 'asap',\n\n // ── UI / lookahead pass-through flags ─────────────────────────────────\n should_be_showed: true,\n // View-model visibility bit (first-class mirror of should_be_showed;\n // `visible !== false` = visible). New activities are always visible.\n visible: true,\n activityModifications: [],\n pendingRequests: [],\n\n // ── Lifecycle flags consumed by legacy onAfterTaskAdd paths ───────────\n // These mark the activity as freshly created so downstream handlers can\n // distinguish it from updates. Removed once the legacy paths are gone.\n new_task: true,\n isNewActivity: true,\n\n // ── DHTMLX link index mirrors — must exist (not undefined) so the\n // snapshot reads them directly. See D1 in DIVERGENCES_activity_create.md.\n $source: [],\n $target: []\n});\n\n/**\n * Non-model keys a caller's create-override bag may carry that must NEVER reach\n * a domain activity. The bridge's `gantt.createTask` spreads a live dhtmlx task\n * object (`{ ...task }`), so the bag can pick up dhtmlx runtime junk and legacy\n * lightbox UI state. `buildNewActivity` drops these before spreading so they\n * can't phantom onto the created activity.\n *\n * We DENY-list rather than allow-list because the activity model surface (base\n * `Activity` fields + derived column fields like `expected_progress_base` that\n * paste legitimately copies) is large and grows; the junk is a small, bounded,\n * well-known set. A new real model field is kept by default (safe); only proven\n * junk is dropped.\n *\n * dhtmlx runtime fields are all `$`-prefixed — caught by prefix — EXCEPT the two\n * model mirrors `$source`/`$target`, which are real fields kept via the guard in\n * `isDroppableOverrideKey`. The rest are legacy lightbox snapshot keys and the\n * `name` alias — the create pipeline maps `name` → the `text` model field first,\n * then drops the raw `name` key here so it can't linger as a phantom property.\n */\nexport const NON_MODEL_OVERRIDE_KEYS: ReadonlySet<string> = new Set<string>([\n 'name',\n 'old_type',\n 'old_duration',\n 'on_open_lightbox_type',\n 'for_disable_milestone_duration',\n 'last_constraint',\n 'constraint_type_old'\n]);\n\n/** True when an override key is dhtmlx/lightbox junk that must not reach the model. */\nexport function isDroppableOverrideKey(key: string): boolean {\n if (key === '$source' || key === '$target') return false;\n return key.startsWith('$') || NON_MODEL_OVERRIDE_KEYS.has(key);\n}\n\nexport { DEFAULT_HOURS_PER_DAY } from '../constants/workday.js';\n\n/** Default text for the very first activity of a sector. */\nexport const FIRST_ACTIVITY_TEXT = 'New Master Plan';\n\n/** Default text for every subsequent new activity. */\nexport const NEW_ACTIVITY_TEXT = 'New Activity';\n","/**\n * Pure function that initializes a new activity for the schedule.\n *\n * Successor of the legacy `setTaskStartDate` + `initializeNewTask` +\n * `configureTaskBeforeCreate` trio in\n * `react_client/src/assets/js/custom_actions/createTask/utils.js`. Two\n * deliberate divergences vs the legacy:\n *\n * 1. `start_date` is normalized to UTC midnight (`setUTCHours(0,…)`),\n * not browser-local midnight. The rest of the core is UTC-strict; a\n * local-midnight value would compare wrong against calendars and\n * autoscheduler internals.\n *\n * 2. `end_date` is computed via the calendar (`adapter.calculateEndDate`)\n * so working shifts and holidays are respected from the start. The\n * first port had a `deriveEndDate` helper that did `start + duration*ms`\n * ignoring the calendar; that was a port-time shortcut, not legacy\n * behavior (legacy delegated end_date to DHTMLX `_init_task` which\n * always called `gantt.calculateEndDate`).\n */\n\nimport { WORK_TIME_DIRECTION } from '../types.js';\n// Engine snapshot (snake_case): what `ActivityCreationAdapter.getActivity`\n// returns and what its calendar methods take as `task`.\nimport type { EngineActivitySnapshot } from '../autoscheduler/types.js';\nimport {\n NEW_ACTIVITY_DEFAULTS,\n isDroppableOverrideKey,\n DEFAULT_HOURS_PER_DAY,\n FIRST_ACTIVITY_TEXT,\n NEW_ACTIVITY_TEXT\n} from './defaults.js';\nimport type {\n NewActivityFields,\n ActivityCreationAdapter,\n ActivityCreationInput,\n TaskCreationResult\n} from './types.js';\n\n/**\n * Drop incidental non-model keys the caller's override bag may carry (dhtmlx\n * runtime junk / legacy lightbox state — `gantt.createTask` spreads a live\n * dhtmlx task object), keeping every real model field. See\n * `isDroppableOverrideKey` in defaults.ts.\n */\nfunction pickHonoredOverrides(\n overrides: Partial<NewActivityFields>\n): Partial<NewActivityFields> {\n const honored: Record<string, unknown> = {};\n for (const key of Object.keys(overrides)) {\n if (!isDroppableOverrideKey(key)) honored[key] = overrides[key];\n }\n return honored as Partial<NewActivityFields>;\n}\n\n/**\n * Produces the fully-configured new activity. Does NOT insert it anywhere —\n * the caller (dispatch) is responsible for applying it to the adapter.\n */\nexport function buildNewActivity(\n input: ActivityCreationInput,\n adapter: ActivityCreationAdapter\n): TaskCreationResult {\n const parent =\n input.parentId != null ? adapter.getActivity(input.parentId) : null;\n\n const activityOverrides = input.activityOverrides ?? {};\n\n const defaultText =\n input.numTasksInGantt === 0 ? FIRST_ACTIVITY_TEXT : NEW_ACTIVITY_TEXT;\n // `name` is an accepted alias for the model field `text`: legacy storage\n // stays `text`, but the create surface may speak of `name`. Precedence:\n // explicit `text` > `name` alias > computed default.\n const nameAlias = (activityOverrides as { name?: unknown }).name;\n const text =\n activityOverrides.text ??\n (typeof nameAlias === 'string' ? nameAlias : undefined) ??\n defaultText;\n const duration =\n activityOverrides.duration ??\n input.sector.hoursPerDay ??\n DEFAULT_HOURS_PER_DAY;\n const calendarId =\n activityOverrides.calendar_id ?? input.sector.defaultCalendar;\n\n // We need a partial activity snapshot to resolve the calendar for the\n // end_date computation. Only `calendar_id` matters for that resolution.\n const activityForCalendar = {\n calendar_id: calendarId\n } as unknown as EngineActivitySnapshot;\n\n // D2 fix (2026-05-19): instead of normalizing to UTC midnight (which\n // produces a non-working instant), snap the inherited start_date to\n // the closest future working time of the new activity's calendar.\n // Matches production: a fresh child inherits its parent's exact\n // start_date when both share a calendar, or snaps to shift_start when\n // calendars differ. See DIVERGENCES_activity_create.md D2.\n const rawStartDate = resolveStartDate(\n parent,\n input.fallbackStartDate,\n activityOverrides.start_date\n );\n const startDate = adapter.getClosestWorkTime({\n date: rawStartDate,\n dir: WORK_TIME_DIRECTION.FUTURE,\n task: activityForCalendar\n });\n\n const endDate = adapter.calculateEndDate({\n start_date: startDate,\n duration,\n task: activityForCalendar\n });\n\n const newTask: NewActivityFields = {\n // Static defaults (see `NEW_ACTIVITY_DEFAULTS` for the single source of truth).\n ...NEW_ACTIVITY_DEFAULTS,\n // Runtime-computed fields.\n text,\n start_date: startDate,\n end_date: endDate,\n duration,\n calendar_id: calendarId,\n parent: input.parentId == null ? '0' : String(input.parentId),\n unique_correlative_id: input.nextUniqueCorrelativeId,\n // Caller-provided overrides win over every default above — but only the\n // known model keys. Incidental non-model keys (dhtmlx runtime junk, lightbox\n // UI state, the `name` alias) are dropped so they never phantom onto the\n // domain activity. See `KNOWN_OVERRIDE_KEYS` in defaults.ts.\n ...pickHonoredOverrides(activityOverrides)\n } as NewActivityFields;\n\n // CRÍTICO — cada activity debe tener arrays PROPIOS. `NEW_ACTIVITY_DEFAULTS`\n // expone arrays constantes (`responsables`, `tags`, `activityModifications`,\n // `pendingRequests`, `$source`, `$target`); el spread copia la REFERENCIA, así\n // que sin esto todas las activities creadas comparten el mismo array y un\n // `.push` (p.ej. `addLink`) corrompe a TODAS. Bug que hacía desaparecer todo\n // el schedule al borrar una pegada con links. Clonamos genéricamente todo\n // array (cubre campos presentes y futuros), una sola vez en el punto de\n // creación.\n for (const [key, value] of Object.entries(newTask)) {\n if (Array.isArray(value)) newTask[key] = [...value];\n }\n // Una activity nueva NUNCA tiene links propios al crearse — el remap del paste\n // los añade después vía `addLink`. Forzamos vacío para descartar además los\n // `$source/$target` STALE que el override pudiera traer del snapshot copiado\n // (ids de links de otro proyecto → al borrar, cleanup de un link inexistente).\n newTask.$source = [];\n newTask.$target = [];\n\n // `real_constraint_type` always mirrors the (possibly overridden)\n // `constraint_type`. Done after the spread so the override is honored.\n newTask.real_constraint_type = newTask.constraint_type;\n\n // `for_disable_milestone_duration`: the working-HOURS mirror of duration the\n // Duration column renders (legacy stamps it on create; parseFromBackend seeds\n // it at load). At create, `duration` is already in working hours, so the\n // mirror is `round(duration)` — 0 for a milestone (its duration is 0). Seeded\n // after the spread so an override's duration/type is honored.\n const isMilestone = newTask.type === 'milestone';\n newTask.for_disable_milestone_duration = isMilestone\n ? 0\n : Math.round(newTask.duration);\n\n return { newTask };\n}\n\n// ---------------------------------------------------------------------------\n// Helpers (pure)\n// ---------------------------------------------------------------------------\n\n/** Port of `setTaskStartDate`: child inherits parent's start_date. */\nfunction resolveStartDate(\n parent: EngineActivitySnapshot | null,\n fallback: Date | undefined,\n override: Date | undefined\n): Date {\n if (override) return new Date(override);\n if (parent) return new Date(parent.start_date);\n return fallback ? new Date(fallback) : new Date();\n}\n","/**\n * Pure function that clones `updateParentAfterTaskCreation` from\n * `src/assets/js/custom_actions/createTask/utils.js`, plus the DHTMLX\n * auto-promotion task→project that happens when a leaf task gains\n * children.\n *\n * Given the parent id + newly-created child id, returns the FieldChanges\n * to apply on the parent.\n */\n\nimport {\n isPromotableLeafType,\n PROMOTION_TARGET_TYPE\n} from '../activity-types/index.js';\nimport { CONSTRAINT_TYPE } from '../constraints/index.js';\nimport type { ConstraintType } from '../constraints/index.js';\nimport type { ActivityId } from '../columns/types.js';\nimport type {\n ParentChanges,\n ParentMutationFields,\n ParentReaderActivity\n} from './types.js';\n\nexport interface ParentMutationInput {\n parentId: ActivityId;\n newChildId: ActivityId;\n /** Reader for the parent's current state */\n getParent: (id: ActivityId) => ParentReaderActivity | null;\n /**\n * Whether the parent is currently a leaf (no actual tree children).\n * If omitted, falls back to checking `newActivitiesArray.length === 0`,\n * which is unreliable when stale data is present.\n */\n isCurrentlyLeaf?: boolean;\n /**\n * What drove this promotion (MORNING_QUEUE.md — JUN-23):\n * - `'create'` — a genuinely NEW child (progress 0) was created under the\n * parent. The weighted aggregate of a fresh child is 0, so the promoted\n * project's `progress` is stamped 0 (D7).\n * - `'reparent'` — an EXISTING child was moved in (indent / move / paste).\n * Legacy never writes the parent's `progress` on a reparent — the new\n * project keeps its pre-promotion leaf value (e.g. a completed 100% leaf\n * that gains a child stays 100%, NOT reset to 0). So we OMIT the `progress`\n * stamp; the leaf's prior value is preserved.\n * Defaults to `'create'` (the historical D7 behavior) when omitted.\n */\n promotionSource?: 'create' | 'reparent';\n}\n\n/**\n * Returns the fields to apply on the parent after a child was created.\n * Returns null if the parent doesn't exist.\n */\nexport function buildParentMutations(\n input: ParentMutationInput\n): ParentChanges | null {\n const parent = input.getParent(input.parentId);\n if (!parent) return null;\n\n // A leaf TASK or a leaf MILESTONE promotes to project when it gains its first\n // child (a project can hold children; a task/milestone cannot). Milestones\n // were previously excluded — the legacy frontend handled them in\n // `adjustParentMilestone`; the core now owns it here.\n const wasPromotableLeaf =\n input.isCurrentlyLeaf !== undefined\n ? input.isCurrentlyLeaf && isPromotableLeafType(parent.type)\n : isPromotableLeaf(parent);\n const wasMilestone = parent.type === 'milestone';\n const existingArray = Array.isArray(parent.newActivitiesArray)\n ? parent.newActivitiesArray\n : [];\n\n // Dedup: DHTMLX maintains newActivitiesArray in-place (push + re-render\n // rebuilds from live children), so duplicates are transient in the live\n // app. Replay is snapshot-based so we emulate the dedup explicitly.\n const dedupedArray = existingArray.some(\n (id) => String(id) === String(input.newChildId)\n )\n ? [...existingArray]\n : [...existingArray, input.newChildId];\n\n const fields: ParentMutationFields = {\n is_lookahead: false,\n hasNewActivities: true,\n newActivitiesArray: dedupedArray,\n // Ported from `onBeforeTaskAdd`: captures the parent's PRE-mutation type.\n // First child of a task → 'task' (then gets flipped to 'project' below).\n // Nth child of a project → 'project' (no type change but still recorded).\n old_type: parent.type\n };\n\n if (parent.custom_id != null && parent.custom_id !== '') {\n fields.custom_id = null;\n }\n\n // DHTMLX auto-promotes a leaf task (or milestone) to 'project' when it gains\n // children. Mirror that here so replay reproduces the fixture's expected state.\n if (wasPromotableLeaf) {\n fields.type = PROMOTION_TARGET_TYPE;\n fields.$rendered_type = PROMOTION_TARGET_TYPE;\n // A project is never a milestone — clear the flag on milestone promotion\n // (legacy `adjustParentMilestone`). No-op for a task (already not one).\n if (wasMilestone) fields.is_milestone = false;\n fields.$no_start = true;\n fields.$no_end = true;\n // D6 fix (2026-05-19): a project's start_date/end_date are aggregated\n // from its children, so a constraint on the project has no semantic\n // anchor. Producción nullifica el constraint al promote. Mirror.\n // See DIVERGENCES_activity_create.md D6.\n fields.constraint_type = CONSTRAINT_TYPE.ASAP;\n fields.constraint_date = null;\n // N2: `real_constraint_type` is PRESERVED frozen at the parent's\n // pre-mutation constraint — legacy `setParentAsASAPConstraint` never\n // writes it, so it keeps the value it had before the child was added\n // (e.g. a SNET milestone stays 'snet'). It is display/serialization\n // only (not read by scheduler/CP). The core must capture it explicitly\n // because it isn't stored first-class — leaving it undefined would make\n // it derive from the now-ASAP `constraint_type`. See N2 fix.\n fields.real_constraint_type = (parent.constraint_type ??\n CONSTRAINT_TYPE.ASAP) as ConstraintType;\n // D7 fix (2026-05-19): a project's progress is the weighted aggregate\n // of its children. On auto-promote the parent gains its first child\n // with progress=0 (the canonical default for a fresh activity), so\n // the weighted aggregate is 0. Preserving the leaf's old progress\n // (e.g. 100 from a completed task that just gained a child) would\n // leave the project visually contradictory (parent 100%, child 0%).\n // Producción evidencia ese bug visual; core lo corrige.\n // Formula canonical (per react_client/src/utils/gantt/legacyProgressUtils.js):\n // parent.progress = Σ(child.progress × child.ponderator / 100)\n // First-child case → result = 0. See DIVERGENCES_activity_create.md D7.\n //\n // JUN-23: stamp `progress = 0` ONLY for a genuine CREATE (a fresh child).\n // For a REPARENT (indent / move / paste) the moved child is an EXISTING\n // activity with its own progress; legacy NEVER writes the parent's progress\n // on a reparent — the promoted project keeps its pre-promotion leaf value\n // (confirmed LIVE: a 100%-complete leaf that gains a child stays 100%, not\n // reset to 0). Omitting the write preserves the leaf's progress; the\n // weighted rollup (ponderator-aware, with the ponderator-0 freeze) then\n // owns any later recompute. See MORNING_QUEUE.md — JUN-23.\n if ((input.promotionSource ?? 'create') === 'create') {\n fields.progress = 0;\n }\n }\n\n return { parentId: input.parentId, fields };\n}\n\nfunction isPromotableLeaf(parent: ParentReaderActivity): boolean {\n return (\n isPromotableLeafType(parent.type) &&\n (!Array.isArray(parent.newActivitiesArray) ||\n parent.newActivitiesArray.length === 0)\n );\n}\n","/**\n * Positional helpers shared by the structural dispatch handlers. They own\n * fractional `correlative_id` positioning (midpoint insertion, fractional\n * cid at a visual index, temporary sentinels later normalized by the DFS\n * renumber sweep) and the sibling walks (collect siblings of a parent,\n * previous sibling in visual order, first selected sibling of an unbroken\n * selected chain) used by the create / move / indent / outdent handlers.\n */\n\nimport type { ActivityReader } from '../../internal/state/roles.js';\nimport {\n ROOT_PARENT_ID,\n normalizeParentKey\n} from '../../internal/hierarchy/root-parent.js';\nimport { getChildrenInVisualOrder } from '../../internal/hierarchy/visual-order.js';\nimport type { ActivityId } from '../../types.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\n\nexport function computeInsertionCorrelativeId(\n adapter: ActivityReader,\n parentId: ActivityId | '0',\n afterSiblingId: ActivityId | undefined,\n beforeSiblingId: ActivityId | undefined\n): number {\n const parentKey = parentId;\n const isRoot = parentKey === ROOT_PARENT_ID;\n\n const siblings = collectSiblings(adapter, parentKey);\n\n if (beforeSiblingId !== undefined) {\n const before = siblings.find((s) => s.id === beforeSiblingId);\n if (before) {\n const beforeCid = readCorrelativeId(before);\n // Find the cid immediately less than `beforeCid` among siblings.\n // If `beforeSibling` is currently the first child (no lesser cid\n // exists), the new activity becomes the new first child: use\n // `beforeCid - 1` as a temporary placeholder — the DFS sweep at\n // step 10 renumbers all cids to non-negative integers anyway.\n const lesser = siblings\n .map(readCorrelativeId)\n .filter((c) => c < beforeCid);\n if (lesser.length === 0) return beforeCid - 1;\n const prevCid = Math.max(...lesser);\n return (prevCid + beforeCid) / 2;\n }\n }\n\n if (afterSiblingId !== undefined) {\n const after = siblings.find((s) => s.id === afterSiblingId);\n if (after) {\n const afterCid = readCorrelativeId(after);\n const greater = siblings\n .map(readCorrelativeId)\n .filter((c) => c > afterCid);\n if (greater.length === 0) return afterCid + 1;\n const nextCid = Math.min(...greater);\n return (afterCid + nextCid) / 2;\n }\n }\n\n // Append: max sibling cid + 1, or 0 for first child.\n if (siblings.length === 0) return isRoot ? 0 : 0;\n const max = Math.max(...siblings.map(readCorrelativeId));\n return max + 1;\n}\n\n/** Sort sentinel for activities whose correlative_id is missing/invalid. */\nexport const NOT_SET_SORT_VALUE = Number.MAX_SAFE_INTEGER;\n/** Temporary large cid so recompute places a moved activity after current siblings. */\nexport const TEMP_CID_SENTINEL = Number.MAX_SAFE_INTEGER - 1;\n\nexport function readCorrelativeId(activity: EngineActivitySnapshot): number {\n const raw = activity.correlative_id;\n const n = typeof raw === 'number' ? raw : Number(raw);\n return Number.isFinite(n) ? n : NOT_SET_SORT_VALUE;\n}\n\nexport function collectSiblings(\n adapter: ActivityReader,\n parentKey: string\n): EngineActivitySnapshot[] {\n const siblings: EngineActivitySnapshot[] = [];\n adapter.forEachActivity((a) => {\n const ap = normalizeParentKey(a.parent);\n if (ap === parentKey) siblings.push(a);\n });\n return siblings;\n}\n\nexport function findFirstSelectedSibling(\n taskId: ActivityId,\n selected: ReadonlySet<ActivityId>,\n adapter: ActivityReader\n): ActivityId {\n // Walks backward in visual order while siblings remain in `selected`,\n // returning the topmost selected sibling reachable by an unbroken\n // selected chain. Matches legacy `findFirstSelectedSiblingTaskId`.\n let firstSelected = taskId;\n let prev = findPrevSiblingHelper(taskId, adapter);\n while (prev != null && selected.has(prev)) {\n firstSelected = prev;\n prev = findPrevSiblingHelper(prev, adapter);\n }\n return firstSelected;\n}\n\nexport function findPrevSiblingHelper(\n taskId: ActivityId,\n adapter: ActivityReader\n): ActivityId | null {\n const a = adapter.getActivity(taskId);\n if (!a) return null;\n const pkey = normalizeParentKey(a.parent) as ActivityId | '0';\n const siblings = getChildrenInVisualOrder(pkey, adapter);\n const idx = siblings.findIndex((id) => String(id) === String(taskId));\n if (idx <= 0) return null;\n return siblings[idx - 1] ?? null;\n}\n\nexport function computeFractionalCidAtIndex(\n adapter: ActivityReader,\n parentKey: ActivityId | '0',\n targetIndex: number,\n excludeId: ActivityId\n): number {\n const siblings = getChildrenInVisualOrder(parentKey, adapter)\n .filter((id) => String(id) !== String(excludeId))\n .map((id) => adapter.getActivity(id))\n .filter((a): a is EngineActivitySnapshot => a !== null);\n\n if (siblings.length === 0) return 0;\n\n const cids = siblings.map(readCorrelativeId);\n\n if (targetIndex <= 0) {\n return cids[0]! - 1;\n }\n if (targetIndex >= cids.length) {\n return cids[cids.length - 1]! + 1;\n }\n const before = cids[targetIndex - 1]!;\n const after = cids[targetIndex]!;\n return (before + after) / 2;\n}\n","import type {\n ActivityWriter,\n WriteJournal\n} from '../../internal/state/roles.js';\nimport { REJECTION_REASON } from '../reasons.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { isFrozen } from '../../internal/selection/is-frozen.js';\nimport { DISPATCH_TRACK_EVENT } from '../tracking-events.js';\nimport {\n ROOT_PARENT_ID,\n isRootParent\n} from '../../internal/hierarchy/root-parent.js';\nimport { recomputeCorrelativeIds } from '../../internal/hierarchy/recompute-correlative-ids.js';\nimport { recomputeHhCascadeForActivity } from '../../propagations/upward/recompute-hh-cascade.js';\nimport { recomputeUsedCostCascadeForActivity } from '../../propagations/upward/recompute-used-cost-cascade.js';\nimport { recomputeCostCascadeForActivity } from '../../propagations/upward/recompute-cost-cascade.js';\nimport { buildNewActivity } from '../../creation/activity-creation-pipeline.js';\nimport { buildParentMutations } from '../../creation/parent-mutation-pipeline.js';\nimport type {\n NewActivityFields,\n ActivityCreationInput,\n ParentReaderActivity\n} from '../../creation/types.js';\nimport type {\n Activity,\n ActivityId,\n Calendar,\n CalendarId,\n PendingRequest\n} from '../../types.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\nimport type {\n ChangeSet,\n DispatchAction,\n DispatchOptions,\n DispatchResult\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport { computeInsertionCorrelativeId } from '../shared/positional.js';\nimport {\n snapshotActivities,\n foldCorrelativeShifts\n} from '../shared/snapshots.js';\nimport { setActivityFieldDynamic } from '../../internal/state/dynamic-writes.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport { recomputeParentBoundsSync } from '../../internal/post-processors/runner.js';\nimport { snapshotToActivity } from '../conversion.js';\n\nexport type CreateActivityCoreDeps = Pick<\n DispatchDeps,\n | 'adapter'\n | 'scheduler'\n | 'sector'\n | 'calendars'\n | 'activityIdGen'\n | 'uidGen'\n | 'customIdTracker'\n>;\n\nexport type CreateActivityCoreResult =\n | {\n ok: true;\n newId: ActivityId;\n parent: EngineActivitySnapshot | null;\n newActivity: NewActivityFields & { id: ActivityId };\n beforeSnap: Map<string, EngineActivitySnapshot>;\n initialTouched: Set<string>;\n }\n | { ok: false; reason: string };\n\ninterface CreateActivityCoreOptions {\n skipCorrelativeRecompute?: boolean;\n customIdReferenceId?: ActivityId;\n preserveParentCustomId?: boolean;\n skipBeforeSnap?: boolean;\n}\n\ntype NewActivity = NewActivityFields & {\n id: ActivityId;\n correlative_id?: number;\n custom_id?: string | null;\n};\n\ntype CreateTarget =\n | { ok: false; reason: string }\n | {\n ok: true;\n parent: EngineActivitySnapshot | null;\n anchorSiblingId: ActivityId | undefined;\n isRoot: boolean;\n };\n\nexport function createActivityCore(\n action: Extract<DispatchAction, { kind: 'activity-create' }>,\n deps: CreateActivityCoreDeps,\n opts: CreateActivityCoreOptions = {}\n): CreateActivityCoreResult {\n const { adapter, scheduler, sector, calendars, activityIdGen, uidGen } = deps;\n scheduler.invalidateAllCaches();\n\n const target = validateCreateTarget(action, adapter);\n if (!target.ok) return target;\n const { parent, anchorSiblingId, isRoot } = target;\n\n const newId = resolveNewActivityId(action.activityId, adapter, activityIdGen);\n const newUid = uidGen.next();\n\n const activityInput: ActivityCreationInput = {\n parentId: isRoot ? null : action.parentId,\n sector: {\n id: sector.id,\n hoursPerDay: sector.hoursPerDay,\n defaultCalendar: findDefaultCalendarId(calendars)\n },\n numTasksInGantt: adapter.activityCount(),\n nextUniqueCorrelativeId: newUid,\n activityOverrides: (action.overrides ?? {}) as Partial<NewActivityFields>\n };\n const created = buildNewActivity(activityInput, {\n getActivity: (id) => adapter.getActivity(id),\n calculateEndDate: (params) => adapter.calculateEndDate(params),\n getClosestWorkTime: (params) => adapter.getClosestWorkTime(params)\n });\n const newActivity: NewActivity = { ...created.newTask, id: newId };\n\n assignCustomId(newActivity, action, deps, anchorSiblingId, parent, opts);\n\n const insertionCorrelativeId = computeInsertionCorrelativeId(\n adapter,\n isRoot ? ROOT_PARENT_ID : action.parentId,\n action.afterSiblingId,\n action.beforeSiblingId\n );\n newActivity.correlative_id = insertionCorrelativeId;\n\n const initialTouched = new Set<string>([newId]);\n if (parent) initialTouched.add(parent.id);\n const beforeSnap = opts.skipBeforeSnap\n ? new Map<string, EngineActivitySnapshot>()\n : snapshotActivities(adapter, initialTouched);\n\n adapter.addActivity(newActivity as unknown as EngineActivitySnapshot);\n\n applyParentMutations(\n action,\n newId,\n parent,\n adapter,\n opts.preserveParentCustomId ?? false\n );\n\n recomputeHhCascadeForActivity(newId, adapter);\n recomputeUsedCostCascadeForActivity(newId, adapter);\n recomputeCostCascadeForActivity(newId, adapter);\n\n recomputeAndFoldCorrelatives(\n adapter,\n newId,\n beforeSnap,\n initialTouched,\n opts\n );\n\n return { ok: true, newId, parent, newActivity, beforeSnap, initialTouched };\n}\n\nfunction validateCreateTarget(\n action: Extract<DispatchAction, { kind: 'activity-create' }>,\n adapter: CreateActivityCoreDeps['adapter']\n): CreateTarget {\n const isRoot = isRootParent(action.parentId);\n const parent = isRoot ? null : adapter.getActivity(action.parentId);\n if (!isRoot && !parent) {\n return { ok: false, reason: REJECTION_REASON.PARENT_NOT_FOUND };\n }\n\n const isParentFrozenBySir =\n parent !== null &&\n isFrozen({\n pendingRequests: parent.pendingRequests as\n | readonly PendingRequest[]\n | undefined\n });\n if (isParentFrozenBySir) {\n return { ok: false, reason: REJECTION_REASON.PARENT_FROZEN_BY_SIR };\n }\n\n const hasConflictingAnchors =\n action.afterSiblingId !== undefined && action.beforeSiblingId !== undefined;\n if (hasConflictingAnchors) {\n return { ok: false, reason: REJECTION_REASON.ANCHOR_SIBLING_CONFLICT };\n }\n\n const anchorSiblingId = action.afterSiblingId ?? action.beforeSiblingId;\n const anchorError = validateAnchorSibling(\n action,\n adapter,\n isRoot,\n anchorSiblingId\n );\n if (anchorError) return anchorError;\n\n return { ok: true, parent, anchorSiblingId, isRoot };\n}\n\nfunction validateAnchorSibling(\n action: Extract<DispatchAction, { kind: 'activity-create' }>,\n adapter: CreateActivityCoreDeps['adapter'],\n isRoot: boolean,\n anchorSiblingId: ActivityId | undefined\n): { ok: false; reason: string } | null {\n if (anchorSiblingId === undefined) return null;\n const sibling = adapter.getActivity(anchorSiblingId);\n if (!sibling) {\n return { ok: false, reason: REJECTION_REASON.ANCHOR_SIBLING_NOT_FOUND };\n }\n const expectedSiblingParent = isRoot ? ROOT_PARENT_ID : action.parentId;\n const siblingIsRootChild = sibling.parent == null || sibling.parent === 0;\n const actualSiblingParent = siblingIsRootChild\n ? ROOT_PARENT_ID\n : String(sibling.parent);\n if (actualSiblingParent !== expectedSiblingParent) {\n return { ok: false, reason: REJECTION_REASON.ANCHOR_SIBLING_WRONG_PARENT };\n }\n return null;\n}\n\n/**\n * Allocates the new activity's id. An explicit id is honored only when free; a\n * colliding one would overwrite an existing activity — never do that, allocate a\n * fresh id instead (audit 2026-07-14 §6.b #1). `activityExists` is an O(1) Map\n * lookup and only runs when the caller passed an explicit id.\n */\nfunction resolveNewActivityId(\n explicitId: ActivityId | undefined,\n adapter: CreateActivityCoreDeps['adapter'],\n activityIdGen: CreateActivityCoreDeps['activityIdGen']\n): ActivityId {\n if (explicitId === undefined) return activityIdGen.next();\n if (adapter.activityExists(explicitId)) return activityIdGen.next();\n activityIdGen.bump(explicitId);\n return explicitId;\n}\n\nfunction readExplicitCustomId(\n action: Extract<DispatchAction, { kind: 'activity-create' }>\n): string | undefined {\n if (\n action.overrides === undefined ||\n !(COLUMN.CUSTOM_ID in action.overrides)\n ) {\n return undefined;\n }\n const value = (action.overrides as Record<string, unknown>).custom_id;\n return typeof value === 'string' ? value : undefined;\n}\n\nfunction assignCustomId(\n newActivity: NewActivity,\n action: Extract<DispatchAction, { kind: 'activity-create' }>,\n deps: CreateActivityCoreDeps,\n anchorSiblingId: ActivityId | undefined,\n parent: EngineActivitySnapshot | null,\n opts: CreateActivityCoreOptions\n): void {\n const { adapter, customIdTracker } = deps;\n const explicit = readExplicitCustomId(action);\n\n if (explicit !== undefined) {\n if (explicit.length === 0) return;\n // A unique explicit code is honored; a COLLIDING one falls through to\n // generation so two activities never share a custom_id (audit §6.b #5).\n if (!customIdTracker.isCustomIdInUse(explicit)) {\n customIdTracker.registerCustomId(explicit);\n return;\n }\n }\n\n const customIdAnchorId = anchorSiblingId ?? opts.customIdReferenceId;\n const derivesFromAnchor = customIdAnchorId !== undefined;\n const referenceActivity = derivesFromAnchor\n ? adapter.getActivity(customIdAnchorId)\n : parent;\n newActivity.custom_id = customIdTracker.generateCustomIdForNewChild({\n activity: referenceActivity ?? {},\n useActivityCustomIdAsReference: derivesFromAnchor\n });\n}\n\nfunction applyParentMutations(\n action: Extract<DispatchAction, { kind: 'activity-create' }>,\n newId: ActivityId,\n parent: EngineActivitySnapshot | null,\n adapter: CreateActivityCoreDeps['adapter'],\n preserveParentCustomId: boolean\n): void {\n if (!parent) return;\n const parentMutations = buildParentMutations({\n parentId: action.parentId,\n newChildId: newId,\n getParent: (id) =>\n (adapter.getActivity(id) as ParentReaderActivity | null) ?? null\n });\n if (!parentMutations) return;\n for (const [key, value] of Object.entries(parentMutations.fields)) {\n const skipCustomIdMutation =\n key === COLUMN.CUSTOM_ID && preserveParentCustomId;\n if (skipCustomIdMutation) continue;\n setActivityFieldDynamic(adapter, parentMutations.parentId, key, value);\n }\n}\n\nfunction recomputeAndFoldCorrelatives(\n adapter: CreateActivityCoreDeps['adapter'],\n newId: ActivityId,\n beforeSnap: Map<string, EngineActivitySnapshot>,\n initialTouched: Set<string>,\n opts: CreateActivityCoreOptions\n): void {\n if (opts.skipCorrelativeRecompute) return;\n const correlativeShifts = recomputeCorrelativeIds(adapter);\n if (opts.skipBeforeSnap) return;\n foldCorrelativeShifts(\n adapter,\n correlativeShifts,\n new Set([String(newId)]),\n beforeSnap,\n initialTouched\n );\n}\n\nexport function buildCreateChangeSet(\n adapter: ActivityWriter & WriteJournal,\n action: Extract<DispatchAction, { kind: 'activity-create' }>,\n coreResult: Extract<CreateActivityCoreResult, { ok: true }>,\n scheduledIds: readonly ActivityId[],\n hoursPerDay: number,\n scheduledBeforeImages?: ReadonlyMap<string, EngineActivitySnapshot>\n): ChangeSet {\n const { newId, newActivity, beforeSnap, initialTouched } = coreResult;\n\n const trackingEvent: { name: string; properties: Record<string, unknown> } = {\n name: DISPATCH_TRACK_EVENT.ACTIVITY_CREATION,\n properties: {\n parent_id: action.parentId,\n activity_id: newId,\n created_duration: newActivity.duration\n }\n };\n if (action.eventSource !== undefined) {\n trackingEvent.properties.event_source = action.eventSource;\n }\n\n const existingScheduledBeforeImages = scheduledBeforeImages\n ? new Map(\n [...scheduledBeforeImages].filter(\n ([scheduledId]) => String(scheduledId) !== String(newId)\n )\n )\n : undefined;\n\n return assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds: initialTouched,\n scheduledIds,\n scheduledBeforeImages: existingScheduledBeforeImages,\n trackingEvents: [trackingEvent],\n hoursPerDay\n });\n}\n\nexport type CreateActivitySyncResult =\n | { ok: true; activity: Readonly<Activity>; changes: ChangeSet }\n | { ok: false; reason: string };\n\nexport function createActivitySync(\n action: Extract<DispatchAction, { kind: 'activity-create' }>,\n deps: CreateActivityCoreDeps\n): CreateActivitySyncResult {\n const result = createActivityCore(action, deps);\n if (!result.ok) {\n return { ok: false, reason: result.reason };\n }\n recomputeParentBoundsSync(deps.adapter, new Set([result.newId]));\n const snapshot = deps.adapter.getActivity(result.newId);\n if (!snapshot) {\n throw new Error(\n `[ScheduleCore] createActivity: new activity ${result.newId} missing after commit`\n );\n }\n const changes = buildCreateChangeSet(\n deps.adapter,\n action,\n result,\n [],\n deps.sector.hoursPerDay\n );\n return { ok: true, activity: snapshotToActivity(snapshot), changes };\n}\n\nexport async function dispatchActivityCreate(\n action: Extract<DispatchAction, { kind: 'activity-create' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, scheduler, sector } = deps;\n\n const core = createActivityCore(action, deps);\n if (!core.ok) return core;\n const { newId } = core;\n\n const { scheduledIds, scheduledBeforeImages } = await runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n {\n action,\n autoscheduleFrom: String(newId),\n recomputeParentsFrom: [newId],\n now: deps.now,\n options\n }\n );\n\n const changeset = buildCreateChangeSet(\n adapter,\n action,\n core,\n scheduledIds,\n sector.hoursPerDay,\n scheduledBeforeImages\n );\n\n return { ok: true, changes: changeset };\n}\n\nfunction findDefaultCalendarId(\n calendars: Map<CalendarId, Calendar>\n): CalendarId {\n for (const calendar of calendars.values()) {\n if (calendar.is_default) return calendar.id;\n }\n const first = calendars.values().next();\n if (!first.done && first.value) return first.value.id;\n return 'global' as CalendarId;\n}\n","import type { ActivityReader } from '../../internal/state/roles.js';\nimport { REJECTION_REASON } from '../reasons.js';\nimport { ROOT_PARENT_ID } from '../../internal/hierarchy/root-parent.js';\nimport { recomputeCorrelativeIds } from '../../internal/hierarchy/recompute-correlative-ids.js';\nimport {\n applyLinkOperation,\n lagDaysToHours\n} from '../../autoscheduler/index.js';\nimport type { LinkOperation } from '../../autoscheduler/index.js';\nimport type { Activity, ActivityId, LinkId } from '../../types.js';\nimport type { LinkSnapshot } from '../../autoscheduler/types.js';\nimport type {\n DispatchAction,\n DispatchOptions,\n DispatchResult\n} from '../types.js';\nimport { durationToHours } from '../../columns/shared/duration.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport { collectSiblings, readCorrelativeId } from '../shared/positional.js';\nimport {\n snapshotActivities,\n foldCorrelativeShifts\n} from '../shared/snapshots.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport { buildLinkChangesForBatch } from '../shared/helpers.js';\nimport { createActivityCore } from './activity-create.js';\n\n// ---------------------------------------------------------------------------\n// Activity paste (bulk, atomic)\n// ---------------------------------------------------------------------------\n\n/**\n * Resolve where the pasted ROOTS (activities whose original parent was not\n * itself copied) land. Returns the parent id plus the anchor for the FIRST\n * root; subsequent roots chain via `afterSiblingId = previousRootNewId`.\n */\nfunction resolvePasteRootDestination(\n destination: Extract<\n DispatchAction,\n { kind: 'activity-paste' }\n >['destination'],\n adapter: ActivityReader\n):\n | {\n ok: true;\n parentId: ActivityId | '0';\n firstAfter?: ActivityId | undefined;\n firstBefore?: ActivityId | undefined;\n }\n | { ok: false; reason: string } {\n if ('afterSiblingId' in destination) {\n const sibling = adapter.getActivity(destination.afterSiblingId);\n if (!sibling) {\n return { ok: false, reason: REJECTION_REASON.ANCHOR_SIBLING_NOT_FOUND };\n }\n const parentId =\n sibling.parent == null || sibling.parent === 0\n ? ROOT_PARENT_ID\n : (String(sibling.parent) as ActivityId);\n return { ok: true, parentId, firstAfter: destination.afterSiblingId };\n }\n\n const parentId = destination.parentId;\n const siblings = collectSiblings(adapter, parentId).sort(\n (a, b) => readCorrelativeId(a) - readCorrelativeId(b)\n );\n const before = siblings[destination.index]?.id as ActivityId | undefined;\n return { ok: true, parentId, firstBefore: before };\n}\n\n/**\n * Apply the DOMAIN paste semantics to a copied activity's overrides BEFORE\n * the create pipeline runs (so the hh/cost cascade sees the reset values,\n * not the copied ones). Resets identity-bearing/progress/cost fields, forces\n * the paste flags, and backs up the copied `constraint_type`.\n *\n * Scope boundary (2026-06-08 decision): the core owns the DOMAIN semantics\n * only. Pure save/UI quirks (old_type, old_duration, on_open_lightbox_type,\n * for_disable_milestone_duration, new_task, isNewActivity, old_*_registered,\n * mustApp) flow through untouched as passthrough overrides supplied by the\n * consumer's prepare step. `end_date` is NOT reset — `buildNewActivity` computes\n * it from start_date + duration + calendar.\n */\nfunction applyPasteDomainSemantics(\n overrides: Partial<Activity>,\n hoursPerDay: number\n): Partial<Activity> {\n const rec = overrides as Record<string, unknown>;\n // El core es la ÚNICA autoridad de la ESTRUCTURA y de los IDS: `parent` lo\n // fija el remap del paste, `unique_correlative_id` el uidGen, `correlative_id`\n // el sweep, y `custom_id` lo GENERA `createActivityCore` desde el ancla de\n // pegado (paridad legacy). `buildNewActivity` hace \"overrides win\", así que si el\n // override trae el `custom_id` del snapshot COPIADO (lo hace siempre vía\n // `buildPasteOverrides`), el core lo mantendría verbatim → la pegada DUPLICA\n // el código del original e ignora el ancla. Defensivo: descartarlos siempre.\n const {\n parent: _parent,\n unique_correlative_id: _uid,\n correlative_id: _cid,\n custom_id: _customId,\n ...content\n } = rec;\n // UNIDAD de `duration`: el override viene del clipboard = `getActivity` =\n // DÍAS (representación pública, vía `snapshotToActivity → durationToDays`).\n // Pero `buildNewActivity` la consume en HORAS LABORALES (internas). Sin esta\n // conversión, una activity de 1 día se pegaba como 1 hora (duration/hoursPerDay).\n const durationDays = (content as { duration?: unknown }).duration;\n const durationHours =\n typeof durationDays === 'number' && Number.isFinite(durationDays)\n ? durationToHours(durationDays, hoursPerDay)\n : undefined;\n return {\n ...(content as Partial<Activity>),\n ...(durationHours !== undefined ? { duration: durationHours } : {}),\n progress: 0,\n ponderator: 0,\n used_cost: 0,\n expected_progress_base: 0,\n // Reset work hours. Legacy used null as a placeholder; the core's\n // canonical empty is 0 (null is coerced to 0 on store). Same \"no work\n // hours\" semantics. The hh cascade keeps pasted parents at 0 too\n // (sum of reset children).\n hhWorkTime: 0,\n checked: false,\n visibleChecked: false,\n comesFromCopy: true,\n is_lookahead: false,\n should_correct_start_date: false,\n is_critical: false,\n constraint_type_backup: rec.constraint_type\n } as unknown as Partial<Activity>;\n}\n\nexport async function dispatchActivityPaste(\n action: Extract<DispatchAction, { kind: 'activity-paste' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, scheduler, sector } = deps;\n\n const rootDest = resolvePasteRootDestination(action.destination, adapter);\n if (!rootDest.ok) return rootDest;\n\n // Scoped ChangeSet (PERFORMANCE.md §A1): pasted ids report as `created`\n // (never in beforeSnap), affected parents are folded in via the write-capture\n // journal, and correlative-shifted existing rows are folded in explicitly\n // after the sweep. No O(N) snapshot of the whole tree per paste. `touched`\n // accumulates the pasted ids + shifted rows.\n const beforeSnap = snapshotActivities(adapter, new Set<string>());\n const touched = new Set<string>();\n\n // ── Create the activities, re-hanging the copied hierarchy ──────────\n const originalToNew = new Map<string, ActivityId>();\n const createdIds: ActivityId[] = [];\n let prevRootId: ActivityId | undefined;\n\n for (const input of action.activities) {\n const mappedParent = originalToNew.get(input.originalParentId);\n\n let parentId: ActivityId | '0';\n let afterSiblingId: ActivityId | undefined;\n let beforeSiblingId: ActivityId | undefined;\n\n if (mappedParent !== undefined) {\n // Child of an already-pasted activity: append (tree order keeps\n // siblings in their copied sequence).\n parentId = mappedParent;\n } else {\n // Root of the pasted selection: lands at the destination.\n parentId = rootDest.parentId;\n if (prevRootId === undefined) {\n afterSiblingId = rootDest.firstAfter;\n beforeSiblingId = rootDest.firstBefore;\n } else {\n afterSiblingId = prevRootId;\n }\n }\n\n const core = createActivityCore(\n {\n kind: 'activity-create',\n parentId,\n afterSiblingId,\n beforeSiblingId,\n overrides: applyPasteDomainSemantics(\n input.overrides,\n sector.hoursPerDay\n ),\n eventSource: action.eventSource\n },\n deps,\n {\n // Saltamos el recompute por-create: corre UNA vez tras el loop (abajo).\n skipCorrelativeRecompute: true,\n // Saltamos el snapshot per-create: el paste ya capturó `beforeSnap` del\n // árbol completo antes del loop (O(N²) de clones puros si no).\n skipBeforeSnap: true,\n // custom_id (paridad legacy): TODAS las pegadas derivan del ancla de\n // pegado. Los roots ya lo logran vía `afterSiblingId`; los HIJOS\n // (mappedParent) no tienen sibling anchor → les pasamos el ancla como\n // `customIdReferenceId`, y preservamos el custom_id de su parent pegado\n // (que si no, `buildParentMutations` limpiaría al adjuntar el hijo).\n ...(mappedParent !== undefined\n ? {\n customIdReferenceId: action.referenceActivityId,\n preserveParentCustomId: true\n }\n : {})\n }\n );\n if (!core.ok) return core;\n\n originalToNew.set(input.originalId, core.newId);\n createdIds.push(core.newId);\n if (mappedParent === undefined) prevRootId = core.newId;\n }\n\n // UN solo recompute para todo el lote (vs O(K·N log N) por-create). Los cids\n // fraccionarios de inserción ya preservan el orden; este sweep los renumera a\n // enteros contiguos 0..N-1 (perf audit Fase 1, finding #2).\n const correlativeShifts = recomputeCorrelativeIds(adapter);\n const createdIdSet = new Set(createdIds.map(String));\n foldCorrelativeShifts(\n adapter,\n correlativeShifts,\n createdIdSet,\n beforeSnap,\n touched\n );\n // The pasted rows themselves are added via addActivity (not the journal), so\n // they must be in the touched set explicitly to emit as `created`.\n for (const createdId of createdIds) touched.add(String(createdId));\n\n // ── Recreate internal links, remapped to the new ids ────────────────\n // Both endpoints must be in the pasted set; links with an endpoint\n // outside it (dangling) are dropped. Applied inline (not via\n // dispatchLinkBatch) so the whole paste stays a SINGLE ChangeSet and a\n // single autoscheduler pass.\n type AppliedPasteLink = {\n op: LinkOperation;\n finalLinkId: LinkId | null;\n rejected: string | null;\n };\n const appliedLinks: AppliedPasteLink[] = [];\n for (const link of action.links) {\n const newSource = originalToNew.get(link.source);\n const newTarget = originalToNew.get(link.target);\n if (newSource === undefined || newTarget === undefined) continue;\n\n const op: LinkOperation = {\n kind: 'create',\n source: newSource,\n target: newTarget,\n type: link.type,\n // El clipboard trae `lag` en DÍAS (getLink/getAllLinks → lagHoursToDays);\n // el motor lo almacena en HORAS LABORALES. Convertir acá, igual que\n // `duration` arriba y que `link-create`/`link-update` — el borde de entrada.\n lag: lagDaysToHours(link.lag, sector.hoursPerDay)\n };\n const res = applyLinkOperation(op, {\n port: adapter,\n newLinkId: deps.linkIdGen.next\n });\n appliedLinks.push({\n op,\n finalLinkId: res.applied ? (res.linkId as LinkId) : null,\n rejected: res.applied ? null : (res.rejected ?? 'link_op_rejected')\n });\n }\n\n // ── Autoscheduler ONCE for the whole batch (not per activity) ───────\n const { scheduledIds, scheduledBeforeImages } = await runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n {\n action,\n autoscheduleFrom: createdIds[0] ?? null,\n recomputeParentsFrom: createdIds,\n now: deps.now,\n options\n }\n );\n\n // ── Build the single combined ChangeSet ─────────────────────────────\n // Diff scope = touched (pasted `created` rows + shifted existing rows) plus\n // the write-capture fold-in (affected parents) and the autoscheduler's\n // before-images for existing rows it moved.\n const linkChanges = buildLinkChangesForBatch(\n appliedLinks,\n new Map<LinkId, LinkSnapshot>(),\n adapter\n );\n\n return {\n ok: true,\n changes: assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds: touched,\n scheduledIds,\n // Existing rows the autoscheduler moved need a before-image (the global\n // beforeSnap used to supply it). Pass scheduledBeforeImages but filter out\n // the pasted rows — their pre-schedule image would flip them to `updated`.\n scheduledBeforeImages: new Map(\n [...scheduledBeforeImages].filter(\n ([schedId]) => !createdIdSet.has(String(schedId))\n )\n ),\n links: linkChanges,\n hoursPerDay: sector.hoursPerDay\n })\n };\n}\n","import { REJECTION_REASON } from '../reasons.js';\nimport type { Activity } from '../../types.js';\nimport type { DispatchAction, DispatchResult, EntityChange } from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\n\n/**\n * SIR (A3): write the absolute pending-SIR set for one activity into the\n * core so its freeze bit (`isFrozen`) stays fresh. Prop-only ChangeSet — no\n * autoscheduler, no CP. Idempotent (it's an absolute set). The front owns the\n * SIR record; the core only tracks the ids that freeze the activity.\n */\nexport function dispatchSirSync(\n action: Extract<DispatchAction, { kind: 'sir-sync' }>,\n deps: DispatchDeps\n): DispatchResult {\n const { adapter } = deps;\n const id = action.activityId;\n const snapshot = adapter.getActivity(id);\n if (!snapshot) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_NOT_FOUND };\n }\n\n const before = snapshot.pendingRequests ?? [];\n const after = action.pendingRequests.map((r) => ({ id: r.id }));\n adapter.setActivityField(action.activityId, 'pendingRequests', after);\n\n const change: EntityChange<Activity> = {\n id,\n kind: 'updated',\n fields: { pendingRequests: { before, after } },\n after: { id, pendingRequests: after } as unknown as Activity\n };\n\n return {\n ok: true,\n changes: {\n source: action,\n activities: [change],\n links: [],\n calendars: [],\n trackingEvents: []\n }\n };\n}\n","/**\n * The hh/usedCost/cost rollup trio every structural dispatch handler must\n * run for each affected parent after a tree mutation (delete / move /\n * indent / outdent). Calls, in this order:\n * `recomputeHhCascadeForParent` → `recomputeUsedCostCascadeForParent` →\n * `recomputeCostCascadeForParent` — order preserved from the original\n * inline sequences in `src/dispatch/dispatch.ts`.\n */\n\nimport { recomputeHhCascadeForParent } from './recompute-hh-cascade.js';\nimport { recomputeUsedCostCascadeForParent } from './recompute-used-cost-cascade.js';\nimport { recomputeCostCascadeForParent } from './recompute-cost-cascade.js';\nimport type { ActivityId } from '../../types.js';\nimport type { ActivityWriter } from '../../internal/state/roles.js';\n\nexport function recomputeRollupCascadesForParent(\n parentId: ActivityId | '0' | null | undefined,\n adapter: ActivityWriter\n): void {\n recomputeHhCascadeForParent(parentId, adapter);\n recomputeUsedCostCascadeForParent(parentId, adapter);\n recomputeCostCascadeForParent(parentId, adapter);\n}\n","/**\n * Tree traversal helpers shared by the delete / indent / outdent ops.\n *\n * - `collectDescendantIds` — DFS from each root id, accumulates every\n * descendant. Includes the root ids themselves in the output set.\n * - `collectIncidentLinkIds` — given a set of activity ids, returns the\n * ids of every link whose source or target lies in that set.\n *\n * Both are pure functions over the adapter's current state. Order of\n * iteration is not guaranteed (a Set), but neither op cares about order.\n */\n\nimport type { ActivityReader } from '../../internal/state/roles.js';\nimport type { ActivityId, LinkId } from '../../types.js';\n\n/**\n * Returns the union of (rootIds) ∪ (their descendants, recursively).\n */\nexport function collectDescendantIds(\n rootIds: Iterable<ActivityId>,\n adapter: ActivityReader\n): Set<ActivityId> {\n const out = new Set<ActivityId>();\n const stack: ActivityId[] = [];\n\n for (const id of rootIds) {\n const key = String(id) as ActivityId;\n if (!out.has(key)) {\n out.add(key);\n stack.push(key);\n }\n }\n\n while (stack.length > 0) {\n const current = stack.pop()!;\n const children = adapter.getChildren(current);\n for (const childId of children) {\n const key = String(childId) as ActivityId;\n if (!out.has(key)) {\n out.add(key);\n stack.push(key);\n }\n }\n }\n\n return out;\n}\n\n/**\n * Returns the ids of every link with `source` or `target` in `activityIds`.\n */\nexport function collectIncidentLinkIds(\n activityIds: ReadonlySet<ActivityId>,\n adapter: ActivityReader\n): LinkId[] {\n const out: LinkId[] = [];\n for (const link of adapter.getAllLinks()) {\n const src = String(link.source) as ActivityId;\n const tgt = String(link.target) as ActivityId;\n if (activityIds.has(src) || activityIds.has(tgt)) {\n out.push(String(link.id));\n }\n }\n return out;\n}\n","/**\n * Parent demotion — la inversa de `buildParentMutations` (en\n * `creation/parentMutationPipeline.ts`).\n *\n * Cuando el último hijo de un project se remueve (via delete o outdent),\n * el project se \"demotea\" de vuelta a task.\n *\n * Regla determinista (ver `Obsidian:newPlanSchedule/RULE_promote_demote_2026-05-25.md`):\n *\n * - `type: 'project' → 'task'`.\n * - `start_date`, `end_date`, `progress`, `cost`, `used_cost`, `hhWorkTime`\n * y todos los demás campos se **mantienen como están**. Reflejan el\n * state actual del parent justo antes de perder el último hijo (que\n * eran las dates/progress derivados de ese hijo). Esos valores son\n * perfectamente válidos como datos propios de una 'task'.\n * - `duration`: NO se resetea acá. Lo recompone `updateParentBoundsFromChildren`\n * en el step posterior del dispatch, si las dates cambiaron.\n * - DHTMLX visual flags (`$no_start`, `$no_end`, `$rendered_type`) se\n * resetean porque la activity ya no se rendere como project bar.\n * - `is_lookahead`: si el parent demoteado todavía tiene lookahead\n * sub-tasks colgando (campo `tasks` no vacío, passthrough desde el\n * backend), se re-flagea como `true` — el parent vuelve a ser un\n * anchor de lookahead (bloquea drag en el schedule). Simétrico con\n * `parentMutationPipeline.ts:92` que pone `is_lookahead: false` en\n * el promote. El core no decide el contenido del array `tasks`\n * (lookahead es dominio aparte); solo reacciona a su existencia.\n *\n * Sin snapshot/restore. Sin memoria de qué fue antes. Si el usuario\n * quiere \"deshacer\" el create+delete del hijo, ese es el dominio de\n * undo/redo, no de la demote.\n *\n * El campo legacy `originalMetadata` (poblado por\n * `assets/js/events/onBeforeTaskAdd/captureOriginalMetadata.js`) se\n * **ignora**. Si está presente lo limpiamos para no acumular state\n * stale en la activity.\n */\n\nimport { DEMOTION_TARGET_TYPE } from '../../activity-types/index.js';\nimport type { ActivityId } from '../../types.js';\nimport type { ParentReaderActivity } from '../../creation/types.js';\n\ninterface ParentDemotionInput {\n /** Current state of the parent (post-mutation snapshot). */\n readonly parent: ParentReaderActivity & Record<string, unknown>;\n /**\n * IDs that are still children of this parent AFTER the operation. The\n * caller computes this from the adapter (e.g.\n * `adapter.getChildren(parentId)` after delete/outdent applied).\n */\n readonly remainingChildIds: ReadonlyArray<ActivityId>;\n /**\n * Optional — ids that just disappeared (deleted or moved away). When\n * provided, the helper filters them out of `parent.newActivitiesArray`\n * so the field stays consistent.\n */\n readonly idsRemoved?: ReadonlySet<ActivityId>;\n}\n\nexport interface ParentDemotionMutations {\n readonly parentId: ActivityId;\n readonly fields: Readonly<DemotionFields>;\n}\n\ninterface DemotionFields {\n /** Siempre `'task'` — la regla canónica demotea project → task sin opciones. */\n type?: 'task';\n /** Clear DHTMLX visual project flags. */\n $no_start?: false;\n $no_end?: false;\n $rendered_type?: undefined;\n /** Filtered `newActivitiesArray` (without removed ids). */\n newActivitiesArray?: ActivityId[];\n /**\n * Re-flag as lookahead anchor when the demoted parent still has\n * lookahead sub-tasks (passthrough `tasks` array non-empty). Symmetric\n * with `parentMutationPipeline.ts` which sets `is_lookahead: false` on\n * promote (task → project). Only `true` is emitted by the demote — the\n * \"set to false\" direction belongs to promote.\n */\n is_lookahead?: true;\n /**\n * Legacy snapshot que algunos paths del client todavía pueden poblar.\n * Lo limpiamos defensivamente para no acumular state stale, pero NO\n * lo usamos para restaurar nada. Ver header del archivo y la regla\n * canónica de promote/demote.\n */\n originalMetadata?: undefined;\n}\n\n/**\n * Returns the fields to apply on the parent, or `null` if the parent\n * still has children (no demote yet).\n */\nexport function buildParentDemotionMutations(\n input: ParentDemotionInput\n): ParentDemotionMutations | null {\n if (input.remainingChildIds.length > 0) return null;\n\n const parent = input.parent;\n\n const fields: DemotionFields = {\n type: DEMOTION_TARGET_TYPE,\n $no_start: false,\n $no_end: false,\n $rendered_type: undefined,\n // Limpiamos el snapshot legacy si está presente — no lo usamos pero\n // tampoco lo dejamos acumulado en la activity. Ver header.\n originalMetadata: undefined\n };\n\n // Filter newActivitiesArray to drop the removed ids.\n if (input.idsRemoved && input.idsRemoved.size > 0) {\n const existing = Array.isArray(parent.newActivitiesArray)\n ? (parent.newActivitiesArray as ActivityId[])\n : [];\n if (existing.length > 0) {\n const filtered = existing.filter(\n (id) =>\n !input.idsRemoved!.has(id) &&\n !input.idsRemoved!.has(String(id) as ActivityId)\n );\n if (filtered.length !== existing.length) {\n fields.newActivitiesArray = filtered;\n }\n }\n }\n\n // Re-flag as lookahead anchor when the demoted parent still has\n // lookahead sub-tasks. `tasks` is a passthrough array from the backend\n // that the core does not own — we only read its existence to derive\n // `is_lookahead`. See file header for the rationale and the symmetric\n // `is_lookahead: false` on promote.\n const tasks = (parent as { tasks?: unknown }).tasks;\n if (Array.isArray(tasks) && tasks.length > 0) {\n fields.is_lookahead = true;\n }\n\n return { parentId: String(parent.id), fields };\n}\n","/**\n * Parent new-activities cleanup — mantiene el invariante\n *\n * hasNewActivities === (newActivitiesArray.length > 0)\n *\n * tras un delete (o cualquier mutación estructural futura que remueva\n * activities del subtree). Emite **ambos campos juntos** para preservar\n * atómicamente la consistencia entre el array y el boolean derivado.\n *\n * Aplica a TODOS los padres afectados (demoteados o no). Es la regla R15\n * de [[delete activity business rules]].\n *\n * Antes (legacy): vivía como código manual en el callback de `trashTask`\n * (`react_client/src/views/schedule/gantt-general-config-schedule-core.js`)\n * con un race condition contra el dispatch async — la mutación manual al\n * task DHTMLX se sobreescribía con el state del core en `applyChangeSet`.\n * Al moverlo al core, el invariante se preserva atómicamente dentro del\n * dispatch antes de que `applyChangeSet` escriba a DHTMLX.\n *\n * Diseñado para ser idempotente: si el array no cambia, devuelve `null`\n * y no se emite ningún field.\n */\n\nimport type { ActivityId } from '../../types.js';\n\ninterface ParentNewActivitiesCleanupInput {\n /**\n * Snapshot del padre. Solo se leen `id` y `newActivitiesArray`. El\n * campo es passthrough (`[key: string]: unknown` en `Activity`), por\n * eso aceptamos `unknown` y validamos con `Array.isArray`.\n */\n readonly parent: {\n readonly id: ActivityId | number;\n readonly newActivitiesArray?: unknown;\n };\n /**\n * Set de ids removidos del subtree (la activity borrada + descendants).\n * Diseñado para compartir el mismo `toDelete` que el caller usa para\n * `adapter.removeActivity`. Acepta los ids como string o number — la\n * comparación se hace tolerante en ambos sentidos.\n */\n readonly idsRemoved: ReadonlySet<ActivityId>;\n}\n\ninterface ParentNewActivitiesCleanupOutput {\n readonly parentId: ActivityId;\n readonly fields: {\n /** Array filtrado sin los ids removidos. */\n readonly newActivitiesArray: ActivityId[];\n /**\n * Boolean derivado del nuevo length. Se emite SIEMPRE que se emite\n * el array, para que el invariante `hasNewActivities === (length>0)`\n * se preserve atómicamente.\n */\n readonly hasNewActivities: boolean;\n };\n}\n\n/**\n * Returns cleanup fields, or `null` si no hay cambio que aplicar.\n *\n * Casos no-op (devuelven `null`):\n * - `idsRemoved` está vacío.\n * - `parent.newActivitiesArray` no es un array (undefined, null, string, objeto).\n * - `parent.newActivitiesArray` es array vacío.\n * - Ninguno de los `idsRemoved` está en el array.\n *\n * Casos que emiten cambios:\n * - Algunos ids del array están en `idsRemoved` → array filtrado +\n * `hasNewActivities` recalculado.\n * - Todos los ids del array están en `idsRemoved` → array vacío +\n * `hasNewActivities: false`.\n */\nexport function buildParentNewActivitiesCleanup(\n input: ParentNewActivitiesCleanupInput\n): ParentNewActivitiesCleanupOutput | null {\n if (input.idsRemoved.size === 0) return null;\n\n const rawArray = input.parent.newActivitiesArray;\n if (!Array.isArray(rawArray)) return null;\n if (rawArray.length === 0) return null;\n\n const existing = rawArray as ReadonlyArray<ActivityId>;\n\n // Filter tolerant a string/number id forms — el array DHTMLX legacy\n // puede tener números mientras el core normaliza a strings.\n const filtered = existing.filter(\n (id) =>\n !input.idsRemoved.has(id) &&\n !input.idsRemoved.has(String(id) as ActivityId)\n );\n\n if (filtered.length === existing.length) return null;\n\n return {\n parentId: String(input.parent.id) as ActivityId,\n fields: {\n newActivitiesArray: [...filtered],\n hasNewActivities: filtered.length > 0\n }\n };\n}\n","import { REJECTION_REASON } from '../reasons.js';\nimport { DISPATCH_TRACK_EVENT } from '../tracking-events.js';\nimport { isRootParent } from '../../internal/hierarchy/root-parent.js';\nimport { recomputeCorrelativeIds } from '../../internal/hierarchy/recompute-correlative-ids.js';\nimport { recomputeRollupCascadesForParent } from '../../propagations/upward/recompute-rollup-cascades.js';\nimport {\n collectDescendantIds,\n collectIncidentLinkIds\n} from '../../propagations/shared/traversal-helpers.js';\nimport { buildParentDemotionMutations } from '../../internal/hierarchy/parent-demotion.js';\nimport { buildParentNewActivitiesCleanup } from '../../internal/hierarchy/parent-new-activities-cleanup.js';\nimport { recomputeSingleParentDisplayBounds } from '../../propagations/upward/parent-bounds.js';\nimport type { ActivityId, Link, LinkId } from '../../types.js';\nimport type {\n EngineActivitySnapshot,\n LinkSnapshot\n} from '../../autoscheduler/types.js';\nimport type {\n DispatchAction,\n DispatchOptions,\n DispatchResult,\n EntityChange\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport {\n snapshotActivities,\n structuredCloneActivity\n} from '../shared/snapshots.js';\nimport { setActivityFieldDynamic } from '../../internal/state/dynamic-writes.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport type { TrackingEventOut } from '../shared/helpers.js';\n\n// ---------------------------------------------------------------------------\n// Activity delete (cascade)\n// ---------------------------------------------------------------------------\n\nexport async function dispatchActivityDelete(\n action: Extract<DispatchAction, { kind: 'activity-delete' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, scheduler, customIdTracker, sector } = deps;\n scheduler.invalidateAllCaches();\n\n if (action.activityIds.length === 0) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_IDS_EMPTY };\n }\n\n // 1. Atomic precheck: every requested id must exist.\n for (const id of action.activityIds) {\n if (!adapter.getActivity(id)) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_NOT_FOUND };\n }\n }\n\n // 2. Cascade: expand to include all descendants.\n const toDelete = collectDescendantIds(action.activityIds, adapter);\n\n // 3. Collect incident links.\n const incidentLinkIds = collectIncidentLinkIds(toDelete, adapter);\n\n // 4. Identify parents-to-check (parents of top-level removed nodes whose\n // parent is NOT itself being deleted). After mutation, each gets a\n // demotion check.\n const parentsToCheck = new Set<ActivityId>();\n for (const id of action.activityIds) {\n const a = adapter.getActivity(id);\n if (!a) continue;\n const parent = a.parent;\n if (isRootParent(parent)) continue;\n const parentKey = String(parent) as ActivityId;\n if (!toDelete.has(parentKey)) parentsToCheck.add(parentKey);\n }\n\n // 5. Snapshot pre-state SOLO de lo que este handler muta a mano: filas\n // borradas (resurrección del undo + diff 'deleted') y parents afectados\n // (demotion / cleanup / re-roll de bounds). El resto de before-images\n // llega por canales proporcionales a lo tocado: el sweep de correlatives\n // reporta sus shifts (paso 8), el autoscheduler entrega\n // `scheduledBeforeImages` (paso 10) y los derived passes escriben por\n // `setActivityField` → write-capture → fold-in de `assembleChangeSet`.\n // Antes acá había un structuredClone de TODA activity viva + diff global\n // (`includeAllIds`): O(N) en cada delete, la causa principal de la\n // lentitud del delete en schedules grandes.\n const touchedIds = new Set<string>([...toDelete, ...parentsToCheck]);\n const beforeSnap = snapshotActivities(adapter, touchedIds);\n const beforeLinks = new Map<LinkId, LinkSnapshot>();\n for (const linkId of incidentLinkIds) {\n const l = adapter.getLink(linkId);\n if (l) beforeLinks.set(linkId, { ...l });\n }\n\n // 6. Apply mutations.\n // 6a. Release each deleted activity's custom_id from the tracker so\n // future generations can reuse the freed suffix.\n for (const id of toDelete) {\n const a = adapter.getActivity(id);\n if (!a) continue;\n const cid = a.custom_id;\n if (typeof cid === 'string' && cid.length > 0) {\n customIdTracker.releaseCustomId(cid);\n }\n }\n for (const linkId of incidentLinkIds) {\n adapter.removeLink(linkId);\n }\n for (const id of toDelete) {\n adapter.removeActivity(id);\n }\n\n // 7a. New-activities cleanup for ALL affected parents (R15).\n // Mantiene el invariante hasNewActivities === (array.length > 0)\n // filtrando los ids removidos del array y recalculando el boolean.\n // Corre ANTES del demote loop para que cuando demotion también\n // filtre el array, vea el state ya consistente y sea no-op.\n // Ver Obsidian:newPlanSchedule/delete activity business rules.md R15.\n for (const parentId of parentsToCheck) {\n const parent = adapter.getActivity(parentId);\n if (!parent) continue;\n const cleanup = buildParentNewActivitiesCleanup({\n parent: parent as never,\n idsRemoved: toDelete\n });\n if (!cleanup) continue;\n for (const [key, value] of Object.entries(cleanup.fields)) {\n setActivityFieldDynamic(adapter, parentId, key, value);\n }\n }\n\n // 7b. Demote any parent that lost its last child. A parent that KEPT\n // children but lost a boundary-defining one must re-roll its display\n // bounds (start/end/duration) from the remaining children — the\n // `recomputeParentsFrom: parentsToCheck` flow only recomputes the seed\n // parents' ANCESTORS, never the seed parents themselves. Mirrors the\n // OUTDENT source-parent re-roll (activity-outdent.ts demotion-null\n // branch, 849bfa5) and legacy `gantt.updateTask(parent)` →\n // `_update_parents` → `resetProjectDates` (MORNING_QUEUE.md JUN-27).\n // CPM + milestone-mirror + stored progress stay stale, matching legacy.\n for (const parentId of parentsToCheck) {\n const parent = adapter.getActivity(parentId);\n if (!parent) continue;\n const remainingChildren = adapter.getChildren(parentId);\n const demotion = buildParentDemotionMutations({\n parent: parent as never,\n remainingChildIds: remainingChildren.map(String),\n idsRemoved: toDelete\n });\n if (!demotion) {\n recomputeSingleParentDisplayBounds(parentId, adapter);\n continue;\n }\n for (const [key, value] of Object.entries(demotion.fields)) {\n setActivityFieldDynamic(adapter, parentId, key, value);\n }\n }\n\n // 7c. Recompute hh + real_work cascade for each affected parent\n // (diverges from legacy; see H1 in schedule-core-hh-work-time-plan.md).\n for (const parentId of parentsToCheck) {\n recomputeRollupCascadesForParent(parentId, adapter);\n }\n\n // 8. Recompute correlative_ids. El sweep muta directo (bypass del\n // write-capture, a propósito), así que acá se foldean sus shifts al\n // touched-set con un before-image fabricado: clon del estado actual\n // (pre-autoscheduler, los pasos que mutan fechas corren después) con\n // el correlative viejo restaurado. Los ids ya snapshotteados en el\n // paso 5 conservan su imagen pre-mutación (más temprana, gana).\n const correlativeShifts = recomputeCorrelativeIds(adapter);\n for (const shift of correlativeShifts) {\n touchedIds.add(shift.activityId);\n if (beforeSnap.has(shift.activityId)) continue;\n const liveActivity = adapter.getActivity(shift.activityId);\n if (!liveActivity) continue;\n const beforeImage = structuredCloneActivity(liveActivity);\n beforeImage.correlative_id = shift.before;\n beforeSnap.set(shift.activityId, beforeImage);\n }\n\n // 9. Autoscheduler — passes through with no trigger (the deletion may\n // have removed predecessors so the scheduler reflows from roots).\n // 10. Parent bounds + CP.\n // Global milestone-mirror restamp (`resolveDerivedPasses`): legacy\n // `onAfterTaskDelete` runs a real\n // `gantt.autoSchedule()` (gantt-general-config.js:3660) →\n // `onAfterAutoSchedule` → `reloadDuration(gantt)` (GLOBAL re-stamp of\n // `for_disable_milestone_duration = duration` tree-wide). Delete here\n // also runs the autoscheduler (`autoscheduleFrom: 'roots'`), so it must mirror\n // legacy and refresh the milestone-mirror on the re-rolled retained\n // parents (recomputeSingleParentDisplayBounds leaves it stale by design).\n // UNLIKE indent/outdent, which use `moveTask` and never fire\n // `onAfterAutoSchedule`, so they keep the mirror stale (MORNING_QUEUE.md —\n // JUN-28; mechanism mirror of JUN-19).\n const { scheduledIds, scheduledBeforeImages } = await runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n {\n action,\n autoscheduleFrom: 'roots',\n recomputeParentsFrom: parentsToCheck,\n now: deps.now,\n options\n }\n );\n\n // 11. Build ChangeSet.\n const trackingEvent: TrackingEventOut = {\n name: DISPATCH_TRACK_EVENT.ACTIVITY_DELETION,\n properties: {\n activity_ids: [...action.activityIds],\n cascade_count: toDelete.size\n }\n };\n if (action.eventSource !== undefined) {\n trackingEvent.properties.event_source = action.eventSource;\n }\n\n // SIR (A5): deleting a frozen activity (or a frozen descendant in the\n // cascade) auto-rejects its pending SIR(s). Deleted activities are gone, so\n // there is nothing to unfreeze — only effects are emitted ('after-diff'\n // preserves this handler's historical detect-after-diff order).\n // B4: thread the full pre-delete rows + incident links out for the undo\n // recorder (the ChangeSet emits deleted rows with no `before`). Links are\n // re-keyed by string id to match the String()-normalized EntityChange ids.\n // El __beforeSnap del undo lleva SOLO las filas borradas (lo único que la\n // resurrección consulta) — no el mapa completo del diff: cada entry vive\n // en el undo stack (hasta 100 pasos) y esto acota su memoria.\n const beforeLinksByStringId = new Map<string, LinkSnapshot>();\n for (const [id, l] of beforeLinks) beforeLinksByStringId.set(id, l);\n const deletedRowsSnap = new Map<string, EngineActivitySnapshot>();\n for (const id of toDelete) {\n const snap = beforeSnap.get(String(id));\n if (snap) deletedRowsSnap.set(String(id), snap);\n }\n\n return {\n ok: true,\n changes: assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds,\n scheduledIds,\n scheduledBeforeImages,\n sirDetection: 'after-diff',\n links: buildLinkDeletions(beforeLinks),\n trackingEvents: [trackingEvent],\n hoursPerDay: sector.hoursPerDay\n }),\n __beforeSnap: deletedRowsSnap,\n __beforeLinks: beforeLinksByStringId\n };\n}\n\nfunction buildLinkDeletions(\n beforeLinks: Map<LinkId, LinkSnapshot>\n): ReadonlyArray<EntityChange<Link>> {\n const out: EntityChange<Link>[] = [];\n for (const [id, before] of beforeLinks.entries()) {\n out.push({\n id,\n kind: 'deleted',\n fields: {\n source: { before: String(before.source), after: undefined },\n target: { before: String(before.target), after: undefined },\n type: { before: before.type, after: undefined },\n // Engine stores lag in WORKING HOURS — ChangeSet now emits HOURS too.\n // `toPublicChangeSet` at the facade boundary converts to days (default).\n lag: { before: Number(before.lag), after: undefined }\n },\n after: null\n });\n }\n return out;\n}\n","/**\n * After an indent / outdent / move operation, some links may now connect\n * an ancestor to a descendant (or vice-versa). DHTMLX legacy doesn't\n * auto-delete those — it reports them so the UI can prompt the user.\n *\n * Port of `collectInvalidLinkIdsAfterIndent` from\n * `react_client/src/views/schedule/operations/capabilities/hierarchyCore.ts:68-91`.\n */\n\nimport { isRootParent } from './root-parent.js';\nimport type { ActivityReader } from '../state/roles.js';\nimport type { ActivityId, LinkId } from '../../types.js';\n\n/**\n * Returns the ids of links that are now invalid because they cross\n * the ancestor/descendant boundary after a tree mutation. A link\n * source→target is invalid if either:\n * - target is a descendant of source (ancestor → descendant), or\n * - source is a descendant of target (descendant → ancestor).\n *\n * Only inspects links whose source OR target is in `movedActivityIds`\n * (the activities just moved). Untouched links are guaranteed valid.\n */\nexport function collectInvalidLinkIdsForCycle(\n movedActivityIds: Iterable<ActivityId>,\n adapter: ActivityReader\n): LinkId[] {\n const moved = new Set<ActivityId>();\n for (const id of movedActivityIds) moved.add(String(id) as ActivityId);\n\n const out: LinkId[] = [];\n for (const link of adapter.getAllLinks()) {\n const src = String(link.source) as ActivityId;\n const tgt = String(link.target) as ActivityId;\n if (!moved.has(src) && !moved.has(tgt)) continue;\n if (isAncestor(tgt, src, adapter) || isAncestor(src, tgt, adapter)) {\n out.push(String(link.id));\n }\n }\n return out;\n}\n\nfunction isAncestor(\n descendantId: ActivityId,\n candidateAncestorId: ActivityId,\n adapter: ActivityReader\n): boolean {\n let cur: ActivityId | null = String(descendantId) as ActivityId;\n const guard = new Set<ActivityId>();\n while (cur != null) {\n if (guard.has(cur)) return false; // cycle guard — shouldn't happen\n guard.add(cur);\n const a = adapter.getActivity(cur);\n if (!a) return false;\n const parent = a.parent;\n if (isRootParent(parent)) return false;\n const parentKey = String(parent) as ActivityId;\n if (parentKey === candidateAncestorId) return true;\n cur = parentKey;\n }\n return false;\n}\n","import { REJECTION_REASON } from '../reasons.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { ACTIVITY_PROPERTY } from '../../constants/activity-properties.js';\nimport { DISPATCH_TRACK_EVENT } from '../tracking-events.js';\nimport {\n ROOT_PARENT_ID,\n isRootParent,\n normalizeParentKey\n} from '../../internal/hierarchy/root-parent.js';\nimport { recomputeCorrelativeIds } from '../../internal/hierarchy/recompute-correlative-ids.js';\nimport { recomputeRollupCascadesForParent } from '../../propagations/upward/recompute-rollup-cascades.js';\nimport { collectInvalidLinkIdsForCycle } from '../../internal/hierarchy/invalid-links.js';\nimport { buildParentDemotionMutations } from '../../internal/hierarchy/parent-demotion.js';\nimport { isPromotableLeafType } from '../../activity-types/index.js';\nimport { buildParentMutations } from '../../creation/parent-mutation-pipeline.js';\nimport type { ActivityId } from '../../types.js';\nimport type {\n DispatchAction,\n DispatchOptions,\n DispatchResult\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport {\n computeInsertionCorrelativeId,\n findPrevSiblingHelper\n} from '../shared/positional.js';\nimport {\n snapshotActivities,\n structuredCloneActivity\n} from '../shared/snapshots.js';\nimport { setActivityFieldDynamic } from '../../internal/state/dynamic-writes.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport {\n releaseClearedCustomId,\n type TrackingEventOut\n} from '../shared/helpers.js';\n\n// ---------------------------------------------------------------------------\n// Activity move (reorder within parent or move across parents)\n// ---------------------------------------------------------------------------\n\nexport async function dispatchActivityMove(\n action: Extract<DispatchAction, { kind: 'activity-move' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, scheduler, sector } = deps;\n scheduler.invalidateAllCaches();\n\n const activity = adapter.getActivity(action.activityId);\n if (!activity) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_NOT_FOUND };\n }\n\n const newParentIsRoot = isRootParent(action.parentId);\n if (!newParentIsRoot && !adapter.getActivity(action.parentId)) {\n return { ok: false, reason: REJECTION_REASON.PARENT_NOT_FOUND };\n }\n\n // Reject moving an activity under itself or any descendant (cycle).\n if (!newParentIsRoot) {\n if (\n action.parentId === action.activityId ||\n adapter.isChildOf(action.parentId, action.activityId)\n ) {\n return {\n ok: false,\n reason: REJECTION_REASON.CANNOT_MOVE_INTO_OWN_DESCENDANT\n };\n }\n }\n\n // Validate anchor.\n if (action.afterSiblingId !== undefined) {\n const sibling = adapter.getActivity(action.afterSiblingId);\n if (!sibling) {\n return { ok: false, reason: REJECTION_REASON.ANCHOR_SIBLING_NOT_FOUND };\n }\n const siblingParent =\n sibling.parent == null || sibling.parent === 0\n ? ROOT_PARENT_ID\n : String(sibling.parent);\n if (siblingParent !== action.parentId) {\n return {\n ok: false,\n reason: REJECTION_REASON.ANCHOR_SIBLING_WRONG_PARENT\n };\n }\n }\n\n const oldParent = activity.parent;\n const oldParentKey = normalizeParentKey(oldParent);\n const newParentKey = String(action.parentId);\n const parentChanged = oldParentKey !== newParentKey;\n\n // Snapshot pre-state.\n const touched = new Set<string>([action.activityId]);\n if (parentChanged) {\n if (oldParentKey !== ROOT_PARENT_ID) touched.add(oldParentKey);\n if (newParentKey !== ROOT_PARENT_ID) touched.add(newParentKey);\n } else {\n if (oldParentKey !== ROOT_PARENT_ID) touched.add(oldParentKey);\n }\n // Only the handler-touched rows are snapshotted here (PERFORMANCE.md §A1):\n // the correlative sweep folds its shifts below, the autoscheduler supplies\n // `scheduledBeforeImages`, and rollup cascades write through the journal →\n // `assembleChangeSet`'s write-capture fold-in. No O(N) snapshot of the whole\n // tree per move.\n const beforeSnap = snapshotActivities(adapter, touched);\n\n // Apply the move.\n if (parentChanged) {\n adapter.setActivityField(\n action.activityId,\n ACTIVITY_PROPERTY.PARENT,\n newParentKey\n );\n }\n const insertionCid = computeInsertionCorrelativeId(\n adapter,\n action.parentId,\n action.afterSiblingId,\n undefined // activity-move has no beforeSiblingId anchor\n );\n adapter.setActivityField(\n action.activityId,\n COLUMN.CORRELATIVE_ID,\n insertionCid\n );\n\n // Side effects only when parent changed.\n if (parentChanged) {\n // a. Promote new parent if it was leaf task.\n if (!newParentIsRoot) {\n const newParent = adapter.getActivity(action.parentId);\n if (newParent) {\n // Capture the new parent's custom_id BEFORE promotion clears it, so we\n // can release it to the tracker pool (legacy `clearCustomIdOnParentConversion`\n // does release + null; the create path releases via the generation\n // strategy, but move/indent generate no id so we release explicitly).\n const oldNewParentCustomId = newParent.custom_id;\n // Promotable leaf = task OR milestone (canonical predicate) — keep\n // in sync with the create path, which falls back to the same rule\n // inside buildParentMutations.\n const wasLeaf =\n isPromotableLeafType(newParent.type) &&\n adapter\n .getChildren(action.parentId)\n .filter((id) => id !== action.activityId).length === 0;\n const promotion = buildParentMutations({\n parentId: action.parentId,\n newChildId: action.activityId,\n getParent: (id) => (adapter.getActivity(id) as never) ?? null,\n isCurrentlyLeaf: wasLeaf,\n // Move reparents an EXISTING child — legacy never re-stamps the new\n // parent's progress (it keeps its pre-move leaf value). See JUN-23.\n promotionSource: 'reparent'\n });\n if (promotion) {\n for (const [key, value] of Object.entries(promotion.fields)) {\n setActivityFieldDynamic(adapter, promotion.parentId, key, value);\n }\n if (promotion.fields.custom_id === null) {\n releaseClearedCustomId(oldNewParentCustomId, deps.customIdTracker);\n }\n }\n }\n }\n // b. Demote old parent if it lost its last child. On demotion, regenerate\n // a fresh custom_id from the previous sibling's pattern — mirrors the\n // outdent demote (below) and legacy drag-reparent restore\n // (`restoreCustomIdForOldParentAfterRowDrag` /\n // `restoreCustomIdWhenParentLosesAllChildren`, fired on onRowDragEnd).\n // Leaf-only custom_id rule: a re-leafed parent is schedulable again.\n if (oldParentKey !== ROOT_PARENT_ID) {\n const oldParentActivity = adapter.getActivity(oldParentKey);\n if (oldParentActivity) {\n const remaining = adapter.getChildren(oldParentKey);\n const demotion = buildParentDemotionMutations({\n parent: oldParentActivity as never,\n remainingChildIds: remaining.map(String),\n idsRemoved: new Set([action.activityId as ActivityId])\n });\n if (demotion) {\n for (const [key, value] of Object.entries(demotion.fields)) {\n setActivityFieldDynamic(adapter, oldParentKey, key, value);\n }\n // Regenerate custom_id from prev sibling pattern (same as outdent).\n const prevSibId = findPrevSiblingHelper(oldParentKey, adapter);\n const prevSiblingCustomIdRaw = prevSibId\n ? (\n adapter.getActivity(prevSibId) as unknown as Record<\n string,\n unknown\n >\n )?.custom_id\n : null;\n const prevSiblingCustomId =\n typeof prevSiblingCustomIdRaw === 'string' && prevSiblingCustomIdRaw\n ? prevSiblingCustomIdRaw\n : null;\n const newCustomId =\n deps.customIdTracker.generateCustomIdForRestoredChild(\n prevSiblingCustomId\n );\n adapter.setActivityField(oldParentKey, COLUMN.CUSTOM_ID, newCustomId);\n }\n }\n }\n }\n\n // Recompute hh + real_work cascade. Reorder within same parent does\n // not change ancestor sums; only cross-parent moves do.\n if (parentChanged) {\n if (oldParentKey !== ROOT_PARENT_ID) {\n recomputeRollupCascadesForParent(oldParentKey as ActivityId, adapter);\n }\n if (!newParentIsRoot) {\n recomputeRollupCascadesForParent(action.parentId as ActivityId, adapter);\n }\n }\n\n // The correlative sweep mutates `correlative_id` directly (bypassing the\n // write journal, by design), so fold its shifts into the touched set with a\n // fabricated before-image: a clone of the current (pre-autoscheduler) state\n // with the old correlative restored. Rows already in beforeSnap keep their\n // earlier pre-mutation image. Mirrors activity-delete.ts.\n const correlativeShifts = recomputeCorrelativeIds(adapter);\n for (const shift of correlativeShifts) {\n touched.add(shift.activityId);\n if (beforeSnap.has(shift.activityId)) continue;\n const liveActivity = adapter.getActivity(shift.activityId);\n if (!liveActivity) continue;\n const beforeImage = structuredCloneActivity(liveActivity);\n beforeImage.correlative_id = shift.before;\n beforeSnap.set(shift.activityId, beforeImage);\n }\n\n const { scheduledIds, scheduledBeforeImages } = await runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n {\n action,\n autoscheduleFrom: action.activityId,\n recomputeParentsFrom: [action.activityId, action.parentId],\n now: deps.now,\n options\n }\n );\n\n const invalidLinkIds = parentChanged\n ? collectInvalidLinkIdsForCycle([action.activityId], adapter)\n : [];\n\n const trackingEvent: TrackingEventOut = {\n name: DISPATCH_TRACK_EVENT.ACTIVITY_MOVE,\n properties: {\n activity_id: action.activityId,\n new_parent_id: action.parentId,\n after_sibling_id: action.afterSiblingId ?? null,\n invalid_link_ids: invalidLinkIds.map(String)\n }\n };\n if (action.eventSource !== undefined) {\n trackingEvent.properties.event_source = action.eventSource;\n }\n\n // SIR (A5): if the move shifted a frozen activity's dates (via the\n // autoscheduler pass), auto-reject its pending SIR(s) and unfreeze it.\n // 'before-diff' so the cleared pendingRequests shows in the diff.\n return {\n ok: true,\n changes: assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds: touched,\n scheduledIds,\n scheduledBeforeImages,\n sirDetection: 'before-diff',\n trackingEvents: [trackingEvent],\n hoursPerDay: sector.hoursPerDay\n })\n };\n}\n","import { REJECTION_REASON } from '../reasons.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { ACTIVITY_PROPERTY } from '../../constants/activity-properties.js';\nimport { REAL_CONSTRAINT_TYPE } from '../../columns/constraint-type/constants.js';\nimport { DISPATCH_TRACK_EVENT } from '../tracking-events.js';\nimport { ROOT_PARENT_ID } from '../../internal/hierarchy/root-parent.js';\nimport { recomputeCorrelativeIds } from '../../internal/hierarchy/recompute-correlative-ids.js';\nimport { recomputeRollupCascadesForParent } from '../../propagations/upward/recompute-rollup-cascades.js';\nimport { collectInvalidLinkIdsForCycle } from '../../internal/hierarchy/invalid-links.js';\nimport { findPreviousNonSelectedSibling } from '../../internal/hierarchy/visual-order.js';\nimport { isPromotableLeafType } from '../../activity-types/index.js';\nimport { buildParentMutations } from '../../creation/parent-mutation-pipeline.js';\nimport type { ActivityId } from '../../types.js';\nimport type {\n DispatchAction,\n DispatchOptions,\n DispatchResult\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport {\n readCorrelativeId,\n NOT_SET_SORT_VALUE,\n TEMP_CID_SENTINEL\n} from '../shared/positional.js';\nimport {\n snapshotActivities,\n structuredCloneActivity\n} from '../shared/snapshots.js';\nimport { setActivityFieldDynamic } from '../../internal/state/dynamic-writes.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport {\n releaseClearedCustomId,\n type TrackingEventOut\n} from '../shared/helpers.js';\n\n// ---------------------------------------------------------------------------\n// Activity indent (multi with chain semantics)\n// ---------------------------------------------------------------------------\n\nexport async function dispatchActivityIndent(\n action: Extract<DispatchAction, { kind: 'activity-indent' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, scheduler, sector } = deps;\n scheduler.invalidateAllCaches();\n\n if (action.activityIds.length === 0) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_IDS_EMPTY };\n }\n\n const selectedSet = new Set<ActivityId>(action.activityIds);\n\n // Snapshot pre-state. The touched set will grow as we resolve targets.\n const touched = new Set<string>();\n const failed: Array<{ activityId: ActivityId; reason: string }> = [];\n const succeededIds: ActivityId[] = [];\n // Capture activity-id → new-parent mapping (for promotion side-effects).\n const moves: Array<{\n activityId: ActivityId;\n newParentId: ActivityId;\n oldParentId: ActivityId | '0';\n }> = [];\n\n // Effective-blocked set: tracks ids that are SELECTED AND WILL MOVE.\n // Failed ids are removed → they remain in place and become eligible\n // anchors for subsequent items in the same batch (matches legacy\n // production behavior: see X-I4 / X-I-mixed parity validation 2026-05-21).\n const blockingSet = new Set<ActivityId>(selectedSet);\n\n // Process in correlative_id ASC — the canonical visual order\n // (RULE_correlative_id_ordering). Guarantees that a failure earlier in\n // the visual order has a chance to unblock items later in the visual\n // order, independent of the input array's order. Missing ids sort last\n // so they fail with `activity_not_found` after legitimate ids are tried.\n const sortedIds = [...action.activityIds].sort((a, b) => {\n const aSnap = adapter.getActivity(a);\n const bSnap = adapter.getActivity(b);\n const ac = aSnap ? readCorrelativeId(aSnap) : NOT_SET_SORT_VALUE;\n const bc = bSnap ? readCorrelativeId(bSnap) : NOT_SET_SORT_VALUE;\n return ac - bc;\n });\n\n for (const id of sortedIds) {\n const activity = adapter.getActivity(id);\n if (!activity) {\n failed.push({\n activityId: id,\n reason: REJECTION_REASON.ACTIVITY_NOT_FOUND\n });\n blockingSet.delete(id as ActivityId);\n continue;\n }\n const targetParentId = findPreviousNonSelectedSibling(\n id,\n blockingSet,\n adapter\n );\n if (targetParentId == null) {\n failed.push({\n activityId: id,\n reason: REJECTION_REASON.INDENT_NO_ELIGIBLE_SIBLING\n });\n blockingSet.delete(id as ActivityId);\n continue;\n }\n const oldParentRaw = adapter.getActivity(id)?.parent;\n const oldParentId =\n oldParentRaw == null || oldParentRaw === 0\n ? ROOT_PARENT_ID\n : (String(oldParentRaw) as ActivityId);\n moves.push({ activityId: id, newParentId: targetParentId, oldParentId });\n touched.add(id);\n touched.add(targetParentId);\n if (oldParentId !== ROOT_PARENT_ID) touched.add(oldParentId);\n }\n\n // Only the handler-touched rows are snapshotted here (PERFORMANCE.md §A1):\n // every mutation below writes through the journal (→ write-capture fold-in)\n // except the correlative sweep, whose shifts are folded in explicitly after\n // it runs. No O(N) snapshot of the whole tree per indent.\n const beforeSnap = snapshotActivities(adapter, touched);\n\n // Apply moves.\n for (const { activityId, newParentId } of moves) {\n adapter.setActivityField(activityId, ACTIVITY_PROPERTY.PARENT, newParentId);\n // Position at the end of the new parent's children — large temporary\n // correlative_id so recompute places it after current siblings.\n adapter.setActivityField(\n activityId,\n COLUMN.CORRELATIVE_ID,\n TEMP_CID_SENTINEL\n );\n succeededIds.push(activityId);\n }\n\n // Apply promotion side-effects on each new parent (deduped).\n const promotedParents = new Set<ActivityId>();\n for (const { activityId, newParentId } of moves) {\n if (promotedParents.has(newParentId)) continue;\n promotedParents.add(newParentId);\n const newParent = adapter.getActivity(newParentId);\n if (!newParent) continue;\n // Capture before promotion clears it, to release to the tracker pool.\n const oldNewParentCustomId = newParent.custom_id;\n // N2: snapshot the pre-mutation constraint so real_constraint_type can be\n // frozen at it (legacy never rewrites it on promotion). Captured before\n // the ASAP nullification below clobbers `constraint_type`.\n const preMutationConstraint = newParent.constraint_type ?? 'asap';\n // Promotable leaf = task OR milestone (canonical predicate) — keep in\n // sync with the create path (same rule inside buildParentMutations).\n const wasLeaf =\n isPromotableLeafType(newParent.type) &&\n adapter\n .getChildren(newParentId)\n .filter((id) => !succeededIds.includes(id as ActivityId)).length === 0;\n const promotion = buildParentMutations({\n parentId: newParentId,\n newChildId: activityId,\n getParent: (id) => (adapter.getActivity(id) as never) ?? null,\n isCurrentlyLeaf: wasLeaf,\n // Indent reparents an EXISTING child — legacy never re-stamps the new\n // parent's progress (it keeps its pre-indent leaf value). See JUN-23.\n promotionSource: 'reparent'\n });\n if (promotion) {\n for (const [key, value] of Object.entries(promotion.fields)) {\n setActivityFieldDynamic(adapter, promotion.parentId, key, value);\n }\n // `buildParentMutations` is shared with the CREATE path, so it stamps the\n // new-activity bookkeeping (`hasNewActivities: true`,\n // `newActivitiesArray: [child]`). An indent moves an EXISTING (already\n // saved) activity, not a newly-created one — legacy's `actions.indent`\n // (gantt.moveTask) never touches these flags, so the oracle keeps the new\n // parent at `hasNewActivities: false` / `newActivitiesArray: []`\n // (MORNING_QUEUE.md — JUN-18). Override the create-flow leak.\n adapter.setActivityField(\n newParentId,\n ACTIVITY_PROPERTY.HAS_NEW_ACTIVITIES,\n false\n );\n adapter.setActivityField(\n newParentId,\n ACTIVITY_PROPERTY.NEW_ACTIVITIES_ARRAY,\n []\n );\n }\n // Force ASAP on the new parent (legacy `applyIndentSideEffects`).\n adapter.setActivityField(newParentId, COLUMN.CONSTRAINT_TYPE, 'asap');\n adapter.setActivityField(newParentId, COLUMN.CONSTRAINT_DATE, null);\n // N2: real_constraint_type is PRESERVED frozen at the pre-mutation\n // constraint (legacy `setParentAsASAPConstraint` never writes it —\n // display/serialization only, not read by scheduler/CP). Set explicitly\n // because it isn't stored first-class; otherwise it would derive from the\n // now-ASAP constraint_type. See N2 fix.\n adapter.setActivityField(\n newParentId,\n REAL_CONSTRAINT_TYPE,\n preMutationConstraint\n );\n adapter.setActivityField(newParentId, COLUMN.CUSTOM_ID, null);\n // Release the cleared custom_id to the tracker pool (legacy\n // `clearCustomIdOnParentConversion`). No-op if it had none.\n releaseClearedCustomId(oldNewParentCustomId, deps.customIdTracker);\n }\n\n // Recompute hh + real_work cascade for each affected parent (old + new).\n // Deduped across moves.\n const indentAffectedParents = new Set<string>();\n for (const m of moves) {\n if (m.oldParentId !== ROOT_PARENT_ID)\n indentAffectedParents.add(m.oldParentId);\n indentAffectedParents.add(m.newParentId);\n }\n for (const pid of indentAffectedParents) {\n recomputeRollupCascadesForParent(pid as ActivityId, adapter);\n }\n\n // Fold the correlative sweep's shifts into the touched set — it mutates\n // `correlative_id` directly (bypassing the journal), so its rows need an\n // explicit fabricated before-image (clone of current, old correlative\n // restored). Rows already snapshotted keep their earlier image. See\n // activity-delete.ts / PERFORMANCE.md §A1.\n const correlativeShifts = recomputeCorrelativeIds(adapter);\n for (const shift of correlativeShifts) {\n touched.add(shift.activityId);\n if (beforeSnap.has(shift.activityId)) continue;\n const liveActivity = adapter.getActivity(shift.activityId);\n if (!liveActivity) continue;\n const beforeImage = structuredCloneActivity(liveActivity);\n beforeImage.correlative_id = shift.before;\n beforeSnap.set(shift.activityId, beforeImage);\n }\n\n const { scheduledIds, scheduledBeforeImages } = await runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n {\n action,\n // A pure indent (reparent) does NOT auto-reschedule dates in legacy:\n // `actions.indent` runs purely through `gantt.moveTask`, firing only\n // `onBeforeTaskMove`/`onAfterTaskMove` — never `autoSchedule()` /\n // `onAfterAutoSchedule`. So the moved child + its downstream chain KEEP\n // their pre-indent dates; only the new parent's bounds re-roll (via\n // DHTMLX `_update_parents` in the move's batchUpdate — done unconditionally\n // by `updateParentBoundsFromChildren` below). The core previously passed\n // `{}` here, running a full ASAP/ALAP reflow that pulled the moved child +\n // chain as-early-as-possible — diverging from the oracle (MORNING_QUEUE.md\n // — JUN-11 corr20 stays 2024-05-07 stale, core moved it to 04-30; JUN-16(B)\n // corr33 stays 2026-10-21 stale, core pulled it to 09-16). `null` suppresses\n // the date cascade entirely, completing the outdent mirror (outdent's `{}`\n // was always a no-op because its moved child keeps its links/position; a\n // childless leaf + reparent of an EXISTING activity is never the trigger\n // of an autoSchedule). A SUBSEQUENT date/constraint/link edit still\n // cascades normally (its own handler passes a non-null trigger).\n autoscheduleFrom: null,\n recomputeParentsFrom: succeededIds,\n // A pure indent re-rolls the new parent's start/end/duration but legacy\n // leaves `for_disable_milestone_duration` STALE at the pre-indent value —\n // the milestone-promotion branch (`adjustParentMilestone`) only fires for a\n // 0-duration milestone, never a task → project promotion (MORNING_QUEUE.md\n // — JUN-18 / JUN-11). A later scheduling recalc that re-rolls these parents\n // re-derives the mirror = duration — that is how the oracle's mirror is\n // FRESH whenever an edit follows the indent (MORNING_QUEUE.md — JUN-19).\n // `resolveDerivedPasses` skips the ancestor stamp for activity-indent.\n // activity-indent is a structural reparent: leaves EP and CP stale.\n now: deps.now,\n options\n }\n );\n\n const invalidLinkIds = collectInvalidLinkIdsForCycle(succeededIds, adapter);\n\n const trackingEvent: TrackingEventOut = {\n name: DISPATCH_TRACK_EVENT.ACTIVITY_INDENT,\n properties: {\n activity_ids: succeededIds,\n failed: failed.map((f) => ({\n activity_id: f.activityId,\n reason: f.reason\n })),\n invalid_link_ids: invalidLinkIds\n }\n };\n if (action.eventSource !== undefined) {\n trackingEvent.properties.event_source = action.eventSource;\n }\n\n return {\n ok: true,\n changes: assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds: touched,\n scheduledIds,\n scheduledBeforeImages,\n trackingEvents: [trackingEvent],\n hoursPerDay: sector.hoursPerDay\n })\n };\n}\n","import { REJECTION_REASON } from '../reasons.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { ACTIVITY_PROPERTY } from '../../constants/activity-properties.js';\nimport { DISPATCH_TRACK_EVENT } from '../tracking-events.js';\nimport {\n ROOT_PARENT_ID,\n isRootParent\n} from '../../internal/hierarchy/root-parent.js';\nimport { recomputeCorrelativeIds } from '../../internal/hierarchy/recompute-correlative-ids.js';\nimport { recomputeRollupCascadesForParent } from '../../propagations/upward/recompute-rollup-cascades.js';\nimport { buildParentDemotionMutations } from '../../internal/hierarchy/parent-demotion.js';\nimport { recomputeSingleParentDisplayBounds } from '../../propagations/upward/parent-bounds.js';\nimport { visualIndexInParent } from '../../internal/hierarchy/visual-order.js';\nimport type { ActivityId } from '../../types.js';\nimport type {\n DispatchAction,\n DispatchOptions,\n DispatchResult\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport {\n computeFractionalCidAtIndex,\n findPrevSiblingHelper,\n findFirstSelectedSibling,\n readCorrelativeId,\n NOT_SET_SORT_VALUE\n} from '../shared/positional.js';\nimport {\n snapshotActivities,\n structuredCloneActivity\n} from '../shared/snapshots.js';\nimport { setActivityFieldDynamic } from '../../internal/state/dynamic-writes.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport type { TrackingEventOut } from '../shared/helpers.js';\n\n// ---------------------------------------------------------------------------\n// Activity outdent (multi with index-shift correctness)\n// ---------------------------------------------------------------------------\n\nexport async function dispatchActivityOutdent(\n action: Extract<DispatchAction, { kind: 'activity-outdent' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, scheduler, sector } = deps;\n scheduler.invalidateAllCaches();\n\n if (action.activityIds.length === 0) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_IDS_EMPTY };\n }\n\n const selectedSet = new Set<ActivityId>(action.activityIds);\n\n // Pre-loop capture: each id's original visual index in its parent, and\n // the first selected sibling of its chain. Mirrors legacy\n // `initialTaskIndexes` + `initialFirstSiblings`.\n const initialTaskIndexes = new Map<ActivityId, number>();\n const initialFirstSiblings = new Map<ActivityId, ActivityId>();\n for (const id of action.activityIds) {\n const key = id as ActivityId;\n if (!adapter.getActivity(key)) continue;\n initialTaskIndexes.set(key, visualIndexInParent(key, adapter));\n initialFirstSiblings.set(\n key,\n findFirstSelectedSibling(key, selectedSet, adapter)\n );\n }\n\n const touched = new Set<string>();\n const failed: Array<{ activityId: ActivityId; reason: string }> = [];\n const succeededIds: ActivityId[] = [];\n const oldParents = new Set<ActivityId>();\n\n // Plan moves with their target index (relative to grandparent).\n type Plan = {\n activityId: ActivityId;\n grandparentKey: ActivityId | '0';\n oldParentKey: ActivityId;\n targetIndexInGrandparent: number;\n };\n const planned: Plan[] = [];\n\n // Process in correlative_id ASC — canonical visual order\n // (RULE_correlative_id_ordering). Same rationale as indent: order\n // independence + earlier fails don't block later items.\n const sortedIds = [...action.activityIds].sort((a, b) => {\n const aSnap = adapter.getActivity(a);\n const bSnap = adapter.getActivity(b);\n const ac = aSnap ? readCorrelativeId(aSnap) : NOT_SET_SORT_VALUE;\n const bc = bSnap ? readCorrelativeId(bSnap) : NOT_SET_SORT_VALUE;\n return ac - bc;\n });\n\n for (const id of sortedIds) {\n const key = id as ActivityId;\n const activity = adapter.getActivity(key);\n if (!activity) {\n failed.push({\n activityId: key,\n reason: REJECTION_REASON.ACTIVITY_NOT_FOUND\n });\n continue;\n }\n const oldParent = activity.parent;\n if (isRootParent(oldParent)) {\n failed.push({\n activityId: key,\n reason: REJECTION_REASON.OUTDENT_ROOT_LEVEL_NOT_EDITABLE\n });\n continue;\n }\n const oldParentKey = String(oldParent) as ActivityId;\n const oldParentSnap = adapter.getActivity(oldParentKey);\n if (!oldParentSnap) {\n failed.push({\n activityId: key,\n reason: REJECTION_REASON.ACTIVITY_NOT_FOUND\n });\n continue;\n }\n // The root activity (parent === '0') is the unique \"mother\" of the\n // schedule. Its direct children cannot outdent — that would push them\n // to root level alongside the mother. Legacy rule (validated 2026-05-21\n // against anime fixture): `oldParent.parent === '0'` → refuse.\n const grandparent = oldParentSnap.parent;\n if (isRootParent(grandparent)) {\n failed.push({\n activityId: key,\n reason: REJECTION_REASON.OUTDENT_ROOT_LEVEL_NOT_EDITABLE\n });\n continue;\n }\n const grandparentKey = String(grandparent) as ActivityId;\n\n // Base target: just after the old parent in the grandparent's order.\n let targetIdx = visualIndexInParent(oldParentKey, adapter) + 1;\n // Multi-outdent shift: preserves relative order among selected siblings.\n const firstSibling = initialFirstSiblings.get(key);\n if (firstSibling != null && selectedSet.has(firstSibling)) {\n const siblingIdx = initialTaskIndexes.get(firstSibling) ?? -1;\n const myIdx = initialTaskIndexes.get(key) ?? -1;\n if (siblingIdx >= 0 && myIdx >= 0) {\n targetIdx += myIdx - siblingIdx;\n }\n }\n\n planned.push({\n activityId: key,\n grandparentKey,\n oldParentKey,\n targetIndexInGrandparent: targetIdx\n });\n touched.add(String(key));\n touched.add(String(oldParentKey));\n if (grandparentKey !== ROOT_PARENT_ID) touched.add(String(grandparentKey));\n oldParents.add(oldParentKey);\n }\n\n // Only the handler-touched rows are snapshotted here (PERFORMANCE.md §A1):\n // every mutation below writes through the journal (→ write-capture fold-in)\n // except the correlative sweep, whose shifts are folded in explicitly after\n // it runs. No O(N) snapshot of the whole tree per outdent.\n const beforeSnap = snapshotActivities(adapter, touched);\n\n // Apply moves.\n for (const plan of planned) {\n adapter.setActivityField(\n plan.activityId,\n ACTIVITY_PROPERTY.PARENT,\n plan.grandparentKey\n );\n // Position approximation: use a fractional correlative_id targeted at\n // the desired index. Recompute will normalize. Compute the cid that\n // sits between siblings at targetIndex-1 and targetIndex of the\n // grandparent (taking the just-moved activity into account).\n const cid = computeFractionalCidAtIndex(\n adapter,\n plan.grandparentKey,\n plan.targetIndexInGrandparent,\n plan.activityId\n );\n adapter.setActivityField(plan.activityId, COLUMN.CORRELATIVE_ID, cid);\n succeededIds.push(plan.activityId);\n }\n\n // Demote old parents that lost all children. When demoting, regenerate\n // a fresh custom_id from the previous sibling's pattern (matches legacy\n // `applyOutdentDemotionSideEffects`).\n for (const oldParentKey of oldParents) {\n const parentActivity = adapter.getActivity(oldParentKey);\n if (!parentActivity) continue;\n const remaining = adapter.getChildren(oldParentKey);\n const demotion = buildParentDemotionMutations({\n parent: parentActivity as never,\n remainingChildIds: remaining.map(String),\n idsRemoved: new Set(succeededIds)\n });\n if (!demotion) {\n // Source parent KEPT children (not demoted to a leaf): re-roll its\n // display bounds (start/end/duration) from the remaining children,\n // mirroring legacy `updateTask(old_parent)` → `_update_parents` on\n // outdent (MORNING_QUEUE.md JUN-14). CPM + milestone-mirror stay stale\n // (legacy doesn't recompute them on a pure reparent — see ac6059d /\n // JUN-18); the stored progress aggregate is preserved.\n recomputeSingleParentDisplayBounds(oldParentKey, adapter);\n continue;\n }\n for (const [key, value] of Object.entries(demotion.fields)) {\n setActivityFieldDynamic(adapter, oldParentKey, key, value);\n }\n // Regenerate custom_id from prev sibling pattern.\n const prevSibId = findPrevSiblingHelper(oldParentKey, adapter);\n const prevSiblingCustomIdRaw = prevSibId\n ? adapter.getActivity(prevSibId)?.custom_id\n : null;\n const prevSiblingCustomId =\n typeof prevSiblingCustomIdRaw === 'string' && prevSiblingCustomIdRaw\n ? prevSiblingCustomIdRaw\n : null;\n const newCustomId =\n deps.customIdTracker.generateCustomIdForRestoredChild(\n prevSiblingCustomId\n );\n adapter.setActivityField(oldParentKey, COLUMN.CUSTOM_ID, newCustomId);\n }\n\n // Recompute hh + real_work cascade for the parents affected by the\n // outdent: each old parent lost children, and each grandparent gained\n // them. Deduped via Set.\n const outdentAffectedParents = new Set<string>();\n for (const oldParentKey of oldParents) {\n outdentAffectedParents.add(String(oldParentKey));\n }\n for (const plan of planned) {\n if (plan.grandparentKey !== ROOT_PARENT_ID) {\n outdentAffectedParents.add(String(plan.grandparentKey));\n }\n }\n for (const pid of outdentAffectedParents) {\n recomputeRollupCascadesForParent(pid as ActivityId, adapter);\n }\n\n // Fold the correlative sweep's shifts into the touched set — it mutates\n // `correlative_id` directly (bypassing the journal), so its rows need an\n // explicit fabricated before-image (clone of current, old correlative\n // restored). Rows already snapshotted keep their earlier image. See\n // activity-delete.ts / PERFORMANCE.md §A1.\n const correlativeShifts = recomputeCorrelativeIds(adapter);\n for (const shift of correlativeShifts) {\n touched.add(shift.activityId);\n if (beforeSnap.has(shift.activityId)) continue;\n const liveActivity = adapter.getActivity(shift.activityId);\n if (!liveActivity) continue;\n const beforeImage = structuredCloneActivity(liveActivity);\n beforeImage.correlative_id = shift.before;\n beforeSnap.set(shift.activityId, beforeImage);\n }\n\n const { scheduledIds, scheduledBeforeImages } = await runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n {\n // Empty-batch gate: nothing moved → no autoscheduler pass (the\n // unconditional parent-bounds rollup still runs).\n action,\n autoscheduleFrom: succeededIds.length > 0 ? 'roots' : null,\n recomputeParentsFrom: succeededIds,\n // activity-outdent is a structural reparent: leaves EP and CP stale.\n now: deps.now,\n options\n }\n );\n\n const trackingEvent: TrackingEventOut = {\n name: DISPATCH_TRACK_EVENT.ACTIVITY_OUTDENT,\n properties: {\n activity_ids: succeededIds.map(String),\n failed: failed.map((f) => ({\n activity_id: String(f.activityId),\n reason: f.reason\n }))\n }\n };\n if (action.eventSource !== undefined) {\n trackingEvent.properties.event_source = action.eventSource;\n }\n\n return {\n ok: true,\n changes: assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds: touched,\n scheduledIds,\n scheduledBeforeImages,\n trackingEvents: [trackingEvent],\n hoursPerDay: sector.hoursPerDay\n })\n };\n}\n","import { REJECTION_REASON } from '../reasons.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { runPostProcessorsOnAdapter } from '../../internal/post-processors/runner.js';\nimport { findPipelineForColumn } from '../../columns/registry.js';\nimport type { FieldChanges } from '../../columns/types.js';\nimport type {\n DispatchAction,\n DispatchOptions,\n DispatchResult\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport {\n snapshotActivities,\n applyFieldChanges,\n collectTouchedIds,\n collectDirtyForInlineEdit\n} from '../shared/snapshots.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\n\n/**\n * Dispatch `activity-set-progress` — entry point for the \"complete\" /\n * \"uncomplete\" buttons of the schedule.\n *\n * **Bifurcation vs `inline-edit`:** the inline-edit path blocks summary\n * activities via `progressPipeline.canEdit` (because typing a progress\n * value on a parent is semantically wrong — its progress is derived).\n * The buttons, in contrast, invoke a recursive cascade on the subtree —\n * a perfectly valid operation on a parent. This handler exposes that\n * intent as its own action kind, skipping the `canEdit` gate while\n * reusing the exact same `progressPipeline.transform` so cascade,\n * weighted rollup, tracking and visualization stay identical.\n *\n * See [[complete activity business rules]] for the full rules and\n * the rationale of the bifurcation.\n */\nexport async function dispatchActivitySetProgress(\n action: Extract<DispatchAction, { kind: 'activity-set-progress' }>,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, ctx, scheduler, sector } = deps;\n\n // Strict value check (defensive — `newValue: 0 | 100` is typed).\n if (action.newValue !== 0 && action.newValue !== 100) {\n return {\n ok: false,\n reason: REJECTION_REASON.INVALID_PROGRESS_VALUE\n };\n }\n\n const activitySnap = ctx.activityReader.getActivity(action.activityId);\n if (!activitySnap) {\n return { ok: false, reason: REJECTION_REASON.ACTIVITY_NOT_FOUND };\n }\n\n const pipeline = findPipelineForColumn(COLUMN.PROGRESS);\n if (!pipeline) {\n throw new Error(\n '[ScheduleCore] progressPipeline not registered — cannot dispatch activity-set-progress'\n );\n }\n\n // ── transform ────────────────────────────────────────────────────────\n // No canEdit, no parseInput (newValue is typed), no validate\n // (range is guaranteed). Same `transform` as inline-edit → cascade,\n // rollup, tracking, visualization all reused.\n const changes: FieldChanges = pipeline.transform(\n activitySnap,\n action.newValue as never,\n ctx,\n action.newValue\n );\n\n // ── Snapshot before-state ────────────────────────────────────────────\n const touchedIds = collectTouchedIds(action.activityId, changes);\n const beforeSnap = snapshotActivities(adapter, touchedIds);\n\n // ── Apply ────────────────────────────────────────────────────────────\n applyFieldChanges(adapter, action.activityId, COLUMN.PROGRESS, changes);\n runPostProcessorsOnAdapter(\n action.activityId,\n changes.postProcessors ?? [],\n adapter\n );\n\n // ── Autoscheduler + parent bounds rollup + critical path ────────────\n const { scheduledIds } = await runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n {\n action,\n // Pipeline gate: only schedule when the transform asked for it.\n autoscheduleFrom: changes.needsAutoSchedule ? action.activityId : null,\n recomputeParentsFrom: [],\n collectDirty: (sids) =>\n collectDirtyForInlineEdit(action.activityId, touchedIds, sids),\n now: deps.now,\n options\n }\n );\n\n // ── Build ChangeSet ──────────────────────────────────────────────────\n const trackingEvents = (changes.trackingEvents ?? []).map((e) => ({\n name: e.name,\n properties: (e.properties as Record<string, unknown>) ?? {}\n }));\n\n return {\n ok: true,\n changes: assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds,\n scheduledIds,\n trackingEvents,\n hoursPerDay: sector.hoursPerDay\n })\n };\n}\n","/**\n * Dates-batch handler — K ediciones de fecha como UNA unidad de trabajo\n * (multi-drag del schedule; track onAfterTaskDrag F2.2).\n *\n * Semántica (espejo de `activity-paste` / `dispatchInlineEditLinks`):\n * - Cada edit corre SU pipeline de columna completo (canEdit → parseInput\n * → validate → transform → apply + post-processors), secuencial en el\n * orden del batch — idéntico a K dispatches encolados.\n * - Verdict POR EDIT: un edit rechazado no aborta a los demás; el bridge\n * re-proyecta solo los rechazados.\n * - El post-mutation (autoscheduler → parent bounds → CP) corre UNA sola\n * vez al final, y sale UN ChangeSet. Acá vive la ganancia: K dispatches\n * single = K pasadas de scheduler que además se CANCELAN entre sí\n * (`currentCalculationId`) perdiendo las cascadas de las primeras K-1.\n * - La pasada del scheduler va SIN triggerId (pasada completa, como\n * delete/indent/outdent): el scoping actual acepta UN solo trigger y\n * las K barras pueden vivir en connected groups distintos — scopear a\n * uno perdería las cascadas de los demás. Optimización futura: scoping\n * multi-trigger (unión de grupos).\n */\n\nimport { REJECTION_REASON } from '../reasons.js';\nimport { runPostProcessorsOnAdapter } from '../../internal/post-processors/runner.js';\nimport { findPipelineForColumn } from '../../columns/registry.js';\nimport type { FieldChanges } from '../../columns/types.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\nimport type {\n ConstraintWarning,\n DatesBatchVerdict,\n DispatchAction,\n DispatchOptions,\n DispatchResult,\n TrackingEvent\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport {\n snapshotActivities,\n applyFieldChanges,\n collectTouchedIds\n} from '../shared/snapshots.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport { toConstraintWarning } from '../shared/constraint-warnings.js';\nimport {\n snapshotIncomingLinkLags,\n diffIncomingLinkLagChanges\n} from '../shared/helpers.js';\nimport type { EntityChange } from '../types.js';\nimport type { Link } from '../../types.js';\n\ntype DatesBatchAction = Extract<DispatchAction, { kind: 'dates-batch' }>;\ntype DatesBatchEdit = DatesBatchAction['edits'][number];\n\nexport async function dispatchDatesBatch(\n action: DatesBatchAction,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, scheduler, sector } = deps;\n\n const verdicts: DatesBatchVerdict[] = [];\n // First-wins: el before de cada activity es su estado PREVIO al batch\n // entero, aunque dos edits (o un cascade) la toquen dos veces.\n const beforeSnap = new Map<string, EngineActivitySnapshot>();\n const touchedIds = new Set<string>();\n const trackingEvents: TrackingEvent[] = [];\n const linkChanges: EntityChange<Link>[] = [];\n const warnings: ConstraintWarning[] = [];\n let needsAutoSchedule = false;\n\n for (const edit of action.edits) {\n const outcome = applyOneEdit(edit, deps);\n verdicts.push(outcome.verdict);\n if (!outcome.verdict.ok || !outcome.changes) continue;\n\n const editTouched = collectTouchedIds(edit.activityId, outcome.changes);\n mergeBeforeSnapshots(beforeSnap, editTouched, deps);\n for (const id of editTouched) touchedIds.add(id);\n\n // Lags entrantes: el post-processor del lag absorbente los muta y la\n // mutación debe viajar en el ChangeSet (F4) — un diff por edit.\n const beforeLinkLags = snapshotIncomingLinkLags(adapter, edit.activityId);\n applyFieldChanges(adapter, edit.activityId, edit.column, outcome.changes);\n runPostProcessorsOnAdapter(\n edit.activityId,\n outcome.changes.postProcessors ?? [],\n adapter\n );\n linkChanges.push(\n ...diffIncomingLinkLagChanges(beforeLinkLags, adapter, edit.activityId)\n );\n\n needsAutoSchedule ||= Boolean(outcome.changes.needsAutoSchedule);\n for (const e of outcome.changes.trackingEvents ?? []) {\n trackingEvents.push({\n name: e.name,\n properties: (e.properties as Record<string, unknown>) ?? {}\n });\n }\n\n const constraintWarning = toConstraintWarning(\n edit.activityId,\n outcome.changes.constraintWarning\n );\n if (constraintWarning) warnings.push(constraintWarning);\n }\n\n const { scheduledIds } = await runPostMutation(\n { adapter, scheduler, sector: deps.sector },\n {\n action,\n autoscheduleFrom: needsAutoSchedule ? 'roots' : null,\n recomputeParentsFrom: touchedIds,\n now: deps.now,\n options\n }\n );\n\n return {\n ok: true,\n verdicts,\n changes: assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds,\n scheduledIds,\n sirDetection: 'before-diff',\n links: linkChanges,\n trackingEvents,\n warnings,\n hoursPerDay: sector.hoursPerDay\n })\n };\n}\n\ninterface EditOutcome {\n verdict: DatesBatchVerdict;\n changes: FieldChanges | null;\n}\n\n/**\n * Corre las fases 1-4 del protocolo inline-edit para UN edit (canEdit →\n * parseInput → validate → transform). El snapshot que lee ya refleja los\n * edits anteriores del batch (semántica secuencial, ≡ K dispatches en\n * cola). Devuelve el verdict y, si pasó, los FieldChanges listos para\n * aplicar.\n */\nfunction applyOneEdit(edit: DatesBatchEdit, deps: DispatchDeps): EditOutcome {\n const { ctx } = deps;\n const activityId = edit.activityId;\n\n const pipeline = findPipelineForColumn(edit.column);\n if (!pipeline) {\n throw new Error(\n `[ScheduleCore] no pipeline registered for column \"${edit.column}\"`\n );\n }\n\n const activitySnap = ctx.activityReader.getActivity(edit.activityId);\n if (!activitySnap) {\n // Desync fundamental (el caller despachó un id que el core no tiene):\n // explota, no degrada — mismo contrato que el inline-edit single.\n throw new Error(`[ScheduleCore] activity \"${edit.activityId}\" not found`);\n }\n\n const editGate = pipeline.canEdit(activitySnap);\n if (!editGate.allowed) {\n return {\n verdict: {\n activityId,\n ok: false,\n reason: editGate.reason ?? REJECTION_REASON.CANNOT_EDIT,\n ...(editGate.alertKey ? { alertKey: editGate.alertKey } : {})\n },\n changes: null\n };\n }\n\n const parsed = pipeline.parseInput(edit.newValue, activitySnap, ctx);\n if (!parsed.ok) {\n return {\n verdict: {\n activityId,\n ok: false,\n reason: parsed.reason ?? REJECTION_REASON.PARSE_ERROR\n },\n changes: null\n };\n }\n\n const oldValue = Reflect.get(activitySnap, edit.column);\n const validation = pipeline.validate(\n activitySnap,\n oldValue as never,\n parsed.value as never,\n ctx\n );\n if (!validation.valid) {\n return {\n verdict: {\n activityId,\n ok: false,\n reason: validation.reason ?? REJECTION_REASON.INVALID,\n ...(validation.notification?.messageKey\n ? { alertKey: validation.notification.messageKey }\n : {})\n },\n changes: null\n };\n }\n\n const changes = pipeline.transform(\n activitySnap,\n parsed.value as never,\n ctx,\n parsed.raw\n );\n return { verdict: { activityId, ok: true }, changes };\n}\n\n/** Snapshot first-wins: solo ids que aún no tienen before capturado. */\nfunction mergeBeforeSnapshots(\n beforeSnap: Map<string, EngineActivitySnapshot>,\n ids: Set<string>,\n deps: DispatchDeps\n): void {\n const missing = new Set<string>();\n for (const id of ids) {\n if (!beforeSnap.has(id)) missing.add(id);\n }\n if (missing.size === 0) return;\n for (const [id, snap] of snapshotActivities(deps.adapter, missing)) {\n beforeSnap.set(id, snap);\n }\n}\n","/**\n * Bulk-edit handler — K ediciones de columna arbitraria como UNA unidad de\n * trabajo (bulk editors / modales del schedule; PLAN_convergencia_wiring\n * §4.1, F1). Generalización de `dates-batch` (handlers/dates-batch.ts) a\n * las 16 columnas del registry.\n *\n * Semántica:\n * - Cada edit resuelve su pipeline vía `findPipelineForColumn` y corre las\n * fases 1-4 del protocolo inline-edit (canEdit → parseInput → validate →\n * transform), secuencial en el orden del batch — idéntico a K dispatches\n * encolados (cada edit ve el estado dejado por los anteriores).\n * - Verdict POR EDIT: un edit rechazado no aborta a los demás (semántica\n * paste, igual que `dates-batch`). Difiere de `dates-batch` en dos casos\n * que allá explotan y acá degradan a verdict: columna sin pipeline\n * (`no_pipeline_for_column` — p.ej. las columnas de links\n * `custom_predecessors` / `custom_sucessors`, que mutan el grafo y se\n * despachan como intents de link) y activity inexistente\n * (`activity_not_found` — los targets vienen de la selección de la UI y\n * pueden quedar stale). Nunca throw, nunca aborta el batch.\n * - El post-mutation (autoscheduler → parent bounds → CP) corre UNA sola\n * vez al final, SIN triggerId (pasada completa, como `dates-batch`: los\n * K edits pueden vivir en connected groups distintos), y sale UN\n * ChangeSet = UN paso de undo (nunca coalesce — `computeCoalesceKey`\n * solo emite key para inline-edit).\n * - `custom_id` conserva el chequeo cross-pipeline de duplicados y el sync\n * del CustomIdTracker (espejo de inline-edit pasos 3b/6b).\n * - Constraint post-pass (espejo del paso 8b de inline-edit, sobre el\n * CONJUNTO): tras el settle, cada activity con un edit ACEPTADO de\n * `constraint_type`/`constraint_date` pasa por `revertNoOpConstraintEdit`;\n * si ALGUNA revirtió, se re-settlea UNA sola vez (nunca por edit) y el CP\n * corre una única vez al final (suprimido en los settles intermedios).\n * PRIOR con doble edit de la misma activity (constraint_type +\n * constraint_date en el mismo batch): el prior es el `constraint_date`\n * PRE-BATCH (first-wins, leído del mismo `beforeSnap` first-wins del\n * diff) — el valor sembrado por el primer edit es estado intermedio de UNA\n * unidad de trabajo / UN paso de undo, nunca un prior válido. Los\n * before-images del re-settle se mergean first-wins bajo los del primer\n * settle por la misma razón: diff y undo anclan al estado PRE-batch, no al\n * intermedio (un dependiente movido y devuelto no produce entry fantasma).\n */\n\nimport { REJECTION_REASON } from '../reasons.js';\nimport { runPostProcessorsOnAdapter } from '../../internal/post-processors/runner.js';\nimport { findPipelineForColumn } from '../../columns/registry.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type { FieldChanges } from '../../columns/types.js';\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\nimport type {\n ConstraintWarning,\n DatesBatchVerdict,\n DispatchAction,\n DispatchOptions,\n DispatchResult,\n TrackingEvent\n} from '../types.js';\nimport type { DispatchDeps } from '../shared/deps.js';\nimport {\n snapshotActivities,\n applyFieldChanges,\n collectTouchedIds\n} from '../shared/snapshots.js';\nimport { runPostMutation } from '../shared/post-mutation.js';\nimport type { PostMutationArgs } from '../shared/post-mutation.js';\nimport {\n isConstraintEditColumn,\n revertNoOpConstraintEdit\n} from './revert-no-op-constraint-edit.js';\nimport { settleConstraintEdits } from '../shared/constraint-settle.js';\nimport { assembleChangeSet } from '../shared/change-set.js';\nimport { toConstraintWarning } from '../shared/constraint-warnings.js';\nimport {\n snapshotIncomingLinkLags,\n diffIncomingLinkLagChanges\n} from '../shared/helpers.js';\nimport type { EntityChange } from '../types.js';\nimport type { Link } from '../../types.js';\n\ntype BulkEditAction = Extract<DispatchAction, { kind: 'bulk-edit' }>;\ntype BulkEditEdit = BulkEditAction['edits'][number];\n\nconst CUSTOM_ID_COLUMN = COLUMN.CUSTOM_ID;\n\nexport async function dispatchBulkEdit(\n action: BulkEditAction,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n const { adapter, scheduler, sector } = deps;\n\n // Same rule as inline-edit's `columnInvalidatesExpandedLinks`: a duration\n // edit changes which parent-virtual links survive chain pruning\n // (`|lag| <= duration`), so the cached expansion must be invalidated.\n const editsIncludeDuration = action.edits.some(\n (edit) => edit.column === COLUMN.DURATION\n );\n if (editsIncludeDuration) {\n scheduler.invalidateExpandedLinksCache();\n }\n\n const verdicts: DatesBatchVerdict[] = [];\n // First-wins: el before de cada activity es su estado PREVIO al batch\n // entero, aunque dos edits (o un cascade) la toquen dos veces.\n const beforeSnap = new Map<string, EngineActivitySnapshot>();\n // Prior PRE-BATCH por activity para el post-pass de constraints (8b) —\n // first-wins, coherente con `beforeSnap` (ver docblock).\n const constraintPriorsByActivity = new Map<string, Date | null>();\n const touchedIds = new Set<string>();\n const trackingEvents: TrackingEvent[] = [];\n const linkChanges: EntityChange<Link>[] = [];\n const warnings: ConstraintWarning[] = [];\n let needsAutoSchedule = false;\n\n for (const edit of action.edits) {\n const outcome = applyOneEdit(edit, deps);\n verdicts.push(outcome.verdict);\n if (!outcome.verdict.ok || !outcome.changes) continue;\n\n const constraintWarning = toConstraintWarning(\n edit.activityId,\n outcome.changes.constraintWarning\n );\n if (constraintWarning) warnings.push(constraintWarning);\n\n const editTouched = collectTouchedIds(edit.activityId, outcome.changes);\n mergeBeforeSnapshots(beforeSnap, editTouched, deps);\n for (const touchedId of editTouched) touchedIds.add(touchedId);\n recordConstraintPrior(constraintPriorsByActivity, edit, beforeSnap);\n\n // Lags entrantes: el post-processor del lag absorbente los muta y la\n // mutación debe viajar en el ChangeSet (F4) — un diff por edit.\n const beforeLinkLags = snapshotIncomingLinkLags(adapter, edit.activityId);\n const customIdBeforeApply = readLiveCustomId(edit, deps);\n applyFieldChanges(adapter, edit.activityId, edit.column, outcome.changes);\n runPostProcessorsOnAdapter(\n edit.activityId,\n outcome.changes.postProcessors ?? [],\n adapter\n );\n syncCustomIdTracker(edit, customIdBeforeApply, deps);\n linkChanges.push(\n ...diffIncomingLinkLagChanges(beforeLinkLags, adapter, edit.activityId)\n );\n\n needsAutoSchedule ||= Boolean(outcome.changes.needsAutoSchedule);\n for (const trackingEvent of outcome.changes.trackingEvents ?? []) {\n trackingEvents.push({\n name: trackingEvent.name,\n properties: (trackingEvent.properties as Record<string, unknown>) ?? {}\n });\n }\n }\n\n const postMutationArgs: PostMutationArgs = {\n action,\n autoscheduleFrom: needsAutoSchedule ? 'roots' : null,\n recomputeParentsFrom: touchedIds,\n now: deps.now,\n options\n };\n\n // ── 8b (espejo de inline-edit, sobre el CONJUNTO): revert de edits de\n // constraint no-op. Corre DESPUÉS del settle para comparar el start_date\n // ASENTADO contra el last_start_date pre-edit; si algún revert cambió una\n // constraint_date, UN solo re-settle (nunca por edit) deja al downstream\n // re-asentarse sin la constraint ya no vinculante. Ver docblock (prior\n // PRE-BATCH + merge first-wins de before-images). La secuencia settle →\n // revert → re-settle → CP única al final vive en `constraint-settle.ts`.\n const batchHasConstraintEdits = constraintPriorsByActivity.size > 0;\n const { scheduledIds, scheduledBeforeImages } = await (batchHasConstraintEdits\n ? settleConstraintEdits(\n { adapter, scheduler, sector },\n {\n postMutationArgs,\n revertTargets: [...constraintPriorsByActivity].map(\n ([activityId, priorConstraintDate]) => ({\n activityId,\n priorConstraintDate\n })\n ),\n revert: (activityId, priorConstraintDate) =>\n revertNoOpConstraintEdit(\n activityId,\n priorConstraintDate,\n adapter,\n deps.ctx.calendars\n )\n }\n )\n : runPostMutation({ adapter, scheduler, sector }, postMutationArgs));\n\n return {\n ok: true,\n verdicts,\n changes: assembleChangeSet(adapter, {\n source: action,\n beforeSnap,\n touchedIds,\n scheduledIds,\n // Los dependientes que mueve el autoscheduler no están en beforeSnap;\n // sin su before-image el diff los marca FALSE-CREATED y el undo los\n // borra (fix 4bbccbc de inline-edit).\n scheduledBeforeImages,\n sirDetection: 'before-diff',\n links: linkChanges,\n trackingEvents,\n warnings,\n hoursPerDay: sector.hoursPerDay\n })\n };\n}\n\ninterface EditOutcome {\n verdict: DatesBatchVerdict;\n changes: FieldChanges | null;\n}\n\n/**\n * Corre las fases 1-4 del protocolo inline-edit para UN edit (canEdit →\n * parseInput → validate → transform), más el chequeo cross-pipeline de\n * `custom_id` duplicado (espejo del paso 3b de inline-edit). El snapshot\n * que lee ya refleja los edits anteriores del batch (semántica secuencial,\n * ≡ K dispatches en cola). Devuelve el verdict y, si pasó, los FieldChanges\n * listos para aplicar.\n */\nfunction applyOneEdit(edit: BulkEditEdit, deps: DispatchDeps): EditOutcome {\n const { ctx } = deps;\n const activityId = edit.activityId;\n\n const pipeline = findPipelineForColumn(edit.column);\n if (!pipeline) {\n return {\n verdict: {\n activityId,\n ok: false,\n reason: REJECTION_REASON.NO_PIPELINE_FOR_COLUMN\n },\n changes: null\n };\n }\n\n const activitySnap = ctx.activityReader.getActivity(edit.activityId);\n if (!activitySnap) {\n return {\n verdict: {\n activityId,\n ok: false,\n reason: REJECTION_REASON.ACTIVITY_NOT_FOUND\n },\n changes: null\n };\n }\n\n const editGate = pipeline.canEdit(activitySnap);\n if (!editGate.allowed) {\n return {\n verdict: {\n activityId,\n ok: false,\n reason: editGate.reason ?? REJECTION_REASON.CANNOT_EDIT,\n ...(editGate.alertKey ? { alertKey: editGate.alertKey } : {})\n },\n changes: null\n };\n }\n\n const parsed = pipeline.parseInput(edit.newValue, activitySnap, ctx);\n if (!parsed.ok) {\n return {\n verdict: {\n activityId,\n ok: false,\n reason: parsed.reason ?? REJECTION_REASON.PARSE_ERROR\n },\n changes: null\n };\n }\n\n const oldValue = Reflect.get(activitySnap, edit.column);\n const validation = pipeline.validate(\n activitySnap,\n oldValue as never,\n parsed.value as never,\n ctx\n );\n if (!validation.valid) {\n return {\n verdict: {\n activityId,\n ok: false,\n reason: validation.reason ?? REJECTION_REASON.INVALID,\n ...(validation.notification?.messageKey\n ? { alertKey: validation.notification.messageKey }\n : {})\n },\n changes: null\n };\n }\n\n // Cross-pipeline check (espejo inline-edit 3b): custom_id no puede chocar\n // con el de otra activity. El tracker vive en deps, no en ctx — contrato\n // de pipeline deliberadamente angosto.\n if (edit.column === CUSTOM_ID_COLUMN && parsed.value !== null) {\n const liveActivity = deps.adapter.getActivity(edit.activityId);\n const oldCustomIdRaw = liveActivity ? liveActivity.custom_id : null;\n const oldCustomId =\n typeof oldCustomIdRaw === 'string' ? oldCustomIdRaw : null;\n if (\n deps.customIdTracker.isCustomIdInUse(String(parsed.value), oldCustomId)\n ) {\n return {\n verdict: {\n activityId,\n ok: false,\n reason: REJECTION_REASON.CUSTOM_ID_DUPLICATE\n },\n changes: null\n };\n }\n }\n\n const changes = pipeline.transform(\n activitySnap,\n parsed.value as never,\n ctx,\n parsed.raw\n );\n return { verdict: { activityId, ok: true }, changes };\n}\n\n/**\n * Espejo del paso 6b de inline-edit para batches: el valor VIVO de\n * `custom_id` antes de aplicar el edit (null si el edit no es de custom_id\n * o no había valor previo).\n */\nfunction readLiveCustomId(\n edit: BulkEditEdit,\n deps: DispatchDeps\n): string | null {\n if (edit.column !== CUSTOM_ID_COLUMN) return null;\n const liveActivity = deps.adapter.getActivity(edit.activityId);\n const rawValue = liveActivity ? liveActivity.custom_id : null;\n return typeof rawValue === 'string' ? rawValue : null;\n}\n\n/** Mantiene el CustomIdTracker en sync tras aplicar un edit de custom_id. */\nfunction syncCustomIdTracker(\n edit: BulkEditEdit,\n oldCustomId: string | null,\n deps: DispatchDeps\n): void {\n if (edit.column !== CUSTOM_ID_COLUMN) return;\n const liveActivity = deps.adapter.getActivity(edit.activityId);\n const rawValue = liveActivity ? liveActivity.custom_id : null;\n const newCustomId = typeof rawValue === 'string' ? rawValue : null;\n if (oldCustomId !== newCustomId) {\n deps.customIdTracker.trackCustomIdChange(oldCustomId, newCustomId);\n }\n}\n\n/**\n * Registra el prior PRE-BATCH del post-pass de constraints para un edit\n * ACEPTADO de `constraint_type` / `constraint_date`. First-wins por activity,\n * leído del `beforeSnap` first-wins (ya poblado por `mergeBeforeSnapshots`\n * antes de aplicar el edit): con doble edit de la misma activity en el batch,\n * el valor sembrado por el primer edit es estado intermedio de UN paso de\n * undo, nunca un prior válido.\n */\nfunction recordConstraintPrior(\n priors: Map<string, Date | null>,\n edit: BulkEditEdit,\n beforeSnap: Map<string, EngineActivitySnapshot>\n): void {\n if (!isConstraintEditColumn(edit.column)) return;\n const activityKey = String(edit.activityId);\n if (priors.has(activityKey)) return;\n const preBatchSnapshot = beforeSnap.get(activityKey);\n if (!preBatchSnapshot) return;\n priors.set(activityKey, preBatchSnapshot.constraint_date ?? null);\n}\n\n/** Snapshot first-wins: solo ids que aún no tienen before capturado. */\nfunction mergeBeforeSnapshots(\n beforeSnap: Map<string, EngineActivitySnapshot>,\n ids: Set<string>,\n deps: DispatchDeps\n): void {\n const missing = new Set<string>();\n for (const candidateId of ids) {\n if (!beforeSnap.has(candidateId)) missing.add(candidateId);\n }\n if (missing.size === 0) return;\n for (const [snappedId, snapshot] of snapshotActivities(\n deps.adapter,\n missing\n )) {\n beforeSnap.set(snappedId, snapshot);\n }\n}\n","/**\n * Dispatch — single mutation entry point of the public API: the ROUTER.\n *\n * Maps every DispatchAction kind to its handler in `./handlers/` —\n * exhaustively (`assertNever`: a new kind without a handler fails the\n * build). The 10-step inline-edit protocol lives in\n * `handlers/inline-edit.ts`; the shared post-mutation phases\n * (autoscheduler → unconditional parent bounds → CP → ChangeSet) in\n * `shared/post-mutation.ts` and `shared/change-set.ts`. Canonical order:\n * CURSOR.md §\"Flujo de core.dispatch paso a paso\".\n */\n\nimport {\n dispatchSelectionToggle,\n dispatchSelectionReplace\n} from './selection.js';\nimport { dispatchVisibilitySet } from './visibility.js';\nimport { COLUMN } from '../constants/columns.js';\nimport { assertNever } from '../shared/assert-never.js';\nimport { dispatchInlineEdit } from './handlers/inline-edit.js';\nimport {\n dispatchLink,\n dispatchLinksBatch,\n dispatchInlineEditLinks\n} from './handlers/link.js';\nimport { dispatchActivityCreate } from './handlers/activity-create.js';\nimport { dispatchActivityPaste } from './handlers/activity-paste.js';\nimport { dispatchSirSync } from './handlers/sir-sync.js';\nimport { dispatchActivityDelete } from './handlers/activity-delete.js';\nimport { dispatchActivityMove } from './handlers/activity-move.js';\nimport { dispatchActivityIndent } from './handlers/activity-indent.js';\nimport { dispatchActivityOutdent } from './handlers/activity-outdent.js';\nimport { dispatchActivitySetProgress } from './handlers/set-progress.js';\nimport { dispatchDatesBatch } from './handlers/dates-batch.js';\nimport { dispatchBulkEdit } from './handlers/bulk-edit.js';\n\nimport type {\n DispatchAction,\n DispatchOptions,\n DispatchResult\n} from './types.js';\nimport type { DispatchDeps } from './shared/deps.js';\n\nexport type { DispatchDeps } from './shared/deps.js';\n\n// Re-exported for `ScheduleCore.createActivity` (src/init/scheduleCore.ts),\n// which shares the synchronous create core + ChangeSet builder with the\n// async `activity-create` dispatch path.\nexport {\n createActivityCore,\n buildCreateChangeSet\n} from './handlers/activity-create.js';\nexport type {\n CreateActivityCoreDeps,\n CreateActivityCoreResult\n} from './handlers/activity-create.js';\n\nexport async function dispatch(\n action: DispatchAction,\n options: DispatchOptions,\n deps: DispatchDeps\n): Promise<DispatchResult> {\n if (\n action.kind === 'link-create' ||\n action.kind === 'link-update' ||\n action.kind === 'link-delete'\n ) {\n return dispatchLink(action, options, deps);\n }\n\n if (action.kind === 'links-batch') {\n return dispatchLinksBatch(action, options, deps);\n }\n\n if (action.kind === 'activity-create') {\n return dispatchActivityCreate(action, options, deps);\n }\n\n if (action.kind === 'activity-paste') {\n return dispatchActivityPaste(action, options, deps);\n }\n\n if (action.kind === 'activity-delete') {\n return dispatchActivityDelete(action, options, deps);\n }\n\n if (action.kind === 'activity-move') {\n return dispatchActivityMove(action, options, deps);\n }\n\n if (action.kind === 'activity-indent') {\n return dispatchActivityIndent(action, options, deps);\n }\n\n if (action.kind === 'activity-outdent') {\n return dispatchActivityOutdent(action, options, deps);\n }\n\n if (action.kind === 'activity-set-progress') {\n return dispatchActivitySetProgress(action, options, deps);\n }\n\n // K ediciones de fecha como UNA unidad (multi-drag): pipelines por edit,\n // UNA pasada de post-mutation, UN ChangeSet. Track onAfterTaskDrag F2.2.\n if (action.kind === 'dates-batch') {\n return dispatchDatesBatch(action, options, deps);\n }\n\n // K ediciones de columna arbitraria como UNA unidad (bulk editors /\n // modales): la generalización de dates-batch a las 16 columnas del\n // registry. PLAN_convergencia_wiring §4.1 (F1).\n if (action.kind === 'bulk-edit') {\n return dispatchBulkEdit(action, options, deps);\n }\n\n // Selección por checkbox (2026-06-06) — prop-only, sin autoscheduler ni\n // CP. Handlers en ./selection.ts; reciben los builders privados de este\n // módulo como deps para emitir el ChangeSet con el shape canónico.\n if (action.kind === 'selection-toggle') {\n return dispatchSelectionToggle(action, selectionDeps(deps));\n }\n if (action.kind === 'selection-replace') {\n return dispatchSelectionReplace(action, selectionDeps(deps));\n }\n\n // Visibilidad del view-model (2026-07-04) — mismo contrato prop-only que\n // la selección: set absoluto, diff contra el estado, cero derived passes.\n if (action.kind === 'visibility-set') {\n return dispatchVisibilitySet(action, selectionDeps(deps));\n }\n\n // SIR (A3): sync the pending-SIR set for one activity so the core's freeze\n // bit stays fresh (the front owns the SIR record; the core owns the bit).\n if (action.kind === 'sir-sync') {\n return dispatchSirSync(action, deps);\n }\n\n // Inline edits on `custom_predecessors` / `custom_sucessors` translate to\n // a batch of link operations (parse + diff against current links + apply).\n // They share the canonical link applier with `dispatchLink` — same code\n // path, different entry. See `dispatchInlineEditLinks` below.\n if (\n action.kind === 'inline-edit' &&\n (action.column === COLUMN.CUSTOM_PREDECESSORS ||\n action.column === COLUMN.CUSTOM_SUCESSORS)\n ) {\n return dispatchInlineEditLinks(action, options, deps);\n }\n\n if (action.kind !== 'inline-edit') {\n // Exhaustiveness gate: every DispatchAction kind must have a handler\n // above. A new kind in the union narrows `action` to something other\n // than `never` here and the build breaks — instead of falling through\n // to a runtime throw nobody sees until production.\n return assertNever(\n action,\n `[ScheduleCore] dispatch kind \"${(action as { kind: string }).kind}\" not supported yet`\n );\n }\n\n // The canonical 10-step column-pipeline path lives in\n // ./handlers/inline-edit.ts (pure move, Fase 4).\n return dispatchInlineEdit(action, options, deps);\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Deps mínimas para los handlers de selección (./selection.ts). */\nfunction selectionDeps(deps: DispatchDeps) {\n return { adapter: deps.adapter };\n}\n\n// ---------------------------------------------------------------------------\n// Critical path: handled via `runPostMutation`'s derived passes (step 8),\n// run unconditionally (staleness policy + `options.skipCriticalPath` are the\n// only gates). No per-handler CP call is needed.\n// ---------------------------------------------------------------------------\n","import { durationToDays } from '../../columns/shared/duration.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { lagHoursToDays } from '../../autoscheduler/links/lag-units.js';\nimport type { Activity, Link } from '../../types.js';\nimport type { ChangeSet, OutputUnit } from '../types.js';\n\nexport type { OutputUnit };\n\n// duration and lag share the math today (h/hpd) but are distinct domain concepts\n// calling distinct primitives that diverge in the days→hours input direction.\n// ponytail: kept separate on purpose.\nexport function toPublicDuration(\n hours: number,\n hoursPerDay: number,\n unit: OutputUnit\n): number {\n return unit === 'hours' ? hours : durationToDays(hours, hoursPerDay);\n}\nexport function toPublicLag(\n hours: number,\n hoursPerDay: number,\n unit: OutputUnit\n): number {\n return unit === 'hours' ? hours : lagHoursToDays(hours, hoursPerDay);\n}\nexport function toPublicActivity(\n activity: Activity,\n hoursPerDay: number,\n unit: OutputUnit\n): Activity {\n return unit === 'hours'\n ? activity\n : { ...activity, duration: durationToDays(activity.duration, hoursPerDay) };\n}\nexport function toPublicLink(\n link: Link,\n hoursPerDay: number,\n unit: OutputUnit\n): Link {\n return unit === 'hours'\n ? link\n : { ...link, lag: lagHoursToDays(link.lag, hoursPerDay) };\n}\n\nexport function toPublicChangeSet(\n changeSet: ChangeSet,\n hoursPerDay: number,\n unit: OutputUnit\n): ChangeSet {\n if (unit === 'hours') return changeSet;\n return {\n ...changeSet,\n activities: changeSet.activities.map((entityChange) => ({\n ...entityChange,\n after: entityChange.after\n ? toPublicActivity(entityChange.after, hoursPerDay, unit)\n : entityChange.after,\n fields: convertFieldDiff(\n entityChange.fields,\n COLUMN.DURATION,\n hoursPerDay,\n unit,\n toPublicDuration\n )\n })),\n links: changeSet.links.map((entityChange) => ({\n ...entityChange,\n after: entityChange.after\n ? toPublicLink(entityChange.after, hoursPerDay, unit)\n : entityChange.after,\n fields: convertFieldDiff(\n entityChange.fields,\n 'lag',\n hoursPerDay,\n unit,\n toPublicLag\n )\n }))\n };\n}\n\n/**\n * Converts one named hours field of a `fields` diff via the SAME scalar the\n * `after` uses. Other keys + non-numeric entries pass through. `before`/`after`\n * are `unknown` in EntityChange → narrow with `typeof === 'number'` (NOT a cast:\n * `== null` does not narrow unknown to number).\n */\nfunction convertFieldDiff(\n fields: Record<string, { before: unknown; after: unknown }> | undefined,\n field: 'duration' | 'lag',\n hoursPerDay: number,\n unit: OutputUnit,\n convert: (hours: number, hoursPerDay: number, unit: OutputUnit) => number\n): Record<string, { before: unknown; after: unknown }> | undefined {\n if (!fields || !(field in fields)) return fields;\n const entry = fields[field];\n if (!entry) return fields;\n return {\n ...fields,\n [field]: {\n before:\n typeof entry.before === 'number'\n ? convert(entry.before, hoursPerDay, unit)\n : entry.before,\n after:\n typeof entry.after === 'number'\n ? convert(entry.after, hoursPerDay, unit)\n : entry.after\n }\n };\n}\n","/**\n * Free-function read API — extracted from ScheduleCore.\n *\n * Each function takes `state` (and optionally `hoursPerDay`) explicitly so\n * the ScheduleCore facade can keep its `assertReady()` guard and delegate\n * in one line. No side effects; no scheduler calls.\n *\n * Unit contract: all exported getters accept an optional `unit` parameter\n * (default `'days'`). Passing `'hours'` returns the engine-native working\n * hours directly — the DHTMLX bridge uses this to skip the round-trip.\n */\n\nimport type { ActivityReader } from '../internal/state/roles.js';\nimport { snapshotToActivity } from '../dispatch/conversion.js';\nimport { snapshotToLink } from '../dispatch/conversion.js';\nimport { collectSelectedIds } from '../dispatch/selection.js';\nimport {\n ROOT_PARENT_ID,\n isRootParent\n} from '../internal/hierarchy/root-parent.js';\nimport type { Activity, ActivityId, Link, LinkId } from '../types.js';\nimport {\n toPublicActivity,\n toPublicLink,\n type OutputUnit\n} from '../dispatch/shared/public-units.js';\n\n// ─── Activities ─────────────────────────────────────────────────────────────\n\nexport function readActivity(\n state: ActivityReader,\n hoursPerDay: number,\n id: ActivityId,\n unit: OutputUnit = 'days'\n): Readonly<Activity> | null {\n const snap = state.getActivity(id);\n return snap\n ? toPublicActivity(snapshotToActivity(snap), hoursPerDay, unit)\n : null;\n}\n\n/**\n * Materializes one `Activity` per alive row. O(N) allocation.\n * AVOID per-frame / per-dispatch consumers — prefer `readAllIds` or\n * `forEachActivityId` when only the id set or a fast field read is needed.\n */\nexport function readAllActivities(\n state: ActivityReader,\n hoursPerDay: number,\n unit: OutputUnit = 'days'\n): ReadonlyArray<Readonly<Activity>> {\n return state\n .getAllActivities()\n .map((snap) =>\n toPublicActivity(snapshotToActivity(snap), hoursPerDay, unit)\n );\n}\n\n/**\n * Read-only snapshot of every alive activity id. Cached internally;\n * invalidated automatically on add / remove.\n */\nexport function readAllIds(state: ActivityReader): readonly string[] {\n return state.getAllIds().map(String);\n}\n\n/**\n * Iterates every alive activity id without materializing intermediate\n * arrays or `Activity` objects.\n */\nexport function forEachActivityId(\n state: ActivityReader,\n visit: (id: string) => void\n): void {\n state.forEachActivity((_activity, id) => visit(id));\n}\n\n/**\n * Read-only list of direct children of `parentId`, sorted by\n * `correlative_id` (canonical visual order). Use `'0'` for root.\n */\nexport function readChildren(\n state: ActivityReader,\n hoursPerDay: number,\n parentId: ActivityId | '0',\n unit: OutputUnit = 'days'\n): ReadonlyArray<Readonly<Activity>> {\n // The parent→children index intentionally skips root rows, so the '0'\n // sentinel is answered by the same parent-id scan `readChildrenIds`\n // uses (TODO.md #11 — previously returned [] against API.md's example).\n const childIds =\n parentId === ROOT_PARENT_ID\n ? readChildrenIds(state, ROOT_PARENT_ID)\n : state.getChildren(parentId);\n const out: Activity[] = [];\n for (const id of childIds) {\n const snap = state.getActivity(id);\n if (snap)\n out.push(toPublicActivity(snapshotToActivity(snap), hoursPerDay, unit));\n }\n out.sort(\n (a, b) =>\n Number((a as unknown as Record<string, number>).correlative_id ?? 0) -\n Number((b as unknown as Record<string, number>).correlative_id ?? 0)\n );\n return out;\n}\n\n/**\n * Direct children ids only — an O(k) copy of the parent→children\n * index, skipping the Activity materialization and `correlative_id`\n * sort that `readChildren` pays. Index order (NOT sorted).\n */\nexport function readChildrenIds(\n state: ActivityReader,\n parentId: ActivityId | '0'\n): ReadonlyArray<ActivityId> {\n const key = parentId;\n if (key === ROOT_PARENT_ID) {\n const roots: ActivityId[] = [];\n state.forEachActivity((activity, id) => {\n // String(...) normalizes the engine's string|number id to the public\n // string ActivityId (state ids are hydrated as strings).\n if (isRootParent(activity.parent)) roots.push(id);\n });\n return roots;\n }\n return [...state.getChildren(key)].map(String);\n}\n\n/**\n * Ids of the currently selected activities (checkbox selection).\n * O(N) scan, no materialization.\n */\nexport function readSelectedActivityIds(state: ActivityReader): string[] {\n return collectSelectedIds(state);\n}\n\n/**\n * True if `parentId` has at least one direct child. Cheaper than\n * `readChildren(parentId).length > 0` because it skips materialization.\n */\nexport function readHasChild(\n state: ActivityReader,\n parentId: ActivityId | '0'\n): boolean {\n return state.getChildren(parentId).length > 0;\n}\n\n// ─── Links ──────────────────────────────────────────────────────────────────\n\nexport function readLink(\n state: ActivityReader,\n hoursPerDay: number,\n id: LinkId,\n unit: OutputUnit = 'days'\n): Readonly<Link> | null {\n const l = state.getLink(id);\n return l ? toPublicLink(snapshotToLink(l), hoursPerDay, unit) : null;\n}\n\nexport function readAllLinks(\n state: ActivityReader,\n hoursPerDay: number,\n unit: OutputUnit = 'days'\n): ReadonlyArray<Readonly<Link>> {\n return state\n .getAllLinks()\n .map((l) => toPublicLink(snapshotToLink(l), hoursPerDay, unit));\n}\n","/**\n * Recompute the `ponderator` (weight) of a parent's DIRECT children,\n * redistributing 100 among them according to the project criterion taken\n * from each child's ACTIVE baseline.\n *\n * Faithful port of `calculatePonderators` in\n * `react_client/src/views/ganttContainer/gantt/gantt.helper.js:468-600`\n * (+ `getDurationRecursively` at :438-462). Baseline-only, NO fallback to\n * real values — verified against production 2026-06-04 (see memory\n * `project_ponderator_baseline_fix` and BASELINES.md §6).\n *\n * Unlike the hh/cost cascades (which aggregate a parent FROM its children,\n * walking UP), this redistributes weight ACROSS one parent's children. The\n * driver that walks the ancestor chain (DURATION is recursive, see below)\n * lives separately — this function handles a single parent.\n *\n * Formula (per criterion):\n * peso(child) = active baseline value of the criterion\n * DURATION: project → Σ baseline.duration of baselined descendants\n * (getDurationRecursively); leaf → baseline.duration;\n * milestone → 0\n * COST: baseline.cost (own, not recursive)\n * HH: baseline.hh_work (own, not recursive)\n * denominator = Σ peso(child)\n * relationValue = denominator ? 100 / denominator : 0\n * ponderator(child) = relationValue × peso(child)\n *\n * `hoursPerDay` cancels: legacy multiplies DURATION pesos by hoursPerDay\n * (`transformDaysToHours`), but since every DURATION term shares that single\n * sector constant it cancels in the ratio — so raw baseline DAYS yield an\n * identical result. COST/HH never convert. See BASELINES.md §7.\n *\n * Assignment branches (faithful to the legacy second pass):\n * - active baseline found → ponderator = relationValue × peso\n * - no baseline_points / empty → ponderator = 0\n * - points but none active → ponderator LEFT UNTOUCHED\n *\n * DELIBERATE DIVERGENCES (documented, not legacy bugs we replicate):\n * 1. The legacy caches the recursive sum on `activity.sumOfDurationRecursively`\n * (a backend-serialized field). We keep it LOCAL — writing it risks\n * corrupting the save payload. Revisit when wiring the save flow (Fase 3).\n * 2. For a project child with an active baseline but ZERO baselined\n * descendants, the legacy reuses the stale/backend `sumOfDurationRecursively`\n * (computed from CURRENT durations, different semantics → possibly NaN).\n * We compute fresh: peso = 0 → ponderator = 0 (saner, deterministic).\n */\n\nimport { getActiveBaseline } from '../shared/get-active-baseline.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type { ActivityCreter, ActivityId } from '../../types.js';\nimport type {\n ActivityReader,\n ActivityWriter\n} from '../../internal/state/roles.js';\n\n/** Alias of the canonical {@link ActivityCreter} (project criterion). */\nexport type PonderatorCriterion = ActivityCreter;\n\nexport function recomputePonderatorsForParent(\n parentId: ActivityId | '0' | null | undefined,\n criterion: PonderatorCriterion,\n adapter: ActivityWriter\n): void {\n if (!parentId || parentId === '0') return;\n const childIds = adapter.getChildren(parentId as ActivityId);\n if (childIds.length === 0) return;\n\n // ── Pass 1: denominator (memoize each child's peso) ──────────────────\n const pesoById = new Map<string, number>();\n let denominator = 0;\n for (const childId of childIds) {\n const peso = criterionValue(String(childId), criterion, adapter);\n pesoById.set(String(childId), peso);\n denominator += peso;\n }\n const relationValue = denominator ? 100 / denominator : 0;\n\n // ── Pass 2: assign ponderators (faithful branches) ───────────────────\n for (const childId of childIds) {\n const child = adapter.getActivity(childId);\n if (!child) continue;\n const points = (child as { baseline_points?: unknown }).baseline_points;\n const active = getActiveBaseline(child as { baseline_points?: unknown });\n if (active) {\n const peso = pesoById.get(String(childId)) ?? 0;\n adapter.setActivityField(\n childId,\n COLUMN.PONDERATOR,\n relationValue * peso\n );\n } else if (!Array.isArray(points) || points.length === 0) {\n adapter.setActivityField(childId, COLUMN.PONDERATOR, 0);\n }\n // else: has points but none active → ponderator left untouched\n }\n}\n\n/** Criterion value of a single direct child (0 if no active baseline). */\nfunction criterionValue(\n childId: ActivityId,\n criterion: PonderatorCriterion,\n adapter: ActivityReader\n): number {\n const child = adapter.getActivity(childId);\n if (!child) return 0;\n const active = getActiveBaseline(child as { baseline_points?: unknown });\n if (!active) return 0;\n\n if (criterion === 'COST') return toNumber(active.cost);\n if (criterion === 'HH') return toNumber(active.hh_work);\n\n // DURATION\n const type = (child as { type?: string }).type;\n if (type === 'project')\n return sumRecursiveBaselineDurationDays(childId, adapter);\n if (type === 'milestone') return 0;\n return toNumber(active.duration);\n}\n\n/**\n * Σ baseline duration (in DAYS) of all baselined, non-milestone descendants.\n * Faithful port of `getDurationRecursively` — recurses on project children,\n * collects leaf baseline durations, only counts descendants with an active\n * baseline. The hoursPerDay factor is omitted (cancels in the ratio).\n */\nfunction sumRecursiveBaselineDurationDays(\n activityId: ActivityId,\n adapter: ActivityReader\n): number {\n let sum = 0;\n for (const childId of adapter.getChildren(activityId)) {\n const child = adapter.getActivity(childId);\n if (!child) continue;\n const active = getActiveBaseline(child as { baseline_points?: unknown });\n if (!active) continue;\n const type = (child as { type?: string }).type;\n if (type === 'project') {\n sum += sumRecursiveBaselineDurationDays(String(childId), adapter);\n } else if (type !== 'milestone') {\n sum += toNumber(active.duration);\n }\n }\n return sum;\n}\n\n/** Parse a possibly-string numeric baseline field; 0 if not finite. */\nfunction toNumber(v: unknown): number {\n const n = typeof v === 'string' ? parseFloat(v) : (v as number);\n return typeof n === 'number' && Number.isFinite(n) ? n : 0;\n}\n","/**\n * Recompute the `ponderator` of EVERY activity in the schedule, in bulk.\n *\n * Faithful port of `goCalculatePonderators` in\n * `react_client/src/views/ganttContainer/gantt/index.js:2008-2038` (the\n * ponderator part — the progress rollup and save are separate concerns the\n * caller wires). Two passes, mirroring the legacy:\n * 1. Zero EVERY activity's ponderator.\n * 2. For each parent (activity with children), redistribute 100 among its\n * children via `recomputePonderatorsForParent` (baseline-only).\n *\n * IMPORTANT — this is the ONLY ponderator recompute the schedule performs.\n * Verified against the legacy (2026-06-04): the masterplan does NOT recompute\n * ponderators on add / delete / move / inline-edit. `goCalculatePonderators`\n * runs ONLY on two events (see index.js:395/443/625):\n * - the project criterion (`activity_creter`) changed\n * (`sectorObject.update_ponderators_masterplan`), or\n * - a baseline was created / saved.\n * Both events otherwise reload the schedule. So there is intentionally NO\n * per-mutation cascade and NO dispatch hook — adding one would diverge from\n * production (a baselined child's siblings stay as the backend computed them\n * until the next of those two events). See\n * [[PONDERATOR_BASELINE_MIGRATION_PLAN]].\n *\n * Order-independent: a project child's weight derives from descendant\n * BASELINES (`getDurationRecursively`), never from other ponderators, so the\n * order parents are visited in does not affect the result.\n */\n\nimport { recomputePonderatorsForParent } from './recompute-ponderator-for-parent.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type { ActivityCreter } from '../../types.js';\nimport type { ActivityWriter } from '../../internal/state/roles.js';\n\nexport function recomputeAllPonderators(\n criterion: ActivityCreter,\n adapter: ActivityWriter\n): void {\n // Pass 1: zero every ponderator (legacy `ac.ponderator = 0` for all).\n adapter.forEachActivity((_a, id) => {\n adapter.setActivityField(id, COLUMN.PONDERATOR, 0);\n });\n\n // Pass 2: redistribute within each parent (legacy iterates withChildsTasks).\n adapter.forEachActivity((_a, id) => {\n if (adapter.getChildren(id).length > 0) {\n recomputePonderatorsForParent(String(id), criterion, adapter);\n }\n });\n}\n","/**\n * Recompute the weighted-progress rollup of EVERY parent in the schedule,\n * bottom-up. `parent.progress = Σ(child.progress × child.ponderator / 100)`.\n *\n * Faithful port of legacy `check_progress` (editing-flow.js:154-197) — the\n * second half of `goCalculatePonderators`. After a ponderator recompute\n * (baseline create/save, see `recomputeAllPonderators`), parent progress is\n * stale w.r.t. the new weights; this repropagates it.\n *\n * PROGRESS-ONLY by design: unlike the dispatch post-processor\n * `recomputeParentFromChildren` (post-processors/parent-bounds.ts), this does NOT\n * touch parent start/end/duration — only `progress` and the milestone mirror\n * `for_disable_milestone_duration`. That keeps it testable in isolation\n * (no calendars/dates needed) and matches what `check_progress` actually did.\n *\n * Order is load-bearing (unlike ponderators, which are order-independent): a\n * grandparent's rollup consumes its children-parents' ALREADY rolled-up\n * progress, so parents are visited deepest-first.\n *\n * Parity rules:\n * - child with no/zero ponderator does not contribute;\n * - a parent whose children contribute nothing keeps its progress frozen;\n * - `progress` is kept a NUMBER but rounded per level to 2 decimals\n * (`roundProgressPerLevel`) — legacy `check_progress` recurses on\n * `toFixed(2)`, so each ancestor consumes its children's 2-decimal value\n * (MORNING_QUEUE.md — JUN-02).\n */\n\n// Engine ActivityId (string | number): this cascade walks `ScheduleState`\n// (engine seam), whose ids carry the engine type.\nimport type { ActivityId } from '../../autoscheduler/types.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type {\n ActivityReader,\n ActivityWriter\n} from '../../internal/state/roles.js';\nimport {\n computeWeightedProgressRollup,\n roundProgressPerLevel,\n type WeightedChild\n} from '../../columns/shared/weighted-progress.js';\n\nexport function recomputeAllProgressRollup(adapter: ActivityWriter): void {\n for (const parentId of parentsDeepestFirst(adapter)) {\n rollupParent(parentId, adapter);\n }\n}\n\n/** All activity ids that have at least one child, deepest-first. */\nfunction parentsDeepestFirst(adapter: ActivityReader): ActivityId[] {\n const parents = new Set<ActivityId>();\n adapter.forEachActivity((_activity, id) => {\n if (adapter.getChildren(id).length > 0) parents.add(id);\n });\n const depthById = new Map<ActivityId, number>();\n for (const id of parents) depthById.set(id, depthOf(id, adapter));\n return [...parents].sort(\n (a, b) => (depthById.get(b) ?? 0) - (depthById.get(a) ?? 0)\n );\n}\n\nfunction depthOf(id: ActivityId, adapter: ActivityReader): number {\n let depth = 0;\n let current: ActivityId | 0 = id;\n while (current && current !== '0') {\n if (!adapter.getActivity(current)) break;\n depth += 1;\n current = adapter.getParentId(current);\n }\n return depth;\n}\n\nfunction rollupParent(parentId: ActivityId, adapter: ActivityWriter): void {\n const childIds = adapter.getChildren(parentId);\n if (childIds.length === 0) return;\n\n const children: WeightedChild[] = [];\n for (const childId of childIds) {\n const child = adapter.getActivity(childId);\n if (!child) continue;\n children.push({\n progress: Number(child.progress ?? 0),\n ponderator: Number(child.ponderator ?? 0)\n });\n }\n const rollup = computeWeightedProgressRollup(children);\n\n // Mirror legacy check_progress: stamps for_disable_milestone_duration from\n // the parent's CURRENT duration (does not recompute it here).\n const parent = adapter.getActivity(parentId);\n const currentDuration = parent?.duration;\n if (currentDuration !== undefined) {\n adapter.setActivityField(\n parentId,\n 'for_disable_milestone_duration',\n currentDuration\n );\n }\n\n // Frozen when nothing contributes (legacy leaves parent.progress as-is).\n // Round per level (legacy `check_progress` toFixed(2) recursion) so the\n // grandparent reads this 2-decimal value, not full precision — the walk is\n // deepest-first (MORNING_QUEUE.md — JUN-02).\n if (rollup !== null) {\n adapter.setActivityField(\n parentId,\n COLUMN.PROGRESS,\n roundProgressPerLevel(rollup)\n );\n }\n}\n","import { parseBackendDate } from '../../shared/backend-date.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type {\n ActivityWriter,\n CalendarOps\n} from '../../internal/state/roles.js';\nimport { setActivityFieldDynamic } from '../../internal/state/dynamic-writes.js';\nimport type { BaselinePoint } from '../../types.js';\nimport {\n expectedProgressFromBaseline,\n type CalendarLike\n} from '../shared/expected-progress-formula.js';\n\nconst isProject = (a: Record<string, unknown>): boolean => a.type === 'project';\n\nconst activeBaselineOf = (a: Record<string, unknown>): BaselinePoint | null => {\n const pts = a.baseline_points;\n if (!Array.isArray(pts)) return null;\n return (\n (pts as BaselinePoint[]).find((p) => p?.sectorbaselineversion?.active) ??\n null\n );\n};\n\nexport interface ExpectedProgressAdapter {\n getChildrenIds(parentId: string | 0): readonly string[];\n getActivity(id: string): Record<string, unknown> | null;\n setActivityField(id: string, field: string, value: unknown): void;\n /** Resolve a baseline calendar by its engine id (`${baseCalendarId}-base`). */\n getBaseCalendar(engineId: string): CalendarLike | null;\n}\n\nconst leafExpected = (\n a: Record<string, unknown>,\n now: Date,\n adapter: ExpectedProgressAdapter,\n defaultBaseCalendarId: string | null\n): number => {\n const base = activeBaselineOf(a);\n if (!base) return 0;\n // Prefer the point's own base calendar; fall back to the project's default\n // base calendar when the point carries none (parity with legacy\n // `updateExpectedGlobal`, which used `gantt.defaultBaseCalendar` as fallback).\n // Only 0 when neither resolves. `defaultBaseCalendarId` is already the `-base`\n // engine id (resolved once per pass by the caller).\n const cal =\n (base.baseCalendarId != null\n ? adapter.getBaseCalendar(`${base.baseCalendarId}-base`)\n : null) ??\n (defaultBaseCalendarId\n ? adapter.getBaseCalendar(defaultBaseCalendarId)\n : null);\n if (!cal) return 0;\n // UTC-strict parse (the core forbids `new Date(string)` local parsing): the\n // baseline point dates are `\"YYYY/MM/DD H:MM\"` backend strings. Parsing them\n // local-tz shifted the instant vs the UTC `now`, inflating the working-time\n // ratio (e.g. 26.67 vs prod 25 — dF counted 30h not 32h).\n return expectedProgressFromBaseline(\n parseBackendDate(String(base.start_date)),\n parseBackendDate(String(base.end_date)),\n now,\n cal\n );\n};\n\n/**\n * Walks the tree from `rootIds`, writing `expected_progress_base` on every\n * activity: leaves from their baseline calendar, parents as\n * `Σ(childBase × child.ponderator) / 100` (faithful port of engine.ts\n * aggregateHierarchy). Returns the ids whose value changed.\n */\nexport function computeExpectedProgress(\n rootIds: readonly string[],\n now: Date,\n adapter: ExpectedProgressAdapter,\n defaultBaseCalendarId: string | null = null\n): string[] {\n const changed: string[] = [];\n\n const writeIfChanged = (id: string, value: number) => {\n const a = adapter.getActivity(id);\n if (!a) return;\n if (a.expected_progress_base !== value) {\n adapter.setActivityField(id, COLUMN.EXPECTED_PROGRESS_BASE, value);\n changed.push(id);\n }\n };\n\n const visit = (id: string): number => {\n const a = adapter.getActivity(id);\n if (!a) return 0;\n if (!isProject(a)) {\n const v = leafExpected(a, now, adapter, defaultBaseCalendarId);\n writeIfChanged(id, v);\n return v;\n }\n let acc = 0;\n for (const childId of adapter.getChildrenIds(id)) {\n const childBase = visit(childId);\n const child = adapter.getActivity(childId);\n const weight =\n typeof child?.ponderator === 'number'\n ? (child.ponderator as number)\n : 0;\n acc += childBase * weight;\n }\n const v = acc / 100;\n writeIfChanged(id, v);\n return v;\n };\n\n for (const id of rootIds) visit(id);\n return changed;\n}\n\n/**\n * Core of `expected_progress_base`: build the adapter + root set and run\n * `computeExpectedProgress`, returning the changed ids. No readiness guard — the\n * constructor calls it at load (before `ready` resolves).\n */\nexport function runExpectedProgressBase(\n state: ActivityWriter & CalendarOps,\n now: Date,\n defaultBaseCalendarId: string | null = null\n): string[] {\n const adapter: ExpectedProgressAdapter = {\n getChildrenIds: (parentId) =>\n state.getChildren(String(parentId)).map((childId) => String(childId)),\n getActivity: (id) =>\n state.getActivity(id) as unknown as Record<string, unknown> | null,\n setActivityField: (id, field, value) =>\n setActivityFieldDynamic(state, id, field, value),\n getBaseCalendar: (engineId) => state.calendarReader.getCalendar(engineId)\n };\n const rootIds: string[] = [];\n state.forEachActivity((activity, id) => {\n if (\n activity.parent === 0 ||\n activity.parent === '0' ||\n activity.parent == null\n )\n rootIds.push(id);\n });\n return computeExpectedProgress(rootIds, now, adapter, defaultBaseCalendarId);\n}\n","import type { BaselinePoint } from '../types.js';\n\n/**\n * Surface this function needs from ScheduleState — kept structural so the\n * function is unit-testable with a plain in-memory adapter.\n */\nexport interface BaselineApplyAdapter {\n forEachActivity(\n visit: (a: Record<string, unknown>, id: string) => void\n ): void;\n getActivity(id: string): Record<string, unknown> | null;\n setActivityField(id: string, field: string, value: unknown): void;\n}\n\n/**\n * Overlay baseline points onto activities, matching `point.activityId`\n * (backend DB id) against `activity.proplannerId`. Writes the full group of\n * points (all versions) onto `baseline_points`; the active one is selected\n * downstream by `getActiveBaseline`. Activities absent from the new set get\n * `baseline_points` reset to `[]`. Returns the ids of activities whose\n * `baseline_points` changed (so the caller can repaint just those).\n */\nexport function applyBaselinePoints(\n adapter: BaselineApplyAdapter,\n points: readonly BaselinePoint[]\n): string[] {\n // proplannerId -> core activity id\n const idByProplanner = new Map<number, string>();\n adapter.forEachActivity((a, id) => {\n const pid = (a as Record<string, unknown>).proplannerId;\n if (typeof pid === 'number') idByProplanner.set(pid, id);\n });\n\n // Group incoming points by the core activity id they target.\n const grouped = new Map<string, BaselinePoint[]>();\n for (const p of points) {\n const activityId = (p as Record<string, unknown>).activityId;\n if (typeof activityId !== 'number') continue;\n const coreId = idByProplanner.get(activityId);\n if (coreId === undefined) continue;\n const arr = grouped.get(coreId);\n if (arr) arr.push(p);\n else grouped.set(coreId, [p]);\n }\n\n const changed: string[] = [];\n\n // Apply new groups.\n for (const [coreId, group] of grouped) {\n adapter.setActivityField(coreId, 'baseline_points', group);\n changed.push(coreId);\n }\n\n // Reset activities that had points but are no longer in the set.\n adapter.forEachActivity((a, id) => {\n if (grouped.has(id)) return;\n const existing = (a as Record<string, unknown>).baseline_points;\n if (Array.isArray(existing) && existing.length > 0) {\n adapter.setActivityField(id, 'baseline_points', []);\n changed.push(id);\n }\n });\n\n return changed;\n}\n","import type { BaselinePoint } from '../../types.js';\nimport { START_BASE } from './constants.js';\n\n/** Map the active baseline point to the `start_base` field fragment. */\nexport const startBaseFromActiveBaseline = (\n active: BaselinePoint\n): { [START_BASE]: BaselinePoint['start_date'] } => ({\n [START_BASE]: active.start_date\n});\n","import type { BaselinePoint } from '../../types.js';\nimport { END_BASE } from './constants.js';\n\n/** Map the active baseline point to the `end_base` field fragment. */\nexport const endBaseFromActiveBaseline = (\n active: BaselinePoint\n): { [END_BASE]: BaselinePoint['end_date'] } => ({\n [END_BASE]: active.end_date\n});\n","import type { BaselinePoint } from '../../types.js';\nimport { DURATION_BASE } from './constants.js';\n\n/** Map the active baseline point to the `duration_base` field fragment. */\nexport const durationBaseFromActiveBaseline = (\n active: BaselinePoint\n): { [DURATION_BASE]: BaselinePoint['duration'] } => ({\n [DURATION_BASE]: active.duration\n});\n","import type { BaselinePoint } from '../../types.js';\nimport { COST_BASE } from './constants.js';\n\n/** Map the active baseline point to the `cost_base` field fragment. */\nexport const costBaseFromActiveBaseline = (\n active: BaselinePoint\n): { [COST_BASE]: BaselinePoint['cost'] } => ({\n [COST_BASE]: active.cost\n});\n","import type { BaselinePoint } from '../../types.js';\nimport { WORK_BASE } from './constants.js';\n\n/** Map the active baseline point to the `work_base` field fragment. */\nexport const workBaseFromActiveBaseline = (\n active: BaselinePoint\n): { [WORK_BASE]: BaselinePoint['hh_work'] } => ({\n [WORK_BASE]: active.hh_work\n});\n","// src/baselines/baseline-snapshot.ts\nimport type { ActivityWriter } from '../internal/state/roles.js';\nimport { setActivityFieldDynamic } from '../internal/state/dynamic-writes.js';\nimport { getActiveBaseline } from '../propagations/shared/get-active-baseline.js';\nimport { startBaseFromActiveBaseline } from '../columns/start-base/from-active-baseline.js';\nimport { endBaseFromActiveBaseline } from '../columns/end-base/from-active-baseline.js';\nimport { durationBaseFromActiveBaseline } from '../columns/duration-base/from-active-baseline.js';\nimport { costBaseFromActiveBaseline } from '../columns/cost-base/from-active-baseline.js';\nimport { workBaseFromActiveBaseline } from '../columns/work-base/from-active-baseline.js';\n\n/**\n * Snapshot baseline columns (start_base/end_base/duration_base/cost_base/\n * work_base): mirror the ACTIVE baseline point's raw fields onto the activity.\n *\n * Cross-column orchestrator: walks activities, resolves the active baseline\n * point, and composes each column's own `*FromActiveBaseline` mapping. The\n * per-field mapping (which point field → which `*_base` key) lives in each\n * column module — column-owns-everything.\n */\nexport function emitBaselineSnapshotColumns(state: ActivityWriter): string[] {\n const changed: string[] = [];\n state.forEachActivity((activity, id) => {\n const active = getActiveBaseline(activity);\n if (!active) return;\n const baseFields = {\n ...startBaseFromActiveBaseline(active),\n ...endBaseFromActiveBaseline(active),\n ...durationBaseFromActiveBaseline(active),\n ...costBaseFromActiveBaseline(active),\n ...workBaseFromActiveBaseline(active)\n };\n for (const [column, value] of Object.entries(baseFields)) {\n setActivityFieldDynamic(state, id, column, value);\n }\n changed.push(id);\n });\n return changed;\n}\n","import type { ActivityWriter, CalendarOps } from '../internal/state/roles.js';\nimport type { BaselinePoint } from '../types.js';\nimport { runExpectedProgressBase } from '../columns/expected-progress-base/compute.js';\nimport { emitRealCost } from '../propagations/upward/real-cost.js';\nimport {\n applyBaselinePoints,\n type BaselineApplyAdapter\n} from './apply-baseline-points.js';\nimport { emitBaselineSnapshotColumns } from './baseline-snapshot.js';\n\n/**\n * The full baseline overlay: attach the points, then derive everything that\n * hangs off the ACTIVE point. Single sequence shared by load\n * (`initialize-core`) and any runtime re-apply (`ScheduleCore.applyBaselines`)\n * so the two never drift.\n *\n * Order matches the verified load sequence:\n * 1. attach points (by `proplannerId`, replaces the full set)\n * 2. `expected_progress_base` (leaf working-time ratio vs base calendar + `now`,\n * cascaded to parents) — skipped when `now` is null\n * 3. the 5 snapshot columns (`start_base`/`end_base`/`duration_base`/\n * `cost_base`/`work_base`) mirrored from the active point\n * 4. `real_cost` (earned cost) from progress × active baseline cost\n *\n * Deliberately does NOT recompute `ponderator`: the backend ships it at baseline\n * save and renders it verbatim; recomputing here diverges (float precision +\n * edge gaps). See `initialize-core` baseline block.\n *\n * Returns the union of activity ids whose fields changed (for a prop-only\n * ChangeSet / surgical repaint).\n */\nexport function applyBaselineOverlay(\n state: ActivityWriter & CalendarOps,\n points: readonly BaselinePoint[],\n now: Date | null,\n defaultBaseCalendarId: string | null = null\n): string[] {\n if (points.length === 0) return [];\n const changed = new Set<string>();\n\n // boundary cast: ScheduleState ids are hydrated as strings; only the engine\n // type widens them to string|number, so the string-id adapter contract holds.\n for (const id of applyBaselinePoints(\n state as unknown as BaselineApplyAdapter,\n points\n )) {\n changed.add(id);\n }\n if (now) {\n for (const id of runExpectedProgressBase(state, now, defaultBaseCalendarId))\n changed.add(id);\n }\n for (const id of emitBaselineSnapshotColumns(state)) changed.add(id);\n for (const id of emitRealCost(state)) changed.add(id);\n\n return [...changed];\n}\n","/**\n * Free-function recompute API — extracted from ScheduleCore.\n *\n * Each function takes `state` and `hoursPerDay` explicitly so the\n * ScheduleCore facade can keep its `assertReady()` guard and delegate in\n * one line. The module-level helpers `readPonderator` / `readProgress`\n * live here as non-exported utilities (moved from scheduleCore.ts).\n */\n\nimport type {\n ActivityReader,\n ActivityWriter,\n CalendarOps\n} from '../internal/state/roles.js';\nimport { snapshotToActivity } from '../dispatch/conversion.js';\nimport { toPublicActivity } from '../dispatch/shared/public-units.js';\nimport { recomputeAllPonderators as runAllPonderators } from '../propagations/downward/recompute-all-ponderators.js';\nimport { recomputeAllProgressRollup as runAllProgressRollup } from '../propagations/upward/progress-rollup.js';\nimport { applyBaselineOverlay } from '../baselines/apply-baseline-overlay.js';\nimport { applyStatusPass } from '../columns/status/compute.js';\nimport type {\n Activity,\n ActivityCreter,\n BaselinePoint,\n StatusCriteria\n} from '../types.js';\n\n// ─── Private helpers ─────────────────────────────────────────────────────────\n\n/** Reads an activity snapshot's `ponderator` as a finite number (0 default). */\nfunction readPonderator(a: unknown): number {\n const v = (a as Record<string, unknown>).ponderator;\n return typeof v === 'number' && Number.isFinite(v) ? v : 0;\n}\n\nfunction readProgress(a: unknown): number {\n const v = (a as Record<string, unknown>).progress;\n return typeof v === 'number' && Number.isFinite(v) ? v : 0;\n}\n\n// ─── Public free functions ───────────────────────────────────────────────────\n\n/**\n * Whole-tree ponderator recompute. Zeroes every ponderator, then\n * redistributes 100 within each parent from its children's ACTIVE\n * baselines. Returns the activities whose `ponderator` actually changed.\n */\nexport function recomputeAllPonderators(\n state: ActivityWriter,\n hoursPerDay: number,\n criterion: ActivityCreter\n): ReadonlyArray<Readonly<Activity>> {\n const before = new Map<string, number>();\n state.forEachActivity((a, id) => {\n before.set(id, readPonderator(a));\n });\n\n runAllPonderators(criterion, state);\n\n const changed: Activity[] = [];\n state.forEachActivity((a, id) => {\n if (readPonderator(a) !== (before.get(id) ?? 0)) {\n changed.push(\n toPublicActivity(snapshotToActivity(a), hoursPerDay, 'days')\n );\n }\n });\n return changed;\n}\n\n/**\n * Recompute the weighted-progress rollup of every parent, bottom-up.\n * Returns the activities whose `progress` actually changed.\n */\nexport function recomputeAllProgressRollup(\n state: ActivityWriter,\n hoursPerDay: number\n): ReadonlyArray<Readonly<Activity>> {\n const before = new Map<string, number>();\n state.forEachActivity((a, id) => {\n before.set(id, readProgress(a));\n });\n\n runAllProgressRollup(state);\n\n const changed: Activity[] = [];\n state.forEachActivity((a, id) => {\n if (readProgress(a) !== (before.get(id) ?? 0)) {\n changed.push(\n toPublicActivity(snapshotToActivity(a), hoursPerDay, 'days')\n );\n }\n });\n return changed;\n}\n\n/**\n * Apply/refresh baselines on the live activities: attach the points (by\n * `proplannerId`, replacing the full set) and derive everything that hangs off\n * the active point — `expected_progress_base`, the 5 snapshot columns, and\n * `real_cost`. Same sequence as the load (shared via `applyBaselineOverlay`).\n * `now` (END-OF-LOCAL-DAY) drives `expected_progress_base`; null skips it.\n * Returns the activities whose fields changed, for a prop-only repaint.\n */\nexport function applyBaselines(\n state: ActivityReader & ActivityWriter & CalendarOps,\n hoursPerDay: number,\n points: readonly BaselinePoint[],\n now: Date | null,\n defaultBaseCalendarId: string | null = null\n): ReadonlyArray<Readonly<Activity>> {\n const changedIds = applyBaselineOverlay(\n state,\n points,\n now,\n defaultBaseCalendarId\n );\n const changed: Activity[] = [];\n for (const id of changedIds) {\n const snap = state.getActivity(id);\n if (snap)\n changed.push(\n toPublicActivity(snapshotToActivity(snap), hoursPerDay, 'days')\n );\n }\n return changed;\n}\n\n/**\n * Recompute the `status` semaphore of every activity against `criteria`\n * (`'Baseline'` → `expected_progress_base`, `'Actual'` → `expected_progress`).\n * Reads the already-computed expected values; run AFTER the expected passes.\n * Returns the activities whose `status` changed, for a prop-only repaint.\n */\nexport function recomputeStatus(\n state: ActivityReader & ActivityWriter,\n hoursPerDay: number,\n criteria: StatusCriteria\n): ReadonlyArray<Readonly<Activity>> {\n const changed: Activity[] = [];\n for (const id of applyStatusPass(state, criteria)) {\n const snap = state.getActivity(id);\n if (snap)\n changed.push(\n toPublicActivity(snapshotToActivity(snap), hoursPerDay, 'days')\n );\n }\n return changed;\n}\n","import type { Calendar } from '../../types.js';\n\nexport interface ProjectWorkHours {\n /** Earliest start of the working day across the week, `\"HH:MM\"`. */\n startHour: string;\n /** Latest end of the working day across the week, `\"HH:MM\"`. */\n endHour: string;\n}\n\n/** `\"8:30\"` → 510. Used to compare `\"HH:MM\"` strings chronologically. */\nfunction minutesOf(time: string): number {\n const [hours, minutes] = time.split(':');\n return Number(hours) * 60 + Number(minutes ?? 0);\n}\n\nfunction earliestTime(times: string[]): string {\n return times.reduce((earliest, t) =>\n minutesOf(t) < minutesOf(earliest) ? t : earliest\n );\n}\n\nfunction latestTime(times: string[]): string {\n return times.reduce((latest, t) =>\n minutesOf(t) > minutesOf(latest) ? t : latest\n );\n}\n\n/**\n * Flattens a calendar's per-weekday worktime into every working-hour range\n * (`\"HH:MM-HH:MM\"`) across the week. A working day is either its own ranges\n * (`string[]`) or `true` (uses the calendar's default `hours`).\n */\nfunction collectWorkRanges(calendar: Calendar): string[] {\n return calendar.worktime.days.flatMap((day) => {\n if (Array.isArray(day)) return day;\n // Defensive legacy guard: `CalendarWorktime.days` is narrowed to\n // `false | string[]`, but old payloads encoded \"working day with the\n // calendar's global hours\" as `true` — keep the runtime check; the\n // `unknown` cast only silences the no-overlap comparison.\n if ((day as unknown) === true) return calendar.worktime.hours;\n return [];\n });\n}\n\n/**\n * The project's working-hour envelope (earliest start + latest end) derived\n * from the default calendar's per-weekday worktime. Returns `null` when there\n * is no default calendar or it has no working ranges. Base calendars must\n * already be excluded from `calendars`.\n */\nexport function computeProjectWorkHours(\n calendars: Iterable<Calendar>\n): ProjectWorkHours | null {\n const defaultCalendar = [...calendars].find((c) => c.is_default);\n if (!defaultCalendar) return null;\n\n const ranges = collectWorkRanges(defaultCalendar);\n if (ranges.length === 0) return null;\n\n // Non-null: every range is \"HH:MM-HH:MM\" (see collectWorkRanges) — the\n // assertions only narrow noUncheckedIndexedAccess on the split parts.\n const starts = ranges.map((range) => range.split('-')[0]!);\n const ends = ranges.map((range) => range.split('-')[1]!);\n\n return { startHour: earliestTime(starts), endHour: latestTime(ends) };\n}\n","/**\n * CalendarReader adapter backed by the standalone `work-calendar` package\n * (react_client/src/assets/js/work-calendar/) — the UTC-strict extraction\n * of DHTMLX's calendar engine.\n *\n * Mirrors `ganttCalendarAdapter.ts` but reads from an injected\n * `createCalendar()` instance instead of `gantt.getCalendar()`. All calls\n * are shape-translations; no semantic transformation lives here.\n *\n * Inputs and outputs are UTC instants — the package's contract. Callers\n * that still build `Date` objects in local TZ must be migrated before they\n * can rely on this adapter.\n */\n\nimport type { CalendarUnit, WorkTimeDirection } from '../types.js';\nimport type { CalendarAPI, CalendarReader, WorkTimeQuery } from './api.js';\nimport type { CalendarId } from '../types.js';\n\n/**\n * Subset of the API exposed by `createCalendar()` in work-calendar/src/index.js.\n * Typed structurally so we don't need to ship `.d.ts` for the JS package.\n */\nexport interface WorkCalendarInstance {\n getCalendar(id: string | number): WorkCalendarHandle | null;\n}\n\ninterface WorkCalendarHandle {\n getClosestWorkTime(args: {\n date: Date;\n dir: WorkTimeDirection | 'any';\n unit?: string;\n }): Date;\n calculateEndDate(args: {\n start_date: Date;\n duration: number;\n unit?: string;\n }): Date;\n calculateDuration(args: {\n start_date: Date;\n end_date: Date;\n unit?: string;\n }): number;\n isWorkTime(args: { date: Date; unit?: string }): boolean;\n getWorkHours(date: Date): string[];\n}\n\nexport interface WorkCalendarAdapterOptions {\n /**\n * Unit used when the CalendarAPI caller doesn't pass one explicitly to\n * `calculateEndDate` / `calculateDuration`. Defaults to `'hour'` to\n * match the way pipelines and the auto-scheduler invoke the port.\n */\n defaultUnit?: CalendarUnit | 'minute';\n}\n\nexport function createWorkCalendarAdapter(\n instance: WorkCalendarInstance,\n options: WorkCalendarAdapterOptions = {}\n): CalendarReader {\n const defaultUnit = options.defaultUnit ?? 'hour';\n return {\n getCalendar(calendarId: CalendarId): CalendarAPI | null {\n const calendar = instance.getCalendar(String(calendarId));\n if (!calendar) return null;\n return wrapWorkCalendar(calendar, defaultUnit);\n }\n };\n}\n\nfunction wrapWorkCalendar(\n calendar: WorkCalendarHandle,\n defaultUnit: CalendarUnit | 'minute'\n): CalendarAPI {\n return {\n getClosestWorkTime(query: WorkTimeQuery): Date {\n return calendar.getClosestWorkTime({\n date: query.date,\n dir: query.direction,\n unit: query.unit\n });\n },\n calculateEndDate(start: Date, durationHours: number): Date {\n return calendar.calculateEndDate({\n start_date: start,\n duration: durationHours,\n unit: defaultUnit\n });\n },\n calculateDuration(start: Date, end: Date): number {\n return calendar.calculateDuration({\n start_date: start,\n end_date: end,\n unit: defaultUnit\n });\n },\n isWorkTime(date: Date, unit: CalendarUnit): boolean {\n return calendar.isWorkTime({ date, unit });\n },\n getWorkHours(date: Date): string[] {\n return calendar.getWorkHours(date);\n }\n };\n}\n","// ============================================================================\n// utils.js — Utilidades base extraídas de dhtmlxgantt.js\n// Líneas fuente: 327–392 (selectivo) + 3,322–3,384\n// COPIA VERBATIM. NO MODIFICAR LÓGICA.\n// ============================================================================\n\n// --- línea 327 ---\nvar units = { second: 1, minute: 60, hour: 60 * 60, day: 60 * 60 * 24, week: 60 * 60 * 24 * 7, month: 60 * 60 * 24 * 30, quarter: 60 * 60 * 24 * 30 * 3, year: 60 * 60 * 24 * 365 };\nfunction getSecondsInUnit(unit) {\n return units[unit] || units.hour;\n}\n\n// --- línea 331 ---\nfunction forEach(arr, callback) {\n if (arr.forEach) {\n arr.forEach(callback);\n } else {\n var workArray = arr.slice();\n for (var i = 0; i < workArray.length; i++) {\n callback(workArray[i], i);\n }\n }\n}\n\n// --- línea 376 ---\nfunction isArray(obj) {\n if (Array.isArray) {\n return Array.isArray(obj);\n } else {\n return obj && obj.length !== void 0 && obj.pop && obj.push;\n }\n}\n\n// --- línea 383 ---\nfunction isDate(obj) {\n if (obj && typeof obj === \"object\") {\n return !!(obj.getFullYear && obj.getMonth && obj.getDate);\n } else {\n return false;\n }\n}\n\n// --- línea 390 ---\nfunction isValidDate(obj) {\n return isDate(obj) && !isNaN(obj.getTime());\n}\n\n// --- línea 3,328 ---\nvar plainObjectConstructor = {}.constructor.toString();\nfunction isCustomType(object) {\n var constructorString = object.constructor.toString();\n return constructorString !== plainObjectConstructor;\n}\nfunction isExternalType(object) {\n return object.$$typeof && object.$$typeof.toString().includes(\"react.\");\n}\n\n// --- línea 3,336 ---\nfunction copy(object) {\n var i, result;\n if (object && typeof object == \"object\") {\n switch (true) {\n case isDate(object):\n result = new Date(object);\n break;\n case isArray(object):\n result = new Array(object.length);\n for (i = 0; i < object.length; i++) {\n result[i] = copy(object[i]);\n }\n break;\n default:\n if (isCustomType(object)) {\n result = Object.create(object);\n } else if (isExternalType(object)) {\n result = object;\n return result;\n } else {\n result = {};\n }\n for (i in object) {\n if (Object.prototype.hasOwnProperty.apply(object, [i])) result[i] = copy(object[i]);\n }\n break;\n }\n }\n return result || object;\n}\n\n// --- línea 3,366 ---\nfunction mixin(target, source, force) {\n for (var f in source) if (target[f] === void 0 || force) target[f] = source[f];\n return target;\n}\n\n// --- línea 3,370 ---\nfunction defined(obj) {\n return typeof obj != \"undefined\";\n}\n\n// --- línea 3,373 ---\nvar seed;\nfunction uid() {\n if (!seed) seed = (/* @__PURE__ */ new Date()).valueOf();\n seed++;\n return seed;\n}\n\n// --- línea 3,379 ---\nfunction bind(functor, object) {\n if (functor.bind) return functor.bind(object);\n else return function() {\n return functor.apply(object, arguments);\n };\n}\n\nconst utilsExports = {\n units, getSecondsInUnit,\n forEach,\n isArray, isDate, isValidDate,\n isCustomType, isExternalType,\n copy, mixin, defined, uid, bind,\n};\nexport {\n units, getSecondsInUnit,\n forEach,\n isArray, isDate, isValidDate,\n isCustomType, isExternalType,\n copy, mixin, defined, uid, bind,\n};\nexport default utilsExports;\n","// ============================================================================\n// formatters-and-date.js — Date string formatters + date(gantt2) factory\n// Líneas fuente: 8,660–9,069\n// COPIA VERBATIM. NO MODIFICAR LÓGICA.\n// ============================================================================\n\nconst dateToStr$1 = (format, utc, gantt2) => {\n format = format.replace(/%[a-zA-Z]/g, (a) => {\n switch (a) {\n case \"%d\":\n return `\"+to_fixed(date.get${utc ? \"UTC\" : \"\"}Date())+\"`;\n case \"%m\":\n return `\"+to_fixed((date.get${utc ? \"UTC\" : \"\"}Month()+1))+\"`;\n case \"%j\":\n return `\"+date.get${utc ? \"UTC\" : \"\"}Date()+\"`;\n case \"%n\":\n return `\"+(date.get${utc ? \"UTC\" : \"\"}Month()+1)+\"`;\n case \"%y\":\n return `\"+to_fixed(date.get${utc ? \"UTC\" : \"\"}FullYear()%100)+\"`;\n case \"%Y\":\n return `\"+date.get${utc ? \"UTC\" : \"\"}FullYear()+\"`;\n case \"%D\":\n return `\"+locale.date.day_short[date.get${utc ? \"UTC\" : \"\"}Day()]+\"`;\n case \"%l\":\n return `\"+locale.date.day_full[date.get${utc ? \"UTC\" : \"\"}Day()]+\"`;\n case \"%M\":\n return `\"+locale.date.month_short[date.get${utc ? \"UTC\" : \"\"}Month()]+\"`;\n case \"%F\":\n return `\"+locale.date.month_full[date.get${utc ? \"UTC\" : \"\"}Month()]+\"`;\n case \"%h\":\n return `\"+to_fixed((date.get${utc ? \"UTC\" : \"\"}Hours()+11)%12+1)+\"`;\n case \"%g\":\n return `\"+((date.get${utc ? \"UTC\" : \"\"}Hours()+11)%12+1)+\"`;\n case \"%G\":\n return `\"+date.get${utc ? \"UTC\" : \"\"}Hours()+\"`;\n case \"%H\":\n return `\"+to_fixed(date.get${utc ? \"UTC\" : \"\"}Hours())+\"`;\n case \"%i\":\n return `\"+to_fixed(date.get${utc ? \"UTC\" : \"\"}Minutes())+\"`;\n case \"%a\":\n return `\"+(date.get${utc ? \"UTC\" : \"\"}Hours()>11?\"pm\":\"am\")+\"`;\n case \"%A\":\n return `\"+(date.get${utc ? \"UTC\" : \"\"}Hours()>11?\"PM\":\"AM\")+\"`;\n case \"%s\":\n return `\"+to_fixed(date.get${utc ? \"UTC\" : \"\"}Seconds())+\"`;\n case \"%W\":\n return `\"+to_fixed(getISOWeek(date))+\"`;\n case \"%w\":\n return `\"+to_fixed(getWeek(date))+\"`;\n default:\n return a;\n }\n });\n const dateToStrFn = new Function(\"date\", \"to_fixed\", \"locale\", \"getISOWeek\", \"getWeek\", `return \"${format}\";`);\n return (date2) => dateToStrFn(date2, gantt2.date.to_fixed, gantt2.locale, gantt2.date.getISOWeek, gantt2.date.getWeek);\n};\nconst strToDate$1 = (format, utc, gantt2) => {\n let splt = \"var temp=date.match(/[a-zA-Z]+|[0-9]+/g);\";\n const mask = format.match(/%[a-zA-Z]/g);\n for (let i = 0; i < mask.length; i++) {\n switch (mask[i]) {\n case \"%j\":\n case \"%d\":\n splt += `set[2]=temp[${i}]||1;`;\n break;\n case \"%n\":\n case \"%m\":\n splt += `set[1]=(temp[${i}]||1)-1;`;\n break;\n case \"%y\":\n splt += `set[0]=temp[${i}]*1+(temp[${i}]>50?1900:2000);`;\n break;\n case \"%g\":\n case \"%G\":\n case \"%h\":\n case \"%H\":\n splt += `set[3]=temp[${i}]||0;`;\n break;\n case \"%i\":\n splt += `set[4]=temp[${i}]||0;`;\n break;\n case \"%Y\":\n splt += `set[0]=temp[${i}]||0;`;\n break;\n case \"%a\":\n case \"%A\":\n splt += `set[3]=set[3]%12+((temp[${i}]||'').toLowerCase()=='am'?0:12);`;\n break;\n case \"%s\":\n splt += `set[5]=temp[${i}]||0;`;\n break;\n case \"%M\":\n splt += `set[1]=locale.date.month_short_hash[temp[${i}]]||0;`;\n break;\n case \"%F\":\n splt += `set[1]=locale.date.month_full_hash[temp[${i}]]||0;`;\n break;\n }\n }\n let code = \"set[0],set[1],set[2],set[3],set[4],set[5]\";\n if (utc) {\n code = ` Date.UTC(${code})`;\n }\n const strToDateFn = new Function(\"date\", \"locale\", `var set=[0,0,1,0,0,0]; ${splt} return new Date(${code});`);\n return (dateString) => strToDateFn(dateString, gantt2.locale);\n};\nconst fastVersion = { date_to_str: dateToStr$1, str_to_date: strToDate$1 };\nconst dateToStr = (format, utc, gantt2) => (date2) => format.replace(/%[a-zA-Z]/g, (a) => {\n switch (a) {\n case \"%d\":\n return utc ? gantt2.date.to_fixed(date2.getUTCDate()) : gantt2.date.to_fixed(date2.getDate());\n case \"%m\":\n return utc ? gantt2.date.to_fixed(date2.getUTCMonth() + 1) : gantt2.date.to_fixed(date2.getMonth() + 1);\n case \"%j\":\n return utc ? date2.getUTCDate() : date2.getDate();\n case \"%n\":\n return utc ? date2.getUTCMonth() + 1 : date2.getMonth() + 1;\n case \"%y\":\n return utc ? gantt2.date.to_fixed(date2.getUTCFullYear() % 100) : gantt2.date.to_fixed(date2.getFullYear() % 100);\n case \"%Y\":\n return utc ? date2.getUTCFullYear() : date2.getFullYear();\n case \"%D\":\n return utc ? gantt2.locale.date.day_short[date2.getUTCDay()] : gantt2.locale.date.day_short[date2.getDay()];\n case \"%l\":\n return utc ? gantt2.locale.date.day_full[date2.getUTCDay()] : gantt2.locale.date.day_full[date2.getDay()];\n case \"%M\":\n return utc ? gantt2.locale.date.month_short[date2.getUTCMonth()] : gantt2.locale.date.month_short[date2.getMonth()];\n case \"%F\":\n return utc ? gantt2.locale.date.month_full[date2.getUTCMonth()] : gantt2.locale.date.month_full[date2.getMonth()];\n case \"%h\":\n return utc ? gantt2.date.to_fixed((date2.getUTCHours() + 11) % 12 + 1) : gantt2.date.to_fixed((date2.getHours() + 11) % 12 + 1);\n case \"%g\":\n return utc ? (date2.getUTCHours() + 11) % 12 + 1 : (date2.getHours() + 11) % 12 + 1;\n case \"%G\":\n return utc ? date2.getUTCHours() : date2.getHours();\n case \"%H\":\n return utc ? gantt2.date.to_fixed(date2.getUTCHours()) : gantt2.date.to_fixed(date2.getHours());\n case \"%i\":\n return utc ? gantt2.date.to_fixed(date2.getUTCMinutes()) : gantt2.date.to_fixed(date2.getMinutes());\n case \"%a\":\n return utc ? date2.getUTCHours() > 11 ? \"pm\" : \"am\" : date2.getHours() > 11 ? \"pm\" : \"am\";\n case \"%A\":\n return utc ? date2.getUTCHours() > 11 ? \"PM\" : \"AM\" : date2.getHours() > 11 ? \"PM\" : \"AM\";\n case \"%s\":\n return utc ? gantt2.date.to_fixed(date2.getUTCSeconds()) : gantt2.date.to_fixed(date2.getSeconds());\n case \"%W\":\n return utc ? gantt2.date.to_fixed(gantt2.date.getUTCISOWeek(date2)) : gantt2.date.to_fixed(gantt2.date.getISOWeek(date2));\n case \"%w\":\n return gantt2.date.to_fixed(gantt2.date.getWeek(date2));\n default:\n return a;\n }\n});\nconst strToDate = (format, utc, gantt2) => (date2) => {\n const set = [0, 0, 1, 0, 0, 0];\n const temp = date2.match(/[a-zA-Z]+|[0-9]+/g);\n const mask = format.match(/%[a-zA-Z]/g);\n for (let i = 0; i < mask.length; i++) {\n switch (mask[i]) {\n case \"%j\":\n case \"%d\":\n set[2] = temp[i] || 1;\n break;\n case \"%n\":\n case \"%m\":\n set[1] = (temp[i] || 1) - 1;\n break;\n case \"%y\":\n set[0] = temp[i] * 1 + (temp[i] > 50 ? 1900 : 2e3);\n break;\n case \"%g\":\n case \"%G\":\n case \"%h\":\n case \"%H\":\n set[3] = temp[i] || 0;\n break;\n case \"%i\":\n set[4] = temp[i] || 0;\n break;\n case \"%Y\":\n set[0] = temp[i] || 0;\n break;\n case \"%a\":\n case \"%A\":\n set[3] = set[3] % 12 + ((temp[i] || \"\").toLowerCase() === \"am\" ? 0 : 12);\n break;\n case \"%s\":\n set[5] = temp[i] || 0;\n break;\n case \"%M\":\n set[1] = gantt2.locale.date.month_short_hash[temp[i]] || 0;\n break;\n case \"%F\":\n set[1] = gantt2.locale.date.month_full_hash[temp[i]] || 0;\n break;\n }\n }\n if (utc) {\n return new Date(Date.UTC(set[0], set[1], set[2], set[3], set[4], set[5]));\n }\n return new Date(set[0], set[1], set[2], set[3], set[4], set[5]);\n};\nconst cspVersion = { date_to_str: dateToStr, str_to_date: strToDate };\nfunction date(gantt2) {\n var isoDateRegex = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$/;\n // Expects ISO 8601 with Z, with offset, or date-only (\"YYYY-MM-DD\").\n // ECMAScript parses date-only as UTC and offset-bearing strings into the\n // right UTC instant. Datetimes without Z or offset are interpreted as\n // local in modern browsers — the consumer must avoid that shape.\n function parseISODate(dateStr) {\n var d = new Date(dateStr);\n if (isNaN(d.getTime())) {\n return null;\n }\n return d;\n }\n var canUseCsp = null;\n function cspAutoCheck() {\n try {\n new Function(\"canUseCsp = false;\");\n } catch (e) {\n canUseCsp = true;\n }\n }\n function useCsp() {\n var result = false;\n if (gantt2.config.csp === \"auto\") {\n if (canUseCsp === null) {\n cspAutoCheck();\n }\n result = canUseCsp;\n } else {\n result = gantt2.config.csp;\n }\n return result;\n }\n var dateHelper = { _isoDateDetected: false, _isoDateOnly: false, formatISODate: function(date2) {\n return date2.toISOString();\n }, formatISODateOnly: function(date2) {\n return date2.getUTCFullYear() + \"-\" + gantt2.date.to_fixed(date2.getUTCMonth() + 1) + \"-\" + gantt2.date.to_fixed(date2.getUTCDate());\n }, init: function() {\n var locale2 = gantt2.locale;\n var s = locale2.date.month_short;\n var t2 = locale2.date.month_short_hash = {};\n for (var i = 0; i < s.length; i++) t2[s[i]] = i;\n var s = locale2.date.month_full;\n var t2 = locale2.date.month_full_hash = {};\n for (var i = 0; i < s.length; i++) t2[s[i]] = i;\n }, date_part: function(date2) {\n date2.setUTCHours(0, 0, 0, 0);\n return date2;\n }, time_part: function(date2) {\n return (date2.valueOf() / 1e3) % 86400;\n }, week_start: function(date2) {\n var shift = date2.getUTCDay();\n if (gantt2.config.start_on_monday) {\n if (shift === 0) shift = 6;\n else shift--;\n }\n return this.date_part(this.add(date2, -1 * shift, \"day\"));\n }, month_start: function(date2) {\n date2.setUTCDate(1);\n return this.date_part(date2);\n }, quarter_start: function(date2) {\n this.month_start(date2);\n var m = date2.getUTCMonth(), res_month;\n if (m >= 9) {\n res_month = 9;\n } else if (m >= 6) {\n res_month = 6;\n } else if (m >= 3) {\n res_month = 3;\n } else {\n res_month = 0;\n }\n date2.setUTCMonth(res_month);\n return date2;\n }, year_start: function(date2) {\n date2.setUTCMonth(0);\n return this.month_start(date2);\n }, day_start: function(date2) {\n return this.date_part(date2);\n }, hour_start: function(date2) {\n if (date2.getUTCMinutes()) date2.setUTCMinutes(0);\n this.minute_start(date2);\n return date2;\n }, minute_start: function(date2) {\n if (date2.getUTCSeconds()) date2.setUTCSeconds(0);\n if (date2.getUTCMilliseconds()) date2.setUTCMilliseconds(0);\n return date2;\n }, _add_days: function(modifiedDate, inc, originalDate) {\n modifiedDate.setUTCDate(modifiedDate.getUTCDate() + inc);\n return modifiedDate;\n }, add: function(date2, inc, mode) {\n var ndate = new Date(date2.valueOf());\n switch (mode) {\n case \"day\":\n ndate = this._add_days(ndate, inc, date2);\n break;\n case \"week\":\n ndate = this._add_days(ndate, inc * 7, date2);\n break;\n case \"month\":\n ndate.setUTCMonth(ndate.getUTCMonth() + inc);\n break;\n case \"year\":\n ndate.setUTCFullYear(ndate.getUTCFullYear() + inc);\n break;\n case \"hour\":\n ndate.setTime(ndate.getTime() + inc * 60 * 60 * 1e3);\n break;\n case \"minute\":\n ndate.setTime(ndate.getTime() + inc * 60 * 1e3);\n break;\n default:\n return this[\"add_\" + mode](date2, inc, mode);\n }\n return ndate;\n }, add_quarter: function(date2, inc) {\n return this.add(date2, inc * 3, \"month\");\n }, to_fixed: function(num) {\n if (num < 10) return \"0\" + num;\n return num;\n }, copy: function(date2) {\n return new Date(date2.valueOf());\n }, date_to_str: function(format, utc) {\n var result = fastVersion;\n if (useCsp()) {\n result = cspVersion;\n }\n return result.date_to_str(format, utc, gantt2);\n }, str_to_date: function(format, utc) {\n var result = fastVersion;\n if (useCsp()) {\n result = cspVersion;\n }\n return result.str_to_date(format, utc, gantt2);\n }, getISOWeek: function(ndate) {\n return gantt2.date._getWeekNumber(ndate, true);\n }, _getWeekNumber: function(ndate, isoWeek) {\n if (!ndate) return false;\n var nday = ndate.getUTCDay();\n if (isoWeek) {\n if (nday === 0) {\n nday = 7;\n }\n }\n var first_thursday = new Date(ndate.valueOf());\n first_thursday.setUTCDate(ndate.getUTCDate() + (4 - nday));\n var year_number = first_thursday.getUTCFullYear();\n var ordinal_date = Math.round((first_thursday.getTime() - Date.UTC(year_number, 0, 1)) / 864e5);\n var week_number = 1 + Math.floor(ordinal_date / 7);\n return week_number;\n }, getWeek: function(ndate) {\n return gantt2.date._getWeekNumber(ndate, gantt2.config.start_on_monday);\n }, getUTCISOWeek: function(ndate) {\n return gantt2.date.getISOWeek(ndate);\n }, parseDate: function(date2, format) {\n if (date2 && !date2.getFullYear) {\n var wouldUseTemplate = !format || format === \"parse_date\" || format === \"xml_date\";\n var userOverrodeParseDate = wouldUseTemplate && (gantt2.defined(gantt2.templates.xml_date) || gantt2.templates.parse_date && !gantt2.templates.parse_date._ganttAuto);\n if (!userOverrodeParseDate) {\n if (typeof date2 === \"string\" && isoDateRegex.test(date2)) {\n var hasTime = date2.indexOf(\"T\") !== -1;\n var isoResult = parseISODate(date2);\n if (isoResult) {\n if (!dateHelper._isoDateDetected) {\n dateHelper._isoDateDetected = true;\n dateHelper._isoDateOnly = !hasTime;\n } else if (hasTime) {\n dateHelper._isoDateOnly = false;\n }\n return isoResult;\n }\n }\n }\n if (typeof format !== \"function\") {\n if (typeof format === \"string\") {\n if (format === \"parse_date\" || format === \"xml_date\") {\n format = gantt2.defined(gantt2.templates.xml_date) ? gantt2.templates.xml_date : gantt2.templates.parse_date;\n } else {\n format = gantt2.defined(gantt2.templates[format]) ? gantt2.templates[format] : gantt2.date.str_to_date(format, true);\n }\n } else {\n format = gantt2.defined(gantt2.templates.xml_date) ? gantt2.templates.xml_date : gantt2.templates.parse_date;\n }\n }\n if (date2) {\n date2 = format(date2);\n } else {\n date2 = null;\n }\n }\n return date2;\n } };\n return dateHelper;\n}\n\nexport { date };\nexport default { date };\n","// ============================================================================\n// calendar-module.js — Módulo completo de calendario\n// Líneas fuente: 16,604–18,555\n// COPIA VERBATIM. NO MODIFICAR LÓGICA.\n// Dependencias inyectadas: bind, mixin, copy, uid, isDate, isValidDate, isArray, forEach, assert (vía gantt2)\n// ============================================================================\n\n// Imports — proveídos por shim/utils\nimport { bind, mixin, copy, uid, isDate, isValidDate, isArray, forEach } from './utils.js';\n\n function IsWorkTimeArgument(date2, unit, task, id, calendar) {\n this.date = date2;\n this.unit = unit;\n this.task = task;\n this.id = id;\n this.calendar = calendar;\n return this;\n }\n function ClosestWorkTimeArgument(date2, dir, unit, task, id, calendar) {\n this.date = date2;\n this.dir = dir;\n this.unit = unit;\n this.task = task;\n this.id = id;\n this.calendar = calendar;\n return this;\n }\n function CalculateEndDateArgument(start_date, duration, unit, step, task, id, calendar) {\n this.start_date = start_date;\n this.duration = duration;\n this.unit = unit;\n this.step = step;\n this.task = task;\n this.id = id;\n this.calendar = calendar;\n return this;\n }\n function GetDurationArgument(start, end, task, calendar) {\n this.start_date = start;\n this.end_date = end;\n this.task = task;\n this.calendar = calendar;\n this.unit = null;\n this.step = null;\n return this;\n }\n var calendarArgumentsHelper = function(gantt2) {\n return { getWorkHoursArguments: function() {\n var config2 = arguments[0];\n if (isDate(config2)) {\n config2 = { date: config2 };\n } else {\n config2 = mixin({}, config2);\n }\n if (!isValidDate(config2.date)) {\n gantt2.assert(false, \"Invalid date argument for getWorkHours method\");\n throw new Error(\"Invalid date argument for getWorkHours method\");\n }\n return config2;\n }, setWorkTimeArguments: function() {\n return arguments[0];\n }, unsetWorkTimeArguments: function() {\n return arguments[0];\n }, isWorkTimeArguments: function() {\n var config2 = arguments[0];\n if (config2 instanceof IsWorkTimeArgument) {\n return config2;\n }\n var processedConfig;\n if (!config2.date) {\n processedConfig = new IsWorkTimeArgument(arguments[0], arguments[1], arguments[2], null, arguments[3]);\n } else {\n processedConfig = new IsWorkTimeArgument(config2.date, config2.unit, config2.task, null, config2.calendar);\n }\n processedConfig.unit = processedConfig.unit || gantt2.config.duration_unit;\n if (!isValidDate(processedConfig.date)) {\n gantt2.assert(false, \"Invalid date argument for isWorkTime method\");\n throw new Error(\"Invalid date argument for isWorkTime method\");\n }\n return processedConfig;\n }, getClosestWorkTimeArguments: function(arg) {\n var config2 = arguments[0];\n if (config2 instanceof ClosestWorkTimeArgument) return config2;\n var processedConfig;\n if (isDate(config2)) {\n processedConfig = new ClosestWorkTimeArgument(config2);\n } else {\n processedConfig = new ClosestWorkTimeArgument(config2.date, config2.dir, config2.unit, config2.task, null, config2.calendar);\n }\n if (config2.id) {\n processedConfig.task = config2;\n }\n processedConfig.dir = config2.dir || \"any\";\n processedConfig.unit = config2.unit || gantt2.config.duration_unit;\n if (!isValidDate(processedConfig.date)) {\n gantt2.assert(false, \"Invalid date argument for getClosestWorkTime method\");\n throw new Error(\"Invalid date argument for getClosestWorkTime method\");\n }\n return processedConfig;\n }, _getStartEndConfig: function(param) {\n var argumentType = GetDurationArgument;\n var config2;\n if (param instanceof argumentType) return param;\n if (isDate(param)) {\n config2 = new argumentType(arguments[0], arguments[1], arguments[2], arguments[3]);\n } else {\n config2 = new argumentType(param.start_date, param.end_date, param.task);\n if (param.id !== null && param.id !== void 0) {\n config2.task = param;\n }\n }\n config2.unit = config2.unit || gantt2.config.duration_unit;\n config2.step = config2.step || gantt2.config.duration_step;\n config2.start_date = config2.start_date || config2.start || config2.date;\n if (!isValidDate(config2.start_date)) {\n gantt2.assert(false, \"Invalid start_date argument for getDuration method\");\n throw new Error(\"Invalid start_date argument for getDuration method\");\n }\n if (!isValidDate(config2.end_date)) {\n gantt2.assert(false, \"Invalid end_date argument for getDuration method\");\n throw new Error(\"Invalid end_date argument for getDuration method\");\n }\n return config2;\n }, getDurationArguments: function(start, end, unit, step) {\n return this._getStartEndConfig.apply(this, arguments);\n }, hasDurationArguments: function(start, end, unit, step) {\n return this._getStartEndConfig.apply(this, arguments);\n }, calculateEndDateArguments: function(start, duration, unit, step) {\n var config2 = arguments[0];\n if (config2 instanceof CalculateEndDateArgument) return config2;\n var processedConfig;\n if (isDate(config2)) {\n processedConfig = new CalculateEndDateArgument(arguments[0], arguments[1], arguments[2], void 0, arguments[3], void 0, arguments[4]);\n } else {\n processedConfig = new CalculateEndDateArgument(config2.start_date, config2.duration, config2.unit, config2.step, config2.task, null, config2.calendar);\n }\n if (config2.id !== null && config2.id !== void 0) {\n processedConfig.task = config2;\n processedConfig.unit = null;\n processedConfig.step = null;\n }\n processedConfig.unit = processedConfig.unit || gantt2.config.duration_unit;\n processedConfig.step = processedConfig.step || gantt2.config.duration_step;\n if (!isValidDate(processedConfig.start_date)) {\n gantt2.assert(false, \"Invalid start_date argument for calculateEndDate method\");\n throw new Error(\"Invalid start_date argument for calculateEndDate method\");\n }\n return processedConfig;\n } };\n };\n function WorkTimeCalendarMerger() {\n }\n WorkTimeCalendarMerger.prototype = { _getIntervals: function(hoursArray) {\n var result = [];\n for (var i = 0; i < hoursArray.length; i += 2) {\n result.push({ start: hoursArray[i], end: hoursArray[i + 1] });\n }\n return result;\n }, _toHoursArray: function(intervalsArray) {\n var result = [];\n function toFixed(value) {\n var str = String(value);\n if (str.length < 2) {\n str = \"0\" + str;\n }\n return str;\n }\n function formatHHMM(secondsValue) {\n var hours = Math.floor(secondsValue / (60 * 60));\n var minutePart = secondsValue - hours * 60 * 60;\n var minutes = Math.floor(minutePart / 60);\n return hours + \":\" + toFixed(minutes);\n }\n for (var i = 0; i < intervalsArray.length; i++) {\n result.push(formatHHMM(intervalsArray[i].start) + \"-\" + formatHHMM(intervalsArray[i].end));\n }\n return result;\n }, _intersectHourRanges: function(first, second) {\n var result = [];\n var baseArray = first.length > second.length ? first : second;\n var overridesArray = first === baseArray ? second : first;\n baseArray = baseArray.slice();\n overridesArray = overridesArray.slice();\n var result = [];\n for (var i = 0; i < baseArray.length; i++) {\n var base = baseArray[i];\n for (var j = 0; j < overridesArray.length; j++) {\n var current = overridesArray[j];\n if (current.start < base.end && current.end > base.start) {\n result.push({ start: Math.max(base.start, current.start), end: Math.min(base.end, current.end) });\n if (base.end > current.end) {\n overridesArray.splice(j, 1);\n j--;\n i--;\n }\n }\n }\n }\n return result;\n }, _mergeAdjacentIntervals: function(parts) {\n var result = parts.slice();\n result.sort(function(a, b) {\n return a.start - b.start;\n });\n var base = result[0];\n for (var i = 1; i < result.length; i++) {\n var current = result[i];\n if (current.start <= base.end) {\n if (current.end > base.end) {\n base.end = current.end;\n }\n result.splice(i, 1);\n i--;\n } else {\n base = current;\n }\n }\n return result;\n }, _mergeHoursConfig: function(firstHours, secondHours) {\n return this._mergeAdjacentIntervals(this._intersectHourRanges(firstHours, secondHours));\n }, merge: function(first, second) {\n const firstCalendar = copy(first.getConfig());\n const secondCalendar = copy(second.getConfig());\n const firstConfig = firstCalendar.parsed;\n const secondConfig = secondCalendar.parsed;\n firstConfig.customWeeks = firstCalendar.customWeeks;\n secondConfig.customWeeks = secondCalendar.customWeeks;\n var mergedSettings = { hours: this._toHoursArray(this._mergeHoursConfig(firstConfig.hours, secondConfig.hours)), dates: {}, customWeeks: {} };\n const processCalendar = (config1, config2) => {\n for (let i2 in config1.dates) {\n const date1 = config1.dates[i2];\n if (+i2 > 1e3) {\n mergedSettings.dates[i2] = false;\n }\n for (const key in config2.dates) {\n const date2 = config2.dates[key];\n if (key == i2) {\n mergedSettings.dates[i2] = !!(date1 && date2);\n }\n if (Array.isArray(date1)) {\n const hours2 = Array.isArray(date2) ? date2 : config2.hours;\n mergedSettings.dates[i2] = this._toHoursArray(this._mergeHoursConfig(date1, hours2));\n }\n }\n }\n };\n processCalendar(firstConfig, secondConfig);\n processCalendar(secondConfig, firstConfig);\n if (firstConfig.customWeeks) {\n for (var i in firstConfig.customWeeks) {\n mergedSettings.customWeeks[i] = firstConfig.customWeeks[i];\n }\n }\n if (secondConfig.customWeeks) {\n for (var i in secondConfig.customWeeks) {\n if (mergedSettings.customWeeks[i]) {\n mergedSettings.customWeeks[i + \"_second\"] = secondConfig.customWeeks[i];\n } else {\n mergedSettings.customWeeks[i] = secondConfig.customWeeks[i];\n }\n }\n }\n return mergedSettings;\n } };\n class WorkUnitsMapCache {\n constructor() {\n this.clear();\n }\n getItem(unit, timestamp, value) {\n if (this._cache.has(unit)) {\n const unitCache = this._cache.get(unit);\n const subCache = unitCache[value.getUTCFullYear()];\n if (subCache && subCache.has(timestamp)) {\n return subCache.get(timestamp);\n }\n }\n return -1;\n }\n setItem(unit, timestamp, value, rawValue) {\n if (!unit || !timestamp) {\n return;\n }\n const cache = this._cache;\n const year = rawValue.getUTCFullYear();\n let unitCache;\n if (!cache.has(unit)) {\n unitCache = [];\n cache.set(unit, unitCache);\n } else {\n unitCache = cache.get(unit);\n }\n let yearCache = unitCache[year];\n if (!yearCache) {\n yearCache = unitCache[year] = /* @__PURE__ */ new Map();\n }\n yearCache.set(timestamp, value);\n }\n clear() {\n this._cache = /* @__PURE__ */ new Map();\n }\n }\n class WorkUnitsObjectCache {\n constructor() {\n this.clear();\n }\n getItem(unit, timestamp, value) {\n const cache = this._cache;\n if (cache && cache[unit]) {\n const units2 = cache[unit];\n if (units2 === void 0) {\n return -1;\n }\n const subCache = units2[value.getUTCFullYear()];\n if (subCache && subCache[timestamp] !== void 0) {\n return subCache[timestamp];\n }\n }\n return -1;\n }\n setItem(unit, timestamp, value, rawValue) {\n if (!unit || !timestamp) {\n return;\n }\n const cache = this._cache;\n if (!cache) {\n return;\n }\n if (!cache[unit]) {\n cache[unit] = [];\n }\n const unitCache = cache[unit];\n const year = rawValue.getUTCFullYear();\n let yearCache = unitCache[year];\n if (!yearCache) {\n yearCache = unitCache[year] = {};\n }\n yearCache[timestamp] = value;\n }\n clear() {\n this._cache = {};\n }\n }\n class LargerUnitsCache {\n constructor(calendar) {\n this.getMinutesPerWeek = (weekStart) => {\n const key = weekStart.valueOf();\n if (this._weekCache.has(key)) {\n return this._weekCache.get(key);\n }\n const calendar2 = this._calendar;\n const gantt2 = this._calendar.$gantt;\n let minutesPerWeek = 0;\n let start = gantt2.date.week_start(new Date(weekStart));\n for (let i = 0; i < 7; i++) {\n minutesPerWeek += calendar2.getHoursPerDay(start) * 60;\n start = gantt2.date.add(start, 1, \"day\");\n }\n this._weekCache.set(key, minutesPerWeek);\n return minutesPerWeek;\n };\n this.getMinutesPerMonth = (monthStart) => {\n const key = monthStart.valueOf();\n if (this._monthCache.has(key)) {\n return this._monthCache.get(key);\n }\n const calendar2 = this._calendar;\n const gantt2 = this._calendar.$gantt;\n let minutesPerMonth = 0;\n let start = gantt2.date.week_start(new Date(monthStart));\n const nextMonth = gantt2.date.add(start, 1, \"month\").valueOf();\n while (start.valueOf() < nextMonth) {\n minutesPerMonth += calendar2.getHoursPerDay(start) * 60;\n start = gantt2.date.add(start, 1, \"day\");\n }\n this._monthCache.set(key, minutesPerMonth);\n return minutesPerMonth;\n };\n this.clear = () => {\n this._weekCache = /* @__PURE__ */ new Map();\n this._monthCache = /* @__PURE__ */ new Map();\n };\n this.clear();\n this._calendar = calendar;\n }\n }\n function createCacheObject() {\n if (typeof Map !== \"undefined\") {\n return new WorkUnitsMapCache();\n } else {\n return new WorkUnitsObjectCache();\n }\n }\n class DateDurationCache {\n constructor() {\n this.clear();\n }\n _getCacheObject(startDate, unit, step) {\n const cache = this._cache;\n if (!cache[unit]) {\n cache[unit] = [];\n }\n let unitCache = cache[unit];\n if (!unitCache) {\n unitCache = cache[unit] = {};\n }\n let stepCache = unitCache[step];\n if (!stepCache) {\n stepCache = unitCache[step] = {};\n }\n const year = startDate.getUTCFullYear();\n let yearCache = stepCache[year];\n if (!yearCache) {\n yearCache = stepCache[year] = { durations: {}, endDates: {} };\n }\n return yearCache;\n }\n _endDateCacheKey(startDate, duration) {\n return String(startDate) + \"-\" + String(duration);\n }\n _durationCacheKey(startDate, endDate) {\n return String(startDate) + \"-\" + String(endDate);\n }\n getEndDate(startDate, duration, unit, step, compute) {\n const cache = this._getCacheObject(startDate, unit, step);\n const startDateTimestamp = startDate.valueOf();\n const key = this._endDateCacheKey(startDateTimestamp, duration);\n let endDate;\n if (cache.endDates[key] === void 0) {\n const result = compute();\n const resultTimestamp = result.valueOf();\n cache.endDates[key] = resultTimestamp;\n cache.durations[this._durationCacheKey(startDateTimestamp, resultTimestamp)] = duration;\n endDate = result;\n } else {\n endDate = new Date(cache.endDates[key]);\n }\n return endDate;\n }\n getDuration(startDate, endDate, unit, step, compute) {\n const cache = this._getCacheObject(startDate, unit, step);\n const startDateTimestamp = startDate.valueOf();\n const endDateTimestamp = endDate.valueOf();\n const key = this._durationCacheKey(startDateTimestamp, endDateTimestamp);\n let duration;\n if (cache.durations[key] === void 0) {\n const result = compute();\n cache.durations[key] = result.valueOf();\n duration = result;\n } else {\n duration = cache.durations[key];\n }\n return duration;\n }\n clear() {\n this._cache = {};\n }\n }\n function CalendarWorkTimeStrategy(gantt2, argumentsHelper) {\n this.argumentsHelper = argumentsHelper;\n this.$gantt = gantt2;\n this._workingUnitsCache = createCacheObject();\n this._largeUnitsCache = new LargerUnitsCache(this);\n this._dateDurationCache = new DateDurationCache();\n this._worktime = null;\n this._cached_timestamps = {};\n this._cached_timestamps_count = 0;\n }\n CalendarWorkTimeStrategy.prototype = { units: [\"year\", \"month\", \"week\", \"day\", \"hour\", \"minute\"], _clearCaches: function() {\n this._workingUnitsCache.clear();\n this._largeUnitsCache.clear();\n this._dateDurationCache.clear();\n }, _getUnitOrder: function(unit) {\n for (var i = 0, len = this.units.length; i < len; i++) {\n if (this.units[i] == unit) return i;\n }\n }, _resetTimestampCache: function() {\n this._cached_timestamps = {};\n this._cached_timestamps_count = 0;\n }, _timestamp: function(settings) {\n if (this._cached_timestamps_count > 1e6) {\n this._resetTimestampCache();\n }\n var timestamp = null;\n if (settings.day || settings.day === 0) {\n timestamp = settings.day;\n } else if (settings.date) {\n var value = String(settings.date.valueOf());\n if (this._cached_timestamps[value]) {\n timestamp = this._cached_timestamps[value];\n } else {\n timestamp = Date.UTC(settings.date.getUTCFullYear(), settings.date.getUTCMonth(), settings.date.getUTCDate());\n this._cached_timestamps[value] = timestamp;\n this._cached_timestamps_count++;\n }\n }\n return timestamp;\n }, _checkIfWorkingUnit: function(date2, unit) {\n if (!this[\"_is_work_\" + unit]) {\n const from = this.$gantt.date[`${unit}_start`](new Date(date2));\n const to = this.$gantt.date.add(from, 1, unit);\n return this.hasDuration(from, to);\n }\n return this[\"_is_work_\" + unit](date2);\n }, _is_work_day: function(date2) {\n var val = this._getWorkHours(date2);\n if (Array.isArray(val)) {\n return val.length > 0;\n }\n return false;\n }, _is_work_hour: function(date2) {\n var hours = this._getWorkHours(date2);\n var value = date2.getUTCHours();\n for (var i = 0; i < hours.length; i++) {\n if (value >= hours[i].startHour && value < hours[i].endHour) {\n return true;\n }\n }\n return false;\n }, _getTimeOfDayStamp: function(date2, dayEnd) {\n var hours = date2.getUTCHours();\n if (!date2.getUTCHours() && !date2.getUTCMinutes() && dayEnd) {\n hours = 24;\n }\n return hours * 60 * 60 + date2.getUTCMinutes() * 60;\n }, _is_work_minute: function(date2) {\n var hours = this._getWorkHours(date2);\n var checkTime = this._getTimeOfDayStamp(date2);\n for (var i = 0; i < hours.length; i++) {\n if (checkTime >= hours[i].start && checkTime < hours[i].end) {\n return true;\n }\n }\n return false;\n }, _nextDate: function(start, unit, step) {\n return this.$gantt.date.add(start, step, unit);\n }, _getWorkUnitsBetweenGeneric: function(from, to, unit, step) {\n var dateHelper = this.$gantt.date;\n var start = new Date(from), end = new Date(to);\n step = step || 1;\n var units2 = 0;\n var next = null;\n var stepStart, stepEnd;\n var checkFirst = false;\n stepStart = dateHelper[unit + \"_start\"](new Date(start));\n if (stepStart.valueOf() != start.valueOf()) {\n checkFirst = true;\n }\n var checkLast = false;\n stepEnd = dateHelper[unit + \"_start\"](new Date(to));\n if (stepEnd.valueOf() != to.valueOf()) {\n checkLast = true;\n }\n var isLastStep = false;\n while (start.valueOf() < end.valueOf()) {\n next = this._nextDate(start, unit, step);\n isLastStep = next.valueOf() > end.valueOf();\n if (this._isWorkTime(start, unit)) {\n if (checkFirst || checkLast && isLastStep) {\n stepStart = dateHelper[unit + \"_start\"](new Date(start));\n stepEnd = dateHelper.add(stepStart, step, unit);\n }\n if (checkFirst) {\n checkFirst = false;\n next = this._nextDate(stepStart, unit, step);\n units2 += (stepEnd.valueOf() - start.valueOf()) / (stepEnd.valueOf() - stepStart.valueOf());\n } else if (checkLast && isLastStep) {\n checkLast = false;\n units2 += (end.valueOf() - start.valueOf()) / (stepEnd.valueOf() - stepStart.valueOf());\n } else {\n units2++;\n }\n } else {\n var unitOrder = this._getUnitOrder(unit);\n var biggerTimeUnit = this.units[unitOrder - 1];\n if (biggerTimeUnit && !this._isWorkTime(start, biggerTimeUnit)) {\n next = this._getClosestWorkTimeFuture(start, biggerTimeUnit);\n }\n }\n start = next;\n }\n return units2;\n }, _getMinutesPerHour: function(date2) {\n var hourStart = this._getTimeOfDayStamp(date2);\n var hourEnd = this._getTimeOfDayStamp(this._nextDate(date2, \"hour\", 1));\n if (hourEnd === 0) {\n hourEnd = 24 * 60 * 60;\n }\n var worktimes = this._getWorkHours(date2);\n for (var i = 0; i < worktimes.length; i++) {\n var interval = worktimes[i];\n if (hourStart >= interval.start && hourEnd <= interval.end) {\n return 60;\n } else if (hourStart < interval.end && hourEnd > interval.start) {\n var duration = Math.min(hourEnd, interval.end) - Math.max(hourStart, interval.start);\n return duration / 60;\n }\n }\n return 0;\n }, _getMinutesPerDay: function(date2) {\n var hours = this._getWorkHours(date2);\n var res = 0;\n hours.forEach(function(interval) {\n res += interval.durationMinutes;\n });\n return res;\n }, getHoursPerDay: function(date2) {\n var hours = this._getWorkHours(date2);\n var res = 0;\n hours.forEach(function(interval) {\n res += interval.durationHours;\n });\n return res;\n }, _getWorkUnitsForRange: function(from, to, unit, step) {\n var total = 0;\n var start = new Date(from), end = new Date(to);\n var getUnitsPerDay;\n if (unit == \"minute\") {\n getUnitsPerDay = bind(this._getMinutesPerDay, this);\n } else {\n getUnitsPerDay = bind(this.getHoursPerDay, this);\n }\n while (start.valueOf() < end.valueOf()) {\n if (end - start > 1e3 * 60 * 60 * 24 * 32 && start.getUTCDate() === 0) {\n var units2 = this._largeUnitsCache.getMinutesPerMonth(start);\n if (unit == \"hour\") {\n units2 = units2 / 60;\n }\n total += units2;\n start = this.$gantt.date.add(start, 1, \"month\");\n continue;\n } else if (end - start > 1e3 * 60 * 60 * 24 * 16) {\n var weekStart = this.$gantt.date.week_start(new Date(start));\n if (start.valueOf() === weekStart.valueOf()) {\n var units2 = this._largeUnitsCache.getMinutesPerWeek(start);\n if (unit == \"hour\") {\n units2 = units2 / 60;\n }\n total += units2;\n start = this.$gantt.date.add(start, 7, \"day\");\n continue;\n }\n }\n total += getUnitsPerDay(start);\n start = this._nextDate(start, \"day\", 1);\n }\n return total / step;\n }, _getMinutesBetweenSingleDay: function(from, to) {\n var range = this._getIntervalTimestamp(from, to);\n var worktimes = this._getWorkHours(from);\n var result = 0;\n for (var i = 0; i < worktimes.length; i++) {\n var interval = worktimes[i];\n if (range.end >= interval.start && range.start <= interval.end) {\n var minuteFrom = Math.max(interval.start, range.start);\n var minuteTo = Math.min(interval.end, range.end);\n result += (minuteTo - minuteFrom) / 60;\n range.start = minuteTo;\n }\n }\n return Math.floor(result);\n }, _getMinutesBetween: function(from, to, unit, step) {\n var start = new Date(from), end = new Date(to);\n step = step || 1;\n var firstDayStart = new Date(start);\n var firstDayEnd = this.$gantt.date.add(this.$gantt.date.day_start(new Date(start)), 1, \"day\");\n if (end.valueOf() <= firstDayEnd.valueOf()) {\n return this._getMinutesBetweenSingleDay(from, to);\n } else {\n var lastDayStart = this.$gantt.date.day_start(new Date(end));\n var lastDayEnd = end;\n var startPart = this._getMinutesBetweenSingleDay(firstDayStart, firstDayEnd);\n var endPart = this._getMinutesBetweenSingleDay(lastDayStart, lastDayEnd);\n var rangePart = this._getWorkUnitsForRange(firstDayEnd, lastDayStart, unit, step);\n var total = startPart + rangePart + endPart;\n return total;\n }\n }, _getHoursBetween: function(from, to, unit, step) {\n var start = new Date(from), end = new Date(to);\n step = step || 1;\n var firstDayStart = new Date(start);\n var firstDayEnd = this.$gantt.date.add(this.$gantt.date.day_start(new Date(start)), 1, \"day\");\n if (end.valueOf() <= firstDayEnd.valueOf()) {\n return Math.round(this._getMinutesBetweenSingleDay(from, to) / 60);\n } else {\n var lastDayStart = this.$gantt.date.day_start(new Date(end));\n var lastDayEnd = end;\n var startPart = this._getMinutesBetweenSingleDay(firstDayStart, firstDayEnd, unit, step) / 60;\n var endPart = this._getMinutesBetweenSingleDay(lastDayStart, lastDayEnd, unit, step) / 60;\n var rangePart = this._getWorkUnitsForRange(firstDayEnd, lastDayStart, unit, step);\n var total = startPart + rangePart + endPart;\n return Math.round(total);\n }\n }, getConfig: function() {\n return this._worktime;\n }, _setConfig: function(settings) {\n this._worktime = settings;\n this._parseSettings();\n this._clearCaches();\n }, _parseSettings: function() {\n var settings = this.getConfig();\n settings.parsed = { dates: {}, hours: null, haveCustomWeeks: false, customWeeks: {}, customWeeksRangeStart: null, customWeeksRangeEnd: null, customWeeksBoundaries: [] };\n settings.parsed.hours = this._parseHours(settings.hours);\n for (var i in settings.dates) {\n settings.parsed.dates[i] = this._parseHours(settings.dates[i]);\n }\n if (settings.customWeeks) {\n var minCustomRangeStart = null;\n var maxCustomRangeEnd = null;\n for (var i in settings.customWeeks) {\n var customTime = settings.customWeeks[i];\n if (customTime.from && customTime.to) {\n var rangeStart = customTime.from;\n var rangeEnd = customTime.to;\n if (!minCustomRangeStart || minCustomRangeStart > rangeStart.valueOf()) {\n minCustomRangeStart = rangeStart.valueOf();\n }\n if (!maxCustomRangeEnd || maxCustomRangeEnd < rangeEnd.valueOf()) {\n maxCustomRangeEnd = rangeEnd.valueOf();\n }\n settings.parsed.customWeeksBoundaries.push({ from: rangeStart.valueOf(), fromReadable: new Date(rangeStart), to: rangeEnd.valueOf(), toReadable: new Date(rangeEnd), name: i });\n settings.parsed.haveCustomWeeks = true;\n var currentWeek = settings.parsed.customWeeks[i] = { from: customTime.from, to: customTime.to, hours: this._parseHours(customTime.hours), dates: {} };\n if (customTime.days && !customTime.dates) {\n customTime.dates = customTime.dates || {};\n for (var i = 0; i < customTime.days.length; i++) {\n customTime.dates[i] = customTime.days[i];\n if (!(customTime.days[i] instanceof Array)) {\n customTime.dates[i] = !!customTime.days[i];\n }\n }\n delete customTime.days;\n }\n for (var d in customTime.dates) {\n currentWeek.dates[d] = this._parseHours(customTime.dates[d]);\n }\n }\n }\n settings.parsed.customWeeksRangeStart = minCustomRangeStart;\n settings.parsed.customWeeksRangeEnd = maxCustomRangeEnd;\n }\n }, _tryChangeCalendarSettings: function(payload) {\n var backup = JSON.stringify(this.getConfig());\n payload();\n if (!this.hasWorkTime()) {\n this._setConfig(JSON.parse(backup));\n this._clearCaches();\n return false;\n }\n return true;\n }, _arraysEqual: function(a, b) {\n if (a === b) return true;\n if (!a || !b) return false;\n if (a.length != b.length) return false;\n for (var i = 0; i < a.length; ++i) {\n if (a[i] !== b[i]) return false;\n }\n return true;\n }, _compareSettings: function(mySettings, thatSettings) {\n if (!this._arraysEqual(mySettings.hours, thatSettings.hours)) {\n return false;\n }\n var myDays = Object.keys(mySettings.dates);\n var otherDates = Object.keys(thatSettings.dates);\n myDays.sort();\n otherDates.sort();\n if (!this._arraysEqual(myDays, otherDates)) {\n return false;\n }\n for (var i = 0; i < myDays.length; i++) {\n var timestamp = myDays[i];\n var myHours = mySettings.dates[timestamp];\n var otherHours = thatSettings.dates[timestamp];\n if (myHours !== otherHours && !(Array.isArray(myHours) && Array.isArray(otherHours) && this._arraysEqual(myHours, otherHours))) {\n return false;\n }\n }\n return true;\n }, equals: function(calendar) {\n if (!(calendar instanceof CalendarWorkTimeStrategy)) {\n return false;\n }\n var mySettings = this.getConfig();\n var thatSettings = calendar.getConfig();\n if (!this._compareSettings(mySettings, thatSettings)) {\n return false;\n }\n if (mySettings.parsed.haveCustomWeeks && thatSettings.parsed.haveCustomWeeks) {\n if (mySettings.parsed.customWeeksBoundaries.length != thatSettings.parsed.customWeeksBoundaries.length) {\n return false;\n }\n for (var i in mySettings.parsed.customWeeks) {\n var myWeek = mySettings.parsed.customWeeks[i];\n var thatWeek = thatSettings.parsed.customWeeks[i];\n if (!thatWeek) {\n return false;\n }\n if (!this._compareSettings(myWeek, thatWeek)) {\n return false;\n }\n }\n } else if (mySettings.parse.haveCustomWeeks !== thatSettings.parsed.haveCustomWeeks) {\n return false;\n }\n return true;\n }, getWorkHours: function() {\n var config2 = this.argumentsHelper.getWorkHoursArguments.apply(this.argumentsHelper, arguments);\n return this._getWorkHours(config2.date, false);\n }, _getWorkHours: function(date2, parsed) {\n var calendar = this.getConfig();\n if (parsed !== false) {\n calendar = calendar.parsed;\n }\n if (!date2) {\n return calendar.hours;\n }\n const dayStartDate = new Date(Date.UTC(date2.getUTCFullYear(), date2.getUTCMonth(), date2.getUTCDate()));\n var dateValue = this._timestamp({ date: dayStartDate });\n if (calendar.haveCustomWeeks) {\n if (calendar.customWeeksRangeStart <= dateValue && calendar.customWeeksRangeEnd > dateValue) {\n for (var i = 0; i < calendar.customWeeksBoundaries.length; i++) {\n if (calendar.customWeeksBoundaries[i].from <= dateValue && calendar.customWeeksBoundaries[i].to > dateValue) {\n calendar = calendar.customWeeks[calendar.customWeeksBoundaries[i].name];\n break;\n }\n }\n }\n }\n var hours = true;\n if (calendar.dates[dateValue] !== void 0) {\n hours = calendar.dates[dateValue];\n } else if (calendar.dates[date2.getUTCDay()] !== void 0) {\n hours = calendar.dates[date2.getUTCDay()];\n }\n if (hours === true) {\n return calendar.hours;\n } else if (hours) {\n return hours;\n }\n return [];\n }, _getIntervalTimestamp: function(from, to) {\n var res = { start: 0, end: 0 };\n res.start = from.getUTCHours() * 60 * 60 + from.getUTCMinutes() * 60 + from.getUTCSeconds();\n var endHours = to.getUTCHours();\n if (!endHours && !to.getUTCMinutes() && !to.getUTCSeconds() && from.valueOf() < to.valueOf()) {\n endHours = 24;\n }\n res.end = endHours * 60 * 60 + to.getUTCMinutes() * 60 + to.getUTCSeconds();\n return res;\n }, _parseHours: function(hours) {\n if (Array.isArray(hours)) {\n var timestampRanges = [];\n hours.forEach(function(hour) {\n if (typeof hour === \"number\") {\n timestampRanges.push(hour * 60 * 60);\n } else if (typeof hour === \"string\") {\n hour.split(\"-\").map(function(time) {\n return time.trim();\n }).forEach(function(part) {\n var parsed = part.split(\":\").map(function(time) {\n return time.trim();\n });\n var value = parseInt(parsed[0] * 60 * 60);\n if (parsed[1]) {\n value += parseInt(parsed[1] * 60);\n }\n if (parsed[2]) {\n value += parseInt(parsed[2]);\n }\n timestampRanges.push(value);\n });\n }\n });\n var timerangeConfig = [];\n for (var i = 0; i < timestampRanges.length; i += 2) {\n var start = timestampRanges[i];\n var end = timestampRanges[i + 1];\n var duration = end - start;\n timerangeConfig.push({ start, end, startHour: Math.floor(start / (60 * 60)), startMinute: Math.floor(start / 60), endHour: Math.ceil(end / (60 * 60)), endMinute: Math.ceil(end / 60), durationSeconds: duration, durationMinutes: duration / 60, durationHours: duration / (60 * 60) });\n }\n return timerangeConfig;\n } else {\n return hours;\n }\n }, setWorkTime: function(settings) {\n return this._tryChangeCalendarSettings(bind(function() {\n var hours = settings.hours !== void 0 ? settings.hours : true;\n var timestamp = this._timestamp(settings);\n var calendarConfig = this.getConfig();\n if (timestamp !== null) {\n calendarConfig.dates[timestamp] = hours;\n } else if (!settings.customWeeks) {\n calendarConfig.hours = hours;\n }\n if (settings.customWeeks) {\n if (!calendarConfig.customWeeks) {\n calendarConfig.customWeeks = {};\n }\n if (typeof settings.customWeeks == \"string\") {\n if (timestamp !== null) {\n calendarConfig.customWeeks[settings.customWeeks].dates[timestamp] = hours;\n } else if (!settings.customWeeks) {\n calendarConfig.customWeeks[settings.customWeeks].hours = hours;\n }\n } else if (typeof settings.customWeeks === \"object\" && settings.customWeeks.constructor === Object) {\n for (var i in settings.customWeeks) {\n calendarConfig.customWeeks[i] = settings.customWeeks[i];\n }\n }\n }\n this._parseSettings();\n this._clearCaches();\n }, this));\n }, unsetWorkTime: function(settings) {\n return this._tryChangeCalendarSettings(bind(function() {\n if (!settings) {\n this.reset_calendar();\n } else {\n var timestamp = this._timestamp(settings);\n if (timestamp !== null) {\n delete this.getConfig().dates[timestamp];\n }\n }\n this._parseSettings();\n this._clearCaches();\n }, this));\n }, _isWorkTime: function(date2, unit) {\n var isWorkUnit = -1;\n var dateKey = null;\n {\n dateKey = String(date2.valueOf());\n isWorkUnit = this._workingUnitsCache.getItem(unit, dateKey, date2);\n }\n if (isWorkUnit == -1) {\n isWorkUnit = this._checkIfWorkingUnit(date2, unit);\n {\n this._workingUnitsCache.setItem(unit, dateKey, isWorkUnit, date2);\n }\n }\n return isWorkUnit;\n }, isWorkTime: function() {\n var config2 = this.argumentsHelper.isWorkTimeArguments.apply(this.argumentsHelper, arguments);\n return this._isWorkTime(config2.date, config2.unit);\n }, calculateDuration: function() {\n var config2 = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n if (!config2.unit) {\n return false;\n }\n var self2 = this;\n return this._dateDurationCache.getDuration(config2.start_date, config2.end_date, config2.unit, config2.step, function() {\n return self2._calculateDuration(config2.start_date, config2.end_date, config2.unit, config2.step);\n });\n }, _calculateDuration: function(from, to, unit, step) {\n var res = 0;\n var sign = 1;\n if (from.valueOf() > to.valueOf()) {\n var tmp = to;\n to = from;\n from = tmp;\n sign = -1;\n }\n if (unit == \"hour\" && step == 1) {\n res = this._getHoursBetween(from, to, unit, step);\n } else if (unit == \"minute\" && step == 1) {\n res = this._getMinutesBetween(from, to, unit, step);\n } else {\n res = this._getWorkUnitsBetweenGeneric(from, to, unit, step);\n }\n return sign * Math.round(res);\n }, hasDuration: function() {\n var config2 = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n var from = config2.start_date, to = config2.end_date, unit = config2.unit, step = config2.step;\n if (!unit) {\n return false;\n }\n var start = new Date(from), end = new Date(to);\n step = step || 1;\n while (start.valueOf() < end.valueOf()) {\n if (this._isWorkTime(start, unit)) return true;\n start = this._nextDate(start, unit, step);\n }\n return false;\n }, calculateEndDate: function() {\n var config2 = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);\n var from = config2.start_date, duration = config2.duration, unit = config2.unit, step = config2.step;\n if (!unit) return false;\n var mult = config2.duration >= 0 ? 1 : -1;\n duration = Math.abs(duration * 1);\n var self2 = this;\n return this._dateDurationCache.getEndDate(from, duration, unit, step * mult, function() {\n return self2._calculateEndDate(from, duration, unit, step * mult);\n });\n }, _calculateEndDate: function(from, duration, unit, step) {\n if (!unit) return false;\n if (step == 1 && unit == \"minute\") {\n return this._calculateMinuteEndDate(from, duration, step);\n } else if (step == -1 && unit == \"minute\") {\n return this._subtractMinuteDate(from, duration, step);\n } else if (step == 1 && unit == \"hour\") {\n return this._calculateHourEndDate(from, duration, step);\n } else {\n var interval = this._addInterval(from, duration, unit, step, null);\n return interval.end;\n }\n }, _addInterval: function(start, duration, unit, step, stopAction) {\n var added = 0;\n var current = start;\n while (added < duration && !(stopAction && stopAction(current))) {\n var next = this._nextDate(current, unit, step);\n var dateValue = new Date(next.valueOf() + 1);\n if (step > 0) {\n dateValue = new Date(next.valueOf() - 1);\n }\n var workTimeCheck = this._isWorkTime(dateValue, unit);\n if (workTimeCheck) {\n added++;\n }\n current = next;\n }\n return { end: current, start, added };\n }, _addHoursUntilDayEnd: function(from, duration) {\n var dayEnd = this.$gantt.date.add(this.$gantt.date.day_start(new Date(from)), 1, \"day\");\n var added = 0;\n var left = duration;\n var range = this._getIntervalTimestamp(from, dayEnd);\n var worktimes = this._getWorkHours(from);\n for (var i = 0; i < worktimes.length && added < duration; i++) {\n var interval = worktimes[i];\n if (range.end >= interval.start && range.start <= interval.end) {\n var minuteFrom = Math.max(interval.start, range.start);\n var minuteTo = Math.min(interval.end, range.end);\n var rangeHours = (minuteTo - minuteFrom) / (60 * 60);\n if (rangeHours > left) {\n rangeHours = left;\n minuteTo = minuteFrom + left * 60 * 60;\n }\n var addHours = Math.round((minuteTo - minuteFrom) / (60 * 60));\n added += addHours;\n left -= addHours;\n range.start = minuteTo;\n }\n }\n var intervalEnd = dayEnd;\n if (added === duration) {\n intervalEnd = new Date(Date.UTC(from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate(), 0, 0, range.start));\n }\n return { added, end: intervalEnd };\n }, _calculateHourEndDate: function(from, duration, step) {\n var start = new Date(from), added = 0;\n step = step || 1;\n duration = Math.abs(duration * 1);\n var interval = this._addHoursUntilDayEnd(start, duration);\n added = interval.added;\n start = interval.end;\n var durationLeft = duration - added;\n if (durationLeft) {\n var current = start;\n while (added < duration) {\n var next = this._nextDate(current, \"day\", step);\n next.setUTCHours(0);\n next.setUTCMinutes(0);\n next.setUTCSeconds(0);\n var hoursPerDay = 0;\n if (step > 0) {\n hoursPerDay = this.getHoursPerDay(new Date(next.valueOf() - 1));\n } else {\n hoursPerDay = this.getHoursPerDay(new Date(next.valueOf() + 1));\n }\n if (added + hoursPerDay >= duration) {\n break;\n } else {\n added += hoursPerDay;\n }\n current = next;\n }\n start = current;\n }\n if (added < duration) {\n var durationLeft = duration - added;\n interval = this._addHoursUntilDayEnd(start, durationLeft);\n start = interval.end;\n }\n return start;\n }, _addMinutesUntilHourEnd: function(from, duration) {\n if (from.getUTCMinutes() === 0) {\n return { added: 0, end: new Date(from) };\n }\n var hourEnd = this.$gantt.date.add(this.$gantt.date.hour_start(new Date(from)), 1, \"hour\");\n var added = 0;\n var left = duration;\n var range = this._getIntervalTimestamp(from, hourEnd);\n var worktimes = this._getWorkHours(from);\n for (var i = 0; i < worktimes.length && added < duration; i++) {\n var interval = worktimes[i];\n if (range.end >= interval.start && range.start <= interval.end) {\n var minuteFrom = Math.max(interval.start, range.start);\n var minuteTo = Math.min(interval.end, range.end);\n var rangeMinutes = (minuteTo - minuteFrom) / 60;\n if (rangeMinutes > left) {\n rangeMinutes = left;\n minuteTo = minuteFrom + left * 60;\n }\n var addMinutes = Math.round((minuteTo - minuteFrom) / 60);\n left -= addMinutes;\n added += addMinutes;\n range.start = minuteTo;\n }\n }\n var intervalEnd = hourEnd;\n if (added === duration) {\n intervalEnd = new Date(Date.UTC(from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate(), 0, 0, range.start));\n }\n return { added, end: intervalEnd };\n }, _subtractMinutesUntilHourStart: function(from, duration) {\n var hourStart = this.$gantt.date.hour_start(new Date(from));\n var added = 0;\n var left = duration;\n var hourStartTimestamp = hourStart.getUTCHours() * 60 * 60 + hourStart.getUTCMinutes() * 60 + hourStart.getUTCSeconds();\n var initialDateTimestamp = from.getUTCHours() * 60 * 60 + from.getUTCMinutes() * 60 + from.getUTCSeconds();\n var worktimes = this._getWorkHours(from);\n for (var i = worktimes.length - 1; i >= 0 && added < duration; i--) {\n var interval = worktimes[i];\n if (initialDateTimestamp > interval.start && hourStartTimestamp <= interval.end) {\n var minuteFrom = Math.min(initialDateTimestamp, interval.end);\n var minuteTo = Math.max(hourStartTimestamp, interval.start);\n var rangeMinutes = (minuteFrom - minuteTo) / 60;\n if (rangeMinutes > left) {\n rangeMinutes = left;\n minuteTo = minuteFrom - left * 60;\n }\n var addMinutes = Math.abs(Math.round((minuteFrom - minuteTo) / 60));\n left -= addMinutes;\n added += addMinutes;\n initialDateTimestamp = minuteTo;\n }\n }\n var intervalEnd = hourStart;\n if (added === duration) {\n intervalEnd = new Date(Date.UTC(from.getUTCFullYear(), from.getUTCMonth(), from.getUTCDate(), 0, 0, initialDateTimestamp));\n }\n return { added, end: intervalEnd };\n }, _subtractMinuteDate: function(from, duration, step) {\n var start = this.getClosestWorkTime({ date: from, dir: \"past\", unit: \"minute\" }), added = 0;\n step = step || -1;\n duration = Math.abs(duration * 1);\n duration = Math.round(duration);\n const minutePrecision = this._isMinutePrecision(start);\n let addedInterval = this._subtractMinutesUntilHourStart(start, duration);\n added += addedInterval.added;\n start = addedInterval.end;\n var calculatedDay = 0;\n var daySchedule = [];\n var minutesInDay = 0;\n while (added < duration) {\n var dayStart = this.$gantt.date.day_start(new Date(start));\n var iterateFromDayEnd = false;\n if (start.valueOf() === dayStart.valueOf()) {\n dayStart = this.$gantt.date.add(dayStart, -1, \"day\");\n iterateFromDayEnd = true;\n }\n var dayEnd = new Date(Date.UTC(dayStart.getUTCFullYear(), dayStart.getUTCMonth(), dayStart.getUTCDate(), 23, 59, 59, 999)).valueOf();\n if (dayEnd !== calculatedDay) {\n daySchedule = this._getWorkHours(dayStart);\n minutesInDay = this._getMinutesPerDay(dayStart);\n calculatedDay = dayEnd;\n }\n var left = duration - added;\n var timestamp = this._getTimeOfDayStamp(start, iterateFromDayEnd);\n if (!daySchedule.length || !minutesInDay) {\n start = this.$gantt.date.add(start, -1, \"day\");\n continue;\n }\n if (daySchedule[daySchedule.length - 1].end <= timestamp) {\n if (left > minutesInDay) {\n added += minutesInDay;\n start = this.$gantt.date.add(start, -1, \"day\");\n continue;\n }\n }\n var isWorkHour = false;\n var workInterval = null;\n var prevInterval = null;\n for (var i = daySchedule.length - 1; i >= 0; i--) {\n if (daySchedule[i].start < timestamp - 1 && daySchedule[i].end >= timestamp - 1) {\n isWorkHour = true;\n workInterval = daySchedule[i];\n prevInterval = daySchedule[i - 1];\n break;\n }\n }\n if (isWorkHour) {\n if (timestamp === workInterval.end && left >= workInterval.durationMinutes) {\n added += workInterval.durationMinutes;\n start = this.$gantt.date.add(start, -workInterval.durationMinutes, \"minute\");\n } else if (!minutePrecision && left <= timestamp / 60 - workInterval.startMinute) {\n added += left;\n start = this.$gantt.date.add(start, -left, \"minute\");\n } else if (minutePrecision) {\n if (left <= timestamp / 60 - workInterval.startMinute) {\n added += left;\n start = this.$gantt.date.add(start, -left, \"minute\");\n } else {\n added += timestamp / 60 - workInterval.startMinute;\n if (prevInterval) {\n start = new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate(), 0, 0, prevInterval.end));\n } else {\n start = this.$gantt.date.day_start(start);\n }\n }\n } else {\n var minutesInHour = this._getMinutesPerHour(start);\n if (minutesInHour <= left) {\n added += minutesInHour;\n start = this._nextDate(start, \"hour\", step);\n } else {\n addedInterval = this._subtractMinutesUntilHourStart(start, left);\n added += addedInterval.added;\n start = addedInterval.end;\n }\n }\n } else {\n if (start.getUTCHours() === 0 && start.getUTCMinutes() === 0 && start.getUTCSeconds() === 0) {\n var prev = this._getClosestWorkTimePast(start, \"hour\");\n if (prev.valueOf() === start.valueOf()) {\n var prev = this.$gantt.date.add(start, -1, \"day\");\n var times = this._getWorkHours(prev);\n if (times.length) {\n var lastInterval = times[times.length - 1];\n prev.setUTCSeconds(lastInterval.durationSeconds);\n }\n }\n start = prev;\n } else {\n start = this._getClosestWorkTimePast(new Date(start - 1), \"hour\");\n }\n }\n }\n if (added < duration) {\n var durationLeft = duration - added;\n addedInterval = this._subtractMinutesUntilHourStart(start, durationLeft);\n added += addedInterval.added;\n start = addedInterval.end;\n }\n return start;\n }, _calculateMinuteEndDate: function(from, duration, step) {\n var start = new Date(from), added = 0;\n step = step || 1;\n duration = Math.abs(duration * 1);\n duration = Math.round(duration);\n var addedInterval = this._addMinutesUntilHourEnd(start, duration);\n added += addedInterval.added;\n start = addedInterval.end;\n var calculatedDay = 0;\n var daySchedule = [];\n var minutesInDay = 0;\n var minutePrecision = this._isMinutePrecision(start);\n while (added < duration) {\n var dayStart = this.$gantt.date.day_start(new Date(start)).valueOf();\n if (dayStart !== calculatedDay) {\n daySchedule = this._getWorkHours(start);\n minutesInDay = this._getMinutesPerDay(start);\n calculatedDay = dayStart;\n }\n var left = duration - added;\n var timestamp = this._getTimeOfDayStamp(start);\n if (!daySchedule.length || !minutesInDay) {\n start = this.$gantt.date.add(this.$gantt.date.day_start(start), 1, \"day\");\n continue;\n }\n if (daySchedule[0].start >= timestamp) {\n if (left >= minutesInDay) {\n added += minutesInDay;\n if (left == minutesInDay) {\n start = new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate(), 0, 0, daySchedule[daySchedule.length - 1].end));\n break;\n } else {\n start = this.$gantt.date.add(start, 1, \"day\");\n start = this.$gantt.date.day_start(start);\n }\n continue;\n }\n }\n var isWorkHour = false;\n var workInterval = null;\n for (var i = 0; i < daySchedule.length; i++) {\n if (daySchedule[i].start <= timestamp && daySchedule[i].end > timestamp) {\n isWorkHour = true;\n workInterval = daySchedule[i];\n break;\n }\n }\n if (isWorkHour) {\n if (timestamp === workInterval.start && left >= workInterval.durationMinutes) {\n added += workInterval.durationMinutes;\n start = this.$gantt.date.add(start, workInterval.durationMinutes, \"minute\");\n } else if (left <= workInterval.endMinute - timestamp / 60) {\n added += left;\n start = this.$gantt.date.add(start, left, \"minute\");\n } else {\n var minutesInHour = this._getMinutesPerHour(start);\n if (minutesInHour <= left) {\n added += minutesInHour;\n if (minutePrecision) {\n start = this.$gantt.date.add(start, minutesInHour, \"minute\");\n } else {\n start = this._nextDate(start, \"hour\", step);\n }\n } else {\n addedInterval = this._addMinutesUntilHourEnd(start, left);\n added += addedInterval.added;\n start = addedInterval.end;\n }\n }\n } else {\n start = this._getClosestWorkTimeFuture(start, \"hour\");\n }\n }\n if (added < duration) {\n var durationLeft = duration - added;\n addedInterval = this._addMinutesUntilHourEnd(start, durationLeft);\n added += addedInterval.added;\n start = addedInterval.end;\n }\n return start;\n }, getClosestWorkTime: function() {\n var settings = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);\n return this._getClosestWorkTime(settings.date, settings.unit, settings.dir);\n }, _getClosestWorkTime: function(inputDate, unit, direction) {\n var result = new Date(inputDate);\n if (this._isWorkTime(result, unit)) {\n return result;\n }\n result = this.$gantt.date[unit + \"_start\"](result);\n if (direction == \"any\" || !direction) {\n var closestFuture = this._getClosestWorkTimeFuture(result, unit);\n var closestPast = this._getClosestWorkTimePast(result, unit);\n if (Math.abs(closestFuture - inputDate) <= Math.abs(inputDate - closestPast)) {\n result = closestFuture;\n } else {\n result = closestPast;\n }\n } else if (direction == \"past\") {\n result = this._getClosestWorkTimePast(result, unit);\n } else {\n result = this._getClosestWorkTimeFuture(result, unit);\n }\n return result;\n }, _getClosestWorkTimeFuture: function(date2, unit) {\n return this._getClosestWorkTimeGeneric(date2, unit, 1);\n }, _getClosestWorkTimePast: function(date2, unit) {\n var result = this._getClosestWorkTimeGeneric(date2, unit, -1);\n return this.$gantt.date.add(result, 1, unit);\n }, _findClosestTimeInDay: function(date2, direction, worktimes) {\n var start = new Date(date2);\n var resultDate = null;\n var fromDayEnd = false;\n if (!this._getWorkHours(start).length) {\n start = this._getClosestWorkTime(start, \"day\", direction < 0 ? \"past\" : \"future\");\n if (direction < 0) {\n start = new Date(start.valueOf() - 1);\n fromDayEnd = true;\n }\n worktimes = this._getWorkHours(start);\n }\n var value = this._getTimeOfDayStamp(start);\n if (fromDayEnd) {\n value = this._getTimeOfDayStamp(new Date(start.valueOf() + 1), fromDayEnd);\n }\n if (direction > 0) {\n for (var i = 0; i < worktimes.length; i++) {\n if (worktimes[i].start >= value) {\n resultDate = new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate(), 0, 0, worktimes[i].start));\n break;\n }\n }\n } else {\n for (var i = worktimes.length - 1; i >= 0; i--) {\n if (worktimes[i].end <= value) {\n resultDate = new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate(), 0, 0, worktimes[i].end));\n break;\n } else if (worktimes[i].end > value && worktimes[i].start <= value) {\n resultDate = new Date(Date.UTC(start.getUTCFullYear(), start.getUTCMonth(), start.getUTCDate(), 0, 0, value));\n break;\n }\n }\n }\n return resultDate;\n }, _getClosestWorkMinute: function(date2, unit, direction) {\n var start = new Date(date2);\n var worktimes = this._getWorkHours(start);\n var resultDate = this._findClosestTimeInDay(start, direction, worktimes);\n if (!resultDate) {\n if (direction > 0) {\n start = this.calculateEndDate(start, direction, unit);\n start = this.$gantt.date.day_start(start);\n } else {\n start = this.calculateEndDate(start, direction, \"day\");\n start = this.$gantt.date.day_start(start);\n start = this.$gantt.date.add(start, 1, \"day\");\n start = new Date(start.valueOf() - 1);\n }\n worktimes = this._getWorkHours(start);\n resultDate = this._findClosestTimeInDay(start, direction, worktimes);\n }\n if (direction < 0) {\n resultDate = this.$gantt.date.add(resultDate, -1, unit);\n }\n return resultDate;\n }, _getClosestWorkTimeGeneric: function(date2, unit, increment) {\n if (unit === \"hour\" || unit === \"minute\") {\n return this._getClosestWorkMinute(date2, unit, increment);\n }\n var unitOrder = this._getUnitOrder(unit), biggerTimeUnit = this.units[unitOrder - 1];\n var result = date2;\n var maximumLoop = 3e3, count = 0;\n while (!this._isWorkTime(result, unit)) {\n if (biggerTimeUnit && !this._isWorkTime(result, biggerTimeUnit)) {\n if (increment > 0) {\n result = this._getClosestWorkTimeFuture(result, biggerTimeUnit);\n } else {\n result = this._getClosestWorkTimePast(result, biggerTimeUnit);\n }\n if (this._isWorkTime(result, unit)) {\n break;\n }\n }\n count++;\n if (count > maximumLoop) {\n this.$gantt.assert(false, \"Invalid working time check\");\n return false;\n }\n result = this.$gantt.date.add(result, increment, unit);\n if (this.$gantt.date[unit + \"_start\"]) {\n result = this.$gantt.date[unit + \"_start\"](result);\n }\n }\n return result;\n }, hasWorkTime: function() {\n var worktime = this.getConfig();\n var dates = worktime.dates;\n var daysOfWeek = [0, 1, 2, 3, 4, 5, 6];\n for (var i in worktime.dates) {\n }\n var hasRegularHours = this._checkWorkHours(worktime.hours);\n var result = false;\n daysOfWeek.forEach((function(day) {\n if (result) {\n return;\n }\n var dayConfig = dates[day];\n if (dayConfig === true) {\n result = hasRegularHours;\n } else if (Array.isArray(dayConfig)) {\n result = this._checkWorkHours(dayConfig);\n }\n }).bind(this));\n return result;\n }, _checkWorkHours: function(hoursArray) {\n if (hoursArray.length === 0) {\n return false;\n }\n var result = false;\n for (var i = 0; i < hoursArray.length; i += 2) {\n if (hoursArray[i] !== hoursArray[i + 1]) {\n result = true;\n }\n }\n return result;\n }, _isMinutePrecision: function(date2) {\n let minutePrecision = false;\n this._getWorkHours(date2).forEach(function(interval) {\n if (interval.startMinute % 60 || interval.endMinute % 60) {\n minutePrecision = true;\n }\n });\n return minutePrecision;\n } };\n const legacyResourceCalendarConfig = { isLegacyResourceCalendarFormat: function(resourceCalendarsProperty) {\n if (!resourceCalendarsProperty) {\n return false;\n }\n for (var i in resourceCalendarsProperty) {\n if (resourceCalendarsProperty[i] && typeof resourceCalendarsProperty[i] === \"object\") {\n return true;\n }\n }\n return false;\n }, getResourceProperty: function(config2) {\n var resourceCalendarsConfig = config2.resource_calendars;\n var propertyName = config2.resource_property;\n if (this.isLegacyResourceCalendarFormat(resourceCalendarsConfig)) {\n for (var i in config2) {\n propertyName = i;\n break;\n }\n }\n return propertyName;\n }, getCalendarIdFromLegacyConfig: function(task, config2) {\n if (config2) {\n for (var field in config2) {\n var resource = config2[field];\n if (task[field]) {\n var calendarId = resource[task[field]];\n if (calendarId) {\n return calendarId;\n }\n }\n }\n }\n return null;\n } };\n function dynamicResourceCalendarsFactory() {\n function getResourcesCalendarKey(resourceAssignments) {\n return resourceAssignments.map(function(res) {\n if (res && res.resource_id) {\n return res.resource_id;\n } else {\n return res;\n }\n }).sort().join(\"-\");\n }\n var dynamicCalendars = {};\n function mergeResourceCalendars(resourceAssignments, manager) {\n return manager.mergeCalendars(resourceAssignments.map(function(assignment) {\n var resourceId = assignment && assignment.resource_id ? assignment.resource_id : assignment;\n return manager.getResourceCalendar(resourceId);\n }));\n }\n function getCalendarIdFromMultipleResources(resourceAssignments, manager) {\n var key = getResourcesCalendarKey(resourceAssignments);\n if (!resourceAssignments.length) {\n return null;\n } else if (resourceAssignments.length === 1) {\n return manager.getResourceCalendar(key).id;\n } else if (dynamicCalendars[key]) {\n return dynamicCalendars[key].id;\n } else {\n var tempCalendar = mergeResourceCalendars(resourceAssignments, manager);\n dynamicCalendars[key] = tempCalendar;\n return manager.addCalendar(tempCalendar);\n }\n }\n return { getCalendarIdFromMultipleResources };\n }\n const dynamicResourceCalendars = dynamicResourceCalendarsFactory();\n function CalendarManager(gantt2) {\n this.$gantt = gantt2;\n this._calendars = {};\n this._legacyConfig = void 0;\n this.$gantt.attachEvent(\"onGanttReady\", (function() {\n if (this.$gantt.config.resource_calendars) {\n this._isLegacyConfig = legacyResourceCalendarConfig.isLegacyResourceCalendarFormat(this.$gantt.config.resource_calendars);\n }\n }).bind(this));\n this.$gantt.attachEvent(\"onBeforeGanttReady\", (function() {\n this.createDefaultCalendars();\n }).bind(this));\n this.$gantt.attachEvent(\"onBeforeGanttRender\", (function() {\n this.createDefaultCalendars();\n }).bind(this));\n }\n CalendarManager.prototype = { _calendars: {}, _convertWorkTimeSettings: function(settings) {\n const days = settings.days;\n if (typeof days === \"object\" && !Array.isArray(days) && days !== null) {\n const datesConfig = {};\n if (days == null ? void 0 : days.weekdays) {\n for (let i = 0; i < 7; i++) {\n datesConfig[i] = days.weekdays[i];\n }\n }\n if (days == null ? void 0 : days.dates) {\n Object.entries(days.dates).forEach(([date2, setting]) => {\n datesConfig[new Date(date2).valueOf()] = setting;\n });\n }\n Object.entries(datesConfig).forEach(([key, setting]) => {\n if (!(setting instanceof Array)) {\n datesConfig[key] = !!setting;\n }\n });\n settings = { ...settings, dates: datesConfig };\n } else if (days && !settings.dates) {\n settings.dates = settings.dates || {};\n for (let i = 0; i < days.length; i++) {\n settings.dates[i] = days[i];\n if (!(days[i] instanceof Array)) {\n settings.dates[i] = !!days[i];\n }\n }\n }\n delete settings.days;\n return settings;\n }, mergeCalendars: function() {\n var calendars = [];\n var args = arguments;\n if (Array.isArray(args[0])) {\n calendars = args[0].slice();\n } else {\n for (var i = 0; i < arguments.length; i++) {\n calendars.push(arguments[i]);\n }\n }\n var mergeHelper = new WorkTimeCalendarMerger();\n var result;\n calendars.forEach((function(calendar) {\n if (!result) {\n result = calendar;\n } else {\n result = this._createCalendarFromConfig(mergeHelper.merge(result, calendar));\n }\n }).bind(this));\n return this.createCalendar(result);\n }, _createCalendarFromConfig: function(config2) {\n var apiCore = new CalendarWorkTimeStrategy(this.$gantt, calendarArgumentsHelper(this.$gantt));\n apiCore.id = String(uid());\n var preparedConfig = this._convertWorkTimeSettings(config2);\n if (preparedConfig.customWeeks) {\n for (var i in preparedConfig.customWeeks) {\n preparedConfig.customWeeks[i] = this._convertWorkTimeSettings(preparedConfig.customWeeks[i]);\n }\n }\n apiCore._setConfig(preparedConfig);\n return apiCore;\n }, createCalendar: function(parentCalendar) {\n var settings;\n if (!parentCalendar) {\n parentCalendar = {};\n }\n if (parentCalendar.getConfig) {\n settings = copy(parentCalendar.getConfig());\n } else if (parentCalendar.worktime) {\n settings = copy(parentCalendar.worktime);\n } else {\n settings = copy(parentCalendar);\n }\n var defaults = copy(this.defaults.fulltime.worktime);\n mixin(settings, defaults);\n return this._createCalendarFromConfig(settings);\n }, getCalendar: function(id) {\n id = id || \"global\";\n var calendar = this._calendars[id];\n if (!calendar) {\n this.createDefaultCalendars();\n calendar = this._calendars[id];\n }\n return calendar;\n }, getCalendars: function() {\n var res = [];\n for (var i in this._calendars) {\n res.push(this.getCalendar(i));\n }\n return res;\n }, _getOwnCalendar: function(task) {\n var config2 = this.$gantt.config;\n if (task[config2.calendar_property]) {\n return this.getCalendar(task[config2.calendar_property]);\n }\n if (config2.resource_calendars) {\n var calendar;\n var calendarId;\n var resourceProperty;\n if (this._legacyConfig === false) {\n resourceProperty = config2.resource_property;\n } else {\n resourceProperty = legacyResourceCalendarConfig.getResourceProperty(config2);\n }\n if (Array.isArray(task[resourceProperty]) && task[resourceProperty].length) {\n if (config2.dynamic_resource_calendars) {\n calendarId = dynamicResourceCalendars.getCalendarIdFromMultipleResources(task[resourceProperty], this);\n } else {\n calendar = this.getResourceCalendar(task[resourceProperty]);\n }\n } else {\n if (this._legacyConfig === void 0) {\n this._legacyConfig = legacyResourceCalendarConfig.isLegacyResourceCalendarFormat(config2.resource_calendars);\n }\n if (this._legacyConfig) {\n var calendarId = legacyResourceCalendarConfig.getCalendarIdFromLegacyConfig(task, config2.resource_calendars);\n } else if (resourceProperty && task[resourceProperty] && config2.resource_calendars[task[resourceProperty]]) {\n var calendar = this.getResourceCalendar(task[resourceProperty]);\n }\n }\n if (calendarId) {\n calendar = this.getCalendar(calendarId);\n }\n if (calendar) {\n return calendar;\n }\n }\n return null;\n }, getResourceCalendar: function(resource) {\n if (resource === null || resource === void 0) {\n return this.getCalendar();\n }\n var resourceId = null;\n if (typeof resource === \"number\" || typeof resource === \"string\") {\n resourceId = resource;\n } else {\n resourceId = resource.id || resource.key;\n }\n var config2 = this.$gantt.config;\n var calendarsConfig = config2.resource_calendars;\n var calendarId = null;\n if (Array.isArray(resource)) {\n if (resource.length === 1) {\n if (typeof resource[0] === \"object\") {\n resourceId = resource[0].resource_id;\n } else {\n resourceId = resource[0];\n }\n }\n }\n if (calendarsConfig) {\n if (this._legacyConfig === void 0) {\n this._legacyConfig = legacyResourceCalendarConfig.isLegacyResourceCalendarFormat(config2.resource_calendars);\n }\n if (this._legacyConfig) {\n for (var field in calendarsConfig) {\n if (calendarsConfig[field][resourceId]) {\n calendarId = calendarsConfig[field][resourceId];\n break;\n }\n }\n } else {\n var calendarId = calendarsConfig[resourceId];\n }\n if (calendarId) {\n return this.getCalendar(calendarId);\n }\n }\n return this.getCalendar();\n }, getTaskCalendar: function(task) {\n var gantt2 = this.$gantt;\n var taskObject;\n if (task === null || task === void 0) {\n return this.getCalendar();\n }\n if ((typeof task === \"number\" || typeof task === \"string\") && gantt2.isTaskExists(task)) {\n taskObject = gantt2.getTask(task);\n } else {\n taskObject = task;\n }\n if (!taskObject) {\n return this.getCalendar();\n }\n var calendar = this._getOwnCalendar(taskObject);\n var groupMode = !!gantt2.getState().group_mode;\n if (!calendar && gantt2.config.inherit_calendar && gantt2.isTaskExists(taskObject.parent)) {\n var currentTask = taskObject;\n while (gantt2.isTaskExists(currentTask.parent)) {\n currentTask = gantt2.getTask(currentTask.parent);\n if (gantt2.isSummaryTask(currentTask)) {\n calendar = this._getOwnCalendar(currentTask);\n if (calendar) {\n break;\n }\n }\n }\n if (groupMode && !calendar) {\n if (task.$effective_calendar) {\n calendar = this.getCalendar(task.$effective_calendar);\n }\n }\n }\n return calendar || this.getCalendar();\n }, addCalendar: function(calendar) {\n if (!this.isCalendar(calendar)) {\n var id = calendar.id;\n calendar = this.createCalendar(calendar);\n calendar.id = id;\n }\n if (!calendar._tryChangeCalendarSettings(function() {\n })) {\n this.$gantt.callEvent(\"onCalendarError\", [{ message: \"Invalid calendar settings, no worktime available\" }, calendar]);\n return null;\n } else {\n var config2 = this.$gantt.config;\n calendar.id = calendar.id || uid();\n this._calendars[calendar.id] = calendar;\n if (!config2.worktimes) config2.worktimes = {};\n config2.worktimes[calendar.id] = calendar.getConfig();\n return calendar.id;\n }\n }, deleteCalendar: function(calendar) {\n var config2 = this.$gantt.config;\n if (!calendar) return false;\n if (this._calendars[calendar]) {\n delete this._calendars[calendar];\n if (config2.worktimes && config2.worktimes[calendar]) delete config2.worktimes[calendar];\n return true;\n } else {\n return false;\n }\n }, restoreConfigCalendars: function(configs) {\n for (var i in configs) {\n if (this._calendars[i]) continue;\n var settings = configs[i];\n var calendar = this.createCalendar(settings);\n calendar.id = i;\n this.addCalendar(calendar);\n }\n }, defaults: { global: { id: \"global\", worktime: { hours: [8, 12, 13, 17], days: [0, 1, 1, 1, 1, 1, 0] } }, fulltime: { id: \"fulltime\", worktime: { hours: [0, 24], days: [1, 1, 1, 1, 1, 1, 1] } } }, createDefaultCalendars: function() {\n var config2 = this.$gantt.config;\n this.restoreConfigCalendars(this.defaults);\n this.restoreConfigCalendars(config2.worktimes);\n }, isCalendar: function(possibleCalendar) {\n var props = [possibleCalendar.isWorkTime, possibleCalendar.setWorkTime, possibleCalendar.getWorkHours, possibleCalendar.unsetWorkTime, possibleCalendar.getClosestWorkTime, possibleCalendar.calculateDuration, possibleCalendar.hasDuration, possibleCalendar.calculateEndDate];\n return props.every(function(entry) {\n return entry instanceof Function;\n });\n } };\n function CalendarDisabledTimeStrategy(gantt2, argumentsHelper) {\n this.argumentsHelper = argumentsHelper;\n this.$gantt = gantt2;\n }\n CalendarDisabledTimeStrategy.prototype = { getWorkHours: function() {\n return [0, 24];\n }, setWorkTime: function() {\n return true;\n }, unsetWorkTime: function() {\n return true;\n }, isWorkTime: function() {\n return true;\n }, getClosestWorkTime: function(config2) {\n var config2 = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);\n return config2.date;\n }, calculateDuration: function() {\n var config2 = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n var from = config2.start_date, to = config2.end_date, unit = config2.unit, step = config2.step;\n return this._calculateDuration(from, to, unit, step);\n }, _calculateDuration: function(start, end, unit, step) {\n var dateHelper = this.$gantt.date;\n var fixedUnits = { week: 1e3 * 60 * 60 * 24 * 7, day: 1e3 * 60 * 60 * 24, hour: 1e3 * 60 * 60, minute: 1e3 * 60 };\n var res = 0;\n if (fixedUnits[unit]) {\n res = Math.round((end - start) / (step * fixedUnits[unit]));\n } else {\n var from = new Date(start), to = new Date(end);\n while (from.valueOf() < to.valueOf()) {\n res += 1;\n from = dateHelper.add(from, step, unit);\n }\n if (from.valueOf() != end.valueOf()) {\n res += (to - from) / (dateHelper.add(from, step, unit) - from);\n }\n }\n return Math.round(res);\n }, hasDuration: function() {\n var config2 = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n var from = config2.start_date, to = config2.end_date, unit = config2.unit;\n if (!unit) {\n return false;\n }\n from = new Date(from);\n to = new Date(to);\n return from.valueOf() < to.valueOf();\n }, hasWorkTime: function() {\n return true;\n }, equals: function(calendar) {\n if (!(calendar instanceof CalendarDisabledTimeStrategy)) {\n return false;\n }\n return true;\n }, calculateEndDate: function() {\n var config2 = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);\n var start = config2.start_date, duration = config2.duration, unit = config2.unit, step = config2.step;\n return this.$gantt.date.add(start, step * duration, unit);\n } };\n function TimeCalculator(calendarManager) {\n this.$gantt = calendarManager.$gantt;\n this.argumentsHelper = calendarArgumentsHelper(this.$gantt);\n this.calendarManager = calendarManager;\n this.$disabledCalendar = new CalendarDisabledTimeStrategy(this.$gantt, this.argumentsHelper);\n }\n TimeCalculator.prototype = { _getCalendar: function(config2) {\n var calendar;\n if (!this.$gantt.config.work_time) {\n calendar = this.$disabledCalendar;\n } else {\n var manager = this.calendarManager;\n if (config2.task) {\n calendar = manager.getTaskCalendar(config2.task);\n } else if (config2.id) {\n calendar = manager.getTaskCalendar(config2);\n } else if (config2.calendar) {\n calendar = config2.calendar;\n }\n if (!calendar) {\n calendar = manager.getTaskCalendar();\n }\n }\n return calendar;\n }, getWorkHours: function(config2) {\n config2 = this.argumentsHelper.getWorkHoursArguments.apply(this.argumentsHelper, arguments);\n var calendar = this._getCalendar(config2);\n return calendar.getWorkHours(config2.date);\n }, setWorkTime: function(config2, calendar) {\n config2 = this.argumentsHelper.setWorkTimeArguments.apply(this.argumentsHelper, arguments);\n if (!calendar) calendar = this.calendarManager.getCalendar();\n return calendar.setWorkTime(config2);\n }, unsetWorkTime: function(config2, calendar) {\n config2 = this.argumentsHelper.unsetWorkTimeArguments.apply(this.argumentsHelper, arguments);\n if (!calendar) calendar = this.calendarManager.getCalendar();\n return calendar.unsetWorkTime(config2);\n }, isWorkTime: function(date2, unit, task, calendar) {\n var config2 = this.argumentsHelper.isWorkTimeArguments.apply(this.argumentsHelper, arguments);\n calendar = this._getCalendar(config2);\n return calendar.isWorkTime(config2);\n }, getClosestWorkTime: function(config2) {\n config2 = this.argumentsHelper.getClosestWorkTimeArguments.apply(this.argumentsHelper, arguments);\n var calendar = this._getCalendar(config2);\n return calendar.getClosestWorkTime(config2);\n }, calculateDuration: function() {\n var config2 = this.argumentsHelper.getDurationArguments.apply(this.argumentsHelper, arguments);\n var calendar = this._getCalendar(config2);\n return calendar.calculateDuration(config2);\n }, hasDuration: function() {\n var config2 = this.argumentsHelper.hasDurationArguments.apply(this.argumentsHelper, arguments);\n var calendar = this._getCalendar(config2);\n return calendar.hasDuration(config2);\n }, calculateEndDate: function(config2) {\n var config2 = this.argumentsHelper.calculateEndDateArguments.apply(this.argumentsHelper, arguments);\n var calendar = this._getCalendar(config2);\n return calendar.calculateEndDate(config2);\n } };\n var createWorkTimeFacade = function(calendarManager, timeCalculator) {\n return { getWorkHours: function(date2) {\n return timeCalculator.getWorkHours(date2);\n }, setWorkTime: function(config2) {\n return timeCalculator.setWorkTime(config2);\n }, unsetWorkTime: function(config2) {\n timeCalculator.unsetWorkTime(config2);\n }, isWorkTime: function(date2, unit, task) {\n return timeCalculator.isWorkTime(date2, unit, task);\n }, getClosestWorkTime: function(config2) {\n return timeCalculator.getClosestWorkTime(config2);\n }, calculateDuration: function(start_date, end_date, task) {\n return timeCalculator.calculateDuration(start_date, end_date, task);\n }, _hasDuration: function(start_date, end_date, task) {\n return timeCalculator.hasDuration(start_date, end_date, task);\n }, calculateEndDate: function(start, duration, unit, task) {\n return timeCalculator.calculateEndDate(start, duration, unit, task);\n }, mergeCalendars: bind(calendarManager.mergeCalendars, calendarManager), createCalendar: bind(calendarManager.createCalendar, calendarManager), addCalendar: bind(calendarManager.addCalendar, calendarManager), getCalendar: bind(calendarManager.getCalendar, calendarManager), getCalendars: bind(calendarManager.getCalendars, calendarManager), getResourceCalendar: bind(calendarManager.getResourceCalendar, calendarManager), getTaskCalendar: bind(calendarManager.getTaskCalendar, calendarManager), deleteCalendar: bind(calendarManager.deleteCalendar, calendarManager) };\n };\n const worktimeFacadeFactory = { create: createWorkTimeFacade };\n function work_time(gantt2) {\n var manager = new CalendarManager(gantt2), timeCalculator = new TimeCalculator(manager);\n var facade = worktimeFacadeFactory.create(manager, timeCalculator);\n mixin(gantt2, facade);\n }\n\nexport { work_time };\nexport default { work_time };\n","// ============================================================================\n// locale.js — Locale por defecto (inglés) para parseo de fechas\n// Mínimo necesario para que el módulo date funcione\n// ============================================================================\n\nconst defaultLocale = {\n date: {\n month_full: [\"January\", \"February\", \"March\", \"April\", \"May\", \"June\",\n \"July\", \"August\", \"September\", \"October\", \"November\", \"December\"],\n month_short: [\"Jan\", \"Feb\", \"Mar\", \"Apr\", \"May\", \"Jun\",\n \"Jul\", \"Aug\", \"Sep\", \"Oct\", \"Nov\", \"Dec\"],\n day_full: [\"Sunday\", \"Monday\", \"Tuesday\", \"Wednesday\", \"Thursday\", \"Friday\", \"Saturday\"],\n day_short: [\"Sun\", \"Mon\", \"Tue\", \"Wed\", \"Thu\", \"Fri\", \"Sat\"],\n },\n labels: {},\n};\n\nexport { defaultLocale };\nexport default { defaultLocale };\n","// ============================================================================\n// shim.js — Construye el objeto \"gantt\" falso que el código copiado espera\n// Único archivo NUEVO. Todo lo demás es copia verbatim.\n// ============================================================================\n\nimport * as utils from './utils.js';\nimport { date } from './formatters-and-date.js';\nimport { work_time } from './calendar-module.js';\nimport { defaultLocale } from './locale.js';\n\nfunction createGanttShim(options = {}) {\n const userConfig = options.config || {};\n\n const shim = {\n // ------ Config ------\n config: Object.assign({\n // Defaults críticos para calendar\n duration_unit: \"hour\",\n duration_step: 1,\n work_time: false,\n worktimes: {},\n work_days: null,\n inherit_calendar: false,\n calendar_property: \"calendar_id\",\n resource_property: \"resource_id\",\n resource_calendars: {},\n dynamic_resource_calendars: false,\n // Config date module\n start_on_monday: true,\n server_utc: true,\n csp: \"auto\",\n show_errors: false,\n }, userConfig),\n\n // ------ Locale + templates ------\n locale: options.locale || defaultLocale,\n templates: options.templates || {},\n\n // ------ Task resolver (opcional) ------\n getTask: options.getTask || function(id) { return null; },\n isTaskExists: options.isTaskExists || function(id) { return false; },\n isSummaryTask: options.isSummaryTask || function(task) { return false; },\n\n // ------ State (mínimo) ------\n getState: function() { return { group_mode: false }; },\n\n // ------ Eventable (no-ops por defecto) ------\n callEvent: function(name, args) {\n const handler = options.onEvent;\n if (handler) handler(name, args);\n return true;\n },\n attachEvent: function() { return 0; },\n checkEvent: function() { return false; },\n detachEvent: function() {},\n\n // ------ Utils expuestas en gantt2 ------\n defined: utils.defined,\n mixin: utils.mixin,\n copy: utils.copy,\n assert: function(cond, msg) {\n if (!cond) {\n if (options.throwOnAssert) throw new Error(\"[calendar] \" + msg);\n else if (options.silent !== true) console.error(\"[calendar]\", msg);\n }\n },\n\n // ------ $services / $ui — stubs minimales para evitar cracks ------\n $services: { getService: function() { return null; } },\n $ui: { getView: function() { return null; } },\n };\n\n // DST correction is a no-op in UTC: the wall clock never jumps when\n // every read goes through getUTC*. Kept around as a no-op so any\n // legacy caller that still references it does not crash.\n shim._correct_dst_change = function(date2) {\n return date2;\n };\n\n // ------ Wire date module ------\n shim.date = date(shim);\n shim.date.init(); // build month_short_hash etc\n\n // ------ Wire calendar module — esto agrega addCalendar/isWorkTime/etc al shim ------\n work_time(shim);\n\n return shim;\n}\n\nexport { createGanttShim };\nexport default { createGanttShim };\n","// ============================================================================\n// index.js — API pública de la librería standalone calendar\n// ============================================================================\n\nimport { createGanttShim } from './shim.js';\n\n/**\n * Crea una instancia standalone del sistema de calendarios extraído de DHTMLX Gantt 9.1.3.\n *\n * @param {Object} [options]\n * @param {Object} [options.config] - overrides de gantt.config (duration_unit, start_on_monday, etc)\n * @param {Object} [options.locale] - locale custom (defaults: inglés)\n * @param {Function} [options.getTask] - resolver de tasks por ID (solo si usas inherit_calendar)\n * @param {Function} [options.isTaskExists]\n * @param {Function} [options.isSummaryTask]\n * @param {Function} [options.onEvent] - callback opcional para eventos internos (ej. onCalendarError)\n * @param {boolean} [options.silent] - silencia logs de assert\n *\n * @returns {Object} API pública\n */\nfunction createCalendar(options = {}) {\n const shim = createGanttShim(options);\n\n return {\n // ------ Gestión de calendarios ------\n addCalendar: function(c) { return shim.addCalendar(c); },\n deleteCalendar: function(id) { return shim.deleteCalendar(id); },\n getCalendar: function(id) { return shim.getCalendar(id); },\n getCalendars: function() { return shim.getCalendars(); },\n mergeCalendars: function() { return shim.mergeCalendars.apply(shim, arguments); },\n getTaskCalendar: function(t) { return shim.getTaskCalendar(t); },\n getResourceCalendar: function(r) { return shim.getResourceCalendar(r); },\n\n // ------ Cálculo (también disponible en cada Calendar instance) ------\n setWorkTime: function(c) { return shim.setWorkTime(c); },\n unsetWorkTime: function(c) { return shim.unsetWorkTime(c); },\n isWorkTime: function() { return shim.isWorkTime.apply(shim, arguments); },\n getClosestWorkTime: function() { return shim.getClosestWorkTime.apply(shim, arguments); },\n getWorkHours: function() { return shim.getWorkHours.apply(shim, arguments); },\n calculateDuration: function() { return shim.calculateDuration.apply(shim, arguments); },\n calculateEndDate: function() { return shim.calculateEndDate.apply(shim, arguments); },\n\n // ------ Para inspección/debug ------\n _internals: shim,\n };\n}\n\nexport { createCalendar };\nexport default { createCalendar };\n","/**\n * Port implementations (ActivityReader, CalendarReader, HierarchyReader)\n * backed by `ScheduleState`. These are the real state-backed adapters the\n * column pipelines read through (`pipeline-context.ts`), NOT test mocks —\n * they wrap the live `ScheduleState` and convert to the column snapshot shape.\n *\n * Two calendar personalities live here:\n *\n * - `buildCalendarAPI` — simplified M-F 08-16 UTC math (no work-calendar\n * engine). Used by synthetic paths where exact work-time fidelity is not\n * required.\n *\n * - `createCalendarSetup` — real work-calendar engine (`calendarPkg`).\n * Used by the replay path: loads calendars from a recorded snapshot so\n * scheduling and column pipelines see the same work-time as production.\n */\n\nimport { Queue } from '../../shared/queue.js';\nimport type { CalendarUnit, WorkTimeDirection } from '../../types.js';\nimport { WORK_TIME_DIRECTION } from '../../types.js';\nimport type {\n ActivityId as ColumnActivityId,\n ActivitySnapshot as ColumnActivitySnapshot,\n CalendarId as ColumnCalendarId,\n ConstraintType as ColumnConstraintType,\n ActivityType as ColumnActivityType\n} from '../../columns/types.js';\nimport type {\n ColumnActivityReader,\n CalendarAPI,\n CalendarReader,\n ChildCostInfo,\n ChildHhInfo,\n ChildProgressInfo,\n ChildUsedCostInfo,\n HierarchyReader,\n WorkTimeQuery\n} from '../../columns/types.js';\nimport type { ActivityId } from '../../types.js';\nimport type {\n ActivityId as EngineActivityId,\n EngineActivitySnapshot\n} from '../../autoscheduler/types.js';\nimport type { ActivityReader } from './roles.js';\n\n/** Milliseconds per hour — single shared owner for internal/state time math. */\nexport const MS_PER_HOUR = 3600 * 1000;\n\n// ---------------------------------------------------------------------------\n// Activity reader\n// ---------------------------------------------------------------------------\n\nexport function createStateBackedActivityReader(\n adapter: ActivityReader\n): ColumnActivityReader {\n return {\n getActivity(id: ColumnActivityId): Readonly<ColumnActivitySnapshot> | null {\n const a = adapter.getActivity(id as ActivityId);\n if (!a) return null;\n return convertToColumnSnapshot(a, adapter);\n }\n };\n}\n\nfunction convertToColumnSnapshot(\n a: EngineActivitySnapshot,\n adapter: ActivityReader\n): ColumnActivitySnapshot {\n const hasChildren = adapter.getChildren(a.id).length > 0;\n return {\n id: String(a.id),\n text: String(a.text ?? ''),\n description: String(a.description ?? ''),\n type: (a.type ?? 'task') as ColumnActivityType,\n start_date: a.start_date,\n end_date: a.end_date,\n duration: Number(a.duration ?? 0),\n progress: Number(a.progress ?? 0),\n constraint_type: (a.constraint_type ?? 'asap') as ColumnConstraintType,\n constraint_date: a.constraint_date ?? null,\n calendar_id: String(a.calendar_id ?? ''),\n cost: Number(a.cost ?? 0),\n used_cost: Number(a.used_cost ?? 0),\n hhWorkTime: Number(a.hhWorkTime ?? 0),\n ponderator: Number(a.ponderator ?? 0),\n auto_scheduling: Boolean(a.auto_scheduling ?? true),\n hasChildren,\n hasLookaheadTasks: Array.isArray(a.tasks) && a.tasks.length > 0,\n isMilestone: a.type === 'milestone',\n real_constraint_type: a.real_constraint_type ?? null,\n last_constraint: a.last_constraint ?? null,\n last_constraint_date: a.last_constraint_date ?? null,\n last_start_date: a.last_start_date ?? null,\n date_origin: a.date_origin ?? null\n };\n}\n\n// ---------------------------------------------------------------------------\n// Calendar reader — simplified 24/7, honoring a snapshot-derived workday\n// ---------------------------------------------------------------------------\n\ninterface CalendarDefinition {\n id: ColumnCalendarId;\n /** Hours per working day (default 8) */\n hoursPerDay?: number;\n /** Which week-days are working (Sun=0 ... Sat=6). Default: M-F */\n workDays?: boolean[];\n /** Working hour range within a day [start, end] in hours (default 8..16) */\n workHourRange?: [number, number];\n}\n\n/**\n * Exposed for reuse from `ScheduleState.getClosestWorkTime` etc.\n * The adapter and the column-pipeline CalendarReader share the same\n * calendar math so the scheduler and pipelines see consistent work hours.\n */\nexport { buildCalendarAPI };\n\nfunction buildCalendarAPI(def: CalendarDefinition): CalendarAPI {\n const workDays = def.workDays ?? [false, true, true, true, true, true, false];\n const range = def.workHourRange ?? [8, 16];\n\n // Calendar math is UTC-based to eliminate timezone flakiness. Real\n // production calendars run on local time, but tests run deterministically.\n function isWorkDay(d: Date): boolean {\n // `?? false` only types the indexed access (noUncheckedIndexedAccess);\n // getUTCDay() is always 0..6, so the fallback is unreachable.\n return workDays[d.getUTCDay()] ?? false;\n }\n\n function snap(date: Date, direction: WorkTimeDirection): Date {\n const d = new Date(date);\n // Single loop: keep advancing until we're inside working hours on a\n // working day. Each time we cross a day boundary we reset hours to\n // the start (future) or end (past) of the workday, so we never end up\n // at 22:00 the following day just because the original time was 22:00.\n if (direction === WORK_TIME_DIRECTION.FUTURE) {\n while (true) {\n if (!isWorkDay(d)) {\n d.setUTCDate(d.getUTCDate() + 1);\n d.setUTCHours(range[0], 0, 0, 0);\n continue;\n }\n if (d.getUTCHours() >= range[1]) {\n d.setUTCDate(d.getUTCDate() + 1);\n d.setUTCHours(range[0], 0, 0, 0);\n continue;\n }\n if (d.getUTCHours() < range[0]) {\n d.setUTCHours(range[0], 0, 0, 0);\n continue;\n }\n break;\n }\n } else {\n while (true) {\n if (!isWorkDay(d)) {\n d.setUTCDate(d.getUTCDate() - 1);\n d.setUTCHours(range[1], 0, 0, 0);\n continue;\n }\n // `< range[0]` (NOT `<=`): the exact start-of-workday hour is a\n // working moment (left-inclusive interval `[range[0], range[1])`).\n // Using `<=` here was a bug that shifted start-of-workday edits\n // backward to the end of the PREVIOUS working day, which broke\n // SNLT when constraint_date == start_date == range[0].\n if (d.getUTCHours() < range[0]) {\n d.setUTCDate(d.getUTCDate() - 1);\n d.setUTCHours(range[1], 0, 0, 0);\n continue;\n }\n if (d.getUTCHours() > range[1]) {\n d.setUTCHours(range[1], 0, 0, 0);\n continue;\n }\n break;\n }\n }\n return d;\n }\n\n return {\n getClosestWorkTime(query: WorkTimeQuery): Date {\n return snap(query.date, query.direction);\n },\n calculateEndDate(start: Date, durationHours: number): Date {\n if (durationHours === 0) return new Date(start);\n if (durationHours > 0) {\n // Forward: advance through work time until we've consumed duration\n const d = new Date(start);\n let remaining = durationHours;\n while (remaining > 0) {\n if (!isWorkDay(d)) {\n d.setUTCDate(d.getUTCDate() + 1);\n d.setUTCHours(range[0], 0, 0, 0);\n continue;\n }\n const endOfWorkDay = new Date(d);\n endOfWorkDay.setUTCHours(range[1], 0, 0, 0);\n const availableHoursToday =\n (endOfWorkDay.getTime() - d.getTime()) / MS_PER_HOUR;\n if (availableHoursToday <= 0) {\n d.setUTCDate(d.getUTCDate() + 1);\n d.setUTCHours(range[0], 0, 0, 0);\n continue;\n }\n if (remaining <= availableHoursToday) {\n return new Date(d.getTime() + remaining * MS_PER_HOUR);\n }\n remaining -= availableHoursToday;\n d.setUTCDate(d.getUTCDate() + 1);\n d.setUTCHours(range[0], 0, 0, 0);\n }\n return d;\n }\n // Backward: retreat through work time (used by CP backward-path for\n // `ls = lf - duration` math). Mirror of the forward branch.\n const d = new Date(start);\n let remaining = -durationHours;\n while (remaining > 0) {\n if (!isWorkDay(d)) {\n d.setUTCDate(d.getUTCDate() - 1);\n d.setUTCHours(range[1], 0, 0, 0);\n continue;\n }\n const startOfWorkDay = new Date(d);\n startOfWorkDay.setUTCHours(range[0], 0, 0, 0);\n const availableHoursToday =\n (d.getTime() - startOfWorkDay.getTime()) / MS_PER_HOUR;\n if (availableHoursToday <= 0) {\n d.setUTCDate(d.getUTCDate() - 1);\n d.setUTCHours(range[1], 0, 0, 0);\n continue;\n }\n if (remaining <= availableHoursToday) {\n return new Date(d.getTime() - remaining * MS_PER_HOUR);\n }\n remaining -= availableHoursToday;\n d.setUTCDate(d.getUTCDate() - 1);\n d.setUTCHours(range[1], 0, 0, 0);\n }\n return d;\n },\n calculateDuration(start: Date, end: Date): number {\n const a = new Date(start);\n const b = new Date(end);\n let hours = 0;\n const cursor = new Date(a);\n while (cursor < b) {\n if (isWorkDay(cursor)) {\n const endOfDay = new Date(cursor);\n endOfDay.setUTCHours(range[1], 0, 0, 0);\n const chunkEnd = b < endOfDay ? b : endOfDay;\n const delta = (chunkEnd.getTime() - cursor.getTime()) / MS_PER_HOUR;\n if (delta > 0) hours += delta;\n }\n cursor.setUTCDate(cursor.getUTCDate() + 1);\n cursor.setUTCHours(range[0], 0, 0, 0);\n }\n return hours;\n },\n isWorkTime(date: Date, unit: CalendarUnit): boolean {\n if (!isWorkDay(date)) return false;\n if (unit === 'day') return true;\n const h = date.getUTCHours();\n return h >= range[0] && h < range[1];\n },\n getWorkHours(date: Date): string[] {\n return isWorkDay(date) ? [`${range[0]}:00-${range[1]}:00`] : [];\n }\n };\n}\n\n// ---------------------------------------------------------------------------\n// Work-calendar–backed reader (replaces the simplified M-F 08-16 math above when wired)\n// ---------------------------------------------------------------------------\n\nimport {\n createWorkCalendarAdapter,\n type WorkCalendarInstance\n} from '../../calendar/adapter.js';\nimport type { SerializedCalendar } from '../../autoscheduler/recording-types.js';\n// eslint-disable-next-line import/extensions\nimport calendarPkg from '../../calendar/engine/index.js';\n\nconst { createCalendar } = calendarPkg as unknown as {\n createCalendar: (opts?: unknown) => WorkCalendarInstance & {\n addCalendar: (cfg: unknown) => unknown;\n };\n};\n\nexport const DEFAULT_CALENDAR_ID = '__replay_default__';\n\n/**\n * Convert a snapshot's `worktime.hours` into the string range format the\n * work-calendar package's `_parseHours` interprets as contiguous working\n * windows.\n *\n * Recorder shape: numeric arrays like `[6, 7, 8, 9, 10, 11, 12, 13]` where\n * each entry is a working-hour SLOT (interval `[H:00, H+1:00)`). Total\n * working hours per day = `length` (8 in the example).\n *\n * Work-calendar shape: number arrays are read as PAIRS of start/end\n * timestamps, so `[6, 7, 8, 9, ...]` would mean four disjoint 1-hour\n * windows (6→7, 8→9, ...). To preserve the recorder's intent we collapse\n * a contiguous slot array into a single `'HH:00-HH:00'` string. String\n * arrays pass through unchanged.\n */\nfunction normalizeWorktimeHours(\n hours: (string | number)[] | undefined\n): (string | number)[] | undefined {\n if (!hours || hours.length === 0) return hours;\n // String arrays are already in start-end range form.\n if (typeof hours[0] === 'string') return hours;\n\n const nums = hours.map(Number);\n if (nums.some((n) => Number.isNaN(n))) return hours;\n\n // Non-null: `hours.length === 0` already returned above, so nums is\n // non-empty — the assertions only narrow noUncheckedIndexedAccess.\n const first = nums[0]!;\n const last = nums[nums.length - 1]!;\n const isContiguous = nums.every((v, i) => v === first + i);\n if (!isContiguous) {\n // Unknown shape — fall back to the raw array; better to let\n // _parseHours surface a divergence than silently misinterpret it.\n return hours;\n }\n // Slot-encoded: [6..13] (8 slots) → window [06:00, 14:00).\n return [`${first}:00-${last + 1}:00`];\n}\nconst DEFAULT_WORKTIME = {\n // 08:00..16:00 UTC, Mon..Fri. Matches the prior buildCalendarAPI default\n // so synthetic fixtures (which don't include a `worktime` block) keep\n // producing the same hours.\n hours: ['8:00-16:00'] as (string | number)[],\n days: [false, true, true, true, true, true, false]\n};\n\ninterface SnapshotWorktime {\n hours?: (string | number)[];\n // Per-weekday: `false` non-working, `true` working w/ global hours, or\n // `string[]` this day's own windows. Mirrors `CalendarWorktime.days`.\n days?: Array<boolean | string[]>;\n dates?: Record<string, false | string[] | boolean>;\n customWeeks?: Record<string, unknown>;\n}\n\ninterface EngineWorktime {\n /** Optional: a snapshot without global hours lets the engine apply its\n * own default — `normalizeWorktimeHours(undefined)` passes through. */\n hours?: (string | number)[] | undefined;\n dates: Record<string, boolean | string[] | (string | number)[]>;\n customWeeks?: Record<string, unknown>;\n}\n\n/**\n * Translates our snapshot `worktime` shape into the form the underlying\n * work-calendar engine consumes.\n *\n * The engine merges day-of-week info AND per-date overrides into a single\n * `dates` object: numeric keys `0..6` (Sun..Sat) carry the weekday flag;\n * larger numeric keys (UTC midnight epoch ms) carry per-date overrides.\n *\n * If we pass BOTH `days: boolean[]` and `dates: {...}` separately, the\n * engine's `_convertWorkTimeSettings` skips the days→dates conversion\n * (see calendar/calendar-module.js line 1581: `else if (days && !settings.dates)`)\n * and the resulting calendar fails `hasWorkTime()` because the per-weekday\n * entries are missing. Merging here is the documented fix.\n */\nfunction toEngineWorktime(worktime: SnapshotWorktime): EngineWorktime {\n const merged: EngineWorktime['dates'] = {};\n if (Array.isArray(worktime.days)) {\n for (let i = 0; i < worktime.days.length; i += 1) {\n // Pass the per-weekday value straight through: `false` (non-working),\n // `true` (working with global hours), or `string[]` (this day's own\n // windows — short Friday, half-day Monday, etc). The engine's\n // `_parseHours` accepts all three; coercing to Boolean here would\n // flatten per-day variation and lose the day's specific hours.\n merged[i] = worktime.days[i] as boolean | string[];\n }\n }\n if (worktime.dates) {\n for (const [key, value] of Object.entries(worktime.dates)) {\n merged[key] = value as boolean | string[];\n }\n }\n\n const engine: EngineWorktime = {\n hours: normalizeWorktimeHours(worktime.hours),\n dates: merged\n };\n if (worktime.customWeeks) engine.customWeeks = worktime.customWeeks;\n return engine;\n}\n\n/**\n * Builds a work-calendar instance populated from a recorded snapshot, plus\n * a `CalendarReader` that falls back to a default calendar for unknown ids\n * (matching the simplified reader's behavior). Returns the underlying instance\n * too so the adapter can share it with the column-pipeline reader —\n * one engine, one source of truth per replay session.\n */\nexport interface CalendarSetup {\n reader: CalendarReader;\n}\n\nexport function createCalendarSetup(\n snapshotCalendars: SerializedCalendar[]\n): CalendarSetup {\n const instance = createCalendar({ config: { work_time: true } });\n instance.addCalendar({\n id: DEFAULT_CALENDAR_ID,\n worktime: DEFAULT_WORKTIME\n });\n for (const c of snapshotCalendars) {\n instance.addCalendar({\n id: c.id,\n worktime: c.worktime ? toEngineWorktime(c.worktime) : DEFAULT_WORKTIME\n });\n }\n\n const baseAdapter = createWorkCalendarAdapter(instance);\n const defaultCalendarAPI = baseAdapter.getCalendar(DEFAULT_CALENDAR_ID);\n if (!defaultCalendarAPI) {\n throw new Error(\n '[replay-calendar] default calendar failed to register in work-calendar instance'\n );\n }\n\n // The work-calendar engine's `getCalendar(id)` falls back to its OWN built-in\n // `global` calendar for any unregistered id (DHTMLX heritage: `id || \"global\"`,\n // engine calendar-module.js:1639) — it NEVER returns null. That global\n // differs from our `__replay_default__` (M-F 08-16), so delegating blindly\n // would silently mis-resolve unknown ids. Restrict engine lookups to the ids\n // we actually registered (the default sentinel + every snapshot calendar, incl.\n // the `-base` variants merged in by build-state-snapshot); everything else\n // falls back to `__replay_default__` — exactly the old `calendarAPIs` Map\n // semantics (`calendarAPIs.get(id) ?? defaultCalendarAPI`).\n const registeredIds = new Set<string>([DEFAULT_CALENDAR_ID]);\n for (const c of snapshotCalendars) registeredIds.add(String(c.id));\n\n // Cache the wrapped CalendarAPI per id: baseAdapter.getCalendar rebuilds a\n // fresh CalendarAPI (5 closures) on every call, so without this the reader\n // would re-wrap on each access. Calendars are immutable for the session, so\n // caching id → CalendarAPI is safe and makes getCalendar O(1) after the\n // first hit.\n const calendarCache = new Map<string, CalendarAPI>();\n const reader: CalendarReader = {\n getCalendar(id) {\n const key = String(id);\n const cached = calendarCache.get(key);\n if (cached) return cached;\n const api = registeredIds.has(key)\n ? (baseAdapter.getCalendar(id) ?? defaultCalendarAPI)\n : defaultCalendarAPI;\n calendarCache.set(key, api);\n return api;\n }\n };\n\n return { reader };\n}\n\n// ---------------------------------------------------------------------------\n// Hierarchy reader\n// ---------------------------------------------------------------------------\n\nexport function createStateBackedHierarchyReader(\n adapter: ActivityReader\n): HierarchyReader {\n return {\n getParentStartDateIfHasPredecessors(\n activityId: ColumnActivityId\n ): Date | null {\n const activity = adapter.getActivity(activityId as ActivityId);\n if (!activity) return null;\n const parent = adapter.getParent(activity.id);\n if (!parent) return null;\n // \"has predecessors\" = parent has incoming links ($target not empty)\n if (parent.$target.length === 0) return null;\n return parent.start_date;\n },\n getDescendantIds(activityId: ColumnActivityId): ColumnActivityId[] {\n // String(...) normalizes the engine's string|number ids to the\n // column-pipeline string ids (state ids are hydrated as strings).\n return collectDescendantIdsBFS(adapter, activityId as ActivityId).map(\n (id) => String(id)\n );\n },\n getAncestorIds(activityId: ColumnActivityId): ColumnActivityId[] {\n const ancestors: ColumnActivityId[] = [];\n let current = adapter.getActivity(activityId as ActivityId);\n while (current) {\n const parentRaw = current.parent;\n if (!parentRaw || parentRaw === '0') break;\n const parent = adapter.getActivity(parentRaw);\n if (!parent) break;\n // String(...) normalizes the engine's string|number id to the\n // column-pipeline string id (state ids are hydrated as strings).\n ancestors.push(String(parentRaw));\n current = parent;\n }\n return ancestors;\n },\n getChildProgressInfo(\n parentId: ColumnActivityId\n ): ReadonlyArray<ChildProgressInfo> {\n const childIds = adapter.getChildren(parentId as ActivityId);\n return childIds.map((id) => {\n const child = adapter.getActivity(id) as\n | (EngineActivitySnapshot & Record<string, unknown>)\n | null;\n return {\n id: id as ColumnActivityId,\n progress: Number(child?.progress ?? 0),\n ponderator: Number(child?.ponderator ?? 0)\n };\n });\n },\n getChildHhInfo(parentId: ColumnActivityId): ReadonlyArray<ChildHhInfo> {\n const childIds = adapter.getChildren(parentId as ActivityId);\n return childIds.map((id) => {\n const child = adapter.getActivity(id) as\n | (EngineActivitySnapshot & Record<string, unknown>)\n | null;\n return {\n id: id as ColumnActivityId,\n hhWorkTime: Number(child?.hhWorkTime ?? 0),\n progress: Number(child?.progress ?? 0)\n };\n });\n },\n getChildUsedCostInfo(\n parentId: ColumnActivityId\n ): ReadonlyArray<ChildUsedCostInfo> {\n const childIds = adapter.getChildren(parentId as ActivityId);\n return childIds.map((id) => {\n const child = adapter.getActivity(id) as\n | (EngineActivitySnapshot & Record<string, unknown>)\n | null;\n return {\n id: id as ColumnActivityId,\n used_cost: Number(child?.used_cost ?? 0)\n };\n });\n },\n getChildCostInfo(parentId: ColumnActivityId): ReadonlyArray<ChildCostInfo> {\n const childIds = adapter.getChildren(parentId as ActivityId);\n return childIds.map((id) => {\n const child = adapter.getActivity(id) as\n | (EngineActivitySnapshot & Record<string, unknown>)\n | null;\n return {\n id: id as ColumnActivityId,\n cost: Number(child?.cost ?? 0)\n };\n });\n }\n };\n}\n\nfunction collectDescendantIdsBFS(\n adapter: ActivityReader,\n rootId: ActivityId\n): EngineActivityId[] {\n const result: EngineActivityId[] = [];\n const queue = new Queue<EngineActivityId>();\n for (const childId of adapter.getChildren(rootId)) queue.enqueue(childId);\n while (!queue.isEmpty()) {\n const id = queue.dequeue()!;\n result.push(id);\n for (const childId of adapter.getChildren(id)) queue.enqueue(childId);\n }\n return result;\n}\n","/**\n * Builds a column-pipeline PipelineContext backed by a ScheduleState\n * + an optional set of calendar definitions derived from a StateSnapshot.\n */\n\nimport { DEFAULT_HOURS_PER_DAY } from '../../constants/workday.js';\nimport type { PipelineContext } from '../../columns/types.js';\nimport type { ActivityReader, CalendarOps } from './roles.js';\nimport {\n createStateBackedActivityReader,\n createStateBackedHierarchyReader\n} from './state-ports.js';\n\ninterface ReplayContextOptions {\n dateFormat?: string;\n customHours?: Record<string, unknown>;\n hoursPerDay?: number;\n inputUnit?: 'days' | 'hours';\n}\n\nexport function buildPipelineContext(\n adapter: ActivityReader & CalendarOps,\n options: ReplayContextOptions = {}\n): PipelineContext {\n return {\n // Same work-calendar engine instance used by the mock adapter so both\n // halves of the replay (auto-scheduler + column pipelines) agree on\n // working-time math.\n calendars: adapter.calendarReader,\n hierarchy: createStateBackedHierarchyReader(adapter),\n activityReader: createStateBackedActivityReader(adapter),\n dateFormat: options.dateFormat ?? 'YYYY-MM-DD',\n customHours: (options.customHours ?? {}) as PipelineContext['customHours'],\n hoursPerDay: options.hoursPerDay ?? DEFAULT_HOURS_PER_DAY,\n inputUnit: options.inputUnit ?? 'days'\n };\n}\n","import type { DispatchAction } from '../types.js';\nimport { resolveRunCriticalPath } from './derived-passes.js';\n\n// Per-column staleness policies live WITH their columns now\n// (column-owns-everything); the dispatch gate (`post-mutation.ts`) imports them\n// directly from there:\n// STRUCTURAL_KINDS_LEAVING_EXPECTED_PROGRESS_STALE\n// → columns/expected-progress/recompute-policy.ts\n// STRUCTURAL_KINDS_LEAVING_CRITICAL_PATH_STALE\n// → columns/critical-path/recompute-policy.ts\n// The GENERIC (cross-column) dispatch staleness branches are encoded once in\n// `derived-passes.ts`; this file keeps the public names stable.\n\nexport {\n NON_SCHEDULING_INLINE_COLUMNS,\n dispatchChangesProgress\n} from './derived-passes.js';\n\n/**\n * Does this dispatch recompute the critical path? The single authority for the\n * question, shared by the dispatch gate (`resolveDerivedPasses`) and the\n * bridge, which reads it to defer the CP out of the paint. Mirrors legacy: the\n * CP re-derives on any scheduling change, and is left STALE for prop-only\n * intents, the structural reparents (indent/outdent), and edits that touch only\n * non-scheduling columns.\n */\nexport function willRunCriticalPath(action: DispatchAction): boolean {\n return resolveRunCriticalPath(action);\n}\n","/**\n * UndoEntry — the inverse-application payload built once at the dispatch\n * choke-point. It carries:\n * - `changeSet`: the assembled diff (activities/links, before+after per field).\n * Derived/CP fields (earlyStart, is_critical, expected_progress, real_cost,\n * etc.) are captured here too because derived passes now run INSIDE the\n * write-capture window (Task 3+4) — no separate O(N) snapshot needed.\n *\n * Undo writes the `before` side into the model; redo writes the `after` side.\n * Both are flat memory writes — no scheduler / CP re-run (zero-recompute).\n *\n * NOTE (Wave 3a): only `updated` activity changes are inverted here. Created /\n * deleted activities (resurrection via B4 `__beforeSnap`) and link inversion\n * are the next increment — they throw loudly until then so an unsupported undo\n * never silently corrupts the model.\n */\n\nimport type {\n ActivityReader,\n ActivityWriter\n} from '../../internal/state/roles.js';\nimport type {\n EngineActivitySnapshot,\n LinkSnapshot\n} from '../../autoscheduler/types.js';\nimport type { Activity, Link } from '../../types.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport type { ChangeSet, DispatchAction, EntityChange } from '../types.js';\nimport { structuredCloneActivity } from '../shared/snapshots.js';\nimport {\n setActivityFieldDynamic,\n setLinkFieldDynamic\n} from '../../internal/state/dynamic-writes.js';\nimport { NON_SCHEDULING_INLINE_COLUMNS } from '../shared/staleness-policy.js';\nimport { snapshotToActivity, snapshotToLink } from '../conversion.js';\n\nexport interface UndoEntry {\n readonly changeSet: ChangeSet;\n /** Full pre-mutation rows of deleted activities, for resurrection on undo (B4). */\n readonly beforeSnap?: ReadonlyMap<string, EngineActivitySnapshot> | undefined;\n /** Incident links of deleted activities, for re-add on undo (B4). */\n readonly beforeLinks?: ReadonlyMap<string, LinkSnapshot> | undefined;\n /** Full post-mutation rows of created activities, for re-create on redo. */\n readonly afterSnap?: ReadonlyMap<string, EngineActivitySnapshot> | undefined;\n /** Created links, for re-add on redo. */\n readonly afterLinks?: ReadonlyMap<string, LinkSnapshot> | undefined;\n}\n\nexport function buildUndoEntry(\n changeSet: ChangeSet,\n beforeSnap?: ReadonlyMap<string, EngineActivitySnapshot>,\n beforeLinks?: ReadonlyMap<string, LinkSnapshot>,\n afterSnap?: ReadonlyMap<string, EngineActivitySnapshot>,\n afterLinks?: ReadonlyMap<string, LinkSnapshot>\n): UndoEntry {\n return { changeSet, beforeSnap, beforeLinks, afterSnap, afterLinks };\n}\n\n/**\n * Snapshot the post-mutation rows of every CREATED activity/link from the live\n * model at record time (they exist now; on redo they must be re-added). The\n * symmetric counterpart of B4's `__beforeSnap` for deleted rows.\n */\nexport function captureCreatedSnapshots(\n state: ActivityReader,\n changeSet: ChangeSet\n): {\n afterSnap: Map<string, EngineActivitySnapshot>;\n afterLinks: Map<string, LinkSnapshot>;\n} {\n const afterSnap = new Map<string, EngineActivitySnapshot>();\n const afterLinks = new Map<string, LinkSnapshot>();\n for (const ch of changeSet.activities) {\n if (ch.kind !== 'created') continue;\n const live = state.getActivity(String(ch.id));\n if (live) afterSnap.set(String(ch.id), structuredCloneActivity(live));\n }\n for (const ch of changeSet.links) {\n if (ch.kind !== 'created') continue;\n const live = state.getLink(String(ch.id));\n if (live) afterLinks.set(String(ch.id), { ...live });\n }\n return { afterSnap, afterLinks };\n}\n\n/**\n * Coalesce key for rapid same-cell typing (decision #4): consecutive inline\n * edits on the SAME activity + NON-scheduling column merge into one undo step.\n * Scheduling columns (dates/duration/constraint/calendar/progress) cascade, so\n * they always get their own step (key null).\n */\nexport function computeCoalesceKey(action: DispatchAction): string | null {\n if (action.kind !== 'inline-edit') return null;\n if (!NON_SCHEDULING_INLINE_COLUMNS.has(action.column)) return null;\n return `inline-edit:${String(action.activityId)}:${action.column}`;\n}\n\n/** Both entries must be a single updated activity, no links/resurrection. */\nfunction isSimpleInlineEntry(e: UndoEntry): boolean {\n return (\n e.changeSet.activities.length === 1 &&\n e.changeSet.activities[0]?.kind === 'updated' &&\n e.changeSet.links.length === 0 &&\n !e.beforeSnap?.size &&\n !e.afterSnap?.size\n );\n}\n\nexport function canCoalesce(top: UndoEntry, next: UndoEntry): boolean {\n if (!isSimpleInlineEntry(top) || !isSimpleInlineEntry(next)) return false;\n const topActivity = top.changeSet.activities[0];\n const nextActivity = next.changeSet.activities[0];\n return (\n !!topActivity &&\n !!nextActivity &&\n String(topActivity.id) === String(nextActivity.id)\n );\n}\n\n/**\n * Merge two coalescing entries into one: keep the EARLIEST before (top) and the\n * LATEST after (next), per field. So undoing the merged step jumps straight back\n * to the value before the typing burst started.\n */\nexport function mergeCoalesced(top: UndoEntry, next: UndoEntry): UndoEntry {\n const tc = top.changeSet.activities[0];\n const nc = next.changeSet.activities[0];\n // Callers gate via canCoalesce (single updated activity), so both exist.\n if (!tc || !nc) return next;\n const tf = tc.fields ?? {};\n const nf = nc.fields ?? {};\n const fields: Record<string, { before: unknown; after: unknown }> = {};\n for (const k of new Set([...Object.keys(tf), ...Object.keys(nf)])) {\n const topField = tf[k];\n const nextField = nf[k];\n fields[k] = {\n before: topField ? topField.before : nextField?.before,\n after: nextField ? nextField.after : topField?.after\n };\n }\n const changeSet: ChangeSet = {\n ...next.changeSet,\n activities: [{ ...nc, fields }]\n };\n // Derived fields now travel inside `fields` via the ChangeSet (Task 5).\n // The field-level merge above unifies them exactly like any other column.\n return buildUndoEntry(changeSet);\n}\n\n/** Prop-only actions (selection / visibility / sir-sync) never push an undo step. */\nexport function isUndoableAction(action: DispatchAction): boolean {\n return (\n action.kind !== 'selection-toggle' &&\n action.kind !== 'selection-replace' &&\n action.kind !== 'visibility-set' &&\n action.kind !== 'sir-sync'\n );\n}\n\n/**\n * Returns true when the entry's changes require a full tracker resync:\n * any created/deleted activity, or any updated activity with `custom_id` in fields.\n * prop-only updates without custom_id are safe to skip.\n * // ponytail: skip resync prop-only sin custom_id; tracker incremental si se mide caro en 100K\n */\nexport function needsResync(entry: UndoEntry): boolean {\n for (const change of entry.changeSet.activities) {\n if (change.kind === 'created' || change.kind === 'deleted') return true;\n if (\n change.kind === 'updated' &&\n change.fields &&\n COLUMN.CUSTOM_ID in change.fields\n )\n return true;\n }\n return false;\n}\n\n/**\n * Builds the inverse ChangeSet from a restored model (post-applyUndo or post-applyRedo).\n * For `updated`: reads the COMPLETE Activity/Link from the model via snapshotToActivity/Link.\n * For `deleted` (original): on undo (side='before') = resurrected → kind:'created'.\n * For `created` (original): on undo (side='before') = removed → kind:'deleted', after:null.\n * ALWAYS trackingEvents:[] and effects:[] (CRITICAL: no re-fire of Amplitude or SIR effects).\n */\nexport function buildInverseChangeSet(\n state: ActivityReader,\n entry: UndoEntry,\n side: 'before' | 'after'\n): ChangeSet {\n const activities: EntityChange<Activity>[] = [];\n const links: EntityChange<Link>[] = [];\n\n for (const change of entry.changeSet.activities) {\n const activityId = String(change.id);\n if (change.kind === 'updated') {\n const snapshot = state.getActivity(activityId);\n activities.push({\n id: activityId,\n kind: 'updated',\n after: snapshot ? snapshotToActivity(snapshot) : null\n });\n } else if (change.kind === 'deleted') {\n // Original delete: undo resurrects → created; redo re-deletes → deleted\n if (side === 'before') {\n const snapshot = state.getActivity(activityId);\n activities.push({\n id: activityId,\n kind: 'created',\n after: snapshot ? snapshotToActivity(snapshot) : null\n });\n } else {\n activities.push({ id: activityId, kind: 'deleted', after: null });\n }\n } else {\n // Original created: undo removes → deleted; redo re-adds → created\n if (side === 'before') {\n activities.push({ id: activityId, kind: 'deleted', after: null });\n } else {\n const snapshot = state.getActivity(activityId);\n activities.push({\n id: activityId,\n kind: 'created',\n after: snapshot ? snapshotToActivity(snapshot) : null\n });\n }\n }\n }\n\n for (const change of entry.changeSet.links) {\n const linkId = String(change.id);\n if (change.kind === 'updated') {\n const lk = state.getLink(linkId);\n links.push({\n id: linkId,\n kind: 'updated',\n after: lk ? snapshotToLink(lk) : null\n });\n } else if (change.kind === 'deleted') {\n if (side === 'before') {\n const lk = state.getLink(linkId);\n links.push({\n id: linkId,\n kind: 'created',\n after: lk ? snapshotToLink(lk) : null\n });\n } else {\n links.push({ id: linkId, kind: 'deleted', after: null });\n }\n } else {\n // created\n if (side === 'before') {\n links.push({ id: linkId, kind: 'deleted', after: null });\n } else {\n const lk = state.getLink(linkId);\n links.push({\n id: linkId,\n kind: 'created',\n after: lk ? snapshotToLink(lk) : null\n });\n }\n }\n }\n\n return {\n source: { kind: side === 'before' ? 'undo' : 'redo' },\n activities,\n links,\n calendars: [],\n trackingEvents: [],\n effects: []\n };\n}\n\n/** B7: only a ChangeSet with at least one real change is undoable. */\nexport function changeSetIsSubstantive(cs: ChangeSet): boolean {\n return (\n cs.activities.length > 0 ||\n cs.links.length > 0 ||\n (cs.effects?.length ?? 0) > 0\n );\n}\n\nexport function applyUndo(state: ActivityWriter, entry: UndoEntry): void {\n // Derived fields (CP, expected_progress, real_cost, …) are now captured\n // inside entry.changeSet.activities by the write-capture window (Task 5) —\n // no separate applyDerived call needed.\n applyChangeSetSide(state, entry, 'before');\n}\n\nexport function applyRedo(state: ActivityWriter, entry: UndoEntry): void {\n applyChangeSetSide(state, entry, 'after');\n}\n\n/**\n * Apply one side (before = undo, after = redo) of an entry to the model.\n * Activities are applied before links so a resurrected endpoint exists when\n * its incident link is re-added. `created`/`deleted` invert each other:\n * `deleted` resurrects on undo (from `beforeSnap`) and re-deletes on redo;\n * `created` deletes on undo. (Re-creating a `created` row on redo needs an\n * after-snapshot — Wave 3c.)\n */\nfunction applyChangeSetSide(\n state: ActivityWriter,\n entry: UndoEntry,\n side: 'before' | 'after'\n): void {\n const cs = entry.changeSet;\n for (const ch of cs.activities) {\n if (ch.kind === 'updated') {\n if (!ch.fields) continue;\n for (const [field, fieldValue] of Object.entries(ch.fields)) {\n setActivityFieldDynamic(\n state,\n ch.id,\n field,\n side === 'before' ? fieldValue.before : fieldValue.after\n );\n }\n } else if (ch.kind === 'deleted') {\n if (side === 'before') {\n const snap = entry.beforeSnap?.get(String(ch.id));\n if (!snap) {\n throw new Error(\n `undo: missing beforeSnap for resurrecting activity ${ch.id}`\n );\n }\n state.addActivity(structuredCloneActivity(snap));\n } else {\n state.removeActivity(String(ch.id));\n }\n } else {\n // created\n if (side === 'before') {\n state.removeActivity(String(ch.id));\n } else {\n const snap = entry.afterSnap?.get(String(ch.id));\n if (!snap) {\n throw new Error(\n `redo: missing afterSnap for re-creating activity ${ch.id}`\n );\n }\n state.addActivity(structuredCloneActivity(snap));\n }\n }\n }\n for (const ch of cs.links) {\n if (ch.kind === 'updated') {\n if (!ch.fields) continue;\n for (const [field, fv] of Object.entries(ch.fields)) {\n // The undo entry holds the INTERNAL ChangeSet: lag (and duration) are in\n // WORKING HOURS, same as the engine. Write back verbatim — no conversion.\n setLinkFieldDynamic(\n state,\n String(ch.id),\n field,\n side === 'before' ? fv.before : fv.after\n );\n }\n } else if (ch.kind === 'deleted') {\n if (side === 'before') {\n const lk = entry.beforeLinks?.get(String(ch.id));\n if (!lk) {\n throw new Error(\n `undo: missing beforeLinks for re-adding link ${ch.id}`\n );\n }\n state.addLink(lk);\n } else {\n state.removeLink(String(ch.id));\n }\n } else {\n // created\n if (side === 'before') {\n state.removeLink(String(ch.id));\n } else {\n const lk = entry.afterLinks?.get(String(ch.id));\n if (!lk) {\n throw new Error(\n `redo: missing afterLinks for re-creating link ${ch.id}`\n );\n }\n state.addLink(lk);\n }\n }\n }\n}\n","/**\n * In-memory, per-session undo/redo stacks. Holds `UndoEntry` objects (the\n * inverse-application payload built at the dispatch choke-point). A new forward\n * record clears the redo stack. Capacity is bounded by `maxDepth` (oldest\n * entries evicted) to keep RAM bounded on long sessions.\n */\n\nimport { canCoalesce, mergeCoalesced, type UndoEntry } from './undo-entry.js';\n\nconst DEFAULT_MAX_DEPTH = 100;\nconst COALESCE_WINDOW_MS = 600;\n\nexport class UndoRecorder {\n private readonly undoStack: UndoEntry[] = [];\n private readonly redoStack: UndoEntry[] = [];\n private _lastKey: string | null = null;\n private _lastTime = 0;\n\n constructor(private readonly maxDepth: number = DEFAULT_MAX_DEPTH) {}\n\n /**\n * Push a forward entry; a new action invalidates the redo branch. When the\n * entry coalesces with the top one (same cell key, within the time window),\n * it merges into the top step instead of pushing a new one (decision #4).\n */\n record(entry: UndoEntry, coalesceKey: string | null = null, now = 0): void {\n const top = this.undoStack[this.undoStack.length - 1];\n if (\n coalesceKey != null &&\n coalesceKey === this._lastKey &&\n now - this._lastTime <= COALESCE_WINDOW_MS &&\n top !== undefined &&\n canCoalesce(top, entry)\n ) {\n this.undoStack[this.undoStack.length - 1] = mergeCoalesced(top, entry);\n } else {\n this.undoStack.push(entry);\n // Bounded trim of the oldest entry once per record (stack capped at\n // maxDepth) — not a queue drain, so no Queue needed.\n if (this.undoStack.length > this.maxDepth) this.undoStack.shift(); // shift-ok: bounded trim\n }\n this._lastKey = coalesceKey;\n this._lastTime = now;\n this.redoStack.length = 0;\n }\n\n /** Break the coalescing chain (called on undo/redo). */\n resetCoalesce(): void {\n this._lastKey = null;\n }\n\n takeUndo(): UndoEntry | null {\n return this.undoStack.pop() ?? null;\n }\n\n takeRedo(): UndoEntry | null {\n return this.redoStack.pop() ?? null;\n }\n\n pushRedo(entry: UndoEntry): void {\n this.redoStack.push(entry);\n }\n\n pushUndo(entry: UndoEntry): void {\n this.undoStack.push(entry);\n }\n\n canUndo(): boolean {\n return this.undoStack.length > 0;\n }\n\n canRedo(): boolean {\n return this.redoStack.length > 0;\n }\n\n undoDepth(): number {\n return this.undoStack.length;\n }\n\n clear(): void {\n this.undoStack.length = 0;\n this.redoStack.length = 0;\n }\n}\n","import type { Activity } from '../../types.js';\n\n/**\n * Fields whose change must NOT count as \"modified\" for save-dirty detection.\n * Mirrors the legacy `checkNoUpdatedActivities` skip-list plus selection-state\n * props (checked/visibleChecked/mustApplyVisibleChecked) — selection is view-only,\n * never a domain mutation that needs persisting.\n *\n * Critical-path outputs (the 7 CPM fields) are derived/render-only and never\n * persisted to the backend (verified: no `boundary/save` reference). They were\n * partially listed (`freeSlack`/`totalSlack`); the remaining five join here now\n * that the CP runs async at load (`criticalPathReady`) AFTER the save snapshot\n * is taken, and writes them via `setActivityField` — otherwise the background CP\n * would mark every activity dirty.\n */\nexport const ACTIVITY_SAVE_SKIP_FIELDS = new Set([\n 'baseline_points',\n 'tasks',\n 'baselineObject',\n 'activityModifications',\n 'color',\n 'freeSlack',\n 'totalSlack',\n 'custom_predecessors',\n 'custom_sucessors',\n 'start_base',\n 'work_base',\n 'cost_base',\n 'duration_base',\n '$effective_calendar',\n 'checked',\n 'visibleChecked',\n 'mustApplyVisibleChecked',\n 'earlyStart',\n 'earlyFinish',\n 'lateStart',\n 'lateFinish',\n 'is_critical'\n]);\n\n/**\n * Returns true if `current` has any meaningful field change relative to `saved`\n * — i.e. the activity needs to be re-persisted to the backend.\n *\n * Skips derived/UI/selection fields per `ACTIVITY_SAVE_SKIP_FIELDS`.\n * Date fields are compared by value (`.getTime()`), not by reference.\n * Activities with `assignedDefaultCalendar === true` always return true\n * (the bridge must persist the resolved calendarId).\n */\nexport function activityChangedSince(\n current: Activity,\n saved: Readonly<Activity>\n): boolean {\n if (current.assignedDefaultCalendar) return true;\n for (const [key, currentValue] of Object.entries(current)) {\n if (ACTIVITY_SAVE_SKIP_FIELDS.has(key)) continue;\n const savedValue = (saved as Record<string, unknown>)[key];\n if (currentValue instanceof Date) {\n if (\n !(savedValue instanceof Date) ||\n currentValue.getTime() !== savedValue.getTime()\n ) {\n return true;\n }\n } else if (currentValue !== savedValue) {\n return true;\n }\n }\n return false;\n}\n","/**\n * Save-dirty tracker: a mirror of the persisted state at the last save, used to\n * answer \"which activities/links changed since the last save?\" (the core símil\n * of the legacy `checkNoUpdatedActivities` / `checkNoUpdatedLinks`).\n *\n * Held by `ScheduleCore` and fed the already-converted public `Activity`/`Link`\n * lists (it has no `ScheduleState` reference by design — it diffs the public\n * shape the bridge persists). Mirror approach: snapshot at mark time, O(N)\n * value-diff at query time — no per-dispatch tracking in the dispatch path,\n * which also catches mutations from non-dispatch paths (CP, baselines, rollup).\n */\n\nimport type { Activity, Link } from '../../types.js';\nimport { activityChangedSince } from './activity-changes.js';\n\nexport class SaveTracker {\n private initialized = false;\n private readonly linksAtLastSave = new Map<\n string,\n { lag: number; type: Link['type'] }\n >();\n private readonly activitiesAtLastSave = new Map<string, Readonly<Activity>>();\n\n /** Take the initial snapshot once (after the autoscheduler settles). */\n init(\n activities: ReadonlyArray<Readonly<Activity>>,\n links: ReadonlyArray<Readonly<Link>>\n ): void {\n this.snapshotActivities(activities);\n this.snapshotLinks(links);\n this.initialized = true;\n }\n\n /** Re-snapshot activities (call after a save persists them). */\n snapshotActivities(activities: ReadonlyArray<Readonly<Activity>>): void {\n this.activitiesAtLastSave.clear();\n for (const activity of activities) {\n if (activity.proplannerId == null) continue;\n this.activitiesAtLastSave.set(String(activity.id), activity);\n }\n }\n\n /** Re-snapshot links (call after a save persists them). */\n snapshotLinks(links: ReadonlyArray<Readonly<Link>>): void {\n this.linksAtLastSave.clear();\n for (const link of links) {\n if (link.proplannerId == null) continue;\n this.linksAtLastSave.set(String(link.id), {\n lag: link.lag as number,\n type: link.type\n });\n }\n }\n\n /** Persisted activities whose value changed since the last snapshot. */\n modifiedActivities(\n activities: ReadonlyArray<Readonly<Activity>>\n ): ReadonlyArray<Readonly<Activity>> {\n if (!this.initialized) return [];\n return activities.filter((activity) => {\n if (activity.proplannerId == null) return false;\n if (activity.assignedDefaultCalendar) return true;\n const saved = this.activitiesAtLastSave.get(String(activity.id));\n if (!saved) return true; // persisted but absent from snapshot — new since last mark\n return activityChangedSince(activity, saved);\n });\n }\n\n /** Persisted links whose `lag`/`type` changed since the last snapshot. */\n modifiedLinks(\n links: ReadonlyArray<Readonly<Link>>\n ): ReadonlyArray<Readonly<Link>> {\n if (!this.initialized) return [];\n return links.filter((link) => {\n if (link.proplannerId == null) return false;\n const saved = this.linksAtLastSave.get(String(link.id));\n if (!saved) return true; // persisted but absent from snapshot — new since last mark\n return link.lag !== saved.lag || link.type !== saved.type;\n });\n }\n\n /** Drop both mirrors (teardown). */\n clear(): void {\n this.linksAtLastSave.clear();\n this.activitiesAtLastSave.clear();\n }\n}\n","/**\n * Backend-parse constants — formats, fallbacks and vocabularies the boundary\n * uses to interpret the raw payload. Values are frozen contracts with the\n * backend; changing any of them changes what the core parses.\n */\n\nimport type { ActivityCreter, ConstraintType } from '../../types.js';\n\n// ─── Dates ───────────────────────────────────────────────────\n\n/** Milliseconds per 24-hour day (UTC calendar expansion). */\nexport const DAY_MS = 24 * 60 * 60 * 1000;\n\n/** Exception-day date: `\"YYYY/MM/DD …\"` or `\"YYYY-MM-DD …\"` — Y/M/D captured. */\nexport const EXCEPTION_DATE_FORMAT_REGEX: RegExp =\n /^(\\d{4})[/-](\\d{1,2})[/-](\\d{1,2})/;\n\n// ─── Calendar fallbacks ──────────────────────────────────────\n\nexport const WEEKDAYS_PER_WEEK = 7;\n\n/** Working hours used when calendar parsing yields no usable shift. */\nexport const CALENDAR_FALLBACK_HOURS = '9:00-17:00';\n\n/** Sun..Sat working mask used when the working-days CSV is missing/malformed. */\nexport const CALENDAR_FALLBACK_WORKING_DAYS: readonly [\n boolean,\n boolean,\n boolean,\n boolean,\n boolean,\n boolean,\n boolean\n] = [false, true, true, true, true, true, false];\n\n/** CSV cell values meaning \"working day\" in `calendar.working_days`. */\nexport const WORKING_DAY_TRUE_VALUES: ReadonlySet<string> = new Set([\n '1',\n 'true'\n]);\n\n// ─── Activity creter (ponderator criterion) ──────────────────\n\nexport const DEFAULT_ACTIVITY_CRETER: ActivityCreter = 'DURATION';\n\nexport const VALID_ACTIVITY_CRETER_VALUES: ReadonlySet<ActivityCreter> =\n new Set<ActivityCreter>(['DURATION', 'COST', 'HH']);\n\n// ─── Constraint / root defaults ──────────────────────────────\n\n/** Fallback when the backend constraint label is unknown. */\nexport const DEFAULT_CONSTRAINT_TYPE: ConstraintType = 'asap';\n","/**\n * Parse the raw backend payload into the core's normalized internal model.\n *\n * Pure function. No side effects, no state. Throws on structural errors\n * (missing required fields, broken references) per Q4 in SCHEDULE_CORE_API.md.\n *\n * Public from the package — consumers can use this to pre-validate before\n * instantiating ScheduleCore, or to round-trip data through tests.\n */\n\nimport { parseLinkTypeCode } from '../../autoscheduler/links/link-display.js';\nimport { lagDaysToHours } from '../../autoscheduler/links/lag-units.js';\nimport {\n CALENDAR_FALLBACK_HOURS,\n CALENDAR_FALLBACK_WORKING_DAYS,\n DAY_MS,\n DEFAULT_ACTIVITY_CRETER,\n DEFAULT_CONSTRAINT_TYPE,\n EXCEPTION_DATE_FORMAT_REGEX,\n VALID_ACTIVITY_CRETER_VALUES,\n WEEKDAYS_PER_WEEK,\n WORKING_DAY_TRUE_VALUES\n} from './constants.js';\nimport { ROOT_PARENT_ID } from '../../internal/hierarchy/root-parent.js';\nimport { parseBackendDate } from '../../shared/backend-date.js';\nimport type { ScheduleCoreReporter } from '../../shared/reporter.js';\nimport { noopReporter } from '../../shared/reporter.js';\nimport type {\n Activity,\n ActivityCreter,\n ActivityId,\n ActivityRuntime,\n Calendar,\n CalendarId,\n CalendarWorktime,\n ConstraintType,\n Link,\n LinkId,\n PendingRequest,\n SectorMetadata\n} from '../../types.js';\nimport type {\n BackendActivityInput,\n BackendCalendar,\n BackendInput,\n BackendLink,\n BackendSector\n} from './types.js';\nimport { DEFAULT_STATUS_CRITERIA } from '../../columns/status/constants.js';\n\nexport interface ParsedInput {\n sector: SectorMetadata;\n activities: Activity[];\n links: Link[];\n calendars: Calendar[];\n /**\n * Baseline calendars, kept SEPARATE from the scheduling `calendars`. They\n * are never used to resolve an activity's calendar — only for the baseline\n * render. Parsed from the raw `baseCalendars` input (the backend's\n * `showBaseCalendar`); reshaped here (id+'-base', baseDefault, exceptions\n * from `baseexceptiondays`) so the core owns the differentiation instead of\n * the frontend `refreshCalendarsRewrite`.\n */\n baseCalendars: Calendar[];\n}\n\n// ---------------------------------------------------------------------------\n// Entry point\n// ---------------------------------------------------------------------------\n\nexport function parseFromBackend(\n input: BackendInput,\n reporter: ScheduleCoreReporter = noopReporter\n): ParsedInput {\n const sector = parseSector(input.sector);\n\n const rawCalendars =\n (input.calendars && input.calendars.length > 0\n ? input.calendars\n : input.sector.calendars) ?? [];\n const calendars = rawCalendars.map(parseCalendar);\n const calendarIds = new Set(calendars.map((c) => c.id));\n const defaultCalendarId = pickDefaultCalendarId(calendars);\n\n // Baseline calendars live in their own collection — never mixed into the\n // scheduling `calendars` (so `pickDefaultCalendarId` / `resolveCalendar`\n // can never pick one for an activity). Parsed from the raw backend shape.\n const baseCalendars = (input.baseCalendars ?? []).map(parseBaseCalendar);\n\n // El root project (regla del schedule: `correlative_id===0 &&\n // type==='project'`) se fuerza a `parent='0'`, aunque el BE devuelva\n // otro `parent_id` por bug histórico de seed. Si el payload no trae un\n // root que matchee (fixtures sintéticos, sub-árboles), se omite la regla\n // y todo se parsea uniforme — NO se asume que siempre haya root.\n // Documentado en CONVERT_ACTIVITIES_BATCH_AUDIT.md.\n const activities = input.activities.map((a) => {\n const parsed = parseActivity(a, calendarIds, defaultCalendarId, reporter);\n // `for_disable_milestone_duration`: the DHTMLX-unit (working HOURS) mirror of\n // duration that the Duration column actually renders (legacy stamps it at\n // parse = `durations.duration`). The core stores `duration` in DAYS; this\n // mirror is the flat hours form ROUNDED to an integer (DHTMLX stores\n // duration as an integer count of the duration_unit, so prod's value is the\n // rounded hour count — e.g. 3.38d×8 = 27.04 → 27), 0 for milestones (their\n // duration is already 0). NOT a passthrough field, so leaves would otherwise\n // be `undefined` at load — parents get re-stamped by parent-bounds\n // (calculateDuration → hours) after the scheduler.\n (\n parsed as unknown as Record<string, unknown>\n ).for_disable_milestone_duration = Math.round(\n Number(parsed.duration) * sector.hoursPerDay\n );\n return parsed;\n });\n const rootProject = activities.find(\n (a) => a.correlative_id === 0 && a.type === 'project'\n );\n if (rootProject) rootProject.parent = ROOT_PARENT_ID;\n\n const activityIds = new Set(activities.map((a) => a.id));\n\n reparentOrphansToRoot(activities, activityIds, reporter);\n\n const links = parseLinksDroppingDanglingReferences(\n input.links,\n activityIds,\n sector.hoursPerDay,\n reporter\n );\n\n return { sector, activities, links, calendars, baseCalendars };\n}\n\n/**\n * Parses a RAW base (baseline) calendar as the backend ships it from\n * `showBaseCalendar` — exceptions under `baseexceptiondays`, `is_default`,\n * no `-base` suffix — into the core `Calendar` shape. Replaces the reshape\n * the frontend `refreshCalendarsRewrite` did:\n * - `id` gets the `-base` suffix (avoids colliding with a same-id project\n * calendar + marks it as base),\n * - `baseDefault` carries the original `is_default`,\n * - `is_default` is cleared so it can never be picked as a scheduling default,\n * - exceptions come from `baseexceptiondays`.\n * Reuses `parseCalendar` for the worktime/exception parsing.\n */\nfunction parseBaseCalendar(raw: BackendCalendar): Calendar {\n const r = raw as unknown as Record<string, unknown>;\n const reshaped = {\n ...raw,\n exceptiondays: r.baseexceptiondays ?? raw.exceptiondays ?? [],\n id: `${raw.id}-base`,\n baseDefault: Boolean(raw.is_default),\n is_default: false\n } as unknown as BackendCalendar;\n return parseCalendar(reshaped);\n}\n\n/**\n * Elige el calendar default del proyecto.\n *\n * Prioridad:\n * 1. El que tenga `is_default === true`.\n * 2. Si ninguno está marcado, el primero del payload.\n * 3. Si no hay calendars cargados, `null`.\n *\n * Las activities que vengan con `calendarId` null o con referencia colgada\n * van a heredar este id en `parseActivity` — así nunca quedan con\n * `calendar_id === null` en estado runtime (excepto el caso extremo de\n * un schedule sin calendars, que tampoco tiene mucho sentido).\n */\nfunction pickDefaultCalendarId(calendars: Calendar[]): CalendarId | null {\n const flaggedDefault = calendars.find((cal) => cal.is_default);\n if (flaggedDefault) return flaggedDefault.id;\n const firstCalendar = calendars[0];\n if (firstCalendar) return firstCalendar.id;\n return null;\n}\n\n/**\n * Devuelve el `calendar_id` final para una activity:\n * - el del BE si apunta a un calendar conocido,\n * - el default del proyecto en cualquier otro caso (null, undefined, id colgado).\n *\n * `String(rawCalendarId)` se aplica una sola vez para coerción a string.\n * Si el BE manda null/undefined directamente, ni siquiera entramos al\n * `.has()` — vamos directo al default.\n */\nfunction resolveCalendarId(\n rawCalendarId: number | string | null | undefined,\n knownCalendarIds: Set<CalendarId>,\n defaultCalendarId: CalendarId | null\n): CalendarId | null {\n if (rawCalendarId == null) return defaultCalendarId;\n const coerced = String(rawCalendarId);\n return knownCalendarIds.has(coerced) ? coerced : defaultCalendarId;\n}\n\n/**\n * Parse cada link del payload BE tolerando referencias rotas a activities.\n *\n * Proyectos legacy a veces traen links cuyo `source` o `target` apunta a\n * una activity que ya fue borrada (consistencia eventual del BE). En esos\n * casos `parseLink` tira un Error. En vez de abortar el load entero,\n * descartamos el link individual, logueamos un warning y seguimos con\n * los siguientes.\n *\n * El legacy converter (`convertActivityRelationToLink` en\n * `react_client/src/utils/activityParsingUtils.jsx`) NO tiene esta\n * validación — los links rotos llegan a DHTMLX y rompen visualmente o\n * en operaciones posteriores. Documentado en\n * `Obsidian:newPlanSchedule/CONVERT_ACTIVITIES_BATCH_AUDIT.md`.\n */\nfunction parseLinksDroppingDanglingReferences(\n backendLinks: BackendLink[],\n knownActivityIds: Set<ActivityId>,\n hoursPerDay: number,\n reporter: ScheduleCoreReporter\n): Link[] {\n const parsedLinks: Link[] = [];\n\n for (const backendLink of backendLinks) {\n try {\n parsedLinks.push(parseLink(backendLink, knownActivityIds, hoursPerDay));\n } catch (parseError) {\n reporter.warn('[parseFromBackend] dropping invalid link', parseError);\n }\n }\n\n return dedupeLinksBySignature(parsedLinks);\n}\n\n/**\n * Removes duplicate links — same `source-target-type` — keeping the one with\n * the highest numeric `id`. Parity with the legacy `links.worker` (which\n * sorted by id desc + kept first-seen) and `onParse.filterRepeatedLinks`, now\n * owned by the core so the link set is clean (no dangling, no duplicates)\n * before it ever reaches the autoscheduler or the DHTMLX adapter.\n */\nfunction dedupeLinksBySignature(links: Link[]): Link[] {\n const bySignature = new Map<string, Link>();\n for (const link of links) {\n const signature = `${link.source}-${link.target}-${link.type}`;\n const existing = bySignature.get(signature);\n if (!existing || linkIdAsNumber(link) > linkIdAsNumber(existing)) {\n bySignature.set(signature, link);\n }\n }\n return [...bySignature.values()];\n}\n\nfunction linkIdAsNumber(link: Link): number {\n const n = Number(link.id);\n return Number.isFinite(n) ? n : -Infinity;\n}\n\n// ---------------------------------------------------------------------------\n// Sector\n// ---------------------------------------------------------------------------\n\nfunction parseSector(s: BackendSector): SectorMetadata {\n // Outbuild backend keeps `custom_id_prefix` / `custom_id_increment` at\n // the project level; they arrive via the sector payload's pass-through\n // bucket. Read defensively — older fixtures may not include them.\n const raw = s as unknown as Record<string, unknown>;\n const customIdPrefix =\n typeof raw.custom_id_prefix === 'string' && raw.custom_id_prefix.length > 0\n ? raw.custom_id_prefix\n : undefined;\n const incrementRaw = raw.custom_id_increment;\n const customIdIncrement =\n typeof incrementRaw === 'string'\n ? incrementRaw\n : typeof incrementRaw === 'number' && Number.isFinite(incrementRaw)\n ? String(incrementRaw)\n : undefined;\n\n return {\n id: String(s.id),\n name: s.name,\n hoursPerDay: s.hoursPerDay,\n hoursPerWeek: s.hoursPerWeek,\n dateFormat: s.dateFormat,\n projectId: s.projectId,\n companyId: s.companyId,\n ...(customIdPrefix !== undefined ? { customIdPrefix } : {}),\n ...(customIdIncrement !== undefined ? { customIdIncrement } : {}),\n ...(s.update_duration_for_primavera_for_end_date === true\n ? { updateDurationForPrimaveraEndDate: true }\n : {}),\n activityCreter: parseActivityCreter(raw.activity_creter),\n // Not a backend field: a complete sector needs it; the client value\n // overrides this default at init via `resolveStatusCriteria`.\n statusCriteria: DEFAULT_STATUS_CRITERIA\n };\n}\n\n/**\n * Normalizes the project-level ponderator criterion. Backend stores it\n * lowercase on `projects.activity_creter` (`'duration' | 'cost' | 'hh'`,\n * default `'duration'`); the core normalizes to uppercase. Unknown or\n * missing values fall back to `'DURATION'` (the backend default).\n */\n/**\n * Parse rule: an untouched (0% progress) activity is autoschedulable.\n * Equality with zero on purpose — not a threshold.\n */\nfunction isAutoSchedulable(progress: number): boolean {\n return progress === 0;\n}\n\nfunction parseActivityCreter(raw: unknown): ActivityCreter {\n if (typeof raw !== 'string') return DEFAULT_ACTIVITY_CRETER;\n const upper = raw.toUpperCase();\n return VALID_ACTIVITY_CRETER_VALUES.has(upper as ActivityCreter)\n ? (upper as ActivityCreter)\n : DEFAULT_ACTIVITY_CRETER;\n}\n\n// ---------------------------------------------------------------------------\n// Calendar\n// ---------------------------------------------------------------------------\n\nfunction parseCalendar(c: BackendCalendar): Calendar {\n const workingMask = parseWorkingDays(c.working_days);\n const { days, hours } = parseWorktimeDays(c, workingMask);\n const dates = parseExceptionDays(c.exceptiondays);\n\n const worktime: CalendarWorktime = { days, hours };\n if (dates) worktime.dates = dates;\n\n // `baseDefault` flags base (baseline) calendars. The backend ships them\n // with `id` suffixed `-base` and `baseDefault` instead of `is_default`\n // (see `refreshCalendarsRewrite` in the frontend). Preserve it so the\n // bridge can wire `gantt.defaultBaseCalendar` without re-reading the BE.\n const rawBaseDefault = (c as unknown as { baseDefault?: unknown })\n .baseDefault;\n\n return {\n id: String(c.id),\n name: c.name,\n is_default: Boolean(c.is_default),\n ...(typeof rawBaseDefault === 'boolean'\n ? { baseDefault: rawBaseDefault }\n : {}),\n worktime\n };\n}\n\n/**\n * Maps `BackendCalendar.exceptiondays[]` into the engine's per-date\n * override map.\n *\n * Backend layout (per `BackendCalendarException`):\n * { from_date: \"YYYY/MM/DD HH:MM\", to_date: \"YYYY/MM/DD HH:MM\",\n * workable: boolean, shifts?: [{shift_string: \"...\"}] }\n *\n * Each exception covers a date range; we expand it into individual UTC\n * days. For each day:\n * - `workable === false` → key set to `false` (non-working).\n * - `workable === true` with shifts → key set to the parsed\n * `\"HH:MM-HH:MM\"` windows.\n * - `workable === true` without shifts → key set to `true`. Engine\n * falls back to the calendar's\n * default `hours`. We encode this\n * as `[]`-equivalent (omitted)\n * since `true` is not in our\n * public type; the engine's\n * natural fallback applies.\n *\n * Keys are `String(Date.UTC(year, month, day))` — matches the engine's\n * `calendar.dates[Date.UTC(y,m,d)]` lookup at\n * `calendar/calendar-module.js:829`.\n *\n * Returns `null` when there are no exceptions to wire (so the caller can\n * omit the field entirely instead of attaching an empty object).\n */\n// TODO(schedule-core-migration): revisar este bloque junto con los\n// helpers auxiliares (`expandRangeToUtcKeys`, `exceptionToDateValue`,\n// `parseExceptionDate`).\n//\n// Símil legacy:\n// `react_client/src/utils/customGanttPlugin.js:265`\n// → `setHolidaysForCalendar(holidays, calendar)` hace el mismo trabajo\n// conceptual (expandir rangos `from_date`/`to_date`, manejar\n// `every_type` YEARLY/DAILY/WEEKLY, joinear `shifts` workable o no)\n// pero acoplado a DHTMLX (invoca `calendar.setWorkTime(...)` por día\n// en vez de devolver un mapa puro).\n//\n// Otros callsites legacy que dependen de esa función (a evaluar\n// cuando el flag SCHEDULE_CORE llegue al 100% y se elimine el legacy):\n// - `react_client/src/utils/customGanttPlugin.js:187,195`\n// - `react_client/src/views/schedule/calendar-helpers.js:86`\n// - `react_client/src/utils/lookaheadGanttPlugin.js:148,159`\n//\n// Doc de referencia: `Obsidian:newPlanSchedule/CONVERT_ACTIVITIES_BATCH_AUDIT.md`\n// (sección \"Estado 4 — REAL\" + propuesta de centralización de\n// normalizaciones en el core).\nfunction parseExceptionDays(\n exceptions: BackendCalendar['exceptiondays']\n): Record<string, false | string[]> | null {\n if (!Array.isArray(exceptions) || exceptions.length === 0) return null;\n\n const map: Record<string, false | string[]> = {};\n for (const exception of exceptions) {\n if (!exception) continue;\n const rangeKeys = expandRangeToUtcKeys(\n exception.from_date,\n exception.to_date\n );\n if (rangeKeys.length === 0) continue;\n const value = exceptionToDateValue(exception);\n if (value === undefined) continue;\n for (const key of rangeKeys) map[key] = value;\n }\n\n return Object.keys(map).length > 0 ? map : null;\n}\n\n/**\n * Expands a `from_date` / `to_date` pair into one key per UTC day inside\n * the range (inclusive). Dates are parsed in UTC to match the engine's\n * UTC-only lookup convention.\n */\nfunction expandRangeToUtcKeys(from: unknown, to: unknown): string[] {\n const fromTs = parseExceptionDate(from);\n const toTs = parseExceptionDate(to);\n if (fromTs === null || toTs === null) return [];\n\n const keys: string[] = [];\n let cursor = fromTs;\n while (cursor <= toTs) {\n keys.push(String(cursor));\n cursor += DAY_MS;\n }\n return keys;\n}\n\n/**\n * Parses a backend exception date string like `\"2023/10/04 0:00\"` into the\n * `Date.UTC(y, m, d)` timestamp of that day's UTC midnight. Returns `null`\n * if the input cannot be parsed.\n */\nfunction parseExceptionDate(raw: unknown): number | null {\n if (typeof raw !== 'string') return null;\n const match = EXCEPTION_DATE_FORMAT_REGEX.exec(raw.trim());\n if (!match) return null;\n const year = Number(match[1]);\n const month = Number(match[2]);\n const day = Number(match[3]);\n if (\n !Number.isFinite(year) ||\n !Number.isFinite(month) ||\n !Number.isFinite(day)\n ) {\n return null;\n }\n return Date.UTC(year, month - 1, day);\n}\n\n/**\n * Converts one `BackendCalendarException` to the value the engine expects\n * for a single date key. Returns `undefined` when the exception has no\n * actionable effect (e.g. `workable: true` with no custom shifts — the\n * engine's default `hours` already covers it).\n */\nfunction exceptionToDateValue(\n exception: BackendCalendar['exceptiondays'][number]\n): false | string[] | undefined {\n if (exception.workable === false) return false;\n const shifts = (exception as { shifts?: BackendCalendar['shifts'] }).shifts;\n if (Array.isArray(shifts) && shifts.length > 0) {\n const windows = extractExceptionWindows(shifts);\n if (windows.length > 0) return windows;\n }\n return undefined;\n}\n\n/**\n * Pulls the working-hour windows out of an exception day's custom shifts.\n * An exception applies to ONE date, so per-day variation is irrelevant —\n * we take the first defined window of each shift entry. (e.g. a workday\n * holiday with custom 9-13 hours → `[\"9:00-13:00\"]`.)\n */\nfunction extractExceptionWindows(shifts: BackendCalendar['shifts']): string[] {\n const windows: string[] = [];\n for (const shift of shifts) {\n const csvs = splitShiftString(shift?.shift_string);\n if (!csvs) continue;\n // An exception day's shift_string is a COMPACT single window\n // (`\"8:00-16:00\"`) — one window per shift entry — NOT the regular per-day\n // 7-field CSV layout (`\"false,8:00,...,false-false,16:00,...\"`). Detect the\n // compact form by the absence of commas and take the window directly;\n // routing it through `shiftCsvToPerDayWindows` (which requires 7 fields)\n // silently dropped every workable exception day. A split exception day\n // carries multiple shift entries, each handled here.\n if (!csvs.startsCsv.includes(',') && !csvs.endsCsv.includes(',')) {\n const start = csvs.startsCsv.trim();\n const end = csvs.endsCsv.trim();\n if (\n !isMissingValue(start) &&\n !isMissingValue(end) &&\n TIME_OF_DAY.test(start) &&\n TIME_OF_DAY.test(end)\n ) {\n windows.push(`${start}-${end}`);\n }\n continue;\n }\n const perDay = shiftCsvToPerDayWindows(csvs.startsCsv, csvs.endsCsv);\n const firstWindow = perDay.find((window) => window !== null);\n if (firstWindow) windows.push(firstWindow);\n }\n // Same chronological-order requirement as regular days: the backend may\n // serialize the shifts reversed.\n windows.sort(compareWindowByStart);\n return windows;\n}\n\n/** `H:MM` / `HH:MM` time-of-day guard for compact exception windows. */\nconst TIME_OF_DAY = /^\\d{1,2}:\\d{2}$/;\n\n/**\n * Build the PER-DAY working-hour windows for a calendar.\n *\n * Returns:\n * - `days`: length-7 array (Sun..Sat). Each entry is `false`\n * (non-working) or `string[]` (the `\"HH:MM-HH:MM\"` windows for that\n * specific weekday). Different days can carry different windows —\n * supports a short Friday, a half-day Monday, multi-shift split days,\n * or a fully heterogeneous week.\n * - `hours`: default windows (first working day) — the engine's global\n * fallback.\n *\n * Two backend layouts are supported:\n *\n * (a) Flat single-shift: `c.shift_start` / `c.shift_end` carry per-day\n * CSVs (`\"false,8:00,...,false\"`). One window per working day.\n *\n * (b) Nested multi-shift: each entry in `c.shifts` carries a\n * `shift_string` of the form `\"<startsCsv>-<endsCsv>\"`. Multiple\n * entries encode a split day (morning + afternoon). Each entry is\n * itself a per-day CSV, so per-day variation composes with\n * multi-shift.\n *\n * Mirrors the legacy `processSingleCalendar` in `activityParsingUtils` /\n * `calendar-helpers-optimized`, which already preserved per-day variation\n * via `shiftPattern[dayIndex]`. The previous core parser flattened to the\n * first working day's window, dropping every other day's hours — a\n * correctness bug for the autoscheduler (wrong dates on those days).\n */\n/** Start time (minutes from midnight) of a `\"H:MM-H:MM\"` window, for sorting. */\nfunction windowStartMinutes(window: string): number {\n const dash = window.indexOf('-');\n const start = dash > 0 ? window.slice(0, dash) : window;\n const [h, m] = start.split(':');\n return (Number(h) || 0) * 60 + (Number(m) || 0);\n}\n\n/** Chronological order of two `\"H:MM-H:MM\"` windows by start time. */\nfunction compareWindowByStart(a: string, b: string): number {\n return windowStartMinutes(a) - windowStartMinutes(b);\n}\n\nfunction parseWorktimeDays(\n c: BackendCalendar,\n workingMask: boolean[]\n): { days: Array<false | string[]>; hours: string[] } {\n // Accumulate the windows contributed to each weekday by every shift\n // source (flat layout adds one; each nested shift adds one more).\n const windowsByDay: string[][] = Array.from({ length: 7 }, () => []);\n\n const addCsvPair = (startsCsv: unknown, endsCsv: unknown): void => {\n const perDay = shiftCsvToPerDayWindows(startsCsv, endsCsv);\n for (let i = 0; i < 7; i += 1) {\n const window = perDay[i];\n const dayWindows = windowsByDay[i];\n if (window && dayWindows) dayWindows.push(window);\n }\n };\n\n // The nested `shifts[]` are the AUTHORITATIVE source (matches the legacy,\n // which builds worktime from `calendar.shifts` sorted by correlative_id and\n // leaves `shift_start`/`shift_end` commented out — customGanttPlugin.js:139,\n // calendar-helpers.js:32, lookaheadGanttPlugin.js:100). The flat CSVs are a\n // deprecated single-shift convenience: for a multi-shift calendar they are\n // CONCATENATED (\"<morning csv>-<afternoon csv>\"), which splits to ≠7 values\n // and parses to nothing → fallback hours (the Hergonsa 6237 bug). So: prefer\n // nested when present; read flat only as a fallback. The two are mutually\n // exclusive per calendar, so this never double-counts.\n if (Array.isArray(c.shifts) && c.shifts.length > 0) {\n for (const shift of c.shifts) {\n const csvs = splitShiftString(shift?.shift_string);\n if (csvs) addCsvPair(csvs.startsCsv, csvs.endsCsv);\n }\n } else if (\n typeof c.shift_start === 'string' &&\n typeof c.shift_end === 'string'\n ) {\n addCsvPair(c.shift_start, c.shift_end);\n }\n\n // The backend serializes a split day's shifts in raw row order, which can be\n // REVERSED (afternoon before morning). The calendar engine assumes a day's\n // windows are in chronological order — otherwise getClosestWorkTime(past)\n // returns the morning shift end instead of the day end. Order each day by\n // start time (mirrors the legacy, which sorts shifts by correlative_id).\n // Single-shift days are unaffected.\n for (const dayWindows of windowsByDay) dayWindows.sort(compareWindowByStart);\n\n // Default windows for the engine global + for working days where parsing\n // yielded nothing: the first working day's windows, else FALLBACK_HOURS.\n const firstWorkingWindows = windowsByDay.find(\n (windows, i) => Boolean(workingMask[i]) && windows.length > 0\n );\n const defaultHours =\n firstWorkingWindows && firstWorkingWindows.length > 0\n ? firstWorkingWindows\n : [CALENDAR_FALLBACK_HOURS];\n\n const days: Array<false | string[]> = workingMask.map((isWorking, i) => {\n if (!isWorking) return false;\n const dayWindows = windowsByDay[i];\n return dayWindows && dayWindows.length > 0 ? dayWindows : defaultHours;\n });\n\n return { days, hours: defaultHours };\n}\n\n/**\n * Expands a `<startsCsv>` / `<endsCsv>` pair into one window string per\n * weekday. Returns a length-7 array (Sun..Sat); each entry is the\n * `\"start-end\"` window for that day, or `null` for non-working / missing.\n */\nfunction shiftCsvToPerDayWindows(\n startsCsv: unknown,\n endsCsv: unknown\n): Array<string | null> {\n const empty: Array<string | null> = Array.from(\n { length: WEEKDAYS_PER_WEEK },\n () => null\n );\n if (typeof startsCsv !== 'string' || typeof endsCsv !== 'string') {\n return empty;\n }\n const starts = startsCsv.split(',').map((s) => s.trim());\n const ends = endsCsv.split(',').map((s) => s.trim());\n // The legacy `transformShiftToArray` (calendar-helpers.js:149) maps each CSV\n // value to its 0-based weekday position with no length requirement. A shift\n // that only applies to some weekdays is serialized SHORT: e.g. a 5-value\n // string `13:00,…,13:00-17:00,…,17:00` covers indices 0..4 (Sun..Thu — Sun\n // is non-working, so effectively Mon..Thu), and the trailing weekdays (Fri,\n // Sat) simply don't carry that shift. The old `!== 7` guard DROPPED every\n // such shift, losing entire work windows (cal 30275 in tocornal 656/1988:\n // afternoon 13-17 + night 18-23 shifts vanished → the engine counted ~half\n // the working hours, e.g. 196h vs prod's 342h for activity 731). Map by\n // position instead; require only that starts/ends align and fit a week.\n if (\n starts.length !== ends.length ||\n starts.length === 0 ||\n starts.length > WEEKDAYS_PER_WEEK\n ) {\n return empty;\n }\n\n const windows: Array<string | null> = [...empty];\n for (let i = 0; i < starts.length; i += 1) {\n const start = starts[i];\n const end = ends[i];\n if (isMissingValue(start) || isMissingValue(end)) continue;\n windows[i] = `${start}-${end}`;\n }\n return windows;\n}\n\nfunction splitShiftString(\n raw: unknown\n): { startsCsv: string; endsCsv: string } | null {\n if (typeof raw !== 'string') return null;\n const dash = raw.indexOf('-');\n if (dash <= 0) return null;\n return {\n startsCsv: raw.slice(0, dash),\n endsCsv: raw.slice(dash + 1)\n };\n}\n\n/**\n * `\"0,1,1,1,1,1,0\"` → `[false, true, true, true, true, true, false]`.\n * Order is Sun..Sat. Falls back to Mon-Fri working if the CSV is missing\n * or malformed — keeps the core initialisable for legacy calendars\n * whose shape predates the canonical encoding.\n */\nfunction parseWorkingDays(csv: string): boolean[] {\n if (typeof csv !== 'string') return [...CALENDAR_FALLBACK_WORKING_DAYS];\n const parts = csv.split(',').map((s) => s.trim());\n if (parts.length !== WEEKDAYS_PER_WEEK)\n return [...CALENDAR_FALLBACK_WORKING_DAYS];\n return parts.map((p) => WORKING_DAY_TRUE_VALUES.has(p));\n}\n\nconst MISSING_SHIFT_VALUES: ReadonlySet<string> = new Set(['false', 'null']);\n\nfunction isMissingValue(value: string | undefined): boolean {\n return !value || MISSING_SHIFT_VALUES.has(value);\n}\n\n// ---------------------------------------------------------------------------\n// Activity\n// ---------------------------------------------------------------------------\n\n// ─────────────────────────────────────────────────────────────────────\n// Activity passthrough contract\n//\n// Every `BackendActivityInput` field belongs to one of two categories:\n//\n// 1. NORMALIZED — the core transforms it (rename, coerce, default,\n// validate). The single source of truth is the explicit return\n// of `parseActivity`. Each assigned key in that return represents\n// a normalized field.\n//\n// 2. PASSTHROUGH — the core preserves it verbatim. Listed below.\n//\n// Anything in the backend response that is neither normalized in\n// `parseActivity` NOR present in this set is DROPPED silently.\n// Intentional: every new backend field must be classified explicitly\n// (normalize it in the return OR add it here as passthrough). No\n// implicit contracts.\n//\n// When the backend adds a field, the workflow is:\n// - If we want to transform it → add an assignment in `parseActivity`.\n// - If we want to copy it as-is → add it to this set.\n// - If we don't want it → leave it out, it gets dropped.\n// ─────────────────────────────────────────────────────────────────────\n\nconst ACTIVITY_PASSTHROUGH_FIELDS = new Set([\n // Ids and relations.\n 'unique_correlative_id',\n 'ganttId',\n 'sectorId',\n 'companyId',\n 'subcontractId',\n 'subcontract',\n 'custom_id',\n // Computed flags / metrics from the backend.\n 'hasCustomPonderator',\n 'has_childs',\n 'sumOfDurationRecursively',\n 'freeSlack',\n 'is_critical',\n 'hasNewActivities',\n 'isNewActivity',\n // Live validation field read by endDatePipeline; explicit so it survives by design.\n 'date_origin',\n 'baseline_points',\n // Relation arrays.\n 'tasks',\n 'responsables',\n 'tags',\n // `pendingRequests` is NOT passthrough — parsed explicitly below to the\n // typed `{ id: string }[]` shape (SIR freeze authority, A1).\n // Timestamps.\n 'createdAt',\n 'updatedAt'\n]);\n\n/**\n * Backend DB row id → `proplannerId` (distinct from `id` = unique_id). Mirror\n * of parseLink; `{}` for synthetic inputs without a numeric `a.id`.\n */\nfunction proplannerIdField(a: BackendActivityInput): { proplannerId?: number } {\n return typeof a.id === 'number' ? { proplannerId: a.id } : {};\n}\n\n/**\n * Build the passthrough bucket by iterating the EXPLICIT passthrough contract\n * (not `Object.keys(a)`). Backend fields not in the contract are dropped\n * silently — see `ACTIVITY_PASSTHROUGH_FIELDS` for the rationale.\n */\nfunction collectPassthrough(a: BackendActivityInput): Record<string, unknown> {\n const passthrough: Record<string, unknown> = {};\n for (const key of ACTIVITY_PASSTHROUGH_FIELDS) {\n if (key in a) {\n passthrough[key] = (a as Record<string, unknown>)[key];\n }\n }\n return passthrough;\n}\n\n/**\n * `constraint_type` plus its date. Dateless constraints (asap/alap) must not\n * carry a `constraint_date`: legacy DB rows arrive with stale dates for these\n * types (the legacy chain never nullified them; only `correctWrongDates` did,\n * at load). Nullify here so scheduler, UI and save see a coherent pair.\n * Parity: correctWrongDates fix #6 (CORRECT_WRONG_DATES_PARITY.md).\n */\nfunction resolveConstraint(\n a: BackendActivityInput,\n reporter: ScheduleCoreReporter\n) {\n const constraintType = parseConstraintLabel(a.constraint, reporter);\n const constraintTakesDate =\n constraintType !== 'asap' && constraintType !== 'alap';\n const constraintDate =\n constraintTakesDate && a.constraint_date\n ? parseBackendDate(a.constraint_date)\n : null;\n return { constraint_type: constraintType, constraint_date: constraintDate };\n}\n\n/**\n * Milestone canonical invariant (I1): a `type === 'milestone'` activity is a\n * point marker — `duration === 0` and `end_date === start_date`. The backend\n * can serialize a \"bugged\" milestone with `duration > 0` (the\n * `duration_milestone_bugged` workaround); production renders it as end=start\n * regardless because `type` is canonical. We defend the invariant at this\n * boundary (the only backend entry point) so the engine and rollups never see a\n * milestone with a non-point span. Mirrors MILESTONES.md §2, closes §18 gap #5.\n */\nfunction resolveDatesAndDuration(a: BackendActivityInput) {\n const startDate = parseBackendDate(a.start_date);\n const isMilestone = a.type === 'milestone';\n return {\n start_date: startDate,\n end_date: isMilestone ? startDate : parseBackendDate(a.end_date),\n duration: isMilestone ? 0 : Number(a.duration)\n };\n}\n\n/**\n * Load-time baselines for the cascade comparator (post-processor\n * `runUpdateParentDuration`, mirror of legacy updateParentDuration.js). Legacy\n * initialized these in `correctWrongDates`; without them the comparator's\n * `?? 0` fallback reads any non-zero loaded value as a change on the first\n * dispatch (spurious didChange → extra rollup + snapshot refresh). Parity:\n * correctWrongDates fix #3 (CORRECT_WRONG_DATES_PARITY.md).\n */\nfunction buildLoadTimeBaselines(a: BackendActivityInput) {\n const isMilestone = a.type === 'milestone';\n return {\n old_progress_registered: Number(a.progress),\n old_duration_registered: isMilestone ? 0 : Number(a.duration),\n old_cost_registered: Number(a.cost),\n old_used_cost_registered: Number(a.used_cost ?? 0),\n old_real_cost_registered: Number(a.real_cost ?? 0),\n old_hhWorkTime_registered: Number(a.hhWorkTime)\n };\n}\n\nfunction parseActivity(\n a: BackendActivityInput,\n calendarIds: Set<CalendarId>,\n defaultCalendarId: CalendarId | null,\n reporter: ScheduleCoreReporter\n): Activity {\n const id = String(a.unique_id);\n const parent =\n a.parent_id === ROOT_PARENT_ID ? ROOT_PARENT_ID : String(a.parent_id);\n\n // Eager calendar_id resolution: valid backend id used as-is; null/undefined\n // or a dangling id falls back to the project default; only null when the\n // schedule has no calendars at all (which breaks downstream anyway).\n const calendarId = resolveCalendarId(\n a.calendarId,\n calendarIds,\n defaultCalendarId\n );\n\n // True when this activity inherited the project default because its own\n // calendar was missing/invalid (null, undefined, or a dangling id) AND a\n // default actually existed to assign. The UI surfaces these to the user.\n const assignedDefaultCalendar =\n calendarId != null &&\n (a.calendarId == null || !calendarIds.has(String(a.calendarId)));\n\n // `auto_scheduling` rule (moved from `applyGanttTaskModifications`): an\n // activity with non-zero progress is no longer an autoscheduling candidate.\n const progress = Number(a.progress);\n const autoScheduling = isAutoSchedulable(progress);\n\n const { constraint_type: constraintType, constraint_date: constraintDate } =\n resolveConstraint(a, reporter);\n const {\n start_date: startDate,\n end_date: endDate,\n duration\n } = resolveDatesAndDuration(a);\n\n return {\n ...collectPassthrough(a),\n ...proplannerIdField(a),\n id,\n parent,\n text: a.name,\n description: a.description ?? '',\n type: a.type,\n start_date: startDate,\n end_date: endDate,\n duration,\n constraint_type: constraintType,\n constraint_date: constraintDate,\n progress,\n cost: Number(a.cost),\n used_cost: Number(a.used_cost ?? 0),\n real_cost: Number(a.real_cost ?? 0),\n hhWorkTime: Number(a.hhWorkTime),\n real_work: Number(a.real_work ?? 0),\n ponderator: Number(a.ponderator),\n calendar_id: calendarId,\n assignedDefaultCalendar,\n auto_scheduling: autoScheduling,\n correlative_id: a.correlative_id,\n is_lookahead: a.isOnLookahead,\n // View-model visibility bit: only an explicit backend `false` hides.\n visible: a.should_be_showed !== false,\n ...buildLoadTimeBaselines(a),\n pendingRequests: parsePendingRequests(a.pendingRequests),\n activityModifications: a.activitymodifications,\n // D5 fix (2026-05-19): backend serializes newActivitiesArray as a\n // JSON-encoded string; the in-memory form must be a real array so dispatch\n // pipelines can iterate/mutate it. See DIVERGENCES_activity_create.md D5.\n newActivitiesArray: parseNewActivitiesArray(a.newActivitiesArray)\n // Cast: TS can't statically verify the `...collectPassthrough` spread\n // provides every required Activity field (the loop iterates a runtime Set,\n // not a typed contract). When the BE responds normally every passthrough\n // field is present; a missing field is a real data bug to surface at the\n // source, not mask via optional typing. `ActivityRuntime`\n // (= Activity & DhtmlxHeritageFields) because the literal includes the\n // old_*_registered baselines (DHTMLX heritage — G1); it is assignable to\n // Activity.\n } as ActivityRuntime;\n}\n\nfunction parseNewActivitiesArray(raw: unknown): ActivityId[] {\n if (raw == null || raw === '') return [];\n if (Array.isArray(raw)) return raw.map(String);\n if (typeof raw !== 'string') return [];\n try {\n const parsed = JSON.parse(raw);\n return Array.isArray(parsed) ? parsed.map(String) : [];\n } catch {\n return [];\n }\n}\n\n/**\n * Parse the backend per-activity `pendingRequests` (already filtered to\n * pending and shaped `{ id }` by `sector.controller.js`) into the typed\n * `PendingRequest[]`, normalizing the id to string. Missing / non-array →\n * `[]`. SIR freeze authority (A1).\n */\nfunction parsePendingRequests(raw: unknown): PendingRequest[] {\n if (!Array.isArray(raw)) return [];\n return raw\n .filter((r): r is { id: unknown } => r != null && typeof r === 'object')\n .map((r) => ({ id: String((r as { id: unknown }).id) }));\n}\n\n// Backend constraint labels arrive with inconsistent casing across rows\n// (legacy DB seed quirk). We normalize to UPPERCASE for the lookup so any\n// case variant maps correctly. Source of truth for the case-insensitive\n// mapping mirrors `getConstraintType` in\n// `react_client/src/utils/activityParsingUtils.jsx`.\nexport const CONSTRAINT_LABEL_MAP: Readonly<Record<string, ConstraintType>> = {\n 'AS SOON AS POSSIBLE': 'asap',\n 'AS LATE AS POSSIBLE': 'alap',\n 'START NO EARLIER THAN': 'snet',\n 'START NO LATER THAN': 'snlt',\n 'FINISH NO EARLIER THAN': 'fnet',\n 'FINISH NO LATER THAN': 'fnlt',\n 'MUST START ON': 'mso',\n 'MUST FINISH ON': 'mfo'\n};\n\n/**\n * Mapea el constraint label del BE a su código interno. Si el BE manda\n * un label desconocido (label nuevo no contemplado, typo, label local de\n * algún tenant), **defaultea a `'asap'`** en lugar de tirar — mismo\n * comportamiento que `getConstraintType` en el converter legacy.\n *\n * Por qué tolerar acá:\n * - El label es metadata; aun con un valor \"incorrecto\" la activity\n * sigue siendo schedulable (asap es el constraint más permisivo).\n * - Tirar acá rompería la carga entera por un campo no crítico.\n * - Loggeamos para que el equipo se entere si aparece un label nuevo.\n */\nfunction parseConstraintLabel(\n label: string,\n reporter: ScheduleCoreReporter\n): ConstraintType | null {\n if (!label) return null;\n const normalized = CONSTRAINT_LABEL_MAP[label.toUpperCase()];\n if (normalized === undefined) {\n reporter.warn(\n `[parseFromBackend] unknown constraint label \"${label}\" — defaulting to \"asap\"`\n );\n return DEFAULT_CONSTRAINT_TYPE;\n }\n return normalized;\n}\n\n/**\n * Reasigna a `'0'` el `parent` de cualquier activity cuyo `parent` no\n * exista en el set de ids cargados. Análogo a\n * `parseLinksDroppingDanglingReferences` para links: tolera referencias\n * colgadas (race condition del BE, migración rota, etc.) en lugar de\n * tirar.\n *\n * Mutates `activities` in-place.\n *\n * El converter legacy NO hacía esta validación — DHTMLX terminaba con\n * activities \"huérfanas\" colgando de nada y renderizaba mal. Acá las\n * promovemos al root del schedule, lo que las deja visibles y editables\n * mientras el equipo investiga el origen del orphan.\n */\nfunction reparentOrphansToRoot(\n activities: Activity[],\n ids: Set<ActivityId>,\n reporter: ScheduleCoreReporter\n): void {\n for (const activity of activities) {\n if (activity.parent === ROOT_PARENT_ID) continue;\n if (!ids.has(activity.parent)) {\n reporter.warn(\n `[parseFromBackend] activity \"${activity.id}\" references unknown parent \"${activity.parent}\" — re-parenting to root ('0')`\n );\n activity.parent = ROOT_PARENT_ID;\n }\n }\n}\n\n// ---------------------------------------------------------------------------\n// Link\n// ---------------------------------------------------------------------------\n\n// Backend link shape (validated against a real `/sector/activityrelation/:id`\n// response): { id (DB row), unique_id (schedule id used as link.id),\n// source_id (activity.unique_id), target_id, type: 'fs'|'ss'|'ff'|'sf',\n// lag (days), createdAt, updatedAt, sectorId, ganttId }.\nfunction parseLink(\n l: BackendLink,\n activityIds: Set<ActivityId>,\n hoursPerDay: number\n): Link {\n const lr = l as unknown as Record<string, unknown>;\n // Use `unique_id` as the schedule-level link id when present (real\n // backend); fall back to `id` for synthetic test fixtures.\n const id = String(lr.unique_id ?? lr.id);\n const source = String(lr.source_id ?? lr.source ?? '');\n const target = String(lr.target_id ?? lr.target ?? '');\n if (!activityIds.has(source)) {\n throw new Error(\n `[parseFromBackend] link \"${id}\" source \"${source}\" does not exist`\n );\n }\n if (!activityIds.has(target)) {\n throw new Error(\n `[parseFromBackend] link \"${id}\" target \"${target}\" does not exist`\n );\n }\n // Type can come as the 2-letter code ('fs'/'ss'/...) from real backend\n // or already as the DHTMLX number ('0'/'1'/...) from synthetic inputs.\n const rawType = String(lr.type ?? 'fs');\n const type = parseLinkTypeCode(rawType) ?? (rawType as Link['type']);\n\n // Passthrough fields from the backend — needed by the bridge adapter\n // to produce DHTMLX-shape links without re-reading the raw payload.\n // Optional because synthetic test fixtures may omit them; production\n // payloads always include all three.\n const ganttIdRaw = lr.ganttId;\n const sectorIdRaw = lr.sectorId;\n const proplannerIdRaw = lr.id;\n\n return {\n id,\n source,\n target,\n type,\n // Backend ships `lag` in DAYS; the core stores it internally in WORKING\n // HOURS (mirrors `duration`). Convert here — the single backend boundary.\n lag: lagDaysToHours(Number(lr.lag ?? 0), hoursPerDay),\n ...(typeof ganttIdRaw === 'number' ? { ganttId: ganttIdRaw } : {}),\n ...(typeof sectorIdRaw === 'number' ? { sectorId: sectorIdRaw } : {}),\n ...(typeof proplannerIdRaw === 'number'\n ? { proplannerId: proplannerIdRaw }\n : {})\n };\n}\n\n// Re-export for downstream typing.\nexport type { LinkId };\n","/**\n * Activity row-id generator (`Activity.id`, persisted as `unique_id` in BD).\n *\n * Pure monotonic counter producing numeric-string ids. Each `next()` value\n * is strictly greater than every id ever returned by this generator AND\n * every id passed via `knownIds` (constructor) or `bump(id)` (runtime).\n *\n * Uniqueness scope: within one `ScheduleCore` instance (= within the\n * sector). Cross-sector collisions are acceptable — the persistence layer\n * treats `unique_id` as scoped by `(companyId, sectorId)`.\n *\n * Output format: positive integer encoded as string (e.g. `\"1\"`, `\"42\"`,\n * `\"1778513905916\"`). Compatible with the backend `unique_id BIGINT`\n * column and with any legacy code that does `parseInt(id)` while DHTMLX\n * and the core coexist.\n */\n\nimport type { ActivityId } from '../types.js';\n\ninterface ActivityIdGeneratorOptions {\n /** Explicit starting value. First `next()` returns `String(seed + 1)`. */\n readonly seed?: number;\n /** Existing ids to skip past. Counter is raised to `max(...knownIds)`. */\n readonly knownIds?: Iterable<ActivityId | number>;\n}\n\nexport interface ActivityIdGenerator {\n /** Returns a new id, strictly greater than every previously issued or\n * registered id. */\n next(): ActivityId;\n /** Registers an externally-supplied id (paste, undo, test override) so\n * future `next()` calls never collide with it. Idempotent: bumping to a\n * value ≤ the current counter is a no-op. Invalid (non-finite) inputs\n * are ignored. */\n bump(id: ActivityId | number): void;\n}\n\nexport function createActivityIdGenerator(\n options: ActivityIdGeneratorOptions = {}\n): ActivityIdGenerator {\n let counter: number = options.seed ?? 0;\n\n const raise = (value: number): void => {\n if (value > counter) counter = value;\n };\n\n if (options.knownIds) {\n for (const id of options.knownIds) {\n const n = typeof id === 'number' ? id : Number(id);\n if (Number.isFinite(n)) raise(n);\n }\n }\n\n return {\n next(): ActivityId {\n counter += 1;\n return String(counter);\n },\n bump(id: ActivityId | number): void {\n const n = typeof id === 'number' ? id : Number(id);\n if (!Number.isFinite(n)) return;\n raise(n);\n }\n };\n}\n","/**\n * Link id generator — replica el formato `uid()` de DHTMLX para mantener\n * compatibilidad bidireccional con el `linkStore`.\n *\n * DHTMLX (`dhtmlxgantt.js:61226`):\n * var seed;\n * function uid() {\n * if (!seed) seed = new Date().valueOf();\n * seed++;\n * return seed;\n * }\n *\n * Output: entero positivo creciente, indistinguible de un epoch ms. El\n * primer id es `Date.now()` del primer `next()`; cada siguiente es `+1`.\n *\n * Uniqueness scope: una instancia de `ScheduleCore` (= un sector). El\n * generador se construye con `knownIds` = ids de links ya cargados del\n * backend + los presentes en el `linkStore` de DHTMLX al inicializar el\n * bridge, de modo que el contador arranca por encima de cualquier id ya\n * existente y nunca colisiona con uids generados por DHTMLX para tasks\n * u otras entidades.\n */\n\nimport type { LinkId } from '../types.js';\n\ninterface LinkIdGeneratorOptions {\n /** Explicit starting value. First `next()` returns `String(seed + 1)`. */\n readonly seed?: number;\n /** Existing ids to skip past. Counter is raised to `max(...knownIds)`. */\n readonly knownIds?: Iterable<LinkId | number>;\n}\n\nexport interface LinkIdGenerator {\n /** Returns a new id, strictly greater than every previously issued or\n * registered id. */\n next(): LinkId;\n /** Registers an externally-supplied id (paste, undo, test override) so\n * future `next()` calls never collide with it. Idempotent: bumping to a\n * value ≤ the current counter is a no-op. Invalid (non-finite) inputs\n * are ignored. */\n bump(id: LinkId | number): void;\n}\n\nexport function createLinkIdGenerator(\n options: LinkIdGeneratorOptions = {}\n): LinkIdGenerator {\n // Default seed replica la inicialización lazy de DHTMLX: `Date.now()` en\n // construcción del generador. Diferencia menor con DHTMLX (que lo hace\n // en la primera llamada a `uid()` en vez de en el primer `seed`), pero\n // funcionalmente equivalente: el primer `next()` devuelve un número\n // próximo al timestamp actual + 1.\n let counter: number = options.seed ?? Date.now();\n\n const raise = (value: number): void => {\n if (value > counter) counter = value;\n };\n\n if (options.knownIds) {\n for (const id of options.knownIds) {\n const n = typeof id === 'number' ? id : Number(id);\n if (Number.isFinite(n)) raise(n);\n }\n }\n\n return {\n next(): LinkId {\n counter += 1;\n return String(counter);\n },\n bump(id: LinkId | number): void {\n const n = typeof id === 'number' ? id : Number(id);\n if (!Number.isFinite(n)) return;\n raise(n);\n }\n };\n}\n","/**\n * `unique_correlative_id` generator — business UID per-sector.\n *\n * Same pure monotonic pattern as `ActivityIdGenerator`, with one defensive\n * twist: a hard ceiling of `9_999_999` on values consumed from `knownIds`\n * and `bump()`. Reason — pre-Aug-2022 production data may contain\n * `unique_correlative_id` values inherited from the old row id (when both\n * were the same field), shaped like `Date.now()` (~1.7e12). Without this\n * filter those rogue values would poison the counter and the next UIDs\n * issued would be in the trillions instead of the next small integer.\n *\n * The legacy frontend applies the same filter in two independent places:\n * - `react_client/.../gantt.helper.js:1291` (`MAX_ACTIVITIES = 9_999_999`).\n * - `react_client/.../taskCreationHelpers.ts:12` (`MAX_CORRELATIVE_DIGITS`).\n *\n * Output: positive integer encoded as string (matches Sequelize BIGINT\n * serialization for this column). Scope: one instance per `ScheduleCore`\n * (= per sector).\n */\n\nconst LEGACY_UID_CEILING = 9_999_999;\n\ninterface UniqueCorrelativeIdGeneratorOptions {\n /** Explicit starting value. First `next()` returns `String(seed + 1)`. */\n readonly seed?: number;\n /** Existing UIDs to skip past. Values > `LEGACY_UID_CEILING` are ignored. */\n readonly knownIds?: Iterable<string | number | null | undefined>;\n}\n\nexport interface UniqueCorrelativeIdGenerator {\n /** Returns the next UID, strictly greater than every previously issued\n * or registered value. */\n next(): string;\n /** Registers an externally-supplied UID (paste, undo) so future `next()`\n * calls never collide. Idempotent. Values > `LEGACY_UID_CEILING`, ≤ 0,\n * or non-finite are ignored. */\n bump(uid: string | number | null | undefined): void;\n}\n\nexport function createUniqueCorrelativeIdGenerator(\n options: UniqueCorrelativeIdGeneratorOptions = {}\n): UniqueCorrelativeIdGenerator {\n let counter: number = options.seed ?? 0;\n\n const raise = (value: number): void => {\n if (\n Number.isFinite(value) &&\n value > 0 &&\n value <= LEGACY_UID_CEILING &&\n value > counter\n ) {\n counter = value;\n }\n };\n\n if (options.knownIds) {\n for (const id of options.knownIds) {\n if (id == null) continue;\n const n = typeof id === 'number' ? id : Number(id);\n raise(n);\n }\n }\n\n return {\n next(): string {\n counter += 1;\n return String(counter);\n },\n bump(uid: string | number | null | undefined): void {\n if (uid == null) return;\n const n = typeof uid === 'number' ? uid : Number(uid);\n raise(n);\n }\n };\n}\n","/**\n * Pure functions to extract prefix/suffix from a Custom ID string.\n * Ported from `react_client/src/utils/customIdTracker/idAnalyzers.js`.\n *\n * \"A10\" → prefix \"A\", suffix \"10\"\n * \"B2C20\" → prefix \"B2C\", suffix \"20\"\n * \"PHASE-A\" → prefix \"PHASE-A\", suffix \"\" (no trailing digits)\n * \"B2 50\" → prefix \"B2 \", suffix \"50\"\n */\n\nexport function isValidCustomId(customId: unknown): customId is string {\n return (\n !!customId && typeof customId === 'string' && customId.trim().length > 0\n );\n}\n\nexport function extractPrefix(customId: unknown): string {\n if (!customId || typeof customId !== 'string') return '';\n if (customId.trim().length === 0) return '';\n const match = customId.match(/^(.*?)(\\d+)$/);\n if (!match) return customId;\n return match[1] ?? '';\n}\n\nexport function extractSuffix(customId: unknown): string {\n if (!customId || typeof customId !== 'string') return '';\n if (customId.trim().length === 0) return '';\n const match = customId.match(/(\\d+)$/);\n if (!match) return '';\n return match[1] ?? '';\n}\n\nexport function getCustomIdFromActivity(activity: unknown): string {\n if (!activity || typeof activity !== 'object') return '';\n const v = (activity as Record<string, unknown>).custom_id;\n return typeof v === 'string' ? v : '';\n}\n\nexport function isParentConversionCase(\n customId: unknown,\n useActivityCustomIdAsReference: boolean\n): boolean {\n return !useActivityCustomIdAsReference && isValidCustomId(customId);\n}\n\nexport function isPasteOrLineReferenceCase(\n customId: unknown,\n useActivityCustomIdAsReference: boolean\n): boolean {\n return useActivityCustomIdAsReference && isValidCustomId(customId);\n}\n","/**\n * Suffix arithmetic preserving the format (leading zeros). All BigInt\n * under the hood. Ported verbatim from\n * `react_client/src/utils/customIdTracker/suffixUtils.js`.\n */\n\nexport function isValidSuffix(suffix: unknown): suffix is string {\n return (\n typeof suffix === 'string' && suffix.length > 0 && /^\\d+$/.test(suffix)\n );\n}\n\nexport function suffixToBigInt(suffixString: string): bigint {\n if (!isValidSuffix(suffixString)) return 0n;\n try {\n return BigInt(suffixString);\n } catch {\n return 0n;\n }\n}\n\nexport function formatSuffix(\n numericValue: bigint,\n referenceSuffix: string\n): string {\n if (typeof numericValue !== 'bigint') return '';\n const stringValue = numericValue.toString();\n if (!isValidSuffix(referenceSuffix)) return stringValue;\n const targetLength = referenceSuffix.length;\n return stringValue.padStart(targetLength, '0');\n}\n\nexport function addToSuffix(\n suffixString: string,\n incrementString: string\n): string {\n const currentValue = suffixToBigInt(suffixString);\n const incrementValue = suffixToBigInt(incrementString);\n const newValue = currentValue + incrementValue;\n return formatSuffix(newValue, suffixString);\n}\n\nexport function compareSuffix(suffixA: string, suffixB: string): number {\n const numA = suffixToBigInt(suffixA);\n const numB = suffixToBigInt(suffixB);\n if (numA < numB) return -1;\n if (numA > numB) return 1;\n return 0;\n}\n\nexport function minSuffix(suffixA: string, suffixB: string): string {\n return compareSuffix(suffixA, suffixB) <= 0 ? suffixA : suffixB;\n}\n\nexport function maxSuffix(suffixA: string, suffixB: string): string {\n return compareSuffix(suffixA, suffixB) >= 0 ? suffixA : suffixB;\n}\n\nexport function minSuffixFromArray(suffixes: ReadonlyArray<string>): string {\n if (!suffixes || suffixes.length === 0) {\n throw new Error('minSuffixFromArray requires non-empty array');\n }\n return suffixes.reduce((min, current) => minSuffix(min, current));\n}\n\nexport function maxSuffixFromArray(suffixes: ReadonlyArray<string>): string {\n if (!suffixes || suffixes.length === 0) {\n throw new Error('maxSuffixFromArray requires non-empty array');\n }\n return suffixes.reduce((max, current) => maxSuffix(max, current));\n}\n","/**\n * Strategy selection for `CustomIdTracker.generateCustomIdForNewChild`.\n * Pure functions, ported from\n * `react_client/src/utils/customIdTracker/generationStrategies.js`.\n */\n\nimport {\n isParentConversionCase,\n isPasteOrLineReferenceCase,\n extractPrefix,\n extractSuffix\n} from './id-analyzers.js';\nimport { addToSuffix } from './suffix-utils.js';\n\nexport interface StrategyConfig {\n readonly prefix: string;\n readonly baseSuffix: string | null;\n}\n\nexport type StrategyKey = 'parentConversion' | 'pasteReference' | 'noContext';\n\nexport function parentConversionStrategy(\n defaultPrefix: string\n): StrategyConfig {\n return { prefix: defaultPrefix, baseSuffix: null };\n}\n\nexport function pasteReferenceStrategy(\n customId: string,\n suffixIncrement: string\n): StrategyConfig {\n const suffix = extractSuffix(customId);\n return {\n prefix: extractPrefix(customId),\n baseSuffix: addToSuffix(suffix, suffixIncrement)\n };\n}\n\nexport function noContextStrategy(defaultPrefix: string): StrategyConfig {\n return { prefix: defaultPrefix, baseSuffix: null };\n}\n\nexport function selectGenerationStrategy(\n customId: unknown,\n useActivityCustomIdAsReference: boolean\n): StrategyKey {\n if (isParentConversionCase(customId, useActivityCustomIdAsReference)) {\n return 'parentConversion';\n }\n if (isPasteOrLineReferenceCase(customId, useActivityCustomIdAsReference)) {\n return 'pasteReference';\n }\n return 'noContext';\n}\n","/**\n * CustomIdTracker — analyzes and manages Custom ID prefixes/suffixes.\n *\n * Ported from `react_client/src/utils/customIdTracker/CustomIdTracker.js`\n * (786 LOC). Two deliberate divergences vs the legacy:\n *\n * 1. NOT a singleton — each `ScheduleCore` owns its own tracker so\n * multi-instance tests don't share state.\n *\n * 2. `defaultPrefix` and `suffixIncrement` are INJECTED at construction\n * time instead of being read from `getCurrentProject()`. The host\n * passes the project's `custom_id_prefix` and `custom_id_increment`;\n * the package stays project-agnostic.\n */\n\nimport {\n MAX_GENERATION_ITERATIONS,\n MAX_CUSTOM_ID_LENGTH,\n MAX_SEARCH_MULTIPLIER,\n DEFAULT_PREFIX,\n DEFAULT_SUFFIX_INCREMENT\n} from './constants.js';\nimport {\n extractPrefix,\n extractSuffix,\n getCustomIdFromActivity\n} from './id-analyzers.js';\nimport {\n parentConversionStrategy,\n pasteReferenceStrategy,\n noContextStrategy,\n selectGenerationStrategy,\n type StrategyKey,\n type StrategyConfig\n} from './generation-strategies.js';\nimport {\n isValidSuffix,\n addToSuffix,\n compareSuffix,\n minSuffix,\n maxSuffix,\n minSuffixFromArray,\n maxSuffixFromArray,\n suffixToBigInt\n} from './suffix-utils.js';\n\ninterface CustomIdTrackerOptions {\n /** Project's custom_id_prefix. Defaults to `'A'`. */\n readonly defaultPrefix?: string | undefined;\n /** Project's custom_id_increment as a string. Defaults to `'10'`. */\n readonly suffixIncrement?: string | undefined;\n}\n\ninterface PrefixStats {\n min: string;\n max: string;\n next: string;\n quantity: number;\n usedSuffixes: Set<string>;\n}\n\nexport class CustomIdTracker {\n private readonly prefixMap = new Map<string, PrefixStats>();\n private readonly processedIds = new Set<string>();\n readonly defaultPrefix: string;\n readonly suffixIncrement: string;\n\n constructor(options: CustomIdTrackerOptions = {}) {\n this.defaultPrefix = options.defaultPrefix ?? DEFAULT_PREFIX;\n this.suffixIncrement = options.suffixIncrement ?? DEFAULT_SUFFIX_INCREMENT;\n }\n\n extractPrefix(customId: unknown): string {\n return extractPrefix(customId);\n }\n\n extractSuffix(customId: unknown): string {\n return extractSuffix(customId);\n }\n\n analyzeCustomId(customId: unknown): { prefix: string; suffix: string } {\n return {\n prefix: this.extractPrefix(customId),\n suffix: this.extractSuffix(customId)\n };\n }\n\n private _updatePrefixStats(prefix: string, suffix: string): void {\n if (!this.prefixMap.has(prefix)) {\n this.prefixMap.set(prefix, {\n min: suffix,\n max: suffix,\n next: suffix,\n quantity: 1,\n usedSuffixes: new Set([suffix])\n });\n this._recalculateNext(prefix);\n return;\n }\n\n const currentStats = this.prefixMap.get(prefix)!;\n if (currentStats.usedSuffixes.has(suffix)) return;\n\n // Mutate the existing Set instead of rebuilding it. The previous\n // `new Set([...currentStats.usedSuffixes, suffix])` was O(N) per\n // add — for 20k custom_ids sharing one prefix that's O(N²) ≈ 200M\n // ops, observed as ~2.5s freeze on initial load. No external code\n // holds the stats reference between calls, so in-place mutation is\n // safe.\n currentStats.usedSuffixes.add(suffix);\n currentStats.min = minSuffix(suffix, currentStats.min);\n currentStats.max = maxSuffix(suffix, currentStats.max);\n currentStats.quantity += 1;\n this._recalculateNext(prefix);\n }\n\n private _recalculateNext(prefix: string): void {\n const stats = this.prefixMap.get(prefix);\n if (!stats) return;\n const next = this.getNextAvailableSuffix(prefix);\n stats.next = next ?? this.suffixIncrement;\n }\n\n getPrefixStats(\n prefix: string\n ): Pick<PrefixStats, 'min' | 'max' | 'next' | 'quantity'> | null {\n const stats = this.prefixMap.get(prefix);\n if (!stats) return null;\n return {\n min: stats.min,\n max: stats.max,\n next: stats.next,\n quantity: stats.quantity\n };\n }\n\n getNextSuffix(prefix: string): string {\n const stats = this.prefixMap.get(prefix);\n return stats ? stats.next : this.suffixIncrement;\n }\n\n getAllPrefixes(): string[] {\n return Array.from(this.prefixMap.keys());\n }\n\n registerCustomId(customId: unknown): { prefix: string; suffix: string } {\n if (!customId || typeof customId !== 'string') {\n return { prefix: '', suffix: '' };\n }\n\n const { prefix, suffix } = this.analyzeCustomId(customId);\n if (!prefix && !suffix) return { prefix, suffix };\n\n if (this.prefixMap.has(prefix)) {\n const stats = this.prefixMap.get(prefix)!;\n if (!stats.usedSuffixes.has(suffix)) {\n stats.usedSuffixes.add(suffix);\n stats.min = minSuffix(suffix, stats.min);\n stats.max = maxSuffix(suffix, stats.max);\n stats.quantity += 1;\n this._recalculateNext(prefix);\n }\n } else {\n this.prefixMap.set(prefix, {\n min: suffix,\n max: suffix,\n next: addToSuffix(suffix, this.suffixIncrement),\n quantity: 1,\n usedSuffixes: new Set([suffix])\n });\n }\n\n this.processedIds.add(customId);\n return { prefix, suffix };\n }\n\n releaseCustomId(customId: string | null = null): {\n prefix: string;\n suffix: string;\n } {\n if (!customId || typeof customId !== 'string') {\n return { prefix: '', suffix: '' };\n }\n\n const { prefix, suffix } = this.analyzeCustomId(customId);\n if (!this.prefixMap.has(prefix)) return { prefix, suffix };\n\n const currentStats = this.prefixMap.get(prefix)!;\n if (currentStats.usedSuffixes.has(suffix)) {\n const newQuantity = currentStats.quantity - 1;\n if (newQuantity === 0) {\n this.prefixMap.delete(prefix);\n } else {\n const newUsed = new Set(currentStats.usedSuffixes);\n newUsed.delete(suffix);\n const remaining = Array.from(newUsed);\n if (remaining.length === 0) {\n this.prefixMap.delete(prefix);\n } else {\n currentStats.usedSuffixes = newUsed;\n currentStats.min = minSuffixFromArray(remaining);\n currentStats.max = maxSuffixFromArray(remaining);\n currentStats.quantity = newQuantity;\n this._recalculateNext(prefix);\n }\n }\n }\n this.processedIds.delete(customId);\n return { prefix, suffix };\n }\n\n trackCustomIdChange(\n oldCustomId: string | null,\n newCustomId: string | null\n ): {\n oldPrefix: string;\n oldSuffix: string;\n newPrefix: string;\n newSuffix: string;\n } {\n const released = this.releaseCustomId(oldCustomId);\n const registered = this.registerCustomId(newCustomId);\n return {\n oldPrefix: released.prefix,\n oldSuffix: released.suffix,\n newPrefix: registered.prefix,\n newSuffix: registered.suffix\n };\n }\n\n private _exceedsMaxLength(customId: string): boolean {\n return customId.length > MAX_CUSTOM_ID_LENGTH;\n }\n\n private _shouldSearchForGaps(prefix: string): boolean {\n if (!this.prefixMap.has(prefix)) return false;\n const stats = this.prefixMap.get(prefix)!;\n const nextWouldBe = `${prefix}${addToSuffix(stats.max, this.suffixIncrement)}`;\n return nextWouldBe.length > MAX_CUSTOM_ID_LENGTH;\n }\n\n private _findFirstAvailableGap(prefix: string): string | null {\n if (!this.prefixMap.has(prefix)) return null;\n const stats = this.prefixMap.get(prefix)!;\n let candidate = this.suffixIncrement;\n while (compareSuffix(candidate, stats.max) < 0) {\n const fullId = `${prefix}${candidate}`;\n if (fullId.length > MAX_CUSTOM_ID_LENGTH) return null;\n if (!stats.usedSuffixes.has(candidate)) return candidate;\n candidate = addToSuffix(candidate, this.suffixIncrement);\n }\n return null;\n }\n\n private _generateDefaultCustomId(): string {\n const nextSuffix = this.getNextAvailableSuffix(this.defaultPrefix);\n if (nextSuffix === null) {\n if (this._shouldSearchForGaps(this.defaultPrefix)) {\n const gap = this._findFirstAvailableGap(this.defaultPrefix);\n if (gap !== null) return `${this.defaultPrefix}${gap}`;\n }\n return `${this.defaultPrefix}${this.suffixIncrement}`;\n }\n return `${this.defaultPrefix}${nextSuffix}`;\n }\n\n getNextAvailableSuffix(\n prefix: string,\n baseSuffix: string | null = null\n ): string | null {\n if (!this.prefixMap.has(prefix)) {\n const candidate =\n baseSuffix && isValidSuffix(baseSuffix)\n ? baseSuffix\n : this.suffixIncrement;\n if (`${prefix}${candidate}`.length > MAX_CUSTOM_ID_LENGTH) return null;\n return candidate;\n }\n\n const stats = this.prefixMap.get(prefix)!;\n const step = this.suffixIncrement;\n\n if (!baseSuffix || !isValidSuffix(baseSuffix)) {\n const candidate = addToSuffix(stats.max, step);\n if (`${prefix}${candidate}`.length > MAX_CUSTOM_ID_LENGTH) return null;\n return candidate;\n }\n\n let candidate = baseSuffix;\n for (let i = 0; i < MAX_SEARCH_MULTIPLIER; i++) {\n if (`${prefix}${candidate}`.length > MAX_CUSTOM_ID_LENGTH) return null;\n if (!stats.usedSuffixes.has(candidate)) return candidate;\n candidate = addToSuffix(candidate, step);\n }\n\n const fallback = addToSuffix(stats.max, step);\n if (`${prefix}${fallback}`.length > MAX_CUSTOM_ID_LENGTH) return null;\n return fallback;\n }\n\n generateNextCustomId(prefix: string): string {\n let nextSuffix = this.getNextAvailableSuffix(prefix);\n if (nextSuffix === null) return this._generateDefaultCustomId();\n\n if (this.prefixMap.has(prefix)) {\n const stats = this.prefixMap.get(prefix)!;\n let iteration = 0;\n while (\n stats.usedSuffixes.has(nextSuffix) &&\n iteration < MAX_GENERATION_ITERATIONS\n ) {\n const next = this.getNextAvailableSuffix(\n prefix,\n addToSuffix(nextSuffix, this.suffixIncrement)\n );\n if (next === null) return this._generateDefaultCustomId();\n nextSuffix = next;\n iteration++;\n }\n }\n\n let generatedId = `${prefix}${nextSuffix}`;\n if (this._exceedsMaxLength(generatedId)) {\n generatedId = this._generateDefaultCustomId();\n }\n return generatedId;\n }\n\n /**\n * Seed the tracker from an array of activities. Idempotent.\n */\n populateFromActivities(\n activities: ReadonlyArray<{ custom_id?: unknown }>\n ): this {\n if (!Array.isArray(activities)) return this;\n\n const uniqueCustomIds = [\n ...new Set(\n activities\n .filter((a) => a && typeof a.custom_id === 'string' && a.custom_id)\n .map((a) => a.custom_id as string)\n )\n ];\n\n for (const customId of uniqueCustomIds) {\n if (this.processedIds.has(customId)) continue;\n const { prefix, suffix } = this.analyzeCustomId(customId);\n if (prefix || suffix) {\n this._updatePrefixStats(prefix, suffix);\n this.processedIds.add(customId);\n }\n }\n return this;\n }\n\n getDefaults(): { prefix: string; increment: string } {\n return { prefix: this.defaultPrefix, increment: this.suffixIncrement };\n }\n\n /**\n * Generates a custom ID for a new child activity.\n *\n * Three strategies (see `selectGenerationStrategy`):\n * - parentConversion: parent has customId → release it, child uses defaults.\n * - pasteReference: reference has customId → use its prefix + suffix as base.\n * - noContext: no reference → use defaults.\n */\n generateCustomIdForNewChild(params: {\n activity: unknown;\n useActivityCustomIdAsReference?: boolean;\n }): string {\n const { activity, useActivityCustomIdAsReference = false } = params;\n const customId = getCustomIdFromActivity(activity);\n const strategyKey: StrategyKey = selectGenerationStrategy(\n customId,\n useActivityCustomIdAsReference\n );\n const { prefix, baseSuffix } = this._applyGenerationStrategy(\n strategyKey,\n customId\n );\n\n let capturedNextSuffix: string | null = null;\n if (strategyKey === 'parentConversion' && this.prefixMap.has(prefix)) {\n const currentMax = this.prefixMap.get(prefix)!.max;\n capturedNextSuffix = addToSuffix(currentMax, this.suffixIncrement);\n }\n if (strategyKey === 'parentConversion') {\n this.releaseCustomId(customId);\n }\n\n const effectiveBaseSuffix =\n strategyKey === 'parentConversion' && capturedNextSuffix\n ? capturedNextSuffix\n : baseSuffix;\n\n const nextSuffix = this.getNextAvailableSuffix(prefix, effectiveBaseSuffix);\n\n if (nextSuffix === null) {\n const generatedId = this._generateDefaultCustomId();\n this.registerCustomId(generatedId);\n return generatedId;\n }\n\n let generatedId = `${prefix}${nextSuffix}`;\n if (this._exceedsMaxLength(generatedId)) {\n generatedId = this._generateDefaultCustomId();\n }\n this.registerCustomId(generatedId);\n return generatedId;\n }\n\n private _applyGenerationStrategy(\n strategyKey: StrategyKey,\n customId: string\n ): StrategyConfig {\n switch (strategyKey) {\n case 'parentConversion':\n return parentConversionStrategy(this.defaultPrefix);\n case 'pasteReference':\n return pasteReferenceStrategy(customId, this.suffixIncrement);\n default:\n return noContextStrategy(this.defaultPrefix);\n }\n }\n\n /**\n * Generates customId for parent-to-child conversion after outdent demote.\n * If `siblingCustomId` is provided, follows its pattern (prefix + next\n * suffix). Otherwise uses defaults.\n */\n generateCustomIdForRestoredChild(\n siblingCustomId: string | null = null\n ): string {\n if (siblingCustomId) {\n const trimmed = siblingCustomId.trim();\n if (trimmed.length > 0) {\n const prefix = this.extractPrefix(trimmed);\n const suffix = this.extractSuffix(trimmed);\n const baseSuffix = addToSuffix(suffix, this.suffixIncrement);\n const nextSuffix = this.getNextAvailableSuffix(prefix, baseSuffix);\n\n if (nextSuffix === null) {\n const generated = this._generateDefaultCustomId();\n this.registerCustomId(generated);\n return generated;\n }\n\n let generated = `${prefix}${nextSuffix}`;\n if (this._exceedsMaxLength(generated)) {\n generated = this._generateDefaultCustomId();\n }\n this.registerCustomId(generated);\n return generated;\n }\n }\n\n const generated = this.generateNextCustomId(this.defaultPrefix);\n this.registerCustomId(generated);\n return generated;\n }\n\n clear(): void {\n this.prefixMap.clear();\n this.processedIds.clear();\n }\n\n getTotalPrefixes(): number {\n return this.prefixMap.size;\n }\n\n hasPrefix(prefix: string): boolean {\n return this.prefixMap.has(prefix);\n }\n\n /**\n * O(1) check — used by inline-edit to validate \"no duplicate\". When\n * `currentCustomId` is passed, returns false if the new value matches\n * (no-op edit). Used by the dispatch's `customIdPipeline.validate`.\n */\n isCustomIdInUse(\n customId: string,\n currentCustomId: string | null = null\n ): boolean {\n if (!customId || typeof customId !== 'string' || !customId.trim()) {\n return false;\n }\n const trimmedId = customId.trim();\n if (currentCustomId && trimmedId === currentCustomId.trim()) {\n return false;\n }\n return this.processedIds.has(trimmedId);\n }\n}\n\n// Helper for tests; matches legacy suffixToBigInt re-export so test code\n// can reach it without deep imports.\nexport { suffixToBigInt };\n","import { START_DATE } from '../start-date/constants.js';\nimport { END_DATE } from '../end-date/constants.js';\nimport { CONSTRAINT_DATE } from '../constraint-date/constants.js';\n\n/**\n * Activity fields whose stored value is a `Date`.\n *\n * SINGLE SOURCE OF TRUTH for \"which activity fields are dates\". Used to coerce\n * string inputs (backend ISO strings / recording wall-clock) to `Date` at the\n * write boundary (`ScheduleState.setActivityField`) and by the replay harness\n * (`coreIntent`, `translateTrigger`). Do NOT re-declare this set as a literal\n * anywhere — import it.\n *\n * Built from the column constants so it can never drift from the field names.\n * NB: the critical-path date outputs (`earlyStart`/`lateFinish`/…) and\n * `last_constraint_date` are NOT here — they are written as `Date` directly\n * (never coerced from a string), so they are a different concern (see the\n * harness `CPM_DATE_FIELDS`).\n */\nexport const DATE_FIELDS: ReadonlySet<string> = new Set([\n START_DATE,\n END_DATE,\n CONSTRAINT_DATE\n]);\n\n/**\n * Coerce a raw field value to its stored form at the write boundary.\n *\n * Date fields (per `DATE_FIELDS`) that arrive as ISO strings (backend payloads,\n * recording wall-clock) become `Date`; every other value passes through\n * unchanged (already-`Date` date fields, non-date fields of any type).\n *\n * Pure. Used by `ScheduleState.setActivityField`. NB: this is the minimal\n * string→Date coercion — it does NOT validate the parsed date or branch on\n * `instanceof Date`; the harness `coreIntent.coerceDateColumn` does both for\n * its own (different) input contract and is intentionally NOT unified here.\n */\nexport function coerceActivityFieldValue(\n field: string,\n value: unknown\n): unknown {\n if (DATE_FIELDS.has(field) && typeof value === 'string') {\n return new Date(value);\n }\n return value;\n}\n","/**\n * Per-dispatch write journal for `ScheduleState`. Two layers:\n *\n * 1. `dirty` + `before` — every activity mutated through `setActivityField(s)`,\n * plus a pre-mutation clone captured on the FIRST field write. Consumed by\n * `assembleChangeSet` so a field write the handler never enumerated still\n * rides the ChangeSet and can be undone. (Unchanged, original behavior.)\n * 2. `ops` — an ORDERED log of the STRUCTURAL mutations (activity insert/remove,\n * link add/remove/field) as they happen. This is the inverse-replay source\n * the transactional rollback consumes (added 2026-07-14, transaction plan\n * Stage 2): a Set/Map cannot express the order in which inserts, removes and\n * link ops interleave, and rollback is strict reverse-chronological replay.\n * Observation-only until the rollback mechanism lands — nothing reads `ops`\n * yet, so recording it is behavior-preserving.\n *\n * `end()` DISCARDS the journal; the rollback consumes it (via `peek()`) BEFORE\n * `end()` runs.\n */\n\nimport type {\n EngineActivitySnapshot,\n LinkSnapshot\n} from '../../autoscheduler/types.js';\n\n/** One structural mutation, with the data its inverse needs. */\nexport type MutationOp =\n | { readonly kind: 'insert'; readonly activityId: string }\n | {\n readonly kind: 'remove';\n readonly activityId: string;\n readonly before: EngineActivitySnapshot;\n }\n | { readonly kind: 'link-add'; readonly linkId: string }\n | {\n readonly kind: 'link-remove';\n readonly linkId: string;\n readonly before: LinkSnapshot;\n }\n | {\n readonly kind: 'link-field';\n readonly linkId: string;\n readonly before: LinkSnapshot;\n };\n\nexport interface ActivityWriteCapture {\n readonly dirty: ReadonlySet<string>;\n readonly before: ReadonlyMap<string, EngineActivitySnapshot>;\n readonly ops: readonly MutationOp[];\n /**\n * Pre-sweep `correlative_id` per activity the correlative renumbering shifted.\n * That sweep mutates `correlative_id` DIRECTLY (bypassing `setActivityField`,\n * so it never lands in `before`) — this captures it separately for rollback,\n * read ONLY by restore, never by `assembleChangeSet`.\n */\n readonly correlativeBefore: ReadonlyMap<string, number>;\n /**\n * Pre-`applyResults` clone per activity the autoscheduler moved. `applyResults`\n * writes start/end dates DIRECTLY (bypassing `setActivityField`), so a throw\n * AFTER the autoschedule would strand those dates — this captures them for\n * rollback. Read ONLY by restore.\n */\n readonly scheduledBefore: ReadonlyMap<string, EngineActivitySnapshot>;\n}\n\nexport class WriteCapture {\n private _journal: {\n dirty: Set<string>;\n before: Map<string, EngineActivitySnapshot>;\n ops: MutationOp[];\n linkFieldCaptured: Set<string>;\n correlativeBefore: Map<string, number>;\n scheduledBefore: Map<string, EngineActivitySnapshot>;\n } | null = null;\n\n begin(): void {\n this._journal = {\n dirty: new Set<string>(),\n before: new Map<string, EngineActivitySnapshot>(),\n ops: [],\n linkFieldCaptured: new Set<string>(),\n correlativeBefore: new Map<string, number>(),\n scheduledBefore: new Map<string, EngineActivitySnapshot>()\n };\n }\n\n peek(): ActivityWriteCapture | null {\n return this._journal;\n }\n\n end(): void {\n this._journal = null;\n }\n\n /** Field write on an activity — pre-mutation clone on first write per id. */\n note(key: string, current: EngineActivitySnapshot): void {\n const journal = this._journal;\n if (!journal) return;\n if (!journal.before.has(key))\n journal.before.set(key, cloneEngineActivity(current));\n journal.dirty.add(key);\n }\n\n noteInsert(activityId: string): void {\n this._journal?.ops.push({ kind: 'insert', activityId });\n }\n\n noteRemove(activityId: string, current: EngineActivitySnapshot): void {\n this._journal?.ops.push({\n kind: 'remove',\n activityId,\n before: cloneEngineActivity(current)\n });\n }\n\n noteLinkAdd(linkId: string): void {\n this._journal?.ops.push({ kind: 'link-add', linkId });\n }\n\n noteLinkRemove(linkId: string, current: LinkSnapshot): void {\n this._journal?.ops.push({\n kind: 'link-remove',\n linkId,\n before: cloneLink(current)\n });\n }\n\n /** Pre-sweep correlative_id of an activity the renumbering shifted (first-wins). */\n noteCorrelativeBefore(activityId: string, before: number): void {\n const journal = this._journal;\n if (!journal || journal.correlativeBefore.has(activityId)) return;\n journal.correlativeBefore.set(activityId, before);\n }\n\n /** Pre-applyResults clone of an activity the autoscheduler will move (first-wins). */\n noteScheduledBefore(\n activityId: string,\n current: EngineActivitySnapshot\n ): void {\n const journal = this._journal;\n if (!journal || journal.scheduledBefore.has(activityId)) return;\n journal.scheduledBefore.set(activityId, cloneEngineActivity(current));\n }\n\n /** Field write on a link — pre-mutation clone on first write per link id. */\n noteLinkField(linkId: string, current: LinkSnapshot): void {\n const journal = this._journal;\n if (!journal || journal.linkFieldCaptured.has(linkId)) return;\n journal.linkFieldCaptured.add(linkId);\n journal.ops.push({\n kind: 'link-field',\n linkId,\n before: cloneLink(current)\n });\n }\n}\n\n/**\n * Pre-mutation clone for the write journal. Shallow copy with fresh Date and\n * link-array instances so the captured before-image is detached from later\n * in-place mutation. Mirrors `structuredCloneActivity` (dispatch/shared) but\n * lives here to keep the state layer free of dispatch-layer imports.\n */\nfunction cloneEngineActivity(\n a: EngineActivitySnapshot\n): EngineActivitySnapshot {\n return {\n ...a,\n start_date: new Date(a.start_date),\n end_date: new Date(a.end_date),\n constraint_date: a.constraint_date ? new Date(a.constraint_date) : null,\n $source: [...a.$source],\n $target: [...a.$target]\n };\n}\n\n/** Links carry only scalars — a shallow copy is a complete detached clone. */\nfunction cloneLink(link: LinkSnapshot): LinkSnapshot {\n return { ...link };\n}\n","/**\n * Calendar arithmetic with per-dispatch memoization, extracted from\n * `ScheduleState` (SRP). Resolves the calendar assigned to an activity\n * (falling back to the default M-F 08-16 UTC calendar) and computes closest\n * work time / end date / duration against it, caching results for the\n * lifetime of one scheduler run.\n *\n * The scheduler calls `clearCache()` at the start of every `schedule()`.\n * Within a run, calendars are immutable, so caching is safe and yields\n * 3-5× speedup on calendar-heavy passes (ASAP/ALAP).\n *\n * `ScheduleState` owns one instance and delegates getClosestWorkTime /\n * calculateEndDate / calculateDuration / clearCalendarCache to it.\n */\n\nimport type { EngineActivitySnapshot } from '../../autoscheduler/types.js';\nimport type { WorkTimeDirection } from '../../types.js';\nimport { CALENDAR_UNIT } from '../../types.js';\nimport type { CalendarAPI } from '../../columns/types.js';\nimport type { CalendarReader } from '../../calendar/api.js';\nimport { DEFAULT_CALENDAR_ID, type CalendarSetup } from './state-ports.js';\n\nexport class CalendarCalculator {\n // In-dispatch calendar API memoization. Lifetime = one scheduler run.\n private _cache = {\n closestWorkTime: new Map<string, Date>(),\n endDate: new Map<string, Date>(),\n duration: new Map<string, number>()\n };\n\n // Single owner of the calendar subsystem. The calc resolves calendars (incl.\n // the `-base` ones and the default fallback) through the reader — one resolver\n // for the whole calendar surface instead of a separate Map + default field.\n /** Resolver for ANY calendar incl. the `-base` ones — also consumed by the\n * column pipelines via `pipeline-context`. */\n readonly reader: CalendarReader;\n\n constructor(setup: CalendarSetup) {\n this.reader = setup.reader;\n }\n\n private resolveCalendar(task?: EngineActivitySnapshot): CalendarAPI {\n const calendarId = resolveCalendarId(task);\n // The reader falls back to the default calendar for unknown ids (incl. the\n // DEFAULT_CALENDAR_ID sentinel), so it never returns null — the `!` reflects\n // that invariant.\n return this.reader.getCalendar(calendarId ?? DEFAULT_CALENDAR_ID)!;\n }\n\n getClosestWorkTime(params: {\n date: Date;\n dir: WorkTimeDirection;\n task: EngineActivitySnapshot;\n }): Date {\n const cacheKey = `${calendarKey(params.task)}|${params.dir}|${params.date.getTime()}`;\n return memoize(this._cache.closestWorkTime, cacheKey, () =>\n this.resolveCalendar(params.task).getClosestWorkTime({\n direction: params.dir,\n date: params.date,\n unit: CALENDAR_UNIT.HOUR\n })\n );\n }\n\n calculateEndDate(params: {\n start_date: Date;\n duration: number;\n task: EngineActivitySnapshot;\n }): Date {\n const cacheKey = `${calendarKey(params.task)}|${params.start_date.getTime()}|${params.duration}`;\n return memoize(this._cache.endDate, cacheKey, () =>\n this.resolveCalendar(params.task).calculateEndDate(\n params.start_date,\n params.duration\n )\n );\n }\n\n calculateDuration(params: {\n start_date: Date;\n end_date: Date;\n task: EngineActivitySnapshot;\n }): number {\n const cacheKey = `${calendarKey(params.task)}|${params.start_date.getTime()}|${params.end_date.getTime()}`;\n return memoize(this._cache.duration, cacheKey, () =>\n this.resolveCalendar(params.task).calculateDuration(\n params.start_date,\n params.end_date\n )\n );\n }\n\n /**\n * Clears the in-dispatch calendar API memoization. Call at the start of\n * every scheduler run (calendars are immutable within a dispatch but may\n * change across dispatches).\n */\n clearCache(): void {\n this._cache.closestWorkTime.clear();\n this._cache.endDate.clear();\n this._cache.duration.clear();\n }\n}\n\n/**\n * Read-through memoization over a `Map`: return the cached value for `key`\n * if present, otherwise run `compute`, store its result, and return it.\n * Uses `!== undefined` for the hit check so a legitimately falsy result\n * (e.g. duration `0`) is treated as cached, not recomputed.\n */\nexport function memoize<CachedValue>(\n cache: Map<string, CachedValue>,\n key: string,\n compute: () => CachedValue\n): CachedValue {\n const cached = cache.get(key);\n if (cached !== undefined) return cached;\n const result = compute();\n cache.set(key, result);\n return result;\n}\n\n/** Cache-key marker for an activity that resolves to the default calendar. */\nconst DEFAULT_CALENDAR_KEY = '__default__';\n\n/**\n * Pure resolution of an activity's calendar id: the single source of the\n * fallback policy shared by `resolveCalendar` and `calendarKey`. Returns the\n * string form of the id when present, or `null` when the activity is missing\n * or has no `calendar_id` (the default-calendar case).\n */\nexport function resolveCalendarId(\n task: EngineActivitySnapshot | undefined\n): string | null {\n if (!task) return null;\n const calendarId = task.calendar_id;\n if (calendarId == null) return null;\n return String(calendarId);\n}\n\n/**\n * Canonical cache key for an activity's resolved calendar. Delegates the\n * fallback decision to `resolveCalendarId`, mapping the default case to the\n * `__default__` marker so cache lookups match `resolveCalendar`.\n */\nfunction calendarKey(task: EngineActivitySnapshot | undefined): string {\n return resolveCalendarId(task) ?? DEFAULT_CALENDAR_KEY;\n}\n","/**\n * Parent → children index for `ScheduleState`, extracted (SRP). Derived from\n * each activity's `parent` field; kept in sync by `ScheduleState`, which calls\n * `rebuild()` on structural changes (constructor, reparent, remove) and\n * `addChild()` on the create/paste fast path.\n *\n * Reads of the activity store (for ancestor walks in `isChildOf` / `getParent`)\n * go through the shared `activities` Map reference passed at construction;\n * the index never mutates that store — all writes route through `ScheduleState`.\n */\n\nimport type {\n ActivityId,\n EngineActivitySnapshot\n} from '../../autoscheduler/types.js';\nimport { isRootParent } from '../hierarchy/root-parent.js';\n\nexport class HierarchyIndex {\n private _childrenByParent = new Map<string | number, ActivityId[]>();\n /**\n * When true, `_childrenByParent` is stale (a `parent` write happened) and is\n * lazily rebuilt on the next `getChildren`. A bulk reparent (K rows) marks\n * dirty K times but pays ONE rebuild on the next read instead of K — turning\n * bulk indent/outdent from O(K·N) into O(K+N). Only `getChildren` reads this\n * index; `getParent`/`getParentId`/`isChildOf` read `activities` directly and\n * are always fresh, so they don't consult the flag. See PERFORMANCE.md §A3.\n */\n private _dirty = false;\n\n constructor(\n private readonly activities: ReadonlyMap<ActivityId, EngineActivitySnapshot>\n ) {}\n\n /** Mark the children index stale; the next `getChildren` rebuilds it once. */\n markDirty(): void {\n this._dirty = true;\n }\n\n getChildren(parentId: ActivityId): ActivityId[] {\n if (this._dirty) {\n this.rebuild();\n this._dirty = false;\n }\n return this._childrenByParent.get(String(parentId)) ?? [];\n }\n\n isChildOf(childId: ActivityId, parentId: ActivityId): boolean {\n let cur: ActivityId | 0 | undefined = this.activities.get(childId)?.parent;\n // Cycle guard: a valid ancestor chain visits each activity at most once, so\n // it cannot exceed the total activity count. More steps than that means the\n // parent pointers form a cycle — stop instead of looping forever. O(1) and\n // allocation-free (audit 2026-07-14 §6.b #3).\n let steps = 0;\n const maxSteps = this.activities.size;\n while (cur && !isRootParent(cur)) {\n if (cur === parentId) return true;\n if (++steps > maxSteps) return false;\n cur = this.activities.get(cur)?.parent;\n }\n return false;\n }\n\n getParent(id: ActivityId): EngineActivitySnapshot | null {\n const p = this.activities.get(id)?.parent;\n if (!p || isRootParent(p)) return null;\n return this.activities.get(p) ?? null;\n }\n\n /**\n * Cheap parent id lookup. Avoids the full `Activity` materialization of\n * `getActivity(id).parent` in hot ancestor walks. Distinct from\n * `getParent` which returns the parent `EngineActivitySnapshot`.\n */\n getParentId(id: ActivityId): ActivityId | 0 {\n const a = this.activities.get(id);\n if (!a) return 0;\n return a.parent ?? 0;\n }\n\n /**\n * Incremental O(1) insert for a freshly added activity (create/paste).\n * The id is new, so no rebuild is needed — reparenting goes through\n * `rebuild()` instead.\n */\n addChild(parent: ActivityId | 0, id: ActivityId): void {\n // If the index is already stale, skip the incremental insert: the pending\n // rebuild reads the store (which holds this activity) and will include it.\n if (this._dirty) return;\n if (isRootParent(parent)) return;\n const key = String(parent);\n const arr = this._childrenByParent.get(key);\n if (arr) {\n if (!arr.includes(id)) arr.push(id);\n } else {\n this._childrenByParent.set(key, [id]);\n }\n }\n\n /** Full rebuild from the activity store. */\n rebuild(): void {\n this._childrenByParent.clear();\n for (const a of this.activities.values()) {\n if (isRootParent(a.parent)) continue;\n // Normalize to String key so getChildren(number) and getChildren(string)\n // both work.\n const key = String(a.parent);\n const arr = this._childrenByParent.get(key) ?? [];\n arr.push(a.id);\n this._childrenByParent.set(key, arr);\n }\n }\n}\n","/**\n * The state container of `ScheduleCore`: Maps of activities, links and\n * calendar APIs. Implements `AutoSchedulerPort` so the autoscheduler can read\n * and write directly. Owned by `ScheduleCore` as `this._state`; not meant\n * to be constructed by library consumers.\n */\n\nimport type { WorkTimeDirection } from '../../types.js';\n// ActivityId is now `string` (unified); all Map lookups use String(id) to\n// tolerate any stray runtime number that slipped through the boundary.\nimport type {\n ActivityId,\n EngineActivitySnapshot,\n AutoSchedulerPort,\n LinkId,\n LinkSnapshot,\n ScheduleFlags\n} from '../../autoscheduler/types.js';\nimport type { StateSnapshot } from '../../autoscheduler/recording-types.js';\nimport type { CalendarAPI, CalendarReader } from '../../columns/types.js';\nimport { coerceActivityFieldValue } from '../../columns/shared/field-types.js';\nimport { ACTIVITY_PROPERTY } from '../../constants/activity-properties.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport {\n shiftStart,\n shiftEnd,\n truncateToUtcDay\n} from '../../columns/shared/date-normalize.js';\nimport { iterateInVisualOrder } from '../hierarchy/visual-order.js';\nimport { createCalendarSetup } from './state-ports.js';\nimport { WriteCapture } from './write-capture.js';\nimport type { ActivityWriteCapture, MutationOp } from './write-capture.js';\nimport { CalendarCalculator } from './calendar-calculator.js';\nimport { HierarchyIndex } from './hierarchy-index.js';\nimport type { ActivityWriter, CalendarOps, WriteJournal } from './roles.js';\n\nexport type { ActivityWriteCapture } from './write-capture.js';\n\nexport class ScheduleState\n implements AutoSchedulerPort, ActivityWriter, WriteJournal, CalendarOps\n{\n // Private so every mutation routes through setActivityField/addActivity/…\n // (the only path that feeds the write-capture → ChangeSet). External readers\n // use the AutoSchedulerPort read methods (getActivity / getAllActivities / …).\n private _activities = new Map<ActivityId, EngineActivitySnapshot>();\n private _links = new Map<LinkId, LinkSnapshot>();\n // Parent → children index. Assigned in the constructor (needs the\n // activities Map reference). See `HierarchyIndex`.\n private _hierarchy: HierarchyIndex;\n private _cache = {\n ids: null as ActivityId[] | null,\n visualOrderIds: null as ActivityId[] | null\n };\n // Per-dispatch write journal. See `WriteCapture` / `ActivityWriteCapture`.\n private _writeCapture = new WriteCapture();\n // Calendar arithmetic + in-dispatch memoization. Assigned in the\n // constructor once the calendar reader is built. See `CalendarCalculator`.\n private _calendar: CalendarCalculator;\n private _flags: ScheduleFlags;\n\n constructor(snapshot: StateSnapshot) {\n // The snapshot is already engine-shaped + Date-native (buildStateSnapshot),\n // so it populates the store directly — no per-activity/link deserialization.\n for (const activity of snapshot.activities) {\n this._activities.set(activity.id, activity);\n }\n for (const link of snapshot.links) {\n this._links.set(String(link.id), link);\n }\n\n // Build calendar APIs from the standalone work-calendar engine\n // (UTC-strict extraction of the DHTMLX module). Snapshot worktime is\n // honored verbatim; activities with no calendar_id (or an unknown one)\n // resolve to a default M-F 08-16 UTC calendar.\n // CalendarCalculator is the single owner of the calendar subsystem\n // (APIs + default + reader + the memoized calc). ScheduleState exposes\n // the data via getters below for external consumers.\n this._calendar = new CalendarCalculator(\n createCalendarSetup(snapshot.calendars)\n );\n this._flags = buildFlags(snapshot);\n this._hierarchy = new HierarchyIndex(this._activities);\n this._hierarchy.rebuild();\n }\n\n // -- AutoSchedulerPort: reads ------------------------------------------------\n\n /**\n * Materializes every alive activity. O(N) allocation.\n * AVOID per-frame / per-dispatch consumers — prefer `forEachActivity` /\n * `getAllIds` when only ids or fast field reads are needed.\n */\n getAllActivities(): ReadonlyArray<EngineActivitySnapshot> {\n return Array.from(this._activities.values());\n }\n getAllLinks(): LinkSnapshot[] {\n return Array.from(this._links.values());\n }\n\n /**\n * Read-only snapshot of every alive activity id. Cached and invalidated\n * lazily on structural mutations (add/remove/parent change).\n */\n getAllIds(): ActivityId[] {\n if (this._cache.ids) return this._cache.ids;\n this._cache.ids = Array.from(this._activities.keys());\n return this._cache.ids;\n }\n\n activityCount(): number {\n return this._activities.size;\n }\n\n /**\n * Every alive activity id in canonical DFS visual order (pre-order from\n * roots, siblings by `correlative_id` ASC — `iterateInVisualOrder`).\n * Cached like `getAllIds`; invalidated on add/remove, on `parent` /\n * `correlative_id` writes, and by `recomputeCorrelativeIds` (the only\n * order chokepoint, which mutates `correlative_id` directly on the\n * snapshots without going through `setActivityField`).\n */\n getVisualOrderIds(): ReadonlyArray<ActivityId> {\n if (this._cache.visualOrderIds) return this._cache.visualOrderIds;\n this._cache.visualOrderIds = iterateInVisualOrder(this).map((activity) =>\n String(activity.id)\n );\n return this._cache.visualOrderIds;\n }\n\n /** Drops the memoized visual order. See `getVisualOrderIds`. */\n invalidateVisualOrderIds(): void {\n this._cache.visualOrderIds = null;\n }\n\n /**\n * Iterates every alive activity without materializing intermediate arrays.\n * Use in hot paths that today call `getAllActivities()` only to walk it.\n */\n forEachActivity(\n visit: (activity: EngineActivitySnapshot, id: ActivityId) => void\n ): void {\n for (const [id, activity] of this._activities) {\n visit(activity, id);\n }\n }\n\n getParentId(activityId: ActivityId): ActivityId | 0 {\n return this._hierarchy.getParentId(activityId);\n }\n getActivity(activityId: ActivityId): EngineActivitySnapshot | null {\n return this._activities.get(String(activityId)) ?? null;\n }\n getLink(linkId: LinkId): LinkSnapshot | null {\n return this._links.get(String(linkId)) ?? null;\n }\n activityExists(activityId: ActivityId): boolean {\n return this._activities.has(String(activityId));\n }\n\n // -- AutoSchedulerPort: hierarchy --------------------------------------------\n\n getChildren(parentId: ActivityId): ActivityId[] {\n return this._hierarchy.getChildren(parentId);\n }\n isChildOf(childId: ActivityId, parentId: ActivityId): boolean {\n return this._hierarchy.isChildOf(childId, parentId);\n }\n getParent(activityId: ActivityId): EngineActivitySnapshot | null {\n return this._hierarchy.getParent(activityId);\n }\n\n // -- AutoSchedulerPort: calendar (snapshot-aware, M-F 08-16 UTC fallback) ---\n\n getClosestWorkTime(params: {\n date: Date;\n dir: WorkTimeDirection;\n task: EngineActivitySnapshot;\n }): Date {\n return this._calendar.getClosestWorkTime(params);\n }\n\n calculateEndDate(params: {\n start_date: Date;\n duration: number;\n task: EngineActivitySnapshot;\n }): Date {\n return this._calendar.calculateEndDate(params);\n }\n\n calculateDuration(params: {\n start_date: Date;\n end_date: Date;\n task: EngineActivitySnapshot;\n }): number {\n return this._calendar.calculateDuration(params);\n }\n\n /**\n * Clears the in-dispatch calendar API memoization. Call at the start of\n * every scheduler run (calendars are immutable within a dispatch but may\n * change across dispatches).\n */\n clearCalendarCache(): void {\n this._calendar.clearCache();\n }\n\n // Calendar resolver exposed for external consumers (initial-passes'\n // expected_progress, adjust-link-lag, pipeline-context). The single owner is\n // `_calendar`; this getter just delegates.\n get calendarReader(): CalendarReader {\n return this._calendar.reader;\n }\n\n // -- AutoSchedulerPort: mutations --------------------------------------------\n\n batchUpdate(runMutations: () => void): void {\n runMutations();\n }\n /**\n * Part of the `AutoSchedulerPort` port (live caller: `applyResults`). No-op\n * here because activities mutate in place via `getLiveActivity`; only a\n * DHTMLX-backed adapter needs this to trigger a re-render.\n */\n updateActivity(_id: ActivityId): void {\n // no-op — activities mutate in place via getLiveActivity\n }\n getLiveActivity(activityId: ActivityId): EngineActivitySnapshot | null {\n return this.getActivity(activityId);\n }\n\n // -- AutoSchedulerPort: flags / config ---------------------------------------\n\n getFlags(): ScheduleFlags {\n return {\n ...this._flags,\n allCheckedTaskIds: [...this._flags.allCheckedTaskIds]\n };\n }\n // Backend ships no project-level dates, so this is always null in\n // production. The ALAP root-boundary branch that reads it stays dormant.\n getProjectEnd(): Date | null {\n return null;\n }\n\n // -- Write capture (per-dispatch journal) --------------------------------\n\n /** Start recording every `setActivityField` write of the current dispatch. */\n beginWriteCapture(): void {\n this._writeCapture.begin();\n }\n\n /** The live journal, or null when no capture is active. */\n peekWriteCapture(): ActivityWriteCapture | null {\n return this._writeCapture.peek();\n }\n\n /** Stop and discard the current dispatch's write journal. */\n endWriteCapture(): void {\n this._writeCapture.end();\n }\n\n // -- Replay-specific mutators --------------------------------------------\n\n /**\n * Typed write: `field` must be a known `EngineActivitySnapshot` key and\n * `value` its declared type — catches `setActivityField(id, 'progress', 'x')`\n * at compile time. The few genuinely dynamic callers (the column-pipeline\n * `FieldChanges` plumbing + undo replay) cast the key to `keyof` at their\n * boundary; there is no string/unknown overload by design.\n */\n setActivityField<Field extends keyof EngineActivitySnapshot>(\n activityId: ActivityId,\n field: Field,\n value: EngineActivitySnapshot[Field]\n ): void {\n const activity = this.getActivity(activityId);\n if (!activity) return;\n this._writeCapture.note(String(activityId), activity);\n activity[field] = coerceActivityFieldValue(\n field,\n value\n ) as EngineActivitySnapshot[Field];\n // Mutating `parent` directly bypasses the children index, leaving\n // `getChildren()` stale. Mark it dirty; the next `getChildren` rebuilds\n // once — a bulk reparent (K writes) pays one rebuild, not K (PERFORMANCE.md\n // §A3).\n if (field === ACTIVITY_PROPERTY.PARENT) this._hierarchy.markDirty();\n if (fieldAffectsVisualOrder(field)) this._cache.visualOrderIds = null;\n }\n\n /**\n * Bulk write: set several fields of ONE activity, paying the getActivity\n * lookup + write-capture `note()` ONCE instead of per field (vs N\n * `setActivityField` calls). For callers that write many derived fields at\n * once (critical path's 7 fields, cost/hh cascades). Same coercion + the\n * single `parent` reindex as `setActivityField`. Dynamic by nature — the keys\n * are cast to `keyof` at this boundary (no per-field generic).\n */\n setActivityFields(\n activityId: ActivityId,\n fields: Partial<EngineActivitySnapshot>\n ): void {\n const activity = this.getActivity(activityId);\n if (!activity) return;\n this._writeCapture.note(String(activityId), activity);\n let reparented = false;\n // Dynamic-key write: `Reflect.set` avoids the `never` of a keyof-typed\n // assignment without casting the target. The key cast is the documented\n // dynamic-write boundary (same as setActivityField's dynamic callers).\n for (const field of Object.keys(fields) as Array<\n keyof EngineActivitySnapshot\n >) {\n Reflect.set(\n activity,\n field,\n coerceActivityFieldValue(field, fields[field])\n );\n if (field === ACTIVITY_PROPERTY.PARENT) reparented = true;\n if (fieldAffectsVisualOrder(field)) this._cache.visualOrderIds = null;\n }\n if (reparented) this._hierarchy.markDirty();\n }\n\n addLink(link: LinkSnapshot): void {\n this._writeCapture.noteLinkAdd(String(link.id));\n this._links.set(String(link.id), { ...link });\n // Replace (never push in place) so a consumer holding a reference to a\n // pre-mutation $source/$target array — e.g. an undo entry's captured\n // before-image — is never corrupted. `attachLinkRef` returns the SAME array\n // when the id is already present (no realloc on duplicates). (B6)\n const sourceActivity = this.getActivity(link.source);\n if (sourceActivity)\n sourceActivity.$source = attachLinkRef(sourceActivity.$source, link.id);\n const targetActivity = this.getActivity(link.target);\n if (targetActivity)\n targetActivity.$target = attachLinkRef(targetActivity.$target, link.id);\n }\n\n /**\n * Working hours per day of the calendar assigned to the activity. Used\n * by the link applier to render the lag in working-days in the\n * `custom_predecessors` / `custom_sucessors` columns. Different\n * activities may use different calendars (8h, 6h, 16h-double-shift, …);\n * the value is derived dynamically from each calendar so the formatter\n * never has to assume.\n *\n * See: pp2-schedule/newPlanSchedule/RULE_link_lag_display_format.md\n */\n getWorkingHoursPerDayForActivity(activityId: ActivityId): number {\n const activity = this.getActivity(activityId);\n if (!activity) return DEFAULT_HOURS_PER_DAY;\n const calApi = this.calendarReader.getCalendar(\n String(activity.calendar_id)\n );\n if (!calApi) return DEFAULT_HOURS_PER_DAY;\n return measureCalendarHoursPerDay(calApi, activity.start_date);\n }\n\n setLinkField<Field extends keyof LinkSnapshot>(\n linkId: LinkId,\n field: Field,\n value: LinkSnapshot[Field]\n ): void {\n const link = this.getLink(linkId);\n if (!link) return;\n this._writeCapture.noteLinkField(String(linkId), link);\n link[field] = value;\n }\n\n removeLink(linkId: LinkId): void {\n const link = this.getLink(linkId);\n if (!link) return;\n this._writeCapture.noteLinkRemove(String(linkId), link);\n this._links.delete(String(linkId));\n const sourceActivity = this.getActivity(link.source);\n if (sourceActivity)\n sourceActivity.$source = detachLinkRef(sourceActivity.$source, link.id);\n const targetActivity = this.getActivity(link.target);\n if (targetActivity)\n targetActivity.$target = detachLinkRef(targetActivity.$target, link.id);\n }\n\n addActivity(activity: EngineActivitySnapshot): void {\n this._writeCapture.noteInsert(String(activity.id));\n this._activities.set(activity.id, activity);\n this._cache.ids = null;\n this._cache.visualOrderIds = null;\n // Update incremental del índice (O(1)) en vez de un rebuild O(N): pegar N\n // activities hacía O(N²) (perf audit, finding #3). El id es nuevo\n // (create/paste); el reparenting va por `setActivityField('parent')` que\n // sí rehace el índice entero.\n this._hierarchy.addChild(activity.parent, activity.id);\n }\n\n removeActivity(activityId: ActivityId): void {\n const activity = this.getActivity(activityId);\n if (activity) this._writeCapture.noteRemove(String(activityId), activity);\n this._activities.delete(activityId);\n this._cache.ids = null;\n this._cache.visualOrderIds = null;\n this._hierarchy.markDirty();\n }\n\n /**\n * Transactional rollback: invert every journaled mutation so the store returns\n * to its pre-dispatch state. Consumed by the facade on a failed dispatch,\n * BEFORE `endWriteCapture` discards the journal. Reverse-chronological replay,\n * bucketed in the dependency order the red-team fixed (endpoints before links,\n * re-inserts before re-adds). All writes are DIRECT (never through the\n * journaling mutators) so the rollback does not re-journal itself. O(touched).\n *\n * NOTE: covers everything routed through setActivityField + the structural\n * mutators (the whole handler phase). The autoscheduler's `applyResults` date\n * writes bypass the journal and are not yet reverted here (transaction plan\n * Stage 4) — a create that throws AFTER autoschedule leaves those dates, which\n * is still strictly less corrupt than today's no-rollback.\n */\n /** Pre-sweep correlative_id of an activity the renumbering shifted. Journaled\n * separately (the sweep bypasses setActivityField) so rollback can revert it. */\n noteCorrelativeBefore(activityId: string, before: number): void {\n this._writeCapture.noteCorrelativeBefore(activityId, before);\n }\n\n /** Pre-applyResults clone of an activity the autoscheduler will move. Journaled\n * separately (applyResults bypasses setActivityField) so rollback can revert\n * the scheduler's date writes. */\n noteScheduledBefore(\n activityId: string,\n current: EngineActivitySnapshot\n ): void {\n this._writeCapture.noteScheduledBefore(activityId, current);\n }\n\n restoreFromCapture(): void {\n const journal = this._writeCapture.peek();\n if (!journal) return;\n const { ops, before, correlativeBefore, scheduledBefore } = journal;\n // Bucketed in the dependency order the red-team fixed: endpoints before\n // links, re-inserts before re-adds. See the phase helpers below.\n this._undoLinkAdds(ops);\n this._undoInserts(ops);\n this._reInsertRemovedActivities(ops);\n this._reAddRemovedLinks(ops);\n this._restoreLinkFields(ops);\n // Field images, weakest → strongest precedence: correlative (single field) →\n // scheduler pre-move clone → field before-images (pre-dispatch, the ultimate\n // authority, wins for any activity that was also field-written).\n this._restoreCorrelatives(correlativeBefore);\n this._restoreActivityFields(scheduledBefore);\n this._restoreActivityFields(before);\n this._cache.ids = null;\n this._cache.visualOrderIds = null;\n this._hierarchy.markDirty();\n }\n\n private _restoreCorrelatives(\n correlativeBefore: ReadonlyMap<string, number>\n ): void {\n for (const [id, before] of correlativeBefore) {\n const live = this._activities.get(id);\n if (live) live.correlative_id = before;\n }\n }\n\n private _undoLinkAdds(ops: readonly MutationOp[]): void {\n for (const op of ops)\n if (op.kind === 'link-add') this._detachLink(op.linkId);\n }\n\n private _undoInserts(ops: readonly MutationOp[]): void {\n for (const op of ops)\n if (op.kind === 'insert') this._activities.delete(op.activityId);\n }\n\n private _reInsertRemovedActivities(ops: readonly MutationOp[]): void {\n for (const op of ops)\n if (op.kind === 'remove') this._activities.set(op.activityId, op.before);\n }\n\n private _reAddRemovedLinks(ops: readonly MutationOp[]): void {\n for (const op of ops)\n if (op.kind === 'link-remove') this._attachLink(op.before);\n }\n\n private _restoreLinkFields(ops: readonly MutationOp[]): void {\n for (const op of ops)\n if (op.kind === 'link-field' && this._links.has(op.linkId))\n this._links.set(op.linkId, op.before);\n }\n\n /** Restore scalar fields in place on surviving rows. `$source`/`$target` are\n * owned by the link inverses (above) and never touched here. */\n private _restoreActivityFields(\n before: ReadonlyMap<string, EngineActivitySnapshot>\n ): void {\n for (const [id, snapshot] of before) {\n const live = this._activities.get(id);\n if (live) this._restoreScalarFields(live, snapshot);\n }\n }\n\n private _restoreScalarFields(\n live: EngineActivitySnapshot,\n before: EngineActivitySnapshot\n ): void {\n for (const key of Object.keys(live)) {\n if (key === '$source' || key === '$target') continue;\n if (!Object.hasOwn(before, key)) Reflect.deleteProperty(live, key);\n }\n for (const key of Object.keys(before)) {\n if (key === '$source' || key === '$target') continue;\n Reflect.set(live, key, Reflect.get(before, key));\n }\n }\n\n private _attachLink(link: LinkSnapshot): void {\n this._links.set(String(link.id), { ...link });\n const source = this.getActivity(link.source);\n if (source) source.$source = attachLinkRef(source.$source, link.id);\n const target = this.getActivity(link.target);\n if (target) target.$target = attachLinkRef(target.$target, link.id);\n }\n\n private _detachLink(linkId: string): void {\n const link = this.getLink(linkId);\n if (!link) return;\n this._links.delete(String(linkId));\n const source = this.getActivity(link.source);\n if (source) source.$source = detachLinkRef(source.$source, link.id);\n const target = this.getActivity(link.target);\n if (target) target.$target = detachLinkRef(target.$target, link.id);\n }\n}\n\n// ---------------------------------------------------------------------------\n// Helpers\n// ---------------------------------------------------------------------------\n\n/** Default working hours per day when no calendar resolves (the M-F 08-16 default). */\nconst DEFAULT_HOURS_PER_DAY = 8;\n\n/**\n * Writes that can change the DFS visual order: reparenting or renumbering.\n * Guards the `visualOrderIds` memo in `setActivityField`/`setActivityFields`.\n */\nfunction fieldAffectsVisualOrder(field: keyof EngineActivitySnapshot): boolean {\n return field === ACTIVITY_PROPERTY.PARENT || field === COLUMN.CORRELATIVE_ID;\n}\n\n/**\n * Measure a calendar's working hours per day around `referenceDate`: snap it\n * forward to that day's shift_start, snap the next midnight back to its\n * shift_end, and take the working duration between them. The caller passes a\n * REAL date the activity already lives on (its `start_date`) — no hardcoded\n * day, so no calendar exception can corrupt the measurement. Homogeneous\n * calendars only — heterogeneous (different hours per weekday) are out of scope\n * (the lag display is ambiguous there). Falls back to the default when the\n * calendar yields no work time.\n */\nexport function measureCalendarHoursPerDay(\n calApi: CalendarAPI,\n referenceDate: Date\n): number {\n // Measure the full working day `referenceDate` falls on (or the next working\n // day if that day is non-working). Truncating to the day start first makes the\n // result independent of `referenceDate`'s time-of-day — the contract is\n // hours-per-DAY, so a mid-shift reference must not under-measure.\n const dayStart = shiftStart(calApi, truncateToUtcDay(referenceDate));\n const dayEnd = shiftEnd(calApi, dayStart);\n const workingHours = calApi.calculateDuration(dayStart, dayEnd);\n return workingHours > 0 ? workingHours : DEFAULT_HOURS_PER_DAY;\n}\n\n/**\n * Remove a link id from an activity's `$source`/`$target` ref list, returning a\n * NEW array (replace-never-mutate, so captured before-images stay intact).\n */\nexport function detachLinkRef(\n refs: readonly LinkId[],\n linkId: LinkId\n): LinkId[] {\n return refs.filter((ref) => String(ref) !== String(linkId));\n}\n\n/**\n * Add a link id to an activity's `$source`/`$target` ref list: a NEW array when\n * the id is added, or the SAME array when already present (no realloc on\n * duplicates — see the B6 invariant in `addLink`).\n */\nexport function attachLinkRef(refs: LinkId[], linkId: LinkId): LinkId[] {\n return refs.includes(linkId) ? refs : [...refs, linkId];\n}\n\nfunction buildFlags(snapshot: StateSnapshot): ScheduleFlags {\n const rawFlags = snapshot.runtimeFlags ?? {};\n return {\n isPasting: Boolean(rawFlags.isPasting),\n isBulkOperation: Boolean(rawFlags.isBulkOperation),\n dragWithMultiple: Boolean(rawFlags.dragWithMultiple),\n draggingSingleMilestone: Boolean(rawFlags.draggingSingleMilestone),\n creatingActivity: false,\n avoidAutoScheduleBeforeDrag: false,\n maxPerformance: Boolean(rawFlags.maxPerformance),\n allCheckedTaskIds: []\n };\n}\n","import type { ActivityWriter, CalendarOps } from '../state/roles.js';\nimport { COLUMN } from '../../constants/columns.js';\nimport { ACTIVITY_PROPERTY } from '../../constants/activity-properties.js';\nimport { DEMOTION_TARGET_TYPE } from '../../activity-types/index.js';\nimport { WORK_TIME_DIRECTION } from '../../types.js';\n\n/**\n * Demote childless summaries to leaves at load (legacy DHTMLX `auto_types`).\n * (Full rationale: see scheduleCore.ts history — keyed on REAL children via\n * getChildren, not the backend has_childs flag.)\n */\nexport function demoteChildlessSummaries(\n state: ActivityWriter & CalendarOps\n): void {\n const idsToDemote: string[] = [];\n state.forEachActivity((activity, activityId) => {\n if (activity.type !== 'project') return;\n if (state.getChildren(String(activityId)).length === 0) {\n idsToDemote.push(String(activityId));\n }\n });\n for (const activityId of idsToDemote) {\n state.setActivityField(\n activityId,\n ACTIVITY_PROPERTY.TYPE,\n DEMOTION_TARGET_TYPE\n );\n snapDemotedLeafTiming(state, activityId);\n }\n}\n\n/**\n * Mirror legacy `updateTaskTiming` for a just-demoted childless summary: zero\n * the stored start to midnight, snap forward to the calendar's closest work\n * time (shift_start), and recompute the end from start + duration.\n */\nfunction snapDemotedLeafTiming(\n state: ActivityWriter & CalendarOps,\n activityId: string\n): void {\n const activity = state.getActivity(activityId);\n if (!activity || !activity.start_date || activity.duration == null) return;\n const midnight = new Date(activity.start_date);\n midnight.setUTCHours(0, 0, 0, 0);\n const start = state.getClosestWorkTime({\n date: midnight,\n dir: WORK_TIME_DIRECTION.FUTURE,\n task: activity\n });\n if (start.getTime() === activity.start_date.getTime()) return;\n const end = state.calculateEndDate({\n start_date: start,\n duration: activity.duration,\n task: activity\n });\n state.setActivityField(activityId, COLUMN.START_DATE, start);\n state.setActivityField(activityId, COLUMN.END_DATE, end);\n}\n","/**\n * Builds the `StateSnapshot` that hydrates `ScheduleState` from the parsed\n * backend payload. Engine-shaped and Date-native — `ScheduleState` consumes it\n * directly, with NO serialize/deserialize round-trip (the snapshot lives one\n * synchronous hop and is never persisted to JSON). Pure function, no state.\n */\n\nimport { activityToSnapshot } from '../dispatch/conversion.js';\nimport type {\n SerializedCalendar,\n StateSnapshot\n} from '../autoscheduler/recording-types.js';\nimport type {\n EngineActivitySnapshot,\n LinkSnapshot\n} from '../autoscheduler/types.js';\nimport type { Activity, Calendar, Link } from '../types.js';\n\ninterface LinkIndex {\n sourceByActivity: Map<string, string[]>;\n targetByActivity: Map<string, string[]>;\n}\n\nfunction getOrPush(\n map: Map<string, string[]>,\n key: string,\n value: string\n): void {\n const existing = map.get(key);\n if (existing) existing.push(value);\n else map.set(key, [value]);\n}\n\nfunction indexLinksByActivity(links: ReadonlyArray<Link>): LinkIndex {\n const sourceByActivity = new Map<string, string[]>();\n const targetByActivity = new Map<string, string[]>();\n for (const link of links) {\n getOrPush(sourceByActivity, String(link.source), String(link.id));\n getOrPush(targetByActivity, String(link.target), String(link.id));\n }\n return { sourceByActivity, targetByActivity };\n}\n\nfunction buildStoreActivity(\n activity: Activity,\n hoursPerDay: number,\n linkIndex: LinkIndex\n): EngineActivitySnapshot {\n // `activityToSnapshot` already yields the engine shape (Date-native dates,\n // duration in HOURS, parent normalized to numeric `0` / string id). It returns\n // a freshly-allocated object that nothing else holds, so stamp the link-ref\n // index onto it IN PLACE — avoiding a second full object spread per activity\n // (~10% faster at 100K activities). No date serialization — the store holds\n // `Date` directly, so no deserialization is needed on the other side.\n const snapshot = activityToSnapshot(activity, hoursPerDay);\n snapshot.$source = linkIndex.sourceByActivity.get(activity.id) ?? [];\n snapshot.$target = linkIndex.targetByActivity.get(activity.id) ?? [];\n return snapshot;\n}\n\nfunction buildStoreLink(link: Link): LinkSnapshot {\n return {\n // Spread first to preserve passthrough backend fields (proplannerId,\n // ganttId, sectorId) through the snapshot — dropping proplannerId here was\n // a bug: the core lost each link's backend id, so save dirty-detection and\n // the DHTMLX adapter could not tell persisted links from new ones.\n ...link,\n id: String(link.id),\n source: String(link.source),\n target: String(link.target),\n type: link.type,\n lag: Number(link.lag)\n };\n}\n\nfunction serializeWorktime(\n worktime: Calendar['worktime']\n): SerializedCalendar['worktime'] {\n return {\n days: worktime.days,\n hours: worktime.hours,\n // Preserve per-date overrides (holidays + workday shift exceptions)\n // through the snapshot so the work-calendar engine sees them when\n // the state hydrates. Dropping these here was the bug that made\n // multi-shift / exception-day calendars snap to wrong hours after\n // every edit.\n ...(worktime.dates ? { dates: worktime.dates } : {}),\n ...(worktime.customWeeks ? { customWeeks: worktime.customWeeks } : {})\n };\n}\n\nfunction serializeCalendar(calendar: Calendar): SerializedCalendar {\n return {\n id: String(calendar.id),\n worktime: serializeWorktime(calendar.worktime)\n };\n}\n\nexport function buildStateSnapshot(\n activities: ReadonlyArray<Activity>,\n links: ReadonlyArray<Link>,\n calendars: ReadonlyArray<Calendar>,\n hoursPerDay: number,\n baseCalendars: ReadonlyArray<Calendar> = []\n): StateSnapshot {\n const linkIndex = indexLinksByActivity(links);\n\n const storeActivities = activities.map((activity) =>\n buildStoreActivity(activity, hoursPerDay, linkIndex)\n );\n\n const storeLinks = links.map(buildStoreLink);\n\n // Base (baseline) calendars carry `-base` ids → no collision with scheduling\n // calendars. They are registered in the engine (so `expected_progress_base`\n // can run `calculateDuration` against them) but never enter the scheduling\n // `_calendars` map / selector.\n const serializedCalendars: SerializedCalendar[] = [\n ...calendars.map(serializeCalendar),\n ...baseCalendars.map(serializeCalendar)\n ];\n\n return {\n activities: storeActivities,\n links: storeLinks,\n calendars: serializedCalendars\n };\n}\n","/**\n * initialize-core — the construction + load-pass orchestration extracted from\n * the `ScheduleCore` constructor. `initializeCore(input)` performs the entire\n * load sequence (parse → snapshot → state → demote → id generators →\n * custom-id tracker → optional baseline block → initial passes) and returns\n * the assembled internals (`CoreInternals`) for the facade to assign. The\n * facade constructor is assignment-only.\n *\n * The load-pass ORDER here is a CONTRACT — see `CURSOR.md`\n * §\"Flujo de core.dispatch paso a paso\" and the inline comments below. Do not\n * reorder, merge, or drop any step.\n *\n * The public types (`ScheduleCoreStatus`, `ScheduleCoreInput`) live here so\n * `initialize-core.ts` never imports from `scheduleCore.ts` (which imports\n * `initializeCore`), avoiding an import cycle. `scheduleCore.ts` re-exports the\n * two public types\n * so `src/index.ts`'s existing `export type { ... } from './init/schedule-core.js'`\n * keeps resolving unchanged.\n */\n\nimport { parseFromBackend } from '../boundary/backend/parse-from-backend.js';\nimport type { BackendInput } from '../boundary/backend/types.js';\nimport {\n createActivityIdGenerator,\n type ActivityIdGenerator\n} from '../generators/activity-id-generator.js';\nimport {\n createLinkIdGenerator,\n type LinkIdGenerator\n} from '../generators/link-id-generator.js';\nimport {\n createUniqueCorrelativeIdGenerator,\n type UniqueCorrelativeIdGenerator\n} from '../generators/unique-correlative-id-generator.js';\nimport { CustomIdTracker } from '../generators/custom-id/tracker.js';\nimport { ScheduleState } from '../internal/state/schedule-state.js';\nimport { demoteChildlessSummaries } from '../internal/post-processors/demote-childless-summaries.js';\nimport { AutoScheduler } from '../autoscheduler/index.js';\nimport { buildStateSnapshot } from './build-state-snapshot.js';\nimport { runInitialPasses } from './initial-passes.js';\nimport type {\n BaselinePoint,\n Calendar,\n SectorMetadata,\n StatusCriteria\n} from '../types.js';\nimport { applyBaselineOverlay } from '../baselines/apply-baseline-overlay.js';\nimport { resolveStatusCriteria } from '../columns/status/constants.js';\nimport { endOfLocalDay } from '../columns/shared/date-normalize.js';\nimport type { ScheduleCoreReporter } from '../shared/reporter.js';\nimport { noopReporter } from '../shared/reporter.js';\n\nexport type ScheduleCoreStatus = 'ready' | 'destroyed' | 'poisoned';\n\nexport const SCHEDULE_CORE_STATUS = {\n READY: 'ready',\n DESTROYED: 'destroyed',\n /** A rollback failed mid-restore — state may be inconsistent; the host must\n * reload from backend. All further dispatches are refused. */\n POISONED: 'poisoned'\n} as const satisfies Record<string, ScheduleCoreStatus>;\n\nexport interface ScheduleCoreInput extends BackendInput {\n /**\n * Skip the full autoscheduler pass that normally runs from the\n * constructor (`runInitialPasses`).\n *\n * Backend data already ships with `start_date` / `end_date` / `duration`\n * scheduled — running the full ASAP+ALAP graph at load is redundant and\n * extremely slow on large schedules (thousands of activities + links).\n *\n * When `true`, the constructor still runs the lightweight bottom-up\n * post-processors (`updateParentBoundsFromChildren`) so parent bounds\n * and progress rollup are consistent. The autoscheduler runs lazily on\n * the first `dispatch(...)` call.\n *\n * Default: `false` (preserve existing behaviour). The bridge in\n * `react_client/` sets this to `true` for production loads.\n */\n skipInitialAutoSchedule?: boolean;\n /**\n * Baseline points (backend `sectorbaselinepoint[]`, the `activityponts`\n * endpoint payload) to overlay at load. Each point maps to an activity by\n * `point.activityId` → `activity.proplannerId`. When present, the constructor\n * overlays them so the baseline columns + `expected_progress_base` can read the\n * ACTIVE point. NB: ponderators are NOT recomputed at load (backend ships the\n * value prod renders verbatim — recomputing diverges); `goCalculatePonderators`\n * is a save-time op. Omit (or pass `[]`) for projects with no baseline.\n */\n baselinePoints?: readonly BaselinePoint[];\n /**\n * Clock port for time-dependent columns (`expected_progress*`). A FUNCTION\n * (not a frozen instant): the core calls it FRESH each time it needs \"today\"\n * (load + every dispatch that recomputes expected_progress), so the value\n * tracks the real day even on a long-lived session — never congelado.\n *\n * Opt-in (no default): omit it → the core does NOT compute `expected_progress`\n * (preserves the legacy path; keeps the test suite deterministic). Production\n * injects `() => new Date()`; tests inject `() => fixedDate` for reproducibility.\n * The core never calls `new Date()` itself — this port is the only time source.\n */\n clock?: () => Date;\n /**\n * Critical-path mode at LOAD. The CP is ALWAYS computed; this flag only\n * decides WHEN `core.ready` is considered settled:\n * - `false` (default — front): `core.ready` resolves WITHOUT the CP (fast\n * load); the CP runs async and is delivered via `core.criticalPathReady`.\n * - `true` (backend, no front): `core.ready` WAITS for the CP — it is part of\n * the load (blocking). The caller does a single `await core.ready` and has\n * the dates + CP fields ready.\n */\n criticalPathOnLoad?: boolean;\n /**\n * Initial status criterion (`'Baseline' | 'Actual'`) for the `status` column.\n * Not a backend field (client-only view pref); the client passes the current\n * value, defaulting to `'Baseline'`. Overrides the sector default when present.\n * Changed at runtime via `ScheduleCore.setStatusCriteria`.\n */\n statusCriteria?: StatusCriteria;\n /**\n * Optional injected port for data-quality warnings and scheduling errors.\n * Defaults to a no-op when absent (the core never touches console/Sentry).\n */\n reporter?: ScheduleCoreReporter;\n}\n\n/**\n * The assembled internals returned by `initializeCore`. The facade\n * constructor assigns each field to its `this._X` counterpart (and spreads\n * `calendars`/`baseCalendars` into its held maps/arrays).\n */\ninterface CoreInternals {\n sector: SectorMetadata;\n state: ScheduleState;\n scheduler: AutoScheduler;\n activityIdGen: ActivityIdGenerator;\n linkIdGen: LinkIdGenerator;\n uidGen: UniqueCorrelativeIdGenerator;\n customIdTracker: CustomIdTracker;\n calendars: readonly Calendar[];\n baseCalendars: readonly Calendar[];\n clock: (() => Date) | null;\n reporter: ScheduleCoreReporter;\n initPromise: Promise<void>;\n}\n\nexport function initializeCore(input: ScheduleCoreInput): CoreInternals {\n // `clock` is the time source for expected_progress — a FUNCTION, called fresh,\n // NOT a frozen instant. Opt-in: no clock → no expected_progress computed.\n // `loadNow` is the comparison instant for the LOAD pass ONLY; dispatch-time\n // recomputes call `clock()` again (see scheduleCore `_dispatchInner`), so a\n // long-lived session tracks the real day. Rounded to the END of the LOCAL day\n // to match legacy `calculateExpected` (lookahead-common.js\n // `date_actual.setHours(23,59)`): same instant as prod. PLAN-02 leaf 25:\n // raw → 18.25, end-of-day → 20.5 (the oracle).\n const clock = input.clock ?? null;\n const loadNow = clock ? endOfLocalDay(clock()) : null;\n const reporter = input.reporter ?? noopReporter;\n\n const parsed = parseFromBackend(\n {\n sector: input.sector,\n activities: input.activities,\n links: input.links,\n calendars: input.calendars,\n baseCalendars: input.baseCalendars\n },\n reporter\n );\n\n const sector = parsed.sector;\n // status_criteria is a client-only view pref: normalize the client's value\n // (untyped JS, may be undefined) to a valid criterion here, the single init\n // boundary. parseSector already seeded the default; this applies the override.\n sector.statusCriteria = resolveStatusCriteria(input.statusCriteria);\n const calendars = parsed.calendars;\n // Baseline calendars kept SEPARATE — never added to `_calendars`, so the\n // scheduling calendar resolution (`resolveCalendar`/default pick) can never\n // see them. Only the bridge reads them, for the baseline render.\n const baseCalendars = parsed.baseCalendars ?? [];\n\n // Build the StateSnapshot that ScheduleState consumes.\n const snapshot = buildStateSnapshot(\n parsed.activities,\n parsed.links,\n parsed.calendars,\n sector.hoursPerDay,\n baseCalendars\n );\n\n const state = new ScheduleState(snapshot);\n const scheduler = new AutoScheduler(state, reporter);\n\n // Childless-summary demotion (legacy DHTMLX `auto_types` plugin, enabled at\n // `gantt-general-config.js:1781`). At onParse legacy demotes any\n // `type='project'` node with NO actual children to `type='task'` — keyed on\n // `gantt.hasChild(id)`, NOT the backend `has_childs` flag (which can be a\n // stale/phantom true). The demoted node then schedules + computes\n // expected_progress / CPM as a LEAF off its own dates. Mirror it once at\n // load, before the baseline / expected_progress / CPM passes read `type`.\n demoteChildlessSummaries(state);\n\n // Seed the id generators from the loaded activities so future\n // `dispatch({kind:'activity-create'})` calls never collide with\n // existing ids/UIDs.\n const activityIdGen = createActivityIdGenerator({\n knownIds: parsed.activities.map((a) => a.id)\n });\n // Mismo formato que DHTMLX uid(): entero creciente desde Date.now().\n // `knownIds` arranca el contador por encima de cualquier link id ya\n // existente del backend, evitando colisiones con ids previos.\n const linkIdGen = createLinkIdGenerator({\n knownIds: parsed.links.map((l) => l.id)\n });\n const uidGen = createUniqueCorrelativeIdGenerator({\n knownIds: parsed.activities.map((a) => a.unique_correlative_id)\n });\n\n // CustomIdTracker — indexes the existing custom_ids so generation +\n // validation can answer \"is this already taken?\" in O(1).\n const customIdTracker = new CustomIdTracker({\n defaultPrefix: sector.customIdPrefix,\n suffixIncrement: sector.customIdIncrement\n });\n customIdTracker.populateFromActivities(parsed.activities);\n\n // Baselines (if fed): attach the points + derive expected_progress_base, the\n // 5 snapshot columns, and real_cost from the ACTIVE point. Called on the\n // underlying state directly (the public methods assertReady, not yet true\n // during construction). `loadNow` is already rounded to END-OF-LOCAL-DAY\n // (legacy parity). Same sequence as the runtime re-apply — shared via\n // `applyBaselineOverlay` so load and runtime never drift. NB: ponderators are\n // deliberately NOT recomputed (backend ships them; recompute at load diverges).\n if (input.baselinePoints && input.baselinePoints.length > 0) {\n const defaultBaseCalendarId =\n baseCalendars.find((calendar) => calendar.baseDefault)?.id ?? null;\n applyBaselineOverlay(\n state,\n input.baselinePoints,\n loadNow,\n defaultBaseCalendarId\n );\n }\n\n // Backend data already ships scheduled, so the full ASAP+ALAP pass\n // is redundant on initial load — and extremely slow on large\n // schedules (thousands of activities + links). When\n // `skipInitialAutoSchedule` is set, we only run the lightweight\n // bottom-up post-processors so parent bounds + progress rollup are\n // consistent; the scheduler will run lazily inside the first\n // `dispatch(...)` call.\n const initPromise = runInitialPasses({\n state,\n sector,\n scheduler,\n skipAutoSchedule: input.skipInitialAutoSchedule === true,\n // `loadNow` is rounded to end-of-local-day (legacy `calculateExpected`\n // parity) — the LOAD expected_progress pass. Dispatch-time recomputes call\n // `clock()` fresh, so a long-lived session tracks the real day.\n now: loadNow ?? undefined\n });\n\n return {\n sector,\n state,\n scheduler,\n activityIdGen,\n linkIdGen,\n uidGen,\n customIdTracker,\n calendars,\n baseCalendars,\n clock,\n reporter,\n initPromise\n };\n}\n","import { dispatch as performDispatch } from '../dispatch/dispatch.js';\nimport { createActivitySync } from '../dispatch/handlers/activity-create.js';\nimport type {\n ChangeSet,\n DispatchAction,\n DispatchOptions,\n DispatchResult\n} from '../dispatch/types.js';\nimport type { ActivityIdGenerator } from '../generators/activity-id-generator.js';\nimport type { LinkIdGenerator } from '../generators/link-id-generator.js';\nimport type { UniqueCorrelativeIdGenerator } from '../generators/unique-correlative-id-generator.js';\nimport type { CustomIdTracker } from '../generators/custom-id/tracker.js';\nimport type { ScheduleState } from '../internal/state/schedule-state.js';\nimport {\n readActivity,\n readAllActivities,\n readAllIds,\n forEachActivityId,\n readChildren,\n readChildrenIds,\n readSelectedActivityIds,\n readHasChild,\n readLink,\n readAllLinks\n} from './read-api.js';\nimport {\n applyBaselines as applyBaselinesFn,\n recomputeAllPonderators as recomputeAllPonderatorsFn,\n recomputeAllProgressRollup as recomputeAllProgressRollupFn,\n recomputeStatus as recomputeStatusFn\n} from './recompute-api.js';\nimport { resolveStatusCriteria } from '../columns/status/constants.js';\nimport {\n computeProjectWorkHours,\n type ProjectWorkHours\n} from '../internal/state/project-work-hours.js';\nimport { buildPipelineContext } from '../internal/state/pipeline-context.js';\nimport type { AutoScheduler } from '../autoscheduler/index.js';\nimport type {\n Activity,\n ActivityCreter,\n ActivityId,\n BaselinePoint,\n Calendar,\n CalendarId,\n Link,\n LinkId,\n SectorMetadata,\n StatusCriteria\n} from '../types.js';\nimport { UndoRecorder } from '../dispatch/undo/undo-recorder.js';\nimport {\n buildUndoEntry,\n applyUndo,\n applyRedo,\n isUndoableAction,\n changeSetIsSubstantive,\n captureCreatedSnapshots,\n computeCoalesceKey,\n buildInverseChangeSet,\n needsResync\n} from '../dispatch/undo/undo-entry.js';\nimport { endOfLocalDay } from '../columns/shared/date-normalize.js';\nimport { applyCriticalPathAtLoad } from '../critical-path/run-critical-path.js';\nimport { DURATION } from '../columns/duration/constants.js';\nimport { assembleChangeSet } from '../dispatch/shared/change-set.js';\nimport {\n toPublicActivity,\n toPublicChangeSet,\n toPublicDuration,\n type OutputUnit\n} from '../dispatch/shared/public-units.js';\nimport type { EngineActivitySnapshot } from '../autoscheduler/types.js';\nimport { SaveTracker } from '../boundary/save/save-tracker.js';\nimport {\n initializeCore,\n SCHEDULE_CORE_STATUS,\n type ScheduleCoreInput,\n type ScheduleCoreStatus\n} from './initialize-core.js';\n\nexport type {\n ScheduleCoreInput,\n ScheduleCoreStatus\n} from './initialize-core.js';\nimport type { ScheduleCoreReporter } from '../shared/reporter.js';\n\ninterface CoreRuntime {\n readonly state: ScheduleState;\n readonly scheduler: AutoScheduler;\n readonly sector: SectorMetadata;\n readonly activityIdGenerator: ActivityIdGenerator;\n readonly linkIdGenerator: LinkIdGenerator;\n readonly uniqueCorrelativeIdGenerator: UniqueCorrelativeIdGenerator;\n readonly customIdTracker: CustomIdTracker;\n readonly calendars: Map<CalendarId, Calendar>;\n readonly baseCalendars: readonly Calendar[];\n readonly clock: (() => Date) | null;\n readonly reporter: ScheduleCoreReporter;\n}\n\nexport class ScheduleCore {\n private _status: ScheduleCoreStatus = SCHEDULE_CORE_STATUS.READY;\n /** True while an async dispatch is suspended inside the write-capture window.\n * A sync facade mutation running in that gap would corrupt the in-flight\n * journal, so sync mutators refuse to run while it is set. */\n private _dispatchInFlight = false;\n private readonly coreRuntime: CoreRuntime;\n private readonly _undo: UndoRecorder = new UndoRecorder();\n private _opQueue: Promise<unknown> = Promise.resolve();\n // Deferred critical path: `_mutationEpoch` bumps whenever the state changes\n // WITHOUT refreshing the CP (a `skipCriticalPath` dispatch, or undo/redo).\n // `_cpComputedEpoch` records the epoch the CP was last computed for. When\n // they match the CP is fresh and `recomputeCriticalPath()` no-ops. Starts at\n // 0 because the load already launches a CP pass for the initial state.\n private _mutationEpoch = 0;\n private _cpComputedEpoch = 0;\n\n constructor(input: ScheduleCoreInput) {\n const initialized = initializeCore(input);\n this.coreRuntime = {\n state: initialized.state,\n scheduler: initialized.scheduler,\n sector: initialized.sector,\n activityIdGenerator: initialized.activityIdGen,\n linkIdGenerator: initialized.linkIdGen,\n uniqueCorrelativeIdGenerator: initialized.uidGen,\n customIdTracker: initialized.customIdTracker,\n clock: initialized.clock,\n calendars: new Map(\n initialized.calendars.map((calendar) => [calendar.id, calendar])\n ),\n baseCalendars: initialized.baseCalendars,\n reporter: initialized.reporter\n };\n this._initPromise = initialized.initPromise.then(() => {\n if (this._status === SCHEDULE_CORE_STATUS.DESTROYED) return;\n this._saveTracker.init(\n this.getAllActivitiesView(),\n this.getAllLinksView()\n );\n });\n\n this._criticalPathReady = this._initPromise.then(() =>\n this._enqueue(() => this._runCriticalPathAndCapture())\n );\n\n const waitForCriticalPathOnLoad = input.criticalPathOnLoad === true;\n this._ready = waitForCriticalPathOnLoad\n ? this._criticalPathReady.then(() => undefined)\n : this._initPromise;\n }\n\n get ready(): Promise<void> {\n return this._ready;\n }\n\n get criticalPathReady(): Promise<{ changes: ChangeSet }> {\n return this._criticalPathReady;\n }\n\n get status(): ScheduleCoreStatus {\n return this._status;\n }\n\n getSector(): Readonly<SectorMetadata> {\n return this.coreRuntime.sector;\n }\n\n getActivityView(\n id: ActivityId,\n unit: OutputUnit = 'days'\n ): Readonly<Activity> | null {\n this.assertReady();\n return readActivity(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay,\n id,\n unit\n );\n }\n\n getAllActivitiesView(\n unit: OutputUnit = 'days'\n ): ReadonlyArray<Readonly<Activity>> {\n this.assertReady();\n return readAllActivities(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay,\n unit\n );\n }\n\n getChildrenView(\n parentId: ActivityId | '0',\n unit: OutputUnit = 'days'\n ): ReadonlyArray<Readonly<Activity>> {\n this.assertReady();\n return readChildren(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay,\n parentId,\n unit\n );\n }\n\n getLinkView(id: LinkId, unit: OutputUnit = 'days'): Readonly<Link> | null {\n this.assertReady();\n return readLink(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay,\n id,\n unit\n );\n }\n\n getAllLinksView(unit: OutputUnit = 'days'): ReadonlyArray<Readonly<Link>> {\n this.assertReady();\n return readAllLinks(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay,\n unit\n );\n }\n\n getProperty<Property extends keyof Activity>(\n activityId: ActivityId,\n property: Property,\n options?: { unit?: OutputUnit }\n ): Activity[Property] | null {\n this.assertReady();\n const snapshot = this.coreRuntime.state.getActivity(activityId);\n if (!snapshot) return null;\n const value: unknown = Reflect.get(snapshot, property);\n if (property === DURATION) {\n return toPublicDuration(\n value as number,\n this.coreRuntime.sector.hoursPerDay,\n options?.unit ?? 'days'\n ) as Activity[Property];\n }\n return value as Activity[Property];\n }\n\n getAllIds(): readonly string[] {\n this.assertReady();\n return readAllIds(this.coreRuntime.state);\n }\n\n forEachActivityId(visit: (id: string) => void): void {\n this.assertReady();\n forEachActivityId(this.coreRuntime.state, visit);\n }\n\n getChildrenIds(parentId: ActivityId | '0'): ReadonlyArray<ActivityId> {\n this.assertReady();\n return readChildrenIds(this.coreRuntime.state, parentId);\n }\n\n getSelectedActivityIds(): string[] {\n this.assertReady();\n return readSelectedActivityIds(this.coreRuntime.state);\n }\n\n /**\n * Every activity id in canonical DFS visual order (pre-order from roots,\n * siblings by `correlative_id` ASC) — ALL activities; filtering by\n * `visible` is the consumer's job. Memoized in the state and invalidated\n * on any structural mutation (add/remove/reparent/renumber), so repeated\n * reads between mutations are O(1).\n */\n getVisualOrderIds(): ReadonlyArray<ActivityId> {\n this.assertReady();\n return this.coreRuntime.state.getVisualOrderIds();\n }\n\n hasChild(parentId: ActivityId | '0'): boolean {\n this.assertReady();\n return readHasChild(this.coreRuntime.state, parentId);\n }\n\n getCalendar(id: CalendarId): Readonly<Calendar> | null {\n this.assertReady();\n return this.coreRuntime.calendars.get(id) ?? null;\n }\n\n getAllCalendars(): ReadonlyArray<Readonly<Calendar>> {\n this.assertReady();\n return Array.from(this.coreRuntime.calendars.values());\n }\n\n getBaseCalendars(): ReadonlyArray<Readonly<Calendar>> {\n this.assertReady();\n return this.coreRuntime.baseCalendars;\n }\n\n isCustomIdInUse(\n customId: string,\n currentCustomId: string | null = null\n ): boolean {\n this.assertReady();\n return this.coreRuntime.customIdTracker.isCustomIdInUse(\n customId,\n currentCustomId\n );\n }\n\n getProjectWorkHours(): ProjectWorkHours | null {\n this.assertReady();\n return computeProjectWorkHours(this.coreRuntime.calendars.values());\n }\n\n getModifiedLinks(): ReadonlyArray<Readonly<Link>> {\n this.assertReady();\n return this._saveTracker.modifiedLinks(this.getAllLinksView());\n }\n\n markLinksPersisted(): void {\n this._saveTracker.snapshotLinks(this.getAllLinksView());\n }\n\n getModifiedActivities(): ReadonlyArray<Readonly<Activity>> {\n this.assertReady();\n return this._saveTracker.modifiedActivities(this.getAllActivitiesView());\n }\n\n markActivitiesPersisted(): void {\n this._saveTracker.snapshotActivities(this.getAllActivitiesView());\n }\n\n applyBaselines(\n points: readonly BaselinePoint[]\n ): ReadonlyArray<Readonly<Activity>> {\n this.assertReady();\n const now = this.coreRuntime.clock\n ? endOfLocalDay(this.coreRuntime.clock())\n : null;\n const defaultBaseCalendarId =\n this.coreRuntime.baseCalendars.find((calendar) => calendar.baseDefault)\n ?.id ?? null;\n return applyBaselinesFn(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay,\n points,\n now,\n defaultBaseCalendarId\n );\n }\n\n /**\n * Whole-tree ponderator recompute (zeroes, then redistributes 100 within\n * each parent from its children's active baselines, weighted by `criterion`).\n * Returns the activities whose `ponderator` changed, for a prop-only repaint.\n * The base rollup (`applyBaselines`) depends on fresh ponderators, so callers\n * run this before it on a criterion change or baseline save.\n */\n recomputeAllPonderators(\n criterion: ActivityCreter\n ): ReadonlyArray<Readonly<Activity>> {\n this.assertReady();\n return recomputeAllPonderatorsFn(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay,\n criterion\n );\n }\n\n /**\n * Recompute the weighted-progress rollup of every parent, bottom-up.\n * Returns the activities whose `progress` changed, for a prop-only repaint.\n */\n recomputeAllProgressRollup(): ReadonlyArray<Readonly<Activity>> {\n this.assertReady();\n return recomputeAllProgressRollupFn(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay\n );\n }\n\n /**\n * Set the project's status criterion (the Baseline↔Actual toggle) and\n * recompute every activity's `status` against it. Stores the criterion so\n * future dispatches keep deriving status with it. Returns the activities\n * whose `status` changed, for a prop-only repaint.\n */\n setStatusCriteria(\n criteria: StatusCriteria\n ): ReadonlyArray<Readonly<Activity>> {\n this.assertReady();\n // Trust boundary: the toggle value arrives from react_client (untyped JS).\n const resolved = resolveStatusCriteria(criteria);\n this.coreRuntime.sector.statusCriteria = resolved;\n return recomputeStatusFn(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay,\n resolved\n );\n }\n\n allocateActivityId(): ActivityId {\n this.assertReady();\n return this.coreRuntime.activityIdGenerator.next();\n }\n\n createActivity(\n input: Omit<Extract<DispatchAction, { kind: 'activity-create' }>, 'kind'>,\n outputUnit: OutputUnit = 'days'\n ):\n | { ok: true; activity: Readonly<Activity>; changes: ChangeSet }\n | { ok: false; reason: string } {\n this.assertReady();\n // A sync mutation running while an async dispatch is suspended (awaiting the\n // scheduler) would corrupt that dispatch's in-flight journal — refuse it.\n if (this._dispatchInFlight) {\n throw new Error(\n '[ScheduleCore] createActivity called during an in-flight dispatch'\n );\n }\n const action = { kind: 'activity-create', ...input } as Extract<\n DispatchAction,\n { kind: 'activity-create' }\n >;\n // Own write-capture window so this sync path is atomic too: a fault rolls\n // back instead of leaving a half-created activity (the facade dispatch path\n // is not entered here).\n this.coreRuntime.state.beginWriteCapture();\n let result: ReturnType<typeof createActivitySync>;\n try {\n result = createActivitySync(action, {\n adapter: this.coreRuntime.state,\n scheduler: this.coreRuntime.scheduler,\n sector: this.coreRuntime.sector,\n calendars: this.coreRuntime.calendars,\n activityIdGen: this.coreRuntime.activityIdGenerator,\n uidGen: this.coreRuntime.uniqueCorrelativeIdGenerator,\n customIdTracker: this.coreRuntime.customIdTracker\n });\n if (!result.ok) this._rollback();\n } catch (error) {\n this._rollback();\n throw error;\n } finally {\n this.coreRuntime.state.endWriteCapture();\n }\n // Expected domain reject propagates as an outcome; only faults threw.\n if (!result.ok) return result;\n const hoursPerDay = this.coreRuntime.sector.hoursPerDay;\n return {\n ok: true,\n activity: toPublicActivity(result.activity, hoursPerDay, outputUnit),\n changes: toPublicChangeSet(result.changes, hoursPerDay, outputUnit)\n };\n }\n\n private _enqueue<T>(work: () => Promise<T>): Promise<T> {\n const workPromise = this._opQueue.then(work, work);\n this._opQueue = workPromise.then(\n () => undefined,\n () => undefined\n );\n return workPromise;\n }\n\n async dispatch(\n action: DispatchAction,\n options: DispatchOptions = {}\n ): Promise<DispatchResult> {\n return this._enqueue(() => this._dispatchInner(action, options));\n }\n\n private async _dispatchInner(\n action: DispatchAction,\n options: DispatchOptions = {}\n ): Promise<DispatchResult> {\n this.assertReady();\n\n const pipelineContext = buildPipelineContext(this.coreRuntime.state, {\n hoursPerDay: this.coreRuntime.sector.hoursPerDay,\n inputUnit: options.inputUnit ?? 'days'\n });\n\n const undoable = isUndoableAction(action);\n this.coreRuntime.state.beginWriteCapture();\n this._dispatchInFlight = true;\n let result: DispatchResult;\n try {\n result = await performDispatch(action, options, {\n adapter: this.coreRuntime.state,\n ctx: pipelineContext,\n scheduler: this.coreRuntime.scheduler,\n sector: this.coreRuntime.sector,\n calendars: this.coreRuntime.calendars,\n activityIdGen: this.coreRuntime.activityIdGenerator,\n linkIdGen: this.coreRuntime.linkIdGenerator,\n uidGen: this.coreRuntime.uniqueCorrelativeIdGenerator,\n customIdTracker: this.coreRuntime.customIdTracker,\n now: this.coreRuntime.clock\n ? endOfLocalDay(this.coreRuntime.clock())\n : null\n });\n // A clean domain reject that still mutated (e.g. paste rejecting\n // mid-batch) must be rolled back too — not only thrown faults.\n if (!result.ok) this._rollback();\n } catch (error) {\n // Any throw after the first mutation left partial state: revert it so the\n // dispatch fails atomically (all-or-nothing) instead of corrupting state.\n this._rollback();\n throw error;\n } finally {\n this._dispatchInFlight = false;\n this.coreRuntime.state.endWriteCapture();\n }\n\n if (result.ok && undoable && changeSetIsSubstantive(result.changes)) {\n const created = captureCreatedSnapshots(\n this.coreRuntime.state,\n result.changes\n );\n this._undo.record(\n buildUndoEntry(\n result.changes,\n result.__beforeSnap,\n result.__beforeLinks,\n created.afterSnap,\n created.afterLinks\n ),\n computeCoalesceKey(action),\n Date.now()\n );\n }\n\n // Convert duration/lag to the requested output unit at the public boundary.\n // The undo recorder above captured the INTERNAL hours ChangeSet — this wrap\n // builds a new object and never mutates `result.changes`.\n if (!result.ok) return result;\n // Deferred CP: this dispatch left the CP stale on purpose, so mark the\n // state dirty for a later `recomputeCriticalPath()`. Dispatches that ran\n // the CP inline (no skip) keep it fresh and must NOT bump the epoch.\n if (options.skipCriticalPath) this._mutationEpoch++;\n return {\n ...result,\n changes: toPublicChangeSet(\n result.changes,\n this.coreRuntime.sector.hoursPerDay,\n options.outputUnit ?? 'days'\n )\n };\n }\n\n /**\n * Recompute the critical path OUT of band and return a repaintable ChangeSet\n * of the 7 CP fields, or null when the CP is already fresh for the current\n * state (coalesced). Enqueued on `_opQueue` so it runs serialized against\n * dispatches — it reads/writes the live tree only when no mutation is in\n * flight.\n *\n * Deferred-CP flow: dispatch with `{ skipCriticalPath: true }` (paints\n * without the heavy CP pass), then call this after the paint. Bursts\n * coalesce: only the first enqueued recompute after the last mutation does\n * the work; later ones see `_cpComputedEpoch === _mutationEpoch` and no-op.\n */\n recomputeCriticalPath(): Promise<{ changes: ChangeSet } | null> {\n return this._enqueue(() => this._recomputeCriticalPathIfStale());\n }\n\n private async _recomputeCriticalPathIfStale(): Promise<{\n changes: ChangeSet;\n } | null> {\n if (this._status === SCHEDULE_CORE_STATUS.DESTROYED) return null;\n const epoch = this._mutationEpoch;\n if (this._cpComputedEpoch === epoch) return null;\n const result = await this._runCriticalPathAndCapture();\n this._cpComputedEpoch = epoch;\n return result;\n }\n\n // bridge-load artifact: emits HOURS (no duration/lag diff anyway; bridge applies verbatim).\n private async _runCriticalPathAndCapture(): Promise<{ changes: ChangeSet }> {\n if (this._status === SCHEDULE_CORE_STATUS.DESTROYED) {\n return {\n changes: {\n source: { kind: 'init' },\n activities: [],\n links: [],\n calendars: [],\n trackingEvents: []\n }\n };\n }\n this.coreRuntime.state.beginWriteCapture();\n let changes: ChangeSet;\n try {\n await applyCriticalPathAtLoad(\n this.coreRuntime.state,\n this.coreRuntime.sector.hoursPerDay\n );\n changes = assembleChangeSet(this.coreRuntime.state, {\n source: { kind: 'init' },\n beforeSnap: new Map<string, EngineActivitySnapshot>(),\n touchedIds: [],\n scheduledIds: [],\n hoursPerDay: this.coreRuntime.sector.hoursPerDay\n });\n } finally {\n this.coreRuntime.state.endWriteCapture();\n }\n return { changes };\n }\n\n undo(options?: { outputUnit?: OutputUnit }): Promise<ChangeSet | null> {\n return this._enqueue(async () => {\n this.assertReady();\n const entry = this._undo.takeUndo();\n if (!entry) return null;\n applyUndo(this.coreRuntime.state, entry);\n // Undo/redo never recompute the CP → mark the state dirty for a later\n // `recomputeCriticalPath()`.\n this._mutationEpoch++;\n // ponytail: skip resync prop-only sin custom_id; tracker incremental si se mide caro en 100K\n if (needsResync(entry)) this._resyncCustomIdTrackerFromModel();\n this._undo.pushRedo(entry);\n this._undo.resetCoalesce();\n const inverse = buildInverseChangeSet(\n this.coreRuntime.state,\n entry,\n 'before'\n );\n return toPublicChangeSet(\n inverse,\n this.coreRuntime.sector.hoursPerDay,\n options?.outputUnit ?? 'days'\n );\n });\n }\n\n redo(options?: { outputUnit?: OutputUnit }): Promise<ChangeSet | null> {\n return this._enqueue(async () => {\n this.assertReady();\n const entry = this._undo.takeRedo();\n if (!entry) return null;\n applyRedo(this.coreRuntime.state, entry);\n // Undo/redo never recompute the CP → mark the state dirty for a later\n // `recomputeCriticalPath()`.\n this._mutationEpoch++;\n // ponytail: skip resync prop-only sin custom_id; tracker incremental si se mide caro en 100K\n if (needsResync(entry)) this._resyncCustomIdTrackerFromModel();\n this._undo.pushUndo(entry);\n this._undo.resetCoalesce();\n const inverse = buildInverseChangeSet(\n this.coreRuntime.state,\n entry,\n 'after'\n );\n return toPublicChangeSet(\n inverse,\n this.coreRuntime.sector.hoursPerDay,\n options?.outputUnit ?? 'days'\n );\n });\n }\n\n clearHistory(): void {\n this._undo.clear();\n }\n\n canUndo(): boolean {\n return this._undo.canUndo();\n }\n\n canRedo(): boolean {\n return this._undo.canRedo();\n }\n\n undoDepth(): number {\n return this._undo.undoDepth();\n }\n\n private _resyncCustomIdTrackerFromModel(): void {\n this.coreRuntime.customIdTracker.clear();\n this.coreRuntime.customIdTracker.populateFromActivities(\n this.coreRuntime.state.getAllActivities()\n );\n }\n\n destroy(): void {\n this.coreRuntime.calendars.clear();\n this._saveTracker.clear();\n this._status = SCHEDULE_CORE_STATUS.DESTROYED;\n }\n\n private readonly _initPromise: Promise<void>;\n private readonly _criticalPathReady: Promise<{ changes: ChangeSet }>;\n private readonly _ready: Promise<void>;\n\n private readonly _saveTracker = new SaveTracker();\n\n private assertReady(): void {\n if (this._status === SCHEDULE_CORE_STATUS.DESTROYED) {\n throw new Error('[ScheduleCore] instance is destroyed');\n }\n if (this._status === SCHEDULE_CORE_STATUS.POISONED) {\n throw new Error(\n '[ScheduleCore] instance is poisoned (a rollback failed) — reload from backend'\n );\n }\n }\n\n /**\n * Revert the current dispatch's mutations from the write-capture journal. If\n * the restore ITSELF throws, the state may be a third, partially-inverted\n * state — worse than either endpoint — so poison the core: refuse all further\n * dispatches and surface the fault so the host reloads from backend. A failed\n * rollback is never swallowed.\n */\n private _rollback(): void {\n try {\n this.coreRuntime.state.restoreFromCapture();\n } catch (restoreError) {\n this._status = SCHEDULE_CORE_STATUS.POISONED;\n this.coreRuntime.reporter.error(\n '[ScheduleCore] rollback failed — core poisoned',\n restoreError\n );\n throw restoreError;\n }\n }\n}\n","import type { Link } from '../../types.js';\n\n/**\n * Schedule-core equivalent of the legacy frontend `checkNoUpdatedLinks`.\n *\n * Returns the CURRENT links that were MODIFIED relative to a `baseline` (the\n * last loaded/saved link state). A link is \"modified\" iff its `lag` or `type`\n * differs from its baseline counterpart (matched by `id`).\n *\n * Why only lag/type: empirically those are the only mutable fields of a link —\n * `source`/`target` are identity, and the rest are backend/derived. The core\n * `link-update` intent (`dispatch/types.ts`) changes exactly \"lag and/or type\",\n * so this comparison is complete.\n *\n * New links (absent from baseline) and deleted links (present only in baseline)\n * are NOT \"modified\" — those belong to the unsaved / deleted buckets. The\n * baseline is supplied by the caller (the save flow's reference snapshot); per\n * interface discipline this is a pure helper, not a method on the core/port.\n */\nexport function checkNoUpdatedLinks(\n baseline: readonly Link[],\n current: readonly Link[]\n): Link[] {\n const baselineById = new Map<string, Link>(\n baseline.map((link) => [String(link.id), link])\n );\n\n return current.filter((link) => {\n const base = baselineById.get(String(link.id));\n if (!base) return false; // new link → not \"modified\"\n return base.lag !== link.lag || base.type !== link.type;\n });\n}\n","/**\n * Schedule-core equivalent of the legacy frontend `checkNoSavedActivities` /\n * `checkNoSavedLinks`: an entity is \"unsaved\" when it has no backend id\n * (`proplannerId`) — i.e. it was created in-session and not yet persisted.\n *\n * Pure helper (same `!proplannerId` criterion as legacy, so 0/null/undefined\n * all count as unsaved). Works on `core.getAllActivitiesView()` / `getAllLinks()`\n * or on `gantt.serialize().data` — both carry `proplannerId`. Per interface\n * discipline this is a helper, not a method on the core/port.\n */\ninterface WithProplannerId {\n proplannerId?: number | null;\n [key: string]: unknown;\n}\n\nexport const getUnsavedActivities = <T extends WithProplannerId>(\n activities: readonly T[] = []\n): T[] => (activities ?? []).filter((activity) => !activity.proplannerId);\n","/**\n * Inverse boundary maps (domain → backend vocabulary).\n *\n * The forward translations live in `parseFromBackend.ts`\n * (`CONSTRAINT_LABEL_MAP`, `LINK_CODE_TO_NUMBER`). The *serialization*\n * core → backend is intentionally NOT owned by this package today — it\n * lives in the consumer bridge (`react_client/gantt.helper.js`,\n * `from_number_to_code` / `GanttConstraint` reverse lookup) because the\n * bridge is the source of truth for what the server expects on save.\n *\n * These inverses exist so the mapping is documented and testable next to\n * its forward counterpart, and so a future `core → backend` layer doesn't\n * re-derive them by hand. **Internal only — not exported in `src/index.ts`.**\n * See Obsidian `BOUNDARY_TRANSLATIONS.md` §\"Mapeos inversos\".\n */\n\nimport type { ConstraintType } from '../../constraints/index.js';\n\n/** DHTMLX numeric kind → backend code. Canonical map lives in\n * `autoscheduler/links/link-display.ts`; re-exported here under the\n * boundary-documented name. */\nexport { LINK_TYPE_CODE as LINK_NUMBER_TO_CODE } from '../../autoscheduler/links/link-display.js';\n\n/** Inverse of `CONSTRAINT_LABEL_MAP` — internal code → backend label. */\nexport const CONSTRAINT_TYPE_TO_LABEL: Record<ConstraintType, string> = {\n asap: 'AS SOON AS POSSIBLE',\n alap: 'AS LATE AS POSSIBLE',\n snet: 'START NO EARLIER THAN',\n snlt: 'START NO LATER THAN',\n fnet: 'FINISH NO EARLIER THAN',\n fnlt: 'FINISH NO LATER THAN',\n mso: 'MUST START ON',\n mfo: 'MUST FINISH ON'\n};\n","/**\n * Canonical catalog of `DispatchAction` kinds.\n *\n * The discriminated union in `types.ts` remains the source of truth; this\n * module exposes it as RUNTIME vocabulary so `.js` consumers (bridge\n * entry-points, guard tests) stop retyping the wire strings. Exhaustiveness\n * is compile-checked HERE (not in the guard test — `tsconfig.json` excludes\n * `*.test.ts` from `tsc --noEmit` and vitest does not typecheck):\n * - `satisfies Record<string, DispatchActionKind>` rejects any entry whose\n * value is not a union member (catalog ⊆ union);\n * - `KIND_CATALOG_COVERS_UNION: Record<DispatchActionKind, true>` requires\n * one entry per union member (union ⊆ catalog) — adding a kind to\n * `DispatchAction` without updating this module breaks the build.\n * The string VALUES are a frozen contract (see `constants.guard.test.ts`).\n */\n\nimport type { DispatchAction } from './types.js';\n\nexport type DispatchActionKind = DispatchAction['kind'];\n\nexport const DISPATCH_ACTION_KIND = {\n INLINE_EDIT: 'inline-edit',\n DATES_BATCH: 'dates-batch',\n BULK_EDIT: 'bulk-edit',\n LINK_CREATE: 'link-create',\n LINK_UPDATE: 'link-update',\n LINK_DELETE: 'link-delete',\n LINKS_BATCH: 'links-batch',\n ACTIVITY_CREATE: 'activity-create',\n ACTIVITY_DELETE: 'activity-delete',\n ACTIVITY_MOVE: 'activity-move',\n ACTIVITY_INDENT: 'activity-indent',\n ACTIVITY_OUTDENT: 'activity-outdent',\n ACTIVITY_SET_PROGRESS: 'activity-set-progress',\n ACTIVITY_PASTE: 'activity-paste',\n SELECTION_TOGGLE: 'selection-toggle',\n SELECTION_REPLACE: 'selection-replace',\n VISIBILITY_SET: 'visibility-set',\n SIR_SYNC: 'sir-sync'\n} as const satisfies Record<string, DispatchActionKind>;\n\nconst KIND_CATALOG_COVERS_UNION: Record<DispatchActionKind, true> = {\n [DISPATCH_ACTION_KIND.INLINE_EDIT]: true,\n [DISPATCH_ACTION_KIND.DATES_BATCH]: true,\n [DISPATCH_ACTION_KIND.BULK_EDIT]: true,\n [DISPATCH_ACTION_KIND.LINK_CREATE]: true,\n [DISPATCH_ACTION_KIND.LINK_UPDATE]: true,\n [DISPATCH_ACTION_KIND.LINK_DELETE]: true,\n [DISPATCH_ACTION_KIND.LINKS_BATCH]: true,\n [DISPATCH_ACTION_KIND.ACTIVITY_CREATE]: true,\n [DISPATCH_ACTION_KIND.ACTIVITY_DELETE]: true,\n [DISPATCH_ACTION_KIND.ACTIVITY_MOVE]: true,\n [DISPATCH_ACTION_KIND.ACTIVITY_INDENT]: true,\n [DISPATCH_ACTION_KIND.ACTIVITY_OUTDENT]: true,\n [DISPATCH_ACTION_KIND.ACTIVITY_SET_PROGRESS]: true,\n [DISPATCH_ACTION_KIND.ACTIVITY_PASTE]: true,\n [DISPATCH_ACTION_KIND.SELECTION_TOGGLE]: true,\n [DISPATCH_ACTION_KIND.SELECTION_REPLACE]: true,\n [DISPATCH_ACTION_KIND.VISIBILITY_SET]: true,\n [DISPATCH_ACTION_KIND.SIR_SYNC]: true\n};\n\nexport const DISPATCH_ACTION_KINDS: ReadonlyArray<DispatchActionKind> =\n Object.keys(KIND_CATALOG_COVERS_UNION) as DispatchActionKind[];\n","/**\n * Canonical vocabulary of activity-creation triggers.\n *\n * The engine's `activity-create` intent does NOT carry this field — these\n * kinds name the USER trigger the consumer's creation hub routes on before\n * dispatching (`requestActivityCreation` / `CreateActivityIntent` in\n * `react_client` core path). The engine owns the vocabulary so the client\n * and the bridge import ONE canonical source instead of retyping the\n * literals (CONSTANTES_DECISIONES paso 1). The string VALUES are a frozen\n * contract — verified verbatim against the client union\n * (`core/features/createActivity/intents.ts`) on 2026-07-02.\n *\n * - `CHILD` — per-row \"+\" button (runs the lookahead guard).\n * - `CHILD_CONFIRMED` — lookahead-cleanup modal confirm (guard already passed).\n * - `LINE` — green bar \"add-task-by-line\".\n * - `ROOT` — generic \"+\" (header / create), no guard.\n */\n\nexport const CREATION_KIND = {\n CHILD: 'child',\n CHILD_CONFIRMED: 'child-confirmed',\n LINE: 'line',\n ROOT: 'root'\n} as const;\n\nexport type CreationKind = (typeof CREATION_KIND)[keyof typeof CREATION_KIND];\n"]}
|