@solvice/routing 0.19.1-beta.0 → 0.19.3-beta.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 (3) hide show
  1. package/dist/runs.d.ts +97 -45
  2. package/dist/v3.d.ts +129 -57
  3. package/package.json +1 -1
package/dist/runs.d.ts CHANGED
@@ -258,7 +258,7 @@ export interface components {
258
258
  * New values may be added; clients must accept unknown values and handle
259
259
  * them generically, for example by showing `message`.
260
260
  *
261
- * Known values: `unreachable`, `max_leg_travel`, `required_skills`, `serves_tags`, `capacity`, `time_window`, `eligible_vehicles`, `shift_end`, `max_distance`, `max_route_duration`, `max_stops`, `sequence`, `tag_order`, `shipment`, `break`, `multi_trip`, `same_vehicle`, `same_day`, `same_route`, `compatible_vehicles`, `synchronized`, `time_lag`, `all_or_none`, `period_limit`, `quota`, `unknown`. An open set: a later release may add values, so accept any string and handle the ones you know.
261
+ * Known values: `unreachable`, `max_leg_travel`, `required_skills`, `serves_tags`, `capacity`, `time_window`, `eligible_vehicles`, `shift_end`, `max_distance`, `max_route_duration`, `max_stops`, `sequence`, `tag_order`, `shipment`, `break`, `multi_trip`, `unload_before_end`, `same_vehicle`, `same_day`, `same_route`, `compatible_vehicles`, `synchronized`, `time_lag`, `all_or_none`, `period_limit`, `quota`, `max_intake`, `unknown`. An open set: a later release may add values, so accept any string and handle the ones you know.
262
262
  * @example capacity
263
263
  */
264
264
  ConstraintCode: string;
@@ -365,6 +365,24 @@ export interface components {
365
365
  id: string;
366
366
  /** @description Where the depot is. */
367
367
  location: components["schemas"]["Place"];
368
+ /**
369
+ * @description The most load the depot may receive across the whole request, per
370
+ * named dimension: a tip site's intake limit. Not per day: it sums every
371
+ * shift of every day.
372
+ *
373
+ * Counted is the load on board on arrival at each reload here (including
374
+ * a shift's `initial_load` on its first trip and the final tip of
375
+ * `unload_before_end`), plus the load on board at the end of a shift
376
+ * whose `end` is this depot (not with `unload_before_end`, which unloads
377
+ * at a reload first). A shift's start never counts, and an unused shift
378
+ * receives nothing. A dimension left out is uncapped; `0` means the
379
+ * depot takes none of it. A hard limit: a task that would overfill every
380
+ * depot its trip can tip at stays unassigned (reason `max_intake`).
381
+ *
382
+ * Each dimension must be one a task or vehicle declares, and some shift
383
+ * must reload here, or end here without `unload_before_end`.
384
+ */
385
+ max_intake?: null | components["schemas"]["Quantities"];
368
386
  /**
369
387
  * Format: double
370
388
  * @description Money charged once per reload visit, in the objective's currency.
@@ -628,10 +646,10 @@ export interface components {
628
646
  */
629
647
  preferences?: components["schemas"]["VehiclePreference"][] | null;
630
648
  /**
631
- * Format: int32
649
+ * Format: uint32
632
650
  * @description Importance of a must-serve task when not all of them fit: the solver
633
- * maximises the summed `priority` of served tasks before any cost. `>= 1`,
634
- * default `1` (maximise the count). A rank, not money — it never makes a
651
+ * maximises the summed `priority` of served tasks before any cost. `1` to
652
+ * `4294967295`, default `1` (maximise the count). A rank, not money — it never makes a
635
653
  * task droppable; use `drop_cost` for that. Both set is a 400.
636
654
  * @example 3
637
655
  */
@@ -690,7 +708,10 @@ export interface components {
690
708
  tags?: string[] | null;
691
709
  /**
692
710
  * @description Soft target for this task, measured at its arrival (default) or
693
- * departure. On a shipment it is measured on the **delivery** leg.
711
+ * departure. On a shipment it is measured on the **delivery** leg and
712
+ * cannot be combined with `delivery.target` (HTTP 400
713
+ * `conflicting_fields`); `pickup.target` adds a separate target on the
714
+ * pickup leg.
694
715
  */
695
716
  target?: null | components["schemas"]["Target"];
696
717
  /** @description Time windows for this visit. */
@@ -819,7 +840,7 @@ export interface components {
819
840
  */
820
841
  max_route_duration_s?: number | null;
821
842
  /**
822
- * Format: int32
843
+ * Format: uint32
823
844
  * @description Hard cap on served stops across the period's shifts; a job counts as
824
845
  * one stop. Start, end, break and reload stops in `routes[].stops` do not
825
846
  * count; a shipment counts as two stops.
@@ -865,7 +886,7 @@ export interface components {
865
886
  */
866
887
  PlanRoute: {
867
888
  /**
868
- * Format: int32
889
+ * Format: uint32
869
890
  * @description On solve, the first `locked_count` stops stay where they are (already
870
891
  * dispatched). Counts every listed stop. Cannot be combined with a
871
892
  * `reload` stop, and must not exceed the route's stop count — both are
@@ -1108,7 +1129,7 @@ export interface components {
1108
1129
  */
1109
1130
  id: string;
1110
1131
  /**
1111
- * Format: int32
1132
+ * Format: uint32
1112
1133
  * @description The cap on counted stops; a job counts as one stop.
1113
1134
  * Start, end, break and reload stops in `routes[].stops` do not count; a
1114
1135
  * shipment counts as two stops.
@@ -1152,8 +1173,10 @@ export interface components {
1152
1173
  * its pickup. A shipment's own id in `stops`, or a shipment carrying the
1153
1174
  * `tag` of a `same_vehicle` or `same_day` relation, is rejected with HTTP 400
1154
1175
  * `not_supported`: relations never silently skip a member. `same_route`,
1155
- * `time_lag`, `compatible_vehicles`, `all_or_none` and `tag_order` reject a
1156
- * shipment with HTTP 400 as well.
1176
+ * `time_lag`, `compatible_vehicles` and `tag_order` reject a shipment with
1177
+ * HTTP 400 as well. `all_or_none` alone takes a shipment's own id, naming both
1178
+ * legs, in a group that is exactly one `consecutive` chain; such a chain may
1179
+ * also be jobs only.
1157
1180
  * @example {
1158
1181
  * "stops": [
1159
1182
  * "job-1",
@@ -1166,20 +1189,25 @@ export interface components {
1166
1189
  /**
1167
1190
  * All or none
1168
1191
  * @description All or none: either every member in `stops` is served, or none is.
1169
- * Sets no timing; combine with `synchronized` or `time_lag` for when.
1170
- * Hard. Overlapping `all_or_none` relations chain: one on A and B plus
1192
+ * Sets no timing; a coupled group takes its timing from the
1193
+ * `synchronized` or `time_lag` relation that names its members. Hard.
1194
+ * Overlapping `all_or_none` relations chain: one on A and B plus
1171
1195
  * one on B and C serve all three together or none of them. A group with
1172
1196
  * a task in a vehicle's locked prefix (`plan.routes[].locked_count`) is
1173
1197
  * exempt. A member that could be served but is held back because
1174
1198
  * another cannot reports `all_or_none` in `unassigned[].reasons`.
1175
1199
  *
1176
- * Every task must also be named by a `synchronized` or `time_lag`
1177
- * relation; a task named by neither is rejected with HTTP 400.
1200
+ * A member may be a shipment id (both legs). Members are coupled by
1201
+ * `synchronized`/`time_lag`, or the group's stops (a shipment as its two
1202
+ * legs) are exactly one `consecutive` chain with no member coupled by
1203
+ * `synchronized` or `time_lag`, directly or through a `sequence` or
1204
+ * `consecutive` relation. A task named by neither is rejected with HTTP 400, as is a
1205
+ * shipment-leg id: name the shipment.
1178
1206
  */
1179
1207
  RelationAllOrNone: {
1180
1208
  /**
1181
- * @description Job ids, at least two. A shipment's own id or a shipment-leg stop id
1182
- * is rejected with HTTP 400.
1209
+ * @description Job ids or shipment ids, at least two. A shipment-leg stop id is
1210
+ * rejected with HTTP 400.
1183
1211
  * @example [
1184
1212
  * "job-1",
1185
1213
  * "job-2"
@@ -1227,6 +1255,7 @@ export interface components {
1227
1255
  * route. A member that is unassigned is skipped, so only listed
1228
1256
  * neighbours that are both served are adjacent. Members on different
1229
1257
  * routes are unconstrained; add `same_route` to keep them together.
1258
+ * Put a chain in an `all_or_none` to serve it whole or not at all.
1230
1259
  */
1231
1260
  RelationConsecutive: {
1232
1261
  /**
@@ -1483,14 +1512,14 @@ export interface components {
1483
1512
  /** @description One problem in a request. */
1484
1513
  RequestIssue: {
1485
1514
  /**
1486
- * Format: int64
1515
+ * Format: uint64
1487
1516
  * @description `limit_exceeded` only: the count this request has.
1488
1517
  */
1489
1518
  actual?: number | null;
1490
1519
  /** @description What is wrong. */
1491
1520
  code: components["schemas"]["ErrorItemCode"];
1492
1521
  /**
1493
- * Format: int64
1522
+ * Format: uint64
1494
1523
  * @description `limit_exceeded` only: the published cap.
1495
1524
  */
1496
1525
  limit?: number | null;
@@ -1819,9 +1848,9 @@ export interface components {
1819
1848
  * @description Seconds past this task's `target.at`, measured at the stop's arrival
1820
1849
  * (plus any `windowed` break taken on arrival there, idle before it
1821
1850
  * included) or departure per `target.on`; `0` when met. Present only on a task
1822
- * stop carrying a target. A shipment's target is measured on its
1823
- * delivery leg, so it appears on the `:delivery` stop and never on the
1824
- * `:pickup` stop.
1851
+ * stop carrying a target. A shipment's own `target` is measured on its
1852
+ * delivery leg, so it appears on the `:delivery` stop; a `pickup.target`
1853
+ * or `delivery.target` appears on that leg's stop.
1825
1854
  * @example 0
1826
1855
  */
1827
1856
  target_lateness_s?: number | null;
@@ -1977,7 +2006,7 @@ export interface components {
1977
2006
  */
1978
2007
  polyline?: null | components["schemas"]["PolylineDetail"];
1979
2008
  /**
1980
- * Format: int64
2009
+ * Format: uint64
1981
2010
  * @description Random seed for the search. Default `42`: omitting it is the same as
1982
2011
  * sending `42`, so send different values to explore different plans.
1983
2012
  * Repeated runs on one machine usually return an identical plan; a
@@ -2239,7 +2268,7 @@ export interface components {
2239
2268
  */
2240
2269
  unassigned_priority: number;
2241
2270
  /**
2242
- * Format: int32
2271
+ * Format: uint32
2243
2272
  * @description How many hard-constraint violations the plan has (the `violations`
2244
2273
  * arrays on routes and stops list them). Always `0` on a solve result.
2245
2274
  * @example 0
@@ -2379,7 +2408,7 @@ export interface components {
2379
2408
  /** @description How the search behind a plan ended. */
2380
2409
  SearchInfo: {
2381
2410
  /**
2382
- * Format: int64
2411
+ * Format: uint64
2383
2412
  * @description Search iterations performed. `0` when nothing was searched.
2384
2413
  * @example 48210
2385
2414
  */
@@ -2405,7 +2434,7 @@ export interface components {
2405
2434
  */
2406
2435
  cost: number;
2407
2436
  /**
2408
- * Format: int64
2437
+ * Format: uint64
2409
2438
  * @description Milliseconds since the search started (the clock of
2410
2439
  * `summary.timings.search_ms`).
2411
2440
  */
@@ -2550,10 +2579,11 @@ export interface components {
2550
2579
  /**
2551
2580
  * Format: int32
2552
2581
  * @description Maximum trips (depot legs) in this shift, across all reload depots.
2553
- * Counts trips, not reloads: `trips = reloads_used + 1`. `max_trips: 1`
2554
- * means a single trip — reloads are permitted in `reloads` but the cap
2555
- * prevents ever using one. `reloads` present with `max_trips` absent
2556
- * means unlimited trips. A single reload depot can only be
2582
+ * Counts trips, not reloads: `trips = reloads_used + 1`, where the final
2583
+ * unload of `unload_before_end` is not counted. `max_trips: 1` means a
2584
+ * single trip — reloads are permitted in `reloads` but the cap prevents
2585
+ * ever using one, other than that final unload. `reloads` present with
2586
+ * `max_trips` absent means unlimited trips. A single reload depot can only be
2557
2587
  * revisited up to 8 times per shift regardless of `max_trips`;
2558
2588
  * a `max_trips` beyond that against one depot
2559
2589
  * is accepted but the extra headroom is unreachable — list more than
@@ -2627,6 +2657,16 @@ export interface components {
2627
2657
  * @example 2026-07-01T17:00:00+02:00
2628
2658
  */
2629
2659
  to: string;
2660
+ /**
2661
+ * @description When `true`, a route that would end with load on board first unloads
2662
+ * at one of this shift's `reloads` depots: a final `reload` stop, at the
2663
+ * depot the solver finds cheapest, taking that depot's
2664
+ * `service_duration_s` and `per_reload`. It does not count toward
2665
+ * `max_trips`. A route whose last trip carries no load ends without one.
2666
+ * `true` without `reloads` is rejected with HTTP 400
2667
+ * `conflicting_fields`. Default `false`.
2668
+ */
2669
+ unload_before_end?: boolean | null;
2630
2670
  };
2631
2671
  /**
2632
2672
  * @description The `Costs` fields for one shift, minus `per_used_vehicle`. A shift is one
@@ -2696,7 +2736,7 @@ export interface components {
2696
2736
  */
2697
2737
  max_route_duration_s?: number | null;
2698
2738
  /**
2699
- * Format: int32
2739
+ * Format: uint32
2700
2740
  * @description Maximum stops served in this shift; a job counts as one stop.
2701
2741
  * Start, end, break and reload stops in `routes[].stops` do not count; a
2702
2742
  * shipment counts as two stops.
@@ -2825,10 +2865,10 @@ export interface components {
2825
2865
  */
2826
2866
  preferences?: components["schemas"]["VehiclePreference"][] | null;
2827
2867
  /**
2828
- * Format: int32
2868
+ * Format: uint32
2829
2869
  * @description Importance of a must-serve task when not all of them fit: the solver
2830
- * maximises the summed `priority` of served tasks before any cost. `>= 1`,
2831
- * default `1` (maximise the count). A rank, not money — it never makes a
2870
+ * maximises the summed `priority` of served tasks before any cost. `1` to
2871
+ * `4294967295`, default `1` (maximise the count). A rank, not money — it never makes a
2832
2872
  * task droppable; use `drop_cost` for that. Both set is a 400.
2833
2873
  * @example 3
2834
2874
  */
@@ -2862,7 +2902,10 @@ export interface components {
2862
2902
  tags?: string[] | null;
2863
2903
  /**
2864
2904
  * @description Soft target for this task, measured at its arrival (default) or
2865
- * departure. On a shipment it is measured on the **delivery** leg.
2905
+ * departure. On a shipment it is measured on the **delivery** leg and
2906
+ * cannot be combined with `delivery.target` (HTTP 400
2907
+ * `conflicting_fields`); `pickup.target` adds a separate target on the
2908
+ * pickup leg.
2866
2909
  */
2867
2910
  target?: null | components["schemas"]["Target"];
2868
2911
  };
@@ -2920,6 +2963,14 @@ export interface components {
2920
2963
  * @example 60
2921
2964
  */
2922
2965
  setup_duration_s?: number | null;
2966
+ /**
2967
+ * @description Soft target for this leg, measured at its arrival (default) or
2968
+ * departure. Same type, units and validation as the task-level
2969
+ * `target`. The shipment's own `target` is measured on the delivery
2970
+ * leg, so sending it with `delivery.target` is rejected with HTTP 400
2971
+ * (`conflicting_fields`).
2972
+ */
2973
+ target?: null | components["schemas"]["Target"];
2923
2974
  /** @description Time windows for this stop. */
2924
2975
  time_windows?: components["schemas"]["TimeWindow"][] | null;
2925
2976
  };
@@ -3221,7 +3272,7 @@ export interface components {
3221
3272
  /** @description How the search ended. */
3222
3273
  search: components["schemas"]["SearchInfo"];
3223
3274
  /**
3224
- * Format: int32
3275
+ * Format: uint32
3225
3276
  * @description Routes with at least one task stop: one per used shift.
3226
3277
  * @example 1
3227
3278
  */
@@ -3245,7 +3296,7 @@ export interface components {
3245
3296
  */
3246
3297
  travel_estimated?: boolean;
3247
3298
  /**
3248
- * Format: int32
3299
+ * Format: uint32
3249
3300
  * @description Distinct vehicles with at least one route.
3250
3301
  * @example 1
3251
3302
  */
@@ -3324,17 +3375,17 @@ export interface components {
3324
3375
  */
3325
3376
  TaskCounts: {
3326
3377
  /**
3327
- * Format: int32
3378
+ * Format: uint32
3328
3379
  * @description Tasks on a route.
3329
3380
  */
3330
3381
  served: number;
3331
3382
  /**
3332
- * Format: int32
3383
+ * Format: uint32
3333
3384
  * @description Tasks on no route: the length of `unassigned`.
3334
3385
  */
3335
3386
  unassigned: number;
3336
3387
  /**
3337
- * Format: int32
3388
+ * Format: uint32
3338
3389
  * @description The unassigned tasks that carry no `drop_cost`: tasks the plan was
3339
3390
  * required to serve and did not.
3340
3391
  */
@@ -3493,13 +3544,13 @@ export interface components {
3493
3544
  */
3494
3545
  Timings: {
3495
3546
  /**
3496
- * Format: int64
3547
+ * Format: uint64
3497
3548
  * @description Time spent in the search. Absent on `/evaluate`, which runs none, and
3498
3549
  * on `/suggest`, which has no separate search figure.
3499
3550
  */
3500
3551
  search_ms?: number | null;
3501
3552
  /**
3502
- * Format: int64
3553
+ * Format: uint64
3503
3554
  * @description From the request's arrival to the end of the search (of the scoring,
3504
3555
  * on `/evaluate`; of the suggestion search, on `/suggest`): fetching
3505
3556
  * travel times and waiting for capacity included, building the response
@@ -3846,7 +3897,7 @@ export interface components {
3846
3897
  */
3847
3898
  max_route_duration_s?: number | null;
3848
3899
  /**
3849
- * Format: int32
3900
+ * Format: uint32
3850
3901
  * @description Maximum stops served per shift; a job counts as one stop.
3851
3902
  * Start, end, break and reload stops in `routes[].stops` do not count; a
3852
3903
  * shipment counts as two stops.
@@ -3931,15 +3982,16 @@ export interface components {
3931
3982
  */
3932
3983
  code: components["schemas"]["ConstraintCode"];
3933
3984
  /**
3934
- * @description The capacity dimension over its limit. Only on `capacity`.
3985
+ * @description The capacity dimension over its limit. Only on `capacity`,
3986
+ * `unload_before_end` and `max_intake`.
3935
3987
  * @example weight
3936
3988
  */
3937
3989
  dimension?: string | null;
3938
3990
  /**
3939
3991
  * Format: int64
3940
3992
  * @description How far over the limit, in `unit`. On `capacity`, `time_window` (the
3941
- * seconds late), `shift_end`, `max_distance`, `max_route_duration` and
3942
- * `quota`.
3993
+ * seconds late), `shift_end`, `max_distance`, `max_route_duration`,
3994
+ * `quota`, `unload_before_end` and `max_intake`.
3943
3995
  * @example 15
3944
3996
  */
3945
3997
  excess?: number | null;
package/dist/v3.d.ts CHANGED
@@ -54,7 +54,7 @@ export interface paths {
54
54
  put?: never;
55
55
  /**
56
56
  * Suggest best insertions for the tasks outside the plan
57
- * @description Takes the same body as `POST /v3/routing/evaluate` (`problem` + committed `plan`), plus optional `options`. Every task of `problem` that is not in `plan` is a task to place: finds its feasible insertion positions and returns them as `insertions`, ranked by `delta.cost`, the change in the plan's cost in money. Each insertion lists the stops it adds (`placements`) and every plan route it changes, whole (`routes`): swap those routes into `plan` to apply it. An empty `insertions` carries a `reason` whose `code` is `time_limit`, `candidates_exhausted` or `infeasible` (an open set) and whose `message` says the same in English. The committed plan is never modified. Limitation: suggest never opens a new reload trip on a multi-trip vehicle.
57
+ * @description Takes the same body as `POST /v3/routing/evaluate` (`problem` + committed `plan`), plus optional `options`. Every task of `problem` that is not in `plan` is a task to place: finds its feasible insertion positions and returns them as `insertions`, ranked by `delta.cost`, the change in the plan's cost in money. The members of a `synchronized` or `time_lag` group outside `plan` are one task to place: each insertion places every member, and with the default `on: service_start` a crew's members start within `max_spread_s` of one another (`service_start`); a `time_lag` keeps its lag. Each insertion lists the stops it adds (`placements`) and every plan route it changes, whole (`routes`): swap those routes into `plan` to apply it. An empty `insertions` carries a `reason` whose `code` is `time_limit`, `candidates_exhausted` or `infeasible` (an open set) and whose `message` says the same in English. The committed plan is never modified. Limitation: suggest never opens a new reload trip on a multi-trip vehicle.
58
58
  */
59
59
  post: operations["suggest"];
60
60
  delete?: never;
@@ -296,7 +296,7 @@ export interface components {
296
296
  * New values may be added; clients must accept unknown values and handle
297
297
  * them generically, for example by showing `message`.
298
298
  *
299
- * Known values: `unreachable`, `max_leg_travel`, `required_skills`, `serves_tags`, `capacity`, `time_window`, `eligible_vehicles`, `shift_end`, `max_distance`, `max_route_duration`, `max_stops`, `sequence`, `tag_order`, `shipment`, `break`, `multi_trip`, `same_vehicle`, `same_day`, `same_route`, `compatible_vehicles`, `synchronized`, `time_lag`, `all_or_none`, `period_limit`, `quota`, `unknown`. An open set: a later release may add values, so accept any string and handle the ones you know.
299
+ * Known values: `unreachable`, `max_leg_travel`, `required_skills`, `serves_tags`, `capacity`, `time_window`, `eligible_vehicles`, `shift_end`, `max_distance`, `max_route_duration`, `max_stops`, `sequence`, `tag_order`, `shipment`, `break`, `multi_trip`, `unload_before_end`, `same_vehicle`, `same_day`, `same_route`, `compatible_vehicles`, `synchronized`, `time_lag`, `all_or_none`, `period_limit`, `quota`, `max_intake`, `unknown`. An open set: a later release may add values, so accept any string and handle the ones you know.
300
300
  * @example capacity
301
301
  */
302
302
  ConstraintCode: string;
@@ -403,6 +403,24 @@ export interface components {
403
403
  id: string;
404
404
  /** @description Where the depot is. */
405
405
  location: components["schemas"]["Place"];
406
+ /**
407
+ * @description The most load the depot may receive across the whole request, per
408
+ * named dimension: a tip site's intake limit. Not per day: it sums every
409
+ * shift of every day.
410
+ *
411
+ * Counted is the load on board on arrival at each reload here (including
412
+ * a shift's `initial_load` on its first trip and the final tip of
413
+ * `unload_before_end`), plus the load on board at the end of a shift
414
+ * whose `end` is this depot (not with `unload_before_end`, which unloads
415
+ * at a reload first). A shift's start never counts, and an unused shift
416
+ * receives nothing. A dimension left out is uncapped; `0` means the
417
+ * depot takes none of it. A hard limit: a task that would overfill every
418
+ * depot its trip can tip at stays unassigned (reason `max_intake`).
419
+ *
420
+ * Each dimension must be one a task or vehicle declares, and some shift
421
+ * must reload here, or end here without `unload_before_end`.
422
+ */
423
+ max_intake?: null | components["schemas"]["Quantities"];
406
424
  /**
407
425
  * Format: double
408
426
  * @description Money charged once per reload visit, in the objective's currency.
@@ -650,6 +668,7 @@ export interface components {
650
668
  * "arrival": "2026-07-01T09:30:00+02:00",
651
669
  * "id": "job-2",
652
670
  * "latest_arrival": "2026-07-01T10:15:00+02:00",
671
+ * "service_start": "2026-07-01T09:30:00+02:00",
653
672
  * "shift": "mon",
654
673
  * "type": "job",
655
674
  * "vehicle": "v1"
@@ -814,10 +833,10 @@ export interface components {
814
833
  */
815
834
  preferences?: components["schemas"]["VehiclePreference"][] | null;
816
835
  /**
817
- * Format: int32
836
+ * Format: uint32
818
837
  * @description Importance of a must-serve task when not all of them fit: the solver
819
- * maximises the summed `priority` of served tasks before any cost. `>= 1`,
820
- * default `1` (maximise the count). A rank, not money — it never makes a
838
+ * maximises the summed `priority` of served tasks before any cost. `1` to
839
+ * `4294967295`, default `1` (maximise the count). A rank, not money — it never makes a
821
840
  * task droppable; use `drop_cost` for that. Both set is a 400.
822
841
  * @example 3
823
842
  */
@@ -876,7 +895,10 @@ export interface components {
876
895
  tags?: string[] | null;
877
896
  /**
878
897
  * @description Soft target for this task, measured at its arrival (default) or
879
- * departure. On a shipment it is measured on the **delivery** leg.
898
+ * departure. On a shipment it is measured on the **delivery** leg and
899
+ * cannot be combined with `delivery.target` (HTTP 400
900
+ * `conflicting_fields`); `pickup.target` adds a separate target on the
901
+ * pickup leg.
880
902
  */
881
903
  target?: null | components["schemas"]["Target"];
882
904
  /** @description Time windows for this visit. */
@@ -1005,7 +1027,7 @@ export interface components {
1005
1027
  */
1006
1028
  max_route_duration_s?: number | null;
1007
1029
  /**
1008
- * Format: int32
1030
+ * Format: uint32
1009
1031
  * @description Hard cap on served stops across the period's shifts; a job counts as
1010
1032
  * one stop. Start, end, break and reload stops in `routes[].stops` do not
1011
1033
  * count; a shipment counts as two stops.
@@ -1034,6 +1056,7 @@ export interface components {
1034
1056
  * "arrival": "2026-07-01T09:30:00+02:00",
1035
1057
  * "id": "s1:pickup",
1036
1058
  * "latest_arrival": "2026-07-01T10:15:00+02:00",
1059
+ * "service_start": "2026-07-01T09:30:00+02:00",
1037
1060
  * "shift": "mon",
1038
1061
  * "type": "pickup",
1039
1062
  * "vehicle": "v1"
@@ -1054,10 +1077,23 @@ export interface components {
1054
1077
  * @description Latest arrival that still keeps the rest of the route feasible
1055
1078
  * (RFC 3339, in the offset of `arrival`) — the smaller of the task's own time-window latest and
1056
1079
  * the route's forward slack here. Under priced lateness it may be
1057
- * **earlier** than `arrival`.
1080
+ * **earlier** than `arrival`. For a `synchronized` or `time_lag` member it
1081
+ * is at most `arrival` plus the wait before `service_start`: arriving
1082
+ * later would move the start its partners are booked to meet.
1058
1083
  * @example 2026-07-01T10:15:00+02:00
1059
1084
  */
1060
1085
  latest_arrival: string;
1086
+ /**
1087
+ * Format: date-time
1088
+ * @description Service start (RFC 3339, in the offset of `arrival`): `arrival` plus
1089
+ * any wait for the time window or a break, and for a `synchronized` or
1090
+ * `time_lag` member the hold for its partners, as `service_start` on the
1091
+ * route stop. With the default `on: service_start`, the members of a
1092
+ * crew start here within the relation's `max_spread_s`: the booking time
1093
+ * (`on: departure` aligns their ends instead; a `time_lag` keeps its lag).
1094
+ * @example 2026-07-01T09:30:00+02:00
1095
+ */
1096
+ service_start: string;
1061
1097
  /** @description Shift of that plan route. */
1062
1098
  shift: string;
1063
1099
  /**
@@ -1092,7 +1128,7 @@ export interface components {
1092
1128
  */
1093
1129
  PlanRoute: {
1094
1130
  /**
1095
- * Format: int32
1131
+ * Format: uint32
1096
1132
  * @description On solve, the first `locked_count` stops stay where they are (already
1097
1133
  * dispatched). Counts every listed stop. Cannot be combined with a
1098
1134
  * `reload` stop, and must not exceed the route's stop count — both are
@@ -1341,7 +1377,7 @@ export interface components {
1341
1377
  */
1342
1378
  id: string;
1343
1379
  /**
1344
- * Format: int32
1380
+ * Format: uint32
1345
1381
  * @description The cap on counted stops; a job counts as one stop.
1346
1382
  * Start, end, break and reload stops in `routes[].stops` do not count; a
1347
1383
  * shipment counts as two stops.
@@ -1385,8 +1421,10 @@ export interface components {
1385
1421
  * its pickup. A shipment's own id in `stops`, or a shipment carrying the
1386
1422
  * `tag` of a `same_vehicle` or `same_day` relation, is rejected with HTTP 400
1387
1423
  * `not_supported`: relations never silently skip a member. `same_route`,
1388
- * `time_lag`, `compatible_vehicles`, `all_or_none` and `tag_order` reject a
1389
- * shipment with HTTP 400 as well.
1424
+ * `time_lag`, `compatible_vehicles` and `tag_order` reject a shipment with
1425
+ * HTTP 400 as well. `all_or_none` alone takes a shipment's own id, naming both
1426
+ * legs, in a group that is exactly one `consecutive` chain; such a chain may
1427
+ * also be jobs only.
1390
1428
  * @example {
1391
1429
  * "stops": [
1392
1430
  * "job-1",
@@ -1399,20 +1437,25 @@ export interface components {
1399
1437
  /**
1400
1438
  * All or none
1401
1439
  * @description All or none: either every member in `stops` is served, or none is.
1402
- * Sets no timing; combine with `synchronized` or `time_lag` for when.
1403
- * Hard. Overlapping `all_or_none` relations chain: one on A and B plus
1440
+ * Sets no timing; a coupled group takes its timing from the
1441
+ * `synchronized` or `time_lag` relation that names its members. Hard.
1442
+ * Overlapping `all_or_none` relations chain: one on A and B plus
1404
1443
  * one on B and C serve all three together or none of them. A group with
1405
1444
  * a task in a vehicle's locked prefix (`plan.routes[].locked_count`) is
1406
1445
  * exempt. A member that could be served but is held back because
1407
1446
  * another cannot reports `all_or_none` in `unassigned[].reasons`.
1408
1447
  *
1409
- * Every task must also be named by a `synchronized` or `time_lag`
1410
- * relation; a task named by neither is rejected with HTTP 400.
1448
+ * A member may be a shipment id (both legs). Members are coupled by
1449
+ * `synchronized`/`time_lag`, or the group's stops (a shipment as its two
1450
+ * legs) are exactly one `consecutive` chain with no member coupled by
1451
+ * `synchronized` or `time_lag`, directly or through a `sequence` or
1452
+ * `consecutive` relation. A task named by neither is rejected with HTTP 400, as is a
1453
+ * shipment-leg id: name the shipment.
1411
1454
  */
1412
1455
  RelationAllOrNone: {
1413
1456
  /**
1414
- * @description Job ids, at least two. A shipment's own id or a shipment-leg stop id
1415
- * is rejected with HTTP 400.
1457
+ * @description Job ids or shipment ids, at least two. A shipment-leg stop id is
1458
+ * rejected with HTTP 400.
1416
1459
  * @example [
1417
1460
  * "job-1",
1418
1461
  * "job-2"
@@ -1460,6 +1503,7 @@ export interface components {
1460
1503
  * route. A member that is unassigned is skipped, so only listed
1461
1504
  * neighbours that are both served are adjacent. Members on different
1462
1505
  * routes are unconstrained; add `same_route` to keep them together.
1506
+ * Put a chain in an `all_or_none` to serve it whole or not at all.
1463
1507
  */
1464
1508
  RelationConsecutive: {
1465
1509
  /**
@@ -1716,14 +1760,14 @@ export interface components {
1716
1760
  /** @description One problem in a request. */
1717
1761
  RequestIssue: {
1718
1762
  /**
1719
- * Format: int64
1763
+ * Format: uint64
1720
1764
  * @description `limit_exceeded` only: the count this request has.
1721
1765
  */
1722
1766
  actual?: number | null;
1723
1767
  /** @description What is wrong. */
1724
1768
  code: components["schemas"]["ErrorItemCode"];
1725
1769
  /**
1726
- * Format: int64
1770
+ * Format: uint64
1727
1771
  * @description `limit_exceeded` only: the published cap.
1728
1772
  */
1729
1773
  limit?: number | null;
@@ -2052,9 +2096,9 @@ export interface components {
2052
2096
  * @description Seconds past this task's `target.at`, measured at the stop's arrival
2053
2097
  * (plus any `windowed` break taken on arrival there, idle before it
2054
2098
  * included) or departure per `target.on`; `0` when met. Present only on a task
2055
- * stop carrying a target. A shipment's target is measured on its
2056
- * delivery leg, so it appears on the `:delivery` stop and never on the
2057
- * `:pickup` stop.
2099
+ * stop carrying a target. A shipment's own `target` is measured on its
2100
+ * delivery leg, so it appears on the `:delivery` stop; a `pickup.target`
2101
+ * or `delivery.target` appears on that leg's stop.
2058
2102
  * @example 0
2059
2103
  */
2060
2104
  target_lateness_s?: number | null;
@@ -2140,7 +2184,7 @@ export interface components {
2140
2184
  */
2141
2185
  unassigned_priority: number;
2142
2186
  /**
2143
- * Format: int32
2187
+ * Format: uint32
2144
2188
  * @description How many hard-constraint violations the plan has (the `violations`
2145
2189
  * arrays on routes and stops list them). Always `0` on a solve result.
2146
2190
  * @example 0
@@ -2280,7 +2324,7 @@ export interface components {
2280
2324
  /** @description How the search behind a plan ended. */
2281
2325
  SearchInfo: {
2282
2326
  /**
2283
- * Format: int64
2327
+ * Format: uint64
2284
2328
  * @description Search iterations performed. `0` when nothing was searched.
2285
2329
  * @example 48210
2286
2330
  */
@@ -2306,7 +2350,7 @@ export interface components {
2306
2350
  */
2307
2351
  cost: number;
2308
2352
  /**
2309
- * Format: int64
2353
+ * Format: uint64
2310
2354
  * @description Milliseconds since the search started (the clock of
2311
2355
  * `summary.timings.search_ms`).
2312
2356
  */
@@ -2451,10 +2495,11 @@ export interface components {
2451
2495
  /**
2452
2496
  * Format: int32
2453
2497
  * @description Maximum trips (depot legs) in this shift, across all reload depots.
2454
- * Counts trips, not reloads: `trips = reloads_used + 1`. `max_trips: 1`
2455
- * means a single trip — reloads are permitted in `reloads` but the cap
2456
- * prevents ever using one. `reloads` present with `max_trips` absent
2457
- * means unlimited trips. A single reload depot can only be
2498
+ * Counts trips, not reloads: `trips = reloads_used + 1`, where the final
2499
+ * unload of `unload_before_end` is not counted. `max_trips: 1` means a
2500
+ * single trip — reloads are permitted in `reloads` but the cap prevents
2501
+ * ever using one, other than that final unload. `reloads` present with
2502
+ * `max_trips` absent means unlimited trips. A single reload depot can only be
2458
2503
  * revisited up to 8 times per shift regardless of `max_trips`;
2459
2504
  * a `max_trips` beyond that against one depot
2460
2505
  * is accepted but the extra headroom is unreachable — list more than
@@ -2528,6 +2573,16 @@ export interface components {
2528
2573
  * @example 2026-07-01T17:00:00+02:00
2529
2574
  */
2530
2575
  to: string;
2576
+ /**
2577
+ * @description When `true`, a route that would end with load on board first unloads
2578
+ * at one of this shift's `reloads` depots: a final `reload` stop, at the
2579
+ * depot the solver finds cheapest, taking that depot's
2580
+ * `service_duration_s` and `per_reload`. It does not count toward
2581
+ * `max_trips`. A route whose last trip carries no load ends without one.
2582
+ * `true` without `reloads` is rejected with HTTP 400
2583
+ * `conflicting_fields`. Default `false`.
2584
+ */
2585
+ unload_before_end?: boolean | null;
2531
2586
  };
2532
2587
  /**
2533
2588
  * @description The `Costs` fields for one shift, minus `per_used_vehicle`. A shift is one
@@ -2597,7 +2652,7 @@ export interface components {
2597
2652
  */
2598
2653
  max_route_duration_s?: number | null;
2599
2654
  /**
2600
- * Format: int32
2655
+ * Format: uint32
2601
2656
  * @description Maximum stops served in this shift; a job counts as one stop.
2602
2657
  * Start, end, break and reload stops in `routes[].stops` do not count; a
2603
2658
  * shipment counts as two stops.
@@ -2739,10 +2794,10 @@ export interface components {
2739
2794
  */
2740
2795
  preferences?: components["schemas"]["VehiclePreference"][] | null;
2741
2796
  /**
2742
- * Format: int32
2797
+ * Format: uint32
2743
2798
  * @description Importance of a must-serve task when not all of them fit: the solver
2744
- * maximises the summed `priority` of served tasks before any cost. `>= 1`,
2745
- * default `1` (maximise the count). A rank, not money — it never makes a
2799
+ * maximises the summed `priority` of served tasks before any cost. `1` to
2800
+ * `4294967295`, default `1` (maximise the count). A rank, not money — it never makes a
2746
2801
  * task droppable; use `drop_cost` for that. Both set is a 400.
2747
2802
  * @example 3
2748
2803
  */
@@ -2776,7 +2831,10 @@ export interface components {
2776
2831
  tags?: string[] | null;
2777
2832
  /**
2778
2833
  * @description Soft target for this task, measured at its arrival (default) or
2779
- * departure. On a shipment it is measured on the **delivery** leg.
2834
+ * departure. On a shipment it is measured on the **delivery** leg and
2835
+ * cannot be combined with `delivery.target` (HTTP 400
2836
+ * `conflicting_fields`); `pickup.target` adds a separate target on the
2837
+ * pickup leg.
2780
2838
  */
2781
2839
  target?: null | components["schemas"]["Target"];
2782
2840
  };
@@ -2834,6 +2892,14 @@ export interface components {
2834
2892
  * @example 60
2835
2893
  */
2836
2894
  setup_duration_s?: number | null;
2895
+ /**
2896
+ * @description Soft target for this leg, measured at its arrival (default) or
2897
+ * departure. Same type, units and validation as the task-level
2898
+ * `target`. The shipment's own `target` is measured on the delivery
2899
+ * leg, so sending it with `delivery.target` is rejected with HTTP 400
2900
+ * (`conflicting_fields`).
2901
+ */
2902
+ target?: null | components["schemas"]["Target"];
2837
2903
  /** @description Time windows for this stop. */
2838
2904
  time_windows?: components["schemas"]["TimeWindow"][] | null;
2839
2905
  };
@@ -2873,7 +2939,7 @@ export interface components {
2873
2939
  */
2874
2940
  polyline?: null | components["schemas"]["PolylineDetail"];
2875
2941
  /**
2876
- * Format: int64
2942
+ * Format: uint64
2877
2943
  * @description Random seed for the search. Default `42`: omitting it is the same as
2878
2944
  * sending `42`, so send different values to explore different plans.
2879
2945
  * Repeated runs on one machine usually return an identical plan; a
@@ -3227,15 +3293,18 @@ export interface components {
3227
3293
  */
3228
3294
  SuggestOptions: {
3229
3295
  /**
3230
- * Format: int32
3296
+ * Format: uint32
3231
3297
  * @description Max ranked `insertions` in each `suggestions[]` entry, `1` to `10`;
3232
3298
  * default 5. It caps the insertions per entry, not the number of
3233
3299
  * entries: every task outside `plan` still gets its entry. Values outside
3234
3300
  * the range are a 400, never clamped. It also sets how widely a unit of
3235
3301
  * several stops is searched (such a unit is never searched exhaustively):
3236
3302
  * each stop after the unit's first keeps at most
3237
- * `max(8, 4 × max_insertions)` partial placements. A single-stop task has every
3238
- * feasible position considered unless `time_limit_s` runs out first.
3303
+ * `max(8, 4 × max_insertions)` partial placements. A `synchronized` or
3304
+ * `time_lag` group is the exception: every start slot of each member is
3305
+ * tried, each other member at its cheapest slot, whatever this value. A
3306
+ * single-stop task has every feasible position considered unless
3307
+ * `time_limit_s` runs out first.
3239
3308
  * @default 5
3240
3309
  * @example 5
3241
3310
  */
@@ -3394,6 +3463,7 @@ export interface components {
3394
3463
  * "arrival": "2026-07-01T09:30:00+02:00",
3395
3464
  * "id": "job-2",
3396
3465
  * "latest_arrival": "2026-07-01T10:15:00+02:00",
3466
+ * "service_start": "2026-07-01T09:30:00+02:00",
3397
3467
  * "shift": "mon",
3398
3468
  * "type": "job",
3399
3469
  * "vehicle": "v1"
@@ -3439,11 +3509,12 @@ export interface components {
3439
3509
  */
3440
3510
  timings: components["schemas"]["Timings"];
3441
3511
  /**
3442
- * @description `true` when `options.time_limit_s` cut the search short, or a
3512
+ * @description `true` when `options.time_limit_s` cut the search short, a
3443
3513
  * multi-member unit came back empty after the search had discarded
3444
3514
  * candidates (an inconclusive "not found"; its `reason.code` is
3445
- * `candidates_exhausted`). Lists may then be incomplete or missing the
3446
- * best insertion. A single visit's only level is never pruned, so its
3515
+ * `candidates_exhausted`), or a crew lists fewer than `max_insertions`
3516
+ * after a member's cheapest slot was refused and its other slots went
3517
+ * untried. Lists may then be incomplete or missing the best insertion. A single visit's only level is never pruned, so its
3447
3518
  * empty list is proof of infeasibility unless the budget cut it, and its
3448
3519
  * `reason.code` is then `time_limit`.
3449
3520
  */
@@ -3525,7 +3596,7 @@ export interface components {
3525
3596
  /** @description How the search ended. */
3526
3597
  search: components["schemas"]["SearchInfo"];
3527
3598
  /**
3528
- * Format: int32
3599
+ * Format: uint32
3529
3600
  * @description Routes with at least one task stop: one per used shift.
3530
3601
  * @example 1
3531
3602
  */
@@ -3549,7 +3620,7 @@ export interface components {
3549
3620
  */
3550
3621
  travel_estimated?: boolean;
3551
3622
  /**
3552
- * Format: int32
3623
+ * Format: uint32
3553
3624
  * @description Distinct vehicles with at least one route.
3554
3625
  * @example 1
3555
3626
  */
@@ -3628,17 +3699,17 @@ export interface components {
3628
3699
  */
3629
3700
  TaskCounts: {
3630
3701
  /**
3631
- * Format: int32
3702
+ * Format: uint32
3632
3703
  * @description Tasks on a route.
3633
3704
  */
3634
3705
  served: number;
3635
3706
  /**
3636
- * Format: int32
3707
+ * Format: uint32
3637
3708
  * @description Tasks on no route: the length of `unassigned`.
3638
3709
  */
3639
3710
  unassigned: number;
3640
3711
  /**
3641
- * Format: int32
3712
+ * Format: uint32
3642
3713
  * @description The unassigned tasks that carry no `drop_cost`: tasks the plan was
3643
3714
  * required to serve and did not.
3644
3715
  */
@@ -3659,6 +3730,7 @@ export interface components {
3659
3730
  * "arrival": "2026-07-01T09:30:00+02:00",
3660
3731
  * "id": "job-2",
3661
3732
  * "latest_arrival": "2026-07-01T10:15:00+02:00",
3733
+ * "service_start": "2026-07-01T09:30:00+02:00",
3662
3734
  * "shift": "mon",
3663
3735
  * "type": "job",
3664
3736
  * "vehicle": "v1"
@@ -3695,10 +3767,9 @@ export interface components {
3695
3767
  /** @description Why `insertions` is empty; absent otherwise. */
3696
3768
  reason?: null | components["schemas"]["SuggestReason"];
3697
3769
  /**
3698
- * @description The unit's lead: its first member in placement order. That is the
3699
- * visit, the shipment, the first stop of a `sequence` chain in the
3700
- * unit, or else the member that comes first in problem order (`jobs`,
3701
- * then `shipments`).
3770
+ * @description The unit's lead: the visit, the shipment, the first stop of a
3771
+ * `sequence` chain in the unit, or else, a crew included, the member
3772
+ * that comes first in problem order (`jobs`, then `shipments`).
3702
3773
  * @example job-2
3703
3774
  */
3704
3775
  task: string;
@@ -3856,13 +3927,13 @@ export interface components {
3856
3927
  */
3857
3928
  Timings: {
3858
3929
  /**
3859
- * Format: int64
3930
+ * Format: uint64
3860
3931
  * @description Time spent in the search. Absent on `/evaluate`, which runs none, and
3861
3932
  * on `/suggest`, which has no separate search figure.
3862
3933
  */
3863
3934
  search_ms?: number | null;
3864
3935
  /**
3865
- * Format: int64
3936
+ * Format: uint64
3866
3937
  * @description From the request's arrival to the end of the search (of the scoring,
3867
3938
  * on `/evaluate`; of the suggestion search, on `/suggest`): fetching
3868
3939
  * travel times and waiting for capacity included, building the response
@@ -4223,7 +4294,7 @@ export interface components {
4223
4294
  */
4224
4295
  max_route_duration_s?: number | null;
4225
4296
  /**
4226
- * Format: int32
4297
+ * Format: uint32
4227
4298
  * @description Maximum stops served per shift; a job counts as one stop.
4228
4299
  * Start, end, break and reload stops in `routes[].stops` do not count; a
4229
4300
  * shipment counts as two stops.
@@ -4308,15 +4379,16 @@ export interface components {
4308
4379
  */
4309
4380
  code: components["schemas"]["ConstraintCode"];
4310
4381
  /**
4311
- * @description The capacity dimension over its limit. Only on `capacity`.
4382
+ * @description The capacity dimension over its limit. Only on `capacity`,
4383
+ * `unload_before_end` and `max_intake`.
4312
4384
  * @example weight
4313
4385
  */
4314
4386
  dimension?: string | null;
4315
4387
  /**
4316
4388
  * Format: int64
4317
4389
  * @description How far over the limit, in `unit`. On `capacity`, `time_window` (the
4318
- * seconds late), `shift_end`, `max_distance`, `max_route_duration` and
4319
- * `quota`.
4390
+ * seconds late), `shift_end`, `max_distance`, `max_route_duration`,
4391
+ * `quota`, `unload_before_end` and `max_intake`.
4320
4392
  * @example 15
4321
4393
  */
4322
4394
  excess?: number | null;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@solvice/routing",
3
- "version": "0.19.1-beta.0",
3
+ "version": "0.19.3-beta.0",
4
4
  "description": "TypeScript client for the Solvice V3 routing API, generated from its OpenAPI spec.",
5
5
  "license": "Apache-2.0",
6
6
  "homepage": "https://docs.solvice.io/guides/platform/sdks/typescript",