@fayz-ai/plugin-shop 0.13.0 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAiC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAyB5D,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAC1B,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAC9D,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAC3E,gBAAgB,GAAG,kBAAkB,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;IAC7D,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B;oCACgC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,KAAK,CAAA;CACvB;AAMD,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CA+jB5E;AAED,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AAKtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAG3D,YAAY,EACV,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAChD,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAC3D,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,GACtD,MAAM,eAAe,CAAA;AAItB,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAA;AAC7I,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AACtH,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAA;AACtI,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAA;AACrJ,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AAClH,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,eAAe,CAAA;AAkC5E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAA;AAyB5D,MAAM,WAAW,iBAAiB;IAChC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,UAAU,CAAC,EAAE,MAAM,GAAG,WAAW,GAAG,UAAU,CAAA;IAC9C,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,wEAAwE;IACxE,aAAa,CAAC,EAAE,OAAO,CAAC,MAAM,CAC1B,UAAU,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,GAAG,UAAU,GAC9D,aAAa,GAAG,YAAY,GAAG,WAAW,GAAG,SAAS,GAAG,OAAO,GAAG,QAAQ,GAC3E,gBAAgB,GAAG,kBAAkB,GAAG,OAAO,EAAE,MAAM,CAAC,CAAC,CAAA;IAC7D,KAAK,CAAC,EAAE,WAAW,CAAA;IACnB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,QAAQ,CAAC,EAAE;QAAE,IAAI,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;IAC9D,QAAQ,CAAC,EAAE,oBAAoB,CAAA;IAC/B;oCACgC;IAChC,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B;;;;OAIG;IACH,cAAc,CAAC,EAAE,KAAK,CAAA;CACvB;AAMD,wBAAgB,gBAAgB,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,cAAc,CAmkB5E;AAED,cAAc,sBAAsB,CAAA;AACpC,cAAc,wBAAwB,CAAA;AAKtC,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAA;AAG3D,YAAY,EACV,OAAO,EAAE,KAAK,EAAE,YAAY,EAAE,QAAQ,EAAE,QAAQ,EAChD,kBAAkB,EAAE,kBAAkB,EAAE,mBAAmB,EAC3D,gBAAgB,EAAE,gBAAgB,EAAE,iBAAiB,GACtD,MAAM,eAAe,CAAA;AAItB,OAAO,EAAE,uBAAuB,EAAE,yBAAyB,EAAE,8BAA8B,EAAE,MAAM,0CAA0C,CAAA;AAC7I,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,oCAAoC,CAAA;AACtH,OAAO,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,4BAA4B,EAAE,MAAM,wCAAwC,CAAA;AACtI,OAAO,EAAE,yBAAyB,EAAE,2BAA2B,EAAE,gCAAgC,EAAE,MAAM,4CAA4C,CAAA;AACrJ,OAAO,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,uBAAuB,EAAE,MAAM,mCAAmC,CAAA;AAClH,OAAO,EAAE,uBAAuB,EAAE,wBAAwB,EAAE,6BAA6B,EAAE,MAAM,yCAAyC,CAAA"}
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
1
  import { shopCustomerLookup, buildShopCustomerEntity, resolve, invalidateProductLists, listProductsDetailed, applyQuery, errorMessage, listProductsCached, resolveTerm, candidateMeta, packageMeasureLabel, PACKAGES_REGISTRY, packagesRegistry, SHIPPING_PROFILES_REGISTRY, SHIPPING_ZONES_REGISTRY, buildShopRegistries, locationSummary, LOCATIONS_REGISTRY } from './chunk-2VMTPRGC.js';
2
2
  import React9, { useState, useEffect, useRef, useCallback, useMemo } from 'react';
3
- import { createConnectionStore, connectionSettings, connectionStatus, settingsStatus, connectionRuns, tl, getSupabaseClientOptional, registerMessageDefaults, connectorRuntimeToken, CONNECTOR_RUNTIME_TOKEN_HEADER, getActiveTenantId, emitDataChanged, resolveDataProvider } from '@fayz-ai/core';
3
+ import { createConnectionStore, connectionSettings, connectionStatus, settingsStatus, connectionRuns, tl, getSupabaseClientOptional, registerMessageDefaults, connectorRuntimeToken, CONNECTOR_RUNTIME_TOKEN_HEADER, countByTenant, getActiveTenantId, emitDataChanged, resolveDataProvider } from '@fayz-ai/core';
4
4
  import { getShopTenantId, setShopTenantResolver, buildShopMessageDefaults, registerShippingLabelProvider, getShopProvider, buildShopDomainEvents, axesFromOptions, planVariantMatrix, validateVariantAxes, hasOnlyDefaultVariant, MAX_VARIANT_AXES, leavesNothingSellable, productImageToMediaFile, formatVariantCombination, applyVariantMatrix } from '@fayz-ai/shop';
5
5
  import { fayzConnectorOAuth, useOrganizationStore, registerEntityPath, registerPersonLookup, createCrudPage, adminNavigateTo, useAgentSurface, askAI, AskAIButton, CrudFormPage, SettingsGroup, SelectRow, ToggleRow, useConnectors, useConnectorsPanelAvailable, openConnectorsPanel, MultiSelectRow, AddConnectorButton, AddConnectorPanel, ConnectorDetail, RegistryCrudView, TextRow, ConnectorRow, ConnectorMark, StateChip } from '@fayz-ai/admin';
6
6
  import { Package, Eye, FileEdit, PackageX, UsersRound, Users, UserX, Filter, ShoppingBag, Repeat, CircleDollarSign, Tag, TicketCheck, Layers, CreditCard, ImageOff, Link2, MapPin, Music, Camera, MessageCircle, Globe, Plus, Loader2, WandSparkles, ChevronLeft, ChevronRight, Download, RefreshCw, Trash2, Upload, ExternalLink, Check, X, AlertTriangle, Box, ChevronDown, Film, FileText, Warehouse, ArrowRight, Car, Truck, Info } from 'lucide-react';
@@ -10,6 +10,187 @@ import { listStockReasonCodes, resolveStockStore, createSupabaseStockStore } fro
10
10
  import { normalizeMovementType } from '@fayz-ai/plugin-inventory';
11
11
  import { advanceWindow, createRateLimiter, sliceWindow, paginate, reconcileMirror, serializeCursor } from '@fayz-ai/core/connector-runtime';
12
12
 
13
+ function buildShopOnboarding() {
14
+ return {
15
+ id: "shop",
16
+ title: "Sua loja no ar",
17
+ order: 10,
18
+ role: "operations",
19
+ instructions: `Voc\xEA est\xE1 implantando uma LOJA. A pessoa n\xE3o quer aprender um sistema: ela quer vender.
20
+
21
+ - A ordem importa e \xE9 esta: ter o que vender \u2192 onde vender \u2192 como receber \u2192 como entregar \u2192 um motivo para comprar \u2192 a primeira venda. N\xE3o pule para "divulgue" antes de a loja aceitar um pedido.
22
+ - Importar cat\xE1logo \xE9 o passo que trava mais gente. Ofere\xE7a planilha, integra\xE7\xE3o (Bling, Nuvemshop) ou cadastrar um produto \xE0 m\xE3o para destravar \u2014 um produto j\xE1 \xE9 o suficiente para seguir.
23
+ - Em pagamento, pergunte COMO ela recebe hoje (Pix, cart\xE3o, maquininha) antes de falar de gateway. O nome do provedor \xE9 detalhe nosso, n\xE3o dela.
24
+ - Antes de dizer que a loja est\xE1 pronta, confira: tem produto ativo, tem forma de pagamento, e a vitrine est\xE1 publicada. Se faltar uma, diga qual falta.
25
+ - Quando estiver pronta para receber pedidos, chame o colega de growth para a primeira campanha \u2014 n\xE3o invente plano de m\xEDdia por conta pr\xF3pria.`,
26
+ steps: [
27
+ {
28
+ key: "catalog",
29
+ title: "Cadastre seu primeiro produto",
30
+ description: "Seu cat\xE1logo \xE9 o que a loja vende. Um produto j\xE1 destrava o resto.",
31
+ icon: "Package",
32
+ route: "/products",
33
+ priority: "high",
34
+ // O passo genérico da plataforma ("cadastre seu primeiro produto") e
35
+ // este são o mesmo recado — a loja é dona dele.
36
+ replaces: "catalog",
37
+ agentHint: "Pergunte onde o cat\xE1logo est\xE1 hoje (planilha, ERP, Instagram). Ofere\xE7a importar; se travar, um produto \xE0 m\xE3o j\xE1 destrava.",
38
+ howTo: "Produtos \u203A Adicionar. Nome, pre\xE7o e uma foto j\xE1 bastam para o produto aparecer na loja \u2014 estoque e varia\xE7\xF5es d\xE1 para completar depois. Se voc\xEA j\xE1 tem uma planilha, use Adicionar \u203A Importar: colunas de nome, pre\xE7o e estoque viram o cat\xE1logo inteiro de uma vez.",
39
+ celebrate: "Produto no ar \u{1F389}",
40
+ // A coreografia, como dado: nenhuma dessas quatro falas varia, e cada
41
+ // uma delas custava um turno de modelo para ser escrita de novo.
42
+ script: [
43
+ { kind: "say", text: "Vamos come\xE7ar pelo que a loja vende. Te levo at\xE9 os Produtos." },
44
+ { kind: "goto", route: "/products" },
45
+ {
46
+ kind: "say",
47
+ text: "Esta \xE9 a sua lista de produtos \u2014 hoje vazia. Tudo que entrar aqui aparece na vitrine."
48
+ },
49
+ {
50
+ // Três caminhos, e "cadastre um produto" assumia que só existia um.
51
+ // A pergunta é o passo: quem tem planilha não quer digitar, e quem
52
+ // não tem nada quer que alguém comece por ele.
53
+ kind: "choose",
54
+ id: "shop.catalog.how",
55
+ question: "Como voc\xEA prefere trazer seus produtos?",
56
+ options: [
57
+ { id: "import", label: "Tenho uma planilha", meta: "Importo e mapeio as colunas com voc\xEA" },
58
+ { id: "manual", label: "Vou cadastrar \xE0 m\xE3o", meta: "Te mostro onde, come\xE7ando por um" },
59
+ {
60
+ id: "suggest",
61
+ label: "Me sugira o cat\xE1logo",
62
+ meta: "Monto uma lista a partir do que j\xE1 sei do seu neg\xF3cio"
63
+ }
64
+ ]
65
+ }
66
+ ],
67
+ check: async () => await countByTenant("plg_shop_products") > 0,
68
+ tour: {
69
+ id: "shop.catalog",
70
+ stops: [
71
+ {
72
+ anchor: "action.new",
73
+ title: "\xC9 aqui que nasce um produto",
74
+ body: "Nome, pre\xE7o e uma foto j\xE1 bastam. Pode cadastrar agora \u2014 eu vejo quando ele entrar.",
75
+ route: "/products",
76
+ waitForUser: true
77
+ },
78
+ {
79
+ anchor: "action.import",
80
+ title: "Ou traga tudo de uma vez",
81
+ body: "Uma planilha com nome, pre\xE7o e estoque vira o cat\xE1logo inteiro."
82
+ }
83
+ ]
84
+ }
85
+ },
86
+ {
87
+ key: "storefront",
88
+ title: "Configure sua loja online",
89
+ description: "O endere\xE7o que voc\xEA manda para o cliente \u2014 e os canais que apontam para ela.",
90
+ icon: "Store",
91
+ route: "/store",
92
+ priority: "high",
93
+ // A plataforma chama de "publique seu site"; numa loja é a vitrine, e
94
+ // quem sabe configurá-la é este módulo.
95
+ replaces: "publish",
96
+ agentHint: "Confira o endere\xE7o da vitrine e os canais ativos. Publicar sem frete configurado gera pedido que ningu\xE9m consegue entregar.",
97
+ howTo: 'Canais de venda (o item "Sua loja" na barra lateral). A Loja Online \xE9 a sua vitrine: confira o endere\xE7o, veja como est\xE1 e publique. Esse link \xE9 o que vai para a bio do Instagram e para o WhatsApp.',
98
+ celebrate: "Vitrine pronta \u2728",
99
+ script: [
100
+ { kind: "say", text: "Agora a vitrine \u2014 o endere\xE7o que voc\xEA manda para o cliente." },
101
+ { kind: "goto", route: "/store" },
102
+ {
103
+ kind: "ask",
104
+ text: "Estou na tela de canais de venda. Confira comigo o endere\xE7o da Loja Online e me diga o que falta para publicar."
105
+ }
106
+ ]
107
+ },
108
+ {
109
+ key: "payments",
110
+ title: "Decida como vai receber",
111
+ description: "Pix, cart\xE3o ou boleto \u2014 o dinheiro precisa de um caminho.",
112
+ icon: "CreditCard",
113
+ route: "/settings/shop-payments",
114
+ priority: "high",
115
+ replaces: "payments",
116
+ agentHint: "Comece por como ela j\xE1 recebe hoje. Pix costuma ser o caminho mais curto para a primeira venda; cart\xE3o vem depois.",
117
+ howTo: "Configura\xE7\xF5es \u203A Pagamentos. Ligue as formas que voc\xEA aceita e conecte o provedor de cada uma. Para Pix voc\xEA precisa da chave ou das credenciais do provedor; sem isso o pedido entra, mas o pagamento n\xE3o \xE9 confirmado sozinho.",
118
+ celebrate: "Recebimento no lugar \u{1F4B3}",
119
+ script: [
120
+ { kind: "goto", route: "/settings/shop-payments" },
121
+ {
122
+ kind: "ask",
123
+ text: "Estamos em Pagamentos. Pergunte como a pessoa recebe hoje (Pix, cart\xE3o, maquininha) antes de falar de provedor, e ligue a forma que ela usar."
124
+ }
125
+ ]
126
+ },
127
+ {
128
+ key: "shipping",
129
+ title: "Configure a entrega",
130
+ description: "Zonas, prazos e quanto custa o frete.",
131
+ icon: "Truck",
132
+ route: "/settings/shop-shipping",
133
+ agentHint: "Pergunte at\xE9 onde entregam e como (carro pr\xF3prio, transportadora, retirada). Frete errado \xE9 o motivo n\xBA 1 de carrinho abandonado.",
134
+ howTo: "Configura\xE7\xF5es \u203A Entrega. Crie uma zona (por CEP ou por cidade), diga o prazo e o pre\xE7o \u2014 pode ser valor fixo para come\xE7ar. Retirada no local \xE9 uma zona com frete zero.",
135
+ celebrate: "Entrega configurada \u{1F69A}",
136
+ script: [
137
+ { kind: "goto", route: "/settings/shop-shipping" },
138
+ {
139
+ kind: "ask",
140
+ text: "Estamos em Entrega. Pergunte at\xE9 onde a pessoa entrega e como, e monte a primeira zona junto com ela."
141
+ }
142
+ ]
143
+ },
144
+ {
145
+ key: "discount",
146
+ title: "Crie um cupom de desconto",
147
+ description: "D\xEA um motivo para o cliente fechar a primeira compra.",
148
+ icon: "Tag",
149
+ route: "/discounts",
150
+ priority: "low",
151
+ agentHint: "Este \xE9 passo de growth: sugira um cupom de primeira compra e ajude a decidir o valor. Se houver colega de growth, passe a bola.",
152
+ howTo: "Descontos \u203A Adicionar. Escolha o c\xF3digo (algo curto, tipo BEMVINDO10), o tipo (percentual ou valor) e at\xE9 quando vale. O cliente digita esse c\xF3digo no checkout."
153
+ },
154
+ {
155
+ key: "first-order",
156
+ title: "Receba seu primeiro pedido",
157
+ description: "Fa\xE7a um pedido de teste e veja ele cair aqui dentro.",
158
+ icon: "ShoppingBag",
159
+ route: "/orders",
160
+ agentHint: 'Um pedido de teste \xE9 o que transforma "acho que est\xE1 no ar" em "est\xE1 no ar". Acompanhe at\xE9 ele aparecer na lista.',
161
+ howTo: "Abra sua vitrine como se fosse um cliente, escolha um produto e finalize a compra. O pedido aparece em Pedidos em segundos \u2014 e \xE9 assim que voc\xEA confere que pre\xE7o, frete e pagamento est\xE3o certos antes do primeiro cliente de verdade.",
162
+ celebrate: "Primeiro pedido na casa \u{1F6CD}\uFE0F",
163
+ script: [
164
+ {
165
+ kind: "say",
166
+ text: "\xDAltimo: um pedido de teste. Abra sua vitrine como se fosse um cliente e finalize uma compra \u2014 eu aviso aqui quando ele cair."
167
+ },
168
+ { kind: "goto", route: "/orders" },
169
+ {
170
+ kind: "point",
171
+ anchor: "nav./orders",
172
+ title: "Todo pedido cai aqui",
173
+ body: "Pago, em separa\xE7\xE3o, enviado \u2014 o estado de cada venda vive nesta lista.",
174
+ waitForUser: true
175
+ }
176
+ ],
177
+ check: async () => await countByTenant("plg_shop_orders") > 0,
178
+ tour: {
179
+ id: "shop.orders",
180
+ stops: [
181
+ {
182
+ anchor: "nav./orders",
183
+ title: "Todo pedido cai aqui",
184
+ body: "Pago, em separa\xE7\xE3o, enviado \u2014 o estado de cada venda vive nesta lista.",
185
+ route: "/orders"
186
+ }
187
+ ]
188
+ }
189
+ }
190
+ ]
191
+ };
192
+ }
193
+
13
194
  // src/integrations/melhor-envio/labelProvider.ts
14
195
  var MELHOR_ENVIO_CARRIER = "melhor-envio";
15
196
  function createMelhorEnvioLabelProvider(resolve4) {
@@ -7760,6 +7941,10 @@ function createShopPlugin(options) {
7760
7941
  return {
7761
7942
  id: "shop",
7762
7943
  defaultAgentRole: "operations",
7944
+ // O que a loja pede de um tenant novo, na ordem em que faz diferença.
7945
+ // Vira linha de tarefa, aparece no checklist da trilha e é o roteiro que o
7946
+ // assistente segue — ver ./lib/onboarding.ts.
7947
+ onboarding: { program: buildShopOnboarding() },
7763
7948
  name: options?.navLabel ?? "Shop",
7764
7949
  icon: "ShoppingBag",
7765
7950
  version: "1.0.0",