@thorprovider/medusa-extended 1.11.3 → 1.11.6
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/index.d.mts +22 -5
- package/dist/index.d.ts +22 -5
- package/dist/index.js +106 -10
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +106 -10
- package/dist/index.mjs.map +1 -1
- package/package.json +3 -3
- package/src/dropshipper.test.ts +4 -4
- package/src/dropshipper.ts +128 -14
package/dist/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse } from '@thorprovider/types';
|
|
1
|
+
import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse } from '@thorprovider/types';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @fileoverview Medusa Multi-Tenant Admin Client
|
|
@@ -167,8 +167,8 @@ declare class MedusaAdminClient {
|
|
|
167
167
|
* One event from the streamed AI assistant chat (`chatAssistantStream`).
|
|
168
168
|
*
|
|
169
169
|
* The backend returns a UI-message stream (SSE over `text/event-stream`) for
|
|
170
|
-
* catalog searches, and a plain JSON `ChatResponse` for
|
|
171
|
-
*
|
|
170
|
+
* catalog searches, and a plain JSON `ChatResponse` for `default` intents.
|
|
171
|
+
* `chatAssistantStream` normalizes both into this single event type so
|
|
172
172
|
* consumers can render incremental text and update the "thinking" label as the
|
|
173
173
|
* model progresses without knowing the transport details.
|
|
174
174
|
*/
|
|
@@ -183,7 +183,7 @@ type ChatStreamEvent = {
|
|
|
183
183
|
} | {
|
|
184
184
|
type: 'finish';
|
|
185
185
|
intent: ChatIntent;
|
|
186
|
-
/** Products referenced by the answer (empty for
|
|
186
|
+
/** Products referenced by the answer (empty for `default` intents). */
|
|
187
187
|
sources: ChatSource[];
|
|
188
188
|
} | {
|
|
189
189
|
type: 'error';
|
|
@@ -261,13 +261,30 @@ declare class DropshipperClient {
|
|
|
261
261
|
*
|
|
262
262
|
* Unlike `chatAssistant`, this surfaces the model's progress: the backend
|
|
263
263
|
* resolves the intent first and then streams the answer token by token
|
|
264
|
-
* (catalog searches) or returns the full answer in one shot (
|
|
264
|
+
* (catalog searches) or returns the full answer in one shot (`default`).
|
|
265
265
|
* The response is normalized into a single `ReadableStream<ChatStreamEvent>`
|
|
266
266
|
* so callers can show a live "thinking" label and render text incrementally.
|
|
267
267
|
*
|
|
268
268
|
* `POST /admin/thor/dropshipper/ai/chat`
|
|
269
269
|
*/
|
|
270
270
|
chatAssistantStream(body: ChatRequest): Promise<ReadableStream<ChatStreamEvent>>;
|
|
271
|
+
/**
|
|
272
|
+
* Cheap liveness probe for the AI assistant.
|
|
273
|
+
*
|
|
274
|
+
* The backend performs no LLM or retrieval work, so this is safe to poll
|
|
275
|
+
* (e.g. from a dashboard availability indicator). Returns 200 with
|
|
276
|
+
* `available: true` when the assistant is configured; the backend answers
|
|
277
|
+
* HTTP 503 with `available: false` when `AI_GATEWAY_API_KEY` is missing.
|
|
278
|
+
*
|
|
279
|
+
* Deliberately does NOT go through `fetchBackendWithResilience`: that layer
|
|
280
|
+
* funnels every call through the SHARED `backendCircuitBreaker`, and the
|
|
281
|
+
* definitive 503 "not configured" answer would count as failures and could
|
|
282
|
+
* open the circuit, taking down all dropshipper API traffic. A health probe
|
|
283
|
+
* must stay isolated, with no retries and a short timeout.
|
|
284
|
+
*
|
|
285
|
+
* `GET /admin/thor/dropshipper/ai/health`
|
|
286
|
+
*/
|
|
287
|
+
chatAssistantHealth(): Promise<ChatAssistantHealthResponse>;
|
|
271
288
|
/**
|
|
272
289
|
* List feed notifications for the authenticated dropshipper.
|
|
273
290
|
*
|
package/dist/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse } from '@thorprovider/types';
|
|
1
|
+
import { GetChannelCustomersOptions, GetChannelCustomersResponse, GetChannelApiKeysResponse, GetChannelCategoriesOptions, GetChannelCategoriesResponse, GetCategorySalesChannelsResponse, AssignCategoriesToChannelsBody, AssignCategoriesToChannelsResponse, UnassignCategoriesFromChannelsBody, UnassignCategoriesFromChannelsResponse, GetCollectionSalesChannelsResponse, AssignCollectionsToChannelsBody, AssignCollectionsToChannelsResponse, UnassignCollectionsFromChannelsBody, UnassignCollectionsFromChannelsResponse, GetAdminStorefrontConfigResponse, UpdateStorefrontConfigBody, UpdateStorefrontConfigResponse, GetAdminSiteConfigResponse, UpdateSiteConfigBody, UpdateSiteConfigResponse, GetAdminSiteConfigHistoryOptions, GetAdminSiteConfigHistoryResponse, RestoreSiteConfigResponse, ChatIntent, ChatSource, DropshipperDashboardCapabilities, GetMyProfileResponse, ChatRequest, ChatResponse, ChatAssistantHealthResponse, GetNotificationsOptions, GetNotificationsResponse, OnboardDropshipperBody, OnboardDropshipperResponse, GetDropshipperProductsOptions, GetDropshipperProductsResponse, ValidateCheckoutItemsRequest, ValidateCheckoutItemsResponse, CostPriceChangesCheckResponse, CostPriceChangesResponse, AcknowledgeCostPriceChangesResponse, UpdateDropshipperProductStatusBody, UpdateDropshipperProductStatusResponse, GetProductAttributesResponse, GetDropshipperAttributesResponse, UpdateDropshipperPricesBody, UpdateDropshipperPricesResponse, GetDropshipperOrdersOptions, GetDropshipperOrdersResponse, GetDropshipperOrderDetailResponse, GetDropshipperShippingOptionsParams, GetDropshipperShippingOptionsResponse, ExtendedCreateDropshipperOrderBody, ExtendedCreateDropshipperOrderResponse, SetPaymentCollectorBody, SetPaymentCollectorResponse, SetPaymentMethodBody, SetPaymentMethodResponse, CancelDropshipperOrderResponse, CreateOrderEditBody, CreateOrderEditResponse, AddOrderEditItemBody, AddOrderEditItemResponse, ConfirmOrderEditResponse, GetOrderNotesResponse, CreateOrderNoteBody, CreateOrderNoteResponse, DeleteOrderNoteResponse, GetProviderCategoriesResponse, GetDropshipperCategoriesOptions, GetDropshipperCategoriesResponse, CreateDropshipperCategoryBody, DropshipperCategory, UpdateDropshipperCategoryBody, DeleteDropshipperCategoryResponse, GetCategoryMappingsOptions, GetCategoryMappingsResponse, CreateCategoryMappingBody, CreateCategoryMappingResponse, DeleteCategoryMappingResponse, GetDropshipperCustomersOptions, GetDropshipperCustomersResponse, GetDropshipperCustomerDetailResponse, CreateDropshipperCustomerBody, CreateDropshipperCustomerResponse, UpdateDropshipperCustomerBody, UpdateDropshipperCustomerResponse, GetDropshipperAddressesResponse, DropshipperAddressBody, DropshipperAddressResponse, GetDropshipperAccountResponse, GetDropshipperPayableResponse, GetDropshipperReceivableResponse, GetSettlementsOptions, GetSettlementsResponse, GetSettlementDetailResponse, GetDropshipperAccountBalanceResponse, GetDropshipperAccountOrdersOptions, GetDropshipperAccountOrdersResponse, CreateSettlementBody, CreateSettlementResponse, ConfirmSettlementBody, UpdateSettlementStatusResponse, CancelSettlementBody, GetAdminDropshipperAccountsResponse, GetAdminAccountBalanceResponse, GetAdminPriceListsResponse, GetUserChannelResponse, GetAdminDropshipperAccountOrdersResponse, GetAdminDropshipperAccountSettlementsOptions, GetAdminDropshipperAccountSettlementsResponse, ResolveGuaranteeBody, ResolveGuaranteeResponse, CreateCompensacionBody, CreateCompensacionResponse, CreateAjusteBody, CreateAjusteResponse, CreateCobroBody, CreateCobroResponse, CreatePagoBody, CreatePagoResponse, CreateReversoBody, CreateReversoResponse, ConfirmMovementBody, ConfirmMovementResponse, CancelMovementBody, CancelMovementResponse, GetFinancialAnalysisResponse, RegisterPaymentBody, RegisterPaymentResponse, GetDropshipperPromotionsOptions, GetDropshipperPromotionsResponse, CreateDropshipperPromotionBody, DropshipperPromotion, UpdateDropshipperPromotionBody, DeleteDropshipperPromotionResponse, GetDashboardStatsOptions, GetDashboardStatsResponse, GetStorefrontDropshipperCategoriesResponse, GetDropshipperDraftOrdersOptions, GetDropshipperDraftOrdersResponse, GetDropshipperDraftOrderDetailResponse, CreateDropshipperDraftOrderBody, CreateDropshipperDraftOrderResponse, UpdateDropshipperDraftOrderBody, UpdateDropshipperDraftOrderResponse, ConvertDropshipperDraftOrderBody, ConvertDropshipperDraftOrderResponse, DeleteDropshipperDraftOrderResponse, GetGeoCountriesResponse, GetGeoProvincesResponse, GetGeoCitiesResponse } from '@thorprovider/types';
|
|
2
2
|
|
|
3
3
|
/**
|
|
4
4
|
* @fileoverview Medusa Multi-Tenant Admin Client
|
|
@@ -167,8 +167,8 @@ declare class MedusaAdminClient {
|
|
|
167
167
|
* One event from the streamed AI assistant chat (`chatAssistantStream`).
|
|
168
168
|
*
|
|
169
169
|
* The backend returns a UI-message stream (SSE over `text/event-stream`) for
|
|
170
|
-
* catalog searches, and a plain JSON `ChatResponse` for
|
|
171
|
-
*
|
|
170
|
+
* catalog searches, and a plain JSON `ChatResponse` for `default` intents.
|
|
171
|
+
* `chatAssistantStream` normalizes both into this single event type so
|
|
172
172
|
* consumers can render incremental text and update the "thinking" label as the
|
|
173
173
|
* model progresses without knowing the transport details.
|
|
174
174
|
*/
|
|
@@ -183,7 +183,7 @@ type ChatStreamEvent = {
|
|
|
183
183
|
} | {
|
|
184
184
|
type: 'finish';
|
|
185
185
|
intent: ChatIntent;
|
|
186
|
-
/** Products referenced by the answer (empty for
|
|
186
|
+
/** Products referenced by the answer (empty for `default` intents). */
|
|
187
187
|
sources: ChatSource[];
|
|
188
188
|
} | {
|
|
189
189
|
type: 'error';
|
|
@@ -261,13 +261,30 @@ declare class DropshipperClient {
|
|
|
261
261
|
*
|
|
262
262
|
* Unlike `chatAssistant`, this surfaces the model's progress: the backend
|
|
263
263
|
* resolves the intent first and then streams the answer token by token
|
|
264
|
-
* (catalog searches) or returns the full answer in one shot (
|
|
264
|
+
* (catalog searches) or returns the full answer in one shot (`default`).
|
|
265
265
|
* The response is normalized into a single `ReadableStream<ChatStreamEvent>`
|
|
266
266
|
* so callers can show a live "thinking" label and render text incrementally.
|
|
267
267
|
*
|
|
268
268
|
* `POST /admin/thor/dropshipper/ai/chat`
|
|
269
269
|
*/
|
|
270
270
|
chatAssistantStream(body: ChatRequest): Promise<ReadableStream<ChatStreamEvent>>;
|
|
271
|
+
/**
|
|
272
|
+
* Cheap liveness probe for the AI assistant.
|
|
273
|
+
*
|
|
274
|
+
* The backend performs no LLM or retrieval work, so this is safe to poll
|
|
275
|
+
* (e.g. from a dashboard availability indicator). Returns 200 with
|
|
276
|
+
* `available: true` when the assistant is configured; the backend answers
|
|
277
|
+
* HTTP 503 with `available: false` when `AI_GATEWAY_API_KEY` is missing.
|
|
278
|
+
*
|
|
279
|
+
* Deliberately does NOT go through `fetchBackendWithResilience`: that layer
|
|
280
|
+
* funnels every call through the SHARED `backendCircuitBreaker`, and the
|
|
281
|
+
* definitive 503 "not configured" answer would count as failures and could
|
|
282
|
+
* open the circuit, taking down all dropshipper API traffic. A health probe
|
|
283
|
+
* must stay isolated, with no retries and a short timeout.
|
|
284
|
+
*
|
|
285
|
+
* `GET /admin/thor/dropshipper/ai/health`
|
|
286
|
+
*/
|
|
287
|
+
chatAssistantHealth(): Promise<ChatAssistantHealthResponse>;
|
|
271
288
|
/**
|
|
272
289
|
* List feed notifications for the authenticated dropshipper.
|
|
273
290
|
*
|
package/dist/index.js
CHANGED
|
@@ -481,7 +481,7 @@ var DropshipperClient = class {
|
|
|
481
481
|
*
|
|
482
482
|
* Unlike `chatAssistant`, this surfaces the model's progress: the backend
|
|
483
483
|
* resolves the intent first and then streams the answer token by token
|
|
484
|
-
* (catalog searches) or returns the full answer in one shot (
|
|
484
|
+
* (catalog searches) or returns the full answer in one shot (`default`).
|
|
485
485
|
* The response is normalized into a single `ReadableStream<ChatStreamEvent>`
|
|
486
486
|
* so callers can show a live "thinking" label and render text incrementally.
|
|
487
487
|
*
|
|
@@ -501,7 +501,10 @@ var DropshipperClient = class {
|
|
|
501
501
|
};
|
|
502
502
|
let response;
|
|
503
503
|
try {
|
|
504
|
-
response = await fetchBackendWithResilience(url, init
|
|
504
|
+
response = await fetchBackendWithResilience(url, init, {
|
|
505
|
+
timeoutMs: 6e4,
|
|
506
|
+
maxRetries: 1
|
|
507
|
+
});
|
|
505
508
|
} catch (networkError) {
|
|
506
509
|
throw new import_adapters3.ProviderAPIError(
|
|
507
510
|
`[dropshipper] Network error on POST /admin/thor/dropshipper/ai/chat: ${networkError.message}`,
|
|
@@ -511,20 +514,36 @@ var DropshipperClient = class {
|
|
|
511
514
|
}
|
|
512
515
|
if (!response.ok) {
|
|
513
516
|
let message = `HTTP ${response.status}`;
|
|
517
|
+
let errorCode;
|
|
518
|
+
let requestId;
|
|
519
|
+
let details;
|
|
514
520
|
try {
|
|
515
521
|
const json = await response.json();
|
|
516
522
|
message = json?.message ?? message;
|
|
523
|
+
errorCode = json?.error_code ?? json?.type;
|
|
524
|
+
requestId = json?.request_id;
|
|
525
|
+
details = json?.details;
|
|
517
526
|
} catch {
|
|
518
527
|
}
|
|
528
|
+
this.logger.error(
|
|
529
|
+
`[dropshipper] POST /admin/thor/dropshipper/ai/chat failed status=${response.status} message=${message}` + (errorCode ? ` error_code=${errorCode}` : "") + (requestId ? ` request_id=${requestId}` : "") + (details ? ` details=${details}` : "")
|
|
530
|
+
);
|
|
519
531
|
throw new import_adapters3.ProviderAPIError(
|
|
520
532
|
`[dropshipper] POST /admin/thor/dropshipper/ai/chat failed: ${message}`,
|
|
521
533
|
`DROPSHIPPER_API_${response.status}`,
|
|
522
|
-
response.status
|
|
534
|
+
response.status,
|
|
535
|
+
{
|
|
536
|
+
message,
|
|
537
|
+
status: response.status,
|
|
538
|
+
errorCode,
|
|
539
|
+
requestId,
|
|
540
|
+
details
|
|
541
|
+
}
|
|
523
542
|
);
|
|
524
543
|
}
|
|
525
544
|
const contentType = response.headers.get("content-type") ?? "";
|
|
526
545
|
if (contentType.includes("text/event-stream") && response.body) {
|
|
527
|
-
return mapUiMessageStreamToEvents(response.body);
|
|
546
|
+
return mapUiMessageStreamToEvents(response.body, this.logger);
|
|
528
547
|
}
|
|
529
548
|
const data = await response.json();
|
|
530
549
|
return new ReadableStream({
|
|
@@ -540,6 +559,61 @@ var DropshipperClient = class {
|
|
|
540
559
|
}
|
|
541
560
|
});
|
|
542
561
|
}
|
|
562
|
+
/**
|
|
563
|
+
* Cheap liveness probe for the AI assistant.
|
|
564
|
+
*
|
|
565
|
+
* The backend performs no LLM or retrieval work, so this is safe to poll
|
|
566
|
+
* (e.g. from a dashboard availability indicator). Returns 200 with
|
|
567
|
+
* `available: true` when the assistant is configured; the backend answers
|
|
568
|
+
* HTTP 503 with `available: false` when `AI_GATEWAY_API_KEY` is missing.
|
|
569
|
+
*
|
|
570
|
+
* Deliberately does NOT go through `fetchBackendWithResilience`: that layer
|
|
571
|
+
* funnels every call through the SHARED `backendCircuitBreaker`, and the
|
|
572
|
+
* definitive 503 "not configured" answer would count as failures and could
|
|
573
|
+
* open the circuit, taking down all dropshipper API traffic. A health probe
|
|
574
|
+
* must stay isolated, with no retries and a short timeout.
|
|
575
|
+
*
|
|
576
|
+
* `GET /admin/thor/dropshipper/ai/health`
|
|
577
|
+
*/
|
|
578
|
+
async chatAssistantHealth() {
|
|
579
|
+
const url = `${this.baseUrl}/admin/thor/dropshipper/ai/health`;
|
|
580
|
+
const controller = new AbortController();
|
|
581
|
+
const timeoutId = setTimeout(() => controller.abort(), 5e3);
|
|
582
|
+
let response;
|
|
583
|
+
try {
|
|
584
|
+
response = await fetch(url, {
|
|
585
|
+
method: "GET",
|
|
586
|
+
headers: { Authorization: `Bearer ${this.token}` },
|
|
587
|
+
signal: controller.signal,
|
|
588
|
+
cache: "no-store"
|
|
589
|
+
});
|
|
590
|
+
} catch (error) {
|
|
591
|
+
clearTimeout(timeoutId);
|
|
592
|
+
throw new import_adapters3.ProviderAPIError(
|
|
593
|
+
`[dropshipper] Network error on GET /admin/thor/dropshipper/ai/health: ${error.message}`,
|
|
594
|
+
"NETWORK_ERROR",
|
|
595
|
+
0
|
|
596
|
+
);
|
|
597
|
+
}
|
|
598
|
+
clearTimeout(timeoutId);
|
|
599
|
+
if (response.status === 503) {
|
|
600
|
+
try {
|
|
601
|
+
const body = await response.json();
|
|
602
|
+
if (body && typeof body.available === "boolean") {
|
|
603
|
+
return body;
|
|
604
|
+
}
|
|
605
|
+
} catch {
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
if (!response.ok) {
|
|
609
|
+
throw new import_adapters3.ProviderAPIError(
|
|
610
|
+
`[dropshipper] GET /admin/thor/dropshipper/ai/health failed: HTTP ${response.status}`,
|
|
611
|
+
`DROPSHIPPER_API_${response.status}`,
|
|
612
|
+
response.status
|
|
613
|
+
);
|
|
614
|
+
}
|
|
615
|
+
return response.json();
|
|
616
|
+
}
|
|
543
617
|
// -------------------------------------------------------------------------
|
|
544
618
|
// Notifications
|
|
545
619
|
// -------------------------------------------------------------------------
|
|
@@ -1698,10 +1772,11 @@ var DropshipperClient = class {
|
|
|
1698
1772
|
);
|
|
1699
1773
|
}
|
|
1700
1774
|
};
|
|
1701
|
-
async function* parseSse(stream) {
|
|
1775
|
+
async function* parseSse(stream, logger) {
|
|
1702
1776
|
const reader = stream.getReader();
|
|
1703
1777
|
const decoder = new TextDecoder();
|
|
1704
1778
|
let buffer = "";
|
|
1779
|
+
let frameIndex = 0;
|
|
1705
1780
|
try {
|
|
1706
1781
|
while (true) {
|
|
1707
1782
|
const { done, value } = await reader.read();
|
|
@@ -1714,9 +1789,13 @@ async function* parseSse(stream) {
|
|
|
1714
1789
|
if (!trimmed.startsWith("data:")) continue;
|
|
1715
1790
|
const payload = trimmed.slice(5).trim();
|
|
1716
1791
|
if (!payload || payload === "[DONE]") continue;
|
|
1792
|
+
frameIndex += 1;
|
|
1717
1793
|
try {
|
|
1718
1794
|
yield JSON.parse(payload);
|
|
1719
|
-
} catch {
|
|
1795
|
+
} catch (err) {
|
|
1796
|
+
logger?.warn(
|
|
1797
|
+
`[dropshipper] sse-malformed-frame frame=${frameIndex} payload=${payload.slice(0, 200)}`
|
|
1798
|
+
);
|
|
1720
1799
|
}
|
|
1721
1800
|
}
|
|
1722
1801
|
}
|
|
@@ -1724,9 +1803,13 @@ async function* parseSse(stream) {
|
|
|
1724
1803
|
if (tail.startsWith("data:")) {
|
|
1725
1804
|
const payload = tail.slice(5).trim();
|
|
1726
1805
|
if (payload && payload !== "[DONE]") {
|
|
1806
|
+
frameIndex += 1;
|
|
1727
1807
|
try {
|
|
1728
1808
|
yield JSON.parse(payload);
|
|
1729
|
-
} catch {
|
|
1809
|
+
} catch (err) {
|
|
1810
|
+
logger?.warn(
|
|
1811
|
+
`[dropshipper] sse-malformed-frame frame=${frameIndex} payload=${payload.slice(0, 200)}`
|
|
1812
|
+
);
|
|
1730
1813
|
}
|
|
1731
1814
|
}
|
|
1732
1815
|
}
|
|
@@ -1734,10 +1817,11 @@ async function* parseSse(stream) {
|
|
|
1734
1817
|
reader.releaseLock();
|
|
1735
1818
|
}
|
|
1736
1819
|
}
|
|
1737
|
-
function mapUiMessageStreamToEvents(stream) {
|
|
1820
|
+
function mapUiMessageStreamToEvents(stream, logger) {
|
|
1738
1821
|
return new ReadableStream({
|
|
1739
1822
|
async start(controller) {
|
|
1740
|
-
|
|
1823
|
+
let eventCount = 0;
|
|
1824
|
+
for await (const raw of parseSse(stream, logger)) {
|
|
1741
1825
|
const chunk = raw;
|
|
1742
1826
|
switch (chunk.type) {
|
|
1743
1827
|
case "start":
|
|
@@ -1745,27 +1829,39 @@ function mapUiMessageStreamToEvents(stream) {
|
|
|
1745
1829
|
type: "start",
|
|
1746
1830
|
intent: chunk.messageMetadata?.intent
|
|
1747
1831
|
});
|
|
1832
|
+
eventCount += 1;
|
|
1748
1833
|
break;
|
|
1749
1834
|
case "text-delta":
|
|
1750
1835
|
if (chunk.delta !== void 0) {
|
|
1751
1836
|
controller.enqueue({ type: "text-delta", delta: chunk.delta });
|
|
1837
|
+
eventCount += 1;
|
|
1752
1838
|
}
|
|
1753
1839
|
break;
|
|
1754
1840
|
case "finish":
|
|
1755
1841
|
controller.enqueue({
|
|
1756
1842
|
type: "finish",
|
|
1757
|
-
intent: chunk.messageMetadata?.intent ?? "
|
|
1843
|
+
intent: chunk.messageMetadata?.intent ?? "default",
|
|
1758
1844
|
sources: chunk.messageMetadata?.sources ?? []
|
|
1759
1845
|
});
|
|
1846
|
+
eventCount += 1;
|
|
1760
1847
|
break;
|
|
1761
1848
|
case "error":
|
|
1849
|
+
logger?.warn(
|
|
1850
|
+
`[dropshipper] chat-stream-error errorText=${chunk.errorText}`
|
|
1851
|
+
);
|
|
1762
1852
|
controller.enqueue({
|
|
1763
1853
|
type: "error",
|
|
1764
1854
|
errorText: chunk.errorText ?? "Error inesperado del asistente."
|
|
1765
1855
|
});
|
|
1856
|
+
eventCount += 1;
|
|
1766
1857
|
break;
|
|
1858
|
+
default:
|
|
1859
|
+
logger?.debug(
|
|
1860
|
+
`[dropshipper] chat-stream-unknown-frame type=${chunk.type}`
|
|
1861
|
+
);
|
|
1767
1862
|
}
|
|
1768
1863
|
}
|
|
1864
|
+
logger?.debug(`[dropshipper] chat-stream-completed events=${eventCount}`);
|
|
1769
1865
|
controller.close();
|
|
1770
1866
|
},
|
|
1771
1867
|
cancel() {
|