dabke 0.82.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 (341) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +22 -24
  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 -21
  66. package/dist/cpsat/rules/index.d.ts.map +1 -1
  67. package/dist/cpsat/rules/index.js +30 -21
  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 +30 -0
  86. package/dist/cpsat/rules/max-days-week.d.ts.map +1 -0
  87. package/dist/cpsat/rules/max-days-week.js +83 -0
  88. package/dist/cpsat/rules/max-days-week.js.map +1 -0
  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 +21 -0
  110. package/dist/cpsat/rules/min-days-week.d.ts.map +1 -0
  111. package/dist/cpsat/rules/min-days-week.js +95 -0
  112. package/dist/cpsat/rules/min-days-week.js.map +1 -0
  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 +12 -0
  130. package/dist/cpsat/rules/must-assign.d.ts.map +1 -0
  131. package/dist/cpsat/rules/must-assign.js +54 -0
  132. package/dist/cpsat/rules/must-assign.js.map +1 -0
  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 -27
  162. package/dist/cpsat/rules/registry.d.ts.map +1 -1
  163. package/dist/cpsat/rules/registry.js +98 -31
  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 +93 -17
  174. package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
  175. package/dist/cpsat/rules/scope.types.d.ts +25 -12
  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 +15 -9
  226. package/dist/index.d.ts.map +1 -1
  227. package/dist/index.js +11 -4
  228. package/dist/index.js.map +1 -1
  229. package/dist/schedule/cost.d.ts +192 -0
  230. package/dist/schedule/cost.d.ts.map +1 -0
  231. package/dist/schedule/cost.js +151 -0
  232. package/dist/schedule/cost.js.map +1 -0
  233. package/dist/schedule/coverage.d.ts +114 -0
  234. package/dist/schedule/coverage.d.ts.map +1 -0
  235. package/dist/schedule/coverage.js +56 -0
  236. package/dist/schedule/coverage.js.map +1 -0
  237. package/dist/schedule/definition.d.ts +346 -0
  238. package/dist/schedule/definition.d.ts.map +1 -0
  239. package/dist/schedule/definition.js +668 -0
  240. package/dist/schedule/definition.js.map +1 -0
  241. package/dist/schedule/index.d.ts +67 -0
  242. package/dist/schedule/index.d.ts.map +1 -0
  243. package/dist/schedule/index.js +69 -0
  244. package/dist/schedule/index.js.map +1 -0
  245. package/dist/schedule/rules.d.ts +678 -0
  246. package/dist/schedule/rules.d.ts.map +1 -0
  247. package/dist/schedule/rules.js +554 -0
  248. package/dist/schedule/rules.js.map +1 -0
  249. package/dist/schedule/shift-patterns.d.ts +17 -0
  250. package/dist/schedule/shift-patterns.d.ts.map +1 -0
  251. package/dist/schedule/shift-patterns.js +24 -0
  252. package/dist/schedule/shift-patterns.js.map +1 -0
  253. package/dist/schedule/time-periods.d.ts +79 -0
  254. package/dist/schedule/time-periods.d.ts.map +1 -0
  255. package/dist/schedule/time-periods.js +101 -0
  256. package/dist/schedule/time-periods.js.map +1 -0
  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 -14
  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 -21
  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 +117 -0
  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 +122 -0
  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 +71 -0
  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 -56
  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 +92 -17
  309. package/src/cpsat/rules/scope.types.ts +32 -27
  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 +72 -15
  323. package/src/schedule/cost.ts +221 -0
  324. package/src/schedule/coverage.ts +164 -0
  325. package/src/schedule/definition.ts +1447 -0
  326. package/src/schedule/index.ts +132 -0
  327. package/src/schedule/rules.ts +1028 -0
  328. package/src/schedule/shift-patterns.ts +29 -0
  329. package/src/schedule/time-periods.ts +120 -0
  330. package/src/types.ts +114 -2
  331. package/dist/llms.d.ts +0 -2
  332. package/dist/llms.d.ts.map +0 -1
  333. package/dist/llms.js +0 -3
  334. package/dist/llms.js.map +0 -1
  335. package/dist/schedule.d.ts +0 -917
  336. package/dist/schedule.d.ts.map +0 -1
  337. package/dist/schedule.js +0 -1323
  338. package/dist/schedule.js.map +0 -1
  339. package/llms.txt +0 -758
  340. package/src/llms.ts +0 -3
  341. package/src/schedule.ts +0 -1960
@@ -0,0 +1,192 @@
1
+ /**
2
+ * Cost optimization rules: minimize labor cost with modifiers.
3
+ *
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * rules: [
8
+ * minimizeCost(),
9
+ * dayMultiplier(1.5, { dayOfWeek: weekend }),
10
+ * overtimeMultiplier({ after: 40, factor: 1.5 }),
11
+ * dailyOvertimeSurcharge({ after: 8, amount: 500 }),
12
+ * tieredOvertimeMultiplier([
13
+ * { after: 40, factor: 1.5 },
14
+ * { after: 48, factor: 2.0 },
15
+ * ]),
16
+ * ]
17
+ * ```
18
+ *
19
+ * @module
20
+ */
21
+ import type { DayOfWeek, TimeOfDay } from "../types.js";
22
+ import type { OvertimeTier } from "../cpsat/rules/overtime-tiered-multiplier.js";
23
+ import type { RecurringPeriod } from "../cpsat/rules/scope.types.js";
24
+ import type { RuleEntry } from "./rules.js";
25
+ /**
26
+ * Options for cost rules.
27
+ *
28
+ * Cost rules are objective terms, not constraints. The `priority` field from
29
+ * {@link RuleOptions} does not apply.
30
+ *
31
+ * @category Cost Optimization
32
+ */
33
+ export interface CostRuleOptions {
34
+ /** Who this rule applies to (role name, skill name, or member ID). */
35
+ appliesTo?: string | string[];
36
+ /** Restrict to specific days of the week. */
37
+ dayOfWeek?: readonly [DayOfWeek, ...DayOfWeek[]];
38
+ /** Restrict to a date range. */
39
+ dateRange?: {
40
+ start: string;
41
+ end: string;
42
+ };
43
+ /** Restrict to specific dates (YYYY-MM-DD). */
44
+ dates?: string[];
45
+ /** Restrict to recurring calendar periods. */
46
+ recurringPeriods?: [RecurringPeriod, ...RecurringPeriod[]];
47
+ }
48
+ /**
49
+ * Tells the solver to minimize total labor cost.
50
+ *
51
+ * @remarks
52
+ * Without this rule, cost modifiers only affect post-solve calculation.
53
+ * When present, the solver actively prefers cheaper assignments.
54
+ *
55
+ * For hourly members, penalizes each assignment proportionally to cost.
56
+ * For salaried members, adds a fixed weekly salary cost when they have
57
+ * any assignment that week (zero marginal cost up to contracted hours).
58
+ *
59
+ * Cost modifiers adjust the calculation:
60
+ * - `dayMultiplier(factor, opts?)` - multiply base rate on specific days
61
+ * - `daySurcharge(amount, opts?)` - flat extra per hour on specific days
62
+ * - `timeSurcharge(amount, window, opts?)` - flat extra per hour during a time window
63
+ * - `overtimeMultiplier({ after, factor }, opts?)` - weekly overtime multiplier
64
+ * - `overtimeSurcharge({ after, amount }, opts?)` - weekly overtime surcharge
65
+ * - `dailyOvertimeMultiplier({ after, factor }, opts?)` - daily overtime multiplier
66
+ * - `dailyOvertimeSurcharge({ after, amount }, opts?)` - daily overtime surcharge
67
+ * - `tieredOvertimeMultiplier(tiers, opts?)` - multiple overtime thresholds
68
+ *
69
+ * @category Cost Optimization
70
+ */
71
+ export declare function minimizeCost(opts?: CostRuleOptions): RuleEntry<"minimize-cost", CostRuleOptions>;
72
+ /**
73
+ * Multiplies the base rate for assignments on specified days.
74
+ *
75
+ * @remarks
76
+ * The base cost (1x) is already counted by {@link minimizeCost};
77
+ * this rule adds only the extra portion above 1x.
78
+ *
79
+ * @category Cost Optimization
80
+ */
81
+ export declare function dayMultiplier(factor: number, opts?: CostRuleOptions): RuleEntry<"day-cost-multiplier", {
82
+ factor: number;
83
+ } & CostRuleOptions>;
84
+ /**
85
+ * Adds a flat extra amount per hour for assignments on specified days.
86
+ *
87
+ * @remarks
88
+ * The surcharge is independent of the member's base rate.
89
+ *
90
+ * @category Cost Optimization
91
+ */
92
+ export declare function daySurcharge(amountPerHour: number, opts?: CostRuleOptions): RuleEntry<"day-cost-surcharge", {
93
+ amountPerHour: number;
94
+ } & CostRuleOptions>;
95
+ /**
96
+ * Adds a flat surcharge per hour for the portion of a shift that overlaps a time-of-day window.
97
+ *
98
+ * @remarks
99
+ * The window supports overnight spans (e.g., 22:00-06:00). The surcharge
100
+ * is independent of the member's base rate.
101
+ *
102
+ * @param amountPerHour - Flat surcharge per hour in smallest currency unit
103
+ * @param window - Time-of-day window
104
+ * @param opts - Entity and time scoping
105
+ *
106
+ * @category Cost Optimization
107
+ */
108
+ export declare function timeSurcharge(amountPerHour: number, window: {
109
+ from: TimeOfDay;
110
+ until: TimeOfDay;
111
+ }, opts?: CostRuleOptions): RuleEntry<"time-cost-surcharge", {
112
+ amountPerHour: number;
113
+ window: {
114
+ from: TimeOfDay;
115
+ until: TimeOfDay;
116
+ };
117
+ } & CostRuleOptions>;
118
+ /**
119
+ * Applies a multiplier to hours beyond a weekly threshold.
120
+ *
121
+ * @remarks
122
+ * Only the extra portion above 1x is added (the base cost is already
123
+ * counted by {@link minimizeCost}).
124
+ *
125
+ * @category Cost Optimization
126
+ */
127
+ export declare function overtimeMultiplier(opts: {
128
+ after: number;
129
+ factor: number;
130
+ } & CostRuleOptions): RuleEntry<"overtime-weekly-multiplier", {
131
+ after: number;
132
+ factor: number;
133
+ } & CostRuleOptions>;
134
+ /**
135
+ * Adds a flat surcharge per hour beyond a weekly threshold.
136
+ *
137
+ * @remarks
138
+ * The surcharge is independent of the member's base rate.
139
+ *
140
+ * @category Cost Optimization
141
+ */
142
+ export declare function overtimeSurcharge(opts: {
143
+ after: number;
144
+ amount: number;
145
+ } & CostRuleOptions): RuleEntry<"overtime-weekly-surcharge", {
146
+ after: number;
147
+ amount: number;
148
+ } & CostRuleOptions>;
149
+ /**
150
+ * Applies a multiplier to hours beyond a daily threshold.
151
+ *
152
+ * @remarks
153
+ * Only the extra portion above 1x is added (the base cost is already
154
+ * counted by {@link minimizeCost}).
155
+ *
156
+ * @category Cost Optimization
157
+ */
158
+ export declare function dailyOvertimeMultiplier(opts: {
159
+ after: number;
160
+ factor: number;
161
+ } & CostRuleOptions): RuleEntry<"overtime-daily-multiplier", {
162
+ after: number;
163
+ factor: number;
164
+ } & CostRuleOptions>;
165
+ /**
166
+ * Adds a flat surcharge per hour beyond a daily threshold.
167
+ *
168
+ * @remarks
169
+ * The surcharge is independent of the member's base rate.
170
+ *
171
+ * @category Cost Optimization
172
+ */
173
+ export declare function dailyOvertimeSurcharge(opts: {
174
+ after: number;
175
+ amount: number;
176
+ } & CostRuleOptions): RuleEntry<"overtime-daily-surcharge", {
177
+ after: number;
178
+ amount: number;
179
+ } & CostRuleOptions>;
180
+ /**
181
+ * Applies multiple overtime thresholds with increasing multipliers.
182
+ *
183
+ * @remarks
184
+ * Each tier applies only to the hours between its threshold and the next.
185
+ * Tiers must be sorted by threshold ascending.
186
+ *
187
+ * @category Cost Optimization
188
+ */
189
+ export declare function tieredOvertimeMultiplier(tiers: [OvertimeTier, ...OvertimeTier[]], opts?: CostRuleOptions): RuleEntry<"overtime-tiered-multiplier", {
190
+ tiers: [OvertimeTier, ...OvertimeTier[]];
191
+ } & CostRuleOptions>;
192
+ //# sourceMappingURL=cost.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.d.ts","sourceRoot":"","sources":["../../src/schedule/cost.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,151 @@
1
+ /**
2
+ * Cost optimization rules: minimize labor cost with modifiers.
3
+ *
4
+ *
5
+ * @example
6
+ * ```typescript
7
+ * rules: [
8
+ * minimizeCost(),
9
+ * dayMultiplier(1.5, { dayOfWeek: weekend }),
10
+ * overtimeMultiplier({ after: 40, factor: 1.5 }),
11
+ * dailyOvertimeSurcharge({ after: 8, amount: 500 }),
12
+ * tieredOvertimeMultiplier([
13
+ * { after: 40, factor: 1.5 },
14
+ * { after: 48, factor: 2.0 },
15
+ * ]),
16
+ * ]
17
+ * ```
18
+ *
19
+ * @module
20
+ */
21
+ import { defineRule } from "./rules.js";
22
+ // ============================================================================
23
+ // Cost Rules
24
+ // ============================================================================
25
+ function makeCostRule(rule, fields) {
26
+ return defineRule(rule, fields);
27
+ }
28
+ /**
29
+ * Tells the solver to minimize total labor cost.
30
+ *
31
+ * @remarks
32
+ * Without this rule, cost modifiers only affect post-solve calculation.
33
+ * When present, the solver actively prefers cheaper assignments.
34
+ *
35
+ * For hourly members, penalizes each assignment proportionally to cost.
36
+ * For salaried members, adds a fixed weekly salary cost when they have
37
+ * any assignment that week (zero marginal cost up to contracted hours).
38
+ *
39
+ * Cost modifiers adjust the calculation:
40
+ * - `dayMultiplier(factor, opts?)` - multiply base rate on specific days
41
+ * - `daySurcharge(amount, opts?)` - flat extra per hour on specific days
42
+ * - `timeSurcharge(amount, window, opts?)` - flat extra per hour during a time window
43
+ * - `overtimeMultiplier({ after, factor }, opts?)` - weekly overtime multiplier
44
+ * - `overtimeSurcharge({ after, amount }, opts?)` - weekly overtime surcharge
45
+ * - `dailyOvertimeMultiplier({ after, factor }, opts?)` - daily overtime multiplier
46
+ * - `dailyOvertimeSurcharge({ after, amount }, opts?)` - daily overtime surcharge
47
+ * - `tieredOvertimeMultiplier(tiers, opts?)` - multiple overtime thresholds
48
+ *
49
+ * @category Cost Optimization
50
+ */
51
+ export function minimizeCost(opts) {
52
+ return makeCostRule("minimize-cost", { ...opts });
53
+ }
54
+ /**
55
+ * Multiplies the base rate for assignments on specified days.
56
+ *
57
+ * @remarks
58
+ * The base cost (1x) is already counted by {@link minimizeCost};
59
+ * this rule adds only the extra portion above 1x.
60
+ *
61
+ * @category Cost Optimization
62
+ */
63
+ export function dayMultiplier(factor, opts) {
64
+ return makeCostRule("day-cost-multiplier", { factor, ...opts });
65
+ }
66
+ /**
67
+ * Adds a flat extra amount per hour for assignments on specified days.
68
+ *
69
+ * @remarks
70
+ * The surcharge is independent of the member's base rate.
71
+ *
72
+ * @category Cost Optimization
73
+ */
74
+ export function daySurcharge(amountPerHour, opts) {
75
+ return makeCostRule("day-cost-surcharge", { amountPerHour, ...opts });
76
+ }
77
+ /**
78
+ * Adds a flat surcharge per hour for the portion of a shift that overlaps a time-of-day window.
79
+ *
80
+ * @remarks
81
+ * The window supports overnight spans (e.g., 22:00-06:00). The surcharge
82
+ * is independent of the member's base rate.
83
+ *
84
+ * @param amountPerHour - Flat surcharge per hour in smallest currency unit
85
+ * @param window - Time-of-day window
86
+ * @param opts - Entity and time scoping
87
+ *
88
+ * @category Cost Optimization
89
+ */
90
+ export function timeSurcharge(amountPerHour, window, opts) {
91
+ return makeCostRule("time-cost-surcharge", { amountPerHour, window, ...opts });
92
+ }
93
+ /**
94
+ * Applies a multiplier to hours beyond a weekly threshold.
95
+ *
96
+ * @remarks
97
+ * Only the extra portion above 1x is added (the base cost is already
98
+ * counted by {@link minimizeCost}).
99
+ *
100
+ * @category Cost Optimization
101
+ */
102
+ export function overtimeMultiplier(opts) {
103
+ return makeCostRule("overtime-weekly-multiplier", { ...opts });
104
+ }
105
+ /**
106
+ * Adds a flat surcharge per hour beyond a weekly threshold.
107
+ *
108
+ * @remarks
109
+ * The surcharge is independent of the member's base rate.
110
+ *
111
+ * @category Cost Optimization
112
+ */
113
+ export function overtimeSurcharge(opts) {
114
+ return makeCostRule("overtime-weekly-surcharge", { ...opts });
115
+ }
116
+ /**
117
+ * Applies a multiplier to hours beyond a daily threshold.
118
+ *
119
+ * @remarks
120
+ * Only the extra portion above 1x is added (the base cost is already
121
+ * counted by {@link minimizeCost}).
122
+ *
123
+ * @category Cost Optimization
124
+ */
125
+ export function dailyOvertimeMultiplier(opts) {
126
+ return makeCostRule("overtime-daily-multiplier", { ...opts });
127
+ }
128
+ /**
129
+ * Adds a flat surcharge per hour beyond a daily threshold.
130
+ *
131
+ * @remarks
132
+ * The surcharge is independent of the member's base rate.
133
+ *
134
+ * @category Cost Optimization
135
+ */
136
+ export function dailyOvertimeSurcharge(opts) {
137
+ return makeCostRule("overtime-daily-surcharge", { ...opts });
138
+ }
139
+ /**
140
+ * Applies multiple overtime thresholds with increasing multipliers.
141
+ *
142
+ * @remarks
143
+ * Each tier applies only to the hours between its threshold and the next.
144
+ * Tiers must be sorted by threshold ascending.
145
+ *
146
+ * @category Cost Optimization
147
+ */
148
+ export function tieredOvertimeMultiplier(tiers, opts) {
149
+ return makeCostRule("overtime-tiered-multiplier", { tiers, ...opts });
150
+ }
151
+ //# sourceMappingURL=cost.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cost.js","sourceRoot":"","sources":["../../src/schedule/cost.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AAMH,OAAO,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AA2BxC,+EAA+E;AAC/E,aAAa;AACb,+EAA+E;AAE/E,SAAS,YAAY,CACnB,IAAU,EACV,MAAc;IAEd,OAAO,UAAU,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;AAClC,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,YAAY,CAAC,IAAsB;IACjD,OAAO,YAAY,CAAC,eAAe,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACpD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAC3B,MAAc,EACd,IAAsB;IAEtB,OAAO,YAAY,CAAC,qBAAqB,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAClE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,YAAY,CAC1B,aAAqB,EACrB,IAAsB;IAEtB,OAAO,YAAY,CAAC,oBAAoB,EAAE,EAAE,aAAa,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACxE,CAAC;AAED;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,aAAa,CAC3B,aAAqB,EACrB,MAA6C,EAC7C,IAAsB;IAKtB,OAAO,YAAY,CAAC,qBAAqB,EAAE,EAAE,aAAa,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACjF,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,kBAAkB,CAChC,IAAyD;IAEzD,OAAO,YAAY,CAAC,4BAA4B,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACjE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,iBAAiB,CAC/B,IAAyD;IAEzD,OAAO,YAAY,CAAC,2BAA2B,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,uBAAuB,CACrC,IAAyD;IAEzD,OAAO,YAAY,CAAC,2BAA2B,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAChE,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,sBAAsB,CACpC,IAAyD;IAEzD,OAAO,YAAY,CAAC,0BAA0B,EAAE,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AAC/D,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,wBAAwB,CACtC,KAAwC,EACxC,IAAsB;IAKtB,OAAO,YAAY,CAAC,4BAA4B,EAAE,EAAE,KAAK,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;AACxE,CAAC"}
@@ -0,0 +1,114 @@
1
+ /**
2
+ * Coverage definitions: lower-bound staffing requirements per semantic time period.
3
+ *
4
+ * Coverage answers "what floor should apply throughout this scoped time, with
5
+ * the chosen priority?". It attaches sustained lower bounds to semantic times,
6
+ * whether those periods are
7
+ * explicit in the requirements or inferred to separate distinct business
8
+ * requirements. Coverage does not express caps, targets, fairness, or other
9
+ * assignment-shaping logic. Use rules for those concerns.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * coverage: [
14
+ * cover("lunch", "waiter", 2, { dayOfWeek: weekdays }),
15
+ * cover("lunch", "waiter", 3, { dayOfWeek: weekend }),
16
+ * cover("dinner", ["manager", "supervisor"], 1),
17
+ * cover("opening", "keyholder", 1),
18
+ *
19
+ * // Variant form: different counts by day
20
+ * cover("peak_hours", "agent",
21
+ * { count: 4 },
22
+ * { count: 2, dates: ["2025-12-24"] },
23
+ * ),
24
+ * ]
25
+ * ```
26
+ *
27
+ * @module
28
+ */
29
+ import type { DateString, DayOfWeek } from "../types.js";
30
+ import type { CoverageVariant } from "../cpsat/semantic-time.js";
31
+ import type { Priority } from "../cpsat/types.js";
32
+ export type { CoverageVariant } from "../cpsat/semantic-time.js";
33
+ /**
34
+ * Options for a {@link cover} call.
35
+ *
36
+ * @remarks
37
+ * Day/date scoping controls which days this coverage entry applies to.
38
+ * An entry without `dayOfWeek` or `dates` applies every day in the
39
+ * scheduling period. Scope answers where the floor applies; it does not change
40
+ * the meaning of coverage itself. `priority` controls how hard the coverage floor is.
41
+ * Use it to distinguish language like "must keep 5 staffed on Saturdays"
42
+ * from "ideally keep 5 staffed on Mondays too" without changing the
43
+ * underlying coverage shape. `skillIds` is a hard filter, not a preference.
44
+ * Use it only when the required minimum truly needs those skills throughout
45
+ * the window. If a role or skill mix is preferred rather than required, model
46
+ * that with rules such as {@link preferAssignment} instead of skill-filtered
47
+ * coverage.
48
+ *
49
+ * @category Coverage
50
+ */
51
+ export interface CoverageOptions {
52
+ /** Additional skill ID filter (AND logic with the target role). */
53
+ skillIds?: [string, ...string[]];
54
+ /** Restrict to specific days of the week. */
55
+ dayOfWeek?: readonly [DayOfWeek, ...DayOfWeek[]];
56
+ /** Restrict to specific dates (YYYY-MM-DD). */
57
+ dates?: DateString[];
58
+ /** Defaults to `"MANDATORY"`. */
59
+ priority?: Priority;
60
+ }
61
+ /**
62
+ * A coverage entry returned by {@link cover}.
63
+ *
64
+ * @remarks
65
+ * Carries the semantic time name and target type information for
66
+ * compile-time validation by {@link schedule}. This is an opaque
67
+ * token; pass it directly into the `coverage` array.
68
+ */
69
+ export interface CoverageEntry<T extends string = string, R extends string = string> {
70
+ /** @internal */ readonly _type: "coverage";
71
+ /** @internal */ readonly timeName: T;
72
+ /** @internal */ readonly target: R | R[];
73
+ /** @internal */ readonly count: number;
74
+ /** @internal */ readonly options: CoverageOptions;
75
+ /** @internal When present, this entry uses variant-based resolution. */
76
+ readonly variants?: readonly CoverageVariant[];
77
+ }
78
+ /**
79
+ * Defines a staffing requirement for a semantic time period.
80
+ *
81
+ * @remarks
82
+ * Coverage always defines a lower bound that applies throughout the scoped
83
+ * semantic time, with strength controlled by `priority`. If the requirements
84
+ * also state an upper bound or productive
85
+ * cap, model that separately in `rules`, for example with
86
+ * {@link maxConcurrentAssignments}.
87
+ *
88
+ * Scope answers where the floor applies. Priority answers how strictly the
89
+ * solver should preserve that floor when trade-offs are necessary.
90
+ *
91
+ * Attach coverage to the narrowest semantic time that actually carries that
92
+ * minimum. Avoid layering a broad parent coverage window on top of narrower
93
+ * windows unless the same lower bound truly applies throughout the full span.
94
+ * If the requirements talk about hitting full occupancy at the busy point,
95
+ * prefer {@link targetPeakConcurrentAssignments} over turning that into a
96
+ * whole-window minimum. Do not infer a synthetic "peak" semantic time just to attach
97
+ * `cover(..., 5)` unless the requirements really define a sustained window
98
+ * that needs that minimum throughout.
99
+ *
100
+ * Overlapping entries for the same time and role produce independent
101
+ * constraints; the solver enforces the **max** count, not the sum.
102
+ * An unscoped entry acts as a floor that scoped entries cannot reduce.
103
+ * Use mutually exclusive scopes when different days need different coverage.
104
+ *
105
+ * @param timeName - Name of a declared semantic time
106
+ * @param target - Role name (string), array of role names (OR logic), or skill name
107
+ * @param count - Number of people needed
108
+ * @param opts - Options: `skillIds` (AND filter), `dayOfWeek`, `dates`, `priority`
109
+ *
110
+ * @category Coverage
111
+ */
112
+ export declare function cover<T extends string, const R extends string>(timeName: T, target: R | [R, ...R[]], count: number, opts?: CoverageOptions): CoverageEntry<T, R>;
113
+ export declare function cover<T extends string, const R extends string>(timeName: T, target: R | [R, ...R[]], ...variants: [CoverageVariant, ...CoverageVariant[]]): CoverageEntry<T, R>;
114
+ //# sourceMappingURL=coverage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.d.ts","sourceRoot":"","sources":["../../src/schedule/coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AACzD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAElD,YAAY,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,WAAW,eAAe;IAC9B,mEAAmE;IACnE,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;IACjC,6CAA6C;IAC7C,SAAS,CAAC,EAAE,SAAS,CAAC,SAAS,EAAE,GAAG,SAAS,EAAE,CAAC,CAAC;IACjD,+CAA+C;IAC/C,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;IACrB,iCAAiC;IACjC,QAAQ,CAAC,EAAE,QAAQ,CAAC;CACrB;AAED;;;;;;;GAOG;AACH,MAAM,WAAW,aAAa,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,CAAC,SAAS,MAAM,GAAG,MAAM;IACjF,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,UAAU,CAAC;IAC5C,gBAAgB,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC;IACtC,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC;IAC1C,gBAAgB,CAAC,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACxC,gBAAgB,CAAC,QAAQ,CAAC,OAAO,EAAE,eAAe,CAAC;IACnD,yEAAyE;IACzE,QAAQ,CAAC,QAAQ,CAAC,EAAE,SAAS,eAAe,EAAE,CAAC;CAChD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,CAAC,CAAC,SAAS,MAAM,EAC5D,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EACvB,KAAK,EAAE,MAAM,EACb,IAAI,CAAC,EAAE,eAAe,GACrB,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AACvB,wBAAgB,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,CAAC,CAAC,SAAS,MAAM,EAC5D,QAAQ,EAAE,CAAC,EACX,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,EACvB,GAAG,QAAQ,EAAE,CAAC,eAAe,EAAE,GAAG,eAAe,EAAE,CAAC,GACnD,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC"}
@@ -0,0 +1,56 @@
1
+ /**
2
+ * Coverage definitions: lower-bound staffing requirements per semantic time period.
3
+ *
4
+ * Coverage answers "what floor should apply throughout this scoped time, with
5
+ * the chosen priority?". It attaches sustained lower bounds to semantic times,
6
+ * whether those periods are
7
+ * explicit in the requirements or inferred to separate distinct business
8
+ * requirements. Coverage does not express caps, targets, fairness, or other
9
+ * assignment-shaping logic. Use rules for those concerns.
10
+ *
11
+ * @example
12
+ * ```typescript
13
+ * coverage: [
14
+ * cover("lunch", "waiter", 2, { dayOfWeek: weekdays }),
15
+ * cover("lunch", "waiter", 3, { dayOfWeek: weekend }),
16
+ * cover("dinner", ["manager", "supervisor"], 1),
17
+ * cover("opening", "keyholder", 1),
18
+ *
19
+ * // Variant form: different counts by day
20
+ * cover("peak_hours", "agent",
21
+ * { count: 4 },
22
+ * { count: 2, dates: ["2025-12-24"] },
23
+ * ),
24
+ * ]
25
+ * ```
26
+ *
27
+ * @module
28
+ */
29
+ export function cover(timeName, target, countOrFirstVariant, ...rest) {
30
+ if (typeof countOrFirstVariant === "number") {
31
+ // Simple form: cover(time, target, count, opts?)
32
+ return {
33
+ _type: "coverage",
34
+ timeName,
35
+ target,
36
+ count: countOrFirstVariant,
37
+ options: rest[0] ?? {},
38
+ };
39
+ }
40
+ // Variant form: cover(time, target, ...variants)
41
+ const variants = [countOrFirstVariant, ...rest];
42
+ const defaults = variants.filter((v) => !v.dayOfWeek && !v.dates);
43
+ if (defaults.length > 1) {
44
+ throw new Error("cover() accepts at most one default variant (without dayOfWeek or dates). " +
45
+ `Found ${defaults.length} default variants.`);
46
+ }
47
+ return {
48
+ _type: "coverage",
49
+ timeName,
50
+ target,
51
+ count: 0,
52
+ options: {},
53
+ variants,
54
+ };
55
+ }
56
+ //# sourceMappingURL=coverage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"coverage.js","sourceRoot":"","sources":["../../src/schedule/coverage.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AAoGH,MAAM,UAAU,KAAK,CACnB,QAAW,EACX,MAAuB,EACvB,mBAA6C,EAC7C,GAAG,IAAe;IAElB,IAAI,OAAO,mBAAmB,KAAK,QAAQ,EAAE,CAAC;QAC5C,iDAAiD;QACjD,OAAO;YACL,KAAK,EAAE,UAAU;YACjB,QAAQ;YACR,MAAM;YACN,KAAK,EAAE,mBAAmB;YAC1B,OAAO,EAAG,IAAI,CAAC,CAAC,CAAiC,IAAI,EAAE;SACxD,CAAC;IACJ,CAAC;IAED,iDAAiD;IACjD,MAAM,QAAQ,GAAG,CAAC,mBAAmB,EAAE,GAAI,IAA0B,CAAC,CAAC;IAEvE,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAClE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,4EAA4E;YAC1E,SAAS,QAAQ,CAAC,MAAM,oBAAoB,CAC/C,CAAC;IACJ,CAAC;IAED,OAAO;QACL,KAAK,EAAE,UAAU;QACjB,QAAQ;QACR,MAAM;QACN,KAAK,EAAE,CAAC;QACR,OAAO,EAAE,EAAE;QACX,QAAQ;KACT,CAAC;AACJ,CAAC"}