@joai/sdk 7.0.7 → 7.0.8

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 CHANGED
@@ -249,6 +249,24 @@ declare function createGuestCommerceStorage(options: GuestCommerceStorageOptions
249
249
  claimOrderReturn(): GuestOrderAccess | null;
250
250
  };
251
251
  //#endregion
252
+ //#region src/commerce/recentlyViewed.d.ts
253
+ type RecentlyViewedStorageOptions = {
254
+ /** Team slug or shop id — scopes storage per storefront. */namespace: string;
255
+ maxItems?: number;
256
+ };
257
+ type RecentlyViewedStorage = {
258
+ track: (slug: string) => void;
259
+ getSlugs: () => string[];
260
+ clear: () => void;
261
+ };
262
+ /**
263
+ * Persist recently viewed product slugs in localStorage (no PII).
264
+ * Newest first; duplicates move to the front; capped by maxItems.
265
+ */
266
+ declare function createRecentlyViewedStorage(options: RecentlyViewedStorageOptions): RecentlyViewedStorage;
267
+ declare function trackRecentlyViewed(namespace: string, slug: string, maxItems?: number): void;
268
+ declare function getRecentlyViewedSlugs(namespace: string): string[];
269
+ //#endregion
252
270
  //#region src/commerce/guestCheckout.d.ts
253
271
  type GuestCheckoutCartItem = {
254
272
  id: string;
@@ -1447,6 +1465,17 @@ declare class OrdersResource {
1447
1465
  pay(id: string, provider?: PaymentProvider, accessToken?: string): Promise<_$_joai_core0.IAppResponse<{
1448
1466
  url: string;
1449
1467
  }>>;
1468
+ reorder(id: string): Promise<_$_joai_core0.IAppResponse<{
1469
+ added: Array<{
1470
+ id: string;
1471
+ name: string;
1472
+ quantity: number;
1473
+ }>;
1474
+ skipped: Array<{
1475
+ name: string;
1476
+ reason: string;
1477
+ }>;
1478
+ }>>;
1450
1479
  notify(id: string, type: string | undefined, agentId: string): Promise<_$_joai_core0.IAppResponse<{
1451
1480
  message: string;
1452
1481
  }>>;
@@ -2388,4 +2417,4 @@ declare class DistributionResource {
2388
2417
  private fetchDistribution;
2389
2418
  }
2390
2419
  //#endregion
2391
- export { AddressesResource, AgentsResource, AlertsResource, ApiTokensResource, AppointmentsResource, type AttachedMedia, type AuthConfirmCodeRequest, type AuthConfirmCodeResponse, type AuthNativeSessionResponse, type AuthPortalSessionResponse, AuthResource, type AuthSendCodeRequest, type AuthUser, AutomationsResource, type BackendWarp, type BackendWarpBrand, BillingResource, BlueprintsResource, type CacheConfig, CachedHttpService, CampaignsResource, CardsResource, type Cart, CartsResource, ChangelogResource, CharactersResource, CheckoutResource, type CheckoutSnapshot, CommerceResource, ContactsResource, ContentResource, ContractsResource, type CreateEmptyGuestCheckoutOptions, type CreateHookPayload, type CreateInboundHookPayload, type CreateInternalHookPayload, type CreateWarpLinkedHookPayload, type CreateWebHookPayload, DeskResource, DistributionResource, DocumentsResource, ElementsResource, EntitiesResource, FlowsResource, type FulfillmentLocation, type FulfillmentLocationInput, FulfillmentsResource, GoalsResource, type GuestBuyer, type GuestCartAmounts, type GuestCheckoutCartItem, type GuestCheckoutClient, type GuestCheckoutDraft, GuestCheckoutError, type GuestCheckoutErrorCode, type GuestCheckoutSnapshotResult, type GuestCheckoutState, type GuestCommerceStorage, type GuestCommerceStorageOptions, type GuestCouponClient, GuestCouponError, type GuestCouponErrorCode, type GuestCouponPreview, type GuestOrderAccess, type Hook, type HookSample, type HookTrigger, type HookTriggerCondition, type HookTriggerInput, HooksResource, IngestionsResource, InquiriesResource, IntegrationsResource, IntentsResource, type ItemListParams, ItemsResource, JoAiClient, type JoAiClientConfig, KvResource, LinksResource, LoyaltyResource, McpResource, type MediaUploadType, MeetingsResource, MemoriesResource, MessagesResource, MetricsResource, MissionsResource, NotificationsResource, OfficeResource, type OpenPortalSessionOptions, type OpeningHoursEntry, type OpeningHoursFormatOptions, type Order, type OrderPriceMode, type OrderStatus, OrdersResource, PersonaResource, type PlaceCheckoutOrderRequest, type PlaceGuestCheckoutOrderResult, type Product, type ProductVariation, ProductsResource, ProjectsResource, RemindersResource, ReturnsResource, type RevalidateGuestCouponResult, SegmentsResource, ServicesResource, type ShippingRate, type ShippingRateInput, ShippingResource, type ShippingZoneInput, ShortcutsResource, SitesResource, SkillsResource, SocialPostsResource, StatsResource, StoreResource, SubscriptionsResource, SwarmsResource, TagsResource, TasksResource, type TaxClassInput, TaxClassesResource, type TeamInviteInfo, TeamsResource, UpdatesResource, UpgradesResource, UsersResource, VoiceResource, WalletsResource, WarpsResource, type WebHookTriggerEvent, WorkspaceResource, assertGuestCheckoutReady, assertGuestPickupSlotReady, buildGuestCheckoutSnapshotRequest, buildGuestOrderReturnUrl, completePortalSession, createClient, createEmptyGuestCheckoutState, createGuestCheckoutSnapshot, createGuestCommerceStorage, formatOpeningHours, formatPickupSlotLabel, getAuthFragmentToken, guestCartAmounts, guestCouponMessageFromErrors, isAllowedRedirectUrl, isGuestCheckoutError, isGuestCouponError, isPortalCallbackUrl, openPortalSession, placeGuestCheckoutOrder, readGuestOrderReturnAccess, revalidateGuestCoupon, sanitizePortalCallbackUrl, stripGuestOrderReturnToken, toGuestCheckoutDraft, validateGuestCoupon };
2420
+ export { AddressesResource, AgentsResource, AlertsResource, ApiTokensResource, AppointmentsResource, type AttachedMedia, type AuthConfirmCodeRequest, type AuthConfirmCodeResponse, type AuthNativeSessionResponse, type AuthPortalSessionResponse, AuthResource, type AuthSendCodeRequest, type AuthUser, AutomationsResource, type BackendWarp, type BackendWarpBrand, BillingResource, BlueprintsResource, type CacheConfig, CachedHttpService, CampaignsResource, CardsResource, type Cart, CartsResource, ChangelogResource, CharactersResource, CheckoutResource, type CheckoutSnapshot, CommerceResource, ContactsResource, ContentResource, ContractsResource, type CreateEmptyGuestCheckoutOptions, type CreateHookPayload, type CreateInboundHookPayload, type CreateInternalHookPayload, type CreateWarpLinkedHookPayload, type CreateWebHookPayload, DeskResource, DistributionResource, DocumentsResource, ElementsResource, EntitiesResource, FlowsResource, type FulfillmentLocation, type FulfillmentLocationInput, FulfillmentsResource, GoalsResource, type GuestBuyer, type GuestCartAmounts, type GuestCheckoutCartItem, type GuestCheckoutClient, type GuestCheckoutDraft, GuestCheckoutError, type GuestCheckoutErrorCode, type GuestCheckoutSnapshotResult, type GuestCheckoutState, type GuestCommerceStorage, type GuestCommerceStorageOptions, type GuestCouponClient, GuestCouponError, type GuestCouponErrorCode, type GuestCouponPreview, type GuestOrderAccess, type Hook, type HookSample, type HookTrigger, type HookTriggerCondition, type HookTriggerInput, HooksResource, IngestionsResource, InquiriesResource, IntegrationsResource, IntentsResource, type ItemListParams, ItemsResource, JoAiClient, type JoAiClientConfig, KvResource, LinksResource, LoyaltyResource, McpResource, type MediaUploadType, MeetingsResource, MemoriesResource, MessagesResource, MetricsResource, MissionsResource, NotificationsResource, OfficeResource, type OpenPortalSessionOptions, type OpeningHoursEntry, type OpeningHoursFormatOptions, type Order, type OrderPriceMode, type OrderStatus, OrdersResource, PersonaResource, type PlaceCheckoutOrderRequest, type PlaceGuestCheckoutOrderResult, type Product, type ProductVariation, ProductsResource, ProjectsResource, type RecentlyViewedStorage, type RecentlyViewedStorageOptions, RemindersResource, ReturnsResource, type RevalidateGuestCouponResult, SegmentsResource, ServicesResource, type ShippingRate, type ShippingRateInput, ShippingResource, type ShippingZoneInput, ShortcutsResource, SitesResource, SkillsResource, SocialPostsResource, StatsResource, StoreResource, SubscriptionsResource, SwarmsResource, TagsResource, TasksResource, type TaxClassInput, TaxClassesResource, type TeamInviteInfo, TeamsResource, UpdatesResource, UpgradesResource, UsersResource, VoiceResource, WalletsResource, WarpsResource, type WebHookTriggerEvent, WorkspaceResource, assertGuestCheckoutReady, assertGuestPickupSlotReady, buildGuestCheckoutSnapshotRequest, buildGuestOrderReturnUrl, completePortalSession, createClient, createEmptyGuestCheckoutState, createGuestCheckoutSnapshot, createGuestCommerceStorage, createRecentlyViewedStorage, formatOpeningHours, formatPickupSlotLabel, getAuthFragmentToken, getRecentlyViewedSlugs, guestCartAmounts, guestCouponMessageFromErrors, isAllowedRedirectUrl, isGuestCheckoutError, isGuestCouponError, isPortalCallbackUrl, openPortalSession, placeGuestCheckoutOrder, readGuestOrderReturnAccess, revalidateGuestCoupon, sanitizePortalCallbackUrl, stripGuestOrderReturnToken, toGuestCheckoutDraft, trackRecentlyViewed, validateGuestCoupon };
package/dist/index.mjs CHANGED
@@ -255,7 +255,7 @@ const orderAccessPrefix = "joai:order-access:";
255
255
  const checkoutKey = (namespace) => `joai:guest-checkout:${namespace}`;
256
256
  const ordersKey = (namespace) => `joai:guest-orders:${namespace}`;
257
257
  const orderAccessKey = (namespace, orderId) => `${orderAccessPrefix}${namespace}:${orderId}`;
258
- const safeGet = (key) => {
258
+ const safeGet$1 = (key) => {
259
259
  if (typeof localStorage === "undefined") return null;
260
260
  try {
261
261
  return localStorage.getItem(key);
@@ -263,13 +263,13 @@ const safeGet = (key) => {
263
263
  return null;
264
264
  }
265
265
  };
266
- const safeSet = (key, value) => {
266
+ const safeSet$1 = (key, value) => {
267
267
  if (typeof localStorage === "undefined") return;
268
268
  try {
269
269
  localStorage.setItem(key, value);
270
270
  } catch {}
271
271
  };
272
- const safeRemove = (key) => {
272
+ const safeRemove$1 = (key) => {
273
273
  if (typeof localStorage === "undefined") return;
274
274
  try {
275
275
  localStorage.removeItem(key);
@@ -287,7 +287,7 @@ const parseGuestOrderAccess = (entry) => {
287
287
  };
288
288
  const readOrderList = (namespace) => {
289
289
  try {
290
- const saved = JSON.parse(safeGet(ordersKey(namespace)) || "[]");
290
+ const saved = JSON.parse(safeGet$1(ordersKey(namespace)) || "[]");
291
291
  if (!Array.isArray(saved)) return [];
292
292
  return saved.map(parseGuestOrderAccess).filter((entry) => entry !== null);
293
293
  } catch {
@@ -330,11 +330,11 @@ function createGuestCommerceStorage(options) {
330
330
  const maxOrders = options.maxOrders ?? 10;
331
331
  const storage = {
332
332
  saveCheckoutDraft(draft) {
333
- safeSet(checkoutKey(options.namespace), JSON.stringify(draft));
333
+ safeSet$1(checkoutKey(options.namespace), JSON.stringify(draft));
334
334
  },
335
335
  readCheckoutDraft(fallback) {
336
336
  try {
337
- const saved = JSON.parse(safeGet(checkoutKey(options.namespace)) || "");
337
+ const saved = JSON.parse(safeGet$1(checkoutKey(options.namespace)) || "");
338
338
  return {
339
339
  ...fallback,
340
340
  ...saved,
@@ -346,24 +346,24 @@ function createGuestCommerceStorage(options) {
346
346
  },
347
347
  saveOrderAccess({ orderId, accessToken }) {
348
348
  const key = orderAccessKey(options.namespace, orderId);
349
- const resolvedToken = accessToken || safeGet(key);
350
- if (resolvedToken) safeSet(key, resolvedToken);
349
+ const resolvedToken = accessToken || safeGet$1(key);
350
+ if (resolvedToken) safeSet$1(key, resolvedToken);
351
351
  const orders = readOrderList(options.namespace).filter((entry) => entry.orderId !== orderId);
352
352
  orders.unshift({
353
353
  orderId,
354
354
  accessToken: resolvedToken
355
355
  });
356
356
  const kept = orders.slice(0, maxOrders);
357
- for (const dropped of orders.slice(maxOrders)) safeRemove(orderAccessKey(options.namespace, dropped.orderId));
358
- safeSet(ordersKey(options.namespace), JSON.stringify(kept));
357
+ for (const dropped of orders.slice(maxOrders)) safeRemove$1(orderAccessKey(options.namespace, dropped.orderId));
358
+ safeSet$1(ordersKey(options.namespace), JSON.stringify(kept));
359
359
  },
360
360
  readOrderAccess(orderId) {
361
- return safeGet(orderAccessKey(options.namespace, orderId));
361
+ return safeGet$1(orderAccessKey(options.namespace, orderId));
362
362
  },
363
363
  listOrderAccess() {
364
364
  return readOrderList(options.namespace).map((entry) => ({
365
365
  orderId: entry.orderId,
366
- accessToken: entry.accessToken || safeGet(orderAccessKey(options.namespace, entry.orderId))
366
+ accessToken: entry.accessToken || safeGet$1(orderAccessKey(options.namespace, entry.orderId))
367
367
  }));
368
368
  },
369
369
  /** Absolute shop URL from a path or full URL (e.g. orders page). */
@@ -387,6 +387,71 @@ function createGuestCommerceStorage(options) {
387
387
  return storage;
388
388
  }
389
389
  //#endregion
390
+ //#region src/commerce/recentlyViewed.ts
391
+ const DEFAULT_MAX_ITEMS = 12;
392
+ const storageKey = (namespace) => `joai:recently-viewed:${namespace}`;
393
+ const safeGet = (key) => {
394
+ if (typeof localStorage === "undefined") return null;
395
+ try {
396
+ return localStorage.getItem(key);
397
+ } catch {
398
+ return null;
399
+ }
400
+ };
401
+ const safeSet = (key, value) => {
402
+ if (typeof localStorage === "undefined") return;
403
+ try {
404
+ localStorage.setItem(key, value);
405
+ } catch {}
406
+ };
407
+ const safeRemove = (key) => {
408
+ if (typeof localStorage === "undefined") return;
409
+ try {
410
+ localStorage.removeItem(key);
411
+ } catch {}
412
+ };
413
+ const parseSlugs = (raw) => {
414
+ if (!raw) return [];
415
+ try {
416
+ const parsed = JSON.parse(raw);
417
+ if (!Array.isArray(parsed)) return [];
418
+ return parsed.filter((item) => typeof item === "string" && item.length > 0);
419
+ } catch {
420
+ return [];
421
+ }
422
+ };
423
+ /**
424
+ * Persist recently viewed product slugs in localStorage (no PII).
425
+ * Newest first; duplicates move to the front; capped by maxItems.
426
+ */
427
+ function createRecentlyViewedStorage(options) {
428
+ const key = storageKey(options.namespace);
429
+ const maxItems = options.maxItems ?? DEFAULT_MAX_ITEMS;
430
+ return {
431
+ track(slug) {
432
+ const normalized = slug.trim();
433
+ if (!normalized) return;
434
+ const updated = [normalized, ...parseSlugs(safeGet(key)).filter((item) => item !== normalized)].slice(0, maxItems);
435
+ safeSet(key, JSON.stringify(updated));
436
+ },
437
+ getSlugs() {
438
+ return parseSlugs(safeGet(key));
439
+ },
440
+ clear() {
441
+ safeRemove(key);
442
+ }
443
+ };
444
+ }
445
+ function trackRecentlyViewed(namespace, slug, maxItems) {
446
+ createRecentlyViewedStorage({
447
+ namespace,
448
+ maxItems
449
+ }).track(slug);
450
+ }
451
+ function getRecentlyViewedSlugs(namespace) {
452
+ return createRecentlyViewedStorage({ namespace }).getSlugs();
453
+ }
454
+ //#endregion
390
455
  //#region src/commerce/guestCheckout.ts
391
456
  var GuestCheckoutError = class extends Error {
392
457
  constructor(code) {
@@ -2110,6 +2175,9 @@ var OrdersResource = class {
2110
2175
  pay(id, provider, accessToken) {
2111
2176
  return this.http.post(`orders/${id}/pay`, { ...provider ? { provider } : {} }, orderAccessHeaders(accessToken));
2112
2177
  }
2178
+ reorder(id) {
2179
+ return this.http.post(`orders/${id}/reorder`);
2180
+ }
2113
2181
  notify(id, type = "confirmation", agentId) {
2114
2182
  return this.http.post(`orders/${id}/notify`, {
2115
2183
  type,
@@ -3588,4 +3656,4 @@ var DistributionResource = class {
3588
3656
  }
3589
3657
  };
3590
3658
  //#endregion
3591
- export { AddressesResource, AgentsResource, AlertsResource, ApiTokensResource, AppointmentsResource, AuthResource, AutomationsResource, BillingResource, BlueprintsResource, CachedHttpService, CampaignsResource, CardsResource, CartsResource, ChangelogResource, CharactersResource, CheckoutResource, CommerceResource, ContactsResource, ContentResource, ContractsResource, DeskResource, DistributionResource, DocumentsResource, ElementsResource, EntitiesResource, FlowsResource, FulfillmentsResource, GoalsResource, GuestCheckoutError, GuestCouponError, HooksResource, IngestionsResource, InquiriesResource, IntegrationsResource, IntentsResource, ItemsResource, JoAiClient, KvResource, LinksResource, LoyaltyResource, McpResource, MeetingsResource, MemoriesResource, MessagesResource, MetricsResource, MissionsResource, NotificationsResource, OfficeResource, OrdersResource, PersonaResource, ProductsResource, ProjectsResource, RemindersResource, ReturnsResource, SegmentsResource, ServicesResource, ShippingResource, ShortcutsResource, SitesResource, SkillsResource, SocialPostsResource, StatsResource, StoreResource, SubscriptionsResource, SwarmsResource, TagsResource, TasksResource, TaxClassesResource, TeamsResource, UpdatesResource, UpgradesResource, UsersResource, VoiceResource, WalletsResource, WarpsResource, WorkspaceResource, assertGuestCheckoutReady, assertGuestPickupSlotReady, buildGuestCheckoutSnapshotRequest, buildGuestOrderReturnUrl, completePortalSession, createClient, createEmptyGuestCheckoutState, createGuestCheckoutSnapshot, createGuestCommerceStorage, formatOpeningHours, formatPickupSlotLabel, getAuthFragmentToken, guestCartAmounts, guestCouponMessageFromErrors, isAllowedRedirectUrl, isGuestCheckoutError, isGuestCouponError, isPortalCallbackUrl, openPortalSession, placeGuestCheckoutOrder, readGuestOrderReturnAccess, revalidateGuestCoupon, sanitizePortalCallbackUrl, stripGuestOrderReturnToken, toGuestCheckoutDraft, validateGuestCoupon };
3659
+ export { AddressesResource, AgentsResource, AlertsResource, ApiTokensResource, AppointmentsResource, AuthResource, AutomationsResource, BillingResource, BlueprintsResource, CachedHttpService, CampaignsResource, CardsResource, CartsResource, ChangelogResource, CharactersResource, CheckoutResource, CommerceResource, ContactsResource, ContentResource, ContractsResource, DeskResource, DistributionResource, DocumentsResource, ElementsResource, EntitiesResource, FlowsResource, FulfillmentsResource, GoalsResource, GuestCheckoutError, GuestCouponError, HooksResource, IngestionsResource, InquiriesResource, IntegrationsResource, IntentsResource, ItemsResource, JoAiClient, KvResource, LinksResource, LoyaltyResource, McpResource, MeetingsResource, MemoriesResource, MessagesResource, MetricsResource, MissionsResource, NotificationsResource, OfficeResource, OrdersResource, PersonaResource, ProductsResource, ProjectsResource, RemindersResource, ReturnsResource, SegmentsResource, ServicesResource, ShippingResource, ShortcutsResource, SitesResource, SkillsResource, SocialPostsResource, StatsResource, StoreResource, SubscriptionsResource, SwarmsResource, TagsResource, TasksResource, TaxClassesResource, TeamsResource, UpdatesResource, UpgradesResource, UsersResource, VoiceResource, WalletsResource, WarpsResource, WorkspaceResource, assertGuestCheckoutReady, assertGuestPickupSlotReady, buildGuestCheckoutSnapshotRequest, buildGuestOrderReturnUrl, completePortalSession, createClient, createEmptyGuestCheckoutState, createGuestCheckoutSnapshot, createGuestCommerceStorage, createRecentlyViewedStorage, formatOpeningHours, formatPickupSlotLabel, getAuthFragmentToken, getRecentlyViewedSlugs, guestCartAmounts, guestCouponMessageFromErrors, isAllowedRedirectUrl, isGuestCheckoutError, isGuestCouponError, isPortalCallbackUrl, openPortalSession, placeGuestCheckoutOrder, readGuestOrderReturnAccess, revalidateGuestCoupon, sanitizePortalCallbackUrl, stripGuestOrderReturnToken, toGuestCheckoutDraft, trackRecentlyViewed, validateGuestCoupon };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joai/sdk",
3
- "version": "7.0.7",
3
+ "version": "7.0.8",
4
4
  "description": "JoAi public API SDK — build with your AI agents",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -35,11 +35,11 @@
35
35
  "test": "jest --config jest.config.js"
36
36
  },
37
37
  "dependencies": {
38
- "@joai/core": "^4.15.6",
38
+ "@joai/core": "^4.15.7",
39
39
  "@joai/warps": "*"
40
40
  },
41
41
  "peerDependencies": {
42
- "@joai/core": "^4.15.6"
42
+ "@joai/core": "^4.15.7"
43
43
  },
44
44
  "devDependencies": {
45
45
  "tsdown": "^0.21.0",