@koda-plus/medusa-plugin-subiekt-nexo 0.2.0 → 0.2.1

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 (89) hide show
  1. package/.medusa/server/src/admin/index.js +206 -169
  2. package/.medusa/server/src/admin/index.mjs +206 -169
  3. package/.medusa/server/src/api/admin/subiekt/check/route.d.ts +9 -0
  4. package/.medusa/server/src/api/admin/subiekt/documents/route.d.ts +8 -0
  5. package/.medusa/server/src/api/admin/subiekt/helpers.d.ts +23 -0
  6. package/.medusa/server/src/api/admin/subiekt/orders/[id]/documents/route.d.ts +12 -0
  7. package/.medusa/server/src/api/admin/subiekt/orders/[id]/route.d.ts +3 -0
  8. package/.medusa/server/src/api/admin/subiekt/orders/[id]/send/route.d.ts +8 -0
  9. package/.medusa/server/src/api/admin/subiekt/products/release/route.d.ts +9 -0
  10. package/.medusa/server/src/api/admin/subiekt/products/route.d.ts +9 -0
  11. package/.medusa/server/src/api/admin/subiekt/route.d.ts +8 -0
  12. package/.medusa/server/src/api/admin/subiekt/runs/route.d.ts +3 -0
  13. package/.medusa/server/src/api/admin/subiekt/sync/route.d.ts +9 -0
  14. package/.medusa/server/src/api/admin/subiekt/tasks/[id]/retry/route.d.ts +9 -0
  15. package/.medusa/server/src/api/admin/subiekt/tasks/route.d.ts +8 -0
  16. package/.medusa/server/src/api/admin/subiekt/writers/route.d.ts +9 -0
  17. package/.medusa/server/src/api/hooks/subiekt/route.d.ts +11 -0
  18. package/.medusa/server/src/api/middlewares.d.ts +6 -0
  19. package/.medusa/server/src/jobs/subiekt-process-tasks.d.ts +12 -0
  20. package/.medusa/server/src/jobs/subiekt-pull-events.d.ts +12 -0
  21. package/.medusa/server/src/jobs/subiekt-sync-products.d.ts +11 -0
  22. package/.medusa/server/src/jobs/subiekt-sync-stock.d.ts +11 -0
  23. package/.medusa/server/src/modules/subiekt/index.d.ts +113 -0
  24. package/.medusa/server/src/modules/subiekt/lib/backoff.d.ts +23 -0
  25. package/.medusa/server/src/modules/subiekt/lib/bridge-client.d.ts +86 -0
  26. package/.medusa/server/src/modules/subiekt/lib/capabilities.d.ts +24 -0
  27. package/.medusa/server/src/modules/subiekt/lib/constants.d.ts +99 -0
  28. package/.medusa/server/src/modules/subiekt/lib/contract.d.ts +527 -0
  29. package/.medusa/server/src/modules/subiekt/lib/demo.d.ts +95 -0
  30. package/.medusa/server/src/modules/subiekt/lib/diagnostics.d.ts +15 -0
  31. package/.medusa/server/src/modules/subiekt/lib/documents.d.ts +35 -0
  32. package/.medusa/server/src/modules/subiekt/lib/dto.d.ts +81 -0
  33. package/.medusa/server/src/modules/subiekt/lib/guide.d.ts +19 -0
  34. package/.medusa/server/src/modules/subiekt/lib/kit-contract.d.ts +186 -0
  35. package/.medusa/server/src/modules/subiekt/lib/kit-contract.js +144 -0
  36. package/.medusa/server/src/modules/subiekt/lib/kit-guards.d.ts +12 -0
  37. package/.medusa/server/src/modules/subiekt/lib/kit-guards.js +90 -0
  38. package/.medusa/server/src/modules/subiekt/lib/kit-meta.d.ts +8 -0
  39. package/.medusa/server/src/modules/subiekt/lib/kit-meta.js +13 -0
  40. package/.medusa/server/src/modules/subiekt/lib/kit-routes.d.ts +156 -0
  41. package/.medusa/server/src/modules/subiekt/lib/kit-routes.js +409 -0
  42. package/.medusa/server/src/modules/subiekt/lib/nip.d.ts +44 -0
  43. package/.medusa/server/src/modules/subiekt/lib/numbers.d.ts +9 -0
  44. package/.medusa/server/src/modules/subiekt/lib/options.d.ts +128 -0
  45. package/.medusa/server/src/modules/subiekt/lib/order-payload.d.ts +137 -0
  46. package/.medusa/server/src/modules/subiekt/lib/payment.d.ts +54 -0
  47. package/.medusa/server/src/modules/subiekt/lib/products.d.ts +121 -0
  48. package/.medusa/server/src/modules/subiekt/lib/references.d.ts +76 -0
  49. package/.medusa/server/src/modules/subiekt/lib/references.js +10 -8
  50. package/.medusa/server/src/modules/subiekt/lib/signature.d.ts +53 -0
  51. package/.medusa/server/src/modules/subiekt/lib/stock.d.ts +83 -0
  52. package/.medusa/server/src/modules/subiekt/lib/writers.d.ts +29 -0
  53. package/.medusa/server/src/modules/subiekt/migrations/Migration20261004180000.d.ts +9 -0
  54. package/.medusa/server/src/modules/subiekt/migrations/Migration20261006120000.d.ts +11 -0
  55. package/.medusa/server/src/modules/subiekt/models/subiekt-catalog-change.d.ts +36 -0
  56. package/.medusa/server/src/modules/subiekt/models/subiekt-catalog-quarantine.d.ts +17 -0
  57. package/.medusa/server/src/modules/subiekt/models/subiekt-connection.d.ts +25 -0
  58. package/.medusa/server/src/modules/subiekt/models/subiekt-document.d.ts +31 -0
  59. package/.medusa/server/src/modules/subiekt/models/subiekt-sync-run.d.ts +19 -0
  60. package/.medusa/server/src/modules/subiekt/models/subiekt-task.d.ts +39 -0
  61. package/.medusa/server/src/modules/subiekt/models/subiekt-writer.d.ts +17 -0
  62. package/.medusa/server/src/modules/subiekt/service.d.ts +133 -0
  63. package/.medusa/server/src/subscribers/subiekt-fulfillment-created.d.ts +13 -0
  64. package/.medusa/server/src/subscribers/subiekt-order-canceled.d.ts +9 -0
  65. package/.medusa/server/src/subscribers/subiekt-order-placed.d.ts +14 -0
  66. package/.medusa/server/src/subscribers/subiekt-payment-captured.d.ts +11 -0
  67. package/.medusa/server/src/workflows/index.d.ts +20 -0
  68. package/.medusa/server/src/workflows/subiekt/cancel-order-in-subiekt.d.ts +13 -0
  69. package/.medusa/server/src/workflows/subiekt/catalog.d.ts +89 -0
  70. package/.medusa/server/src/workflows/subiekt/check-subiekt-connection.d.ts +8 -0
  71. package/.medusa/server/src/workflows/subiekt/create-subiekt-wz.d.ts +14 -0
  72. package/.medusa/server/src/workflows/subiekt/events.d.ts +30 -0
  73. package/.medusa/server/src/workflows/subiekt/health.d.ts +20 -0
  74. package/.medusa/server/src/workflows/subiekt/issue-subiekt-document.d.ts +23 -0
  75. package/.medusa/server/src/workflows/subiekt/orders.d.ts +70 -0
  76. package/.medusa/server/src/workflows/subiekt/process-subiekt-tasks.d.ts +8 -0
  77. package/.medusa/server/src/workflows/subiekt/pull-subiekt-events.d.ts +8 -0
  78. package/.medusa/server/src/workflows/subiekt/queue.d.ts +34 -0
  79. package/.medusa/server/src/workflows/subiekt/runtime.d.ts +43 -0
  80. package/.medusa/server/src/workflows/subiekt/sales-documents.d.ts +35 -0
  81. package/.medusa/server/src/workflows/subiekt/send-order-to-subiekt.d.ts +45 -0
  82. package/.medusa/server/src/workflows/subiekt/stock-plan.d.ts +17 -0
  83. package/.medusa/server/src/workflows/subiekt/sync-subiekt-products.d.ts +17 -0
  84. package/.medusa/server/src/workflows/subiekt/sync-subiekt-stock.d.ts +23 -0
  85. package/.medusa/server/src/workflows/subiekt/tasks.d.ts +43 -0
  86. package/.medusa/server/src/workflows/subiekt/writers.d.ts +18 -0
  87. package/CHANGELOG.md +16 -0
  88. package/README.md +12 -12
  89. package/package.json +30 -2
@@ -347,26 +347,13 @@ function resolveText(value, lang) {
347
347
  const pl2 = lang.toLowerCase().startsWith("pl");
348
348
  return (pl2 ? value.pl ?? value.en : value.en ?? value.pl) || void 0;
349
349
  }
350
- const PL_GENITIVE = ["stycznia", "lutego", "marca", "kwietnia", "maja", "czerwca", "lipca", "sierpnia", "września", "października", "listopada", "grudnia"];
351
- function monthYear(since, lang) {
352
- const m = /^(\d{4})-(\d{2})$/.exec(since);
353
- if (!m) return since;
354
- const year = Number(m[1]);
355
- const month = Number(m[2]);
356
- if (lang.toLowerCase().startsWith("pl")) return `${PL_GENITIVE[month - 1] ?? m[2]} ${year}`;
357
- try {
358
- return new Intl.DateTimeFormat(lang, { month: "long", year: "numeric", timeZone: "UTC" }).format(new Date(Date.UTC(year, month - 1, 15)));
359
- } catch {
360
- return since;
361
- }
362
- }
363
350
  function referencesFor(list, lang) {
364
351
  return (list ?? []).map((r) => ({
365
352
  name: r.name,
366
- url: r.url,
353
+ url: r.url ?? void 0,
354
+ soon: r.soon,
367
355
  icon: r.icon,
368
356
  description: resolveText(r.description, lang),
369
- since: r.since,
370
357
  metrics: r.metrics.map((m) => ({ label: resolveText(m.label, lang) ?? "", value: m.value })).filter((m) => m.label),
371
358
  links: r.links.map((l) => ({ label: resolveText(l.label, lang) ?? l.url, url: l.url })),
372
359
  review: r.review ? { ...r.review, quote: resolveText(r.review.quote ?? void 0, lang) } : null
@@ -545,6 +532,10 @@ const SubiektOrderWidget = ({ data }) => {
545
532
  adminSdk.defineWidgetConfig({
546
533
  zone: "order.details.side.after"
547
534
  });
535
+ const KIT_META = {
536
+ pkg: "@koda-plus/medusa-plugin-subiekt-nexo",
537
+ version: "0.2.1"
538
+ };
548
539
  const NBSP = " ";
549
540
  const NBHY = "‑";
550
541
  const SHORT = /(^|[\s("„])(oraz|albo|lub|ale|że|bo|czy|gdy|aby|by|więc|jak|na|do|za|ze|we|od|po|to|[aiouwze])[ \t]+/gi;
@@ -676,6 +667,12 @@ function ModeBadge({ color, label, title, children }) {
676
667
  ] })
677
668
  ] });
678
669
  }
670
+ function splitReferences(items) {
671
+ return {
672
+ live: items.filter((r) => !r.soon && typeof r.url === "string" && r.url !== ""),
673
+ soon: items.filter((r) => r.soon === true)
674
+ };
675
+ }
679
676
  const host = (url) => {
680
677
  try {
681
678
  return new URL(url).host.replace(/^www\./, "");
@@ -709,8 +706,9 @@ function meanRating(items) {
709
706
  return { value: Math.round(value * 10) / 10, first: reviews[0] };
710
707
  }
711
708
  function ReferencesBadge({ items, labels }) {
712
- if (items.length === 0) return null;
713
- const mean = meanRating(items);
709
+ const { live, soon } = splitReferences(items);
710
+ if (live.length + soon.length === 0) return null;
711
+ const mean = meanRating(live);
714
712
  return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { children: [
715
713
  /* @__PURE__ */ jsxRuntime.jsx(ui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(
716
714
  "button",
@@ -718,8 +716,11 @@ function ReferencesBadge({ items, labels }) {
718
716
  type: "button",
719
717
  className: "inline-flex h-9 max-w-full items-center gap-x-3 rounded-full border border-ui-border-base bg-ui-bg-component py-1 pl-1.5 pr-3 outline-none transition-fg hover:bg-ui-bg-component-hover focus-visible:shadow-borders-focus",
720
718
  children: [
721
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-center", children: items.slice(0, 3).map((r, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.clx("rounded-md", i > 0 && "-ml-2"), children: /* @__PURE__ */ jsxRuntime.jsx(StoreIcon, { reference: r, size: 24 }) }, r.url)) }),
722
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-small-plus truncate text-ui-fg-base", children: labels.count }),
719
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-center", children: [...live, ...soon].slice(0, 3).map((r, i) => /* @__PURE__ */ jsxRuntime.jsx("span", { className: ui.clx("rounded-md", i > 0 && "-ml-2", r.soon && "opacity-50"), children: /* @__PURE__ */ jsxRuntime.jsx(StoreIcon, { reference: r, size: 24 }) }, r.url ?? r.name)) }),
720
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-x-1.5", children: [
721
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-small-plus truncate text-ui-fg-base", children: labels.count(live.length, soon.length) }),
722
+ live.length > 0 && soon.length > 0 ? /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-small shrink-0 text-ui-fg-muted", children: labels.soonMore(soon.length) }) : null
723
+ ] }),
723
724
  mean ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex shrink-0 items-center gap-x-2 border-l border-ui-border-base pl-3", children: [
724
725
  /* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: mean.value, size: 13 }),
725
726
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-small-plus tabular-nums text-ui-fg-base", children: labels.rating(mean.value) }),
@@ -734,52 +735,61 @@ function ReferencesBadge({ items, labels }) {
734
735
  /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "text-ui-fg-base", children: labels.title }),
735
736
  /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: labels.subtitle })
736
737
  ] }),
737
- /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex max-h-[60vh] flex-col divide-y divide-ui-border-base overflow-y-auto", children: items.map((r) => {
738
- var _a, _b;
739
- return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex flex-col gap-y-2 px-4 py-3", children: [
740
- /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.url, target: "_blank", rel: "noreferrer", className: "group flex items-center gap-x-3", children: [
741
- /* @__PURE__ */ jsxRuntime.jsx(StoreIcon, { reference: r, size: 32 }),
742
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
743
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
744
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "truncate text-ui-fg-interactive group-hover:text-ui-fg-interactive-hover", children: host(r.url) })
738
+ /* @__PURE__ */ jsxRuntime.jsxs("ul", { className: "flex max-h-[60vh] flex-col divide-y divide-ui-border-base overflow-y-auto", children: [
739
+ live.map((r) => {
740
+ var _a, _b;
741
+ return /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex flex-col gap-y-2 px-4 py-3", children: [
742
+ /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.url, target: "_blank", rel: "noreferrer", className: "group flex items-center gap-x-3", children: [
743
+ /* @__PURE__ */ jsxRuntime.jsx(StoreIcon, { reference: r, size: 32 }),
744
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
745
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
746
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "truncate text-ui-fg-interactive group-hover:text-ui-fg-interactive-hover", children: host(r.url) })
747
+ ] }),
748
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "ml-auto shrink-0 text-ui-fg-muted group-hover:text-ui-fg-interactive" })
745
749
  ] }),
746
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "ml-auto shrink-0 text-ui-fg-muted group-hover:text-ui-fg-interactive" })
747
- ] }),
748
- r.review ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
749
- /* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: r.review.rating, scale: r.review.scale }),
750
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-xsmall-plus tabular-nums text-ui-fg-base", children: labels.rating(r.review.rating / (r.review.scale || 5) * 5) }),
751
- /* @__PURE__ */ jsxRuntime.jsx(SourceMark, { review: r.review }),
752
- r.review.url ? /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.review.url, target: "_blank", rel: "noreferrer", className: "txt-compact-xsmall-plus inline-flex items-center gap-x-0.5 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
753
- labels.review,
754
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "h-3.5 w-3.5" })
755
- ] }) : null
756
- ] }) : null,
757
- ((_a = r.review) == null ? void 0 : _a.quote) ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "xsmall", className: "border-l-2 border-ui-border-strong pl-2 italic text-ui-fg-subtle", children: [
758
- nb(r.review.quote),
759
- r.review.author ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "not-italic text-ui-fg-muted", children: [
760
- " ",
761
- r.review.author
762
- ] }) : null
763
- ] }) : null,
764
- r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: nb(r.description) }) : null,
765
- ((_b = r.metrics) == null ? void 0 : _b.length) || r.since ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-1.5", children: [
766
- (r.metrics ?? []).map((m) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Badge, { size: "2xsmall", color: "green", children: [
750
+ r.review ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
751
+ /* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: r.review.rating, scale: r.review.scale }),
752
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-xsmall-plus tabular-nums text-ui-fg-base", children: labels.rating(r.review.rating / (r.review.scale || 5) * 5) }),
753
+ /* @__PURE__ */ jsxRuntime.jsx(SourceMark, { review: r.review }),
754
+ r.review.url ? /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.review.url, target: "_blank", rel: "noreferrer", className: "txt-compact-xsmall-plus inline-flex items-center gap-x-0.5 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
755
+ labels.review,
756
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "h-3.5 w-3.5" })
757
+ ] }) : null
758
+ ] }) : null,
759
+ ((_a = r.review) == null ? void 0 : _a.quote) ? /* @__PURE__ */ jsxRuntime.jsxs(ui.Text, { size: "xsmall", className: "border-l-2 border-ui-border-strong pl-2 italic text-ui-fg-subtle", children: [
760
+ nb(r.review.quote),
761
+ r.review.author ? /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "not-italic text-ui-fg-muted", children: [
762
+ " ",
763
+ r.review.author
764
+ ] }) : null
765
+ ] }) : null,
766
+ r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: nb(r.description) }) : null,
767
+ ((_b = r.metrics) == null ? void 0 : _b.length) ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-1.5", children: (r.metrics ?? []).map((m) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Badge, { size: "2xsmall", color: "green", children: [
767
768
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: m.value }),
768
769
  " ",
769
770
  m.label
770
- ] }, m.label)),
771
- r.since ? /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: labels.since(r.since) }) : null
772
- ] }) : null,
773
- (r.links ?? []).length ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-x-3 gap-y-1", children: (r.links ?? []).map((l) => /* @__PURE__ */ jsxRuntime.jsxs("a", { href: l.url, target: "_blank", rel: "noreferrer", className: "txt-compact-xsmall-plus inline-flex items-center gap-x-0.5 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
774
- l.label,
775
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "h-3.5 w-3.5" })
776
- ] }, l.url)) }) : null
777
- ] }, r.url);
778
- }) })
771
+ ] }, m.label)) }) : null,
772
+ (r.links ?? []).length ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap gap-x-3 gap-y-1", children: (r.links ?? []).map((l) => /* @__PURE__ */ jsxRuntime.jsxs("a", { href: l.url, target: "_blank", rel: "noreferrer", className: "txt-compact-xsmall-plus inline-flex items-center gap-x-0.5 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
773
+ l.label,
774
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "h-3.5 w-3.5" })
775
+ ] }, l.url)) }) : null
776
+ ] }, r.url ?? r.name);
777
+ }),
778
+ soon.map((r) => /* @__PURE__ */ jsxRuntime.jsxs("li", { className: "flex flex-col gap-y-2 px-4 py-3", children: [
779
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
780
+ /* @__PURE__ */ jsxRuntime.jsx(StoreIcon, { reference: r, size: 32 }),
781
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-x-2", children: [
782
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
783
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "blue", className: "shrink-0", children: labels.soon })
784
+ ] })
785
+ ] }),
786
+ r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "text-ui-fg-subtle", children: nb(r.description) }) : null
787
+ ] }, r.url ?? r.name))
788
+ ] })
779
789
  ] })
780
790
  ] });
781
791
  }
782
- const KODA_DISCORD = "https://discord.gg/WzUUKYzu8";
792
+ const KODA_DISCORD = "https://koda.plus/discord";
783
793
  const KODA_EMAIL = "hello@koda.plus";
784
794
  const KODA_DEMO = "https://medusa.koda.plus";
785
795
  const plain = (text) => text.split(NBSP).join(" ");
@@ -887,8 +897,13 @@ function envNames(code) {
887
897
  for (const m of code.matchAll(/^([A-Z][A-Z0-9_]*)=/gm)) names.add(m[1]);
888
898
  return [...names];
889
899
  }
900
+ function pinnedPackage(spec) {
901
+ const version = spec.version ?? (spec.pkg === KIT_META.pkg ? KIT_META.version : null);
902
+ return version && /^\d+\.\d+\.\d+(-[0-9A-Za-z.-]+)?$/.test(version) ? `${spec.pkg}@${version}` : spec.pkg;
903
+ }
890
904
  function buildSetupPrompt(spec, lang) {
891
905
  const code = (text) => "`" + text + "`";
906
+ const pinned = pinnedPackage(spec);
892
907
  const env = envNames(`${spec.config}
893
908
  ${spec.demo}`).map(code).join(", ");
894
909
  const needs = spec.needs.map((n) => `- ${plain(n)}`);
@@ -909,16 +924,16 @@ ${spec.demo}`).map(code).join(", ");
909
924
  "",
910
925
  "## Kroki",
911
926
  "1. Zanim cokolwiek zmienisz, sprawdź projekt: Medusa 2.12 albo nowsza (tego wymagają strony i tłumaczenia panelu we wtyczce), menedżer pakietów projektu i medusa-config.ts. Jeśli coś blokuje instalację, zatrzymaj się i napisz mi, co.",
912
- `2. Zainstaluj wtyczkę menedżerem pakietów projektu, na przykład ${code(`npm install ${spec.pkg}`)}. Jeśli rejestr jej nie znajduje, zatrzymaj się i daj mi znać: dostęp daje Koda Plus (${KODA_EMAIL}, Discord ${KODA_DISCORD}).`,
927
+ `2. Zainstaluj wtyczkę w tej wersji menedżerem pakietów projektu, na przykład ${code(`npm install ${pinned}`)}. Potem sprawdź pochodzenie paczki: ${code(`npm view ${spec.pkg} dist-tags.latest`)} i ${code("npm audit signatures")}. Jeśli rejestr jej nie znajduje albo podpisy się nie zgadzają, zatrzymaj się i daj mi znać: pomaga Koda Plus (${KODA_EMAIL}, Discord ${KODA_DISCORD}).`,
913
928
  "3. Zarejestruj wtyczkę w medusa-config.ts, nie ruszając tego, co już tam jest. Użyj konfiguracji z Przewodnika wdrożenia:",
914
929
  "",
915
930
  ...config2,
916
931
  "",
917
- `4. Dodaj do opcji przełącznik trybu demo, tak jak w sklepie demo: ${code(spec.demo)}. Dopóki kluczy nie ma w .env, moduł pracuje na przykładowych danych i nie łączy się z ${service}.`,
932
+ `4. Dodaj do opcji przełącznik trybu demo, tak jak w sklepie demo: ${code(spec.demo)}. Tryb demo działa tylko po jawnym włączeniu: wtedy moduł pracuje na przykładowych danych i nie łączy się z ${service}; bez niego i bez kluczy mówi „nieskonfigurowane” i nic nie robi.`,
918
933
  `5. Wpisz zmienne do .env i do środowiska hostingu, nigdy do kodu ani do gita: ${env}. Jeśli nie podałem Ci wartości, zostaw ją pustą i wypisz mi ją na końcu.`,
919
- `6. Uruchom migracje bazy (${code("npx medusa db:migrate")}), potem sklep, i otwórz ${spec.route} w panelu admina. Sprawdź, czy Panel, Przewodnik wdrożenia i Ustawienia otwierają się bez błędów w konsoli przeglądarki i w logu serwera.`,
920
- `7. Nie włączaj żadnego zapisu, czyli niczego, co zmienia dane w ${service} albo w sklepie. Każdy zapis uzbraja człowiek w Ustawieniach, po próbie na sucho; opcje tylko na to pozwalają.`,
921
- `8. Dopisz sekcję o tej integracji do notatek projektu dla agentów AI (CLAUDE.md albo AGENTS.md, zależnie od tego, czego używa projekt; jeśli nie ma żadnego, załóż CLAUDE.md): pakiet i jego wersja, gdzie są jego opcje w medusa-config.ts, zmienne środowiskowe, przełącznik demo, to, że zapisy uzbraja człowiek w Ustawieniach, że wdrożenie krok po kroku jest w panelu w Przewodniku wdrożenia, że pomoc jest na Discordzie (${KODA_DISCORD}) i że wtyczka zmienia się aktualizacją pakietu, nigdy edycją node_modules.`,
934
+ spec.migrations === false ? `6. Uruchom sklep i otwórz ${spec.route} w panelu admina (ta wtyczka nie ma własnych tabel, migracje nie są potrzebne). Sprawdź, czy Panel, Przewodnik wdrożenia i Ustawienia otwierają się bez błędów w konsoli przeglądarki i w logu serwera.` : `6. Uruchom migracje bazy (${code("npx medusa db:migrate")}), potem sklep, i otwórz ${spec.route} w panelu admina. Sprawdź, czy Panel, Przewodnik wdrożenia i Ustawienia otwierają się bez błędów w konsoli przeglądarki i w logu serwera.`,
935
+ spec.readOnly ? `7. Ta integracja tylko czyta z ${service}: nie ma zapisów do uzbrajania. Użyj klucza tylko do odczytu, jeśli ${service} go oferuje.` : `7. Nie włączaj żadnego zapisu, czyli niczego, co zmienia dane w ${service} albo w sklepie. Każdy zapis uzbraja człowiek w Ustawieniach, po próbie na sucho; opcje tylko na to pozwalają.`,
936
+ `8. Zaproponuj sekcję o tej integracji do notatek projektu dla agentów AI (CLAUDE.md albo AGENTS.md, zależnie od tego, czego używa projekt; jeśli nie ma żadnego, zaproponuj CLAUDE.md) i pokaż mi jej treść, zanim ją zapiszesz: pakiet i jego wersja, gdzie są jego opcje w medusa-config.ts, zmienne środowiskowe, przełącznik demo, to, że zapisy uzbraja człowiek w Ustawieniach, że wdrożenie krok po kroku jest w panelu w Przewodniku wdrożenia, że pomoc jest na Discordzie (${KODA_DISCORD}) i że wtyczka zmienia się aktualizacją pakietu, nigdy edycją node_modules.`,
922
937
  "",
923
938
  "Na koniec napisz mi, co zmieniłeś i co zostało po mojej stronie: konta i klucze, pierwsze połączenie w Ustawieniach i uzbrojenie zapisów."
924
939
  ].join("\n");
@@ -936,16 +951,16 @@ ${spec.demo}`).map(code).join(", ");
936
951
  "",
937
952
  "## Steps",
938
953
  "1. Before you change anything, check the project: Medusa 2.12 or newer (the plugin's admin pages and translations need it), the project's package manager and medusa-config.ts. If something blocks the install, stop and tell me what.",
939
- `2. Install the plugin with the project's package manager, for example ${code(`npm install ${spec.pkg}`)}. If the registry cannot find it, stop and tell me: Koda Plus gives access (${KODA_EMAIL}, Discord ${KODA_DISCORD}).`,
954
+ `2. Install this version of the plugin with the project's package manager, for example ${code(`npm install ${pinned}`)}. Then check where the package comes from: ${code(`npm view ${spec.pkg} dist-tags.latest`)} and ${code("npm audit signatures")}. If the registry cannot find it or the signatures do not verify, stop and tell me: Koda Plus helps (${KODA_EMAIL}, Discord ${KODA_DISCORD}).`,
940
955
  "3. Register the plugin in medusa-config.ts without touching what is already there. Use the setup from the Setup guide:",
941
956
  "",
942
957
  ...config2,
943
958
  "",
944
- `4. Add the demo switch to the options, as the demo store has it: ${code(spec.demo)}. Until the keys are in .env, the module works on sample data and never calls ${service}.`,
959
+ `4. Add the demo switch to the options, as the demo store has it: ${code(spec.demo)}. Demo mode runs only when switched on: then the module works on sample data and never calls ${service}; without it and without keys it says "Not configured" and does nothing.`,
945
960
  `5. Put the variables in .env and in the hosting's environment, never in code or in git: ${env}. If I did not give you a value, leave it empty and list it for me at the end.`,
946
- `6. Run the database migrations (${code("npx medusa db:migrate")}), then the store, and open ${spec.route} in the admin. Check that the Panel, the Setup guide and Settings open with no errors in the browser console or the server log.`,
947
- `7. Do not turn on any writer, that is anything that changes data in ${service} or in the store. A person arms each writer in Settings, after a dry run; the options only allow it.`,
948
- `8. Add a section about this integration to the project's notes for AI agents (CLAUDE.md or AGENTS.md, whichever the project uses; if neither exists, create CLAUDE.md): the package and its version, where its options sit in medusa-config.ts, the environment variables, the demo switch, that a person arms writers in Settings, that the step by step setup is in the admin under Setup guide, that help is on Discord (${KODA_DISCORD}), and that the plugin changes through package updates, never through edits in node_modules.`,
961
+ spec.migrations === false ? `6. Start the store and open ${spec.route} in the admin (this plugin has no tables of its own, no migrations needed). Check that the Panel, the Setup guide and Settings open with no errors in the browser console or the server log.` : `6. Run the database migrations (${code("npx medusa db:migrate")}), then the store, and open ${spec.route} in the admin. Check that the Panel, the Setup guide and Settings open with no errors in the browser console or the server log.`,
962
+ spec.readOnly ? `7. This integration only reads from ${service}: there are no writers to arm. Use a read-only key if ${service} offers one.` : `7. Do not turn on any writer, that is anything that changes data in ${service} or in the store. A person arms each writer in Settings, after a dry run; the options only allow it.`,
963
+ `8. Propose a section about this integration for the project's notes for AI agents (CLAUDE.md or AGENTS.md, whichever the project uses; if neither exists, propose CLAUDE.md) and show me its text before you save it: the package and its version, where its options sit in medusa-config.ts, the environment variables, the demo switch, that a person arms writers in Settings, that the step by step setup is in the admin under Setup guide, that help is on Discord (${KODA_DISCORD}), and that the plugin changes through package updates, never through edits in node_modules.`,
949
964
  "",
950
965
  "When you are done, tell me what you changed and what is left for me: accounts and keys, the first connection in Settings and arming the writers."
951
966
  ].join("\n");
@@ -962,7 +977,7 @@ function PromptButton({ spec, lang, labels }) {
962
977
  }
963
978
  };
964
979
  return /* @__PURE__ */ jsxRuntime.jsxs(ui.Popover, { children: [
965
- /* @__PURE__ */ jsxRuntime.jsx(ui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { size: "small", variant: "secondary", onClick: () => void copy(), children: [
980
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Popover.Trigger, { asChild: true, children: /* @__PURE__ */ jsxRuntime.jsxs(ui.Button, { size: "small", variant: "secondary", onClick: () => setState("idle"), children: [
966
981
  /* @__PURE__ */ jsxRuntime.jsx(icons.Sparkles, {}),
967
982
  labels.button
968
983
  ] }) }),
@@ -1046,54 +1061,67 @@ function SettingsView({
1046
1061
  children
1047
1062
  ] });
1048
1063
  }
1049
- function References({ items, title, subtitle, openLabel, sinceLabel, reviewLabel, ratingLabel }) {
1050
- if (items.length === 0) return null;
1064
+ function CardIcon({ reference }) {
1065
+ return reference.icon ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: reference.icon, alt: "", width: 36, height: 36, className: "h-9 w-9 shrink-0 rounded-md bg-white object-contain shadow-borders-base" }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-medium-plus flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-ui-bg-base text-ui-fg-base shadow-borders-base", children: reference.name.slice(0, 1).toUpperCase() });
1066
+ }
1067
+ function References({ items, title, subtitle, openLabel, soonLabel, reviewLabel, ratingLabel }) {
1068
+ const { live, soon } = splitReferences(items);
1069
+ if (live.length + soon.length === 0) return null;
1051
1070
  return /* @__PURE__ */ jsxRuntime.jsxs(ui.Container, { className: "divide-y p-0", children: [
1052
1071
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-1 px-6 py-4", children: [
1053
1072
  /* @__PURE__ */ jsxRuntime.jsx(ui.Heading, { level: "h2", children: title }),
1054
1073
  /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: subtitle })
1055
1074
  ] }),
1056
- /* @__PURE__ */ jsxRuntime.jsx("div", { className: "grid grid-cols-1 gap-3 px-6 py-4 md:grid-cols-2 xl:grid-cols-3", children: items.map((r) => {
1057
- var _a;
1058
- return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3 rounded-lg border border-ui-border-base bg-ui-bg-component px-4 py-3", children: [
1059
- /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.url, target: "_blank", rel: "noreferrer", className: "group flex items-center gap-x-3", children: [
1060
- r.icon ? /* @__PURE__ */ jsxRuntime.jsx("img", { src: r.icon, alt: "", width: 36, height: 36, className: "h-9 w-9 shrink-0 rounded-md bg-white object-contain shadow-borders-base" }) : /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-medium-plus flex h-9 w-9 shrink-0 items-center justify-center rounded-md bg-ui-bg-base text-ui-fg-base shadow-borders-base", children: r.name.slice(0, 1).toUpperCase() }),
1061
- /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
1062
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
1063
- /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "truncate text-ui-fg-interactive group-hover:text-ui-fg-interactive-hover", children: host(r.url) })
1075
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "grid grid-cols-1 gap-3 px-6 py-4 md:grid-cols-2 xl:grid-cols-3", children: [
1076
+ live.map((r) => {
1077
+ var _a;
1078
+ return /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3 rounded-lg border border-ui-border-base bg-ui-bg-component px-4 py-3", children: [
1079
+ /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.url, target: "_blank", rel: "noreferrer", className: "group flex items-center gap-x-3", children: [
1080
+ /* @__PURE__ */ jsxRuntime.jsx(CardIcon, { reference: r }),
1081
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 flex-col", children: [
1082
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
1083
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "xsmall", className: "truncate text-ui-fg-interactive group-hover:text-ui-fg-interactive-hover", children: host(r.url) })
1084
+ ] }),
1085
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "ml-auto shrink-0 text-ui-fg-muted group-hover:text-ui-fg-interactive" })
1064
1086
  ] }),
1065
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "ml-auto shrink-0 text-ui-fg-muted group-hover:text-ui-fg-interactive" })
1066
- ] }),
1067
- r.review ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
1068
- /* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: r.review.rating, scale: r.review.scale }),
1069
- /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-xsmall-plus tabular-nums text-ui-fg-base", children: (ratingLabel ?? ((v) => v.toFixed(1)))(r.review.rating / (r.review.scale || 5) * 5) }),
1070
- /* @__PURE__ */ jsxRuntime.jsx(SourceMark, { review: r.review }),
1071
- r.review.url && reviewLabel ? /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.review.url, target: "_blank", rel: "noreferrer", className: "txt-compact-xsmall-plus inline-flex items-center gap-x-0.5 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
1072
- reviewLabel,
1073
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "h-3.5 w-3.5" })
1074
- ] }) : null
1075
- ] }) : null,
1076
- r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: nb(r.description) }) : null,
1077
- ((_a = r.metrics) == null ? void 0 : _a.length) || r.since ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-2", children: [
1078
- (r.metrics ?? []).map((m) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Badge, { size: "2xsmall", color: "green", children: [
1087
+ r.review ? /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1", children: [
1088
+ /* @__PURE__ */ jsxRuntime.jsx(Stars, { rating: r.review.rating, scale: r.review.scale }),
1089
+ /* @__PURE__ */ jsxRuntime.jsx("span", { className: "txt-compact-xsmall-plus tabular-nums text-ui-fg-base", children: (ratingLabel ?? ((v) => v.toFixed(1)))(r.review.rating / (r.review.scale || 5) * 5) }),
1090
+ /* @__PURE__ */ jsxRuntime.jsx(SourceMark, { review: r.review }),
1091
+ r.review.url && reviewLabel ? /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.review.url, target: "_blank", rel: "noreferrer", className: "txt-compact-xsmall-plus inline-flex items-center gap-x-0.5 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
1092
+ reviewLabel,
1093
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "h-3.5 w-3.5" })
1094
+ ] }) : null
1095
+ ] }) : null,
1096
+ r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: nb(r.description) }) : null,
1097
+ ((_a = r.metrics) == null ? void 0 : _a.length) ? /* @__PURE__ */ jsxRuntime.jsx("div", { className: "flex flex-wrap items-center gap-2", children: (r.metrics ?? []).map((m) => /* @__PURE__ */ jsxRuntime.jsxs(ui.Badge, { size: "2xsmall", color: "green", children: [
1079
1098
  /* @__PURE__ */ jsxRuntime.jsx("span", { className: "tabular-nums", children: m.value }),
1080
1099
  " ",
1081
1100
  m.label
1082
- ] }, m.label)),
1083
- r.since ? /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "grey", children: sinceLabel(r.since) }) : null
1084
- ] }) : null,
1085
- /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-auto flex flex-col gap-y-1 border-t border-ui-border-base pt-2", children: [
1086
- (r.links ?? []).map((l) => /* @__PURE__ */ jsxRuntime.jsxs("a", { href: l.url, target: "_blank", rel: "noreferrer", className: "txt-compact-small inline-flex w-fit items-center gap-x-1 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
1087
- l.label,
1088
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "shrink-0" })
1089
- ] }, l.url)),
1090
- /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.url, target: "_blank", rel: "noreferrer", className: "txt-compact-small-plus inline-flex w-fit items-center gap-x-1 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
1091
- openLabel,
1092
- /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "shrink-0" })
1101
+ ] }, m.label)) }) : null,
1102
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "mt-auto flex flex-col gap-y-1 border-t border-ui-border-base pt-2", children: [
1103
+ (r.links ?? []).map((l) => /* @__PURE__ */ jsxRuntime.jsxs("a", { href: l.url, target: "_blank", rel: "noreferrer", className: "txt-compact-small inline-flex w-fit items-center gap-x-1 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
1104
+ l.label,
1105
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "shrink-0" })
1106
+ ] }, l.url)),
1107
+ /* @__PURE__ */ jsxRuntime.jsxs("a", { href: r.url, target: "_blank", rel: "noreferrer", className: "txt-compact-small-plus inline-flex w-fit items-center gap-x-1 text-ui-fg-interactive hover:text-ui-fg-interactive-hover", children: [
1108
+ openLabel,
1109
+ /* @__PURE__ */ jsxRuntime.jsx(icons.ArrowUpRightOnBox, { className: "shrink-0" })
1110
+ ] })
1093
1111
  ] })
1094
- ] })
1095
- ] }, r.url);
1096
- }) })
1112
+ ] }, r.url ?? r.name);
1113
+ }),
1114
+ soon.map((r) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-y-3 rounded-lg border border-ui-border-base bg-ui-bg-component px-4 py-3", children: [
1115
+ /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex items-center gap-x-3", children: [
1116
+ /* @__PURE__ */ jsxRuntime.jsx(CardIcon, { reference: r }),
1117
+ /* @__PURE__ */ jsxRuntime.jsxs("span", { className: "flex min-w-0 items-center gap-x-2", children: [
1118
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", weight: "plus", className: "truncate text-ui-fg-base", children: r.name }),
1119
+ /* @__PURE__ */ jsxRuntime.jsx(ui.Badge, { size: "2xsmall", color: "blue", className: "shrink-0", children: soonLabel })
1120
+ ] })
1121
+ ] }),
1122
+ r.description ? /* @__PURE__ */ jsxRuntime.jsx(ui.Text, { size: "small", className: "text-ui-fg-subtle", children: nb(r.description) }) : null
1123
+ ] }, r.url ?? r.name))
1124
+ ] })
1097
1125
  ] });
1098
1126
  }
1099
1127
  function GuideIntro({ title, text, time, needs, needsLabel, timeLabel }) {
@@ -1376,7 +1404,7 @@ function usePromptSpec() {
1376
1404
  needs: Array.isArray(needs) ? needs : [],
1377
1405
  config: `// medusa-config.ts, in plugins: [ ... ]
1378
1406
  ${MEDUSA_CODE}`,
1379
- demo: 'demo: process.env.SUBIEKT_DEMO === "true" || !process.env.SUBIEKT_BRIDGE_URL,'
1407
+ demo: 'demo: process.env.SUBIEKT_DEMO === "true",'
1380
1408
  };
1381
1409
  }, [t]);
1382
1410
  }
@@ -1473,7 +1501,7 @@ function GuideView({ status, lang }) {
1473
1501
  title: t("references.title"),
1474
1502
  subtitle: t("references.subtitle"),
1475
1503
  openLabel: t("references.open"),
1476
- sinceLabel: (since) => t("references.since", { date: monthYear(since, lang) }),
1504
+ soonLabel: t("references.soon"),
1477
1505
  reviewLabel: t("references.review"),
1478
1506
  ratingLabel: (value) => fmtRating(value, lang)
1479
1507
  }
@@ -1930,12 +1958,13 @@ function Header({
1930
1958
  {
1931
1959
  items: references,
1932
1960
  labels: {
1933
- count: references.length === 1 ? t("references.badgeOne") : t("references.badgeMany", { count: references.length }),
1961
+ count: (live, soon) => live > 0 ? live === 1 ? t("references.badgeOne") : t("references.badgeMany", { count: live }) : soon === 1 ? t("references.badgeSoonOne") : t("references.badgeSoonMany", { count: soon }),
1962
+ soonMore: (soon) => t("references.soonMore", { count: soon }),
1963
+ soon: t("references.soon"),
1934
1964
  title: t("references.title"),
1935
1965
  subtitle: t("references.subtitle"),
1936
1966
  open: t("references.open"),
1937
1967
  review: t("references.review"),
1938
- since: (since) => t("references.since", { date: monthYear(since, lang) }),
1939
1968
  rating: (value) => fmtRating(value, lang)
1940
1969
  }
1941
1970
  }
@@ -2229,6 +2258,62 @@ const config = adminSdk.defineRouteConfig({
2229
2258
  label: "Subiekt nexo",
2230
2259
  icon: SubiektIcon
2231
2260
  });
2261
+ const communityEn = {
2262
+ addStore: {
2263
+ button: "Add your store",
2264
+ title: "Does your store run on this integration?",
2265
+ text: "Tell us about it. Once we check it, the store joins this list with a link and its rating.",
2266
+ name: "Store name",
2267
+ url: "Store address",
2268
+ note: "A few words about the setup (optional)",
2269
+ send: "Send the request",
2270
+ copy: "Copy the text",
2271
+ copied: "Request copied, paste it into a mail to hello@koda.plus",
2272
+ hint: "Your mail app opens with the message to {{email}} ready to send.",
2273
+ subject: "A store for {{integration}}",
2274
+ greeting: "Hello, my store runs on {{integration}}. Please add it to the list of stores."
2275
+ },
2276
+ prompt: {
2277
+ button: "Copy prompt",
2278
+ title: "Add this integration to your store",
2279
+ text: "Paste it into Claude Code, Cursor or another AI agent opened in your Medusa project. The agent installs this version of the plugin, sets it up like here and shows you its notes before it saves them.",
2280
+ copy: "Copy",
2281
+ copied: "Prompt copied",
2282
+ failed: "Could not copy. Select the text and copy it by hand."
2283
+ },
2284
+ discord: {
2285
+ button: "Help on Discord",
2286
+ title: "Join the Koda Plus server on Discord"
2287
+ }
2288
+ };
2289
+ const communityPl = {
2290
+ addStore: {
2291
+ button: "Dodaj swój sklep",
2292
+ title: "Twój sklep działa na tej integracji?",
2293
+ text: "Daj nam znać. Po sprawdzeniu dodamy go do tej listy z linkiem i oceną.",
2294
+ name: "Nazwa sklepu",
2295
+ url: "Adres sklepu",
2296
+ note: "Kilka słów o wdrożeniu (opcjonalnie)",
2297
+ send: "Wyślij zgłoszenie",
2298
+ copy: "Kopiuj treść",
2299
+ copied: "Treść skopiowana, wklej ją w mail do hello@koda.plus",
2300
+ hint: "Otworzy się Twoja poczta z gotową wiadomością do {{email}}.",
2301
+ subject: "Zgłoszenie sklepu: {{integration}}",
2302
+ greeting: "Dzień dobry, mój sklep działa na integracji {{integration}}. Proszę o dodanie go do listy sklepów."
2303
+ },
2304
+ prompt: {
2305
+ button: "Kopiuj prompt",
2306
+ title: "Dodaj tę integrację do swojego sklepu",
2307
+ text: "Wklej go w Claude Code, Cursorze albo innym agencie AI otwartym w projekcie Twojej Medusy. Agent zainstaluje tę wersję wtyczki, ustawi ją tak jak tutaj i pokaże Ci notatki, zanim je zapisze.",
2308
+ copy: "Kopiuj",
2309
+ copied: "Prompt skopiowany",
2310
+ failed: "Nie udało się skopiować. Zaznacz tekst i skopiuj go ręcznie."
2311
+ },
2312
+ discord: {
2313
+ button: "Pomoc na Discordzie",
2314
+ title: "Dołącz do serwera Koda Plus na Discordzie"
2315
+ }
2316
+ };
2232
2317
  const en = {
2233
2318
  title: "Subiekt nexo",
2234
2319
  by: "by Koda Plus",
@@ -2595,39 +2680,15 @@ const en = {
2595
2680
  title: "Running in stores built by Koda Plus",
2596
2681
  subtitle: "Live stores implemented by Koda Plus that run on this integration every day.",
2597
2682
  open: "Open the store",
2598
- since: "Since {{date}}",
2599
2683
  badgeOne: "Running in 1 store",
2600
2684
  badgeMany: "Running in {{count}} stores",
2685
+ badgeSoonOne: "Coming to 1 store",
2686
+ badgeSoonMany: "Coming to {{count}} stores",
2687
+ soon: "Soon",
2688
+ soonMore: "+{{count}} soon",
2601
2689
  review: "Read the review"
2602
2690
  },
2603
- community: {
2604
- addStore: {
2605
- button: "Add your store",
2606
- title: "Does your store run on this integration?",
2607
- text: "Tell us about it. Once we check it, the store joins this list with a link and its rating.",
2608
- name: "Store name",
2609
- url: "Store address",
2610
- note: "A few words about the setup (optional)",
2611
- send: "Send the request",
2612
- copy: "Copy the text",
2613
- copied: "Request copied, paste it into a mail to hello@koda.plus",
2614
- hint: "Your mail app opens with the message to {{email}} ready to send.",
2615
- subject: "A store for {{integration}}",
2616
- greeting: "Hello, my store runs on {{integration}}. Please add it to the list of stores."
2617
- },
2618
- prompt: {
2619
- button: "Copy prompt",
2620
- title: "Add this integration to your store",
2621
- text: "Paste it into Claude Code, Cursor or another AI agent opened in your Medusa project. The agent installs the plugin, sets it up like here and leaves notes for further work.",
2622
- copy: "Copy again",
2623
- copied: "Prompt copied",
2624
- failed: "Could not copy. Select the text and copy it by hand."
2625
- },
2626
- discord: {
2627
- button: "Help on Discord",
2628
- title: "Join the Koda Plus server on Discord"
2629
- }
2630
- },
2691
+ community: communityEn,
2631
2692
  guide: {
2632
2693
  intro: {
2633
2694
  title: "Connect Medusa to Subiekt nexo PRO",
@@ -3251,39 +3312,15 @@ const pl$1 = {
3251
3312
  title: "Działa w sklepach wdrożonych przez Koda Plus",
3252
3313
  subtitle: "Prawdziwe sklepy z wdrożeniem Koda Plus, które pracują na tej integracji na co dzień.",
3253
3314
  open: "Otwórz sklep",
3254
- since: "Od {{date}}",
3255
3315
  badgeOne: "Działa w 1 sklepie",
3256
3316
  badgeMany: "Działa w {{count}} sklepach",
3317
+ badgeSoonOne: "Wkrótce w 1 sklepie",
3318
+ badgeSoonMany: "Wkrótce w {{count}} sklepach",
3319
+ soon: "Wkrótce",
3320
+ soonMore: "+{{count}} wkrótce",
3257
3321
  review: "Zobacz opinię"
3258
3322
  },
3259
- community: {
3260
- addStore: {
3261
- button: "Dodaj swój sklep",
3262
- title: "Twój sklep działa na tej integracji?",
3263
- text: "Daj nam znać. Po sprawdzeniu dodamy go do tej listy z linkiem i oceną.",
3264
- name: "Nazwa sklepu",
3265
- url: "Adres sklepu",
3266
- note: "Kilka słów o wdrożeniu (opcjonalnie)",
3267
- send: "Wyślij zgłoszenie",
3268
- copy: "Kopiuj treść",
3269
- copied: "Treść skopiowana, wklej ją w mail do hello@koda.plus",
3270
- hint: "Otworzy się Twoja poczta z gotową wiadomością do {{email}}.",
3271
- subject: "Zgłoszenie sklepu: {{integration}}",
3272
- greeting: "Dzień dobry, mój sklep działa na integracji {{integration}}. Proszę o dodanie go do listy sklepów."
3273
- },
3274
- prompt: {
3275
- button: "Kopiuj prompt",
3276
- title: "Dodaj tę integrację do swojego sklepu",
3277
- text: "Wklej go w Claude Code, Cursorze albo innym agencie AI otwartym w projekcie Twojej Medusy. Agent zainstaluje wtyczkę, ustawi ją tak jak tutaj i zostawi notatki do dalszej pracy.",
3278
- copy: "Kopiuj jeszcze raz",
3279
- copied: "Prompt skopiowany",
3280
- failed: "Nie udało się skopiować. Zaznacz tekst i skopiuj go ręcznie."
3281
- },
3282
- discord: {
3283
- button: "Pomoc na Discordzie",
3284
- title: "Dołącz do serwera Koda Plus na Discordzie"
3285
- }
3286
- },
3323
+ community: communityPl,
3287
3324
  guide: {
3288
3325
  intro: {
3289
3326
  title: "Połącz Medusę z Subiektem nexo PRO",