@solvice/routing 0.19.1-beta.0 → 0.19.2-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.
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.
@@ -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. */
@@ -1819,9 +1840,9 @@ export interface components {
1819
1840
  * @description Seconds past this task's `target.at`, measured at the stop's arrival
1820
1841
  * (plus any `windowed` break taken on arrival there, idle before it
1821
1842
  * 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.
1843
+ * stop carrying a target. A shipment's own `target` is measured on its
1844
+ * delivery leg, so it appears on the `:delivery` stop; a `pickup.target`
1845
+ * or `delivery.target` appears on that leg's stop.
1825
1846
  * @example 0
1826
1847
  */
1827
1848
  target_lateness_s?: number | null;
@@ -2550,10 +2571,11 @@ export interface components {
2550
2571
  /**
2551
2572
  * Format: int32
2552
2573
  * @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
2574
+ * Counts trips, not reloads: `trips = reloads_used + 1`, where the final
2575
+ * unload of `unload_before_end` is not counted. `max_trips: 1` means a
2576
+ * single trip — reloads are permitted in `reloads` but the cap prevents
2577
+ * ever using one, other than that final unload. `reloads` present with
2578
+ * `max_trips` absent means unlimited trips. A single reload depot can only be
2557
2579
  * revisited up to 8 times per shift regardless of `max_trips`;
2558
2580
  * a `max_trips` beyond that against one depot
2559
2581
  * is accepted but the extra headroom is unreachable — list more than
@@ -2627,6 +2649,16 @@ export interface components {
2627
2649
  * @example 2026-07-01T17:00:00+02:00
2628
2650
  */
2629
2651
  to: string;
2652
+ /**
2653
+ * @description When `true`, a route that would end with load on board first unloads
2654
+ * at one of this shift's `reloads` depots: a final `reload` stop, at the
2655
+ * depot the solver finds cheapest, taking that depot's
2656
+ * `service_duration_s` and `per_reload`. It does not count toward
2657
+ * `max_trips`. A route whose last trip carries no load ends without one.
2658
+ * `true` without `reloads` is rejected with HTTP 400
2659
+ * `conflicting_fields`. Default `false`.
2660
+ */
2661
+ unload_before_end?: boolean | null;
2630
2662
  };
2631
2663
  /**
2632
2664
  * @description The `Costs` fields for one shift, minus `per_used_vehicle`. A shift is one
@@ -2862,7 +2894,10 @@ export interface components {
2862
2894
  tags?: string[] | null;
2863
2895
  /**
2864
2896
  * @description Soft target for this task, measured at its arrival (default) or
2865
- * departure. On a shipment it is measured on the **delivery** leg.
2897
+ * departure. On a shipment it is measured on the **delivery** leg and
2898
+ * cannot be combined with `delivery.target` (HTTP 400
2899
+ * `conflicting_fields`); `pickup.target` adds a separate target on the
2900
+ * pickup leg.
2866
2901
  */
2867
2902
  target?: null | components["schemas"]["Target"];
2868
2903
  };
@@ -2920,6 +2955,14 @@ export interface components {
2920
2955
  * @example 60
2921
2956
  */
2922
2957
  setup_duration_s?: number | null;
2958
+ /**
2959
+ * @description Soft target for this leg, measured at its arrival (default) or
2960
+ * departure. Same type, units and validation as the task-level
2961
+ * `target`. The shipment's own `target` is measured on the delivery
2962
+ * leg, so sending it with `delivery.target` is rejected with HTTP 400
2963
+ * (`conflicting_fields`).
2964
+ */
2965
+ target?: null | components["schemas"]["Target"];
2923
2966
  /** @description Time windows for this stop. */
2924
2967
  time_windows?: components["schemas"]["TimeWindow"][] | null;
2925
2968
  };
@@ -3931,15 +3974,16 @@ export interface components {
3931
3974
  */
3932
3975
  code: components["schemas"]["ConstraintCode"];
3933
3976
  /**
3934
- * @description The capacity dimension over its limit. Only on `capacity`.
3977
+ * @description The capacity dimension over its limit. Only on `capacity`,
3978
+ * `unload_before_end` and `max_intake`.
3935
3979
  * @example weight
3936
3980
  */
3937
3981
  dimension?: string | null;
3938
3982
  /**
3939
3983
  * Format: int64
3940
3984
  * @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`.
3985
+ * seconds late), `shift_end`, `max_distance`, `max_route_duration`,
3986
+ * `quota`, `unload_before_end` and `max_intake`.
3943
3987
  * @example 15
3944
3988
  */
3945
3989
  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"
@@ -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. */
@@ -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
  /**
@@ -2052,9 +2088,9 @@ export interface components {
2052
2088
  * @description Seconds past this task's `target.at`, measured at the stop's arrival
2053
2089
  * (plus any `windowed` break taken on arrival there, idle before it
2054
2090
  * 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.
2091
+ * stop carrying a target. A shipment's own `target` is measured on its
2092
+ * delivery leg, so it appears on the `:delivery` stop; a `pickup.target`
2093
+ * or `delivery.target` appears on that leg's stop.
2058
2094
  * @example 0
2059
2095
  */
2060
2096
  target_lateness_s?: number | null;
@@ -2451,10 +2487,11 @@ export interface components {
2451
2487
  /**
2452
2488
  * Format: int32
2453
2489
  * @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
2490
+ * Counts trips, not reloads: `trips = reloads_used + 1`, where the final
2491
+ * unload of `unload_before_end` is not counted. `max_trips: 1` means a
2492
+ * single trip — reloads are permitted in `reloads` but the cap prevents
2493
+ * ever using one, other than that final unload. `reloads` present with
2494
+ * `max_trips` absent means unlimited trips. A single reload depot can only be
2458
2495
  * revisited up to 8 times per shift regardless of `max_trips`;
2459
2496
  * a `max_trips` beyond that against one depot
2460
2497
  * is accepted but the extra headroom is unreachable — list more than
@@ -2528,6 +2565,16 @@ export interface components {
2528
2565
  * @example 2026-07-01T17:00:00+02:00
2529
2566
  */
2530
2567
  to: string;
2568
+ /**
2569
+ * @description When `true`, a route that would end with load on board first unloads
2570
+ * at one of this shift's `reloads` depots: a final `reload` stop, at the
2571
+ * depot the solver finds cheapest, taking that depot's
2572
+ * `service_duration_s` and `per_reload`. It does not count toward
2573
+ * `max_trips`. A route whose last trip carries no load ends without one.
2574
+ * `true` without `reloads` is rejected with HTTP 400
2575
+ * `conflicting_fields`. Default `false`.
2576
+ */
2577
+ unload_before_end?: boolean | null;
2531
2578
  };
2532
2579
  /**
2533
2580
  * @description The `Costs` fields for one shift, minus `per_used_vehicle`. A shift is one
@@ -2776,7 +2823,10 @@ export interface components {
2776
2823
  tags?: string[] | null;
2777
2824
  /**
2778
2825
  * @description Soft target for this task, measured at its arrival (default) or
2779
- * departure. On a shipment it is measured on the **delivery** leg.
2826
+ * departure. On a shipment it is measured on the **delivery** leg and
2827
+ * cannot be combined with `delivery.target` (HTTP 400
2828
+ * `conflicting_fields`); `pickup.target` adds a separate target on the
2829
+ * pickup leg.
2780
2830
  */
2781
2831
  target?: null | components["schemas"]["Target"];
2782
2832
  };
@@ -2834,6 +2884,14 @@ export interface components {
2834
2884
  * @example 60
2835
2885
  */
2836
2886
  setup_duration_s?: number | null;
2887
+ /**
2888
+ * @description Soft target for this leg, measured at its arrival (default) or
2889
+ * departure. Same type, units and validation as the task-level
2890
+ * `target`. The shipment's own `target` is measured on the delivery
2891
+ * leg, so sending it with `delivery.target` is rejected with HTTP 400
2892
+ * (`conflicting_fields`).
2893
+ */
2894
+ target?: null | components["schemas"]["Target"];
2837
2895
  /** @description Time windows for this stop. */
2838
2896
  time_windows?: components["schemas"]["TimeWindow"][] | null;
2839
2897
  };
@@ -3234,8 +3292,11 @@ export interface components {
3234
3292
  * the range are a 400, never clamped. It also sets how widely a unit of
3235
3293
  * several stops is searched (such a unit is never searched exhaustively):
3236
3294
  * 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.
3295
+ * `max(8, 4 × max_insertions)` partial placements. A `synchronized` or
3296
+ * `time_lag` group is the exception: every start slot of one member is
3297
+ * tried, each other member at its cheapest slot, whatever this value. A
3298
+ * single-stop task has every feasible position considered unless
3299
+ * `time_limit_s` runs out first.
3239
3300
  * @default 5
3240
3301
  * @example 5
3241
3302
  */
@@ -3394,6 +3455,7 @@ export interface components {
3394
3455
  * "arrival": "2026-07-01T09:30:00+02:00",
3395
3456
  * "id": "job-2",
3396
3457
  * "latest_arrival": "2026-07-01T10:15:00+02:00",
3458
+ * "service_start": "2026-07-01T09:30:00+02:00",
3397
3459
  * "shift": "mon",
3398
3460
  * "type": "job",
3399
3461
  * "vehicle": "v1"
@@ -3659,6 +3721,7 @@ export interface components {
3659
3721
  * "arrival": "2026-07-01T09:30:00+02:00",
3660
3722
  * "id": "job-2",
3661
3723
  * "latest_arrival": "2026-07-01T10:15:00+02:00",
3724
+ * "service_start": "2026-07-01T09:30:00+02:00",
3662
3725
  * "shift": "mon",
3663
3726
  * "type": "job",
3664
3727
  * "vehicle": "v1"
@@ -3695,10 +3758,9 @@ export interface components {
3695
3758
  /** @description Why `insertions` is empty; absent otherwise. */
3696
3759
  reason?: null | components["schemas"]["SuggestReason"];
3697
3760
  /**
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`).
3761
+ * @description The unit's lead: the visit, the shipment, the first stop of a
3762
+ * `sequence` chain in the unit, or else, a crew included, the member
3763
+ * that comes first in problem order (`jobs`, then `shipments`).
3702
3764
  * @example job-2
3703
3765
  */
3704
3766
  task: string;
@@ -4308,15 +4370,16 @@ export interface components {
4308
4370
  */
4309
4371
  code: components["schemas"]["ConstraintCode"];
4310
4372
  /**
4311
- * @description The capacity dimension over its limit. Only on `capacity`.
4373
+ * @description The capacity dimension over its limit. Only on `capacity`,
4374
+ * `unload_before_end` and `max_intake`.
4312
4375
  * @example weight
4313
4376
  */
4314
4377
  dimension?: string | null;
4315
4378
  /**
4316
4379
  * Format: int64
4317
4380
  * @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`.
4381
+ * seconds late), `shift_end`, `max_distance`, `max_route_duration`,
4382
+ * `quota`, `unload_before_end` and `max_intake`.
4320
4383
  * @example 15
4321
4384
  */
4322
4385
  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.2-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",