dabke 0.81.1 → 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.
- package/CHANGELOG.md +58 -0
- package/README.md +45 -27
- package/dist/client.d.ts +20 -2
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +4 -1
- package/dist/client.js.map +1 -1
- package/dist/client.types.d.ts +9 -0
- package/dist/client.types.d.ts.map +1 -1
- package/dist/client.types.js +1 -0
- package/dist/client.types.js.map +1 -1
- package/dist/cpsat/model-builder.d.ts +9 -0
- package/dist/cpsat/model-builder.d.ts.map +1 -1
- package/dist/cpsat/model-builder.js +36 -34
- package/dist/cpsat/model-builder.js.map +1 -1
- package/dist/cpsat/response.d.ts +13 -1
- package/dist/cpsat/response.d.ts.map +1 -1
- package/dist/cpsat/response.js +4 -0
- package/dist/cpsat/response.js.map +1 -1
- package/dist/cpsat/rules/cost-utils.d.ts +11 -0
- package/dist/cpsat/rules/cost-utils.d.ts.map +1 -0
- package/dist/cpsat/rules/cost-utils.js +24 -0
- package/dist/cpsat/rules/cost-utils.js.map +1 -0
- package/dist/cpsat/rules/day-cost-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/day-cost-multiplier.js +3 -14
- package/dist/cpsat/rules/day-cost-multiplier.js.map +1 -1
- package/dist/cpsat/rules/day-cost-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/day-cost-surcharge.js +3 -7
- package/dist/cpsat/rules/day-cost-surcharge.js.map +1 -1
- package/dist/cpsat/rules/index.d.ts +3 -0
- package/dist/cpsat/rules/index.d.ts.map +1 -1
- package/dist/cpsat/rules/index.js +3 -0
- package/dist/cpsat/rules/index.js.map +1 -1
- package/dist/cpsat/rules/max-consecutive-days.d.ts.map +1 -1
- package/dist/cpsat/rules/max-consecutive-days.js +16 -2
- package/dist/cpsat/rules/max-consecutive-days.js.map +1 -1
- package/dist/cpsat/rules/max-days-week.d.ts +44 -0
- package/dist/cpsat/rules/max-days-week.d.ts.map +1 -0
- package/dist/cpsat/rules/max-days-week.js +95 -0
- package/dist/cpsat/rules/max-days-week.js.map +1 -0
- package/dist/cpsat/rules/max-hours-day.d.ts.map +1 -1
- package/dist/cpsat/rules/max-hours-day.js +15 -2
- package/dist/cpsat/rules/max-hours-day.js.map +1 -1
- package/dist/cpsat/rules/max-hours-week.d.ts.map +1 -1
- package/dist/cpsat/rules/max-hours-week.js +16 -2
- package/dist/cpsat/rules/max-hours-week.js.map +1 -1
- package/dist/cpsat/rules/max-shifts-day.d.ts.map +1 -1
- package/dist/cpsat/rules/max-shifts-day.js +15 -2
- package/dist/cpsat/rules/max-shifts-day.js.map +1 -1
- package/dist/cpsat/rules/min-consecutive-days.d.ts.map +1 -1
- package/dist/cpsat/rules/min-consecutive-days.js +15 -2
- package/dist/cpsat/rules/min-consecutive-days.js.map +1 -1
- package/dist/cpsat/rules/min-days-week.d.ts +34 -0
- package/dist/cpsat/rules/min-days-week.d.ts.map +1 -0
- package/dist/cpsat/rules/min-days-week.js +84 -0
- package/dist/cpsat/rules/min-days-week.js.map +1 -0
- package/dist/cpsat/rules/min-hours-day.d.ts.map +1 -1
- package/dist/cpsat/rules/min-hours-day.js +15 -2
- package/dist/cpsat/rules/min-hours-day.js.map +1 -1
- package/dist/cpsat/rules/min-hours-week.d.ts.map +1 -1
- package/dist/cpsat/rules/min-hours-week.js +16 -2
- package/dist/cpsat/rules/min-hours-week.js.map +1 -1
- package/dist/cpsat/rules/min-rest-between-shifts.d.ts.map +1 -1
- package/dist/cpsat/rules/min-rest-between-shifts.js +72 -2
- package/dist/cpsat/rules/min-rest-between-shifts.js.map +1 -1
- package/dist/cpsat/rules/minimize-cost.d.ts.map +1 -1
- package/dist/cpsat/rules/minimize-cost.js +2 -23
- package/dist/cpsat/rules/minimize-cost.js.map +1 -1
- package/dist/cpsat/rules/must-assign.d.ts +49 -0
- package/dist/cpsat/rules/must-assign.d.ts.map +1 -0
- package/dist/cpsat/rules/must-assign.js +86 -0
- package/dist/cpsat/rules/must-assign.js.map +1 -0
- package/dist/cpsat/rules/overtime-daily-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-daily-multiplier.js +1 -12
- package/dist/cpsat/rules/overtime-daily-multiplier.js.map +1 -1
- package/dist/cpsat/rules/overtime-daily-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-daily-surcharge.js +1 -5
- package/dist/cpsat/rules/overtime-daily-surcharge.js.map +1 -1
- package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts +5 -1
- package/dist/cpsat/rules/overtime-tiered-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-tiered-multiplier.js +1 -12
- package/dist/cpsat/rules/overtime-tiered-multiplier.js.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-multiplier.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-multiplier.js +1 -12
- package/dist/cpsat/rules/overtime-weekly-multiplier.js.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/overtime-weekly-surcharge.js +1 -5
- package/dist/cpsat/rules/overtime-weekly-surcharge.js.map +1 -1
- package/dist/cpsat/rules/registry.d.ts +28 -2
- package/dist/cpsat/rules/registry.d.ts.map +1 -1
- package/dist/cpsat/rules/registry.js +4 -1
- package/dist/cpsat/rules/registry.js.map +1 -1
- package/dist/cpsat/rules/resolver.js +2 -2
- package/dist/cpsat/rules/resolver.js.map +1 -1
- package/dist/cpsat/rules/rules.types.d.ts +3 -0
- package/dist/cpsat/rules/rules.types.d.ts.map +1 -1
- package/dist/cpsat/rules/scope.types.d.ts +18 -1
- package/dist/cpsat/rules/scope.types.d.ts.map +1 -1
- package/dist/cpsat/rules/scope.types.js +59 -16
- package/dist/cpsat/rules/scope.types.js.map +1 -1
- package/dist/cpsat/rules/time-cost-surcharge.d.ts.map +1 -1
- package/dist/cpsat/rules/time-cost-surcharge.js +2 -1
- package/dist/cpsat/rules/time-cost-surcharge.js.map +1 -1
- package/dist/cpsat/rules/time-off.d.ts.map +1 -1
- package/dist/cpsat/rules/time-off.js +6 -3
- package/dist/cpsat/rules/time-off.js.map +1 -1
- package/dist/cpsat/semantic-time.d.ts +44 -42
- package/dist/cpsat/semantic-time.d.ts.map +1 -1
- package/dist/cpsat/semantic-time.js +64 -46
- package/dist/cpsat/semantic-time.js.map +1 -1
- package/dist/cpsat/types.d.ts +37 -27
- package/dist/cpsat/types.d.ts.map +1 -1
- package/dist/cpsat/utils.d.ts.map +1 -1
- package/dist/cpsat/utils.js +7 -12
- package/dist/cpsat/utils.js.map +1 -1
- package/dist/cpsat/validation-reporter.d.ts +10 -7
- package/dist/cpsat/validation-reporter.d.ts.map +1 -1
- package/dist/cpsat/validation-reporter.js +44 -72
- package/dist/cpsat/validation-reporter.js.map +1 -1
- package/dist/cpsat/validation.types.d.ts +54 -44
- package/dist/cpsat/validation.types.d.ts.map +1 -1
- package/dist/cpsat/validation.types.js +15 -10
- package/dist/cpsat/validation.types.js.map +1 -1
- package/dist/datetime.utils.d.ts +3 -203
- package/dist/datetime.utils.d.ts.map +1 -1
- package/dist/datetime.utils.js +1 -288
- package/dist/datetime.utils.js.map +1 -1
- package/dist/index.d.ts +14 -83
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -83
- package/dist/index.js.map +1 -1
- package/dist/schedule/cost.d.ts +204 -0
- package/dist/schedule/cost.d.ts.map +1 -0
- package/dist/schedule/cost.js +187 -0
- package/dist/schedule/cost.js.map +1 -0
- package/dist/schedule/coverage.d.ts +85 -0
- package/dist/schedule/coverage.d.ts.map +1 -0
- package/dist/schedule/coverage.js +33 -0
- package/dist/schedule/coverage.js.map +1 -0
- package/dist/schedule/definition.d.ts +227 -0
- package/dist/schedule/definition.d.ts.map +1 -0
- package/dist/schedule/definition.js +659 -0
- package/dist/schedule/definition.js.map +1 -0
- package/dist/schedule/index.d.ts +67 -0
- package/dist/schedule/index.d.ts.map +1 -0
- package/dist/schedule/index.js +69 -0
- package/dist/schedule/index.js.map +1 -0
- package/dist/schedule/rules.d.ts +353 -0
- package/dist/schedule/rules.d.ts.map +1 -0
- package/dist/schedule/rules.js +352 -0
- package/dist/schedule/rules.js.map +1 -0
- package/dist/schedule/shift-patterns.d.ts +34 -0
- package/dist/schedule/shift-patterns.d.ts.map +1 -0
- package/dist/schedule/shift-patterns.js +41 -0
- package/dist/schedule/shift-patterns.js.map +1 -0
- package/dist/schedule/time-periods.d.ts +69 -0
- package/dist/schedule/time-periods.d.ts.map +1 -0
- package/dist/schedule/time-periods.js +91 -0
- package/dist/schedule/time-periods.js.map +1 -0
- package/dist/types.d.ts +14 -78
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/package.json +4 -9
- package/solver/src/solver/app.py +1 -1
- package/solver/src/solver/solver.py +7 -4
- package/src/client.ts +6 -8
- package/src/client.types.ts +9 -0
- package/src/cpsat/model-builder.ts +44 -35
- package/src/cpsat/response.ts +13 -1
- package/src/cpsat/rules/cost-utils.ts +25 -0
- package/src/cpsat/rules/day-cost-multiplier.ts +3 -14
- package/src/cpsat/rules/day-cost-surcharge.ts +3 -8
- package/src/cpsat/rules/index.ts +3 -0
- package/src/cpsat/rules/max-consecutive-days.ts +17 -0
- package/src/cpsat/rules/max-days-week.ts +143 -0
- package/src/cpsat/rules/max-hours-day.ts +21 -1
- package/src/cpsat/rules/max-hours-week.ts +22 -1
- package/src/cpsat/rules/max-shifts-day.ts +21 -1
- package/src/cpsat/rules/min-consecutive-days.ts +16 -1
- package/src/cpsat/rules/min-days-week.ts +120 -0
- package/src/cpsat/rules/min-hours-day.ts +16 -1
- package/src/cpsat/rules/min-hours-week.ts +17 -1
- package/src/cpsat/rules/min-rest-between-shifts.ts +92 -2
- package/src/cpsat/rules/minimize-cost.ts +2 -29
- package/src/cpsat/rules/must-assign.ts +108 -0
- package/src/cpsat/rules/overtime-daily-multiplier.ts +1 -12
- package/src/cpsat/rules/overtime-daily-surcharge.ts +1 -6
- package/src/cpsat/rules/overtime-tiered-multiplier.ts +6 -13
- package/src/cpsat/rules/overtime-weekly-multiplier.ts +1 -12
- package/src/cpsat/rules/overtime-weekly-surcharge.ts +1 -6
- package/src/cpsat/rules/registry.ts +8 -2
- package/src/cpsat/rules/resolver.ts +2 -2
- package/src/cpsat/rules/rules.types.ts +3 -0
- package/src/cpsat/rules/scope.types.ts +73 -20
- package/src/cpsat/rules/time-cost-surcharge.ts +2 -1
- package/src/cpsat/rules/time-off.ts +6 -2
- package/src/cpsat/semantic-time.ts +115 -91
- package/src/cpsat/types.ts +37 -27
- package/src/cpsat/utils.ts +8 -12
- package/src/cpsat/validation-reporter.ts +51 -82
- package/src/cpsat/validation.types.ts +72 -47
- package/src/datetime.utils.ts +3 -334
- package/src/index.ts +35 -107
- package/src/schedule/cost.ts +242 -0
- package/src/schedule/coverage.ts +135 -0
- package/src/schedule/definition.ts +958 -0
- package/src/schedule/index.ts +112 -0
- package/src/schedule/rules.ts +529 -0
- package/src/schedule/shift-patterns.ts +46 -0
- package/src/schedule/time-periods.ts +110 -0
- package/src/types.ts +14 -88
- package/dist/errors.d.ts +0 -12
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -17
- package/dist/errors.js.map +0 -1
- package/dist/llms.d.ts +0 -2
- package/dist/llms.d.ts.map +0 -1
- package/dist/llms.js +0 -3
- package/dist/llms.js.map +0 -1
- package/dist/schedule.d.ts +0 -724
- package/dist/schedule.d.ts.map +0 -1
- package/dist/schedule.js +0 -899
- package/dist/schedule.js.map +0 -1
- package/dist/validation.d.ts +0 -105
- package/dist/validation.d.ts.map +0 -1
- package/dist/validation.js +0 -130
- package/dist/validation.js.map +0 -1
- package/llms.txt +0 -925
- package/src/errors.ts +0 -17
- package/src/llms.ts +0 -3
- package/src/schedule.ts +0 -1419
- package/src/validation.ts +0 -188
package/src/validation.ts
DELETED
|
@@ -1,188 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Validation utilities for scheduling configuration.
|
|
3
|
-
*
|
|
4
|
-
* These functions help catch configuration errors early, before the ModelBuilder
|
|
5
|
-
* attempts to compile the scheduling problem. This is especially useful when
|
|
6
|
-
* configuration is generated by an LLM, which may hallucinate role or skill names.
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
import type { CoverageRequirement, SchedulingMember } from "./cpsat/types.js";
|
|
10
|
-
|
|
11
|
-
/**
|
|
12
|
-
* Result of coverage role validation.
|
|
13
|
-
*/
|
|
14
|
-
export interface CoverageValidationResult {
|
|
15
|
-
valid: boolean;
|
|
16
|
-
/** Role IDs used in coverage that don't match any team member */
|
|
17
|
-
unknownRoles: string[];
|
|
18
|
-
/** Role IDs used in coverage that match team members */
|
|
19
|
-
knownRoles: string[];
|
|
20
|
-
}
|
|
21
|
-
|
|
22
|
-
/**
|
|
23
|
-
* Validates that all roles used in coverage requirements match the team.
|
|
24
|
-
*
|
|
25
|
-
* This catches a common LLM error where the model generates coverage requirements
|
|
26
|
-
* using role names that don't match any team member's roles. Without this validation,
|
|
27
|
-
* such mismatches would result in valid but semantically wrong schedules (e.g.,
|
|
28
|
-
* coverage requirements that no one can satisfy).
|
|
29
|
-
*
|
|
30
|
-
* @example
|
|
31
|
-
* ```typescript
|
|
32
|
-
* const members = [
|
|
33
|
-
* { id: "alice", roles: ["cashier"] },
|
|
34
|
-
* { id: "bob", roles: ["stocker"] },
|
|
35
|
-
* ];
|
|
36
|
-
*
|
|
37
|
-
* const coverage = [
|
|
38
|
-
* { roles: ["cashier"], targetCount: 1, ... }, // OK
|
|
39
|
-
* { roles: ["worker"], targetCount: 1, ... }, // Unknown role!
|
|
40
|
-
* ];
|
|
41
|
-
*
|
|
42
|
-
* const result = validateCoverageRoles(coverage, members);
|
|
43
|
-
* // result.valid = false
|
|
44
|
-
* // result.unknownRoles = ["worker"]
|
|
45
|
-
* // result.knownRoles = ["cashier"]
|
|
46
|
-
* ```
|
|
47
|
-
*/
|
|
48
|
-
export function validateCoverageRoles(
|
|
49
|
-
coverage: CoverageRequirement[],
|
|
50
|
-
members: SchedulingMember[],
|
|
51
|
-
): CoverageValidationResult {
|
|
52
|
-
const memberRoles = new Set(members.flatMap((e) => e.roles));
|
|
53
|
-
const coverageRoles = new Set(coverage.flatMap((c) => c.roles ?? []));
|
|
54
|
-
|
|
55
|
-
const unknownRoles: string[] = [];
|
|
56
|
-
const knownRoles: string[] = [];
|
|
57
|
-
|
|
58
|
-
for (const role of coverageRoles) {
|
|
59
|
-
if (memberRoles.has(role)) {
|
|
60
|
-
knownRoles.push(role);
|
|
61
|
-
} else {
|
|
62
|
-
unknownRoles.push(role);
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
return {
|
|
67
|
-
valid: unknownRoles.length === 0,
|
|
68
|
-
unknownRoles: unknownRoles.toSorted(),
|
|
69
|
-
knownRoles: knownRoles.toSorted(),
|
|
70
|
-
};
|
|
71
|
-
}
|
|
72
|
-
|
|
73
|
-
/**
|
|
74
|
-
* Result of coverage skill validation.
|
|
75
|
-
*/
|
|
76
|
-
export interface SkillValidationResult {
|
|
77
|
-
valid: boolean;
|
|
78
|
-
/** Skill IDs used in coverage that don't match any team member */
|
|
79
|
-
unknownSkills: string[];
|
|
80
|
-
/** Skill IDs used in coverage that match team members */
|
|
81
|
-
knownSkills: string[];
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
/**
|
|
85
|
-
* Validates that all skills used in coverage requirements match the team.
|
|
86
|
-
*
|
|
87
|
-
* Similar to role validation, this catches LLM hallucinations where skill names
|
|
88
|
-
* in coverage don't match any team member's skills.
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```typescript
|
|
92
|
-
* const members = [
|
|
93
|
-
* { id: "alice", roles: ["server"], skills: ["keyholder"] },
|
|
94
|
-
* { id: "bob", roles: ["server"] },
|
|
95
|
-
* ];
|
|
96
|
-
*
|
|
97
|
-
* const coverage = [
|
|
98
|
-
* { skills: ["keyholder"], targetCount: 1, ... }, // OK
|
|
99
|
-
* { skills: ["manager"], targetCount: 1, ... }, // Unknown skill!
|
|
100
|
-
* ];
|
|
101
|
-
*
|
|
102
|
-
* const result = validateCoverageSkills(coverage, members);
|
|
103
|
-
* // result.valid = false
|
|
104
|
-
* // result.unknownSkills = ["manager"]
|
|
105
|
-
* ```
|
|
106
|
-
*/
|
|
107
|
-
export function validateCoverageSkills(
|
|
108
|
-
coverage: CoverageRequirement[],
|
|
109
|
-
members: SchedulingMember[],
|
|
110
|
-
): SkillValidationResult {
|
|
111
|
-
const memberSkills = new Set(members.flatMap((e) => e.skills ?? []));
|
|
112
|
-
const coverageSkills = new Set(coverage.flatMap((c) => c.skills ?? []));
|
|
113
|
-
|
|
114
|
-
const unknownSkills: string[] = [];
|
|
115
|
-
const knownSkills: string[] = [];
|
|
116
|
-
|
|
117
|
-
for (const skill of coverageSkills) {
|
|
118
|
-
if (memberSkills.has(skill)) {
|
|
119
|
-
knownSkills.push(skill);
|
|
120
|
-
} else {
|
|
121
|
-
unknownSkills.push(skill);
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
return {
|
|
126
|
-
valid: unknownSkills.length === 0,
|
|
127
|
-
unknownSkills: unknownSkills.toSorted(),
|
|
128
|
-
knownSkills: knownSkills.toSorted(),
|
|
129
|
-
};
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
/**
|
|
133
|
-
* Combined validation result for coverage requirements.
|
|
134
|
-
*/
|
|
135
|
-
export interface CoverageConfigValidationResult {
|
|
136
|
-
valid: boolean;
|
|
137
|
-
roles: CoverageValidationResult;
|
|
138
|
-
skills: SkillValidationResult;
|
|
139
|
-
/** Human-readable error messages */
|
|
140
|
-
errors: string[];
|
|
141
|
-
}
|
|
142
|
-
|
|
143
|
-
/**
|
|
144
|
-
* Validates coverage requirements against team roles and skills.
|
|
145
|
-
*
|
|
146
|
-
* This is the primary validation function to call before building a scheduling model.
|
|
147
|
-
* It checks both roles and skills, returning a combined result with error messages.
|
|
148
|
-
*
|
|
149
|
-
* @example
|
|
150
|
-
* ```typescript
|
|
151
|
-
* const result = validateCoverageConfig(coverage, members);
|
|
152
|
-
* if (!result.valid) {
|
|
153
|
-
* throw new Error(result.errors.join("; "));
|
|
154
|
-
* }
|
|
155
|
-
* ```
|
|
156
|
-
*/
|
|
157
|
-
export function validateCoverageConfig(
|
|
158
|
-
coverage: CoverageRequirement[],
|
|
159
|
-
members: SchedulingMember[],
|
|
160
|
-
): CoverageConfigValidationResult {
|
|
161
|
-
const roles = validateCoverageRoles(coverage, members);
|
|
162
|
-
const skills = validateCoverageSkills(coverage, members);
|
|
163
|
-
|
|
164
|
-
const errors: string[] = [];
|
|
165
|
-
|
|
166
|
-
if (!roles.valid) {
|
|
167
|
-
const availableRoles = [...new Set(members.flatMap((e) => e.roles))].toSorted();
|
|
168
|
-
errors.push(
|
|
169
|
-
`Coverage uses unknown roles: ${roles.unknownRoles.join(", ")}. ` +
|
|
170
|
-
`Available roles: ${availableRoles.join(", ")}`,
|
|
171
|
-
);
|
|
172
|
-
}
|
|
173
|
-
|
|
174
|
-
if (!skills.valid) {
|
|
175
|
-
const availableSkills = [...new Set(members.flatMap((e) => e.skills ?? []))].toSorted();
|
|
176
|
-
errors.push(
|
|
177
|
-
`Coverage uses unknown skills: ${skills.unknownSkills.join(", ")}. ` +
|
|
178
|
-
`Available skills: ${availableSkills.length > 0 ? availableSkills.join(", ") : "(none)"}`,
|
|
179
|
-
);
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
return {
|
|
183
|
-
valid: roles.valid && skills.valid,
|
|
184
|
-
roles,
|
|
185
|
-
skills,
|
|
186
|
-
errors,
|
|
187
|
-
};
|
|
188
|
-
}
|