@burdenoff/microfe-subscriberbot 2026.706.2 → 2026.710.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 (140) hide show
  1. package/dist/generated/global-operations.d.ts +2 -0
  2. package/dist/generated/global-operations.d.ts.map +1 -0
  3. package/dist/generated/global-types.d.ts +23527 -0
  4. package/dist/generated/global-types.d.ts.map +1 -0
  5. package/dist/generated/wspace-operations.d.ts +2 -0
  6. package/dist/generated/wspace-operations.d.ts.map +1 -0
  7. package/dist/generated/wspace-types.d.ts +57851 -0
  8. package/dist/generated/wspace-types.d.ts.map +1 -0
  9. package/dist/index.d.ts +6 -0
  10. package/dist/index.d.ts.map +1 -0
  11. package/dist/index.js +2 -1
  12. package/dist/subscriberbot/SubscriberBotRoot.d.ts +5 -0
  13. package/dist/subscriberbot/SubscriberBotRoot.d.ts.map +1 -0
  14. package/dist/subscriberbot/SubscriberBotRoot.js +56 -40
  15. package/dist/subscriberbot/SubscriberBotRoot.js.map +1 -1
  16. package/dist/subscriberbot/SubscriberBotRoutes.d.ts +4 -0
  17. package/dist/subscriberbot/SubscriberBotRoutes.d.ts.map +1 -0
  18. package/dist/subscriberbot/SubscriberBotRoutes.js +14 -6
  19. package/dist/subscriberbot/SubscriberBotRoutes.js.map +1 -1
  20. package/dist/subscriberbot/components/EmptyState.d.ts +18 -0
  21. package/dist/subscriberbot/components/EmptyState.d.ts.map +1 -0
  22. package/dist/subscriberbot/components/MetricsCard.d.ts +16 -0
  23. package/dist/subscriberbot/components/MetricsCard.d.ts.map +1 -0
  24. package/dist/subscriberbot/components/Modal.d.ts +13 -0
  25. package/dist/subscriberbot/components/Modal.d.ts.map +1 -0
  26. package/dist/subscriberbot/components/PageLayout.d.ts +23 -0
  27. package/dist/subscriberbot/components/PageLayout.d.ts.map +1 -0
  28. package/dist/subscriberbot/components/StateViews.d.ts +24 -0
  29. package/dist/subscriberbot/components/StateViews.d.ts.map +1 -0
  30. package/dist/subscriberbot/components/StatusBadge.d.ts +9 -0
  31. package/dist/subscriberbot/components/StatusBadge.d.ts.map +1 -0
  32. package/dist/subscriberbot/components/index.d.ts +13 -0
  33. package/dist/subscriberbot/components/index.d.ts.map +1 -0
  34. package/dist/subscriberbot/components/index.js +7 -0
  35. package/dist/subscriberbot/components/viz.d.ts +58 -0
  36. package/dist/subscriberbot/components/viz.d.ts.map +1 -0
  37. package/dist/subscriberbot/components/viz.js +196 -0
  38. package/dist/subscriberbot/components/viz.js.map +1 -0
  39. package/dist/subscriberbot/config/assistantUsecases.d.ts +13 -0
  40. package/dist/subscriberbot/config/assistantUsecases.d.ts.map +1 -0
  41. package/dist/subscriberbot/context/SubscriberBotContext.d.ts +16 -0
  42. package/dist/subscriberbot/context/SubscriberBotContext.d.ts.map +1 -0
  43. package/dist/subscriberbot/context/index.d.ts +6 -0
  44. package/dist/subscriberbot/context/index.d.ts.map +1 -0
  45. package/dist/subscriberbot/hooks/index.d.ts +7 -0
  46. package/dist/subscriberbot/hooks/index.d.ts.map +1 -0
  47. package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts +105 -0
  48. package/dist/subscriberbot/hooks/useSubscriberBotApi.d.ts.map +1 -0
  49. package/dist/subscriberbot/hooks/useSubscriberBotApi.js +38 -30
  50. package/dist/subscriberbot/hooks/useSubscriberBotApi.js.map +1 -1
  51. package/dist/subscriberbot/index.d.ts +12 -0
  52. package/dist/subscriberbot/index.d.ts.map +1 -0
  53. package/dist/subscriberbot/index.js +1 -0
  54. package/dist/subscriberbot/pages/AssetVaultPage.d.ts +4 -0
  55. package/dist/subscriberbot/pages/AssetVaultPage.d.ts.map +1 -0
  56. package/dist/subscriberbot/pages/AssetVaultPage.js +182 -0
  57. package/dist/subscriberbot/pages/AssetVaultPage.js.map +1 -0
  58. package/dist/subscriberbot/pages/DashboardPage.d.ts +12 -0
  59. package/dist/subscriberbot/pages/DashboardPage.d.ts.map +1 -0
  60. package/dist/subscriberbot/pages/DashboardPage.js +272 -199
  61. package/dist/subscriberbot/pages/DashboardPage.js.map +1 -1
  62. package/dist/subscriberbot/pages/InboxPage.d.ts +12 -0
  63. package/dist/subscriberbot/pages/InboxPage.d.ts.map +1 -0
  64. package/dist/subscriberbot/pages/InboxPage.js +517 -234
  65. package/dist/subscriberbot/pages/InboxPage.js.map +1 -1
  66. package/dist/subscriberbot/pages/InsightsPage.d.ts +4 -0
  67. package/dist/subscriberbot/pages/InsightsPage.d.ts.map +1 -0
  68. package/dist/subscriberbot/pages/InsightsPage.js +220 -0
  69. package/dist/subscriberbot/pages/InsightsPage.js.map +1 -0
  70. package/dist/subscriberbot/pages/InvoicesPage.d.ts +13 -0
  71. package/dist/subscriberbot/pages/InvoicesPage.d.ts.map +1 -0
  72. package/dist/subscriberbot/pages/InvoicesPage.js +325 -237
  73. package/dist/subscriberbot/pages/InvoicesPage.js.map +1 -1
  74. package/dist/subscriberbot/pages/WorkflowsPage.d.ts +15 -0
  75. package/dist/subscriberbot/pages/WorkflowsPage.d.ts.map +1 -0
  76. package/dist/subscriberbot/pages/WorkflowsPage.js +301 -112
  77. package/dist/subscriberbot/pages/WorkflowsPage.js.map +1 -1
  78. package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts +11 -0
  79. package/dist/subscriberbot/pages/agents/AgentDetailPage.d.ts.map +1 -0
  80. package/dist/subscriberbot/pages/agents/AgentDetailPage.js +311 -165
  81. package/dist/subscriberbot/pages/agents/AgentDetailPage.js.map +1 -1
  82. package/dist/subscriberbot/pages/agents/AgentNewPage.d.ts +8 -0
  83. package/dist/subscriberbot/pages/agents/AgentNewPage.d.ts.map +1 -0
  84. package/dist/subscriberbot/pages/agents/AgentsListPage.d.ts +11 -0
  85. package/dist/subscriberbot/pages/agents/AgentsListPage.d.ts.map +1 -0
  86. package/dist/subscriberbot/pages/agents/AgentsListPage.js +183 -93
  87. package/dist/subscriberbot/pages/agents/AgentsListPage.js.map +1 -1
  88. package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts +10 -0
  89. package/dist/subscriberbot/pages/providers/ProviderDetailPage.d.ts.map +1 -0
  90. package/dist/subscriberbot/pages/providers/ProviderDetailPage.js +426 -293
  91. package/dist/subscriberbot/pages/providers/ProviderDetailPage.js.map +1 -1
  92. package/dist/subscriberbot/pages/providers/ProviderNewPage.d.ts +10 -0
  93. package/dist/subscriberbot/pages/providers/ProviderNewPage.d.ts.map +1 -0
  94. package/dist/subscriberbot/pages/providers/ProviderNewPage.js +217 -153
  95. package/dist/subscriberbot/pages/providers/ProviderNewPage.js.map +1 -1
  96. package/dist/subscriberbot/pages/providers/ProvidersListPage.d.ts +12 -0
  97. package/dist/subscriberbot/pages/providers/ProvidersListPage.d.ts.map +1 -0
  98. package/dist/subscriberbot/pages/providers/ProvidersListPage.js +215 -112
  99. package/dist/subscriberbot/pages/providers/ProvidersListPage.js.map +1 -1
  100. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.d.ts +13 -0
  101. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.d.ts.map +1 -0
  102. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js +542 -428
  103. package/dist/subscriberbot/pages/relationships/RelationshipDetailPage.js.map +1 -1
  104. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.d.ts +10 -0
  105. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.d.ts.map +1 -0
  106. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js +242 -192
  107. package/dist/subscriberbot/pages/relationships/RelationshipNewPage.js.map +1 -1
  108. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.d.ts +10 -0
  109. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.d.ts.map +1 -0
  110. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js +174 -133
  111. package/dist/subscriberbot/pages/relationships/RelationshipsListPage.js.map +1 -1
  112. package/dist/subscriberbot/services/assistantApi.d.ts +66 -0
  113. package/dist/subscriberbot/services/assistantApi.d.ts.map +1 -0
  114. package/dist/subscriberbot/services/assistantApi.js +260 -0
  115. package/dist/subscriberbot/services/assistantApi.js.map +1 -0
  116. package/dist/subscriberbot/services/createSandboxAssistantTransport.d.ts +13 -0
  117. package/dist/subscriberbot/services/createSandboxAssistantTransport.d.ts.map +1 -0
  118. package/dist/subscriberbot/services/createSandboxAssistantTransport.js +120 -0
  119. package/dist/subscriberbot/services/createSandboxAssistantTransport.js.map +1 -0
  120. package/dist/subscriberbot/store/index.d.ts +6 -0
  121. package/dist/subscriberbot/store/index.d.ts.map +1 -0
  122. package/dist/subscriberbot/store/subscriberbotStore.d.ts +60 -0
  123. package/dist/subscriberbot/store/subscriberbotStore.d.ts.map +1 -0
  124. package/dist/subscriberbot/types/assistant.d.ts +57 -0
  125. package/dist/subscriberbot/types/assistant.d.ts.map +1 -0
  126. package/dist/subscriberbot/types/index.d.ts +465 -0
  127. package/dist/subscriberbot/types/index.d.ts.map +1 -0
  128. package/dist/subscriberbot/utils/cn.d.ts +4 -0
  129. package/dist/subscriberbot/utils/cn.d.ts.map +1 -0
  130. package/dist/subscriberbot/utils/formatters.d.ts +53 -0
  131. package/dist/subscriberbot/utils/formatters.d.ts.map +1 -0
  132. package/dist/subscriberbot/utils/index.d.ts +8 -0
  133. package/dist/subscriberbot/utils/index.d.ts.map +1 -0
  134. package/dist/subscriberbot/utils/navigation.d.ts +20 -0
  135. package/dist/subscriberbot/utils/navigation.d.ts.map +1 -0
  136. package/dist/subscriberbot/utils/pageContext.d.ts +21 -0
  137. package/dist/subscriberbot/utils/pageContext.d.ts.map +1 -0
  138. package/dist/subscriberbot/utils/pageContext.js +47 -0
  139. package/dist/subscriberbot/utils/pageContext.js.map +1 -0
  140. package/package.json +5 -1
@@ -1,12 +1,14 @@
1
1
  import { useSubscriberBot as e } from "../../context/SubscriberBotContext.js";
2
- import { PageLayout as t } from "../../components/PageLayout.js";
3
- import { useCreateProvider as n } from "../../hooks/useSubscriberBotApi.js";
4
- import { useState as r } from "react";
5
- import { ArrowLeft as i } from "lucide-react";
6
- import { jsx as a, jsxs as o } from "react/jsx-runtime";
7
- import { PagePurpose as s } from "@burdenoff/fe-libs/ui";
2
+ import { cn as t } from "../../utils/cn.js";
3
+ import { PageLayout as n } from "../../components/PageLayout.js";
4
+ import { formatEnumLabel as r } from "../../utils/formatters.js";
5
+ import { useCreateProvider as i } from "../../hooks/useSubscriberBotApi.js";
6
+ import { useState as a } from "react";
7
+ import { ArrowLeft as o, Building2 as s, Sparkles as c } from "lucide-react";
8
+ import { jsx as l, jsxs as u } from "react/jsx-runtime";
9
+ import { GlassCard as d, PagePurpose as f } from "@burdenoff/fe-libs/ui";
8
10
  //#region src/subscriberbot/pages/providers/ProviderNewPage.tsx
9
- var c = [
11
+ var p = [
10
12
  "SAAS",
11
13
  "AI_SERVICE",
12
14
  "STREAMING",
@@ -23,163 +25,225 @@ var c = [
23
25
  "LICENSE",
24
26
  "CONTRACT",
25
27
  "OTHER"
26
- ], l = "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", u = "mb-1 block text-xs font-medium text-text-secondary";
27
- function d() {
28
- let { navigateTo: d } = e(), f = n(), [p, m] = r(""), [h, g] = r("SAAS"), [_, v] = r(""), [y, b] = r(""), [x, S] = r(""), [C, w] = r(""), [T, E] = r(""), [D, O] = r(null);
29
- return /* @__PURE__ */ o(t, {
28
+ ], m = "w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]", h = "mb-1 block text-xs font-medium text-text-secondary";
29
+ function g() {
30
+ let { navigateTo: g } = e(), _ = i(), [v, y] = a(""), [b, x] = a("SAAS"), [S, C] = a(""), [w, T] = a(""), [E, D] = a(""), [O, k] = a(""), [A, j] = a(""), [M, N] = a(null), P = A.split(",").map((e) => e.trim()).filter(Boolean);
31
+ return /* @__PURE__ */ u(n, {
30
32
  title: "Add provider",
31
33
  description: "Register a new provider in the registry",
32
- actions: /* @__PURE__ */ o("button", {
34
+ actions: /* @__PURE__ */ u("button", {
33
35
  type: "button",
34
- onClick: () => d("/providers"),
36
+ onClick: () => g("/providers"),
35
37
  className: "inline-flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken",
36
- children: [/* @__PURE__ */ a(i, { className: "h-4 w-4" }), " Back"]
38
+ children: [/* @__PURE__ */ l(o, { className: "h-4 w-4" }), " Back"]
37
39
  }),
38
- children: [/* @__PURE__ */ a(s, {
40
+ children: [/* @__PURE__ */ l(f, {
39
41
  className: "mb-6",
40
42
  children: "Add a provider that isn't in the registry yet so you can attach relationships, plans and assets to it."
41
- }), /* @__PURE__ */ o("form", {
42
- onSubmit: (e) => {
43
- if (e.preventDefault(), O(null), !p.trim()) {
44
- O("A provider name is required.");
45
- return;
46
- }
47
- let t = T.split(",").map((e) => e.trim()).filter(Boolean), n = {
48
- name: p.trim(),
49
- category: h,
50
- ..._.trim() ? { description: _.trim() } : {},
51
- ...y.trim() ? { websiteUrl: y.trim() } : {},
52
- ...x.trim() ? { region: x.trim() } : {},
53
- ...C.trim() ? { industry: C.trim() } : {},
54
- ...t.length ? { tags: t } : {}
55
- };
56
- f.mutate(n, {
57
- onSuccess: (e) => d(`/providers/${e.id}`),
58
- onError: (e) => O(e instanceof Error ? e.message : "Could not create provider.")
59
- });
60
- },
61
- className: "max-w-2xl space-y-5",
62
- children: [
63
- D && /* @__PURE__ */ a("div", {
64
- className: "rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
65
- children: D
66
- }),
67
- /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("label", {
68
- htmlFor: "prov-name",
69
- className: u,
70
- children: ["Name ", /* @__PURE__ */ a("span", {
71
- className: "text-status-error-text",
72
- children: "*"
73
- })]
74
- }), /* @__PURE__ */ a("input", {
75
- id: "prov-name",
76
- type: "text",
77
- value: p,
78
- onChange: (e) => m(e.target.value),
79
- placeholder: "e.g. OpenAI, Netflix, AWS",
80
- className: l,
81
- required: !0
82
- })] }),
83
- /* @__PURE__ */ o("div", {
84
- className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
85
- children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
86
- htmlFor: "prov-category",
87
- className: u,
88
- children: "Category"
89
- }), /* @__PURE__ */ a("select", {
90
- id: "prov-category",
91
- value: h,
92
- onChange: (e) => g(e.target.value),
93
- className: l,
94
- children: c.map((e) => /* @__PURE__ */ a("option", {
95
- value: e,
96
- children: e.replace(/_/g, " ")
97
- }, e))
98
- })] }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
99
- htmlFor: "prov-website",
100
- className: u,
101
- children: "Website"
102
- }), /* @__PURE__ */ a("input", {
103
- id: "prov-website",
104
- type: "url",
105
- value: y,
106
- onChange: (e) => b(e.target.value),
107
- placeholder: "https://…",
108
- className: l
109
- })] })]
110
- }),
111
- /* @__PURE__ */ o("div", {
112
- className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
113
- children: [/* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
114
- htmlFor: "prov-region",
115
- className: u,
116
- children: "Region"
117
- }), /* @__PURE__ */ a("input", {
118
- id: "prov-region",
119
- type: "text",
120
- value: x,
121
- onChange: (e) => S(e.target.value),
122
- placeholder: "e.g. Global, US, EU",
123
- className: l
124
- })] }), /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
125
- htmlFor: "prov-industry",
126
- className: u,
127
- children: "Industry"
128
- }), /* @__PURE__ */ a("input", {
129
- id: "prov-industry",
130
- type: "text",
131
- value: C,
132
- onChange: (e) => w(e.target.value),
133
- placeholder: "e.g. Cloud, Media",
134
- className: l
135
- })] })]
136
- }),
137
- /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ a("label", {
138
- htmlFor: "prov-desc",
139
- className: u,
140
- children: "Description"
141
- }), /* @__PURE__ */ a("textarea", {
142
- id: "prov-desc",
143
- value: _,
144
- onChange: (e) => v(e.target.value),
145
- rows: 3,
146
- placeholder: "What does this provider offer?",
147
- className: l
148
- })] }),
149
- /* @__PURE__ */ o("div", { children: [/* @__PURE__ */ o("label", {
150
- htmlFor: "prov-tags",
151
- className: u,
152
- children: ["Tags ", /* @__PURE__ */ a("span", {
153
- className: "text-text-secondary",
154
- children: "(comma-separated)"
155
- })]
156
- }), /* @__PURE__ */ a("input", {
157
- id: "prov-tags",
158
- type: "text",
159
- value: T,
160
- onChange: (e) => E(e.target.value),
161
- placeholder: "ai, productivity, enterprise",
162
- className: l
163
- })] }),
164
- /* @__PURE__ */ o("div", {
165
- className: "flex gap-3",
166
- children: [/* @__PURE__ */ a("button", {
167
- type: "submit",
168
- disabled: f.isPending,
169
- className: "rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50",
170
- children: f.isPending ? "Creating…" : "Create provider"
171
- }), /* @__PURE__ */ a("button", {
172
- type: "button",
173
- onClick: () => d("/providers"),
174
- className: "rounded-lg border border-border-subtle px-5 py-2.5 text-sm font-medium text-text-primary hover:bg-bg-sunken",
175
- children: "Cancel"
176
- })]
43
+ }), /* @__PURE__ */ u("div", {
44
+ className: "grid grid-cols-1 gap-6 lg:grid-cols-3",
45
+ children: [/* @__PURE__ */ l(d, {
46
+ treatment: "metric",
47
+ className: "p-6 lg:col-span-2",
48
+ children: /* @__PURE__ */ u("form", {
49
+ onSubmit: (e) => {
50
+ if (e.preventDefault(), N(null), !v.trim()) {
51
+ N("A provider name is required.");
52
+ return;
53
+ }
54
+ let t = {
55
+ name: v.trim(),
56
+ category: b,
57
+ ...S.trim() ? { description: S.trim() } : {},
58
+ ...w.trim() ? { websiteUrl: w.trim() } : {},
59
+ ...E.trim() ? { region: E.trim() } : {},
60
+ ...O.trim() ? { industry: O.trim() } : {},
61
+ ...P.length ? { tags: P } : {}
62
+ };
63
+ _.mutate(t, {
64
+ onSuccess: (e) => g(`/providers/${e.id}`),
65
+ onError: (e) => N(e instanceof Error ? e.message : "Could not create provider.")
66
+ });
67
+ },
68
+ className: "space-y-5",
69
+ children: [
70
+ M && /* @__PURE__ */ l("div", {
71
+ className: "rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text",
72
+ children: M
73
+ }),
74
+ /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("label", {
75
+ htmlFor: "prov-name",
76
+ className: h,
77
+ children: ["Name ", /* @__PURE__ */ l("span", {
78
+ className: "text-status-error-text",
79
+ children: "*"
80
+ })]
81
+ }), /* @__PURE__ */ l("input", {
82
+ id: "prov-name",
83
+ type: "text",
84
+ value: v,
85
+ onChange: (e) => y(e.target.value),
86
+ placeholder: "e.g. OpenAI, Netflix, AWS",
87
+ className: m,
88
+ required: !0
89
+ })] }),
90
+ /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("span", {
91
+ className: h,
92
+ children: "Category"
93
+ }), /* @__PURE__ */ l("div", {
94
+ className: "flex flex-wrap gap-2",
95
+ role: "group",
96
+ "aria-label": "Provider category",
97
+ children: p.map((e) => {
98
+ let n = b === e;
99
+ return /* @__PURE__ */ l("button", {
100
+ type: "button",
101
+ "aria-pressed": n,
102
+ onClick: () => x(e),
103
+ className: t("rounded-full border px-3 py-1.5 text-xs font-medium transition-colors", n ? "border-transparent bg-action-primary-bg text-action-primary-text" : "border-border-subtle bg-bg-surface text-text-secondary hover:bg-bg-sunken hover:text-text-primary"),
104
+ children: r(e)
105
+ }, e);
106
+ })
107
+ })] }),
108
+ /* @__PURE__ */ u("div", {
109
+ className: "grid grid-cols-1 gap-4 sm:grid-cols-2",
110
+ children: [/* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
111
+ htmlFor: "prov-website",
112
+ className: h,
113
+ children: "Website"
114
+ }), /* @__PURE__ */ l("input", {
115
+ id: "prov-website",
116
+ type: "url",
117
+ value: w,
118
+ onChange: (e) => T(e.target.value),
119
+ placeholder: "https://…",
120
+ className: m
121
+ })] }), /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
122
+ htmlFor: "prov-region",
123
+ className: h,
124
+ children: "Region"
125
+ }), /* @__PURE__ */ l("input", {
126
+ id: "prov-region",
127
+ type: "text",
128
+ value: E,
129
+ onChange: (e) => D(e.target.value),
130
+ placeholder: "e.g. Global, US, EU",
131
+ className: m
132
+ })] })]
133
+ }),
134
+ /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
135
+ htmlFor: "prov-industry",
136
+ className: h,
137
+ children: "Industry"
138
+ }), /* @__PURE__ */ l("input", {
139
+ id: "prov-industry",
140
+ type: "text",
141
+ value: O,
142
+ onChange: (e) => k(e.target.value),
143
+ placeholder: "e.g. Cloud, Media",
144
+ className: m
145
+ })] }),
146
+ /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ l("label", {
147
+ htmlFor: "prov-desc",
148
+ className: h,
149
+ children: "Description"
150
+ }), /* @__PURE__ */ l("textarea", {
151
+ id: "prov-desc",
152
+ value: S,
153
+ onChange: (e) => C(e.target.value),
154
+ rows: 3,
155
+ placeholder: "What does this provider offer?",
156
+ className: m
157
+ })] }),
158
+ /* @__PURE__ */ u("div", { children: [/* @__PURE__ */ u("label", {
159
+ htmlFor: "prov-tags",
160
+ className: h,
161
+ children: ["Tags ", /* @__PURE__ */ l("span", {
162
+ className: "text-text-secondary",
163
+ children: "(comma-separated)"
164
+ })]
165
+ }), /* @__PURE__ */ l("input", {
166
+ id: "prov-tags",
167
+ type: "text",
168
+ value: A,
169
+ onChange: (e) => j(e.target.value),
170
+ placeholder: "ai, productivity, enterprise",
171
+ className: m
172
+ })] }),
173
+ /* @__PURE__ */ u("div", {
174
+ className: "flex flex-wrap gap-3 border-t border-border-subtle pt-5",
175
+ children: [/* @__PURE__ */ l("button", {
176
+ type: "submit",
177
+ disabled: _.isPending,
178
+ className: "rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50",
179
+ children: _.isPending ? "Creating…" : "Create provider"
180
+ }), /* @__PURE__ */ l("button", {
181
+ type: "button",
182
+ onClick: () => g("/providers"),
183
+ className: "rounded-lg border border-border-subtle px-5 py-2.5 text-sm font-medium text-text-primary hover:bg-bg-sunken",
184
+ children: "Cancel"
185
+ })]
186
+ })
187
+ ]
177
188
  })
178
- ]
189
+ }), /* @__PURE__ */ u("div", {
190
+ className: "lg:sticky lg:top-6 lg:self-start",
191
+ children: [/* @__PURE__ */ u("p", {
192
+ className: "mb-2 inline-flex items-center gap-1.5 text-xs font-medium text-text-secondary",
193
+ children: [/* @__PURE__ */ l(c, { className: "h-3.5 w-3.5" }), " Registry preview"]
194
+ }), /* @__PURE__ */ u(d, {
195
+ treatment: "glass",
196
+ className: "flex flex-col p-5",
197
+ children: [
198
+ /* @__PURE__ */ u("div", {
199
+ className: "flex items-start justify-between gap-2",
200
+ children: [/* @__PURE__ */ l("span", {
201
+ className: "flex size-10 items-center justify-center rounded-xl bg-[var(--color-accent-soft)] text-text-primary",
202
+ children: /* @__PURE__ */ l(s, { className: "h-5 w-5" })
203
+ }), /* @__PURE__ */ l("span", {
204
+ className: "rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-warning-text",
205
+ children: "Unverified"
206
+ })]
207
+ }),
208
+ /* @__PURE__ */ l("p", {
209
+ className: "mt-3 truncate text-base font-semibold text-text-primary",
210
+ children: v.trim() || "Provider name"
211
+ }),
212
+ /* @__PURE__ */ l("span", {
213
+ className: "mt-1 inline-flex w-fit rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary",
214
+ children: r(b)
215
+ }),
216
+ S.trim() ? /* @__PURE__ */ l("p", {
217
+ className: "mt-3 line-clamp-3 text-xs leading-relaxed text-text-secondary",
218
+ children: S.trim()
219
+ }) : /* @__PURE__ */ l("p", {
220
+ className: "mt-3 text-xs italic text-text-secondary/70",
221
+ children: "A short description will appear here."
222
+ }),
223
+ (E.trim() || O.trim() || P.length > 0) && /* @__PURE__ */ u("div", {
224
+ className: "mt-4 flex flex-wrap items-center gap-2 border-t border-border-subtle pt-3",
225
+ children: [
226
+ O.trim() && /* @__PURE__ */ l("span", {
227
+ className: "text-[11px] text-text-secondary",
228
+ children: O.trim()
229
+ }),
230
+ E.trim() && /* @__PURE__ */ u("span", {
231
+ className: "text-[11px] text-text-secondary",
232
+ children: ["· ", E.trim()]
233
+ }),
234
+ P.slice(0, 4).map((e) => /* @__PURE__ */ l("span", {
235
+ className: "rounded-full bg-bg-sunken px-2 py-0.5 text-[11px] text-text-secondary",
236
+ children: e
237
+ }, e))
238
+ ]
239
+ })
240
+ ]
241
+ })]
242
+ })]
179
243
  })]
180
244
  });
181
245
  }
182
246
  //#endregion
183
- export { d as ProviderNewPage };
247
+ export { g as ProviderNewPage };
184
248
 
185
249
  //# sourceMappingURL=ProviderNewPage.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ProviderNewPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/providers/ProviderNewPage.tsx"],"sourcesContent":["/**\n * Create provider\n * @module subscriberbot/pages/providers\n *\n * Add a provider to the registry. Writes `subCreateProvider`.\n */\n\nimport { useState } from 'react';\nimport { ArrowLeft } from 'lucide-react';\nimport { PagePurpose } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useCreateProvider } from '../../hooks/useSubscriberBotApi';\nimport type { SubCreateProviderInput, SubProviderCategory } from '../../types';\n\nconst CATEGORIES: SubProviderCategory[] = [\n 'SAAS',\n 'AI_SERVICE',\n 'STREAMING',\n 'NEWSLETTER',\n 'NEWS_DIGEST',\n 'MEMBERSHIP',\n 'COMMUNITY',\n 'EDUCATION',\n 'FINANCIAL',\n 'INSURANCE',\n 'TELECOM',\n 'UTILITY',\n 'ASSOCIATION',\n 'LICENSE',\n 'CONTRACT',\n 'OTHER',\n];\n\nconst inputCls =\n 'w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]';\nconst labelCls = 'mb-1 block text-xs font-medium text-text-secondary';\n\nexport function ProviderNewPage() {\n const { navigateTo } = useSubscriberBot();\n const create = useCreateProvider();\n\n const [name, setName] = useState('');\n const [category, setCategory] = useState<SubProviderCategory>('SAAS');\n const [description, setDescription] = useState('');\n const [websiteUrl, setWebsiteUrl] = useState('');\n const [region, setRegion] = useState('');\n const [industry, setIndustry] = useState('');\n const [tags, setTags] = useState('');\n const [formError, setFormError] = useState<string | null>(null);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n setFormError(null);\n if (!name.trim()) {\n setFormError('A provider name is required.');\n return;\n }\n const parsedTags = tags\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n const input: SubCreateProviderInput = {\n name: name.trim(),\n category,\n ...(description.trim() ? { description: description.trim() } : {}),\n ...(websiteUrl.trim() ? { websiteUrl: websiteUrl.trim() } : {}),\n ...(region.trim() ? { region: region.trim() } : {}),\n ...(industry.trim() ? { industry: industry.trim() } : {}),\n ...(parsedTags.length ? { tags: parsedTags } : {}),\n };\n create.mutate(input, {\n onSuccess: (provider) => navigateTo(`/providers/${provider.id}`),\n onError: (err) =>\n setFormError(err instanceof Error ? err.message : 'Could not create provider.'),\n });\n };\n\n return (\n <PageLayout\n title=\"Add provider\"\n description=\"Register a new provider in the registry\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/providers')}\n className=\"inline-flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n }\n >\n <PagePurpose className=\"mb-6\">\n Add a provider that isn't in the registry yet so you can attach relationships, plans and\n assets to it.\n </PagePurpose>\n\n <form onSubmit={handleSubmit} className=\"max-w-2xl space-y-5\">\n {formError && (\n <div className=\"rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text\">\n {formError}\n </div>\n )}\n\n <div>\n <label htmlFor=\"prov-name\" className={labelCls}>\n Name <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n id=\"prov-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. OpenAI, Netflix, AWS\"\n className={inputCls}\n required\n />\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label htmlFor=\"prov-category\" className={labelCls}>\n Category\n </label>\n <select\n id=\"prov-category\"\n value={category}\n onChange={(e) => setCategory(e.target.value as SubProviderCategory)}\n className={inputCls}\n >\n {CATEGORIES.map((c) => (\n <option key={c} value={c}>\n {c.replace(/_/g, ' ')}\n </option>\n ))}\n </select>\n </div>\n <div>\n <label htmlFor=\"prov-website\" className={labelCls}>\n Website\n </label>\n <input\n id=\"prov-website\"\n type=\"url\"\n value={websiteUrl}\n onChange={(e) => setWebsiteUrl(e.target.value)}\n placeholder=\"https://…\"\n className={inputCls}\n />\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label htmlFor=\"prov-region\" className={labelCls}>\n Region\n </label>\n <input\n id=\"prov-region\"\n type=\"text\"\n value={region}\n onChange={(e) => setRegion(e.target.value)}\n placeholder=\"e.g. Global, US, EU\"\n className={inputCls}\n />\n </div>\n <div>\n <label htmlFor=\"prov-industry\" className={labelCls}>\n Industry\n </label>\n <input\n id=\"prov-industry\"\n type=\"text\"\n value={industry}\n onChange={(e) => setIndustry(e.target.value)}\n placeholder=\"e.g. Cloud, Media\"\n className={inputCls}\n />\n </div>\n </div>\n\n <div>\n <label htmlFor=\"prov-desc\" className={labelCls}>\n Description\n </label>\n <textarea\n id=\"prov-desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={3}\n placeholder=\"What does this provider offer?\"\n className={inputCls}\n />\n </div>\n\n <div>\n <label htmlFor=\"prov-tags\" className={labelCls}>\n Tags <span className=\"text-text-secondary\">(comma-separated)</span>\n </label>\n <input\n id=\"prov-tags\"\n type=\"text\"\n value={tags}\n onChange={(e) => setTags(e.target.value)}\n placeholder=\"ai, productivity, enterprise\"\n className={inputCls}\n />\n </div>\n\n <div className=\"flex gap-3\">\n <button\n type=\"submit\"\n disabled={create.isPending}\n className=\"rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50\"\n >\n {create.isPending ? 'Creating…' : 'Create provider'}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/providers')}\n className=\"rounded-lg border border-border-subtle px-5 py-2.5 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n </div>\n </form>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"ProviderNewPage.js","names":[],"sources":["../../../../src/subscriberbot/pages/providers/ProviderNewPage.tsx"],"sourcesContent":["/**\n * Create provider\n * @module subscriberbot/pages/providers\n *\n * Add a provider to the registry. Writes `subCreateProvider`. A card-wrapped\n * form with category chips and a live marketplace-style preview that mirrors\n * exactly what will land in the registry.\n */\n\nimport { useState } from 'react';\nimport { ArrowLeft, Building2, Sparkles } from 'lucide-react';\nimport { PagePurpose, GlassCard } from '@burdenoff/fe-libs/ui';\nimport { PageLayout } from '../../components/PageLayout';\nimport { useSubscriberBot } from '../../context/SubscriberBotContext';\nimport { useCreateProvider } from '../../hooks/useSubscriberBotApi';\nimport { cn } from '../../utils/cn';\nimport { formatEnumLabel } from '../../utils/formatters';\nimport type { SubCreateProviderInput, SubProviderCategory } from '../../types';\n\nconst CATEGORIES: SubProviderCategory[] = [\n 'SAAS',\n 'AI_SERVICE',\n 'STREAMING',\n 'NEWSLETTER',\n 'NEWS_DIGEST',\n 'MEMBERSHIP',\n 'COMMUNITY',\n 'EDUCATION',\n 'FINANCIAL',\n 'INSURANCE',\n 'TELECOM',\n 'UTILITY',\n 'ASSOCIATION',\n 'LICENSE',\n 'CONTRACT',\n 'OTHER',\n];\n\nconst inputCls =\n 'w-full rounded-lg border border-border-subtle bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-secondary focus:outline-none focus:ring-2 focus:ring-[var(--color-focus-ring)]';\nconst labelCls = 'mb-1 block text-xs font-medium text-text-secondary';\n\nexport function ProviderNewPage() {\n const { navigateTo } = useSubscriberBot();\n const create = useCreateProvider();\n\n const [name, setName] = useState('');\n const [category, setCategory] = useState<SubProviderCategory>('SAAS');\n const [description, setDescription] = useState('');\n const [websiteUrl, setWebsiteUrl] = useState('');\n const [region, setRegion] = useState('');\n const [industry, setIndustry] = useState('');\n const [tags, setTags] = useState('');\n const [formError, setFormError] = useState<string | null>(null);\n\n const parsedTags = tags\n .split(',')\n .map((t) => t.trim())\n .filter(Boolean);\n\n const handleSubmit = (e: React.FormEvent) => {\n e.preventDefault();\n setFormError(null);\n if (!name.trim()) {\n setFormError('A provider name is required.');\n return;\n }\n const input: SubCreateProviderInput = {\n name: name.trim(),\n category,\n ...(description.trim() ? { description: description.trim() } : {}),\n ...(websiteUrl.trim() ? { websiteUrl: websiteUrl.trim() } : {}),\n ...(region.trim() ? { region: region.trim() } : {}),\n ...(industry.trim() ? { industry: industry.trim() } : {}),\n ...(parsedTags.length ? { tags: parsedTags } : {}),\n };\n create.mutate(input, {\n onSuccess: (provider) => navigateTo(`/providers/${provider.id}`),\n onError: (err) =>\n setFormError(err instanceof Error ? err.message : 'Could not create provider.'),\n });\n };\n\n return (\n <PageLayout\n title=\"Add provider\"\n description=\"Register a new provider in the registry\"\n actions={\n <button\n type=\"button\"\n onClick={() => navigateTo('/providers')}\n className=\"inline-flex items-center gap-2 rounded-lg border border-border-subtle px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n <ArrowLeft className=\"h-4 w-4\" /> Back\n </button>\n }\n >\n <PagePurpose className=\"mb-6\">\n Add a provider that isn't in the registry yet so you can attach relationships, plans and\n assets to it.\n </PagePurpose>\n\n <div className=\"grid grid-cols-1 gap-6 lg:grid-cols-3\">\n {/* Form */}\n <GlassCard treatment=\"metric\" className=\"p-6 lg:col-span-2\">\n <form onSubmit={handleSubmit} className=\"space-y-5\">\n {formError && (\n <div className=\"rounded-lg border border-status-error-text/30 bg-status-error-bg-subtle px-4 py-2 text-sm text-status-error-text\">\n {formError}\n </div>\n )}\n\n <div>\n <label htmlFor=\"prov-name\" className={labelCls}>\n Name <span className=\"text-status-error-text\">*</span>\n </label>\n <input\n id=\"prov-name\"\n type=\"text\"\n value={name}\n onChange={(e) => setName(e.target.value)}\n placeholder=\"e.g. OpenAI, Netflix, AWS\"\n className={inputCls}\n required\n />\n </div>\n\n <div>\n <span className={labelCls}>Category</span>\n <div className=\"flex flex-wrap gap-2\" role=\"group\" aria-label=\"Provider category\">\n {CATEGORIES.map((c) => {\n const active = category === c;\n return (\n <button\n key={c}\n type=\"button\"\n aria-pressed={active}\n onClick={() => setCategory(c)}\n className={cn(\n 'rounded-full border px-3 py-1.5 text-xs font-medium transition-colors',\n active\n ? 'border-transparent bg-action-primary-bg text-action-primary-text'\n : 'border-border-subtle bg-bg-surface text-text-secondary hover:bg-bg-sunken hover:text-text-primary'\n )}\n >\n {formatEnumLabel(c)}\n </button>\n );\n })}\n </div>\n </div>\n\n <div className=\"grid grid-cols-1 gap-4 sm:grid-cols-2\">\n <div>\n <label htmlFor=\"prov-website\" className={labelCls}>\n Website\n </label>\n <input\n id=\"prov-website\"\n type=\"url\"\n value={websiteUrl}\n onChange={(e) => setWebsiteUrl(e.target.value)}\n placeholder=\"https://…\"\n className={inputCls}\n />\n </div>\n <div>\n <label htmlFor=\"prov-region\" className={labelCls}>\n Region\n </label>\n <input\n id=\"prov-region\"\n type=\"text\"\n value={region}\n onChange={(e) => setRegion(e.target.value)}\n placeholder=\"e.g. Global, US, EU\"\n className={inputCls}\n />\n </div>\n </div>\n\n <div>\n <label htmlFor=\"prov-industry\" className={labelCls}>\n Industry\n </label>\n <input\n id=\"prov-industry\"\n type=\"text\"\n value={industry}\n onChange={(e) => setIndustry(e.target.value)}\n placeholder=\"e.g. Cloud, Media\"\n className={inputCls}\n />\n </div>\n\n <div>\n <label htmlFor=\"prov-desc\" className={labelCls}>\n Description\n </label>\n <textarea\n id=\"prov-desc\"\n value={description}\n onChange={(e) => setDescription(e.target.value)}\n rows={3}\n placeholder=\"What does this provider offer?\"\n className={inputCls}\n />\n </div>\n\n <div>\n <label htmlFor=\"prov-tags\" className={labelCls}>\n Tags <span className=\"text-text-secondary\">(comma-separated)</span>\n </label>\n <input\n id=\"prov-tags\"\n type=\"text\"\n value={tags}\n onChange={(e) => setTags(e.target.value)}\n placeholder=\"ai, productivity, enterprise\"\n className={inputCls}\n />\n </div>\n\n <div className=\"flex flex-wrap gap-3 border-t border-border-subtle pt-5\">\n <button\n type=\"submit\"\n disabled={create.isPending}\n className=\"rounded-lg bg-action-primary-bg px-5 py-2.5 text-sm font-medium text-action-primary-text hover:opacity-90 disabled:opacity-50\"\n >\n {create.isPending ? 'Creating…' : 'Create provider'}\n </button>\n <button\n type=\"button\"\n onClick={() => navigateTo('/providers')}\n className=\"rounded-lg border border-border-subtle px-5 py-2.5 text-sm font-medium text-text-primary hover:bg-bg-sunken\"\n >\n Cancel\n </button>\n </div>\n </form>\n </GlassCard>\n\n {/* Live preview — reflects the form state (no fabricated data) */}\n <div className=\"lg:sticky lg:top-6 lg:self-start\">\n <p className=\"mb-2 inline-flex items-center gap-1.5 text-xs font-medium text-text-secondary\">\n <Sparkles className=\"h-3.5 w-3.5\" /> Registry preview\n </p>\n <GlassCard treatment=\"glass\" className=\"flex flex-col p-5\">\n <div className=\"flex items-start justify-between gap-2\">\n <span className=\"flex size-10 items-center justify-center rounded-xl bg-[var(--color-accent-soft)] text-text-primary\">\n <Building2 className=\"h-5 w-5\" />\n </span>\n <span className=\"rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-[11px] font-medium text-status-warning-text\">\n Unverified\n </span>\n </div>\n <p className=\"mt-3 truncate text-base font-semibold text-text-primary\">\n {name.trim() || 'Provider name'}\n </p>\n <span className=\"mt-1 inline-flex w-fit rounded-full bg-bg-sunken px-2.5 py-0.5 text-xs font-medium text-text-secondary\">\n {formatEnumLabel(category)}\n </span>\n {description.trim() ? (\n <p className=\"mt-3 line-clamp-3 text-xs leading-relaxed text-text-secondary\">\n {description.trim()}\n </p>\n ) : (\n <p className=\"mt-3 text-xs italic text-text-secondary/70\">\n A short description will appear here.\n </p>\n )}\n {(region.trim() || industry.trim() || parsedTags.length > 0) && (\n <div className=\"mt-4 flex flex-wrap items-center gap-2 border-t border-border-subtle pt-3\">\n {industry.trim() && (\n <span className=\"text-[11px] text-text-secondary\">{industry.trim()}</span>\n )}\n {region.trim() && (\n <span className=\"text-[11px] text-text-secondary\">· {region.trim()}</span>\n )}\n {parsedTags.slice(0, 4).map((t) => (\n <span\n key={t}\n className=\"rounded-full bg-bg-sunken px-2 py-0.5 text-[11px] text-text-secondary\"\n >\n {t}\n </span>\n ))}\n </div>\n )}\n </GlassCard>\n </div>\n </div>\n </PageLayout>\n );\n}\n"],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Providers list (Global Provider Registry)
3
+ * @module subscriberbot/pages/providers
4
+ *
5
+ * Discovery marketplace: search and browse the provider registry. Server-side
6
+ * search + category/status filters + pagination via `subListProviders`
7
+ * (a SubProviderConnection). Category filter chips, a responsive grid of glass
8
+ * provider cards with a real vendor-health indicator + churn hint, and a small
9
+ * live summary strip computed from the fetched page.
10
+ */
11
+ export declare function ProvidersListPage(): import("react").JSX.Element;
12
+ //# sourceMappingURL=ProvidersListPage.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ProvidersListPage.d.ts","sourceRoot":"","sources":["../../../../src/subscriberbot/pages/providers/ProvidersListPage.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAmKH,wBAAgB,iBAAiB,gCAwNhC"}