@elizaos/plugin-shopify-ui 2.0.3-beta.5 → 2.0.3-beta.7

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 (79) hide show
  1. package/dist/CustomersPanel.d.ts +11 -0
  2. package/dist/CustomersPanel.d.ts.map +1 -0
  3. package/dist/CustomersPanel.js +86 -0
  4. package/dist/CustomersPanel.js.map +1 -0
  5. package/dist/InventoryLevelsPanel.d.ts +10 -0
  6. package/dist/InventoryLevelsPanel.d.ts.map +1 -0
  7. package/dist/InventoryLevelsPanel.js +190 -0
  8. package/dist/InventoryLevelsPanel.js.map +1 -0
  9. package/dist/OrdersPanel.d.ts +12 -0
  10. package/dist/OrdersPanel.d.ts.map +1 -0
  11. package/dist/OrdersPanel.js +170 -0
  12. package/dist/OrdersPanel.js.map +1 -0
  13. package/dist/ProductsPanel.d.ts +13 -0
  14. package/dist/ProductsPanel.d.ts.map +1 -0
  15. package/dist/ProductsPanel.js +419 -0
  16. package/dist/ProductsPanel.js.map +1 -0
  17. package/dist/ShopifyAppView.d.ts +3 -0
  18. package/dist/ShopifyAppView.d.ts.map +1 -0
  19. package/dist/ShopifyAppView.helpers.d.ts +11 -0
  20. package/dist/ShopifyAppView.helpers.d.ts.map +1 -0
  21. package/dist/ShopifyAppView.helpers.js +59 -0
  22. package/dist/ShopifyAppView.helpers.js.map +1 -0
  23. package/dist/ShopifyAppView.interact.d.ts +2 -0
  24. package/dist/ShopifyAppView.interact.d.ts.map +1 -0
  25. package/dist/ShopifyAppView.interact.js +93 -0
  26. package/dist/ShopifyAppView.interact.js.map +1 -0
  27. package/dist/ShopifyAppView.js +667 -0
  28. package/dist/ShopifyAppView.js.map +1 -0
  29. package/dist/ShopifyView.d.ts +18 -0
  30. package/dist/ShopifyView.d.ts.map +1 -0
  31. package/dist/ShopifyView.js +143 -0
  32. package/dist/ShopifyView.js.map +1 -0
  33. package/dist/StoreOverviewCard.d.ts +13 -0
  34. package/dist/StoreOverviewCard.d.ts.map +1 -0
  35. package/dist/StoreOverviewCard.js +23 -0
  36. package/dist/StoreOverviewCard.js.map +1 -0
  37. package/dist/components/ShopifySpatialView.d.ts +57 -0
  38. package/dist/components/ShopifySpatialView.d.ts.map +1 -0
  39. package/dist/components/ShopifySpatialView.js +419 -0
  40. package/dist/components/ShopifySpatialView.js.map +1 -0
  41. package/dist/index.d.ts +14 -0
  42. package/dist/index.d.ts.map +1 -0
  43. package/dist/index.js +20 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/plugin.d.ts +14 -0
  46. package/dist/plugin.d.ts.map +1 -0
  47. package/dist/plugin.js +94 -0
  48. package/dist/plugin.js.map +1 -0
  49. package/dist/register-routes.d.ts +2 -0
  50. package/dist/register-routes.d.ts.map +1 -0
  51. package/dist/register-routes.js +6 -0
  52. package/dist/register-routes.js.map +1 -0
  53. package/dist/register-terminal-view.d.ts +15 -0
  54. package/dist/register-terminal-view.d.ts.map +1 -0
  55. package/dist/register-terminal-view.js +37 -0
  56. package/dist/register-terminal-view.js.map +1 -0
  57. package/dist/register.d.ts +2 -0
  58. package/dist/register.d.ts.map +1 -0
  59. package/dist/register.js +17 -0
  60. package/dist/register.js.map +1 -0
  61. package/dist/routes.d.ts +18 -0
  62. package/dist/routes.d.ts.map +1 -0
  63. package/dist/routes.js +518 -0
  64. package/dist/routes.js.map +1 -0
  65. package/dist/shopify-app.d.ts +11 -0
  66. package/dist/shopify-app.d.ts.map +1 -0
  67. package/dist/shopify-app.js +16 -0
  68. package/dist/shopify-app.js.map +1 -0
  69. package/dist/shopify-view-bundle.d.ts +3 -0
  70. package/dist/shopify-view-bundle.d.ts.map +1 -0
  71. package/dist/shopify-view-bundle.js +7 -0
  72. package/dist/shopify-view-bundle.js.map +1 -0
  73. package/dist/useShopifyDashboard.d.ts +118 -0
  74. package/dist/useShopifyDashboard.d.ts.map +1 -0
  75. package/dist/useShopifyDashboard.js +212 -0
  76. package/dist/useShopifyDashboard.js.map +1 -0
  77. package/dist/views/bundle.js +948 -0
  78. package/dist/views/bundle.js.map +1 -0
  79. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bundle.js","names":[],"sources":["../../src/ShopifyAppView.helpers.ts","../../src/ShopifyAppView.interact.ts","../../src/components/ShopifySpatialView.tsx","../../src/useShopifyDashboard.ts","../../src/ShopifyView.tsx"],"sourcesContent":["// Shared fetch helpers for the Shopify view, used by the `interact` capability\n// handler (in ShopifyAppView.interact.ts). Kept out of the .tsx so that file\n// exports only React components and stays Fast-Refresh-compatible in dev.\nimport type {\n ShopifyCustomersResponse,\n ShopifyInventoryResponse,\n ShopifyOrdersResponse,\n ShopifyProductsResponse,\n ShopifyStatus,\n} from \"./useShopifyDashboard\";\n\nexport async function fetchShopifyTuiJson<T>(url: string): Promise<T | null> {\n const response = await fetch(url);\n if (response.status === 404) return null;\n const data = await response.json().catch(() => null);\n if (!response.ok) {\n const message =\n data && typeof data === \"object\" && \"error\" in data\n ? String(data.error)\n : `Shopify request failed with ${response.status}`;\n throw new Error(message);\n }\n return data as T;\n}\n\nexport async function postShopifyTuiJson(\n url: string,\n body: Record<string, unknown>,\n): Promise<unknown> {\n const response = await fetch(url, {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify(body),\n });\n const data = await response.json().catch(() => ({}));\n if (!response.ok) {\n const message =\n data && typeof data === \"object\" && \"error\" in data\n ? String(data.error)\n : `Shopify request failed with ${response.status}`;\n throw new Error(message);\n }\n return data;\n}\n\nexport async function loadShopifyTuiState(): Promise<{\n status: ShopifyStatus;\n products: ShopifyProductsResponse | null;\n orders: ShopifyOrdersResponse | null;\n inventory: ShopifyInventoryResponse | null;\n customers: ShopifyCustomersResponse | null;\n}> {\n const status = (await fetchShopifyTuiJson<ShopifyStatus>(\n \"/api/shopify/status\",\n )) ?? {\n connected: false,\n shop: null,\n };\n\n if (!status.connected) {\n return {\n status,\n products: null,\n orders: null,\n inventory: null,\n customers: null,\n };\n }\n\n const [products, orders, inventory, customers] = await Promise.all([\n fetchShopifyTuiJson<ShopifyProductsResponse>(\n \"/api/shopify/products?page=1&limit=10&q=\",\n ),\n fetchShopifyTuiJson<ShopifyOrdersResponse>(\n \"/api/shopify/orders?status=any&limit=10\",\n ),\n fetchShopifyTuiJson<ShopifyInventoryResponse>(\"/api/shopify/inventory\"),\n fetchShopifyTuiJson<ShopifyCustomersResponse>(\n \"/api/shopify/customers?q=&limit=10\",\n ),\n ]);\n\n return { status, products, orders, inventory, customers };\n}\n","// View-bundle `interact` capability handler, split out of ShopifyAppView.tsx\n// so that file exports only React components and stays Fast-Refresh-compatible\n// (Vite would full-reload a component file that also exports a plain function).\n// The view bundle re-exports `interact` via ./shopify-view-bundle.ts.\nimport {\n fetchShopifyTuiJson,\n loadShopifyTuiState,\n postShopifyTuiJson,\n} from \"./ShopifyAppView.helpers\";\nimport type {\n ShopifyCustomersResponse,\n ShopifyInventoryResponse,\n ShopifyOrdersResponse,\n ShopifyProductsResponse,\n} from \"./useShopifyDashboard\";\n\nexport async function interact(\n capability: string,\n params?: Record<string, unknown>,\n): Promise<unknown> {\n if (capability === \"terminal-shopify-state\") {\n return { viewType: \"tui\", ...(await loadShopifyTuiState()) };\n }\n\n if (capability === \"terminal-shopify-products\") {\n const query = typeof params?.query === \"string\" ? params.query.trim() : \"\";\n const page = typeof params?.page === \"number\" ? params.page : 1;\n const limit = typeof params?.limit === \"number\" ? params.limit : 20;\n return {\n viewType: \"tui\",\n products: await fetchShopifyTuiJson<ShopifyProductsResponse>(\n `/api/shopify/products?${new URLSearchParams({\n page: String(page),\n limit: String(limit),\n q: query,\n })}`,\n ),\n };\n }\n\n if (capability === \"terminal-shopify-orders\") {\n const status =\n typeof params?.status === \"string\" ? params.status.trim() : \"any\";\n const limit = typeof params?.limit === \"number\" ? params.limit : 20;\n return {\n viewType: \"tui\",\n orders: await fetchShopifyTuiJson<ShopifyOrdersResponse>(\n `/api/shopify/orders?${new URLSearchParams({\n status,\n limit: String(limit),\n })}`,\n ),\n };\n }\n\n if (capability === \"terminal-shopify-inventory\") {\n return {\n viewType: \"tui\",\n inventory: await fetchShopifyTuiJson<ShopifyInventoryResponse>(\n \"/api/shopify/inventory\",\n ),\n };\n }\n\n if (capability === \"terminal-shopify-customers\") {\n const query = typeof params?.query === \"string\" ? params.query.trim() : \"\";\n const limit = typeof params?.limit === \"number\" ? params.limit : 20;\n return {\n viewType: \"tui\",\n customers: await fetchShopifyTuiJson<ShopifyCustomersResponse>(\n `/api/shopify/customers?${new URLSearchParams({\n q: query,\n limit: String(limit),\n })}`,\n ),\n };\n }\n\n if (capability === \"terminal-shopify-create-product\") {\n const title = typeof params?.title === \"string\" ? params.title.trim() : \"\";\n if (!title) throw new Error(\"title is required\");\n return {\n viewType: \"tui\",\n product: await postShopifyTuiJson(\"/api/shopify/products\", {\n title,\n vendor: typeof params?.vendor === \"string\" ? params.vendor : undefined,\n productType:\n typeof params?.productType === \"string\"\n ? params.productType\n : undefined,\n price:\n typeof params?.price === \"string\" || typeof params?.price === \"number\"\n ? params.price\n : undefined,\n }),\n };\n }\n\n if (capability === \"terminal-shopify-adjust-inventory\") {\n const itemId =\n typeof params?.itemId === \"string\" ? params.itemId.trim() : \"\";\n const delta = typeof params?.delta === \"number\" ? params.delta : null;\n if (!itemId) throw new Error(\"itemId is required\");\n if (delta === null) throw new Error(\"delta is required\");\n return {\n viewType: \"tui\",\n inventory: await postShopifyTuiJson(\n `/api/shopify/inventory/${encodeURIComponent(itemId)}/adjust`,\n {\n delta,\n locationId:\n typeof params?.locationId === \"string\"\n ? params.locationId\n : undefined,\n },\n ),\n };\n }\n\n throw new Error(`Unsupported capability \"${capability}\"`);\n}\n","/**\n * ShopifySpatialView - the Shopify store dashboard authored once with the\n * spatial vocabulary, so it renders correctly wherever it is displayed:\n *\n * - GUI / XR - mounted in `<SpatialSurface>` (DOM; XR scales up).\n * - TUI - rendered to real terminal lines by the agent terminal, via\n * `registerSpatialTerminalView` (see `register-terminal-view.tsx`).\n *\n * It is purely presentational (a snapshot + an action callback in, primitives\n * out) and imports only the cross-modality primitives plus type-only views of\n * the dashboard data shapes, so it is safe to render in the Node agent process\n * where the terminal lives (no React-DOM / browser runtime import).\n *\n * GUI Tabs map to spatial sections: the dashboard shows a counts strip\n * (overview) and one focused commerce section per active tab. On every surface\n * tab selection is a row of `Button`s; the host swaps `snapshot.tab` and\n * re-renders, so the same authored view drives GUI tab clicks, XR spatial\n * selection, and TUI grid sections from one source of truth.\n */\n\nimport {\n Button,\n Card,\n Divider,\n Field,\n HStack,\n List,\n type SpatialTone,\n Text,\n VStack,\n} from \"@elizaos/ui/spatial\";\nimport type {\n ShopifyCustomer,\n ShopifyInventoryItem,\n ShopifyOrder,\n ShopifyProduct,\n ShopifyStatus,\n} from \"../useShopifyDashboard.ts\";\n\nexport type ShopifyTab =\n | \"overview\"\n | \"products\"\n | \"orders\"\n | \"inventory\"\n | \"customers\";\n\nexport interface ShopifySnapshot {\n status: ShopifyStatus | null;\n tab: ShopifyTab;\n counts: { productCount: number; orderCount: number; customerCount: number };\n products: ShopifyProduct[];\n productsTotal: number;\n productsPage: number;\n productSearch: string;\n orders: ShopifyOrder[];\n ordersTotal: number;\n orderStatusFilter: string;\n inventoryItems: ShopifyInventoryItem[];\n inventoryLocations: string[];\n customers: ShopifyCustomer[];\n customersTotal: number;\n customerSearch: string;\n loading?: boolean;\n error?: string | null;\n}\n\nconst TABS: { id: ShopifyTab; label: string }[] = [\n { id: \"overview\", label: \"Overview\" },\n { id: \"products\", label: \"Products\" },\n { id: \"orders\", label: \"Orders\" },\n { id: \"inventory\", label: \"Inventory\" },\n { id: \"customers\", label: \"Customers\" },\n];\n\nfunction financialTone(status: ShopifyOrder[\"financialStatus\"]): SpatialTone {\n switch (status) {\n case \"PAID\":\n return \"success\";\n case \"PENDING\":\n return \"warning\";\n case \"REFUNDED\":\n case \"PARTIALLY_REFUNDED\":\n return \"danger\";\n default:\n return \"muted\";\n }\n}\n\nfunction productStatusTone(status: ShopifyProduct[\"status\"]): SpatialTone {\n switch (status) {\n case \"ACTIVE\":\n return \"success\";\n case \"DRAFT\":\n return \"warning\";\n default:\n return \"muted\";\n }\n}\n\nfunction inventoryTone(available: number): SpatialTone {\n if (available === 0) return \"danger\";\n if (available <= 5) return \"warning\";\n return \"default\";\n}\n\nfunction CountTile({\n label,\n value,\n tone,\n agent,\n onPress,\n}: {\n label: string;\n value: number;\n tone: SpatialTone;\n agent: string;\n onPress: () => void;\n}) {\n // Borderless stat block — sections use the outer frame + dividers, not nested\n // boxes. The trailing Button is the cross-modal hit target that navigates to\n // the matching tab (GUI parity with the clickable overview tiles).\n return (\n <VStack gap={0} grow={1}>\n <Text style=\"subheading\" tone={tone} bold>\n {value.toLocaleString()}\n </Text>\n <Button variant=\"ghost\" tone=\"default\" agent={agent} onPress={onPress}>\n {label}\n </Button>\n </VStack>\n );\n}\n\nfunction OverviewSection({\n snapshot,\n onAction,\n}: {\n snapshot: ShopifySnapshot;\n onAction?: (action: string) => void;\n}) {\n const lowInventory = snapshot.inventoryItems.filter(\n (item) => item.available <= 5,\n );\n const urgent = lowInventory.filter((item) => item.available === 0).length;\n const go = (tab: ShopifyTab) => () => onAction?.(`tab:${tab}`);\n return (\n <VStack gap={1} width=\"100%\">\n <HStack gap={1} wrap width=\"100%\">\n <CountTile\n label=\"Products\"\n value={snapshot.counts.productCount}\n tone=\"primary\"\n agent=\"overview-products\"\n onPress={go(\"products\")}\n />\n <CountTile\n label=\"Orders\"\n value={snapshot.counts.orderCount}\n tone=\"success\"\n agent=\"overview-orders\"\n onPress={go(\"orders\")}\n />\n <CountTile\n label=\"Low stock\"\n value={lowInventory.length}\n tone={urgent > 0 ? \"danger\" : \"warning\"}\n agent=\"overview-inventory\"\n onPress={go(\"inventory\")}\n />\n <CountTile\n label=\"Customers\"\n value={snapshot.counts.customerCount}\n tone=\"muted\"\n agent=\"overview-customers\"\n onPress={go(\"customers\")}\n />\n </HStack>\n\n <Divider label=\"recent orders\" />\n {snapshot.orders.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n ) : (\n <List gap={0} width=\"100%\">\n {snapshot.orders.slice(0, 3).map((order) => (\n <HStack key={order.id} gap={1} align=\"center\" width=\"100%\">\n <Text bold wrap={false} width={9}>\n {order.name}\n </Text>\n <Text style=\"caption\" tone=\"muted\" grow={1} wrap={false}>\n {order.email || \"guest\"}\n </Text>\n <Text wrap={false}>\n {order.totalPrice} {order.currencyCode}\n </Text>\n </HStack>\n ))}\n </List>\n )}\n\n <Divider label=\"low inventory\" />\n {lowInventory.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n Stock levels look good\n </Text>\n ) : (\n <List gap={0} width=\"100%\">\n {lowInventory.slice(0, 3).map((item) => (\n <HStack\n key={`${item.id}:${item.locationName}`}\n gap={1}\n align=\"center\"\n width=\"100%\"\n >\n <Text grow={1} wrap={false}>\n {item.productTitle}\n {item.variantTitle ? ` / ${item.variantTitle}` : \"\"}\n </Text>\n <Text tone={inventoryTone(item.available)} bold>\n {item.available}\n </Text>\n </HStack>\n ))}\n </List>\n )}\n </VStack>\n );\n}\n\nconst PRODUCTS_PAGE_SIZE = 20;\n\nfunction ProductsSection({\n snapshot,\n onAction,\n}: {\n snapshot: ShopifySnapshot;\n onAction?: (action: string) => void;\n}) {\n const totalPages = Math.max(\n 1,\n Math.ceil(snapshot.productsTotal / PRODUCTS_PAGE_SIZE),\n );\n return (\n <VStack gap={1} width=\"100%\">\n <Field\n label=\"Search products\"\n placeholder=\"filter by title\"\n value={snapshot.productSearch}\n agent=\"products-search\"\n onChange={(value) => onAction?.(`products:search:${value}`)}\n />\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Field\n label=\"New product\"\n placeholder=\"product title\"\n agent=\"products-create-title\"\n grow={1}\n onChange={(value) => onAction?.(`products:create-title:${value}`)}\n />\n <Button\n variant=\"solid\"\n tone=\"primary\"\n agent=\"products-create\"\n onPress={() => onAction?.(\"products:create\")}\n >\n Create\n </Button>\n </HStack>\n <Text style=\"caption\" tone=\"muted\">\n {snapshot.productSearch\n ? `search \"${snapshot.productSearch}\"`\n : \"all products\"}{\" \"}\n | page {snapshot.productsPage} of {totalPages} |{\" \"}\n {snapshot.productsTotal} total\n </Text>\n {snapshot.products.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n ) : (\n <List gap={0} width=\"100%\">\n {snapshot.products.slice(0, 6).map((product) => (\n <HStack key={product.id} gap={1} align=\"center\" width=\"100%\">\n <Text tone={productStatusTone(product.status)}>\n {product.status === \"ACTIVE\"\n ? \"+\"\n : product.status === \"DRAFT\"\n ? \".\"\n : \"x\"}\n </Text>\n <VStack gap={0} grow={1}>\n <Text bold wrap={false}>\n {product.title}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {product.vendor || product.productType || \"uncategorized\"}\n </Text>\n </VStack>\n <Text wrap={false}>\n {product.priceRange.min === product.priceRange.max\n ? product.priceRange.min\n : `${product.priceRange.min}-${product.priceRange.max}`}\n </Text>\n </HStack>\n ))}\n </List>\n )}\n {snapshot.productsTotal > PRODUCTS_PAGE_SIZE ? (\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"products-prev-page\"\n disabled={snapshot.productsPage <= 1}\n onPress={() => onAction?.(\"products:prev-page\")}\n >\n Prev\n </Button>\n <Button\n variant=\"outline\"\n tone=\"default\"\n agent=\"products-next-page\"\n disabled={snapshot.productsPage >= totalPages}\n onPress={() => onAction?.(\"products:next-page\")}\n >\n Next\n </Button>\n </HStack>\n ) : null}\n </VStack>\n );\n}\n\nconst ORDER_FILTERS: { id: string; label: string }[] = [\n { id: \"any\", label: \"All\" },\n { id: \"unfulfilled\", label: \"Unfulfilled\" },\n { id: \"fulfilled\", label: \"Fulfilled\" },\n];\n\nfunction OrdersSection({\n snapshot,\n onAction,\n}: {\n snapshot: ShopifySnapshot;\n onAction?: (action: string) => void;\n}) {\n return (\n <VStack gap={1} width=\"100%\">\n <HStack gap={1} wrap width=\"100%\">\n {ORDER_FILTERS.map((filter) => (\n <Button\n key={filter.id}\n variant={\n snapshot.orderStatusFilter === filter.id ? \"solid\" : \"outline\"\n }\n tone={\n snapshot.orderStatusFilter === filter.id ? \"primary\" : \"default\"\n }\n agent={`orders-filter-${filter.id}`}\n onPress={() => onAction?.(`orders:filter:${filter.id}`)}\n >\n {filter.label}\n </Button>\n ))}\n </HStack>\n <Text style=\"caption\" tone=\"muted\">\n filter {snapshot.orderStatusFilter} | {snapshot.ordersTotal} total\n </Text>\n {snapshot.orders.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n ) : (\n <List gap={0} width=\"100%\">\n {snapshot.orders.slice(0, 6).map((order) => (\n <HStack key={order.id} gap={1} align=\"center\" width=\"100%\">\n <Text bold wrap={false} width={9}>\n {order.name}\n </Text>\n <Text\n style=\"caption\"\n tone={financialTone(order.financialStatus)}\n wrap={false}\n grow={1}\n >\n {order.financialStatus.toLowerCase()}\n </Text>\n <Text wrap={false}>\n {order.totalPrice} {order.currencyCode}\n </Text>\n </HStack>\n ))}\n </List>\n )}\n </VStack>\n );\n}\n\nfunction InventorySection({ snapshot }: { snapshot: ShopifySnapshot }) {\n return (\n <VStack gap={1} width=\"100%\">\n <Text style=\"caption\" tone=\"muted\">\n {snapshot.inventoryItems.length} rows |{\" \"}\n {snapshot.inventoryLocations.length} locations\n </Text>\n {snapshot.inventoryItems.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n ) : (\n <List gap={0} width=\"100%\">\n {snapshot.inventoryItems.slice(0, 6).map((item) => (\n <HStack\n key={`${item.id}:${item.locationName}`}\n gap={1}\n align=\"center\"\n width=\"100%\"\n >\n <VStack gap={0} grow={1}>\n <Text bold wrap={false}>\n {item.productTitle}\n {item.variantTitle ? ` / ${item.variantTitle}` : \"\"}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {item.locationName}\n </Text>\n </VStack>\n <Text tone={inventoryTone(item.available)} bold>\n {item.available}\n </Text>\n <Text style=\"caption\" tone=\"muted\">\n +{item.incoming}\n </Text>\n </HStack>\n ))}\n </List>\n )}\n </VStack>\n );\n}\n\nfunction CustomersSection({\n snapshot,\n onAction,\n}: {\n snapshot: ShopifySnapshot;\n onAction?: (action: string) => void;\n}) {\n return (\n <VStack gap={1} width=\"100%\">\n <Field\n label=\"Search customers\"\n placeholder=\"filter by name or email\"\n value={snapshot.customerSearch}\n agent=\"customers-search\"\n onChange={(value) => onAction?.(`customers:search:${value}`)}\n />\n <Text style=\"caption\" tone=\"muted\">\n {snapshot.customerSearch\n ? `search \"${snapshot.customerSearch}\"`\n : \"all customers\"}{\" \"}\n | {snapshot.customersTotal} total\n </Text>\n {snapshot.customers.length === 0 ? (\n <Text tone=\"muted\" align=\"center\" style=\"caption\">\n None\n </Text>\n ) : (\n <List gap={0} width=\"100%\">\n {snapshot.customers.slice(0, 6).map((customer) => (\n <HStack key={customer.id} gap={1} align=\"center\" width=\"100%\">\n <VStack gap={0} grow={1}>\n <Text bold wrap={false}>\n {`${customer.firstName} ${customer.lastName}`.trim() ||\n customer.email ||\n \"Customer\"}\n </Text>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {customer.email}\n </Text>\n </VStack>\n <Text style=\"caption\" tone=\"muted\" wrap={false}>\n {customer.ordersCount} orders\n </Text>\n <Text wrap={false}>\n {customer.totalSpent} {customer.currencyCode}\n </Text>\n </HStack>\n ))}\n </List>\n )}\n </VStack>\n );\n}\n\nfunction Section({\n snapshot,\n onAction,\n}: {\n snapshot: ShopifySnapshot;\n onAction?: (action: string) => void;\n}) {\n switch (snapshot.tab) {\n case \"products\":\n return <ProductsSection snapshot={snapshot} onAction={onAction} />;\n case \"orders\":\n return <OrdersSection snapshot={snapshot} onAction={onAction} />;\n case \"inventory\":\n return <InventorySection snapshot={snapshot} />;\n case \"customers\":\n return <CustomersSection snapshot={snapshot} onAction={onAction} />;\n default:\n return <OverviewSection snapshot={snapshot} onAction={onAction} />;\n }\n}\n\nexport interface ShopifySpatialViewProps {\n snapshot: ShopifySnapshot;\n /**\n * Dispatch by agent id. Supported actions:\n * `tab:<id>`, `refresh`,\n * `products:search:<q>`, `products:create-title:<q>`, `products:create`,\n * `products:prev-page`, `products:next-page`,\n * `orders:filter:<status>`, `customers:search:<q>`.\n */\n onAction?: (action: string) => void;\n}\n\nexport function ShopifySpatialView({\n snapshot,\n onAction,\n}: ShopifySpatialViewProps) {\n const dispatch = (action: string) => () => onAction?.(action);\n const connected = snapshot.status?.connected ?? false;\n const shop = snapshot.status?.shop ?? null;\n\n return (\n <Card gap={1} padding={1}>\n <HStack gap={1} align=\"center\" width=\"100%\">\n <Text\n style=\"caption\"\n tone={connected ? \"success\" : \"danger\"}\n wrap={false}\n >\n {connected ? \"connected\" : \"offline\"}\n </Text>\n <Text style=\"caption\" tone=\"muted\" grow={1} align=\"end\" wrap={false}>\n {snapshot.loading ? \"loading\" : (shop?.name ?? \"no shop\")}\n </Text>\n </HStack>\n <Text style=\"caption\" tone=\"muted\" width=\"100%\" wrap={false}>\n {shop?.domain ?? \"no domain\"}\n </Text>\n\n {snapshot.error ? (\n <Text tone=\"danger\" style=\"caption\">\n {snapshot.error}\n </Text>\n ) : null}\n\n {!connected && !snapshot.loading ? (\n <Text tone=\"muted\" style=\"caption\">\n Set SHOPIFY_STORE_DOMAIN and SHOPIFY_ACCESS_TOKEN for live data.\n </Text>\n ) : null}\n\n <HStack gap={1} wrap width=\"100%\">\n {TABS.map((tab) => (\n <Button\n key={tab.id}\n variant={snapshot.tab === tab.id ? \"solid\" : \"outline\"}\n tone={snapshot.tab === tab.id ? \"primary\" : \"default\"}\n agent={`tab-${tab.id}`}\n onPress={dispatch(`tab:${tab.id}`)}\n >\n {tab.label}\n </Button>\n ))}\n <Button\n variant=\"ghost\"\n tone=\"default\"\n agent=\"refresh\"\n onPress={dispatch(\"refresh\")}\n >\n Refresh\n </Button>\n </HStack>\n\n <Divider label={snapshot.tab} />\n <Section snapshot={snapshot} onAction={onAction} />\n </Card>\n );\n}\n","/**\n * useShopifyDashboard — data hook for the Shopify overlay app.\n *\n * Polls all Shopify API endpoints and exposes typed state for each panel.\n * Handles route 404 responses gracefully as \"disconnected\".\n */\n\nimport { useCallback, useEffect, useRef, useState } from \"react\";\n\n// ── Types ─────────────────────────────────────────────────────────────────\n\nexport interface ShopifyStatus {\n connected: boolean;\n shop: {\n name: string;\n domain: string;\n plan: string;\n email: string;\n currencyCode: string;\n } | null;\n}\n\nexport interface ShopifyProduct {\n id: string;\n title: string;\n status: \"ACTIVE\" | \"DRAFT\" | \"ARCHIVED\";\n productType: string;\n vendor: string;\n totalInventory: number;\n priceRange: { min: string; max: string };\n imageUrl: string | null;\n updatedAt: string;\n}\n\nexport interface ShopifyOrder {\n id: string;\n /** e.g. \"#1001\" */\n name: string;\n email: string;\n totalPrice: string;\n currencyCode: string;\n fulfillmentStatus: \"FULFILLED\" | \"UNFULFILLED\" | \"PARTIALLY_FULFILLED\" | null;\n financialStatus: \"PAID\" | \"PENDING\" | \"REFUNDED\" | \"PARTIALLY_REFUNDED\";\n createdAt: string;\n lineItemCount: number;\n}\n\nexport interface ShopifyInventoryItem {\n id: string;\n sku: string;\n productTitle: string;\n variantTitle: string;\n locationId: string | null;\n locationName: string;\n available: number;\n incoming: number;\n}\n\nexport interface ShopifyCustomer {\n id: string;\n firstName: string;\n lastName: string;\n email: string;\n ordersCount: number;\n totalSpent: string;\n currencyCode: string;\n createdAt: string;\n}\n\nexport interface ShopifyProductsResponse {\n products: ShopifyProduct[];\n total: number;\n page: number;\n pageSize: number;\n}\n\nexport interface ShopifyOrdersResponse {\n orders: ShopifyOrder[];\n total: number;\n}\n\nexport interface ShopifyInventoryResponse {\n items: ShopifyInventoryItem[];\n locations: string[];\n}\n\nexport interface ShopifyCustomersResponse {\n customers: ShopifyCustomer[];\n total: number;\n}\n\n// ── Aggregated counts for the overview card ───────────────────────────────\n\nexport interface ShopifyAggregateCounts {\n productCount: number;\n orderCount: number;\n customerCount: number;\n}\n\n// ── Hook return shape ─────────────────────────────────────────────────────\n\nexport interface UseShopifyDashboardReturn {\n // Connection\n status: ShopifyStatus | null;\n statusLoading: boolean;\n statusError: string | null;\n\n // Products\n products: ShopifyProduct[];\n productsTotal: number;\n productsPage: number;\n productsLoading: boolean;\n productsError: string | null;\n productSearch: string;\n setProductSearch: (q: string) => void;\n setProductsPage: (page: number) => void;\n\n // Orders\n orders: ShopifyOrder[];\n ordersTotal: number;\n ordersLoading: boolean;\n ordersError: string | null;\n orderStatusFilter: string;\n setOrderStatusFilter: (s: string) => void;\n\n // Inventory\n inventoryItems: ShopifyInventoryItem[];\n inventoryLocations: string[];\n inventoryLoading: boolean;\n inventoryError: string | null;\n\n // Customers\n customers: ShopifyCustomer[];\n customersTotal: number;\n customersLoading: boolean;\n customersError: string | null;\n customerSearch: string;\n setCustomerSearch: (q: string) => void;\n\n // Aggregate counts\n counts: ShopifyAggregateCounts;\n\n // Manual refresh\n refresh: () => void;\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────\n\nconst PAGE_SIZE = 20;\nconst POLL_INTERVAL_MS = 30_000;\n\nasync function fetchJson<T>(url: string): Promise<T | null> {\n const res = await fetch(url);\n if (res.status === 404) return null;\n if (!res.ok) {\n const text = await res.text().catch(() => \"Unknown error\");\n throw new Error(`${res.status}: ${text}`);\n }\n return res.json() as Promise<T>;\n}\n\n// ── Hook ──────────────────────────────────────────────────────────────────\n\nexport function useShopifyDashboard(): UseShopifyDashboardReturn {\n // -- Status\n const [status, setStatus] = useState<ShopifyStatus | null>(null);\n const [statusLoading, setStatusLoading] = useState(true);\n const [statusError, setStatusError] = useState<string | null>(null);\n\n // -- Products\n const [productsData, setProductsData] =\n useState<ShopifyProductsResponse | null>(null);\n const [productsLoading, setProductsLoading] = useState(false);\n const [productsError, setProductsError] = useState<string | null>(null);\n const [productsPage, setProductsPage] = useState(1);\n const [productSearch, setProductSearch] = useState(\"\");\n\n // -- Orders\n const [ordersData, setOrdersData] = useState<ShopifyOrdersResponse | null>(\n null,\n );\n const [ordersLoading, setOrdersLoading] = useState(false);\n const [ordersError, setOrdersError] = useState<string | null>(null);\n const [orderStatusFilter, setOrderStatusFilter] = useState(\"any\");\n\n // -- Inventory\n const [inventoryData, setInventoryData] =\n useState<ShopifyInventoryResponse | null>(null);\n const [inventoryLoading, setInventoryLoading] = useState(false);\n const [inventoryError, setInventoryError] = useState<string | null>(null);\n\n // -- Customers\n const [customersData, setCustomersData] =\n useState<ShopifyCustomersResponse | null>(null);\n const [customersLoading, setCustomersLoading] = useState(false);\n const [customersError, setCustomersError] = useState<string | null>(null);\n const [customerSearch, setCustomerSearch] = useState(\"\");\n\n // -- Tick counter to drive polling\n const [tick, setTick] = useState(0);\n const pollRef = useRef<ReturnType<typeof setInterval> | null>(null);\n\n const refresh = useCallback(() => {\n setTick((n) => n + 1);\n }, []);\n\n // Poll every 30 s when the component is mounted\n useEffect(() => {\n pollRef.current = setInterval(refresh, POLL_INTERVAL_MS);\n return () => {\n if (pollRef.current !== null) clearInterval(pollRef.current);\n };\n }, [refresh]);\n\n // -- Fetch status\n useEffect(() => {\n let cancelled = false;\n setStatusLoading(true);\n setStatusError(null);\n\n fetchJson<ShopifyStatus>(\"/api/shopify/status\")\n .then((data) => {\n if (cancelled) return;\n setStatus(\n data ?? {\n connected: false,\n shop: null,\n },\n );\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setStatusError(\n err instanceof Error ? err.message : \"Failed to load Shopify status.\",\n );\n setStatus({ connected: false, shop: null });\n })\n .finally(() => {\n if (!cancelled) setStatusLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [tick]);\n\n const connected = status?.connected ?? false;\n\n // -- Fetch products (only when connected)\n useEffect(() => {\n if (!connected) return;\n let cancelled = false;\n setProductsLoading(true);\n setProductsError(null);\n\n const params = new URLSearchParams({\n page: String(productsPage),\n limit: String(PAGE_SIZE),\n q: productSearch,\n });\n\n fetchJson<ShopifyProductsResponse>(`/api/shopify/products?${params}`)\n .then((data) => {\n if (cancelled) return;\n setProductsData(\n data ?? {\n products: [],\n total: 0,\n page: productsPage,\n pageSize: PAGE_SIZE,\n },\n );\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setProductsError(\n err instanceof Error ? err.message : \"Failed to load products.\",\n );\n })\n .finally(() => {\n if (!cancelled) setProductsLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [connected, productsPage, productSearch, tick]);\n\n // -- Fetch orders\n useEffect(() => {\n if (!connected) return;\n let cancelled = false;\n setOrdersLoading(true);\n setOrdersError(null);\n\n const params = new URLSearchParams({\n status: orderStatusFilter,\n limit: String(PAGE_SIZE),\n });\n\n fetchJson<ShopifyOrdersResponse>(`/api/shopify/orders?${params}`)\n .then((data) => {\n if (cancelled) return;\n setOrdersData(data ?? { orders: [], total: 0 });\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setOrdersError(\n err instanceof Error ? err.message : \"Failed to load orders.\",\n );\n })\n .finally(() => {\n if (!cancelled) setOrdersLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [connected, orderStatusFilter, tick]);\n\n // -- Fetch inventory\n useEffect(() => {\n if (!connected) return;\n let cancelled = false;\n setInventoryLoading(true);\n setInventoryError(null);\n\n fetchJson<ShopifyInventoryResponse>(\"/api/shopify/inventory\")\n .then((data) => {\n if (cancelled) return;\n setInventoryData(data ?? { items: [], locations: [] });\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setInventoryError(\n err instanceof Error ? err.message : \"Failed to load inventory.\",\n );\n })\n .finally(() => {\n if (!cancelled) setInventoryLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [connected, tick]);\n\n // -- Fetch customers\n useEffect(() => {\n if (!connected) return;\n let cancelled = false;\n setCustomersLoading(true);\n setCustomersError(null);\n\n const params = new URLSearchParams({\n q: customerSearch,\n limit: String(PAGE_SIZE),\n });\n\n fetchJson<ShopifyCustomersResponse>(`/api/shopify/customers?${params}`)\n .then((data) => {\n if (cancelled) return;\n setCustomersData(data ?? { customers: [], total: 0 });\n })\n .catch((err: unknown) => {\n if (cancelled) return;\n setCustomersError(\n err instanceof Error ? err.message : \"Failed to load customers.\",\n );\n })\n .finally(() => {\n if (!cancelled) setCustomersLoading(false);\n });\n\n return () => {\n cancelled = true;\n };\n }, [connected, customerSearch, tick]);\n\n const counts: ShopifyAggregateCounts = {\n productCount: productsData?.total ?? 0,\n orderCount: ordersData?.total ?? 0,\n customerCount: customersData?.total ?? 0,\n };\n\n return {\n status,\n statusLoading,\n statusError,\n\n products: productsData?.products ?? [],\n productsTotal: productsData?.total ?? 0,\n productsPage,\n productsLoading,\n productsError,\n productSearch,\n setProductSearch,\n setProductsPage,\n\n orders: ordersData?.orders ?? [],\n ordersTotal: ordersData?.total ?? 0,\n ordersLoading,\n ordersError,\n orderStatusFilter,\n setOrderStatusFilter,\n\n inventoryItems: inventoryData?.items ?? [],\n inventoryLocations: inventoryData?.locations ?? [],\n inventoryLoading,\n inventoryError,\n\n customers: customersData?.customers ?? [],\n customersTotal: customersData?.total ?? 0,\n customersLoading,\n customersError,\n customerSearch,\n setCustomerSearch,\n\n counts,\n refresh,\n };\n}\n","/**\n * ShopifyView — the single GUI/XR data wrapper for the Shopify surface.\n *\n * It owns the live store data (status / products / orders / inventory /\n * customers polling via {@link useShopifyDashboard}, tab selection, search and\n * filter state, pagination, and product creation) and renders the one\n * presentational {@link ShopifySpatialView} inside a {@link SpatialSurface}.\n * Omitting the `modality` prop lets `SpatialSurface` auto-detect GUI vs XR, so\n * the SAME component serves both surfaces. The TUI surface renders the same\n * `ShopifySpatialView` through the terminal registry (see\n * `register-terminal-view.tsx`).\n *\n * The full-screen overlay app (`ShopifyAppView`, registered via `shopify-app.ts`)\n * keeps its own richer Tabs/dialog chrome; this wrapper is the view-manager\n * surface drawn from the cross-modal spatial source of truth.\n */\n\nimport { SpatialSurface } from \"@elizaos/ui/spatial\";\nimport { useCallback, useState } from \"react\";\nimport {\n type ShopifySnapshot,\n type ShopifyTab,\n ShopifySpatialView,\n} from \"./components/ShopifySpatialView.tsx\";\nimport { useShopifyDashboard } from \"./useShopifyDashboard.ts\";\n\nexport function ShopifyView() {\n const [activeTab, setActiveTab] = useState<ShopifyTab>(\"overview\");\n const [createTitle, setCreateTitle] = useState(\"\");\n const [createError, setCreateError] = useState<string | null>(null);\n\n const {\n status,\n statusLoading,\n statusError,\n\n products,\n productsTotal,\n productsPage,\n productsLoading,\n productsError,\n productSearch,\n setProductSearch,\n setProductsPage,\n\n orders,\n ordersTotal,\n ordersLoading,\n ordersError,\n orderStatusFilter,\n setOrderStatusFilter,\n\n inventoryItems,\n inventoryLocations,\n inventoryLoading,\n inventoryError,\n\n customers,\n customersTotal,\n customersLoading,\n customersError,\n customerSearch,\n setCustomerSearch,\n\n counts,\n refresh,\n } = useShopifyDashboard();\n\n const createProduct = useCallback(async () => {\n const title = createTitle.trim();\n if (!title) {\n setCreateError(\"Enter a product title.\");\n return;\n }\n setCreateError(null);\n try {\n const res = await fetch(\"/api/shopify/products\", {\n method: \"POST\",\n headers: { \"Content-Type\": \"application/json\" },\n body: JSON.stringify({ title }),\n });\n if (!res.ok) {\n const text = await res.text().catch(() => \"Unknown error\");\n throw new Error(text);\n }\n setCreateTitle(\"\");\n refresh();\n } catch (err) {\n setCreateError(\n err instanceof Error ? err.message : \"Failed to create product.\",\n );\n }\n }, [createTitle, refresh]);\n\n const onAction = useCallback(\n (action: string) => {\n if (action.startsWith(\"tab:\")) {\n setActiveTab(action.slice(\"tab:\".length) as ShopifyTab);\n return;\n }\n if (action.startsWith(\"products:search:\")) {\n setProductsPage(1);\n setProductSearch(action.slice(\"products:search:\".length));\n return;\n }\n if (action.startsWith(\"products:create-title:\")) {\n setCreateError(null);\n setCreateTitle(action.slice(\"products:create-title:\".length));\n return;\n }\n if (action.startsWith(\"orders:filter:\")) {\n setOrderStatusFilter(action.slice(\"orders:filter:\".length));\n return;\n }\n if (action.startsWith(\"customers:search:\")) {\n setCustomerSearch(action.slice(\"customers:search:\".length));\n return;\n }\n switch (action) {\n case \"products:create\":\n void createProduct();\n return;\n case \"products:prev-page\":\n setProductsPage(Math.max(1, productsPage - 1));\n return;\n case \"products:next-page\":\n setProductsPage(productsPage + 1);\n return;\n case \"refresh\":\n refresh();\n return;\n }\n },\n [\n createProduct,\n productsPage,\n refresh,\n setCustomerSearch,\n setOrderStatusFilter,\n setProductSearch,\n setProductsPage,\n ],\n );\n\n const loading =\n statusLoading ||\n productsLoading ||\n ordersLoading ||\n inventoryLoading ||\n customersLoading;\n const error =\n createError ??\n statusError ??\n productsError ??\n ordersError ??\n inventoryError ??\n customersError;\n\n const snapshot: ShopifySnapshot = {\n status,\n tab: activeTab,\n counts,\n products,\n productsTotal,\n productsPage,\n productSearch,\n orders,\n ordersTotal,\n orderStatusFilter,\n inventoryItems,\n inventoryLocations,\n customers,\n customersTotal,\n customerSearch,\n loading,\n error,\n };\n\n return (\n <SpatialSurface>\n <ShopifySpatialView snapshot={snapshot} onAction={onAction} />\n </SpatialSurface>\n );\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@elizaos/plugin-shopify-ui",
3
- "version": "2.0.3-beta.5",
3
+ "version": "2.0.3-beta.7",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "exports": {
@@ -32,9 +32,9 @@
32
32
  }
33
33
  },
34
34
  "dependencies": {
35
- "@elizaos/app-core": "2.0.3-beta.5",
36
- "@elizaos/core": "2.0.3-beta.5",
37
- "@elizaos/ui": "2.0.3-beta.5",
35
+ "@elizaos/app-core": "2.0.3-beta.7",
36
+ "@elizaos/core": "2.0.3-beta.7",
37
+ "@elizaos/ui": "2.0.3-beta.7",
38
38
  "lucide-react": "^1.0.0",
39
39
  "react": "^19.0.0"
40
40
  },
@@ -73,5 +73,5 @@
73
73
  "vite": "^8.0.0",
74
74
  "vitest": "^4.1.5"
75
75
  },
76
- "gitHead": "ff6157011c9459670021cc28a6797592a78b8817"
76
+ "gitHead": "61094f10458d11055c75b3dd0bae374e3f66bac5"
77
77
  }