agentmall 0.1.17 → 0.1.18

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/cli.js CHANGED
@@ -405,6 +405,71 @@ var FAILURE_MESSAGES = {
405
405
  function formatCents(cents) {
406
406
  return `$${(cents / 100).toFixed(2)}`;
407
407
  }
408
+ function compactTrackingValue(value) {
409
+ if (typeof value === "string") {
410
+ const trimmed = value.trim();
411
+ return trimmed || null;
412
+ }
413
+ if (typeof value === "number" || typeof value === "boolean") {
414
+ return String(value);
415
+ }
416
+ return null;
417
+ }
418
+ function normalizeTrackingCarrier(carrier, trackingNumber) {
419
+ const carrierValue = carrier?.trim().toLowerCase() ?? null;
420
+ const trackingValue = trackingNumber?.trim().toUpperCase() ?? null;
421
+ if ((carrierValue === "znlogic" || carrierValue === "amazon logistics") && trackingValue?.startsWith("TBA")) {
422
+ return "amazon";
423
+ }
424
+ return carrierValue;
425
+ }
426
+ function trackingUrlForCarrier(carrier, trackingNumber) {
427
+ if (!trackingNumber) return null;
428
+ switch (normalizeTrackingCarrier(carrier, trackingNumber)) {
429
+ case "ups":
430
+ return `https://www.ups.com/track?tracknum=${encodeURIComponent(trackingNumber)}`;
431
+ case "fedex":
432
+ return `https://www.fedex.com/fedextrack/?trknbr=${encodeURIComponent(trackingNumber)}`;
433
+ case "usps":
434
+ return `https://tools.usps.com/go/TrackConfirmAction?tLabels=${encodeURIComponent(trackingNumber)}`;
435
+ case "amazon":
436
+ return `https://www.amazon.com/progress-tracker/package/?trackingId=${encodeURIComponent(trackingNumber)}`;
437
+ case "dhl":
438
+ return `https://www.dhl.com/us-en/home/tracking.html?tracking-id=${encodeURIComponent(trackingNumber)}`;
439
+ default:
440
+ return null;
441
+ }
442
+ }
443
+ function trackingLines(tracking) {
444
+ const direct = compactTrackingValue(tracking);
445
+ if (direct) return [direct];
446
+ if (Array.isArray(tracking)) {
447
+ return tracking.flatMap((entry) => trackingLines(entry)).filter((line2, index, lines2) => line2 && lines2.indexOf(line2) === index);
448
+ }
449
+ if (!tracking || typeof tracking !== "object") {
450
+ return [];
451
+ }
452
+ const record = tracking;
453
+ const carrierRaw = compactTrackingValue(record.carrier) ?? compactTrackingValue(record.provider) ?? compactTrackingValue(record.shipper);
454
+ const number = compactTrackingValue(record.tracking_number) ?? compactTrackingValue(record.trackingNumber) ?? compactTrackingValue(record.number) ?? compactTrackingValue(record.code);
455
+ const carrier = normalizeTrackingCarrier(carrierRaw, number);
456
+ const url = compactTrackingValue(record.tracking_url) ?? compactTrackingValue(record.trackingUrl) ?? compactTrackingValue(record.url) ?? trackingUrlForCarrier(carrier, number);
457
+ const lines = [];
458
+ if (carrier && number) {
459
+ lines.push(`${carrier}: ${number}`);
460
+ } else if (number) {
461
+ lines.push(number);
462
+ } else if (carrier) {
463
+ lines.push(carrier);
464
+ }
465
+ if (url) lines.push(url);
466
+ for (const nestedKey of ["shipments", "tracking_numbers", "trackingNumbers", "numbers"]) {
467
+ if (nestedKey in record) {
468
+ lines.push(...trackingLines(record[nestedKey]));
469
+ }
470
+ }
471
+ return lines.filter((line2, index, all) => line2 && all.indexOf(line2) === index);
472
+ }
408
473
  function getBudgetBasePrice(product) {
409
474
  return product.price;
410
475
  }
@@ -568,6 +633,13 @@ function displayStatus(purchase) {
568
633
  if (purchase.deliveryMethod) {
569
634
  kv("Shipping", purchase.deliveryMethod);
570
635
  }
636
+ const tracking = trackingLines(purchase.tracking);
637
+ if (tracking.length) {
638
+ kv("Tracking", tracking[0]);
639
+ for (const extra of tracking.slice(1)) {
640
+ kv("", extra, { dim: true });
641
+ }
642
+ }
571
643
  kv("Created", new Date(purchase.createdAt).toLocaleString(), { dim: true });
572
644
  gap();
573
645
  }
@@ -592,7 +664,7 @@ function displayRefund(refund2) {
592
664
  import { input, confirm, select } from "@inquirer/prompts";
593
665
  async function promptProductUrl() {
594
666
  return input({
595
- message: "Product URL",
667
+ message: "Product URL or retailer link",
596
668
  validate: (value) => {
597
669
  try {
598
670
  const url = new URL(value);
@@ -758,6 +830,19 @@ async function getBuyerToken(purchaseId) {
758
830
 
759
831
  // src/cli/index.ts
760
832
  var EMAIL_PATTERN = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
833
+ var SUPPORTED_RETAILER_LABELS = [
834
+ "Amazon",
835
+ "Walmart",
836
+ "Target",
837
+ "Best Buy",
838
+ "Home Depot",
839
+ "eBay",
840
+ "Lowe's",
841
+ "Wayfair",
842
+ "Ace Hardware",
843
+ "1-800-Flowers",
844
+ "Pokemon Center"
845
+ ];
761
846
  function parseTempoBalance(balance) {
762
847
  const parsed = Number.parseFloat(balance ?? "0");
763
848
  return Number.isFinite(parsed) ? parsed : 0;
@@ -939,6 +1024,11 @@ async function buy(urlArg) {
939
1024
  try {
940
1025
  banner();
941
1026
  gap();
1027
+ if (!urlArg) {
1028
+ muted("Paste a product URL from a supported retailer.");
1029
+ muted(`Supported retailers: ${SUPPORTED_RETAILER_LABELS.join(", ")}.`);
1030
+ gap();
1031
+ }
942
1032
  const url = urlArg ?? await promptProductUrl();
943
1033
  const client = new AgentMall();
944
1034
  const product = await spin(
package/dist/index.d.cts CHANGED
@@ -90,6 +90,7 @@ type Purchase = {
90
90
  status: PurchaseLifecycleStatus;
91
91
  items: PurchaseItem[];
92
92
  deliveryMethod?: string;
93
+ tracking?: unknown;
93
94
  maxBudget: number;
94
95
  finalTotal?: number;
95
96
  merchantReferences?: string[];
package/dist/index.d.ts CHANGED
@@ -90,6 +90,7 @@ type Purchase = {
90
90
  status: PurchaseLifecycleStatus;
91
91
  items: PurchaseItem[];
92
92
  deliveryMethod?: string;
93
+ tracking?: unknown;
93
94
  maxBudget: number;
94
95
  finalTotal?: number;
95
96
  merchantReferences?: string[];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "agentmall",
3
- "version": "0.1.17",
3
+ "version": "0.1.18",
4
4
  "description": "SDK and CLI for the AgentMall API — let AI agents buy physical products from US retailers",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",