@burdenoff/microfe-movethewheels 2026.716.2 → 2026.719.2
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/generated/wspace-operations.d.ts +0 -42
- package/dist/hooks/index.js +0 -1
- package/dist/hooks/useAnalytics.js +11 -11
- package/dist/index.js +25 -26
- package/dist/movethewheels/hooks/index.d.ts +0 -1
- package/dist/movethewheels/pages/AIAssistantPage.d.ts +19 -1
- package/dist/node_modules/lucide-react/dist/esm/icons/message-circle.js +8 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/shield-check.js +11 -0
- package/dist/node_modules/lucide-react/dist/esm/icons/wallet.js +11 -0
- package/dist/pages/AIAssistantPage.js +74 -201
- package/package.json +1 -1
- package/src/generated/wspace-operations.ts +0 -52
- package/src/movethewheels/components/maps/leaflet-setup.ts +1 -8
- package/src/movethewheels/hooks/index.ts +0 -3
- package/src/movethewheels/hooks/useAnalytics.ts +17 -17
- package/src/movethewheels/index.ts +1 -1
- package/src/movethewheels/pages/AIAssistantPage.tsx +81 -185
- package/src/movethewheels/services/createSandboxAssistantTransport.ts +1 -2
- package/src/operations/wspace/movethewheels/queries/dashboard.graphql +0 -8
- package/dist/hooks/useAssistant.js +0 -39
- package/dist/movethewheels/hooks/useAssistant.d.ts +0 -17
- package/dist/node_modules/lucide-react/dist/esm/icons/lightbulb.js +0 -18
- package/dist/node_modules/lucide-react/dist/esm/icons/send.js +0 -11
- package/dist/node_modules/lucide-react/dist/esm/icons/sparkles.js +0 -26
- package/src/movethewheels/hooks/useAssistant.ts +0 -74
|
@@ -1147,18 +1147,6 @@ export type GetMovethewheelsDashboardQuery = {
|
|
|
1147
1147
|
}>;
|
|
1148
1148
|
};
|
|
1149
1149
|
};
|
|
1150
|
-
export type GetAssistantInsightsQueryVariables = Types.Exact<{
|
|
1151
|
-
question: Types.Scalars['String']['input'];
|
|
1152
|
-
}>;
|
|
1153
|
-
export type GetAssistantInsightsQuery = {
|
|
1154
|
-
__typename?: 'Query';
|
|
1155
|
-
assistantInsights: {
|
|
1156
|
-
__typename?: 'AssistantInsights';
|
|
1157
|
-
question: string;
|
|
1158
|
-
answer: string;
|
|
1159
|
-
generatedAt: string;
|
|
1160
|
-
};
|
|
1161
|
-
};
|
|
1162
1150
|
export type ListCustomersQueryVariables = Types.Exact<{
|
|
1163
1151
|
filter?: Types.InputMaybe<Types.CustomerFilterInput>;
|
|
1164
1152
|
pagination?: Types.InputMaybe<Types.PaginationInput>;
|
|
@@ -2964,36 +2952,6 @@ export type GetMovethewheelsDashboardQueryHookResult = ReturnType<typeof useGetM
|
|
|
2964
2952
|
export type GetMovethewheelsDashboardLazyQueryHookResult = ReturnType<typeof useGetMovethewheelsDashboardLazyQuery>;
|
|
2965
2953
|
export type GetMovethewheelsDashboardSuspenseQueryHookResult = ReturnType<typeof useGetMovethewheelsDashboardSuspenseQuery>;
|
|
2966
2954
|
export type GetMovethewheelsDashboardQueryResult = Apollo.QueryResult<Types.GetMovethewheelsDashboardQuery, Types.GetMovethewheelsDashboardQueryVariables>;
|
|
2967
|
-
export declare const GetAssistantInsightsDocument: Apollo.DocumentNode;
|
|
2968
|
-
/**
|
|
2969
|
-
* __useGetAssistantInsightsQuery__
|
|
2970
|
-
*
|
|
2971
|
-
* To run a query within a React component, call `useGetAssistantInsightsQuery` and pass it any options that fit your needs.
|
|
2972
|
-
* When your component renders, `useGetAssistantInsightsQuery` returns an object from Apollo Client that contains loading, error, and data properties
|
|
2973
|
-
* you can use to render your UI.
|
|
2974
|
-
*
|
|
2975
|
-
* @param baseOptions options that will be passed into the query, supported options are listed on: https://www.apollographql.com/docs/react/api/react-hooks/#options;
|
|
2976
|
-
*
|
|
2977
|
-
* @example
|
|
2978
|
-
* const { data, loading, error } = useGetAssistantInsightsQuery({
|
|
2979
|
-
* variables: {
|
|
2980
|
-
* question: // value for 'question'
|
|
2981
|
-
* },
|
|
2982
|
-
* });
|
|
2983
|
-
*/
|
|
2984
|
-
export declare function useGetAssistantInsightsQuery(baseOptions: ApolloReactHooks.QueryHookOptions<Types.GetAssistantInsightsQuery, Types.GetAssistantInsightsQueryVariables> & ({
|
|
2985
|
-
variables: Types.GetAssistantInsightsQueryVariables;
|
|
2986
|
-
skip?: boolean;
|
|
2987
|
-
} | {
|
|
2988
|
-
skip: boolean;
|
|
2989
|
-
})): ApolloReactHooks.useQuery.Result<Types.GetAssistantInsightsQuery, Types.GetAssistantInsightsQueryVariables, "empty" | "complete" | "streaming", Types.GetAssistantInsightsQueryVariables>;
|
|
2990
|
-
export declare function useGetAssistantInsightsLazyQuery(baseOptions?: ApolloReactHooks.LazyQueryHookOptions<Types.GetAssistantInsightsQuery, Types.GetAssistantInsightsQueryVariables>): ApolloReactHooks.useLazyQuery.ResultTuple<Types.GetAssistantInsightsQuery, Types.GetAssistantInsightsQueryVariables, "empty" | "complete" | "streaming">;
|
|
2991
|
-
export declare function useGetAssistantInsightsSuspenseQuery(baseOptions?: ApolloReactHooks.SuspenseQueryHookOptions<Types.GetAssistantInsightsQuery, Types.GetAssistantInsightsQueryVariables>): ApolloReactHooks.UseSuspenseQueryResult<Types.GetAssistantInsightsQuery, Types.GetAssistantInsightsQueryVariables>;
|
|
2992
|
-
export declare function useGetAssistantInsightsSuspenseQuery(baseOptions?: ApolloReactHooks.SkipToken | ApolloReactHooks.SuspenseQueryHookOptions<Types.GetAssistantInsightsQuery, Types.GetAssistantInsightsQueryVariables>): ApolloReactHooks.UseSuspenseQueryResult<Types.GetAssistantInsightsQuery | undefined, Types.GetAssistantInsightsQueryVariables>;
|
|
2993
|
-
export type GetAssistantInsightsQueryHookResult = ReturnType<typeof useGetAssistantInsightsQuery>;
|
|
2994
|
-
export type GetAssistantInsightsLazyQueryHookResult = ReturnType<typeof useGetAssistantInsightsLazyQuery>;
|
|
2995
|
-
export type GetAssistantInsightsSuspenseQueryHookResult = ReturnType<typeof useGetAssistantInsightsSuspenseQuery>;
|
|
2996
|
-
export type GetAssistantInsightsQueryResult = Apollo.QueryResult<Types.GetAssistantInsightsQuery, Types.GetAssistantInsightsQueryVariables>;
|
|
2997
2955
|
export declare const ListCustomersDocument: Apollo.DocumentNode;
|
|
2998
2956
|
/**
|
|
2999
2957
|
* __useListCustomersQuery__
|
package/dist/hooks/index.js
CHANGED
|
@@ -2,7 +2,7 @@ import { useMoveTheWheels as e } from "../providers/MoveTheWheelsProvider.js";
|
|
|
2
2
|
import { executeGraphQL as t } from "../utils/graphqlClient.js";
|
|
3
3
|
import { useCallback as n, useEffect as r, useMemo as i, useState as a } from "react";
|
|
4
4
|
//#region src/movethewheels/hooks/useAnalytics.ts
|
|
5
|
-
var o = "\n query GetMovethewheelsAnalytics {\n analytics {\n orderTrend {\n label\n value\n }\n deliveryTrend {\n label\n value\n }\n revenueTrend {\n label\n value\n }\n }\n dashboardMetrics {\n
|
|
5
|
+
var o = "\n query GetMovethewheelsAnalytics {\n analytics {\n orderTrend {\n label\n value\n }\n deliveryTrend {\n label\n value\n }\n revenueTrend {\n label\n value\n }\n }\n dashboardMetrics {\n totalDeliveryJobs\n activeDeliveries\n availableDrivers\n activeVehicles\n lowStockItems\n totalRevenue\n onTimeDeliveryRate\n customerSatisfaction\n }\n fleetStats {\n totalVehicles\n activeVehicles\n maintenanceVehicles\n avgDriverRating\n }\n }\n", s = "\n query GetDashboardMetrics {\n dashboardMetrics {\n totalDeliveryJobs\n activeDeliveries\n availableDrivers\n activeVehicles\n lowStockItems\n totalRevenue\n onTimeDeliveryRate\n customerSatisfaction\n }\n deliveryJobStats {\n total\n pending\n inTransit\n delivered\n cancelled\n failed\n }\n fleetStats {\n totalVehicles\n activeVehicles\n maintenanceVehicles\n totalDrivers\n availableDrivers\n onDeliveryDrivers\n avgDriverRating\n }\n financeMetrics {\n revenue {\n totalRevenue\n averageOrderValue\n }\n }\n }\n", c = "\n query GetOrderAnalytics {\n deliveryJobStats {\n pending\n inTransit\n delivered\n cancelled\n failed\n }\n analytics {\n orderTrend {\n label\n value\n }\n }\n }\n";
|
|
6
6
|
function l() {
|
|
7
7
|
return {
|
|
8
8
|
overview: {
|
|
@@ -54,7 +54,7 @@ function u(s = {}) {
|
|
|
54
54
|
let e = await t(x, o);
|
|
55
55
|
g({
|
|
56
56
|
overview: {
|
|
57
|
-
totalOrders: e.dashboardMetrics.
|
|
57
|
+
totalOrders: e.dashboardMetrics.totalDeliveryJobs,
|
|
58
58
|
totalRevenue: e.dashboardMetrics.totalRevenue,
|
|
59
59
|
activeVehicles: e.dashboardMetrics.activeVehicles,
|
|
60
60
|
onTimeDeliveryRate: e.dashboardMetrics.onTimeDeliveryRate,
|
|
@@ -153,10 +153,10 @@ function d() {
|
|
|
153
153
|
let e = await t(v, s);
|
|
154
154
|
p({
|
|
155
155
|
orders: {
|
|
156
|
-
total: e.
|
|
157
|
-
pending: e.
|
|
158
|
-
inTransit: e.
|
|
159
|
-
delivered: e.
|
|
156
|
+
total: e.deliveryJobStats.total,
|
|
157
|
+
pending: e.deliveryJobStats.pending,
|
|
158
|
+
inTransit: e.deliveryJobStats.inTransit,
|
|
159
|
+
delivered: e.deliveryJobStats.delivered,
|
|
160
160
|
today: 0
|
|
161
161
|
},
|
|
162
162
|
fleet: {
|
|
@@ -235,23 +235,23 @@ function p() {
|
|
|
235
235
|
byStatus: [
|
|
236
236
|
{
|
|
237
237
|
status: "pending",
|
|
238
|
-
count: e.
|
|
238
|
+
count: e.deliveryJobStats.pending
|
|
239
239
|
},
|
|
240
240
|
{
|
|
241
241
|
status: "in_transit",
|
|
242
|
-
count: e.
|
|
242
|
+
count: e.deliveryJobStats.inTransit
|
|
243
243
|
},
|
|
244
244
|
{
|
|
245
245
|
status: "delivered",
|
|
246
|
-
count: e.
|
|
246
|
+
count: e.deliveryJobStats.delivered
|
|
247
247
|
},
|
|
248
248
|
{
|
|
249
249
|
status: "cancelled",
|
|
250
|
-
count: e.
|
|
250
|
+
count: e.deliveryJobStats.cancelled
|
|
251
251
|
},
|
|
252
252
|
{
|
|
253
253
|
status: "failed",
|
|
254
|
-
count: e.
|
|
254
|
+
count: e.deliveryJobStats.failed
|
|
255
255
|
}
|
|
256
256
|
],
|
|
257
257
|
byType: [],
|
package/dist/index.js
CHANGED
|
@@ -9,31 +9,30 @@ import { useCustomer as b, useCustomerStats as x, useCustomers as S } from "./ho
|
|
|
9
9
|
import { useRoute as C, useRouteStats as w, useRoutes as T } from "./hooks/useRoutes.js";
|
|
10
10
|
import { useAnalytics as E, useDashboardMetrics as D, useFinanceMetrics as O, useFleetAnalytics as k, useOrderAnalytics as A, usePerformanceAnalytics as j, useRevenueAnalytics as M } from "./hooks/useAnalytics.js";
|
|
11
11
|
import { useDriverTracking as N, useGeofence as P, useLiveTracking as F, useOrderTracking as I, useTracking as L, useTrackingAlerts as R, useVehicleTracking as z } from "./hooks/useTracking.js";
|
|
12
|
-
import {
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
16
|
-
import { useEntityDocuments as W } from "./hooks/useEntityDocuments.js";
|
|
12
|
+
import { useReports as B } from "./hooks/useReports.js";
|
|
13
|
+
import { useImportExport as V } from "./hooks/useImportExport.js";
|
|
14
|
+
import { useModuleSettings as H } from "./hooks/useSettings.js";
|
|
15
|
+
import { useEntityDocuments as U } from "./hooks/useEntityDocuments.js";
|
|
17
16
|
import "./hooks/index.js";
|
|
18
|
-
import { Avatar as
|
|
19
|
-
import { EmptyState as
|
|
20
|
-
import { chartTokens as
|
|
21
|
-
import { Sparkline as
|
|
22
|
-
import { MetricCard as
|
|
23
|
-
import { GlassPanel as
|
|
24
|
-
import { ChartEmpty as
|
|
25
|
-
import { TrendChart as
|
|
26
|
-
import { VolumeBar as
|
|
27
|
-
import { StatusDonut as
|
|
28
|
-
import { createCurrentIcon as
|
|
29
|
-
import { MapCanvas as
|
|
30
|
-
import { LogisticsMap as
|
|
31
|
-
import { RouteMap as
|
|
32
|
-
import { TrackingMap as
|
|
33
|
-
import { PaymentStatusBadge as
|
|
34
|
-
import { DataTable as
|
|
35
|
-
import { FormError as
|
|
36
|
-
import { Notice as
|
|
37
|
-
import { DocumentsCard as
|
|
17
|
+
import { Avatar as W, AvatarFallback as G, AvatarImage as K, Badge as q, Button as J, Card as Y, CardContent as X, CardDescription as Z, CardFooter as Q, CardHeader as $, CardTitle as ee, Checkbox as te, Dialog as ne, DialogContent as re, DialogDescription as ie, DialogFooter as ae, DialogHeader as oe, DialogTitle as se, DialogTrigger as ce, DropdownMenu as le, DropdownMenuContent as ue, DropdownMenuItem as de, DropdownMenuSeparator as fe, DropdownMenuTrigger as pe, Input as me, Label as he, Progress as ge, ScrollArea as _e, Select as ve, SelectContent as ye, SelectItem as be, SelectTrigger as xe, SelectValue as Se, Separator as Ce, Skeleton as we, Switch as Te, Table as Ee, TableBody as De, TableCell as Oe, TableHead as ke, TableHeader as Ae, TableRow as je, Tabs as Me, TabsContent as Ne, TabsList as Pe, TabsTrigger as Fe, Textarea as Ie, Tooltip as Le, TooltipContent as Re, TooltipProvider as ze, TooltipTrigger as Be } from "./components/ui.js";
|
|
18
|
+
import { EmptyState as Ve, ErrorState as He, LoadingState as Ue, PageLayout as We, PageSection as Ge } from "./components/PageLayout.js";
|
|
19
|
+
import { chartTokens as Ke, seriesColor as qe } from "./components/charts/chartTokens.js";
|
|
20
|
+
import { Sparkline as Je } from "./components/charts/Sparkline.js";
|
|
21
|
+
import { MetricCard as Ye, MetricCardSkeleton as Xe, MetricGrid as Ze } from "./components/MetricCard.js";
|
|
22
|
+
import { GlassPanel as Qe } from "./components/GlassPanel.js";
|
|
23
|
+
import { ChartEmpty as $e, ChartTooltip as et } from "./components/charts/ChartShell.js";
|
|
24
|
+
import { TrendChart as tt } from "./components/charts/TrendChart.js";
|
|
25
|
+
import { VolumeBar as nt } from "./components/charts/VolumeBar.js";
|
|
26
|
+
import { StatusDonut as rt } from "./components/charts/StatusDonut.js";
|
|
27
|
+
import { createCurrentIcon as it, createPinIcon as at, createStopIcon as ot, isRealCoord as st } from "./components/maps/leaflet-setup.js";
|
|
28
|
+
import { MapCanvas as ct } from "./components/maps/MapCanvas.js";
|
|
29
|
+
import { LogisticsMap as lt } from "./components/maps/LogisticsMap.js";
|
|
30
|
+
import { RouteMap as ut } from "./components/maps/RouteMap.js";
|
|
31
|
+
import { TrackingMap as dt } from "./components/maps/TrackingMap.js";
|
|
32
|
+
import { PaymentStatusBadge as ft, PriorityBadge as pt, StatusBadge as mt, TypeBadge as ht, VehicleTypeBadge as gt } from "./components/StatusBadge.js";
|
|
33
|
+
import { DataTable as _t } from "./components/DataTable.js";
|
|
34
|
+
import { FormError as vt } from "./components/FormError.js";
|
|
35
|
+
import { Notice as yt, useNotice as bt } from "./components/Notice.js";
|
|
36
|
+
import { DocumentsCard as xt } from "./components/DocumentsCard.js";
|
|
38
37
|
import "./components/index.js";
|
|
39
|
-
export {
|
|
38
|
+
export { W as Avatar, G as AvatarFallback, K as AvatarImage, q as Badge, J as Button, Y as Card, X as CardContent, Z as CardDescription, Q as CardFooter, $ as CardHeader, ee as CardTitle, $e as ChartEmpty, et as ChartTooltip, te as Checkbox, _t as DataTable, ne as Dialog, re as DialogContent, ie as DialogDescription, ae as DialogFooter, oe as DialogHeader, se as DialogTitle, ce as DialogTrigger, xt as DocumentsCard, le as DropdownMenu, ue as DropdownMenuContent, de as DropdownMenuItem, fe as DropdownMenuSeparator, pe as DropdownMenuTrigger, Ve as EmptyState, He as ErrorState, vt as FormError, Qe as GlassPanel, me as Input, he as Label, Ue as LoadingState, lt as LogisticsMap, ct as MapCanvas, Ye as MetricCard, Xe as MetricCardSkeleton, Ze as MetricGrid, n as MoveTheWheelsRoot, yt as Notice, We as PageLayout, Ge as PageSection, ft as PaymentStatusBadge, pt as PriorityBadge, ge as Progress, ut as RouteMap, _e as ScrollArea, ve as Select, ye as SelectContent, be as SelectItem, xe as SelectTrigger, Se as SelectValue, Ce as Separator, we as Skeleton, Je as Sparkline, mt as StatusBadge, rt as StatusDonut, Te as Switch, Ee as Table, De as TableBody, Oe as TableCell, ke as TableHead, Ae as TableHeader, je as TableRow, Me as Tabs, Ne as TabsContent, Pe as TabsList, Fe as TabsTrigger, Ie as Textarea, Le as Tooltip, Re as TooltipContent, ze as TooltipProvider, Be as TooltipTrigger, dt as TrackingMap, tt as TrendChart, ht as TypeBadge, gt as VehicleTypeBadge, nt as VolumeBar, Ke as chartTokens, it as createCurrentIcon, at as createPinIcon, ot as createStopIcon, st as isRealCoord, qe as seriesColor, E as useAnalytics, b as useCustomer, x as useCustomerStats, S as useCustomers, D as useDashboardMetrics, c as useDriver, N as useDriverTracking, l as useDrivers, U as useEntityDocuments, O as useFinanceMetrics, u as useFleet, k as useFleetAnalytics, d as useFleetStats, P as useGeofence, V as useImportExport, m as useInventory, h as useInventoryStats, F as useLiveTracking, H as useModuleSettings, e as useMoveTheWheels, t as useMoveTheWheelsNavigate, r as useMoveTheWheelsStore, bt as useNotice, a as useOrder, A as useOrderAnalytics, o as useOrderStats, I as useOrderTracking, s as useOrders, j as usePerformanceAnalytics, g as useProduct, _ as useProducts, B as useReports, M as useRevenueAnalytics, C as useRoute, w as useRouteStats, T as useRoutes, i as useSandboxAssistantTransport, L as useTracking, R as useTrackingAlerts, f as useVehicle, z as useVehicleTracking, p as useVehicles, v as useWarehouse, y as useWarehouses };
|
|
@@ -10,7 +10,6 @@ export { useCustomers, useCustomer, useCustomerStats } from './useCustomers';
|
|
|
10
10
|
export { useRoutes, useRoute, useRouteStats } from './useRoutes';
|
|
11
11
|
export { useAnalytics, useDashboardMetrics, useRevenueAnalytics, useOrderAnalytics, useFleetAnalytics, usePerformanceAnalytics, useFinanceMetrics, type FinanceMetrics, } from './useAnalytics';
|
|
12
12
|
export { useTracking, useOrderTracking, useVehicleTracking, useDriverTracking, useLiveTracking, useTrackingAlerts, useGeofence, } from './useTracking';
|
|
13
|
-
export { useAssistant } from './useAssistant';
|
|
14
13
|
export { useReports } from './useReports';
|
|
15
14
|
export { useImportExport } from './useImportExport';
|
|
16
15
|
export { useModuleSettings } from './useSettings';
|
|
@@ -1,4 +1,22 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* AI
|
|
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.
|
|
3
21
|
*/
|
|
4
22
|
export default function AIAssistantPage(): import("react").JSX.Element;
|
|
@@ -0,0 +1,8 @@
|
|
|
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 };
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { createLucideIcon as e } from "../createLucideIcon.js";
|
|
2
|
+
//#region node_modules/lucide-react/dist/esm/icons/shield-check.js
|
|
3
|
+
var t = e("ShieldCheck", [["path", {
|
|
4
|
+
d: "M20 13c0 5-3.5 7.5-7.66 8.95a1 1 0 0 1-.67-.01C7.5 20.5 4 18 4 13V6a1 1 0 0 1 1-1c2 0 4.5-1.2 6.24-2.72a1.17 1.17 0 0 1 1.52 0C14.51 3.81 17 5 19 5a1 1 0 0 1 1 1z",
|
|
5
|
+
key: "oel41y"
|
|
6
|
+
}], ["path", {
|
|
7
|
+
d: "m9 12 2 2 4-4",
|
|
8
|
+
key: "dzmm74"
|
|
9
|
+
}]]);
|
|
10
|
+
//#endregion
|
|
11
|
+
export { t as ShieldCheck };
|
|
@@ -0,0 +1,11 @@
|
|
|
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,206 +1,79 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
10
|
-
import { PageLayout as g } from "../components/PageLayout.js";
|
|
11
|
-
import { useState as _ } from "react";
|
|
12
|
-
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
13
|
-
import { GlassCard as b, PagePurpose as x } from "@burdenoff/fe-libs/ui";
|
|
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 { Card as a, CardContent as o, CardHeader as s, CardTitle as c } from "../components/ui.js";
|
|
7
|
+
import { EmptyState as l, PageLayout as u } from "../components/PageLayout.js";
|
|
8
|
+
import { jsx as d, jsxs as f } from "react/jsx-runtime";
|
|
9
|
+
import { GlassCard as p, PagePurpose as m } from "@burdenoff/fe-libs/ui";
|
|
14
10
|
//#region src/movethewheels/pages/AIAssistantPage.tsx
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
content: e.answer
|
|
58
|
-
}]);
|
|
59
|
-
} catch (e) {
|
|
60
|
-
D((t) => [...t, {
|
|
61
|
-
role: "assistant",
|
|
62
|
-
content: e instanceof Error ? `Sorry, I couldn't answer that: ${e.message}` : "Sorry, I couldn't reach the assistant. Please try again.",
|
|
63
|
-
isError: !0
|
|
64
|
-
}]);
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
}, j = () => {
|
|
68
|
-
A(w);
|
|
69
|
-
};
|
|
70
|
-
return /* @__PURE__ */ y(g, {
|
|
71
|
-
title: "AI Assistant",
|
|
72
|
-
subtitle: "Intelligent logistics support",
|
|
73
|
-
icon: /* @__PURE__ */ v(e, { size: 24 }),
|
|
74
|
-
children: [/* @__PURE__ */ v(x, {
|
|
75
|
-
icon: /* @__PURE__ */ v(e, { size: 18 }),
|
|
76
|
-
children: "Ask plain-English questions about your operation and get answers backed by your own data. Use it to optimize routes, forecast demand, spot likely delays, and run what-if scenarios (e.g. “what if I add two vehicles?”) — like having a logistics analyst on call."
|
|
77
|
-
}), /* @__PURE__ */ y("div", {
|
|
78
|
-
className: "grid grid-cols-1 lg:grid-cols-3 gap-6",
|
|
79
|
-
children: [/* @__PURE__ */ v("div", {
|
|
80
|
-
className: "lg:col-span-2 space-y-4",
|
|
81
|
-
children: /* @__PURE__ */ y(b, {
|
|
82
|
-
treatment: "glass",
|
|
83
|
-
glow: !0,
|
|
84
|
-
className: "h-[600px] flex flex-col",
|
|
85
|
-
children: [
|
|
86
|
-
/* @__PURE__ */ v(f, {
|
|
87
|
-
className: "border-b border-border-seam",
|
|
88
|
-
children: /* @__PURE__ */ y(p, {
|
|
89
|
-
className: "flex items-center gap-2",
|
|
90
|
-
children: [/* @__PURE__ */ v(a, {
|
|
91
|
-
size: 18,
|
|
92
|
-
className: "text-primary"
|
|
93
|
-
}), " Chat with AI"]
|
|
94
|
-
})
|
|
95
|
-
}),
|
|
96
|
-
/* @__PURE__ */ v(h, {
|
|
97
|
-
className: "flex-1 p-4",
|
|
98
|
-
children: /* @__PURE__ */ y("div", {
|
|
99
|
-
className: "space-y-4",
|
|
100
|
-
children: [E.map((e, t) => /* @__PURE__ */ v("div", {
|
|
101
|
-
className: `flex ${e.role === "user" ? "justify-end" : "justify-start"}`,
|
|
102
|
-
children: /* @__PURE__ */ v("div", {
|
|
103
|
-
className: `max-w-[80%] p-3 rounded-lg ${e.role === "user" ? "bg-action-primary-bg text-action-primary-text" : e.isError ? "bg-status-error-bg-subtle text-status-error-text" : "bg-bg-sunken"}`,
|
|
104
|
-
children: /* @__PURE__ */ v("p", {
|
|
105
|
-
className: "whitespace-pre-line text-sm",
|
|
106
|
-
children: e.content
|
|
107
|
-
})
|
|
108
|
-
})
|
|
109
|
-
}, t)), C && /* @__PURE__ */ v("div", {
|
|
110
|
-
className: "flex justify-start",
|
|
111
|
-
"aria-live": "polite",
|
|
112
|
-
children: /* @__PURE__ */ y("div", {
|
|
113
|
-
className: "max-w-[80%] p-3 rounded-lg bg-bg-sunken flex items-center gap-2",
|
|
114
|
-
children: [/* @__PURE__ */ v(a, {
|
|
115
|
-
size: 14,
|
|
116
|
-
className: "text-primary motion-safe:animate-pulse"
|
|
117
|
-
}), /* @__PURE__ */ v("span", {
|
|
118
|
-
className: "text-sm text-text-secondary",
|
|
119
|
-
children: "Analyzing your data…"
|
|
120
|
-
})]
|
|
121
|
-
})
|
|
122
|
-
})]
|
|
123
|
-
})
|
|
124
|
-
}),
|
|
125
|
-
/* @__PURE__ */ v("div", {
|
|
126
|
-
className: "p-4 border-t",
|
|
127
|
-
children: /* @__PURE__ */ y("div", {
|
|
128
|
-
className: "flex gap-2",
|
|
129
|
-
children: [/* @__PURE__ */ v(m, {
|
|
130
|
-
value: w,
|
|
131
|
-
onChange: (e) => T(e.target.value),
|
|
132
|
-
placeholder: "Ask me anything about your logistics operations...",
|
|
133
|
-
disabled: C,
|
|
134
|
-
onKeyPress: (e) => e.key === "Enter" && j()
|
|
135
|
-
}), /* @__PURE__ */ v(l, {
|
|
136
|
-
onClick: j,
|
|
137
|
-
disabled: C || !w.trim(),
|
|
138
|
-
children: /* @__PURE__ */ v(i, { size: 16 })
|
|
139
|
-
})]
|
|
140
|
-
})
|
|
141
|
-
})
|
|
142
|
-
]
|
|
11
|
+
var h = [
|
|
12
|
+
{
|
|
13
|
+
icon: e,
|
|
14
|
+
title: "Agent activity feed",
|
|
15
|
+
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."
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
icon: r,
|
|
19
|
+
title: "Dispatch decision cards",
|
|
20
|
+
description: "Proposed driver/vehicle assignments and carrier recommendations with rationale and confidence, requiring an explicit accept or reject before anything is written."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
icon: i,
|
|
24
|
+
title: "AI credit visibility",
|
|
25
|
+
description: "Per-workspace AI spend for admins, so cost is visible before the invoice."
|
|
26
|
+
}
|
|
27
|
+
];
|
|
28
|
+
function g() {
|
|
29
|
+
return /* @__PURE__ */ f(u, {
|
|
30
|
+
title: "AI Operations",
|
|
31
|
+
subtitle: "What the AI is doing on your workspace, and why",
|
|
32
|
+
icon: /* @__PURE__ */ d(t, { size: 24 }),
|
|
33
|
+
children: [
|
|
34
|
+
/* @__PURE__ */ d(m, {
|
|
35
|
+
icon: /* @__PURE__ */ d(t, { size: 18 }),
|
|
36
|
+
children: "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."
|
|
37
|
+
}),
|
|
38
|
+
/* @__PURE__ */ d(p, {
|
|
39
|
+
treatment: "glass",
|
|
40
|
+
className: "p-4",
|
|
41
|
+
children: /* @__PURE__ */ f("div", {
|
|
42
|
+
className: "flex items-start gap-3",
|
|
43
|
+
children: [/* @__PURE__ */ d(n, {
|
|
44
|
+
size: 20,
|
|
45
|
+
className: "text-primary flex-shrink-0 mt-0.5"
|
|
46
|
+
}), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
|
|
47
|
+
className: "text-sm font-medium text-text-primary",
|
|
48
|
+
children: "Looking to ask a question about your operations?"
|
|
49
|
+
}), /* @__PURE__ */ d("p", {
|
|
50
|
+
className: "text-sm text-text-secondary mt-1",
|
|
51
|
+
children: "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."
|
|
52
|
+
})] })]
|
|
143
53
|
})
|
|
144
|
-
}),
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
children: e.category
|
|
167
|
-
})
|
|
168
|
-
]
|
|
169
|
-
}, t))
|
|
170
|
-
})] }),
|
|
171
|
-
/* @__PURE__ */ y(u, { children: [/* @__PURE__ */ v(f, { children: /* @__PURE__ */ v(p, { children: "Capabilities" }) }), /* @__PURE__ */ v(d, { children: /* @__PURE__ */ v("ul", {
|
|
172
|
-
className: "space-y-2 text-sm",
|
|
173
|
-
children: k.map((e, t) => /* @__PURE__ */ y("li", {
|
|
174
|
-
className: "flex items-start gap-2",
|
|
175
|
-
children: [/* @__PURE__ */ v(a, {
|
|
176
|
-
size: 14,
|
|
177
|
-
className: "text-primary mt-0.5 flex-shrink-0"
|
|
178
|
-
}), /* @__PURE__ */ v("span", { children: e })]
|
|
179
|
-
}, t))
|
|
180
|
-
}) })] }),
|
|
181
|
-
/* @__PURE__ */ v(u, {
|
|
182
|
-
className: "bg-action-primary-bg/5 border-primary/20",
|
|
183
|
-
children: /* @__PURE__ */ v(d, {
|
|
184
|
-
className: "p-4",
|
|
185
|
-
children: /* @__PURE__ */ y("div", {
|
|
186
|
-
className: "flex items-start gap-3",
|
|
187
|
-
children: [/* @__PURE__ */ v(n, {
|
|
188
|
-
size: 20,
|
|
189
|
-
className: "text-primary flex-shrink-0"
|
|
190
|
-
}), /* @__PURE__ */ y("div", { children: [/* @__PURE__ */ v("p", {
|
|
191
|
-
className: "font-medium text-sm",
|
|
192
|
-
children: "Pro Tip"
|
|
193
|
-
}), /* @__PURE__ */ v("p", {
|
|
194
|
-
className: "text-xs text-text-secondary",
|
|
195
|
-
children: "You can ask complex questions like \"What would happen if I added 2 more vehicles to my fleet?\" for scenario analysis."
|
|
196
|
-
})] })]
|
|
197
|
-
})
|
|
198
|
-
})
|
|
199
|
-
})
|
|
200
|
-
]
|
|
201
|
-
})]
|
|
202
|
-
})]
|
|
54
|
+
}),
|
|
55
|
+
/* @__PURE__ */ f(a, { children: [/* @__PURE__ */ d(s, { children: /* @__PURE__ */ d(c, { children: "On the roadmap" }) }), /* @__PURE__ */ f(o, { children: [/* @__PURE__ */ d(l, {
|
|
56
|
+
illustration: "empty-agents",
|
|
57
|
+
title: "Autonomous dispatch operations aren't live yet",
|
|
58
|
+
description: "These capabilities depend on the shared multi-model AI gateway and agent-run ledger (BOFF-3601), which hasn't shipped across the platform yet. Nothing below is available today."
|
|
59
|
+
}), /* @__PURE__ */ d("ul", {
|
|
60
|
+
className: "mt-4 space-y-4",
|
|
61
|
+
children: h.map((e) => /* @__PURE__ */ f("li", {
|
|
62
|
+
className: "flex items-start gap-3",
|
|
63
|
+
children: [/* @__PURE__ */ d(e.icon, {
|
|
64
|
+
size: 18,
|
|
65
|
+
className: "text-text-secondary flex-shrink-0 mt-0.5"
|
|
66
|
+
}), /* @__PURE__ */ f("div", { children: [/* @__PURE__ */ d("p", {
|
|
67
|
+
className: "text-sm font-medium text-text-primary",
|
|
68
|
+
children: e.title
|
|
69
|
+
}), /* @__PURE__ */ d("p", {
|
|
70
|
+
className: "text-xs text-text-secondary",
|
|
71
|
+
children: e.description
|
|
72
|
+
})] })]
|
|
73
|
+
}, e.title))
|
|
74
|
+
})] })] })
|
|
75
|
+
]
|
|
203
76
|
});
|
|
204
77
|
}
|
|
205
78
|
//#endregion
|
|
206
|
-
export {
|
|
79
|
+
export { g as default };
|
package/package.json
CHANGED