dabke 0.82.0 → 0.83.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.
Files changed (83) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +6 -3
  3. package/dist/cpsat/rules/index.d.ts +3 -0
  4. package/dist/cpsat/rules/index.d.ts.map +1 -1
  5. package/dist/cpsat/rules/index.js +3 -0
  6. package/dist/cpsat/rules/index.js.map +1 -1
  7. package/dist/cpsat/rules/max-days-week.d.ts +44 -0
  8. package/dist/cpsat/rules/max-days-week.d.ts.map +1 -0
  9. package/dist/cpsat/rules/max-days-week.js +95 -0
  10. package/dist/cpsat/rules/max-days-week.js.map +1 -0
  11. package/dist/cpsat/rules/min-days-week.d.ts +34 -0
  12. package/dist/cpsat/rules/min-days-week.d.ts.map +1 -0
  13. package/dist/cpsat/rules/min-days-week.js +84 -0
  14. package/dist/cpsat/rules/min-days-week.js.map +1 -0
  15. package/dist/cpsat/rules/must-assign.d.ts +49 -0
  16. package/dist/cpsat/rules/must-assign.d.ts.map +1 -0
  17. package/dist/cpsat/rules/must-assign.js +86 -0
  18. package/dist/cpsat/rules/must-assign.js.map +1 -0
  19. package/dist/cpsat/rules/registry.d.ts +4 -1
  20. package/dist/cpsat/rules/registry.d.ts.map +1 -1
  21. package/dist/cpsat/rules/registry.js +4 -1
  22. package/dist/cpsat/rules/registry.js.map +1 -1
  23. package/dist/cpsat/rules/rules.types.d.ts +3 -0
  24. package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
  25. package/dist/cpsat/rules/scope.types.d.ts +1 -1
  26. package/dist/index.d.ts +5 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -2
  29. package/dist/index.js.map +1 -1
  30. package/dist/schedule/cost.d.ts +204 -0
  31. package/dist/schedule/cost.d.ts.map +1 -0
  32. package/dist/schedule/cost.js +187 -0
  33. package/dist/schedule/cost.js.map +1 -0
  34. package/dist/schedule/coverage.d.ts +85 -0
  35. package/dist/schedule/coverage.d.ts.map +1 -0
  36. package/dist/schedule/coverage.js +33 -0
  37. package/dist/schedule/coverage.js.map +1 -0
  38. package/dist/schedule/definition.d.ts +227 -0
  39. package/dist/schedule/definition.d.ts.map +1 -0
  40. package/dist/{schedule.js → schedule/definition.js} +9 -673
  41. package/dist/schedule/definition.js.map +1 -0
  42. package/dist/schedule/index.d.ts +67 -0
  43. package/dist/schedule/index.d.ts.map +1 -0
  44. package/dist/schedule/index.js +69 -0
  45. package/dist/schedule/index.js.map +1 -0
  46. package/dist/schedule/rules.d.ts +353 -0
  47. package/dist/schedule/rules.d.ts.map +1 -0
  48. package/dist/schedule/rules.js +352 -0
  49. package/dist/schedule/rules.js.map +1 -0
  50. package/dist/schedule/shift-patterns.d.ts +34 -0
  51. package/dist/schedule/shift-patterns.d.ts.map +1 -0
  52. package/dist/schedule/shift-patterns.js +41 -0
  53. package/dist/schedule/shift-patterns.js.map +1 -0
  54. package/dist/schedule/time-periods.d.ts +69 -0
  55. package/dist/schedule/time-periods.d.ts.map +1 -0
  56. package/dist/schedule/time-periods.js +91 -0
  57. package/dist/schedule/time-periods.js.map +1 -0
  58. package/package.json +4 -9
  59. package/src/cpsat/rules/index.ts +3 -0
  60. package/src/cpsat/rules/max-days-week.ts +143 -0
  61. package/src/cpsat/rules/min-days-week.ts +120 -0
  62. package/src/cpsat/rules/must-assign.ts +108 -0
  63. package/src/cpsat/rules/registry.ts +6 -0
  64. package/src/cpsat/rules/rules.types.ts +3 -0
  65. package/src/cpsat/rules/scope.types.ts +1 -1
  66. package/src/index.ts +8 -3
  67. package/src/schedule/cost.ts +242 -0
  68. package/src/schedule/coverage.ts +135 -0
  69. package/src/schedule/definition.ts +958 -0
  70. package/src/schedule/index.ts +112 -0
  71. package/src/schedule/rules.ts +529 -0
  72. package/src/schedule/shift-patterns.ts +46 -0
  73. package/src/schedule/time-periods.ts +110 -0
  74. package/dist/llms.d.ts +0 -2
  75. package/dist/llms.d.ts.map +0 -1
  76. package/dist/llms.js +0 -3
  77. package/dist/llms.js.map +0 -1
  78. package/dist/schedule.d.ts +0 -917
  79. package/dist/schedule.d.ts.map +0 -1
  80. package/dist/schedule.js.map +0 -1
  81. package/llms.txt +0 -758
  82. package/src/llms.ts +0 -3
  83. package/src/schedule.ts +0 -1960
package/CHANGELOG.md CHANGED
@@ -5,6 +5,29 @@ All notable changes to this project will be documented in this file.
5
5
  This changelog was generated from the git history of the project when it was
6
6
  named `scheduling-core`, prior to the rename to `dabke` in v0.78.0.
7
7
 
8
+ ## 0.83.0 (2026-03-21)
9
+
10
+ ### Breaking Changes
11
+
12
+ - Remove `./llms` export path and `llms.txt` from the package. The LLM reference
13
+ is now generated externally via `generate:reference`.
14
+
15
+ ### Features
16
+
17
+ - Add `maxDaysPerWeek(days, opts?)` and `minDaysPerWeek(days, opts?)` rule functions
18
+ to constrain the number of distinct working days per member per scheduling week.
19
+ - Add `mustAssign(opts?)` rule for staffing obligations. Guarantees targeted members
20
+ appear on the schedule each week; defaults to HIGH priority so the schedule still
21
+ generates when a member cannot be placed.
22
+
23
+ ### Improvements
24
+
25
+ - Split `schedule.ts` into focused modules under `src/schedule/` (public API unchanged).
26
+ - Add `NoInfer` on coverage entry types so role/skill references are checked against
27
+ declared roles and skills at compile time.
28
+ - Update devDependencies (@types/node ^25.0.0, commander ^14.0.3).
29
+ - Publish workflow now includes changelog text in GitHub releases.
30
+
8
31
  ## 0.82.0 (2026-02-23)
9
32
 
10
33
  ### Breaking Changes
package/README.md CHANGED
@@ -178,12 +178,15 @@ const ready = venue.with([
178
178
 
179
179
  ## LLM Integration
180
180
 
181
- dabke ships an `llms.txt` with complete API documentation for AI code generation:
181
+ Generate per-section API reference docs from TSDoc:
182
182
 
183
- ```typescript
184
- import { apiDocs } from "dabke/llms";
183
+ ```bash
184
+ npm run generate:reference -- --outdir ./references
185
185
  ```
186
186
 
187
+ This produces a `README.md` index, an `api.md` API surface listing,
188
+ and one detail file per category (schedule, rules, coverage, etc.).
189
+
187
190
  ---
188
191
 
189
192
  ## Development
@@ -2,13 +2,16 @@ export { createAssignTogetherRule } from "./assign-together.js";
2
2
  export { createAssignmentPriorityRule } from "./assignment-priority.js";
3
3
  export { createLocationPreferenceRule } from "./location-preference.js";
4
4
  export { createMaxConsecutiveDaysRule } from "./max-consecutive-days.js";
5
+ export { createMaxDaysWeekRule } from "./max-days-week.js";
5
6
  export { createMaxHoursDayRule } from "./max-hours-day.js";
6
7
  export { createMaxHoursWeekRule } from "./max-hours-week.js";
7
8
  export { createMaxShiftsDayRule } from "./max-shifts-day.js";
8
9
  export { createMinConsecutiveDaysRule } from "./min-consecutive-days.js";
10
+ export { createMinDaysWeekRule } from "./min-days-week.js";
9
11
  export { createMinHoursDayRule } from "./min-hours-day.js";
10
12
  export { createMinHoursWeekRule } from "./min-hours-week.js";
11
13
  export { createMinRestBetweenShiftsRule } from "./min-rest-between-shifts.js";
14
+ export { createMustAssignRule } from "./must-assign.js";
12
15
  export { createTimeOffRule } from "./time-off.js";
13
16
  export { createMinimizeCostRule } from "./minimize-cost.js";
14
17
  export { createDayCostMultiplierRule } from "./day-cost-multiplier.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC"}
@@ -2,13 +2,16 @@ export { createAssignTogetherRule } from "./assign-together.js";
2
2
  export { createAssignmentPriorityRule } from "./assignment-priority.js";
3
3
  export { createLocationPreferenceRule } from "./location-preference.js";
4
4
  export { createMaxConsecutiveDaysRule } from "./max-consecutive-days.js";
5
+ export { createMaxDaysWeekRule } from "./max-days-week.js";
5
6
  export { createMaxHoursDayRule } from "./max-hours-day.js";
6
7
  export { createMaxHoursWeekRule } from "./max-hours-week.js";
7
8
  export { createMaxShiftsDayRule } from "./max-shifts-day.js";
8
9
  export { createMinConsecutiveDaysRule } from "./min-consecutive-days.js";
10
+ export { createMinDaysWeekRule } from "./min-days-week.js";
9
11
  export { createMinHoursDayRule } from "./min-hours-day.js";
10
12
  export { createMinHoursWeekRule } from "./min-hours-week.js";
11
13
  export { createMinRestBetweenShiftsRule } from "./min-rest-between-shifts.js";
14
+ export { createMustAssignRule } from "./must-assign.js";
12
15
  export { createTimeOffRule } from "./time-off.js";
13
16
  export { createMinimizeCostRule } from "./minimize-cost.js";
14
17
  export { createDayCostMultiplierRule } from "./day-cost-multiplier.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cpsat/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/cpsat/rules/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,0BAA0B,CAAC;AACxE,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,4BAA4B,EAAE,MAAM,2BAA2B,CAAC;AACzE,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,EAAE,sBAAsB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC;AAC5D,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,0BAA0B,EAAE,MAAM,yBAAyB,CAAC;AACrE,OAAO,EAAE,2BAA2B,EAAE,MAAM,0BAA0B,CAAC;AACvE,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC;AACrF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,iCAAiC,EAAE,MAAM,gCAAgC,CAAC;AACnF,OAAO,EAAE,gCAAgC,EAAE,MAAM,+BAA+B,CAAC;AACjF,OAAO,EAAE,kCAAkC,EAAE,MAAM,iCAAiC,CAAC"}
@@ -0,0 +1,44 @@
1
+ import * as z from "zod";
2
+ import type { CompilationRule } from "../model-builder.js";
3
+ declare const MaxDaysWeekSchema: z.ZodIntersection<z.ZodIntersection<z.ZodObject<{
4
+ days: z.ZodNumber;
5
+ priority: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"LOW">, z.ZodLiteral<"MEDIUM">, z.ZodLiteral<"HIGH">, z.ZodLiteral<"MANDATORY">]>>;
6
+ weekStartsOn: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"monday">, z.ZodLiteral<"tuesday">, z.ZodLiteral<"wednesday">, z.ZodLiteral<"thursday">, z.ZodLiteral<"friday">, z.ZodLiteral<"saturday">, z.ZodLiteral<"sunday">]>>;
7
+ }, z.core.$strip>, z.ZodType<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown>>>, z.ZodType<import("./scope.types.js").OptionalTimeScopeType<"dateRange" | "dayOfWeek" | "specificDates" | "recurring">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").OptionalTimeScopeType<"dateRange" | "dayOfWeek" | "specificDates" | "recurring">, unknown>>>;
8
+ /**
9
+ * Configuration for {@link createMaxDaysWeekRule}.
10
+ *
11
+ * - `days` (required): maximum number of days allowed per scheduling week
12
+ * - `priority` (required): how strictly the solver enforces this rule
13
+ * - `weekStartsOn` (optional): which day starts the week; defaults to {@link ModelBuilder.weekStartsOn}
14
+ *
15
+ * Entity scoping (at most one): `memberIds`, `roleIds`, `skillIds`
16
+ * Time scoping (at most one, optional): `dateRange`, `specificDates`, `dayOfWeek`, `recurringPeriods`
17
+ */
18
+ export type MaxDaysWeekConfig = z.infer<typeof MaxDaysWeekSchema>;
19
+ /**
20
+ * Caps total number of days a person can work within each scheduling week.
21
+ *
22
+ * @remarks
23
+ * Creates a binary "works on day" variable for each member and day, then
24
+ * constrains the weekly sum. This counts distinct days, regardless of how
25
+ * many shifts are assigned on a single day.
26
+ *
27
+ * @param config - See {@link MaxDaysWeekConfig}
28
+ * @example Limit everyone to 5 days per week
29
+ * ```ts
30
+ * createMaxDaysWeekRule({ days: 5, priority: "MANDATORY" });
31
+ * ```
32
+ *
33
+ * @example Part-time staff limited to 3 days
34
+ * ```ts
35
+ * createMaxDaysWeekRule({
36
+ * roleIds: ["part-time"],
37
+ * days: 3,
38
+ * priority: "HIGH",
39
+ * });
40
+ * ```
41
+ */
42
+ export declare function createMaxDaysWeekRule(config: MaxDaysWeekConfig): CompilationRule;
43
+ export {};
44
+ //# sourceMappingURL=max-days-week.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-days-week.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/max-days-week.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAoB3D,QAAA,MAAM,iBAAiB;;;;mfAEtB,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAiFhF"}
@@ -0,0 +1,95 @@
1
+ import * as z from "zod";
2
+ import { DayOfWeekSchema } from "../../types.js";
3
+ import { priorityToPenalty, splitIntoWeeks } from "../utils.js";
4
+ import { PrioritySchema, entityScope, timeScope, parseEntityScope, parseTimeScope, resolveMembersFromScope, resolveActiveDaysFromScope, ruleGroup, } from "./scope.types.js";
5
+ const MaxDaysWeekBase = z.object({
6
+ days: z.number().int().min(0),
7
+ priority: PrioritySchema,
8
+ weekStartsOn: DayOfWeekSchema.optional(),
9
+ });
10
+ const MaxDaysWeekSchema = MaxDaysWeekBase.and(entityScope(["members", "roles", "skills"])).and(timeScope(["dateRange", "specificDates", "dayOfWeek", "recurring"]));
11
+ /**
12
+ * Caps total number of days a person can work within each scheduling week.
13
+ *
14
+ * @remarks
15
+ * Creates a binary "works on day" variable for each member and day, then
16
+ * constrains the weekly sum. This counts distinct days, regardless of how
17
+ * many shifts are assigned on a single day.
18
+ *
19
+ * @param config - See {@link MaxDaysWeekConfig}
20
+ * @example Limit everyone to 5 days per week
21
+ * ```ts
22
+ * createMaxDaysWeekRule({ days: 5, priority: "MANDATORY" });
23
+ * ```
24
+ *
25
+ * @example Part-time staff limited to 3 days
26
+ * ```ts
27
+ * createMaxDaysWeekRule({
28
+ * roleIds: ["part-time"],
29
+ * days: 3,
30
+ * priority: "HIGH",
31
+ * });
32
+ * ```
33
+ */
34
+ export function createMaxDaysWeekRule(config) {
35
+ const parsed = MaxDaysWeekSchema.parse(config);
36
+ const entityScopeValue = parseEntityScope(parsed);
37
+ const timeScopeValue = parseTimeScope(parsed);
38
+ const { days, priority, weekStartsOn } = parsed;
39
+ const group = ruleGroup(`max-days-week:${days}`, `Max ${days}d per week`, entityScopeValue, timeScopeValue);
40
+ return {
41
+ compile(b) {
42
+ const targetMembers = resolveMembersFromScope(entityScopeValue, b.members);
43
+ const activeDays = resolveActiveDaysFromScope(timeScopeValue, b.days);
44
+ if (targetMembers.length === 0 || activeDays.length === 0)
45
+ return;
46
+ const weeks = splitIntoWeeks(activeDays, weekStartsOn ?? b.weekStartsOn);
47
+ for (const emp of targetMembers) {
48
+ for (const weekDays of weeks) {
49
+ const weekWorkVars = [];
50
+ for (const day of weekDays) {
51
+ const dayAssignments = b.shiftPatterns
52
+ .filter((p) => b.canAssign(emp, p) && b.patternAvailableOnDay(p, day))
53
+ .map((p) => b.assignment(emp.id, p.id, day));
54
+ if (dayAssignments.length === 0)
55
+ continue;
56
+ const worksVar = b.boolVar(`works_day_${emp.id}_${day}`);
57
+ weekWorkVars.push(worksVar);
58
+ // worksVar >= each assignment (if any assignment is 1, worksVar must be 1)
59
+ for (const assignVar of dayAssignments) {
60
+ b.addLinear([
61
+ { var: worksVar, coeff: 1 },
62
+ { var: assignVar, coeff: -1 },
63
+ ], ">=", 0);
64
+ }
65
+ // worksVar <= sum(assignments) (if no assignment is 1, worksVar must be 0)
66
+ b.addLinear([{ var: worksVar, coeff: 1 }, ...dayAssignments.map((v) => ({ var: v, coeff: -1 }))], "<=", 0);
67
+ }
68
+ if (weekWorkVars.length === 0)
69
+ continue;
70
+ const weekLabel = weekDays[0];
71
+ const constraintId = `max-days-week:${emp.id}:${weekLabel}`;
72
+ const terms = weekWorkVars.map((v) => ({ var: v, coeff: 1 }));
73
+ if (priority === "MANDATORY") {
74
+ b.addLinear(terms, "<=", days);
75
+ }
76
+ else {
77
+ b.addSoftLinear(terms, "<=", days, priorityToPenalty(priority), constraintId);
78
+ b.reporter.trackConstraint({
79
+ id: constraintId,
80
+ type: "rule",
81
+ rule: "max-days-week",
82
+ description: `${emp.id} max ${days}d in week starting ${weekLabel}`,
83
+ targetValue: days,
84
+ comparator: "<=",
85
+ day: weekLabel,
86
+ context: { memberIds: [emp.id], days: weekDays },
87
+ group,
88
+ });
89
+ }
90
+ }
91
+ }
92
+ },
93
+ };
94
+ }
95
+ //# sourceMappingURL=max-days-week.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"max-days-week.js","sourceRoot":"","sources":["../../../src/cpsat/rules/max-days-week.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,34 @@
1
+ import * as z from "zod";
2
+ import type { CompilationRule } from "../model-builder.js";
3
+ declare const MinDaysWeekSchema: z.ZodIntersection<z.ZodObject<{
4
+ days: z.ZodNumber;
5
+ priority: z.ZodDefault<z.ZodUnion<readonly [z.ZodLiteral<"LOW">, z.ZodLiteral<"MEDIUM">, z.ZodLiteral<"HIGH">, z.ZodLiteral<"MANDATORY">]>>;
6
+ weekStartsOn: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"monday">, z.ZodLiteral<"tuesday">, z.ZodLiteral<"wednesday">, z.ZodLiteral<"thursday">, z.ZodLiteral<"friday">, z.ZodLiteral<"saturday">, z.ZodLiteral<"sunday">]>>;
7
+ }, z.core.$strip>, z.ZodType<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown>>>;
8
+ /**
9
+ * Configuration for {@link createMinDaysWeekRule}.
10
+ *
11
+ * - `days` (required): minimum number of days required per scheduling week
12
+ * - `priority` (required): how strictly the solver enforces this rule
13
+ * - `weekStartsOn` (optional): which day starts the week; defaults to {@link ModelBuilder.weekStartsOn}
14
+ *
15
+ * Entity scoping (at most one): `memberIds`, `roleIds`, `skillIds`
16
+ */
17
+ export type MinDaysWeekConfig = z.infer<typeof MinDaysWeekSchema>;
18
+ /**
19
+ * Enforces a minimum number of days a person must work per scheduling week.
20
+ *
21
+ * @remarks
22
+ * Creates a binary "works on day" variable for each member and day, then
23
+ * constrains the weekly sum. This counts distinct days, regardless of how
24
+ * many shifts are assigned on a single day.
25
+ *
26
+ * @param config - See {@link MinDaysWeekConfig}
27
+ * @example
28
+ * ```ts
29
+ * createMinDaysWeekRule({ days: 3, priority: "HIGH" });
30
+ * ```
31
+ */
32
+ export declare function createMinDaysWeekRule(config: MinDaysWeekConfig): CompilationRule;
33
+ export {};
34
+ //# sourceMappingURL=min-days-week.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min-days-week.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/min-days-week.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAiB3D,QAAA,MAAM,iBAAiB;;;;iOAAmE,CAAC;AAE3F;;;;;;;;GAQG;AACH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAElE;;;;;;;;;;;;;GAaG;AACH,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,iBAAiB,GAAG,eAAe,CAyEhF"}
@@ -0,0 +1,84 @@
1
+ import * as z from "zod";
2
+ import { DayOfWeekSchema } from "../../types.js";
3
+ import { priorityToPenalty, splitIntoWeeks } from "../utils.js";
4
+ import { PrioritySchema, entityScope, parseEntityScope, resolveMembersFromScope, ruleGroup, } from "./scope.types.js";
5
+ const MinDaysWeekBase = z.object({
6
+ days: z.number().int().min(0),
7
+ priority: PrioritySchema,
8
+ weekStartsOn: DayOfWeekSchema.optional(),
9
+ });
10
+ const MinDaysWeekSchema = MinDaysWeekBase.and(entityScope(["members", "roles", "skills"]));
11
+ /**
12
+ * Enforces a minimum number of days a person must work per scheduling week.
13
+ *
14
+ * @remarks
15
+ * Creates a binary "works on day" variable for each member and day, then
16
+ * constrains the weekly sum. This counts distinct days, regardless of how
17
+ * many shifts are assigned on a single day.
18
+ *
19
+ * @param config - See {@link MinDaysWeekConfig}
20
+ * @example
21
+ * ```ts
22
+ * createMinDaysWeekRule({ days: 3, priority: "HIGH" });
23
+ * ```
24
+ */
25
+ export function createMinDaysWeekRule(config) {
26
+ const parsed = MinDaysWeekSchema.parse(config);
27
+ const scope = parseEntityScope(parsed);
28
+ const { days, priority, weekStartsOn } = parsed;
29
+ const group = ruleGroup(`min-days-week:${days}`, `Min ${days}d per week`, scope);
30
+ return {
31
+ compile(b) {
32
+ if (days <= 0)
33
+ return;
34
+ const members = resolveMembersFromScope(scope, b.members);
35
+ const weeks = splitIntoWeeks(b.days, weekStartsOn ?? b.weekStartsOn);
36
+ for (const emp of members) {
37
+ for (const weekDays of weeks) {
38
+ const weekWorkVars = [];
39
+ for (const day of weekDays) {
40
+ const dayAssignments = b.shiftPatterns
41
+ .filter((p) => b.canAssign(emp, p) && b.patternAvailableOnDay(p, day))
42
+ .map((p) => b.assignment(emp.id, p.id, day));
43
+ if (dayAssignments.length === 0)
44
+ continue;
45
+ const worksVar = b.boolVar(`works_day_${emp.id}_${day}`);
46
+ weekWorkVars.push(worksVar);
47
+ // worksVar >= each assignment (if any assignment is 1, worksVar must be 1)
48
+ for (const assignVar of dayAssignments) {
49
+ b.addLinear([
50
+ { var: worksVar, coeff: 1 },
51
+ { var: assignVar, coeff: -1 },
52
+ ], ">=", 0);
53
+ }
54
+ // worksVar <= sum(assignments) (if no assignment is 1, worksVar must be 0)
55
+ b.addLinear([{ var: worksVar, coeff: 1 }, ...dayAssignments.map((v) => ({ var: v, coeff: -1 }))], "<=", 0);
56
+ }
57
+ if (weekWorkVars.length === 0)
58
+ continue;
59
+ const weekLabel = weekDays[0];
60
+ const constraintId = `min-days-week:${emp.id}:${weekLabel}`;
61
+ const terms = weekWorkVars.map((v) => ({ var: v, coeff: 1 }));
62
+ if (priority === "MANDATORY") {
63
+ b.addLinear(terms, ">=", days);
64
+ }
65
+ else {
66
+ b.addSoftLinear(terms, ">=", days, priorityToPenalty(priority), constraintId);
67
+ b.reporter.trackConstraint({
68
+ id: constraintId,
69
+ type: "rule",
70
+ rule: "min-days-week",
71
+ description: `${emp.id} min ${days}d in week starting ${weekLabel}`,
72
+ targetValue: days,
73
+ comparator: ">=",
74
+ day: weekLabel,
75
+ context: { memberIds: [emp.id], days: weekDays },
76
+ group,
77
+ });
78
+ }
79
+ }
80
+ }
81
+ },
82
+ };
83
+ }
84
+ //# sourceMappingURL=min-days-week.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"min-days-week.js","sourceRoot":"","sources":["../../../src/cpsat/rules/min-days-week.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import * as z from "zod";
2
+ import type { CompilationRule } from "../model-builder.js";
3
+ declare const MustAssignSchema: z.ZodIntersection<z.ZodObject<{
4
+ weekStartsOn: z.ZodOptional<z.ZodUnion<readonly [z.ZodLiteral<"monday">, z.ZodLiteral<"tuesday">, z.ZodLiteral<"wednesday">, z.ZodLiteral<"thursday">, z.ZodLiteral<"friday">, z.ZodLiteral<"saturday">, z.ZodLiteral<"sunday">]>>;
5
+ }, z.core.$strip>, z.ZodType<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown, z.core.$ZodTypeInternals<import("./scope.types.js").EntityScopeType<"members" | "roles" | "skills">, unknown>>>;
6
+ /**
7
+ * Configuration for {@link createMustAssignRule}.
8
+ *
9
+ * - `weekStartsOn` (optional): which day starts the week; defaults to
10
+ * {@link ModelBuilder.weekStartsOn}
11
+ *
12
+ * Entity scoping (at most one): `memberIds`, `roleIds`, `skillIds`
13
+ */
14
+ export type MustAssignConfig = z.infer<typeof MustAssignSchema>;
15
+ /**
16
+ * Guarantees that targeted members appear on the schedule.
17
+ *
18
+ * @remarks
19
+ * Use this for staffing obligations: salaried employees who are paid
20
+ * regardless of whether they work, or contracted staff who must be
21
+ * rostered. The solver ensures each targeted member has at least one
22
+ * assignment per scheduling week.
23
+ *
24
+ * Always compiles as a soft constraint (HIGH priority internally) so the
25
+ * schedule still generates when a member genuinely cannot be placed
26
+ * (e.g., full week of absences, no compatible shift patterns). Violations
27
+ * surface as validation warnings with distinct messaging from
28
+ * `min-days-week`.
29
+ *
30
+ * Unlike {@link createMinDaysWeekRule}, this rule communicates a staffing
31
+ * obligation rather than a scheduling preference. Validation messages
32
+ * reflect this: "Alice was not assigned (staffing obligation)" rather
33
+ * than "Alice worked 0 days, minimum was 1."
34
+ *
35
+ * @param config - See {@link MustAssignConfig}
36
+ *
37
+ * @example Ensure a salaried manager is always rostered
38
+ * ```ts
39
+ * createMustAssignRule({ memberIds: ["diana"] });
40
+ * ```
41
+ *
42
+ * @example Ensure all supervisors appear on the rota
43
+ * ```ts
44
+ * createMustAssignRule({ roleIds: ["supervisor"] });
45
+ * ```
46
+ */
47
+ export declare function createMustAssignRule(config: MustAssignConfig): CompilationRule;
48
+ export {};
49
+ //# sourceMappingURL=must-assign.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"must-assign.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/must-assign.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAEzB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAa3D,QAAA,MAAM,gBAAgB;;iOAI6B,CAAC;AAEpD;;;;;;;GAOG;AACH,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAEhE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,gBAAgB,GAAG,eAAe,CA4C9E"}
@@ -0,0 +1,86 @@
1
+ import * as z from "zod";
2
+ import { DayOfWeekSchema } from "../../types.js";
3
+ import { priorityToPenalty, splitIntoWeeks } from "../utils.js";
4
+ import { entityScope, parseEntityScope, resolveMembersFromScope, ruleGroup, } from "./scope.types.js";
5
+ /** Internally always HIGH. Not user-configurable. */
6
+ const MUST_ASSIGN_PENALTY = priorityToPenalty("HIGH");
7
+ const MustAssignSchema = z
8
+ .object({
9
+ weekStartsOn: DayOfWeekSchema.optional(),
10
+ })
11
+ .and(entityScope(["members", "roles", "skills"]));
12
+ /**
13
+ * Guarantees that targeted members appear on the schedule.
14
+ *
15
+ * @remarks
16
+ * Use this for staffing obligations: salaried employees who are paid
17
+ * regardless of whether they work, or contracted staff who must be
18
+ * rostered. The solver ensures each targeted member has at least one
19
+ * assignment per scheduling week.
20
+ *
21
+ * Always compiles as a soft constraint (HIGH priority internally) so the
22
+ * schedule still generates when a member genuinely cannot be placed
23
+ * (e.g., full week of absences, no compatible shift patterns). Violations
24
+ * surface as validation warnings with distinct messaging from
25
+ * `min-days-week`.
26
+ *
27
+ * Unlike {@link createMinDaysWeekRule}, this rule communicates a staffing
28
+ * obligation rather than a scheduling preference. Validation messages
29
+ * reflect this: "Alice was not assigned (staffing obligation)" rather
30
+ * than "Alice worked 0 days, minimum was 1."
31
+ *
32
+ * @param config - See {@link MustAssignConfig}
33
+ *
34
+ * @example Ensure a salaried manager is always rostered
35
+ * ```ts
36
+ * createMustAssignRule({ memberIds: ["diana"] });
37
+ * ```
38
+ *
39
+ * @example Ensure all supervisors appear on the rota
40
+ * ```ts
41
+ * createMustAssignRule({ roleIds: ["supervisor"] });
42
+ * ```
43
+ */
44
+ export function createMustAssignRule(config) {
45
+ const parsed = MustAssignSchema.parse(config);
46
+ const scope = parseEntityScope(parsed);
47
+ const { weekStartsOn } = parsed;
48
+ const group = ruleGroup("must-assign", "Must assign", scope);
49
+ return {
50
+ compile(b) {
51
+ const members = resolveMembersFromScope(scope, b.members);
52
+ const weeks = splitIntoWeeks(b.days, weekStartsOn ?? b.weekStartsOn);
53
+ for (const emp of members) {
54
+ for (const weekDays of weeks) {
55
+ const terms = [];
56
+ for (const day of weekDays) {
57
+ for (const pattern of b.shiftPatterns) {
58
+ if (!b.canAssign(emp, pattern))
59
+ continue;
60
+ if (!b.patternAvailableOnDay(pattern, day))
61
+ continue;
62
+ terms.push({ var: b.assignment(emp.id, pattern.id, day), coeff: 1 });
63
+ }
64
+ }
65
+ if (terms.length === 0)
66
+ continue;
67
+ const weekLabel = weekDays[0];
68
+ const constraintId = `must-assign:${emp.id}:${weekLabel}`;
69
+ b.addSoftLinear(terms, ">=", 1, MUST_ASSIGN_PENALTY, constraintId);
70
+ b.reporter.trackConstraint({
71
+ id: constraintId,
72
+ type: "rule",
73
+ rule: "must-assign",
74
+ description: `${emp.id} not assigned in week starting ${weekLabel} (staffing obligation)`,
75
+ targetValue: 1,
76
+ comparator: ">=",
77
+ day: weekLabel,
78
+ context: { memberIds: [emp.id], days: weekDays },
79
+ group,
80
+ });
81
+ }
82
+ }
83
+ },
84
+ };
85
+ }
86
+ //# sourceMappingURL=must-assign.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"must-assign.js","sourceRoot":"","sources":["../../../src/cpsat/rules/must-assign.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,20 @@
1
- import { createAssignTogetherRule, createAssignmentPriorityRule, createLocationPreferenceRule, createMaxConsecutiveDaysRule, createMaxHoursDayRule, createMaxHoursWeekRule, createMaxShiftsDayRule, createMinConsecutiveDaysRule, createMinHoursDayRule, createMinHoursWeekRule, createMinRestBetweenShiftsRule, createTimeOffRule, createMinimizeCostRule, createDayCostMultiplierRule, createDayCostSurchargeRule, createTimeCostSurchargeRule, createOvertimeWeeklyMultiplierRule, createOvertimeWeeklySurchargeRule, createOvertimeDailyMultiplierRule, createOvertimeDailySurchargeRule, createOvertimeTieredMultiplierRule } from "./index.js";
1
+ import { createAssignTogetherRule, createAssignmentPriorityRule, createLocationPreferenceRule, createMaxConsecutiveDaysRule, createMaxDaysWeekRule, createMaxHoursDayRule, createMaxHoursWeekRule, createMaxShiftsDayRule, createMinConsecutiveDaysRule, createMinDaysWeekRule, createMinHoursDayRule, createMinHoursWeekRule, createMinRestBetweenShiftsRule, createMustAssignRule, createTimeOffRule, createMinimizeCostRule, createDayCostMultiplierRule, createDayCostSurchargeRule, createTimeCostSurchargeRule, createOvertimeWeeklyMultiplierRule, createOvertimeWeeklySurchargeRule, createOvertimeDailyMultiplierRule, createOvertimeDailySurchargeRule, createOvertimeTieredMultiplierRule } from "./index.js";
2
2
  import type { CpsatRuleFactories } from "./rules.types.js";
3
3
  export declare const builtInCpsatRuleFactories: {
4
4
  "assign-together": typeof createAssignTogetherRule;
5
5
  "assignment-priority": typeof createAssignmentPriorityRule;
6
6
  "location-preference": typeof createLocationPreferenceRule;
7
7
  "max-consecutive-days": typeof createMaxConsecutiveDaysRule;
8
+ "max-days-week": typeof createMaxDaysWeekRule;
8
9
  "max-hours-day": typeof createMaxHoursDayRule;
9
10
  "max-hours-week": typeof createMaxHoursWeekRule;
10
11
  "max-shifts-day": typeof createMaxShiftsDayRule;
11
12
  "min-consecutive-days": typeof createMinConsecutiveDaysRule;
13
+ "min-days-week": typeof createMinDaysWeekRule;
12
14
  "min-hours-day": typeof createMinHoursDayRule;
13
15
  "min-hours-week": typeof createMinHoursWeekRule;
14
16
  "min-rest-between-shifts": typeof createMinRestBetweenShiftsRule;
17
+ "must-assign": typeof createMustAssignRule;
15
18
  "time-off": typeof createTimeOffRule;
16
19
  "minimize-cost": typeof createMinimizeCostRule;
17
20
  "day-cost-multiplier": typeof createDayCostMultiplierRule;
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,EACnC,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;CAsBD,CAAC;AAEtC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,kBAAkB,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAUpF"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../../src/cpsat/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,EACnC,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAEV,kBAAkB,EAEnB,MAAM,kBAAkB,CAAC;AAE1B,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;CAyBD,CAAC;AAEtC;;GAEG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,kBAAkB,EAAE,SAAS,EAAE,CAAC,GAAG,CAAC,CAUpF"}
@@ -1,16 +1,19 @@
1
- import { createAssignTogetherRule, createAssignmentPriorityRule, createLocationPreferenceRule, createMaxConsecutiveDaysRule, createMaxHoursDayRule, createMaxHoursWeekRule, createMaxShiftsDayRule, createMinConsecutiveDaysRule, createMinHoursDayRule, createMinHoursWeekRule, createMinRestBetweenShiftsRule, createTimeOffRule, createMinimizeCostRule, createDayCostMultiplierRule, createDayCostSurchargeRule, createTimeCostSurchargeRule, createOvertimeWeeklyMultiplierRule, createOvertimeWeeklySurchargeRule, createOvertimeDailyMultiplierRule, createOvertimeDailySurchargeRule, createOvertimeTieredMultiplierRule, } from "./index.js";
1
+ import { createAssignTogetherRule, createAssignmentPriorityRule, createLocationPreferenceRule, createMaxConsecutiveDaysRule, createMaxDaysWeekRule, createMaxHoursDayRule, createMaxHoursWeekRule, createMaxShiftsDayRule, createMinConsecutiveDaysRule, createMinDaysWeekRule, createMinHoursDayRule, createMinHoursWeekRule, createMinRestBetweenShiftsRule, createMustAssignRule, createTimeOffRule, createMinimizeCostRule, createDayCostMultiplierRule, createDayCostSurchargeRule, createTimeCostSurchargeRule, createOvertimeWeeklyMultiplierRule, createOvertimeWeeklySurchargeRule, createOvertimeDailyMultiplierRule, createOvertimeDailySurchargeRule, createOvertimeTieredMultiplierRule, } from "./index.js";
2
2
  export const builtInCpsatRuleFactories = {
3
3
  "assign-together": createAssignTogetherRule,
4
4
  "assignment-priority": createAssignmentPriorityRule,
5
5
  "location-preference": createLocationPreferenceRule,
6
6
  "max-consecutive-days": createMaxConsecutiveDaysRule,
7
+ "max-days-week": createMaxDaysWeekRule,
7
8
  "max-hours-day": createMaxHoursDayRule,
8
9
  "max-hours-week": createMaxHoursWeekRule,
9
10
  "max-shifts-day": createMaxShiftsDayRule,
10
11
  "min-consecutive-days": createMinConsecutiveDaysRule,
12
+ "min-days-week": createMinDaysWeekRule,
11
13
  "min-hours-day": createMinHoursDayRule,
12
14
  "min-hours-week": createMinHoursWeekRule,
13
15
  "min-rest-between-shifts": createMinRestBetweenShiftsRule,
16
+ "must-assign": createMustAssignRule,
14
17
  "time-off": createTimeOffRule,
15
18
  "minimize-cost": createMinimizeCostRule,
16
19
  "day-cost-multiplier": createDayCostMultiplierRule,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cpsat/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,YAAY,CAAC;AAOpB,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,iBAAiB,EAAE,wBAAwB;IAC3C,qBAAqB,EAAE,4BAA4B;IACnD,qBAAqB,EAAE,4BAA4B;IACnD,sBAAsB,EAAE,4BAA4B;IACpD,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,sBAAsB;IACxC,gBAAgB,EAAE,sBAAsB;IACxC,sBAAsB,EAAE,4BAA4B;IACpD,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,sBAAsB;IACxC,yBAAyB,EAAE,8BAA8B;IACzD,UAAU,EAAE,iBAAiB;IAC7B,eAAe,EAAE,sBAAsB;IACvC,qBAAqB,EAAE,2BAA2B;IAClD,oBAAoB,EAAE,0BAA0B;IAChD,qBAAqB,EAAE,2BAA2B;IAClD,4BAA4B,EAAE,kCAAkC;IAChE,2BAA2B,EAAE,iCAAiC;IAC9D,2BAA2B,EAAE,iCAAiC;IAC9D,0BAA0B,EAAE,gCAAgC;IAC5D,4BAA4B,EAAE,kCAAkC;CAC7B,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAA+B,SAAY;IAC/E,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IACE,IAAI,IAAI,yBAAyB;YACjC,SAAS,CAAC,IAAI,CAAC,KAAK,yBAAyB,CAAC,IAAqB,CAAC,EACpE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,qBAAqB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../../src/cpsat/rules/registry.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,wBAAwB,EACxB,4BAA4B,EAC5B,4BAA4B,EAC5B,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,sBAAsB,EACtB,4BAA4B,EAC5B,qBAAqB,EACrB,qBAAqB,EACrB,sBAAsB,EACtB,8BAA8B,EAC9B,oBAAoB,EACpB,iBAAiB,EACjB,sBAAsB,EACtB,2BAA2B,EAC3B,0BAA0B,EAC1B,2BAA2B,EAC3B,kCAAkC,EAClC,iCAAiC,EACjC,iCAAiC,EACjC,gCAAgC,EAChC,kCAAkC,GACnC,MAAM,YAAY,CAAC;AAOpB,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACvC,iBAAiB,EAAE,wBAAwB;IAC3C,qBAAqB,EAAE,4BAA4B;IACnD,qBAAqB,EAAE,4BAA4B;IACnD,sBAAsB,EAAE,4BAA4B;IACpD,eAAe,EAAE,qBAAqB;IACtC,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,sBAAsB;IACxC,gBAAgB,EAAE,sBAAsB;IACxC,sBAAsB,EAAE,4BAA4B;IACpD,eAAe,EAAE,qBAAqB;IACtC,eAAe,EAAE,qBAAqB;IACtC,gBAAgB,EAAE,sBAAsB;IACxC,yBAAyB,EAAE,8BAA8B;IACzD,aAAa,EAAE,oBAAoB;IACnC,UAAU,EAAE,iBAAiB;IAC7B,eAAe,EAAE,sBAAsB;IACvC,qBAAqB,EAAE,2BAA2B;IAClD,oBAAoB,EAAE,0BAA0B;IAChD,qBAAqB,EAAE,2BAA2B;IAClD,4BAA4B,EAAE,kCAAkC;IAChE,2BAA2B,EAAE,iCAAiC;IAC9D,2BAA2B,EAAE,iCAAiC;IAC9D,0BAA0B,EAAE,gCAAgC;IAC5D,4BAA4B,EAAE,kCAAkC;CAC7B,CAAC;AAEtC;;GAEG;AACH,MAAM,UAAU,sBAAsB,CAA+B,SAAY;IAC/E,KAAK,MAAM,IAAI,IAAI,SAAS,EAAE,CAAC;QAC7B,IACE,IAAI,IAAI,yBAAyB;YACjC,SAAS,CAAC,IAAI,CAAC,KAAK,yBAAyB,CAAC,IAAqB,CAAC,EACpE,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,yCAAyC,IAAI,qBAAqB,CAAC,CAAC;QACtF,CAAC;IACH,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -5,13 +5,16 @@ export interface CpsatRuleRegistry {
5
5
  "assignment-priority": import("./assignment-priority.js").AssignmentPriorityConfig;
6
6
  "location-preference": import("./location-preference.js").LocationPreferenceConfig;
7
7
  "max-consecutive-days": import("./max-consecutive-days.js").MaxConsecutiveDaysConfig;
8
+ "max-days-week": import("./max-days-week.js").MaxDaysWeekConfig;
8
9
  "max-hours-day": import("./max-hours-day.js").MaxHoursDayConfig;
9
10
  "max-hours-week": import("./max-hours-week.js").MaxHoursWeekConfig;
10
11
  "max-shifts-day": import("./max-shifts-day.js").MaxShiftsDayConfig;
11
12
  "min-consecutive-days": import("./min-consecutive-days.js").MinConsecutiveDaysConfig;
13
+ "min-days-week": import("./min-days-week.js").MinDaysWeekConfig;
12
14
  "min-hours-day": import("./min-hours-day.js").MinHoursDayConfig;
13
15
  "min-hours-week": import("./min-hours-week.js").MinHoursWeekConfig;
14
16
  "min-rest-between-shifts": import("./min-rest-between-shifts.js").MinRestBetweenShiftsConfig;
17
+ "must-assign": import("./must-assign.js").MustAssignConfig;
15
18
  "time-off": import("./time-off.js").TimeOffConfig;
16
19
  "minimize-cost": import("./minimize-cost.js").MinimizeCostConfig;
17
20
  "day-cost-multiplier": import("./day-cost-multiplier.js").DayCostMultiplierConfig;