dabke 0.82.0 → 0.83.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (83) hide show
  1. package/CHANGELOG.md +23 -0
  2. package/README.md +6 -3
  3. package/dist/cpsat/rules/index.d.ts +3 -0
  4. package/dist/cpsat/rules/index.d.ts.map +1 -1
  5. package/dist/cpsat/rules/index.js +3 -0
  6. package/dist/cpsat/rules/index.js.map +1 -1
  7. package/dist/cpsat/rules/max-days-week.d.ts +44 -0
  8. package/dist/cpsat/rules/max-days-week.d.ts.map +1 -0
  9. package/dist/cpsat/rules/max-days-week.js +95 -0
  10. package/dist/cpsat/rules/max-days-week.js.map +1 -0
  11. package/dist/cpsat/rules/min-days-week.d.ts +34 -0
  12. package/dist/cpsat/rules/min-days-week.d.ts.map +1 -0
  13. package/dist/cpsat/rules/min-days-week.js +84 -0
  14. package/dist/cpsat/rules/min-days-week.js.map +1 -0
  15. package/dist/cpsat/rules/must-assign.d.ts +49 -0
  16. package/dist/cpsat/rules/must-assign.d.ts.map +1 -0
  17. package/dist/cpsat/rules/must-assign.js +86 -0
  18. package/dist/cpsat/rules/must-assign.js.map +1 -0
  19. package/dist/cpsat/rules/registry.d.ts +4 -1
  20. package/dist/cpsat/rules/registry.d.ts.map +1 -1
  21. package/dist/cpsat/rules/registry.js +4 -1
  22. package/dist/cpsat/rules/registry.js.map +1 -1
  23. package/dist/cpsat/rules/rules.types.d.ts +3 -0
  24. package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
  25. package/dist/cpsat/rules/scope.types.d.ts +1 -1
  26. package/dist/index.d.ts +5 -3
  27. package/dist/index.d.ts.map +1 -1
  28. package/dist/index.js +4 -2
  29. package/dist/index.js.map +1 -1
  30. package/dist/schedule/cost.d.ts +204 -0
  31. package/dist/schedule/cost.d.ts.map +1 -0
  32. package/dist/schedule/cost.js +187 -0
  33. package/dist/schedule/cost.js.map +1 -0
  34. package/dist/schedule/coverage.d.ts +85 -0
  35. package/dist/schedule/coverage.d.ts.map +1 -0
  36. package/dist/schedule/coverage.js +33 -0
  37. package/dist/schedule/coverage.js.map +1 -0
  38. package/dist/schedule/definition.d.ts +227 -0
  39. package/dist/schedule/definition.d.ts.map +1 -0
  40. package/dist/{schedule.js → schedule/definition.js} +9 -673
  41. package/dist/schedule/definition.js.map +1 -0
  42. package/dist/schedule/index.d.ts +67 -0
  43. package/dist/schedule/index.d.ts.map +1 -0
  44. package/dist/schedule/index.js +69 -0
  45. package/dist/schedule/index.js.map +1 -0
  46. package/dist/schedule/rules.d.ts +353 -0
  47. package/dist/schedule/rules.d.ts.map +1 -0
  48. package/dist/schedule/rules.js +352 -0
  49. package/dist/schedule/rules.js.map +1 -0
  50. package/dist/schedule/shift-patterns.d.ts +34 -0
  51. package/dist/schedule/shift-patterns.d.ts.map +1 -0
  52. package/dist/schedule/shift-patterns.js +41 -0
  53. package/dist/schedule/shift-patterns.js.map +1 -0
  54. package/dist/schedule/time-periods.d.ts +69 -0
  55. package/dist/schedule/time-periods.d.ts.map +1 -0
  56. package/dist/schedule/time-periods.js +91 -0
  57. package/dist/schedule/time-periods.js.map +1 -0
  58. package/package.json +4 -9
  59. package/src/cpsat/rules/index.ts +3 -0
  60. package/src/cpsat/rules/max-days-week.ts +143 -0
  61. package/src/cpsat/rules/min-days-week.ts +120 -0
  62. package/src/cpsat/rules/must-assign.ts +108 -0
  63. package/src/cpsat/rules/registry.ts +6 -0
  64. package/src/cpsat/rules/rules.types.ts +3 -0
  65. package/src/cpsat/rules/scope.types.ts +1 -1
  66. package/src/index.ts +8 -3
  67. package/src/schedule/cost.ts +242 -0
  68. package/src/schedule/coverage.ts +135 -0
  69. package/src/schedule/definition.ts +958 -0
  70. package/src/schedule/index.ts +112 -0
  71. package/src/schedule/rules.ts +529 -0
  72. package/src/schedule/shift-patterns.ts +46 -0
  73. package/src/schedule/time-periods.ts +110 -0
  74. package/dist/llms.d.ts +0 -2
  75. package/dist/llms.d.ts.map +0 -1
  76. package/dist/llms.js +0 -3
  77. package/dist/llms.js.map +0 -1
  78. package/dist/schedule.d.ts +0 -917
  79. package/dist/schedule.d.ts.map +0 -1
  80. package/dist/schedule.js.map +0 -1
  81. package/llms.txt +0 -758
  82. package/src/llms.ts +0 -3
  83. package/src/schedule.ts +0 -1960
@@ -0,0 +1,227 @@
1
+ /**
2
+ * Schedule definition, compilation, and solving.
3
+ *
4
+ * @module
5
+ */
6
+ import type { DayOfWeek } from "../types.js";
7
+ import type { SemanticTimeEntry } from "../cpsat/semantic-time.js";
8
+ import type { CompilationResult } from "../cpsat/model-builder.js";
9
+ import { ModelBuilder } from "../cpsat/model-builder.js";
10
+ import type { SchedulingMember, ShiftPattern } from "../cpsat/types.js";
11
+ import type { CreateCpsatRuleFunction } from "../cpsat/rules/rules.types.js";
12
+ import type { SolverClient } from "../client.types.js";
13
+ import type { ShiftAssignment } from "../cpsat/response.js";
14
+ import type { ScheduleValidation } from "../cpsat/validation.types.js";
15
+ import type { CostBreakdown } from "../cpsat/cost.js";
16
+ import type { CoverageEntry } from "./coverage.js";
17
+ import type { RuleEntry } from "./rules.js";
18
+ /** A value that can be passed to {@link Schedule.with}. */
19
+ type WithArg = Schedule | SchedulingMember[];
20
+ /** Status of a solve attempt, using idiomatic lowercase TypeScript literals. */
21
+ export type SolveStatus = "optimal" | "feasible" | "infeasible" | "no_solution";
22
+ /**
23
+ * Result of {@link Schedule.solve}.
24
+ *
25
+ * @category Schedule Definition
26
+ */
27
+ export interface SolveResult {
28
+ /** Outcome of the solve attempt. */
29
+ status: SolveStatus;
30
+ /** Shift assignments (empty when infeasible or no solution). */
31
+ assignments: ShiftAssignment[];
32
+ /** Validation diagnostics from compilation. */
33
+ validation: ScheduleValidation;
34
+ /** Cost breakdown (present when cost rules are used and a solution is found). */
35
+ cost?: CostBreakdown;
36
+ }
37
+ /**
38
+ * Options for {@link Schedule.solve} and {@link Schedule.compile}.
39
+ *
40
+ * @category Schedule Definition
41
+ */
42
+ export interface SolveOptions {
43
+ /** The date range to schedule. */
44
+ dateRange: {
45
+ start: string;
46
+ end: string;
47
+ };
48
+ /**
49
+ * Fixed assignments from a prior solve (e.g., rolling schedule).
50
+ * These are injected as fixed variables in the solver.
51
+ *
52
+ * Not yet implemented. Providing pinned assignments throws an error.
53
+ */
54
+ pinned?: ShiftAssignment[];
55
+ }
56
+ /**
57
+ * Configuration for {@link schedule}.
58
+ *
59
+ * @remarks
60
+ * Coverage entries for the same semantic time and target stack additively.
61
+ * An unscoped entry applies every day; adding a weekend-only entry on top
62
+ * doubles the count on those days. Use mutually exclusive `dayOfWeek` on
63
+ * both entries to avoid stacking. See {@link cover} for details.
64
+ *
65
+ * `roleIds`, `times`, `coverage`, and `shiftPatterns` are required.
66
+ * These four fields form the minimum solvable schedule.
67
+ *
68
+ * @category Schedule Definition
69
+ */
70
+ export interface ScheduleConfig<R extends readonly string[] = readonly string[], S extends readonly string[] = readonly [], T extends Record<string, SemanticTimeEntry> = Record<string, SemanticTimeEntry>> {
71
+ /** Declared role IDs. */
72
+ roleIds: R;
73
+ /** Declared skill IDs. When omitted, coverage targets can only be roles. */
74
+ skillIds?: S;
75
+ /** Named semantic time periods. */
76
+ times: T;
77
+ /** Staffing requirements per time period (entries stack additively). */
78
+ coverage: NoInfer<CoverageEntry<keyof T & string, R[number] | S[number]>>[];
79
+ /** Available shift patterns. */
80
+ shiftPatterns: ShiftPattern[];
81
+ /** Scheduling rules and constraints. */
82
+ rules?: RuleEntry[];
83
+ /**
84
+ * Custom rule factories. Keys are rule names, values are functions
85
+ * that take a config object and return a {@link CompilationRule}.
86
+ * Built-in rule names cannot be overridden.
87
+ */
88
+ ruleFactories?: Record<string, CreateCpsatRuleFunction>;
89
+ /** Team members (typically added via `.with()` at runtime). */
90
+ members?: SchedulingMember[];
91
+ /** Days of the week the business operates (inclusion filter). */
92
+ dayOfWeek?: readonly [DayOfWeek, ...DayOfWeek[]];
93
+ /** Which day starts the week for weekly rules. Defaults to `"monday"`. */
94
+ weekStartsOn?: DayOfWeek;
95
+ }
96
+ /** Internal representation of a fully merged schedule. */
97
+ interface MergedScheduleConfig {
98
+ roleIds: string[];
99
+ skillIds: string[];
100
+ times: Record<string, SemanticTimeEntry>;
101
+ coverage: CoverageEntry[];
102
+ shiftPatterns: ShiftPattern[];
103
+ rules: RuleEntry[];
104
+ ruleFactories: Record<string, CreateCpsatRuleFunction>;
105
+ members: SchedulingMember[];
106
+ dayOfWeek?: readonly [DayOfWeek, ...DayOfWeek[]];
107
+ weekStartsOn?: DayOfWeek;
108
+ }
109
+ /**
110
+ * An immutable schedule definition.
111
+ *
112
+ * Created by {@link schedule}, composed via {@link Schedule.with},
113
+ * and solved via {@link Schedule.solve}.
114
+ *
115
+ * @category Schedule Definition
116
+ */
117
+ export declare class Schedule {
118
+ #private;
119
+ /** @internal */
120
+ constructor(config: MergedScheduleConfig);
121
+ /** @internal Returns a defensive copy of the config for merging. */
122
+ _getConfig(): MergedScheduleConfig;
123
+ /** Declared role IDs. */
124
+ get roleIds(): readonly string[];
125
+ /** Declared skill IDs. */
126
+ get skillIds(): readonly string[];
127
+ /** Names of declared semantic times. */
128
+ get timeNames(): readonly string[];
129
+ /** Shift pattern IDs. */
130
+ get shiftPatternIds(): readonly string[];
131
+ /** Internal rule identifiers in kebab-case. */
132
+ get ruleNames(): readonly string[];
133
+ /**
134
+ * Merges schedules or members onto this schedule, returning a new
135
+ * immutable `Schedule`. The original is untouched.
136
+ *
137
+ * Accepts any mix of `Schedule` instances and `SchedulingMember[]` arrays.
138
+ *
139
+ * Merge semantics (when merging schedules):
140
+ * - Roles: union (additive)
141
+ * - Skills: union (additive)
142
+ * - Times: additive; error on name collision
143
+ * - Coverage: additive
144
+ * - Shift patterns: additive; error on ID collision
145
+ * - Rules: additive
146
+ * - Members: additive; error on duplicate ID
147
+ *
148
+ * Validation runs eagerly: role/skill disjointness, coverage targets
149
+ * referencing declared roles/skills, member role references, etc.
150
+ */
151
+ with(...args: WithArg[]): Schedule;
152
+ /**
153
+ * Compiles, validates, solves, and parses in one call.
154
+ *
155
+ * @param client - Solver client (e.g., `new HttpSolverClient(fetch, url)`)
156
+ * @param options - Date range and optional pinned assignments
157
+ */
158
+ solve(client: SolverClient, options: SolveOptions): Promise<SolveResult>;
159
+ /**
160
+ * Diagnostic escape hatch. Compiles the schedule without solving.
161
+ *
162
+ * @param options - Date range and optional pinned assignments
163
+ */
164
+ compile(options: SolveOptions): CompilationResult & {
165
+ builder: ModelBuilder;
166
+ };
167
+ }
168
+ /**
169
+ * Create a schedule definition.
170
+ *
171
+ * Returns an immutable {@link Schedule} that can be composed via `.with()`
172
+ * and solved via `.solve()`.
173
+ *
174
+ * @example
175
+ * ```typescript
176
+ * const venue = schedule({
177
+ * roleIds: ["waiter", "runner", "manager"],
178
+ * skillIds: ["senior"],
179
+ * times: {
180
+ * lunch: time({ startTime: t(12), endTime: t(15) }),
181
+ * dinner: time(
182
+ * { startTime: t(17), endTime: t(21) },
183
+ * { startTime: t(18), endTime: t(22), dayOfWeek: weekend },
184
+ * ),
185
+ * },
186
+ * coverage: [
187
+ * cover("lunch", "waiter", 2),
188
+ * cover("dinner", "waiter", 4, { dayOfWeek: weekdays }),
189
+ * cover("dinner", "waiter", 5, { dayOfWeek: weekend }),
190
+ * cover("dinner", "manager", 1),
191
+ * ],
192
+ * shiftPatterns: [
193
+ * shift("lunch_shift", t(11, 30), t(15)),
194
+ * shift("evening", t(17), t(22)),
195
+ * ],
196
+ * rules: [
197
+ * maxHoursPerDay(10),
198
+ * maxHoursPerWeek(48),
199
+ * minRestBetweenShifts(11),
200
+ * ],
201
+ * });
202
+ * ```
203
+ *
204
+ * @category Schedule Definition
205
+ */
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;
207
+ /**
208
+ * Create a partial schedule for composition via `.with()`.
209
+ *
210
+ * Unlike {@link schedule}, all fields are optional. Use this for
211
+ * schedules that layer rules, coverage, or other config onto a
212
+ * complete base schedule.
213
+ *
214
+ * @example
215
+ * ```typescript
216
+ * const companyPolicy = partialSchedule({
217
+ * rules: [maxHoursPerWeek(40), minRestBetweenShifts(11)],
218
+ * });
219
+ *
220
+ * const ready = venue.with(companyPolicy, teamMembers);
221
+ * ```
222
+ *
223
+ * @category Schedule Definition
224
+ */
225
+ export declare function partialSchedule(config: Partial<ScheduleConfig<readonly string[], readonly string[]>>): Schedule;
226
+ export {};
227
+ //# sourceMappingURL=definition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"definition.d.ts","sourceRoot":"","sources":["../../src/schedule/definition.ts"],"names":[],"mappings":"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"}