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,79 @@
1
+ /**
2
+ * Time period primitives: day constants and semantic time constructors.
3
+ *
4
+ * Semantic times are business-relevant scheduling periods used to group
5
+ * coverage and rules. Some come directly from the requirements, for example opening,
6
+ * lunch, or closing. Others are inferred from the requirements so different
7
+ * parts of a day can carry different coverage floors or constraints.
8
+ *
9
+ * An unscoped `time(...)` entry applies every day in the scheduling period.
10
+ * Names are descriptive only, they do not scope a time to a day. If a time is
11
+ * day-specific, add `dayOfWeek` or `dates` explicitly.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * times: {
16
+ * lunch: time({ startTime: t(12), endTime: t(15) }),
17
+ * dinner: time(
18
+ * { startTime: t(17), endTime: t(21) },
19
+ * { startTime: t(18), endTime: t(22), dayOfWeek: weekend },
20
+ * ),
21
+ * thursday_open: time({ startTime: t(10), endTime: t(11), dayOfWeek: ["thursday"] }),
22
+ * }
23
+ * ```
24
+ *
25
+ * @module
26
+ */
27
+ import type { TimeOfDay } from "../types.js";
28
+ import type { SemanticTimeVariant, SemanticTimeEntry } from "../cpsat/semantic-time.js";
29
+ /**
30
+ * Creates a {@link TimeOfDay} value.
31
+ *
32
+ * @param hours - Hour component (0-23)
33
+ * @param minutes - Minute component (0-59)
34
+ *
35
+ * @category Time Periods
36
+ */
37
+ export declare function t(hours: number, minutes?: number): TimeOfDay;
38
+ /**
39
+ * Monday through Friday.
40
+ *
41
+ * @category Time Periods
42
+ */
43
+ export declare const weekdays: readonly ["monday", "tuesday", "wednesday", "thursday", "friday"];
44
+ /**
45
+ * Saturday and Sunday.
46
+ *
47
+ * @category Time Periods
48
+ */
49
+ export declare const weekend: readonly ["saturday", "sunday"];
50
+ /**
51
+ * Define a named semantic time period.
52
+ *
53
+ * @remarks
54
+ * Each entry has `startTime`/`endTime` and optional `dayOfWeek` or `dates`
55
+ * scoping. Entries without scoping are the default and apply every day in the
56
+ * scheduling period. The surrounding object key is only a name, it does not
57
+ * add scope. For example, `thursday_open: time({ startTime: ..., endTime: ... })`
58
+ * still applies on Monday, Tuesday, and every other scheduling day unless you
59
+ * add `dayOfWeek: ["thursday"]`.
60
+ *
61
+ * Use semantic times to represent business periods, not shift patterns. Some
62
+ * periods have explicit boundaries in the requirements. Others are inferred so
63
+ * related coverage and rules can attach to the correct part of the day. Choose
64
+ * the simplest set of semantic times that preserves the business distinctions
65
+ * you need.
66
+ *
67
+ * Avoid adding a broad all-day semantic time when narrower windows already
68
+ * describe the day's distinct requirements. If opening, core trading, and
69
+ * closing each need different coverage, model those windows directly instead
70
+ * of layering an extra whole-day period on top unless the lower bound truly
71
+ * applies for the full span.
72
+ *
73
+ * @privateRemarks
74
+ * Resolution precedence: `dates` > `dayOfWeek` > default.
75
+ *
76
+ * @category Time Periods
77
+ */
78
+ export declare function time(...entries: [SemanticTimeVariant, ...SemanticTimeVariant[]]): SemanticTimeEntry;
79
+ //# sourceMappingURL=time-periods.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-periods.d.ts","sourceRoot":"","sources":["../../src/schedule/time-periods.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AAEH,OAAO,KAAK,EAAa,SAAS,EAAE,MAAM,aAAa,CAAC;AACxD,OAAO,KAAK,EAEV,mBAAmB,EACnB,iBAAiB,EAClB,MAAM,2BAA2B,CAAC;AAEnC;;;;;;;GAOG;AACH,wBAAgB,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,SAAI,GAAG,SAAS,CAEvD;AAED;;;;GAIG;AACH,eAAO,MAAM,QAAQ,mEAMoC,CAAC;AAE1D;;;;GAIG;AACH,eAAO,MAAM,OAAO,iCAGnB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,IAAI,CAClB,GAAG,OAAO,EAAE,CAAC,mBAAmB,EAAE,GAAG,mBAAmB,EAAE,CAAC,GAC1D,iBAAiB,CAoBnB"}
@@ -0,0 +1,101 @@
1
+ /**
2
+ * Time period primitives: day constants and semantic time constructors.
3
+ *
4
+ * Semantic times are business-relevant scheduling periods used to group
5
+ * coverage and rules. Some come directly from the requirements, for example opening,
6
+ * lunch, or closing. Others are inferred from the requirements so different
7
+ * parts of a day can carry different coverage floors or constraints.
8
+ *
9
+ * An unscoped `time(...)` entry applies every day in the scheduling period.
10
+ * Names are descriptive only, they do not scope a time to a day. If a time is
11
+ * day-specific, add `dayOfWeek` or `dates` explicitly.
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * times: {
16
+ * lunch: time({ startTime: t(12), endTime: t(15) }),
17
+ * dinner: time(
18
+ * { startTime: t(17), endTime: t(21) },
19
+ * { startTime: t(18), endTime: t(22), dayOfWeek: weekend },
20
+ * ),
21
+ * thursday_open: time({ startTime: t(10), endTime: t(11), dayOfWeek: ["thursday"] }),
22
+ * }
23
+ * ```
24
+ *
25
+ * @module
26
+ */
27
+ /**
28
+ * Creates a {@link TimeOfDay} value.
29
+ *
30
+ * @param hours - Hour component (0-23)
31
+ * @param minutes - Minute component (0-59)
32
+ *
33
+ * @category Time Periods
34
+ */
35
+ export function t(hours, minutes = 0) {
36
+ return { hours, minutes };
37
+ }
38
+ /**
39
+ * Monday through Friday.
40
+ *
41
+ * @category Time Periods
42
+ */
43
+ export const weekdays = [
44
+ "monday",
45
+ "tuesday",
46
+ "wednesday",
47
+ "thursday",
48
+ "friday",
49
+ ];
50
+ /**
51
+ * Saturday and Sunday.
52
+ *
53
+ * @category Time Periods
54
+ */
55
+ export const weekend = ["saturday", "sunday"];
56
+ /**
57
+ * Define a named semantic time period.
58
+ *
59
+ * @remarks
60
+ * Each entry has `startTime`/`endTime` and optional `dayOfWeek` or `dates`
61
+ * scoping. Entries without scoping are the default and apply every day in the
62
+ * scheduling period. The surrounding object key is only a name, it does not
63
+ * add scope. For example, `thursday_open: time({ startTime: ..., endTime: ... })`
64
+ * still applies on Monday, Tuesday, and every other scheduling day unless you
65
+ * add `dayOfWeek: ["thursday"]`.
66
+ *
67
+ * Use semantic times to represent business periods, not shift patterns. Some
68
+ * periods have explicit boundaries in the requirements. Others are inferred so
69
+ * related coverage and rules can attach to the correct part of the day. Choose
70
+ * the simplest set of semantic times that preserves the business distinctions
71
+ * you need.
72
+ *
73
+ * Avoid adding a broad all-day semantic time when narrower windows already
74
+ * describe the day's distinct requirements. If opening, core trading, and
75
+ * closing each need different coverage, model those windows directly instead
76
+ * of layering an extra whole-day period on top unless the lower bound truly
77
+ * applies for the full span.
78
+ *
79
+ * @privateRemarks
80
+ * Resolution precedence: `dates` > `dayOfWeek` > default.
81
+ *
82
+ * @category Time Periods
83
+ */
84
+ export function time(...entries) {
85
+ // Validate: at most one default (no dayOfWeek and no dates)
86
+ const defaults = entries.filter((e) => !e.dayOfWeek && !e.dates);
87
+ if (defaults.length > 1) {
88
+ throw new Error("time() accepts at most one default entry (without dayOfWeek or dates). " +
89
+ `Found ${defaults.length} default entries.`);
90
+ }
91
+ // Single entry without scoping: simple SemanticTimeDef
92
+ if (entries.length === 1 && !entries[0].dayOfWeek && !entries[0].dates) {
93
+ return {
94
+ startTime: entries[0].startTime,
95
+ endTime: entries[0].endTime,
96
+ };
97
+ }
98
+ // Multiple entries or scoped entries: shallow-copy to decouple from caller
99
+ return entries.map((entry) => Object.assign({}, entry));
100
+ }
101
+ //# sourceMappingURL=time-periods.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time-periods.js","sourceRoot":"","sources":["../../src/schedule/time-periods.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AASH;;;;;;;GAOG;AACH,MAAM,UAAU,CAAC,CAAC,KAAa,EAAE,OAAO,GAAG,CAAC;IAC1C,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC;AAC5B,CAAC;AAED;;;;GAIG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG;IACtB,QAAQ;IACR,SAAS;IACT,WAAW;IACX,UAAU;IACV,QAAQ;CAC+C,CAAC;AAE1D;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,CAAC,UAAU,EAAE,QAAQ,CAG3C,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,UAAU,IAAI,CAClB,GAAG,OAAwD;IAE3D,4DAA4D;IAC5D,MAAM,QAAQ,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IACjE,IAAI,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CACb,yEAAyE;YACvE,SAAS,QAAQ,CAAC,MAAM,mBAAmB,CAC9C,CAAC;IACJ,CAAC;IAED,uDAAuD;IACvD,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACvE,OAAO;YACL,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,SAAS;YAC/B,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO;SACF,CAAC;IAC9B,CAAC;IAED,2EAA2E;IAC3E,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC;AAC1D,CAAC"}
package/dist/types.d.ts CHANGED
@@ -24,6 +24,70 @@ export interface TimeOfDay {
24
24
  hours: number;
25
25
  minutes: number;
26
26
  }
27
+ /**
28
+ * A date string in ISO 8601 calendar date format (YYYY-MM-DD).
29
+ *
30
+ * Template literal type that rejects arbitrary strings at compile time.
31
+ * Use this wherever a raw date string is expected in scheduling APIs.
32
+ *
33
+ * @category Supporting Types
34
+ */
35
+ export type DateString = `${number}-${number}-${number}`;
36
+ /**
37
+ * Checks whether a string matches the {@link DateString} YYYY-MM-DD format.
38
+ *
39
+ * @remarks
40
+ * This validates string shape only. It does not guarantee that the value is a
41
+ * semantically valid calendar date.
42
+ *
43
+ * @param value - String to test
44
+ *
45
+ * @category Supporting Types
46
+ */
47
+ export declare function isDateString(value: string): value is DateString;
48
+ /**
49
+ * A calendar day with pre-computed date components.
50
+ *
51
+ * Constructed once from a YYYY-MM-DD string via {@link schedulingDay}, then
52
+ * passed by reference. Replaces raw `string` day representations throughout
53
+ * the solver so downstream code never needs to parse dates.
54
+ *
55
+ * @category Supporting Types
56
+ */
57
+ export interface SchedulingDay {
58
+ /** The canonical YYYY-MM-DD string. */
59
+ readonly iso: DateString;
60
+ /** Day of week (monday, tuesday, ...). */
61
+ readonly dayOfWeek: DayOfWeek;
62
+ /** 1-indexed month (1 = January, 12 = December). */
63
+ readonly month: number;
64
+ /** 1-indexed day of the month. */
65
+ readonly dayOfMonth: number;
66
+ /** Year-month key for grouping ("YYYY-MM"). */
67
+ readonly yearMonth: string;
68
+ /** Integer days since Unix epoch (1970-01-01 = 0). Useful for date arithmetic. */
69
+ readonly epochDay: number;
70
+ }
71
+ export declare const DAY_NAMES: readonly DayOfWeek[];
72
+ declare const DAY_OF_WEEK_INDEX: Record<DayOfWeek, number>;
73
+ /**
74
+ * Creates a {@link SchedulingDay} from a YYYY-MM-DD string.
75
+ *
76
+ * Parses the date once in UTC and pre-computes all fields so that no
77
+ * downstream code ever needs to construct a `Date` object.
78
+ *
79
+ * @param iso - Date string in YYYY-MM-DD format
80
+ *
81
+ * @category Supporting Types
82
+ */
83
+ export declare function schedulingDay(iso: DateString): SchedulingDay;
84
+ /**
85
+ * Maps {@link DayOfWeek} names to JavaScript `Date.getUTCDay()` indices
86
+ * (0 = Sunday, 6 = Saturday).
87
+ *
88
+ * @category Supporting Types
89
+ */
90
+ export { DAY_OF_WEEK_INDEX };
27
91
  /**
28
92
  * Defines a scheduling period as a date range with optional filters.
29
93
  *
@@ -62,8 +126,8 @@ export interface SchedulingPeriod {
62
126
  * Dates should be in YYYY-MM-DD format.
63
127
  */
64
128
  dateRange: {
65
- start: string;
66
- end: string;
129
+ start: DateString;
130
+ end: DateString;
67
131
  };
68
132
  /**
69
133
  * Include only these days of the week.
@@ -74,6 +138,6 @@ export interface SchedulingPeriod {
74
138
  * Include only these specific dates (YYYY-MM-DD) within the range.
75
139
  * If omitted, all dates in the range are included (subject to dayOfWeek filter).
76
140
  */
77
- dates?: string[];
141
+ dates?: DateString[];
78
142
  }
79
143
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAMzB;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,GACV,QAAQ,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,eAAe,uMAQ1B,CAAC;AAEH;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,SAAS,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC;IAC1C;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACjC;;;OAGG;IACH,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC;CAClB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAMzB;;;;GAIG;AACH,MAAM,MAAM,SAAS,GACjB,QAAQ,GACR,SAAS,GACT,WAAW,GACX,UAAU,GACV,QAAQ,GACR,UAAU,GACV,QAAQ,CAAC;AAEb;;;GAGG;AACH,eAAO,MAAM,eAAe,uMAQ1B,CAAC;AAEH;;;;GAIG;AACH,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAMD;;;;;;;GAOG;AACH,MAAM,MAAM,UAAU,GAAG,GAAG,MAAM,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;AAIzD;;;;;;;;;;GAUG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,IAAI,UAAU,CAE/D;AAMD;;;;;;;;GAQG;AACH,MAAM,WAAW,aAAa;IAC5B,uCAAuC;IACvC,QAAQ,CAAC,GAAG,EAAE,UAAU,CAAC;IACzB,0CAA0C;IAC1C,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,oDAAoD;IACpD,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IACvB,kCAAkC;IAClC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+CAA+C;IAC/C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,kFAAkF;IAClF,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;CAC3B;AAED,eAAO,MAAM,SAAS,EAAE,SAAS,SAAS,EAQzC,CAAC;AAEF,QAAA,MAAM,iBAAiB,EAAE,MAAM,CAAC,SAAS,EAAE,MAAM,CAQhD,CAAC;AAEF;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,UAAU,GAAG,aAAa,CAa5D;AAED;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC;AAM7B;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,SAAS,EAAE;QAAE,KAAK,EAAE,UAAU,CAAC;QAAC,GAAG,EAAE,UAAU,CAAA;KAAE,CAAC;IAClD;;;OAGG;IACH,SAAS,CAAC,EAAE,SAAS,SAAS,EAAE,CAAC;IACjC;;;OAGG;IACH,KAAK,CAAC,EAAE,UAAU,EAAE,CAAC;CACtB"}
package/dist/types.js CHANGED
@@ -17,4 +17,68 @@ export const DayOfWeekSchema = z.union([
17
17
  z.literal("saturday"),
18
18
  z.literal("sunday"),
19
19
  ]);
20
+ const DATE_STRING_RE = /^\d{4}-\d{2}-\d{2}$/;
21
+ /**
22
+ * Checks whether a string matches the {@link DateString} YYYY-MM-DD format.
23
+ *
24
+ * @remarks
25
+ * This validates string shape only. It does not guarantee that the value is a
26
+ * semantically valid calendar date.
27
+ *
28
+ * @param value - String to test
29
+ *
30
+ * @category Supporting Types
31
+ */
32
+ export function isDateString(value) {
33
+ return DATE_STRING_RE.test(value);
34
+ }
35
+ export const DAY_NAMES = [
36
+ "sunday",
37
+ "monday",
38
+ "tuesday",
39
+ "wednesday",
40
+ "thursday",
41
+ "friday",
42
+ "saturday",
43
+ ];
44
+ const DAY_OF_WEEK_INDEX = {
45
+ sunday: 0,
46
+ monday: 1,
47
+ tuesday: 2,
48
+ wednesday: 3,
49
+ thursday: 4,
50
+ friday: 5,
51
+ saturday: 6,
52
+ };
53
+ /**
54
+ * Creates a {@link SchedulingDay} from a YYYY-MM-DD string.
55
+ *
56
+ * Parses the date once in UTC and pre-computes all fields so that no
57
+ * downstream code ever needs to construct a `Date` object.
58
+ *
59
+ * @param iso - Date string in YYYY-MM-DD format
60
+ *
61
+ * @category Supporting Types
62
+ */
63
+ export function schedulingDay(iso) {
64
+ const date = new Date(`${iso}T00:00:00Z`);
65
+ const dayOfWeek = DAY_NAMES[date.getUTCDay()];
66
+ const month = date.getUTCMonth() + 1;
67
+ const dayOfMonth = date.getUTCDate();
68
+ return {
69
+ iso,
70
+ dayOfWeek,
71
+ month,
72
+ dayOfMonth,
73
+ yearMonth: iso.slice(0, 7),
74
+ epochDay: Math.floor(date.getTime() / 86_400_000),
75
+ };
76
+ }
77
+ /**
78
+ * Maps {@link DayOfWeek} names to JavaScript `Date.getUTCDay()` indices
79
+ * (0 = Sunday, 6 = Saturday).
80
+ *
81
+ * @category Supporting Types
82
+ */
83
+ export { DAY_OF_WEEK_INDEX };
20
84
  //# sourceMappingURL=types.js.map
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAoBzB;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;CACpB,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAoBzB;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC;IACrC,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC;IACpB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC;IACtB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;IACnB,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC;IACrB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC;CACpB,CAAC,CAAC;AA0BH,MAAM,cAAc,GAAG,qBAAqB,CAAC;AAE7C;;;;;;;;;;GAUG;AACH,MAAM,UAAU,YAAY,CAAC,KAAa;IACxC,OAAO,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACpC,CAAC;AA8BD,MAAM,CAAC,MAAM,SAAS,GAAyB;IAC7C,QAAQ;IACR,QAAQ;IACR,SAAS;IACT,WAAW;IACX,UAAU;IACV,QAAQ;IACR,UAAU;CACX,CAAC;AAEF,MAAM,iBAAiB,GAA8B;IACnD,MAAM,EAAE,CAAC;IACT,MAAM,EAAE,CAAC;IACT,OAAO,EAAE,CAAC;IACV,SAAS,EAAE,CAAC;IACZ,QAAQ,EAAE,CAAC;IACX,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,CAAC;CACZ,CAAC;AAEF;;;;;;;;;GASG;AACH,MAAM,UAAU,aAAa,CAAC,GAAe;IAC3C,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,GAAG,GAAG,YAAY,CAAC,CAAC;IAC1C,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,SAAS,EAAE,CAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC;IACrC,MAAM,UAAU,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;IACrC,OAAO;QACL,GAAG;QACH,SAAS;QACT,KAAK;QACL,UAAU;QACV,SAAS,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1B,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,CAAC;KAClD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,OAAO,EAAE,iBAAiB,EAAE,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "dabke",
3
- "version": "0.82.0",
3
+ "version": "0.84.0",
4
4
  "description": "Scheduling library powered by constraint programming (CP-SAT)",
5
5
  "keywords": [
6
6
  "constraint-programming",
@@ -26,7 +26,6 @@
26
26
  "CHANGELOG.md",
27
27
  "dist",
28
28
  "LICENSE",
29
- "llms.txt",
30
29
  "README.md",
31
30
  "solver",
32
31
  "src"
@@ -40,10 +39,6 @@
40
39
  "types": "./dist/index.d.ts",
41
40
  "default": "./dist/index.js"
42
41
  },
43
- "./llms": {
44
- "types": "./dist/llms.d.ts",
45
- "default": "./dist/llms.js"
46
- },
47
42
  "./testing": {
48
43
  "types": "./dist/testing/index.d.ts",
49
44
  "default": "./dist/testing/index.js"
@@ -57,18 +52,17 @@
57
52
  "test": "npm run typecheck && npm run test:unit",
58
53
  "test:unit": "vitest run --project=unit",
59
54
  "test:unit:watch": "vitest --watch --project=unit",
60
- "test:integration": "[ -f .env ] && { set -a; source .env; set +a; } && vitest run --project=integration",
61
- "test:integration:watch": "[ -f .env ] && { set -a; source .env; set +a; } && vitest --watch --project=integration",
62
- "generate:llmstxt": "tsx scripts/generate-llmstxt.ts && oxfmt --write llms.txt src/llms.ts"
55
+ "test:integration": "vitest run --project=integration",
56
+ "test:integration:watch": "vitest --watch --project=integration"
63
57
  },
64
58
  "dependencies": {
65
- "zod": "^4.3.6"
59
+ "zod": "^4.4.3"
66
60
  },
67
61
  "devDependencies": {
68
- "@types/node": "^22.0.0",
69
- "commander": "^14.0.2",
70
- "typescript": "^5.9.3",
71
- "vitest": "^4.0.18"
62
+ "@types/node": "^25.9.1",
63
+ "commander": "^15.0.0",
64
+ "typescript": "^6.0.3",
65
+ "vitest": "^4.1.7"
72
66
  },
73
67
  "engines": {
74
68
  "node": ">=20"
@@ -5,6 +5,11 @@ from typing import Literal
5
5
  from pydantic import BaseModel, Field, ConfigDict
6
6
 
7
7
 
8
+ SolverMode = Literal["optimize", "satisfy"]
9
+ SolverStatus = Literal["OPTIMAL", "FEASIBLE", "INFEASIBLE", "TIMEOUT", "ERROR"]
10
+ DiagnosticMode = Literal["none", "hard"]
11
+
12
+
8
13
  class Variable(BaseModel):
9
14
  """Decision variable.
10
15
 
@@ -65,6 +70,7 @@ class Constraint(BaseModel):
65
70
  if_: str | None = Field(default=None, alias="if")
66
71
  then: str | None = None
67
72
  id: str | None = None
73
+ stage: str | None = None
68
74
 
69
75
 
70
76
  class Objective(BaseModel):
@@ -76,6 +82,12 @@ class Objective(BaseModel):
76
82
  terms: list[Term]
77
83
 
78
84
 
85
+ class SolverObjectiveStage(Objective):
86
+ """A named objective stage for lexicographic solving."""
87
+
88
+ id: str
89
+
90
+
79
91
  class Options(BaseModel):
80
92
  """Solver tuning options."""
81
93
 
@@ -83,6 +95,7 @@ class Options(BaseModel):
83
95
 
84
96
  timeLimitSeconds: float = 60.0
85
97
  solutionLimit: int | None = None # Only solutionLimit=1 is supported (stops after first feasible solution)
98
+ diagnostics: DiagnosticMode = "none"
86
99
 
87
100
 
88
101
  class SolverRequest(BaseModel):
@@ -93,11 +106,25 @@ class SolverRequest(BaseModel):
93
106
  variables: list[Variable]
94
107
  constraints: list[Constraint]
95
108
  objective: Objective | None = None
109
+ objectiveStages: list[SolverObjectiveStage] | None = None
110
+ mode: SolverMode | None = None
96
111
  options: Options | None = None
97
112
 
98
113
 
99
- class SoftConstraintViolation(BaseModel):
100
- """A soft constraint violation in the solver output."""
114
+ class SolverStageResult(BaseModel):
115
+ """Metadata for one objective stage solve."""
116
+
117
+ model_config = ConfigDict(extra="forbid")
118
+
119
+ id: str
120
+ status: SolverStatus
121
+ objectiveValue: float | None = None
122
+ bestObjectiveBound: float | None = None
123
+ solveTimeMs: int
124
+
125
+
126
+ class SolverSoftConstraintViolation(BaseModel):
127
+ """A raw solver-stage soft constraint violation."""
101
128
 
102
129
  model_config = ConfigDict(extra="forbid")
103
130
 
@@ -107,14 +134,24 @@ class SoftConstraintViolation(BaseModel):
107
134
  actualValue: int
108
135
 
109
136
 
137
+ class SolverHardConstraintConflict(BaseModel):
138
+ """A hard constraint included in a sufficient infeasible constraint set."""
139
+
140
+ model_config = ConfigDict(extra="forbid")
141
+
142
+ constraintId: str
143
+
144
+
110
145
  class SolverResponse(BaseModel):
111
146
  """Response payload produced by the solver service."""
112
147
 
113
148
  model_config = ConfigDict(extra="forbid")
114
149
 
115
- status: Literal["OPTIMAL", "FEASIBLE", "INFEASIBLE", "TIMEOUT", "ERROR"]
150
+ status: SolverStatus
116
151
  values: dict[str, int] | None = None
117
152
  statistics: dict[str, int | float] | None = None
118
153
  error: str | None = None
119
154
  solutionInfo: str | None = None
120
- softViolations: list[SoftConstraintViolation] | None = None
155
+ hardConstraintConflicts: list[SolverHardConstraintConflict] | None = None
156
+ softConstraintViolations: list[SolverSoftConstraintViolation] | None = None
157
+ stageResults: list[SolverStageResult] | None = None