dabke 0.83.0 → 0.84.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 (330) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/README.md +22 -27
  3. package/dist/client.d.ts +39 -3
  4. package/dist/client.d.ts.map +1 -1
  5. package/dist/client.js.map +1 -1
  6. package/dist/client.schemas.d.ts +118 -18
  7. package/dist/client.schemas.d.ts.map +1 -1
  8. package/dist/client.schemas.js +110 -6
  9. package/dist/client.schemas.js.map +1 -1
  10. package/dist/client.types.d.ts +63 -7
  11. package/dist/client.types.d.ts.map +1 -1
  12. package/dist/client.types.js.map +1 -1
  13. package/dist/cpsat/cost.d.ts +5 -2
  14. package/dist/cpsat/cost.d.ts.map +1 -1
  15. package/dist/cpsat/cost.js +13 -6
  16. package/dist/cpsat/cost.js.map +1 -1
  17. package/dist/cpsat/model-builder.d.ts +42 -61
  18. package/dist/cpsat/model-builder.d.ts.map +1 -1
  19. package/dist/cpsat/model-builder.js +451 -56
  20. package/dist/cpsat/model-builder.js.map +1 -1
  21. package/dist/cpsat/response.d.ts +19 -7
  22. package/dist/cpsat/response.d.ts.map +1 -1
  23. package/dist/cpsat/response.js +48 -9
  24. package/dist/cpsat/response.js.map +1 -1
  25. package/dist/cpsat/rule-descriptor.d.ts +250 -0
  26. package/dist/cpsat/rule-descriptor.d.ts.map +1 -0
  27. package/dist/cpsat/rule-descriptor.js +51 -0
  28. package/dist/cpsat/rule-descriptor.js.map +1 -0
  29. package/dist/cpsat/rules/artifacts.d.ts +9 -0
  30. package/dist/cpsat/rules/artifacts.d.ts.map +1 -0
  31. package/dist/cpsat/rules/artifacts.js +31 -0
  32. package/dist/cpsat/rules/artifacts.js.map +1 -0
  33. package/dist/cpsat/rules/assign-together.d.ts +18 -20
  34. package/dist/cpsat/rules/assign-together.d.ts.map +1 -1
  35. package/dist/cpsat/rules/assign-together.js +90 -54
  36. package/dist/cpsat/rules/assign-together.js.map +1 -1
  37. package/dist/cpsat/rules/assigned-day.d.ts +12 -0
  38. package/dist/cpsat/rules/assigned-day.d.ts.map +1 -0
  39. package/dist/cpsat/rules/assigned-day.js +43 -0
  40. package/dist/cpsat/rules/assigned-day.js.map +1 -0
  41. package/dist/cpsat/rules/assignment-priority.d.ts +15 -29
  42. package/dist/cpsat/rules/assignment-priority.d.ts.map +1 -1
  43. package/dist/cpsat/rules/assignment-priority.js +47 -50
  44. package/dist/cpsat/rules/assignment-priority.js.map +1 -1
  45. package/dist/cpsat/rules/assignment-terms.d.ts +6 -0
  46. package/dist/cpsat/rules/assignment-terms.d.ts.map +1 -0
  47. package/dist/cpsat/rules/assignment-terms.js +19 -0
  48. package/dist/cpsat/rules/assignment-terms.js.map +1 -0
  49. package/dist/cpsat/rules/concurrent-intervals.d.ts +19 -0
  50. package/dist/cpsat/rules/concurrent-intervals.d.ts.map +1 -0
  51. package/dist/cpsat/rules/concurrent-intervals.js +57 -0
  52. package/dist/cpsat/rules/concurrent-intervals.js.map +1 -0
  53. package/dist/cpsat/rules/cost-utils.d.ts +1 -3
  54. package/dist/cpsat/rules/cost-utils.d.ts.map +1 -1
  55. package/dist/cpsat/rules/cost-utils.js +0 -7
  56. package/dist/cpsat/rules/cost-utils.js.map +1 -1
  57. package/dist/cpsat/rules/day-cost-multiplier.d.ts +10 -10
  58. package/dist/cpsat/rules/day-cost-multiplier.d.ts.map +1 -1
  59. package/dist/cpsat/rules/day-cost-multiplier.js +88 -77
  60. package/dist/cpsat/rules/day-cost-multiplier.js.map +1 -1
  61. package/dist/cpsat/rules/day-cost-surcharge.d.ts +10 -10
  62. package/dist/cpsat/rules/day-cost-surcharge.d.ts.map +1 -1
  63. package/dist/cpsat/rules/day-cost-surcharge.js +76 -65
  64. package/dist/cpsat/rules/day-cost-surcharge.js.map +1 -1
  65. package/dist/cpsat/rules/index.d.ts +30 -24
  66. package/dist/cpsat/rules/index.d.ts.map +1 -1
  67. package/dist/cpsat/rules/index.js +30 -24
  68. package/dist/cpsat/rules/index.js.map +1 -1
  69. package/dist/cpsat/rules/location-preference.d.ts +14 -21
  70. package/dist/cpsat/rules/location-preference.d.ts.map +1 -1
  71. package/dist/cpsat/rules/location-preference.js +45 -45
  72. package/dist/cpsat/rules/location-preference.js.map +1 -1
  73. package/dist/cpsat/rules/max-concurrent-assignments.d.ts +46 -0
  74. package/dist/cpsat/rules/max-concurrent-assignments.d.ts.map +1 -0
  75. package/dist/cpsat/rules/max-concurrent-assignments.js +121 -0
  76. package/dist/cpsat/rules/max-concurrent-assignments.js.map +1 -0
  77. package/dist/cpsat/rules/max-consecutive-days.d.ts +18 -17
  78. package/dist/cpsat/rules/max-consecutive-days.d.ts.map +1 -1
  79. package/dist/cpsat/rules/max-consecutive-days.js +67 -66
  80. package/dist/cpsat/rules/max-consecutive-days.js.map +1 -1
  81. package/dist/cpsat/rules/max-days-of-week-per-period.d.ts +45 -0
  82. package/dist/cpsat/rules/max-days-of-week-per-period.d.ts.map +1 -0
  83. package/dist/cpsat/rules/max-days-of-week-per-period.js +95 -0
  84. package/dist/cpsat/rules/max-days-of-week-per-period.js.map +1 -0
  85. package/dist/cpsat/rules/max-days-week.d.ts +17 -31
  86. package/dist/cpsat/rules/max-days-week.d.ts.map +1 -1
  87. package/dist/cpsat/rules/max-days-week.js +69 -81
  88. package/dist/cpsat/rules/max-days-week.js.map +1 -1
  89. package/dist/cpsat/rules/max-hours-day.d.ts +14 -31
  90. package/dist/cpsat/rules/max-hours-day.d.ts.map +1 -1
  91. package/dist/cpsat/rules/max-hours-day.js +56 -72
  92. package/dist/cpsat/rules/max-hours-day.js.map +1 -1
  93. package/dist/cpsat/rules/max-hours-week.d.ts +15 -31
  94. package/dist/cpsat/rules/max-hours-week.d.ts.map +1 -1
  95. package/dist/cpsat/rules/max-hours-week.js +60 -75
  96. package/dist/cpsat/rules/max-hours-week.js.map +1 -1
  97. package/dist/cpsat/rules/max-shifts-day.d.ts +17 -33
  98. package/dist/cpsat/rules/max-shifts-day.d.ts.map +1 -1
  99. package/dist/cpsat/rules/max-shifts-day.js +57 -73
  100. package/dist/cpsat/rules/max-shifts-day.js.map +1 -1
  101. package/dist/cpsat/rules/min-consecutive-days.d.ts +18 -18
  102. package/dist/cpsat/rules/min-consecutive-days.d.ts.map +1 -1
  103. package/dist/cpsat/rules/min-consecutive-days.js +123 -94
  104. package/dist/cpsat/rules/min-consecutive-days.js.map +1 -1
  105. package/dist/cpsat/rules/min-days-of-week-per-period.d.ts +35 -0
  106. package/dist/cpsat/rules/min-days-of-week-per-period.d.ts.map +1 -0
  107. package/dist/cpsat/rules/min-days-of-week-per-period.js +108 -0
  108. package/dist/cpsat/rules/min-days-of-week-per-period.js.map +1 -0
  109. package/dist/cpsat/rules/min-days-week.d.ts +13 -26
  110. package/dist/cpsat/rules/min-days-week.d.ts.map +1 -1
  111. package/dist/cpsat/rules/min-days-week.js +85 -74
  112. package/dist/cpsat/rules/min-days-week.js.map +1 -1
  113. package/dist/cpsat/rules/min-hours-day.d.ts +14 -17
  114. package/dist/cpsat/rules/min-hours-day.d.ts.map +1 -1
  115. package/dist/cpsat/rules/min-hours-day.js +72 -54
  116. package/dist/cpsat/rules/min-hours-day.js.map +1 -1
  117. package/dist/cpsat/rules/min-hours-week.d.ts +15 -18
  118. package/dist/cpsat/rules/min-hours-week.d.ts.map +1 -1
  119. package/dist/cpsat/rules/min-hours-week.js +75 -57
  120. package/dist/cpsat/rules/min-hours-week.js.map +1 -1
  121. package/dist/cpsat/rules/min-rest-between-shifts.d.ts +14 -17
  122. package/dist/cpsat/rules/min-rest-between-shifts.d.ts.map +1 -1
  123. package/dist/cpsat/rules/min-rest-between-shifts.js +148 -138
  124. package/dist/cpsat/rules/min-rest-between-shifts.js.map +1 -1
  125. package/dist/cpsat/rules/minimize-cost.d.ts +2 -18
  126. package/dist/cpsat/rules/minimize-cost.d.ts.map +1 -1
  127. package/dist/cpsat/rules/minimize-cost.js +151 -163
  128. package/dist/cpsat/rules/minimize-cost.js.map +1 -1
  129. package/dist/cpsat/rules/must-assign.d.ts +5 -42
  130. package/dist/cpsat/rules/must-assign.d.ts.map +1 -1
  131. package/dist/cpsat/rules/must-assign.js +43 -75
  132. package/dist/cpsat/rules/must-assign.js.map +1 -1
  133. package/dist/cpsat/rules/overtime-daily-multiplier.d.ts +6 -10
  134. package/dist/cpsat/rules/overtime-daily-multiplier.d.ts.map +1 -1
  135. package/dist/cpsat/rules/overtime-daily-multiplier.js +118 -112
  136. package/dist/cpsat/rules/overtime-daily-multiplier.js.map +1 -1
  137. package/dist/cpsat/rules/overtime-daily-surcharge.d.ts +6 -11
  138. package/dist/cpsat/rules/overtime-daily-surcharge.d.ts.map +1 -1
  139. package/dist/cpsat/rules/overtime-daily-surcharge.js +104 -99
  140. package/dist/cpsat/rules/overtime-daily-surcharge.js.map +1 -1
  141. package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts +9 -21
  142. package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts.map +1 -1
  143. package/dist/cpsat/rules/overtime-tiered-multiplier.js +181 -199
  144. package/dist/cpsat/rules/overtime-tiered-multiplier.js.map +1 -1
  145. package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts +13 -12
  146. package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts.map +1 -1
  147. package/dist/cpsat/rules/overtime-weekly-multiplier.js +143 -143
  148. package/dist/cpsat/rules/overtime-weekly-multiplier.js.map +1 -1
  149. package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts +7 -11
  150. package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts.map +1 -1
  151. package/dist/cpsat/rules/overtime-weekly-surcharge.js +124 -119
  152. package/dist/cpsat/rules/overtime-weekly-surcharge.js.map +1 -1
  153. package/dist/cpsat/rules/pattern-eligibility.d.ts +6 -0
  154. package/dist/cpsat/rules/pattern-eligibility.d.ts.map +1 -0
  155. package/dist/cpsat/rules/pattern-eligibility.js +16 -0
  156. package/dist/cpsat/rules/pattern-eligibility.js.map +1 -0
  157. package/dist/cpsat/rules/pattern-time.d.ts +5 -0
  158. package/dist/cpsat/rules/pattern-time.d.ts.map +1 -0
  159. package/dist/cpsat/rules/pattern-time.js +20 -0
  160. package/dist/cpsat/rules/pattern-time.js.map +1 -0
  161. package/dist/cpsat/rules/registry.d.ts +217 -30
  162. package/dist/cpsat/rules/registry.d.ts.map +1 -1
  163. package/dist/cpsat/rules/registry.js +98 -34
  164. package/dist/cpsat/rules/registry.js.map +1 -1
  165. package/dist/cpsat/rules/resolver.d.ts +9 -7
  166. package/dist/cpsat/rules/resolver.d.ts.map +1 -1
  167. package/dist/cpsat/rules/resolver.js +19 -18
  168. package/dist/cpsat/rules/resolver.js.map +1 -1
  169. package/dist/cpsat/rules/role-preference.d.ts +24 -0
  170. package/dist/cpsat/rules/role-preference.d.ts.map +1 -0
  171. package/dist/cpsat/rules/role-preference.js +72 -0
  172. package/dist/cpsat/rules/role-preference.js.map +1 -0
  173. package/dist/cpsat/rules/rules.types.d.ts +90 -17
  174. package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
  175. package/dist/cpsat/rules/scope.types.d.ts +24 -11
  176. package/dist/cpsat/rules/scope.types.d.ts.map +1 -1
  177. package/dist/cpsat/rules/scope.types.js +14 -19
  178. package/dist/cpsat/rules/scope.types.js.map +1 -1
  179. package/dist/cpsat/rules/target-days-week.d.ts +31 -0
  180. package/dist/cpsat/rules/target-days-week.d.ts.map +1 -0
  181. package/dist/cpsat/rules/target-days-week.js +80 -0
  182. package/dist/cpsat/rules/target-days-week.js.map +1 -0
  183. package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts +33 -0
  184. package/dist/cpsat/rules/target-peak-concurrent-assignments.d.ts.map +1 -0
  185. package/dist/cpsat/rules/target-peak-concurrent-assignments.js +146 -0
  186. package/dist/cpsat/rules/target-peak-concurrent-assignments.js.map +1 -0
  187. package/dist/cpsat/rules/time-cost-surcharge.d.ts +15 -14
  188. package/dist/cpsat/rules/time-cost-surcharge.d.ts.map +1 -1
  189. package/dist/cpsat/rules/time-cost-surcharge.js +82 -96
  190. package/dist/cpsat/rules/time-cost-surcharge.js.map +1 -1
  191. package/dist/cpsat/rules/time-off.d.ts +21 -57
  192. package/dist/cpsat/rules/time-off.d.ts.map +1 -1
  193. package/dist/cpsat/rules/time-off.js +114 -127
  194. package/dist/cpsat/rules/time-off.js.map +1 -1
  195. package/dist/cpsat/rules/variables.d.ts +4 -0
  196. package/dist/cpsat/rules/variables.d.ts.map +1 -0
  197. package/dist/cpsat/rules/variables.js +10 -0
  198. package/dist/cpsat/rules/variables.js.map +1 -0
  199. package/dist/cpsat/rules.d.ts +20 -3
  200. package/dist/cpsat/rules.d.ts.map +1 -1
  201. package/dist/cpsat/rules.js +19 -2
  202. package/dist/cpsat/rules.js.map +1 -1
  203. package/dist/cpsat/semantic-time.d.ts +7 -6
  204. package/dist/cpsat/semantic-time.d.ts.map +1 -1
  205. package/dist/cpsat/semantic-time.js +15 -28
  206. package/dist/cpsat/semantic-time.js.map +1 -1
  207. package/dist/cpsat/types.d.ts +47 -4
  208. package/dist/cpsat/types.d.ts.map +1 -1
  209. package/dist/cpsat/types.js +24 -1
  210. package/dist/cpsat/types.js.map +1 -1
  211. package/dist/cpsat/utils.d.ts +23 -6
  212. package/dist/cpsat/utils.d.ts.map +1 -1
  213. package/dist/cpsat/utils.js +76 -15
  214. package/dist/cpsat/utils.js.map +1 -1
  215. package/dist/cpsat/validation-reporter.d.ts +6 -2
  216. package/dist/cpsat/validation-reporter.d.ts.map +1 -1
  217. package/dist/cpsat/validation-reporter.js +122 -10
  218. package/dist/cpsat/validation-reporter.js.map +1 -1
  219. package/dist/cpsat/validation.types.d.ts +21 -10
  220. package/dist/cpsat/validation.types.d.ts.map +1 -1
  221. package/dist/datetime.utils.d.ts +7 -13
  222. package/dist/datetime.utils.d.ts.map +1 -1
  223. package/dist/datetime.utils.js +29 -36
  224. package/dist/datetime.utils.js.map +1 -1
  225. package/dist/index.d.ts +12 -8
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.js +8 -3
  228. package/dist/index.js.map +1 -1
  229. package/dist/schedule/cost.d.ts +48 -60
  230. package/dist/schedule/cost.d.ts.map +1 -1
  231. package/dist/schedule/cost.js +15 -51
  232. package/dist/schedule/cost.js.map +1 -1
  233. package/dist/schedule/coverage.d.ts +57 -28
  234. package/dist/schedule/coverage.d.ts.map +1 -1
  235. package/dist/schedule/coverage.js +24 -1
  236. package/dist/schedule/coverage.js.map +1 -1
  237. package/dist/schedule/definition.d.ts +138 -19
  238. package/dist/schedule/definition.d.ts.map +1 -1
  239. package/dist/schedule/definition.js +99 -90
  240. package/dist/schedule/definition.js.map +1 -1
  241. package/dist/schedule/index.d.ts +4 -4
  242. package/dist/schedule/index.d.ts.map +1 -1
  243. package/dist/schedule/index.js +2 -2
  244. package/dist/schedule/index.js.map +1 -1
  245. package/dist/schedule/rules.d.ts +438 -113
  246. package/dist/schedule/rules.d.ts.map +1 -1
  247. package/dist/schedule/rules.js +310 -108
  248. package/dist/schedule/rules.js.map +1 -1
  249. package/dist/schedule/shift-patterns.d.ts +0 -17
  250. package/dist/schedule/shift-patterns.d.ts.map +1 -1
  251. package/dist/schedule/shift-patterns.js +0 -17
  252. package/dist/schedule/shift-patterns.js.map +1 -1
  253. package/dist/schedule/time-periods.d.ts +37 -27
  254. package/dist/schedule/time-periods.d.ts.map +1 -1
  255. package/dist/schedule/time-periods.js +37 -27
  256. package/dist/schedule/time-periods.js.map +1 -1
  257. package/dist/types.d.ts +67 -3
  258. package/dist/types.d.ts.map +1 -1
  259. package/dist/types.js +64 -0
  260. package/dist/types.js.map +1 -1
  261. package/package.json +8 -9
  262. package/solver/src/solver/models.py +41 -4
  263. package/solver/src/solver/solver.py +546 -157
  264. package/solver/tests/test_solver.py +363 -7
  265. package/src/client.schemas.ts +127 -10
  266. package/src/client.ts +3 -0
  267. package/src/client.types.ts +73 -7
  268. package/src/cpsat/cost.ts +17 -7
  269. package/src/cpsat/model-builder.ts +614 -129
  270. package/src/cpsat/response.ts +57 -13
  271. package/src/cpsat/rule-descriptor.ts +311 -0
  272. package/src/cpsat/rules/artifacts.ts +56 -0
  273. package/src/cpsat/rules/assign-together.ts +104 -69
  274. package/src/cpsat/rules/assigned-day.ts +70 -0
  275. package/src/cpsat/rules/assignment-priority.ts +54 -58
  276. package/src/cpsat/rules/assignment-terms.ts +43 -0
  277. package/src/cpsat/rules/concurrent-intervals.ts +93 -0
  278. package/src/cpsat/rules/cost-utils.ts +1 -9
  279. package/src/cpsat/rules/day-cost-multiplier.ts +101 -81
  280. package/src/cpsat/rules/day-cost-surcharge.ts +91 -70
  281. package/src/cpsat/rules/index.ts +30 -24
  282. package/src/cpsat/rules/location-preference.ts +47 -52
  283. package/src/cpsat/rules/max-concurrent-assignments.ts +170 -0
  284. package/src/cpsat/rules/max-consecutive-days.ts +74 -91
  285. package/src/cpsat/rules/max-days-of-week-per-period.ts +127 -0
  286. package/src/cpsat/rules/max-days-week.ts +89 -115
  287. package/src/cpsat/rules/max-hours-day.ts +64 -84
  288. package/src/cpsat/rules/max-hours-week.ts +74 -90
  289. package/src/cpsat/rules/max-shifts-day.ts +65 -85
  290. package/src/cpsat/rules/min-consecutive-days.ts +161 -127
  291. package/src/cpsat/rules/min-days-of-week-per-period.ts +144 -0
  292. package/src/cpsat/rules/min-days-week.ts +93 -91
  293. package/src/cpsat/rules/min-hours-day.ts +79 -58
  294. package/src/cpsat/rules/min-hours-week.ts +87 -62
  295. package/src/cpsat/rules/min-rest-between-shifts.ts +191 -178
  296. package/src/cpsat/rules/minimize-cost.ts +175 -188
  297. package/src/cpsat/rules/must-assign.ts +44 -81
  298. package/src/cpsat/rules/overtime-daily-multiplier.ts +158 -140
  299. package/src/cpsat/rules/overtime-daily-surcharge.ts +141 -126
  300. package/src/cpsat/rules/overtime-tiered-multiplier.ts +234 -253
  301. package/src/cpsat/rules/overtime-weekly-multiplier.ts +183 -175
  302. package/src/cpsat/rules/overtime-weekly-surcharge.ts +161 -150
  303. package/src/cpsat/rules/pattern-eligibility.ts +26 -0
  304. package/src/cpsat/rules/pattern-time.ts +30 -0
  305. package/src/cpsat/rules/registry.ts +140 -62
  306. package/src/cpsat/rules/resolver.ts +58 -30
  307. package/src/cpsat/rules/role-preference.ts +92 -0
  308. package/src/cpsat/rules/rules.types.ts +89 -17
  309. package/src/cpsat/rules/scope.types.ts +31 -26
  310. package/src/cpsat/rules/target-days-week.ts +105 -0
  311. package/src/cpsat/rules/target-peak-concurrent-assignments.ts +212 -0
  312. package/src/cpsat/rules/time-cost-surcharge.ts +116 -122
  313. package/src/cpsat/rules/time-off.ts +154 -163
  314. package/src/cpsat/rules/variables.ts +11 -0
  315. package/src/cpsat/rules.ts +43 -17
  316. package/src/cpsat/semantic-time.ts +29 -43
  317. package/src/cpsat/types.ts +53 -4
  318. package/src/cpsat/utils.ts +92 -20
  319. package/src/cpsat/validation-reporter.ts +170 -19
  320. package/src/cpsat/validation.types.ts +22 -11
  321. package/src/datetime.utils.ts +45 -44
  322. package/src/index.ts +64 -12
  323. package/src/schedule/cost.ts +40 -61
  324. package/src/schedule/coverage.ts +57 -28
  325. package/src/schedule/definition.ts +565 -76
  326. package/src/schedule/index.ts +23 -3
  327. package/src/schedule/rules.ts +631 -132
  328. package/src/schedule/shift-patterns.ts +0 -17
  329. package/src/schedule/time-periods.ts +37 -27
  330. package/src/types.ts +114 -2
@@ -3,25 +3,79 @@
3
3
  *
4
4
  * @module
5
5
  */
6
- import type { DayOfWeek } from "../types.js";
6
+ import type { DateString, DayOfWeek } from "../types.js";
7
7
  import type { SemanticTimeEntry } from "../cpsat/semantic-time.js";
8
8
  import type { CompilationResult } from "../cpsat/model-builder.js";
9
9
  import { ModelBuilder } from "../cpsat/model-builder.js";
10
10
  import type { SchedulingMember, ShiftPattern } from "../cpsat/types.js";
11
- import type { CreateCpsatRuleFunction } from "../cpsat/rules/rules.types.js";
11
+ import type { BuiltInCpsatRuleRegistry, CpsatRuleConfigEntryFor, CpsatRuleRegistry } from "../cpsat/rules/rules.types.js";
12
12
  import type { SolverClient } from "../client.types.js";
13
13
  import type { ShiftAssignment } from "../cpsat/response.js";
14
14
  import type { ScheduleValidation } from "../cpsat/validation.types.js";
15
15
  import type { CostBreakdown } from "../cpsat/cost.js";
16
16
  import type { CoverageEntry } from "./coverage.js";
17
- import type { RuleEntry } from "./rules.js";
17
+ import type { RuleEntry, ScheduleRuleEntry } from "./rules.js";
18
18
  /** A value that can be passed to {@link Schedule.with}. */
19
- type WithArg = Schedule | SchedulingMember[];
19
+ type WithArg = Schedule<CpsatRuleRegistry> | SchedulingMember[];
20
+ type EmptyRuleRegistry = Record<never, never>;
21
+ type BuiltInRuleRegistry = BuiltInCpsatRuleRegistry;
22
+ type CustomRuleRegistry<TRuleRegistry extends BuiltInRuleRegistry> = CpsatRuleRegistry & {
23
+ [K in Extract<Exclude<keyof TRuleRegistry, keyof BuiltInRuleRegistry>, string>]: TRuleRegistry[K];
24
+ };
25
+ type RegistryFromWithArg<T> = T extends Schedule<infer Registry> ? Registry : EmptyRuleRegistry;
26
+ type RuleEntryFields<T> = T extends RuleEntry<any, infer Fields> ? Fields : never;
27
+ type BuiltInScheduleRuleAuthoringFields<Name extends keyof BuiltInRuleRegistry> = Name extends "max-hours-day" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxHoursPerDay>> : Name extends "max-hours-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxHoursPerWeek>> : Name extends "min-hours-day" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minHoursPerDay>> : Name extends "min-hours-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minHoursPerWeek>> : Name extends "max-days-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxDaysPerWeek>> : Name extends "min-days-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minDaysPerWeek>> : Name extends "target-days-week" ? RuleEntryFields<ReturnType<typeof import("./rules.js").targetDaysPerWeek>> : Name extends "max-shifts-day" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxShiftsPerDay>> : Name extends "max-concurrent-assignments" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxConcurrentAssignments>> : Name extends "target-peak-concurrent-assignments" ? RuleEntryFields<ReturnType<typeof import("./rules.js").targetPeakConcurrentAssignments>> : Name extends "max-consecutive-days" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxConsecutiveDays>> : Name extends "min-consecutive-days" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minConsecutiveDays>> : Name extends "min-rest-between-shifts" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minRestBetweenShifts>> : Name extends "must-assign" ? RuleEntryFields<ReturnType<typeof import("./rules.js").mustAssign>> : Name extends "assignment-priority" ? RuleEntryFields<ReturnType<typeof import("./rules.js").preferAssignment>> : Name extends "role-preference" ? RuleEntryFields<ReturnType<typeof import("./rules.js").preferRole>> : Name extends "location-preference" ? RuleEntryFields<ReturnType<typeof import("./rules.js").preferLocation>> : Name extends "time-off" ? RuleEntryFields<ReturnType<typeof import("./rules.js").timeOff>> : Name extends "assign-together" ? RuleEntryFields<ReturnType<typeof import("./rules.js").assignTogether>> : Name extends "max-days-of-week-per-period" ? RuleEntryFields<ReturnType<typeof import("./rules.js").maxDaysOfWeekPerPeriod>> : Name extends "min-days-of-week-per-period" ? RuleEntryFields<ReturnType<typeof import("./rules.js").minDaysOfWeekPerPeriod>> : Name extends "minimize-cost" ? RuleEntryFields<ReturnType<typeof import("./cost.js").minimizeCost>> : Name extends "day-cost-multiplier" ? RuleEntryFields<ReturnType<typeof import("./cost.js").dayMultiplier>> : Name extends "day-cost-surcharge" ? RuleEntryFields<ReturnType<typeof import("./cost.js").daySurcharge>> : Name extends "time-cost-surcharge" ? RuleEntryFields<ReturnType<typeof import("./cost.js").timeSurcharge>> : Name extends "overtime-weekly-multiplier" ? RuleEntryFields<ReturnType<typeof import("./cost.js").overtimeMultiplier>> : Name extends "overtime-weekly-surcharge" ? RuleEntryFields<ReturnType<typeof import("./cost.js").overtimeSurcharge>> : Name extends "overtime-daily-multiplier" ? RuleEntryFields<ReturnType<typeof import("./cost.js").dailyOvertimeMultiplier>> : Name extends "overtime-daily-surcharge" ? RuleEntryFields<ReturnType<typeof import("./cost.js").dailyOvertimeSurcharge>> : Name extends "overtime-tiered-multiplier" ? RuleEntryFields<ReturnType<typeof import("./cost.js").tieredOvertimeMultiplier>> : never;
28
+ type ValidateScheduleRuleEntry<TRuleRegistry extends CpsatRuleRegistry, Entry> = Entry extends ScheduleRuleEntry<TRuleRegistry> ? Entry : Entry extends RuleEntry<infer Name, infer Fields> ? string extends Name ? Entry : Name extends keyof TRuleRegistry & string ? Name extends keyof BuiltInRuleRegistry ? Fields extends BuiltInScheduleRuleAuthoringFields<Name> ? Entry : never : Fields extends Omit<CpsatRuleConfigEntryFor<Pick<TRuleRegistry, Name>>, "name"> ? Entry : never : never : never;
29
+ type ValidateScheduleRules<TRuleRegistry extends CpsatRuleRegistry, TRules extends readonly unknown[]> = {
30
+ readonly [Index in keyof TRules]: ValidateScheduleRuleEntry<TRuleRegistry, TRules[Index]>;
31
+ };
32
+ type BuiltInScheduleConfigInput<R extends readonly string[], S extends readonly string[], T extends Record<string, SemanticTimeEntry>, TRules extends readonly unknown[]> = Omit<ScheduleConfig<R, S, T, BuiltInRuleRegistry>, "rules" | "ruleRegistry"> & {
33
+ rules?: ValidateScheduleRules<BuiltInRuleRegistry, TRules>;
34
+ ruleRegistry?: undefined;
35
+ };
36
+ type CustomScheduleConfigInput<R extends readonly string[], S extends readonly string[], T extends Record<string, SemanticTimeEntry>, TCustomRuleRegistry extends CpsatRuleRegistry, TRules extends readonly unknown[]> = Omit<ScheduleConfig<R, S, T, BuiltInRuleRegistry & TCustomRuleRegistry>, "rules" | "ruleRegistry"> & {
37
+ ruleRegistry: TCustomRuleRegistry;
38
+ rules?: ValidateScheduleRules<BuiltInRuleRegistry & TCustomRuleRegistry, TRules>;
39
+ };
40
+ type BuiltInPartialScheduleConfigInput<TRules extends readonly unknown[]> = Partial<Omit<ScheduleConfig<readonly string[], readonly string[], Record<string, SemanticTimeEntry>, BuiltInRuleRegistry>, "rules" | "ruleRegistry">> & {
41
+ rules?: ValidateScheduleRules<BuiltInRuleRegistry, TRules>;
42
+ ruleRegistry?: undefined;
43
+ };
44
+ type CustomPartialScheduleConfigInput<TCustomRuleRegistry extends CpsatRuleRegistry, TRules extends readonly unknown[]> = Partial<Omit<ScheduleConfig<readonly string[], readonly string[], Record<string, SemanticTimeEntry>, BuiltInRuleRegistry & TCustomRuleRegistry>, "rules" | "ruleRegistry">> & {
45
+ ruleRegistry: TCustomRuleRegistry;
46
+ rules?: ValidateScheduleRules<BuiltInRuleRegistry & TCustomRuleRegistry, TRules>;
47
+ };
48
+ type UnionToIntersection<T> = (T extends unknown ? (value: T) => void : never) extends (value: infer Result) => void ? Result : never;
49
+ type MergedRegistryFromArgs<Args extends readonly WithArg[]> = UnionToIntersection<RegistryFromWithArg<Args[number]>>;
20
50
  /** Status of a solve attempt, using idiomatic lowercase TypeScript literals. */
21
51
  export type SolveStatus = "optimal" | "feasible" | "infeasible" | "no_solution";
52
+ /**
53
+ * Strategy for {@link Schedule.solve} and {@link Schedule.compile}.
54
+ *
55
+ * @remarks
56
+ * `{ type: "optimize" }` optimizes objectives and soft constraints.
57
+ * `{ type: "feasibility-only" }` asks the solver for a hard-feasible solution
58
+ * only, ignoring objectives and soft-constraint penalties. Feasibility-only
59
+ * results do not guarantee cost, objective optimality, or soft-constraint
60
+ * diagnostics.
61
+ *
62
+ * @category Schedule Definition
63
+ */
64
+ export type SolveStrategy = {
65
+ /** Optimize objectives and soft constraints. */
66
+ readonly type: "optimize";
67
+ } | {
68
+ /** Find a hard-feasible solution without optimizing objectives or soft constraints. */
69
+ readonly type: "feasibility-only";
70
+ };
22
71
  /**
23
72
  * Result of {@link Schedule.solve}.
24
73
  *
74
+ * @remarks
75
+ * Feasibility-only solves return hard-feasible assignments when one is found,
76
+ * but they do not optimize objectives or compute objective-derived metadata.
77
+ * Cost is therefore only produced for optimized solves.
78
+ *
25
79
  * @category Schedule Definition
26
80
  */
27
81
  export interface SolveResult {
@@ -29,9 +83,9 @@ export interface SolveResult {
29
83
  status: SolveStatus;
30
84
  /** Shift assignments (empty when infeasible or no solution). */
31
85
  assignments: ShiftAssignment[];
32
- /** Validation diagnostics from compilation. */
86
+ /** Validation results collected during compilation and solving. */
33
87
  validation: ScheduleValidation;
34
- /** Cost breakdown (present when cost rules are used and a solution is found). */
88
+ /** Cost breakdown for optimized solves when cost rules are used and a solution is found. */
35
89
  cost?: CostBreakdown;
36
90
  }
37
91
  /**
@@ -42,9 +96,20 @@ export interface SolveResult {
42
96
  export interface SolveOptions {
43
97
  /** The date range to schedule. */
44
98
  dateRange: {
45
- start: string;
46
- end: string;
99
+ start: DateString;
100
+ end: DateString;
47
101
  };
102
+ /** Solver time limit in seconds. */
103
+ timeLimitSeconds?: number;
104
+ /**
105
+ * Strategy used by the solver.
106
+ *
107
+ * `{ type: "optimize" }` optimizes objectives and soft constraints.
108
+ * `{ type: "feasibility-only" }` finds any hard-feasible solution, ignoring
109
+ * objectives, soft-constraint penalties, and objective-derived metadata such
110
+ * as cost.
111
+ */
112
+ strategy?: SolveStrategy;
48
113
  /**
49
114
  * Fixed assignments from a prior solve (e.g., rolling schedule).
50
115
  * These are injected as fixed variables in the solver.
@@ -65,9 +130,13 @@ export interface SolveOptions {
65
130
  * `roleIds`, `times`, `coverage`, and `shiftPatterns` are required.
66
131
  * These four fields form the minimum solvable schedule.
67
132
  *
133
+ * The `TRuleRegistry` generic represents the full active rule registry for the
134
+ * schedule. In `schedule()`, that registry always includes the built-in rules,
135
+ * and `ruleRegistry` adds any custom extensions on top.
136
+ *
68
137
  * @category Schedule Definition
69
138
  */
70
- export interface ScheduleConfig<R extends readonly string[] = readonly string[], S extends readonly string[] = readonly [], T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>> {
139
+ export interface ScheduleConfig<R extends readonly string[] = readonly string[], S extends readonly string[] = readonly [], T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, TRuleRegistry extends BuiltInRuleRegistry = BuiltInRuleRegistry> {
71
140
  /** Declared role IDs. */
72
141
  roleIds: R;
73
142
  /** Declared skill IDs. When omitted, coverage targets can only be roles. */
@@ -79,13 +148,45 @@ export interface ScheduleConfig<R extends readonly string[] = readonly string[],
79
148
  /** Available shift patterns. */
80
149
  shiftPatterns: ShiftPattern[];
81
150
  /** Scheduling rules and constraints. */
82
- rules?: RuleEntry[];
151
+ rules?: ScheduleRuleEntry<TRuleRegistry>[];
83
152
  /**
84
- * Custom rule factories. Keys are rule names, values are functions
85
- * that take a config object and return a {@link CompilationRule}.
153
+ * Additional rule descriptors keyed by rule name.
154
+ *
155
+ * @remarks
156
+ * These entries are merged with the built-in rule registry at compile time.
86
157
  * Built-in rule names cannot be overridden.
87
158
  */
88
- ruleFactories?: Record<string, CreateCpsatRuleFunction>;
159
+ ruleRegistry?: CustomRuleRegistry<TRuleRegistry>;
160
+ /** Team members (typically added via `.with()` at runtime). */
161
+ members?: SchedulingMember[];
162
+ /** Days of the week the business operates (inclusion filter). */
163
+ dayOfWeek?: readonly [DayOfWeek, ...DayOfWeek[]];
164
+ /** Which day starts the week for weekly rules. Defaults to `"monday"`. */
165
+ weekStartsOn?: DayOfWeek;
166
+ }
167
+ /**
168
+ * Configuration for {@link scheduleWithRuleRegistry}.
169
+ *
170
+ * @remarks
171
+ * Unlike {@link ScheduleConfig}, this config does not implicitly include the
172
+ * built-in rule registry. The provided registry is the complete active rule
173
+ * registry for the schedule.
174
+ *
175
+ * @category Schedule Definition
176
+ */
177
+ export interface ScheduleWithRuleRegistryConfig<R extends readonly string[] = readonly string[], S extends readonly string[] = readonly [], T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, TRuleRegistry extends CpsatRuleRegistry = CpsatRuleRegistry> {
178
+ /** Declared role IDs. */
179
+ roleIds: R;
180
+ /** Declared skill IDs. When omitted, coverage targets can only be roles. */
181
+ skillIds?: S;
182
+ /** Named semantic time periods. */
183
+ times: T;
184
+ /** Staffing requirements per time period (entries stack additively). */
185
+ coverage: NoInfer<CoverageEntry<keyof T & string, R[number] | S[number]>>[];
186
+ /** Available shift patterns. */
187
+ shiftPatterns: ShiftPattern[];
188
+ /** Scheduling rules and constraints. */
189
+ rules?: ScheduleRuleEntry<TRuleRegistry>[];
89
190
  /** Team members (typically added via `.with()` at runtime). */
90
191
  members?: SchedulingMember[];
91
192
  /** Days of the week the business operates (inclusion filter). */
@@ -100,8 +201,8 @@ interface MergedScheduleConfig {
100
201
  times: Record<string, SemanticTimeEntry>;
101
202
  coverage: CoverageEntry[];
102
203
  shiftPatterns: ShiftPattern[];
103
- rules: RuleEntry[];
104
- ruleFactories: Record<string, CreateCpsatRuleFunction>;
204
+ rules: ScheduleRuleEntry<CpsatRuleRegistry>[];
205
+ ruleRegistry: CpsatRuleRegistry;
105
206
  members: SchedulingMember[];
106
207
  dayOfWeek?: readonly [DayOfWeek, ...DayOfWeek[]];
107
208
  weekStartsOn?: DayOfWeek;
@@ -114,7 +215,7 @@ interface MergedScheduleConfig {
114
215
  *
115
216
  * @category Schedule Definition
116
217
  */
117
- export declare class Schedule {
218
+ export declare class Schedule<TRuleRegistry extends CpsatRuleRegistry = BuiltInRuleRegistry> {
118
219
  #private;
119
220
  /** @internal */
120
221
  constructor(config: MergedScheduleConfig);
@@ -148,7 +249,7 @@ export declare class Schedule {
148
249
  * Validation runs eagerly: role/skill disjointness, coverage targets
149
250
  * referencing declared roles/skills, member role references, etc.
150
251
  */
151
- with(...args: WithArg[]): Schedule;
252
+ with<const Args extends readonly WithArg[]>(...args: Args): Schedule<TRuleRegistry & MergedRegistryFromArgs<Args>>;
152
253
  /**
153
254
  * Compiles, validates, solves, and parses in one call.
154
255
  *
@@ -171,6 +272,10 @@ export declare class Schedule {
171
272
  * Returns an immutable {@link Schedule} that can be composed via `.with()`
172
273
  * and solved via `.solve()`.
173
274
  *
275
+ * @remarks
276
+ * `schedule()` always uses the built-in rule registry as its default. Passing
277
+ * `ruleRegistry` extends that default with custom rules.
278
+ *
174
279
  * @example
175
280
  * ```typescript
176
281
  * const venue = schedule({
@@ -203,7 +308,20 @@ export declare class Schedule {
203
308
  *
204
309
  * @category Schedule Definition
205
310
  */
206
- export declare function schedule<const R extends readonly string[], const S extends readonly string[] = readonly [], const T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>>(config: ScheduleConfig<R, S, T>): Schedule;
311
+ export declare function schedule<const R extends readonly string[], const S extends readonly string[] = readonly [], const T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<BuiltInRuleRegistry>[]>(config: BuiltInScheduleConfigInput<R, S, T, TRules>): Schedule<BuiltInRuleRegistry>;
312
+ export declare function schedule<const R extends readonly string[], const S extends readonly string[] = readonly [], const T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, TCustomRuleRegistry extends CpsatRuleRegistry = CpsatRuleRegistry, const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<BuiltInRuleRegistry & TCustomRuleRegistry>[]>(config: CustomScheduleConfigInput<R, S, T, TCustomRuleRegistry, TRules>): Schedule<BuiltInRuleRegistry & TCustomRuleRegistry>;
313
+ /**
314
+ * Create a schedule definition with an explicit complete rule registry.
315
+ *
316
+ * @remarks
317
+ * Use this when you want full control over the active rule registry, including
318
+ * schedules that do not include the built-in rules.
319
+ *
320
+ * @category Schedule Definition
321
+ */
322
+ export declare function scheduleWithRuleRegistry<const R extends readonly string[], const S extends readonly string[] = readonly [], const T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>, TRuleRegistry extends CpsatRuleRegistry = CpsatRuleRegistry, const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<TRuleRegistry>[]>(ruleRegistry: TRuleRegistry, config: Omit<ScheduleWithRuleRegistryConfig<R, S, T, TRuleRegistry>, "rules"> & {
323
+ rules?: ValidateScheduleRules<TRuleRegistry, TRules>;
324
+ }): Schedule<TRuleRegistry>;
207
325
  /**
208
326
  * Create a partial schedule for composition via `.with()`.
209
327
  *
@@ -222,6 +340,7 @@ export declare function schedule<const R extends readonly string[], const S exte
222
340
  *
223
341
  * @category Schedule Definition
224
342
  */
225
- export declare function partialSchedule(config: Partial<ScheduleConfig<readonly string[], readonly string[]>>): Schedule;
343
+ export declare function partialSchedule<const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<BuiltInRuleRegistry>[]>(config: BuiltInPartialScheduleConfigInput<TRules>): Schedule<BuiltInRuleRegistry>;
344
+ export declare function partialSchedule<TCustomRuleRegistry extends CpsatRuleRegistry = CpsatRuleRegistry, const TRules extends readonly unknown[] = readonly ScheduleRuleEntry<BuiltInRuleRegistry & TCustomRuleRegistry>[]>(config: CustomPartialScheduleConfigInput<TCustomRuleRegistry, TRules>): Schedule<BuiltInRuleRegistry & TCustomRuleRegistry>;
226
345
  export {};
227
346
  //# sourceMappingURL=definition.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/schedule/definition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/schedule/definition.ts"],"names":[],"mappings":"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"}
@@ -6,7 +6,7 @@
6
6
  import { defineSemanticTimes } from "../cpsat/semantic-time.js";
7
7
  import { resolveDaysFromPeriod } from "../datetime.utils.js";
8
8
  import { ModelBuilder } from "../cpsat/model-builder.js";
9
- import { builtInCpsatRuleFactories } from "../cpsat/rules/registry.js";
9
+ import { assertNoBuiltInCpsatRuleOverrides, assertValidCpsatRuleRegistry, builtInCpsatRuleRegistry, } from "../cpsat/rules/registry.js";
10
10
  import { parseSolverResponse, resolveAssignments } from "../cpsat/response.js";
11
11
  import { calculateScheduleCost } from "../cpsat/cost.js";
12
12
  import { resolveAppliesTo } from "./rules.js";
@@ -37,7 +37,7 @@ export class Schedule {
37
37
  coverage: [...this.#config.coverage],
38
38
  shiftPatterns: [...this.#config.shiftPatterns],
39
39
  rules: [...this.#config.rules],
40
- ruleFactories: { ...this.#config.ruleFactories },
40
+ ruleRegistry: { ...this.#config.ruleRegistry },
41
41
  members: [...this.#config.members],
42
42
  };
43
43
  }
@@ -99,6 +99,7 @@ export class Schedule {
99
99
  * @param options - Date range and optional pinned assignments
100
100
  */
101
101
  async solve(client, options) {
102
+ const strategy = resolveSolveStrategy(options.strategy);
102
103
  const compiled = this.compile(options);
103
104
  if (!compiled.canSolve) {
104
105
  return {
@@ -108,7 +109,7 @@ export class Schedule {
108
109
  };
109
110
  }
110
111
  const response = await client.solve(compiled.request);
111
- return buildSolveResult(response, compiled, this.#config);
112
+ return buildSolveResult(response, compiled, this.#config, strategy);
112
113
  }
113
114
  /**
114
115
  * Diagnostic escape hatch. Compiles the schedule without solving.
@@ -119,83 +120,51 @@ export class Schedule {
119
120
  if (options.pinned && options.pinned.length > 0) {
120
121
  throw new Error("Pinned assignments are not yet supported.");
121
122
  }
122
- const modelConfig = resolveToModelConfig(this.#config, options);
123
+ const strategy = resolveSolveStrategy(options.strategy);
124
+ const modelConfig = resolveToModelConfig(this.#config, options, strategy);
123
125
  const builder = new ModelBuilder(modelConfig);
124
126
  const result = builder.compile();
125
127
  return { ...result, builder };
126
128
  }
127
129
  }
128
- // ============================================================================
129
- // schedule() factory
130
- // ============================================================================
131
- /**
132
- * Create a schedule definition.
133
- *
134
- * Returns an immutable {@link Schedule} that can be composed via `.with()`
135
- * and solved via `.solve()`.
136
- *
137
- * @example
138
- * ```typescript
139
- * const venue = schedule({
140
- * roleIds: ["waiter", "runner", "manager"],
141
- * skillIds: ["senior"],
142
- * times: {
143
- * lunch: time({ startTime: t(12), endTime: t(15) }),
144
- * dinner: time(
145
- * { startTime: t(17), endTime: t(21) },
146
- * { startTime: t(18), endTime: t(22), dayOfWeek: weekend },
147
- * ),
148
- * },
149
- * coverage: [
150
- * cover("lunch", "waiter", 2),
151
- * cover("dinner", "waiter", 4, { dayOfWeek: weekdays }),
152
- * cover("dinner", "waiter", 5, { dayOfWeek: weekend }),
153
- * cover("dinner", "manager", 1),
154
- * ],
155
- * shiftPatterns: [
156
- * shift("lunch_shift", t(11, 30), t(15)),
157
- * shift("evening", t(17), t(22)),
158
- * ],
159
- * rules: [
160
- * maxHoursPerDay(10),
161
- * maxHoursPerWeek(48),
162
- * minRestBetweenShifts(11),
163
- * ],
164
- * });
165
- * ```
166
- *
167
- * @category Schedule Definition
168
- */
169
130
  export function schedule(config) {
170
- const merged = buildMergedConfig(config);
131
+ const customRuleRegistry = config.ruleRegistry ?? {};
132
+ validateRuleRegistryExtension(customRuleRegistry);
133
+ const merged = buildMergedConfig(config, {
134
+ ...builtInCpsatRuleRegistry,
135
+ ...customRuleRegistry,
136
+ });
171
137
  validateConfig(merged);
172
138
  return new Schedule(merged);
173
139
  }
174
140
  /**
175
- * Create a partial schedule for composition via `.with()`.
176
- *
177
- * Unlike {@link schedule}, all fields are optional. Use this for
178
- * schedules that layer rules, coverage, or other config onto a
179
- * complete base schedule.
180
- *
181
- * @example
182
- * ```typescript
183
- * const companyPolicy = partialSchedule({
184
- * rules: [maxHoursPerWeek(40), minRestBetweenShifts(11)],
185
- * });
141
+ * Create a schedule definition with an explicit complete rule registry.
186
142
  *
187
- * const ready = venue.with(companyPolicy, teamMembers);
188
- * ```
143
+ * @remarks
144
+ * Use this when you want full control over the active rule registry, including
145
+ * schedules that do not include the built-in rules.
189
146
  *
190
147
  * @category Schedule Definition
191
148
  */
149
+ export function scheduleWithRuleRegistry(ruleRegistry, config) {
150
+ assertValidCpsatRuleRegistry(ruleRegistry);
151
+ assertNoBuiltInCpsatRuleOverrides(ruleRegistry);
152
+ const merged = buildMergedConfig(config, ruleRegistry);
153
+ validateConfig(merged);
154
+ return new Schedule(merged);
155
+ }
192
156
  export function partialSchedule(config) {
157
+ const customRuleRegistry = config.ruleRegistry ?? {};
158
+ validateRuleRegistryExtension(customRuleRegistry);
193
159
  const merged = buildMergedConfig({
194
160
  roleIds: [],
195
161
  times: {},
196
162
  coverage: [],
197
163
  shiftPatterns: [],
198
164
  ...config,
165
+ }, {
166
+ ...builtInCpsatRuleRegistry,
167
+ ...customRuleRegistry,
199
168
  });
200
169
  validateConfig(merged);
201
170
  return new Schedule(merged);
@@ -203,7 +172,7 @@ export function partialSchedule(config) {
203
172
  // ============================================================================
204
173
  // Internal: Build merged config from user input
205
174
  // ============================================================================
206
- function buildMergedConfig(config) {
175
+ function buildMergedConfig(config, ruleRegistry) {
207
176
  return {
208
177
  roleIds: [...config.roleIds],
209
178
  skillIds: [...(config.skillIds ?? [])],
@@ -211,7 +180,7 @@ function buildMergedConfig(config) {
211
180
  coverage: [...config.coverage],
212
181
  shiftPatterns: [...config.shiftPatterns],
213
182
  rules: [...(config.rules ?? [])],
214
- ruleFactories: config.ruleFactories ? { ...config.ruleFactories } : {},
183
+ ruleRegistry: { ...ruleRegistry },
215
184
  members: [...(config.members ?? [])],
216
185
  dayOfWeek: config.dayOfWeek,
217
186
  weekStartsOn: config.weekStartsOn,
@@ -220,15 +189,14 @@ function buildMergedConfig(config) {
220
189
  // ============================================================================
221
190
  // Internal: Validate merged config
222
191
  // ============================================================================
192
+ function validateRuleRegistryExtension(ruleRegistry) {
193
+ assertValidCpsatRuleRegistry(ruleRegistry);
194
+ assertNoBuiltInCpsatRuleOverrides(ruleRegistry);
195
+ }
223
196
  function validateConfig(config) {
224
197
  const roles = new Set(config.roleIds);
225
198
  const skills = new Set(config.skillIds);
226
- // Validate custom rule factories don't override built-in names
227
- for (const name of Object.keys(config.ruleFactories)) {
228
- if (name in builtInCpsatRuleFactories) {
229
- throw new Error(`Custom rule factory "${name}" conflicts with a built-in rule. Choose a different name.`);
230
- }
231
- }
199
+ assertValidCpsatRuleRegistry(config.ruleRegistry);
232
200
  // Validate role/skill disjointness
233
201
  for (const skill of skills) {
234
202
  if (roles.has(skill)) {
@@ -316,7 +284,7 @@ function mergeConfig(base, args) {
316
284
  coverage: [...base.coverage],
317
285
  shiftPatterns: [...base.shiftPatterns],
318
286
  rules: [...base.rules],
319
- ruleFactories: { ...base.ruleFactories },
287
+ ruleRegistry: { ...base.ruleRegistry },
320
288
  members: [...base.members],
321
289
  dayOfWeek: base.dayOfWeek,
322
290
  weekStartsOn: base.weekStartsOn,
@@ -394,12 +362,12 @@ function mergeScheduleFragment(result, s) {
394
362
  }
395
363
  // Rules: additive
396
364
  result.rules.push(...other.rules);
397
- // Rule factories: merge, error on collision
398
- for (const [name, factory] of Object.entries(other.ruleFactories)) {
399
- if (name in result.ruleFactories && result.ruleFactories[name] !== factory) {
400
- throw new Error(`Rule factory "${name}" already registered. Cannot merge schedules with colliding rule factories.`);
365
+ // Rule registry: merge, error on collision
366
+ for (const [name, descriptor] of Object.entries(other.ruleRegistry)) {
367
+ if (name in result.ruleRegistry && result.ruleRegistry[name] !== descriptor) {
368
+ throw new Error(`Rule registry entry "${name}" already registered. Cannot merge schedules with colliding rule registries.`);
401
369
  }
402
- result.ruleFactories[name] = factory;
370
+ result.ruleRegistry[name] = descriptor;
403
371
  }
404
372
  // Members: additive, error on duplicate ID
405
373
  const existingMemberIds = new Set(result.members.map((m) => m.id));
@@ -424,7 +392,7 @@ function mergeMembers(result, incoming) {
424
392
  // ============================================================================
425
393
  // Internal: Resolve to ModelBuilderConfig
426
394
  // ============================================================================
427
- function resolveToModelConfig(config, options) {
395
+ function resolveToModelConfig(config, options, strategy) {
428
396
  const roles = new Set(config.roleIds);
429
397
  const skills = new Set(config.skillIds);
430
398
  const memberIds = new Set(config.members.map((m) => m.id));
@@ -455,7 +423,7 @@ function resolveToModelConfig(config, options) {
455
423
  "overtime-tiered-multiplier",
456
424
  ]);
457
425
  const hasCostRules = allRules.some((r) => costRuleNames.has(r._rule));
458
- if (hasCostRules) {
426
+ if (strategy.type === "optimize" && hasCostRules) {
459
427
  const missingPay = config.members.filter((m) => !m.pay).map((m) => m.id);
460
428
  if (missingPay.length > 0) {
461
429
  throw new Error(`Cost rules require pay data on all members. Missing pay: ${missingPay.join(", ")}`);
@@ -470,19 +438,38 @@ function resolveToModelConfig(config, options) {
470
438
  schedulingPeriod: resolvedPeriod,
471
439
  coverage: resolvedCoverage,
472
440
  ruleConfigs,
473
- ruleFactories: Object.keys(config.ruleFactories).length > 0
474
- ? { ...builtInCpsatRuleFactories, ...config.ruleFactories }
475
- : undefined,
441
+ ruleRegistry: config.ruleRegistry,
476
442
  weekStartsOn: config.weekStartsOn,
443
+ solverOptions: buildSolverOptions(options),
444
+ strategy,
477
445
  };
478
446
  }
479
447
  // ============================================================================
480
448
  // Internal: Build SolveResult from solver response
481
449
  // ============================================================================
482
- function mapSolverStatus(solverStatus) {
450
+ function resolveSolveStrategy(strategy) {
451
+ if (strategy === undefined) {
452
+ return { type: "optimize" };
453
+ }
454
+ if (typeof strategy !== "object" || strategy === null || !("type" in strategy)) {
455
+ throw new Error("Solve strategy must be an object with a type field.");
456
+ }
457
+ const strategyType = strategy.type;
458
+ if (strategyType === "optimize" || strategyType === "feasibility-only") {
459
+ return { type: strategyType };
460
+ }
461
+ throw new Error(`Unknown solve strategy "${String(strategyType)}".`);
462
+ }
463
+ function buildSolverOptions(options) {
464
+ if (options.timeLimitSeconds === undefined) {
465
+ return undefined;
466
+ }
467
+ return { timeLimitSeconds: options.timeLimitSeconds };
468
+ }
469
+ function mapSolverStatus(solverStatus, strategy) {
483
470
  switch (solverStatus) {
484
471
  case "OPTIMAL":
485
- return "optimal";
472
+ return strategy.type === "feasibility-only" ? "feasible" : "optimal";
486
473
  case "FEASIBLE":
487
474
  return "feasible";
488
475
  case "INFEASIBLE":
@@ -494,13 +481,23 @@ function mapSolverStatus(solverStatus) {
494
481
  return "no_solution";
495
482
  }
496
483
  }
497
- function buildSolveResult(response, compiled, config) {
498
- const status = mapSolverStatus(response.status);
499
- const parsed = parseSolverResponse(response);
484
+ function buildSolveResult(response, compiled, config, strategy) {
485
+ const status = mapSolverStatus(response.status, strategy);
486
+ const hasFinalSolution = status === "optimal" || status === "feasible";
487
+ const parsed = hasFinalSolution
488
+ ? parseSolverResponse(response)
489
+ : {
490
+ status: response.status,
491
+ assignments: [],
492
+ statistics: response.statistics,
493
+ error: response.error,
494
+ };
495
+ compiled.builder.reporter.analyzeSolution(response, {
496
+ analyzeSoftConstraints: strategy.type === "optimize",
497
+ });
500
498
  // Run post-solve validation when a solution exists
501
- if (parsed.assignments.length > 0 && (status === "optimal" || status === "feasible")) {
499
+ if (parsed.assignments.length > 0 && hasFinalSolution && strategy.type === "optimize") {
502
500
  const resolved = resolveAssignments(parsed.assignments, compiled.builder.shiftPatterns);
503
- compiled.builder.reporter.analyzeSolution(response);
504
501
  compiled.builder.validateSolution(resolved);
505
502
  }
506
503
  const validation = compiled.builder.reporter.getValidation();
@@ -509,14 +506,16 @@ function buildSolveResult(response, compiled, config) {
509
506
  assignments: parsed.assignments,
510
507
  validation,
511
508
  };
512
- // Compute cost breakdown when cost rules are present and a solution was found
513
- if (parsed.assignments.length > 0 && (status === "optimal" || status === "feasible")) {
514
- const hasCostRules = config.rules.some((r) => r._rule === "minimize-cost");
515
- if (hasCostRules) {
509
+ // Compute cost breakdown when cost artifacts are present and a solution was found
510
+ if (parsed.assignments.length > 0 && hasFinalSolution && strategy.type === "optimize") {
511
+ const hasCostArtifacts = compiled.builder.rules.some((rule) => rule.artifacts.some((artifact) => artifact.kind === "cost"));
512
+ if (hasCostArtifacts) {
516
513
  result.cost = calculateScheduleCost(parsed.assignments, {
517
514
  members: config.members,
518
515
  shiftPatterns: config.shiftPatterns,
519
516
  rules: compiled.builder.rules,
517
+ days: compiled.builder.days,
518
+ weekStartsOn: compiled.builder.weekStartsOn,
520
519
  });
521
520
  }
522
521
  }
@@ -581,8 +580,18 @@ function buildSimpleCoverageTarget(entry, base, roles, skills) {
581
580
  /**
582
581
  * Build a VariantCoverageRequirement from a variant-form CoverageEntry.
583
582
  */
583
+ function requireCoverageVariants(entry) {
584
+ if (!entry.variants || entry.variants.length === 0) {
585
+ throw new Error(`Coverage entry for "${entry.timeName}" must define at least one variant.`);
586
+ }
587
+ const first = entry.variants[0];
588
+ if (!first) {
589
+ throw new Error(`Coverage entry for "${entry.timeName}" must define at least one variant.`);
590
+ }
591
+ return [first, ...entry.variants.slice(1)];
592
+ }
584
593
  function buildVariantCoverageRequirement(entry, roles, skills) {
585
- const variants = entry.variants;
594
+ const variants = requireCoverageVariants(entry);
586
595
  const resolveTarget = () => {
587
596
  if (Array.isArray(entry.target)) {
588
597
  return { roleIds: entry.target };