@burdenoff/microfe-movethewheels 2026.1031.4 → 2026.1031.5

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.
@@ -262,8 +262,8 @@ var T = ({ registerNavItems: _, basePath: v = "/" }) => {
262
262
  },
263
263
  {
264
264
  id: "mtw-ai-assistant",
265
- label: b("movethewheels.root.nav.aiAssistant", "AI Assistant"),
266
- path: C(v, "ai-assistant"),
265
+ label: b("movethewheels.root.nav.aiOperations", "AI Operations"),
266
+ path: "/ai",
267
267
  icon: /* @__PURE__ */ S(t, { size: 16 }),
268
268
  order: 13
269
269
  },
@@ -3,268 +3,271 @@ import { useModuleSettings as t } from "./providers/ModuleSettingsProvider.js";
3
3
  import { useTr as n } from "./shared/hooks/useTr.js";
4
4
  import "./hooks/index.js";
5
5
  import { Suspense as r, lazy as i } from "react";
6
- import { Route as a, Routes as o, useNavigate as s } from "react-router";
7
- import { jsx as c, jsxs as l } from "react/jsx-runtime";
8
- import { NotFoundPage as u } from "@burdenoff/fe-libs/shared/pages";
6
+ import { Navigate as a, Route as o, Routes as s, useNavigate as c } from "react-router";
7
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
8
+ import { NotFoundPage as d } from "@burdenoff/fe-libs/shared/pages";
9
9
  //#region src/movethewheels/MoveTheWheelsRoutes.tsx
10
- function d() {
11
- let { navigate: t, basePath: r } = e(), i = s();
12
- return /* @__PURE__ */ c(u, {
10
+ function f() {
11
+ let { navigate: t, basePath: r } = e(), i = c();
12
+ return /* @__PURE__ */ l(d, {
13
13
  homeLabel: n()("movethewheels.root.notFound.homeLabel", "Back to MoveTheWheels"),
14
14
  onGoHome: () => {
15
15
  t ? t(r || "/") : i("/");
16
16
  }
17
17
  });
18
18
  }
19
- function f() {
19
+ function p() {
20
20
  let e = n();
21
- return /* @__PURE__ */ c("div", {
21
+ return /* @__PURE__ */ l("div", {
22
22
  className: "flex items-center justify-center min-h-[400px]",
23
- children: /* @__PURE__ */ l("div", {
23
+ children: /* @__PURE__ */ u("div", {
24
24
  className: "flex flex-col items-center gap-3",
25
- children: [/* @__PURE__ */ c("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-primary" }), /* @__PURE__ */ c("p", {
25
+ children: [/* @__PURE__ */ l("div", { className: "animate-spin rounded-full h-8 w-8 border-b-2 border-primary" }), /* @__PURE__ */ l("p", {
26
26
  className: "text-sm text-text-secondary",
27
27
  children: e("movethewheels.root.loading", "Loading...")
28
28
  })]
29
29
  })
30
30
  });
31
31
  }
32
- var p = i(() => import("./pages/DashboardPage.js")), m = i(() => import("./pages/OrdersListPage.js")), h = i(() => import("./pages/OrderDetailsPage.js")), g = i(() => import("./pages/CreateOrderPage.js")), _ = i(() => import("./pages/TrackingPage.js")), v = i(() => import("./pages/TrackingEventQualityPage.js")), y = i(() => import("./pages/ShipmentStatusAuthorityPage.js")), b = i(() => import("./pages/LiveTrackingPage.js")), x = i(() => import("./pages/FleetPage.js")), S = i(() => import("./pages/VehiclesPage.js")), C = i(() => import("./pages/VehicleDetailsPage.js")), w = i(() => import("./pages/DriversPage.js")), T = i(() => import("./pages/DriverDetailsPage.js")), E = i(() => import("./pages/InventoryPage.js")), D = i(() => import("./pages/ProductsPage.js")), O = i(() => import("./pages/ProductDetailsPage.js")), k = i(() => import("./pages/PalletPreviewPage.js")), A = i(() => import("./pages/WarehousesPage.js")), j = i(() => import("./pages/WarehouseDetailsPage.js")), M = i(() => import("./pages/CustomersPage.js")), N = i(() => import("./pages/CustomerDetailsPage.js")), P = i(() => import("./pages/MarketplacePage.js")), F = i(() => import("./pages/ImportExportPage.js")), ee = i(() => import("./pages/SettingsPage.js")), I = i(() => import("./pages/RoutesPage.js")), L = i(() => import("./pages/RouteDetailsPage.js")), R = i(() => import("./pages/AnalyticsPage.js")), z = i(() => import("./pages/FinancePage.js")), B = i(() => import("./pages/FreightEstimatePage.js")), V = i(() => import("./pages/FreightInvoicePage.js")), H = i(() => import("./pages/ConsolidationPage.js")), U = i(() => import("./pages/LogisticsProceduresPage.js")), W = i(() => import("./pages/AIAssistantPage.js")), G = i(() => import("./pages/DeliveryCapturePage.js")), K = i(() => import("./pages/MultiModalShipmentPage.js")), q = i(() => import("./pages/ShippingRatesPage.js")), J = i(() => import("./pages/ContainersPage.js")), Y = i(() => import("./pages/ContainerConditionPage.js")), X = i(() => import("./pages/FreeTimePage.js")), Z = i(() => import("./pages/PendingPickPage.js")), Q = i(() => import("./pages/StockObservationsPage.js")), $ = i(() => import("./pages/StockBindingPage.js")), te = i(() => import("./pages/TripUtilizationPage.js")), ne = i(() => import("./pages/ConsumedFuelPreviewPage.js")), re = i(() => import("./pages/EmptyReusePage.js"));
32
+ var m = i(() => import("./pages/DashboardPage.js")), h = i(() => import("./pages/OrdersListPage.js")), g = i(() => import("./pages/OrderDetailsPage.js")), _ = i(() => import("./pages/CreateOrderPage.js")), v = i(() => import("./pages/TrackingPage.js")), y = i(() => import("./pages/TrackingEventQualityPage.js")), b = i(() => import("./pages/ShipmentStatusAuthorityPage.js")), x = i(() => import("./pages/LiveTrackingPage.js")), S = i(() => import("./pages/FleetPage.js")), C = i(() => import("./pages/VehiclesPage.js")), w = i(() => import("./pages/VehicleDetailsPage.js")), T = i(() => import("./pages/DriversPage.js")), E = i(() => import("./pages/DriverDetailsPage.js")), D = i(() => import("./pages/InventoryPage.js")), O = i(() => import("./pages/ProductsPage.js")), k = i(() => import("./pages/ProductDetailsPage.js")), A = i(() => import("./pages/PalletPreviewPage.js")), j = i(() => import("./pages/WarehousesPage.js")), M = i(() => import("./pages/WarehouseDetailsPage.js")), N = i(() => import("./pages/CustomersPage.js")), P = i(() => import("./pages/CustomerDetailsPage.js")), F = i(() => import("./pages/MarketplacePage.js")), ee = i(() => import("./pages/ImportExportPage.js")), I = i(() => import("./pages/SettingsPage.js")), L = i(() => import("./pages/RoutesPage.js")), R = i(() => import("./pages/RouteDetailsPage.js")), z = i(() => import("./pages/AnalyticsPage.js")), B = i(() => import("./pages/FinancePage.js")), V = i(() => import("./pages/FreightEstimatePage.js")), H = i(() => import("./pages/FreightInvoicePage.js")), U = i(() => import("./pages/ConsolidationPage.js")), W = i(() => import("./pages/LogisticsProceduresPage.js")), G = i(() => import("./pages/DeliveryCapturePage.js")), K = i(() => import("./pages/MultiModalShipmentPage.js")), q = i(() => import("./pages/ShippingRatesPage.js")), J = i(() => import("./pages/ContainersPage.js")), Y = i(() => import("./pages/ContainerConditionPage.js")), X = i(() => import("./pages/FreeTimePage.js")), Z = i(() => import("./pages/PendingPickPage.js")), Q = i(() => import("./pages/StockObservationsPage.js")), $ = i(() => import("./pages/StockBindingPage.js")), te = i(() => import("./pages/TripUtilizationPage.js")), ne = i(() => import("./pages/ConsumedFuelPreviewPage.js")), re = i(() => import("./pages/EmptyReusePage.js"));
33
33
  function ie() {
34
- return t(), /* @__PURE__ */ c(r, {
35
- fallback: /* @__PURE__ */ c(f, {}),
36
- children: /* @__PURE__ */ l(o, { children: [
37
- /* @__PURE__ */ c(a, {
34
+ return t(), /* @__PURE__ */ l(r, {
35
+ fallback: /* @__PURE__ */ l(p, {}),
36
+ children: /* @__PURE__ */ u(s, { children: [
37
+ /* @__PURE__ */ l(o, {
38
38
  index: !0,
39
- element: /* @__PURE__ */ c(p, {})
39
+ element: /* @__PURE__ */ l(m, {})
40
40
  }),
41
- /* @__PURE__ */ c(a, {
41
+ /* @__PURE__ */ l(o, {
42
42
  path: "orders",
43
- element: /* @__PURE__ */ c(m, {})
43
+ element: /* @__PURE__ */ l(h, {})
44
44
  }),
45
- /* @__PURE__ */ c(a, {
45
+ /* @__PURE__ */ l(o, {
46
46
  path: "orders/new",
47
- element: /* @__PURE__ */ c(g, {})
47
+ element: /* @__PURE__ */ l(_, {})
48
48
  }),
49
- /* @__PURE__ */ c(a, {
49
+ /* @__PURE__ */ l(o, {
50
50
  path: "orders/:orderId",
51
- element: /* @__PURE__ */ c(h, {})
51
+ element: /* @__PURE__ */ l(g, {})
52
52
  }),
53
- /* @__PURE__ */ c(a, {
53
+ /* @__PURE__ */ l(o, {
54
54
  path: "orders/:orderId/edit",
55
- element: /* @__PURE__ */ c(g, {})
55
+ element: /* @__PURE__ */ l(_, {})
56
56
  }),
57
- /* @__PURE__ */ c(a, {
57
+ /* @__PURE__ */ l(o, {
58
58
  path: "tracking",
59
- element: /* @__PURE__ */ c(_, {})
59
+ element: /* @__PURE__ */ l(v, {})
60
60
  }),
61
- /* @__PURE__ */ c(a, {
61
+ /* @__PURE__ */ l(o, {
62
62
  path: "tracking/live",
63
- element: /* @__PURE__ */ c(b, {})
63
+ element: /* @__PURE__ */ l(x, {})
64
64
  }),
65
- /* @__PURE__ */ c(a, {
65
+ /* @__PURE__ */ l(o, {
66
66
  path: "tracking/event-quality",
67
- element: /* @__PURE__ */ c(v, {})
67
+ element: /* @__PURE__ */ l(y, {})
68
68
  }),
69
- /* @__PURE__ */ c(a, {
69
+ /* @__PURE__ */ l(o, {
70
70
  path: "shipments/status-authority",
71
- element: /* @__PURE__ */ c(y, {})
71
+ element: /* @__PURE__ */ l(b, {})
72
72
  }),
73
- /* @__PURE__ */ c(a, {
73
+ /* @__PURE__ */ l(o, {
74
74
  path: "deliveries/mine",
75
- element: /* @__PURE__ */ c(G, {})
75
+ element: /* @__PURE__ */ l(G, {})
76
76
  }),
77
- /* @__PURE__ */ c(a, {
77
+ /* @__PURE__ */ l(o, {
78
78
  path: "shipments/multi-modal",
79
- element: /* @__PURE__ */ c(K, {})
79
+ element: /* @__PURE__ */ l(K, {})
80
80
  }),
81
- /* @__PURE__ */ c(a, {
81
+ /* @__PURE__ */ l(o, {
82
82
  path: "shipments/rates",
83
- element: /* @__PURE__ */ c(q, {})
83
+ element: /* @__PURE__ */ l(q, {})
84
84
  }),
85
- /* @__PURE__ */ c(a, {
85
+ /* @__PURE__ */ l(o, {
86
86
  path: "containers",
87
- element: /* @__PURE__ */ c(J, {})
87
+ element: /* @__PURE__ */ l(J, {})
88
88
  }),
89
- /* @__PURE__ */ c(a, {
89
+ /* @__PURE__ */ l(o, {
90
90
  path: "containers/condition",
91
- element: /* @__PURE__ */ c(Y, {})
91
+ element: /* @__PURE__ */ l(Y, {})
92
92
  }),
93
- /* @__PURE__ */ c(a, {
93
+ /* @__PURE__ */ l(o, {
94
94
  path: "containers/free-time",
95
- element: /* @__PURE__ */ c(X, {})
95
+ element: /* @__PURE__ */ l(X, {})
96
96
  }),
97
- /* @__PURE__ */ c(a, {
97
+ /* @__PURE__ */ l(o, {
98
98
  path: "containers/empty-reuse",
99
- element: /* @__PURE__ */ c(re, {})
99
+ element: /* @__PURE__ */ l(re, {})
100
100
  }),
101
- /* @__PURE__ */ c(a, {
101
+ /* @__PURE__ */ l(o, {
102
102
  path: "containers/consolidation",
103
- element: /* @__PURE__ */ c(H, {})
103
+ element: /* @__PURE__ */ l(U, {})
104
104
  }),
105
- /* @__PURE__ */ c(a, {
105
+ /* @__PURE__ */ l(o, {
106
106
  path: "containers/procedures",
107
- element: /* @__PURE__ */ c(U, {})
107
+ element: /* @__PURE__ */ l(W, {})
108
108
  }),
109
- /* @__PURE__ */ c(a, {
109
+ /* @__PURE__ */ l(o, {
110
110
  path: "fleet",
111
- element: /* @__PURE__ */ c(x, {})
111
+ element: /* @__PURE__ */ l(S, {})
112
112
  }),
113
- /* @__PURE__ */ c(a, {
113
+ /* @__PURE__ */ l(o, {
114
114
  path: "fleet/vehicles",
115
- element: /* @__PURE__ */ c(S, {})
115
+ element: /* @__PURE__ */ l(C, {})
116
116
  }),
117
- /* @__PURE__ */ c(a, {
117
+ /* @__PURE__ */ l(o, {
118
118
  path: "fleet/vehicles/new",
119
- element: /* @__PURE__ */ c(C, {})
119
+ element: /* @__PURE__ */ l(w, {})
120
120
  }),
121
- /* @__PURE__ */ c(a, {
121
+ /* @__PURE__ */ l(o, {
122
122
  path: "fleet/vehicles/:vehicleId",
123
- element: /* @__PURE__ */ c(C, {})
123
+ element: /* @__PURE__ */ l(w, {})
124
124
  }),
125
- /* @__PURE__ */ c(a, {
125
+ /* @__PURE__ */ l(o, {
126
126
  path: "fleet/vehicles/:vehicleId/edit",
127
- element: /* @__PURE__ */ c(C, {})
127
+ element: /* @__PURE__ */ l(w, {})
128
128
  }),
129
- /* @__PURE__ */ c(a, {
129
+ /* @__PURE__ */ l(o, {
130
130
  path: "fleet/drivers",
131
- element: /* @__PURE__ */ c(w, {})
131
+ element: /* @__PURE__ */ l(T, {})
132
132
  }),
133
- /* @__PURE__ */ c(a, {
133
+ /* @__PURE__ */ l(o, {
134
134
  path: "fleet/drivers/new",
135
- element: /* @__PURE__ */ c(T, {})
135
+ element: /* @__PURE__ */ l(E, {})
136
136
  }),
137
- /* @__PURE__ */ c(a, {
137
+ /* @__PURE__ */ l(o, {
138
138
  path: "fleet/drivers/:driverId",
139
- element: /* @__PURE__ */ c(T, {})
139
+ element: /* @__PURE__ */ l(E, {})
140
140
  }),
141
- /* @__PURE__ */ c(a, {
141
+ /* @__PURE__ */ l(o, {
142
142
  path: "fleet/drivers/:driverId/edit",
143
- element: /* @__PURE__ */ c(T, {})
143
+ element: /* @__PURE__ */ l(E, {})
144
144
  }),
145
- /* @__PURE__ */ c(a, {
145
+ /* @__PURE__ */ l(o, {
146
146
  path: "inventory",
147
- element: /* @__PURE__ */ c(E, {})
147
+ element: /* @__PURE__ */ l(D, {})
148
148
  }),
149
- /* @__PURE__ */ c(a, {
149
+ /* @__PURE__ */ l(o, {
150
150
  path: "inventory/source-assessments",
151
- element: /* @__PURE__ */ c($, {})
151
+ element: /* @__PURE__ */ l($, {})
152
152
  }),
153
- /* @__PURE__ */ c(a, {
153
+ /* @__PURE__ */ l(o, {
154
154
  path: "inventory/reported-issues",
155
- element: /* @__PURE__ */ c(Q, {})
155
+ element: /* @__PURE__ */ l(Q, {})
156
156
  }),
157
- /* @__PURE__ */ c(a, {
157
+ /* @__PURE__ */ l(o, {
158
158
  path: "inventory/pending-picks",
159
- element: /* @__PURE__ */ c(Z, {})
159
+ element: /* @__PURE__ */ l(Z, {})
160
160
  }),
161
- /* @__PURE__ */ c(a, {
161
+ /* @__PURE__ */ l(o, {
162
162
  path: "inventory/products",
163
- element: /* @__PURE__ */ c(D, {})
163
+ element: /* @__PURE__ */ l(O, {})
164
164
  }),
165
- /* @__PURE__ */ c(a, {
165
+ /* @__PURE__ */ l(o, {
166
166
  path: "inventory/products/new",
167
- element: /* @__PURE__ */ c(O, {})
167
+ element: /* @__PURE__ */ l(k, {})
168
168
  }),
169
- /* @__PURE__ */ c(a, {
169
+ /* @__PURE__ */ l(o, {
170
170
  path: "inventory/products/:productId",
171
- element: /* @__PURE__ */ c(O, {})
171
+ element: /* @__PURE__ */ l(k, {})
172
172
  }),
173
- /* @__PURE__ */ c(a, {
173
+ /* @__PURE__ */ l(o, {
174
174
  path: "inventory/products/:productId/edit",
175
- element: /* @__PURE__ */ c(O, {})
175
+ element: /* @__PURE__ */ l(k, {})
176
176
  }),
177
- /* @__PURE__ */ c(a, {
177
+ /* @__PURE__ */ l(o, {
178
178
  path: "inventory/warehouses",
179
- element: /* @__PURE__ */ c(A, {})
179
+ element: /* @__PURE__ */ l(j, {})
180
180
  }),
181
- /* @__PURE__ */ c(a, {
181
+ /* @__PURE__ */ l(o, {
182
182
  path: "inventory/warehouses/pallet-preview",
183
- element: /* @__PURE__ */ c(k, {})
183
+ element: /* @__PURE__ */ l(A, {})
184
184
  }),
185
- /* @__PURE__ */ c(a, {
185
+ /* @__PURE__ */ l(o, {
186
186
  path: "inventory/warehouses/new",
187
- element: /* @__PURE__ */ c(j, {})
187
+ element: /* @__PURE__ */ l(M, {})
188
188
  }),
189
- /* @__PURE__ */ c(a, {
189
+ /* @__PURE__ */ l(o, {
190
190
  path: "inventory/warehouses/:warehouseId",
191
- element: /* @__PURE__ */ c(j, {})
191
+ element: /* @__PURE__ */ l(M, {})
192
192
  }),
193
- /* @__PURE__ */ c(a, {
193
+ /* @__PURE__ */ l(o, {
194
194
  path: "inventory/warehouses/:warehouseId/edit",
195
- element: /* @__PURE__ */ c(j, {})
195
+ element: /* @__PURE__ */ l(M, {})
196
196
  }),
197
- /* @__PURE__ */ c(a, {
197
+ /* @__PURE__ */ l(o, {
198
198
  path: "customers",
199
- element: /* @__PURE__ */ c(M, {})
199
+ element: /* @__PURE__ */ l(N, {})
200
200
  }),
201
- /* @__PURE__ */ c(a, {
201
+ /* @__PURE__ */ l(o, {
202
202
  path: "customers/new",
203
- element: /* @__PURE__ */ c(N, {})
203
+ element: /* @__PURE__ */ l(P, {})
204
204
  }),
205
- /* @__PURE__ */ c(a, {
205
+ /* @__PURE__ */ l(o, {
206
206
  path: "customers/:customerId",
207
- element: /* @__PURE__ */ c(N, {})
207
+ element: /* @__PURE__ */ l(P, {})
208
208
  }),
209
- /* @__PURE__ */ c(a, {
209
+ /* @__PURE__ */ l(o, {
210
210
  path: "marketplace",
211
- element: /* @__PURE__ */ c(P, {})
211
+ element: /* @__PURE__ */ l(F, {})
212
212
  }),
213
- /* @__PURE__ */ c(a, {
213
+ /* @__PURE__ */ l(o, {
214
214
  path: "import-export",
215
- element: /* @__PURE__ */ c(F, {})
215
+ element: /* @__PURE__ */ l(ee, {})
216
216
  }),
217
- /* @__PURE__ */ c(a, {
217
+ /* @__PURE__ */ l(o, {
218
218
  path: "settings",
219
- element: /* @__PURE__ */ c(ee, {})
219
+ element: /* @__PURE__ */ l(I, {})
220
220
  }),
221
- /* @__PURE__ */ c(a, {
221
+ /* @__PURE__ */ l(o, {
222
222
  path: "routes",
223
- element: /* @__PURE__ */ c(I, {})
223
+ element: /* @__PURE__ */ l(L, {})
224
224
  }),
225
- /* @__PURE__ */ c(a, {
225
+ /* @__PURE__ */ l(o, {
226
226
  path: "routes/trip-utilization",
227
- element: /* @__PURE__ */ c(te, {})
227
+ element: /* @__PURE__ */ l(te, {})
228
228
  }),
229
- /* @__PURE__ */ c(a, {
229
+ /* @__PURE__ */ l(o, {
230
230
  path: "fuel-preview",
231
- element: /* @__PURE__ */ c(ne, {})
231
+ element: /* @__PURE__ */ l(ne, {})
232
232
  }),
233
- /* @__PURE__ */ c(a, {
233
+ /* @__PURE__ */ l(o, {
234
234
  path: "routes/new",
235
- element: /* @__PURE__ */ c(L, {})
235
+ element: /* @__PURE__ */ l(R, {})
236
236
  }),
237
- /* @__PURE__ */ c(a, {
237
+ /* @__PURE__ */ l(o, {
238
238
  path: "routes/:routeId",
239
- element: /* @__PURE__ */ c(L, {})
239
+ element: /* @__PURE__ */ l(R, {})
240
240
  }),
241
- /* @__PURE__ */ c(a, {
241
+ /* @__PURE__ */ l(o, {
242
242
  path: "routes/:routeId/edit",
243
- element: /* @__PURE__ */ c(L, {})
243
+ element: /* @__PURE__ */ l(R, {})
244
244
  }),
245
- /* @__PURE__ */ c(a, {
245
+ /* @__PURE__ */ l(o, {
246
246
  path: "analytics",
247
- element: /* @__PURE__ */ c(R, {})
247
+ element: /* @__PURE__ */ l(z, {})
248
248
  }),
249
- /* @__PURE__ */ c(a, {
249
+ /* @__PURE__ */ l(o, {
250
250
  path: "finance",
251
- element: /* @__PURE__ */ c(z, {})
251
+ element: /* @__PURE__ */ l(B, {})
252
252
  }),
253
- /* @__PURE__ */ c(a, {
253
+ /* @__PURE__ */ l(o, {
254
254
  path: "finance/freight-estimates",
255
- element: /* @__PURE__ */ c(B, {})
255
+ element: /* @__PURE__ */ l(V, {})
256
256
  }),
257
- /* @__PURE__ */ c(a, {
257
+ /* @__PURE__ */ l(o, {
258
258
  path: "finance/freight-invoice-comparisons",
259
- element: /* @__PURE__ */ c(V, {})
259
+ element: /* @__PURE__ */ l(H, {})
260
260
  }),
261
- /* @__PURE__ */ c(a, {
261
+ /* @__PURE__ */ l(o, {
262
262
  path: "ai-assistant",
263
- element: /* @__PURE__ */ c(W, {})
263
+ element: /* @__PURE__ */ l(a, {
264
+ to: "/ai",
265
+ replace: !0
266
+ })
264
267
  }),
265
- /* @__PURE__ */ c(a, {
268
+ /* @__PURE__ */ l(o, {
266
269
  path: "*",
267
- element: /* @__PURE__ */ c(d, {})
270
+ element: /* @__PURE__ */ l(f, {})
268
271
  })
269
272
  ] })
270
273
  });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-movethewheels",
3
- "version": "2026.1031.4",
3
+ "version": "2026.1031.5",
4
4
  "description": "Burdenoff MoveTheWheels Microfrontend - Logistics & Supply Chain Management Platform",
5
5
  "type": "module",
6
6
  "files": [
@@ -302,8 +302,10 @@ const NavRegistrar: FC<Pick<MoveTheWheelsRootProps, 'registerNavItems' | 'basePa
302
302
  },
303
303
  {
304
304
  id: 'mtw-ai-assistant',
305
- label: tr('movethewheels.root.nav.aiAssistant', 'AI Assistant'),
306
- path: joinPath(basePath, 'ai-assistant'),
305
+ label: tr('movethewheels.root.nav.aiOperations', 'AI Operations'),
306
+ // Shell-level shared AI operations page (fe-libs AiPage), not an
307
+ // MFE route — see BOFF-3897.
308
+ path: '/ai',
307
309
  icon: <Bot size={16} />,
308
310
  order: 13,
309
311
  },
@@ -5,7 +5,7 @@
5
5
  * Uses lazy loading for code splitting.
6
6
  */
7
7
 
8
- import { Routes, Route, useNavigate } from 'react-router';
8
+ import { Routes, Route, Navigate, useNavigate } from 'react-router';
9
9
  import { lazy, Suspense } from 'react';
10
10
  import { NotFoundPage } from '@burdenoff/fe-libs/shared/pages';
11
11
  import { useMoveTheWheels } from './providers/MoveTheWheelsProvider';
@@ -83,7 +83,6 @@ const FreightEstimatePage = lazy(() => import('./pages/FreightEstimatePage'));
83
83
  const FreightInvoicePage = lazy(() => import('./pages/FreightInvoicePage'));
84
84
  const ConsolidationPage = lazy(() => import('./pages/ConsolidationPage'));
85
85
  const LogisticsProceduresPage = lazy(() => import('./pages/LogisticsProceduresPage'));
86
- const AIAssistantPage = lazy(() => import('./pages/AIAssistantPage'));
87
86
  const DeliveryCapturePage = lazy(() => import('./pages/DeliveryCapturePage'));
88
87
  const MultiModalShipmentPage = lazy(() => import('./pages/MultiModalShipmentPage'));
89
88
  const ShippingRatesPage = lazy(() => import('./pages/ShippingRatesPage'));
@@ -189,8 +188,15 @@ export function MoveTheWheelsRoutes() {
189
188
  <Route path="finance/freight-estimates" element={<FreightEstimatePage />} />
190
189
  <Route path="finance/freight-invoice-comparisons" element={<FreightInvoicePage />} />
191
190
 
192
- {/* AI Assistant */}
193
- <Route path="ai-assistant" element={<AIAssistantPage />} />
191
+ {/*
192
+ AI Operations lives on the shell's shared /ai page (fe-libs AiPage:
193
+ per-product AI credits, recorded usage by model / surface / trigger,
194
+ and the workspace model + provider catalog). The old ai-assistant
195
+ page advertised capabilities the backend never had (BOFF-3897), so
196
+ this path only redirects existing links and bookmarks there. Chat
197
+ stays on the shell's AssistantWidget.
198
+ */}
199
+ <Route path="ai-assistant" element={<Navigate to="/ai" replace />} />
194
200
 
195
201
  {/* Catch-all - friendly 404 */}
196
202
  <Route path="*" element={<MoveTheWheelsNotFound />} />
@@ -1,22 +0,0 @@
1
- /**
2
- * AI Operations Page
3
- *
4
- * This page previously shipped a second, fabricated chat surface
5
- * (`useAssistant` → `Query.assistantInsights`) whose "capabilities" list
6
- * advertised route optimization, demand forecasting, fleet analysis, cost
7
- * optimization and natural-language queries — none of which the backend
8
- * implemented; every question routed to a fixed template built from four
9
- * Prisma counts. See BOFF-3897.
10
- *
11
- * The real conversational assistant is the shared `AssistantWidget`, already
12
- * mounted globally in the app shell (`AppShell.tsx`) on the sandbox
13
- * transport — this page must never contain a second chat box.
14
- *
15
- * The full "AI Operations" surface this page is meant to become — a model
16
- * picker, an agent-activity feed reading the shared AgentRun ledger,
17
- * accept/reject decision cards for AI dispatch proposals, and per-workspace
18
- * AI credit visibility — depends on the shared multi-model AI gateway
19
- * (BOFF-3601), which has not landed yet. Until it does, this page shows an
20
- * honest roadmap state instead of fabricating any of that content.
21
- */
22
- export default function AIAssistantPage(): import('react').JSX.Element;
@@ -1,8 +0,0 @@
1
- import { createLucideIcon as e } from "../createLucideIcon.js";
2
- //#region node_modules/lucide-react/dist/esm/icons/message-circle.js
3
- var t = e("MessageCircle", [["path", {
4
- d: "M7.9 20A9 9 0 1 0 4 16.1L2 22Z",
5
- key: "vv11sd"
6
- }]]);
7
- //#endregion
8
- export { t as MessageCircle };
@@ -1,11 +0,0 @@
1
- import { createLucideIcon as e } from "../createLucideIcon.js";
2
- //#region node_modules/lucide-react/dist/esm/icons/wallet.js
3
- var t = e("Wallet", [["path", {
4
- d: "M19 7V4a1 1 0 0 0-1-1H5a2 2 0 0 0 0 4h15a1 1 0 0 1 1 1v4h-3a2 2 0 0 0 0 4h3a1 1 0 0 0 1-1v-2a1 1 0 0 0-1-1",
5
- key: "18etb6"
6
- }], ["path", {
7
- d: "M3 5v14a2 2 0 0 0 2 2h15a1 1 0 0 0 1-1v-4",
8
- key: "xoc0q4"
9
- }]]);
10
- //#endregion
11
- export { t as Wallet };
@@ -1,81 +0,0 @@
1
- import { Activity as e } from "../node_modules/lucide-react/dist/esm/icons/activity.js";
2
- import { Bot as t } from "../node_modules/lucide-react/dist/esm/icons/bot.js";
3
- import { MessageCircle as n } from "../node_modules/lucide-react/dist/esm/icons/message-circle.js";
4
- import { ShieldCheck as r } from "../node_modules/lucide-react/dist/esm/icons/shield-check.js";
5
- import { Wallet as i } from "../node_modules/lucide-react/dist/esm/icons/wallet.js";
6
- import { useTr as a } from "../shared/hooks/useTr.js";
7
- import "../hooks/index.js";
8
- import { Card as o, CardContent as s, CardHeader as c, CardTitle as l } from "../components/ui.js";
9
- import { EmptyState as u, PageLayout as d } from "../components/PageLayout.js";
10
- import { jsx as f, jsxs as p } from "react/jsx-runtime";
11
- import { GlassCard as m, PagePurpose as h } from "@burdenoff/fe-libs/ui";
12
- //#region src/movethewheels/pages/AIAssistantPage.tsx
13
- function g() {
14
- let g = a(), _ = [
15
- {
16
- icon: e,
17
- title: g("movethewheels.ai.roadmap.agentActivity.title", "Agent activity feed"),
18
- description: g("movethewheels.ai.roadmap.agentActivity.description", "A live log of what the AI decided, on which shipments, with trigger, model, latency and cost — so an autonomous run is never a black box.")
19
- },
20
- {
21
- icon: r,
22
- title: g("movethewheels.ai.roadmap.dispatchDecisionCards.title", "Dispatch decision cards"),
23
- description: g("movethewheels.ai.roadmap.dispatchDecisionCards.description", "Proposed driver/vehicle assignments and carrier recommendations with rationale and confidence, requiring an explicit accept or reject before anything is written.")
24
- },
25
- {
26
- icon: i,
27
- title: g("movethewheels.ai.roadmap.aiCreditVisibility.title", "AI credit visibility"),
28
- description: g("movethewheels.ai.roadmap.aiCreditVisibility.description", "Per-workspace AI spend for admins, so cost is visible before the invoice.")
29
- }
30
- ];
31
- return /* @__PURE__ */ p(d, {
32
- title: g("movethewheels.ai.title", "AI Operations"),
33
- subtitle: g("movethewheels.ai.subtitle", "What the AI is doing on your workspace, and why"),
34
- icon: /* @__PURE__ */ f(t, { size: 24 }),
35
- children: [
36
- /* @__PURE__ */ f(h, {
37
- icon: /* @__PURE__ */ f(t, { size: 18 }),
38
- children: g("movethewheels.ai.purpose", "This page will surface AI-driven dispatch decisions and their outcomes once the shared AI runtime lands. It does not host a chat box — chat with your live operational data is always available from the assistant icon anywhere in the app.")
39
- }),
40
- /* @__PURE__ */ f(m, {
41
- treatment: "glass",
42
- className: "p-4",
43
- children: /* @__PURE__ */ p("div", {
44
- className: "flex items-start gap-3",
45
- children: [/* @__PURE__ */ f(n, {
46
- size: 20,
47
- className: "text-primary flex-shrink-0 mt-0.5"
48
- }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
49
- className: "text-sm font-medium text-text-primary",
50
- children: g("movethewheels.ai.callout.title", "Looking to ask a question about your operations?")
51
- }), /* @__PURE__ */ f("p", {
52
- className: "text-sm text-text-secondary mt-1",
53
- children: g("movethewheels.ai.callout.description", "Open the assistant from its icon in the corner of the screen — it answers from your live orders, shipments, fleet and inventory data, and it is the only chat surface in this product.")
54
- })] })]
55
- })
56
- }),
57
- /* @__PURE__ */ p(o, { children: [/* @__PURE__ */ f(c, { children: /* @__PURE__ */ f(l, { children: g("movethewheels.ai.roadmap.title", "On the roadmap") }) }), /* @__PURE__ */ p(s, { children: [/* @__PURE__ */ f(u, {
58
- illustration: "empty-agents",
59
- title: g("movethewheels.ai.emptyState.title", "Autonomous dispatch operations aren't live yet"),
60
- description: g("movethewheels.ai.emptyState.description", "Autonomous dispatch isn't available yet — these capabilities are still in development. Nothing below is available today.")
61
- }), /* @__PURE__ */ f("ul", {
62
- className: "mt-4 space-y-4",
63
- children: _.map((e) => /* @__PURE__ */ p("li", {
64
- className: "flex items-start gap-3",
65
- children: [/* @__PURE__ */ f(e.icon, {
66
- size: 18,
67
- className: "text-text-secondary flex-shrink-0 mt-0.5"
68
- }), /* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("p", {
69
- className: "text-sm font-medium text-text-primary",
70
- children: e.title
71
- }), /* @__PURE__ */ f("p", {
72
- className: "text-xs text-text-secondary",
73
- children: e.description
74
- })] })]
75
- }, e.title))
76
- })] })] })
77
- ]
78
- });
79
- }
80
- //#endregion
81
- export { g as default };
@@ -1,123 +0,0 @@
1
- /**
2
- * AI Operations Page
3
- *
4
- * This page previously shipped a second, fabricated chat surface
5
- * (`useAssistant` → `Query.assistantInsights`) whose "capabilities" list
6
- * advertised route optimization, demand forecasting, fleet analysis, cost
7
- * optimization and natural-language queries — none of which the backend
8
- * implemented; every question routed to a fixed template built from four
9
- * Prisma counts. See BOFF-3897.
10
- *
11
- * The real conversational assistant is the shared `AssistantWidget`, already
12
- * mounted globally in the app shell (`AppShell.tsx`) on the sandbox
13
- * transport — this page must never contain a second chat box.
14
- *
15
- * The full "AI Operations" surface this page is meant to become — a model
16
- * picker, an agent-activity feed reading the shared AgentRun ledger,
17
- * accept/reject decision cards for AI dispatch proposals, and per-workspace
18
- * AI credit visibility — depends on the shared multi-model AI gateway
19
- * (BOFF-3601), which has not landed yet. Until it does, this page shows an
20
- * honest roadmap state instead of fabricating any of that content.
21
- */
22
-
23
- import { Bot, MessageCircle, Activity, ShieldCheck, Wallet } from 'lucide-react';
24
- import { PageLayout, EmptyState } from '../components/PageLayout';
25
- import { Card, CardContent, CardHeader, CardTitle } from '../components/ui';
26
- import { GlassCard, PagePurpose } from '@burdenoff/fe-libs/ui';
27
- import { useTr } from '../hooks';
28
-
29
- export default function AIAssistantPage() {
30
- const tr = useTr();
31
-
32
- const roadmapItems = [
33
- {
34
- icon: Activity,
35
- title: tr('movethewheels.ai.roadmap.agentActivity.title', 'Agent activity feed'),
36
- description: tr(
37
- 'movethewheels.ai.roadmap.agentActivity.description',
38
- 'A live log of what the AI decided, on which shipments, with trigger, model, latency and cost — so an autonomous run is never a black box.'
39
- ),
40
- },
41
- {
42
- icon: ShieldCheck,
43
- title: tr('movethewheels.ai.roadmap.dispatchDecisionCards.title', 'Dispatch decision cards'),
44
- description: tr(
45
- 'movethewheels.ai.roadmap.dispatchDecisionCards.description',
46
- 'Proposed driver/vehicle assignments and carrier recommendations with rationale and confidence, requiring an explicit accept or reject before anything is written.'
47
- ),
48
- },
49
- {
50
- icon: Wallet,
51
- title: tr('movethewheels.ai.roadmap.aiCreditVisibility.title', 'AI credit visibility'),
52
- description: tr(
53
- 'movethewheels.ai.roadmap.aiCreditVisibility.description',
54
- 'Per-workspace AI spend for admins, so cost is visible before the invoice.'
55
- ),
56
- },
57
- ];
58
-
59
- return (
60
- <PageLayout
61
- title={tr('movethewheels.ai.title', 'AI Operations')}
62
- subtitle={tr('movethewheels.ai.subtitle', 'What the AI is doing on your workspace, and why')}
63
- icon={<Bot size={24} />}
64
- >
65
- <PagePurpose icon={<Bot size={18} />}>
66
- {tr(
67
- 'movethewheels.ai.purpose',
68
- 'This page will surface AI-driven dispatch decisions and their outcomes once the shared AI runtime lands. It does not host a chat box — chat with your live operational data is always available from the assistant icon anywhere in the app.'
69
- )}
70
- </PagePurpose>
71
-
72
- <GlassCard treatment="glass" className="p-4">
73
- <div className="flex items-start gap-3">
74
- <MessageCircle size={20} className="text-primary flex-shrink-0 mt-0.5" />
75
- <div>
76
- <p className="text-sm font-medium text-text-primary">
77
- {tr(
78
- 'movethewheels.ai.callout.title',
79
- 'Looking to ask a question about your operations?'
80
- )}
81
- </p>
82
- <p className="text-sm text-text-secondary mt-1">
83
- {tr(
84
- 'movethewheels.ai.callout.description',
85
- 'Open the assistant from its icon in the corner of the screen — it answers from your live orders, shipments, fleet and inventory data, and it is the only chat surface in this product.'
86
- )}
87
- </p>
88
- </div>
89
- </div>
90
- </GlassCard>
91
-
92
- <Card>
93
- <CardHeader>
94
- <CardTitle>{tr('movethewheels.ai.roadmap.title', 'On the roadmap')}</CardTitle>
95
- </CardHeader>
96
- <CardContent>
97
- <EmptyState
98
- illustration="empty-agents"
99
- title={tr(
100
- 'movethewheels.ai.emptyState.title',
101
- "Autonomous dispatch operations aren't live yet"
102
- )}
103
- description={tr(
104
- 'movethewheels.ai.emptyState.description',
105
- "Autonomous dispatch isn't available yet — these capabilities are still in development. Nothing below is available today."
106
- )}
107
- />
108
- <ul className="mt-4 space-y-4">
109
- {roadmapItems.map((item) => (
110
- <li key={item.title} className="flex items-start gap-3">
111
- <item.icon size={18} className="text-text-secondary flex-shrink-0 mt-0.5" />
112
- <div>
113
- <p className="text-sm font-medium text-text-primary">{item.title}</p>
114
- <p className="text-xs text-text-secondary">{item.description}</p>
115
- </div>
116
- </li>
117
- ))}
118
- </ul>
119
- </CardContent>
120
- </Card>
121
- </PageLayout>
122
- );
123
- }