@burdenoff/microfe-devportal 2026.720.6 → 2026.724.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 (26) hide show
  1. package/dist/devportal/components/ConfirmDialog.d.ts.map +1 -1
  2. package/dist/devportal/components/ConfirmDialog.js +12 -14
  3. package/dist/devportal/components/ConfirmDialog.js.map +1 -1
  4. package/dist/devportal/components/MarkdownEditor.d.ts +24 -0
  5. package/dist/devportal/components/MarkdownEditor.d.ts.map +1 -0
  6. package/dist/devportal/components/MarkdownEditor.js +136 -0
  7. package/dist/devportal/components/MarkdownEditor.js.map +1 -0
  8. package/dist/devportal/components/index.d.ts +1 -0
  9. package/dist/devportal/components/index.d.ts.map +1 -1
  10. package/dist/devportal/components/index.js +1 -0
  11. package/dist/devportal/pages/ApplicationDetailPage.d.ts.map +1 -1
  12. package/dist/devportal/pages/ApplicationDetailPage.js +749 -747
  13. package/dist/devportal/pages/ApplicationDetailPage.js.map +1 -1
  14. package/dist/devportal/pages/ApplicationVersionsPage.d.ts.map +1 -1
  15. package/dist/devportal/pages/ApplicationVersionsPage.js +390 -374
  16. package/dist/devportal/pages/ApplicationVersionsPage.js.map +1 -1
  17. package/dist/devportal/pages/CreateApplicationPage.d.ts.map +1 -1
  18. package/dist/devportal/pages/CreateApplicationPage.js +11 -9
  19. package/dist/devportal/pages/CreateApplicationPage.js.map +1 -1
  20. package/dist/devportal/pages/EditApplicationPage.d.ts.map +1 -1
  21. package/dist/devportal/pages/EditApplicationPage.js +284 -283
  22. package/dist/devportal/pages/EditApplicationPage.js.map +1 -1
  23. package/dist/devportal/pages/ListingPreviewPage.d.ts.map +1 -1
  24. package/dist/devportal/pages/ListingPreviewPage.js +162 -158
  25. package/dist/devportal/pages/ListingPreviewPage.js.map +1 -1
  26. package/package.json +2 -2
@@ -1,30 +1,31 @@
1
1
  import { useDevportal as e } from "../providers/DevportalProvider.js";
2
2
  import { EmptyState as t } from "../components/EmptyState.js";
3
3
  import { useApproveApplicationVersionMutation as n, useCreateApplicationVersionMutation as r, useDeprecateApplicationVersionMutation as ee, useGetApplicationQuery as te, useGetApplicationVersionsQuery as ne, usePublishApplicationVersionMutation as re, useRejectApplicationVersionMutation as ie, useUpdateApplicationVersionMutation as ae } from "../../generated/global-operations.js";
4
- import { PageLayout as oe } from "../components/PageLayout.js";
5
- import { StatusBadge as se } from "../components/StatusBadge.js";
6
- import { SelectionCheckbox as i } from "../components/SelectionCheckbox.js";
7
- import { DataTable as ce } from "../components/DataTable.js";
8
- import { InputField as le, TextareaField as ue } from "../components/FormField.js";
9
- import { ConfirmDialog as a } from "../components/ConfirmDialog.js";
10
- import { PermissionGuard as de } from "../components/PermissionGuard.js";
4
+ import { PageLayout as i } from "../components/PageLayout.js";
5
+ import { StatusBadge as oe } from "../components/StatusBadge.js";
6
+ import { SelectionCheckbox as a } from "../components/SelectionCheckbox.js";
7
+ import { DataTable as se } from "../components/DataTable.js";
8
+ import { InputField as ce } from "../components/FormField.js";
9
+ import { ConfirmDialog as o } from "../components/ConfirmDialog.js";
10
+ import { PermissionGuard as le } from "../components/PermissionGuard.js";
11
+ import { MarkdownEditor as s } from "../components/MarkdownEditor.js";
11
12
  import "../components/index.js";
12
- import { useDevportalPermission as o } from "../hooks/usePermission.js";
13
+ import { useDevportalPermission as c } from "../hooks/usePermission.js";
13
14
  import "../hooks/index.js";
14
- import { DEVPORTAL_PERMISSIONS as fe } from "../constants/permissions.js";
15
- import pe from "../../node_modules/date-fns/format.js";
16
- import { usePackageUpload as me } from "../hooks/usePackageUpload.js";
17
- import { useCallback as s, useEffect as he, useMemo as c, useRef as l, useState as u } from "react";
18
- import { useI18n as ge } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
19
- import { AlertCircle as d, Archive as _e, CheckCircle as ve, Clock as ye, Loader2 as f, Package as be, Plus as xe, Send as p, Upload as m, XCircle as Se } from "lucide-react";
20
- import { useParams as Ce } from "react-router-dom";
21
- import { Fragment as h, jsx as g, jsxs as _ } from "react/jsx-runtime";
15
+ import { DEVPORTAL_PERMISSIONS as ue } from "../constants/permissions.js";
16
+ import de from "../../node_modules/date-fns/format.js";
17
+ import { usePackageUpload as fe } from "../hooks/usePackageUpload.js";
18
+ import { useCallback as l, useEffect as pe, useMemo as u, useRef as d, useState as f } from "react";
19
+ import { useI18n as me } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
20
+ import { AlertCircle as p, Archive as he, CheckCircle as ge, Clock as _e, Loader2 as m, Package as ve, Plus as ye, Send as be, Upload as h, XCircle as xe } from "lucide-react";
21
+ import { useParams as Se } from "react-router-dom";
22
+ import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
22
23
  //#region src/devportal/pages/ApplicationVersionsPage.tsx
23
- var we = () => {
24
- let { t: we } = ge(), v = (e, t) => {
25
- let n = we(e);
24
+ var Ce = () => {
25
+ let { t: Ce } = me(), y = (e, t) => {
26
+ let n = Ce(e);
26
27
  return n === e ? t : n;
27
- }, { allowed: y } = o(fe.APP_VERSION_CREATE), { allowed: b } = o(fe.APP_VERSION_PUBLISH), { allowed: x } = o(fe.APP_VERSION_DEPRECATE), { appId: S } = Ce(), { workspacesGatewayUrl: Te, authToken: Ee, workspaceId: De, getWorkspaceToken: Oe } = e(), { upload: C, uploading: w, progress: ke, error: T } = me(Te, Ee, De, Oe), Ae = l(null), je = l(null), Me = l(null), Ne = l(null), [Pe, E] = u(null), [Fe, D] = u(null), [Ie, O] = u(!1), [k, A] = u(null), [j, M] = u({
28
+ }, { allowed: b } = c(ue.APP_VERSION_CREATE), { allowed: x } = c(ue.APP_VERSION_PUBLISH), { allowed: S } = c(ue.APP_VERSION_DEPRECATE), { appId: C } = Se(), { workspacesGatewayUrl: we, authToken: Te, workspaceId: Ee, getWorkspaceToken: De } = e(), { upload: w, uploading: T, progress: Oe, error: E } = fe(we, Te, Ee, De), ke = d(null), Ae = d(null), je = d(null), Me = d(null), [Ne, D] = f(null), [Pe, O] = f(null), [Fe, k] = f(!1), [A, j] = f(null), [M, N] = f({
28
29
  version: "",
29
30
  releaseNotes: "",
30
31
  changelog: "",
@@ -32,82 +33,82 @@ var we = () => {
32
33
  packageSize: "",
33
34
  manifestJson: "",
34
35
  requiredScopes: ""
35
- }), [Le, N] = u(null), [Re, P] = u(null), [ze, F] = u(null), [Be, I] = u(null), [L, R] = u(/* @__PURE__ */ new Set()), [z, Ve] = u(null), [B, V] = u(""), He = s((e) => {
36
+ }), [Ie, P] = f(null), [Le, F] = f(null), [Re, I] = f(null), [ze, L] = f(null), [R, z] = f(/* @__PURE__ */ new Set()), [B, Be] = f(null), [V, Ve] = f(""), He = l((e) => {
36
37
  let t = e.target.files?.[0];
37
38
  if (!t) return;
38
39
  let n = new FileReader();
39
40
  n.onload = (e) => {
40
41
  let n = e.target?.result;
41
- typeof n == "string" && (M((e) => ({
42
+ typeof n == "string" && (N((e) => ({
42
43
  ...e,
43
44
  manifestJson: n
44
- })), E(t.name));
45
+ })), D(t.name));
45
46
  }, n.readAsText(t), e.target.value = "";
46
- }, []), [Ue, H] = u(null), { data: U } = te({
47
- variables: { id: S ?? "" },
48
- skip: !S,
47
+ }, []), [Ue, H] = f(null), { data: U } = te({
48
+ variables: { id: C ?? "" },
49
+ skip: !C,
49
50
  fetchPolicy: "cache-first"
50
51
  }), W = U?.application?.appType === "WORKFLOW", G = U?.application?.appType === "NODE", We = !W && !G, K = U?.application, Ge = K?.pricingDetails ?? {}, Ke = K?.pricingType === "FREE" || K?.pricingType === "PAID" && typeof Ge.price == "number" && Ge.price > 0, qe = !!K?.shortDescription?.trim() && !!K?.privacyPolicyUrl?.trim() && !!K?.termsOfServiceUrl?.trim(), q = Ke && qe, J = [...qe ? [] : ["Complete your store listing (short description, privacy policy, terms of service)"], ...Ke ? [] : ["Set pricing in the Pricing tab"]];
51
- he(() => {
52
+ pe(() => {
52
53
  let e = U?.application?.name;
53
- if (!S || !e) return;
54
+ if (!C || !e) return;
54
55
  let t = window.__breadcrumbRegistry;
55
- return t?.register(S, e), () => t?.unregister(S);
56
- }, [S, U?.application?.name]);
56
+ return t?.register(C, e), () => t?.unregister(C);
57
+ }, [C, U?.application?.name]);
57
58
  let { data: Y, loading: Je, error: Ye } = ne({
58
- variables: { applicationId: S },
59
- skip: !S,
59
+ variables: { applicationId: C },
60
+ skip: !C,
60
61
  fetchPolicy: "cache-and-network"
61
- }), [Xe, { loading: Ze }] = r({ refetchQueries: ["GetApplicationVersions"] }), [Qe, { loading: $e }] = ae({ refetchQueries: ["GetApplicationVersions"] }), [et] = re({ refetchQueries: ["GetApplicationVersions"] }), [tt] = ee({ refetchQueries: ["GetApplicationVersions"] }), [nt] = n({ refetchQueries: ["GetApplicationVersions"] }), [rt] = ie({ refetchQueries: ["GetApplicationVersions"] }), X = c(() => Y?.application?.versions?.edges?.map((e) => e.node) ?? [], [Y?.application?.versions]), Z = c(() => X.filter((e) => L.has(e.id)), [X, L]), Q = c(() => Z.filter((e) => e.status === "draft" || e.status === "rejected"), [Z]), $ = c(() => Z.filter((e) => e.status?.toUpperCase() === "PUBLISHED" && !e.isLatest), [Z]), it = X.length > 0 && X.every((e) => L.has(e.id)), at = X.some((e) => L.has(e.id)) && !it, ot = async () => {
62
- if (!S || !j.version.trim()) return;
63
- F(null);
62
+ }), [Xe, { loading: Ze }] = r({ refetchQueries: ["GetApplicationVersions"] }), [Qe, { loading: $e }] = ae({ refetchQueries: ["GetApplicationVersions"] }), [et] = re({ refetchQueries: ["GetApplicationVersions"] }), [tt] = ee({ refetchQueries: ["GetApplicationVersions"] }), [nt] = n({ refetchQueries: ["GetApplicationVersions"] }), [rt] = ie({ refetchQueries: ["GetApplicationVersions"] }), X = u(() => Y?.application?.versions?.edges?.map((e) => e.node) ?? [], [Y?.application?.versions]), Z = u(() => X.filter((e) => R.has(e.id)), [X, R]), Q = u(() => Z.filter((e) => e.status === "draft" || e.status === "rejected"), [Z]), $ = u(() => Z.filter((e) => e.status?.toUpperCase() === "PUBLISHED" && !e.isLatest), [Z]), it = X.length > 0 && X.every((e) => R.has(e.id)), at = X.some((e) => R.has(e.id)) && !it, ot = async () => {
63
+ if (!C || !M.version.trim()) return;
64
+ I(null);
64
65
  let e;
65
66
  if (W) {
66
- if (!j.manifestJson.trim()) {
67
- F("Workflow Definition (JSON) is required — paste the {nodes, edges} object.");
67
+ if (!M.manifestJson.trim()) {
68
+ I("Workflow Definition (JSON) is required — paste the {nodes, edges} object.");
68
69
  return;
69
70
  }
70
71
  try {
71
- e = JSON.parse(j.manifestJson);
72
+ e = JSON.parse(M.manifestJson);
72
73
  } catch {
73
- F("Invalid JSON in Workflow Definition — please check your input.");
74
+ I("Invalid JSON in Workflow Definition — please check your input.");
74
75
  return;
75
76
  }
76
77
  } else if (G) {
77
- if (!j.packageUrl) {
78
- F("Package zip is required for Node versions — upload a .zip file before creating.");
78
+ if (!M.packageUrl) {
79
+ I("Package zip is required for Node versions — upload a .zip file before creating.");
79
80
  return;
80
81
  }
81
- if (!j.manifestJson.trim()) {
82
- F("manifest.json is required for Node versions — upload or paste your manifest before creating.");
82
+ if (!M.manifestJson.trim()) {
83
+ I("manifest.json is required for Node versions — upload or paste your manifest before creating.");
83
84
  return;
84
85
  }
85
86
  try {
86
- e = JSON.parse(j.manifestJson);
87
+ e = JSON.parse(M.manifestJson);
87
88
  } catch {
88
- F("Invalid JSON in manifest — please check your input.");
89
+ I("Invalid JSON in manifest — please check your input.");
89
90
  return;
90
91
  }
91
- } else if (j.manifestJson.trim()) try {
92
- e = JSON.parse(j.manifestJson);
92
+ } else if (M.manifestJson.trim()) try {
93
+ e = JSON.parse(M.manifestJson);
93
94
  } catch {
94
- F("Invalid JSON in manifest — please check your input.");
95
+ I("Invalid JSON in manifest — please check your input.");
95
96
  return;
96
97
  }
97
- let t = We && j.requiredScopes.trim() ? j.requiredScopes.split(",").map((e) => e.trim()).filter(Boolean) : void 0;
98
+ let t = We && M.requiredScopes.trim() ? M.requiredScopes.split(",").map((e) => e.trim()).filter(Boolean) : void 0;
98
99
  try {
99
100
  await Xe({ variables: {
100
- applicationId: S,
101
+ applicationId: C,
101
102
  input: {
102
- version: j.version,
103
- releaseNotes: j.releaseNotes || void 0,
104
- changelog: j.changelog || void 0,
105
- packageUrl: j.packageUrl || void 0,
106
- packageSize: j.packageSize || void 0,
103
+ version: M.version,
104
+ releaseNotes: M.releaseNotes || void 0,
105
+ changelog: M.changelog || void 0,
106
+ packageUrl: M.packageUrl || void 0,
107
+ packageSize: M.packageSize || void 0,
107
108
  manifest: e,
108
109
  requiredScopes: t
109
110
  }
110
- } }), O(!1), E(null), M({
111
+ } }), k(!1), D(null), N({
111
112
  version: "",
112
113
  releaseNotes: "",
113
114
  changelog: "",
@@ -115,289 +116,289 @@ var we = () => {
115
116
  packageSize: "",
116
117
  manifestJson: "",
117
118
  requiredScopes: ""
118
- }), P(v("devportal.versionCreatedSuccess", "Version created successfully"));
119
+ }), F(y("devportal.versionCreatedSuccess", "Version created successfully"));
119
120
  } catch (e) {
120
- N(e instanceof Error ? e.message : v("devportal.versionCreateFailed", "Failed to create version"));
121
+ P(e instanceof Error ? e.message : y("devportal.versionCreateFailed", "Failed to create version"));
121
122
  }
122
- }, st = s(async (e) => {
123
+ }, st = l(async (e) => {
123
124
  let t = e.target.files?.[0];
124
125
  if (t) {
125
126
  e.target.value = "";
126
127
  try {
127
- let e = await C(t);
128
- M((n) => ({
128
+ let e = await w(t);
129
+ N((n) => ({
129
130
  ...n,
130
131
  packageUrl: e.downloadUrl,
131
132
  packageSize: String(t.size)
132
133
  }));
133
134
  } catch {}
134
135
  }
135
- }, [C]), ct = s(async (e) => {
136
+ }, [w]), ct = l(async (e) => {
136
137
  let t = e.target.files?.[0];
137
138
  if (t) {
138
139
  e.target.value = "";
139
140
  try {
140
- let e = await C(t);
141
- A((n) => n && {
141
+ let e = await w(t);
142
+ j((n) => n && {
142
143
  ...n,
143
144
  newPackageUrl: e.downloadUrl,
144
145
  newPackageSize: String(t.size)
145
146
  });
146
147
  } catch {}
147
148
  }
148
- }, [C]), lt = s((e) => {
149
+ }, [w]), lt = l((e) => {
149
150
  let t = e.target.files?.[0];
150
151
  if (!t) return;
151
152
  let n = new FileReader();
152
153
  n.onload = (e) => {
153
154
  let n = e.target?.result;
154
- typeof n == "string" && (A((e) => e && {
155
+ typeof n == "string" && (j((e) => e && {
155
156
  ...e,
156
157
  manifestJson: n
157
- }), D(t.name));
158
+ }), O(t.name));
158
159
  }, n.readAsText(t), e.target.value = "";
159
160
  }, []), ut = async () => {
160
- if (!k) return;
161
- I(null);
162
- let e = k.manifestJson.trim() !== k.originalManifestJson.trim(), t;
163
- if (e && k.manifestJson.trim()) try {
164
- t = JSON.parse(k.manifestJson);
161
+ if (!A) return;
162
+ L(null);
163
+ let e = A.manifestJson.trim() !== A.originalManifestJson.trim(), t;
164
+ if (e && A.manifestJson.trim()) try {
165
+ t = JSON.parse(A.manifestJson);
165
166
  } catch {
166
- I("Invalid JSON in manifest — please check your input.");
167
+ L("Invalid JSON in manifest — please check your input.");
167
168
  return;
168
169
  }
169
170
  let n = {};
170
- k.releaseNotes.trim() && (n.releaseNotes = k.releaseNotes), k.newPackageUrl && (n.packageUrl = k.newPackageUrl, n.packageSize = k.newPackageSize), t && (n.manifest = t);
171
+ A.releaseNotes.trim() && (n.releaseNotes = A.releaseNotes), A.changelog.trim() && (n.changelog = A.changelog), A.newPackageUrl && (n.packageUrl = A.newPackageUrl, n.packageSize = A.newPackageSize), t && (n.manifest = t);
171
172
  try {
172
173
  await Qe({ variables: {
173
- id: k.versionId,
174
+ id: A.versionId,
174
175
  input: n
175
- } }), A(null), D(null), P(v("devportal.versionUpdatedSuccess", "Version updated successfully"));
176
+ } }), j(null), O(null), F(y("devportal.versionUpdatedSuccess", "Version updated successfully"));
176
177
  } catch (e) {
177
- N(e instanceof Error ? e.message : v("devportal.versionUpdateFailed", "Failed to update version"));
178
+ P(e instanceof Error ? e.message : y("devportal.versionUpdateFailed", "Failed to update version"));
178
179
  }
179
180
  }, dt = async (e) => {
180
- N(null), P(null);
181
+ P(null), F(null);
181
182
  try {
182
- await et({ variables: { id: e } }), P(v("devportal.versionSubmittedSuccess", "Version submitted for review — you'll be notified when approved"));
183
+ await et({ variables: { id: e } }), F(y("devportal.versionSubmittedSuccess", "Version submitted for review — you'll be notified when approved"));
183
184
  } catch (e) {
184
- N(e instanceof Error ? e.message : v("devportal.versionPublishFailed", "Failed to submit version for review"));
185
+ P(e instanceof Error ? e.message : y("devportal.versionPublishFailed", "Failed to submit version for review"));
185
186
  }
186
187
  }, ft = async (e) => {
187
- N(null), P(null);
188
+ P(null), F(null);
188
189
  try {
189
- await tt({ variables: { id: e } }), P(v("devportal.versionDeprecatedSuccess", "Version deprecated successfully"));
190
+ await tt({ variables: { id: e } }), F(y("devportal.versionDeprecatedSuccess", "Version deprecated successfully"));
190
191
  } catch (e) {
191
- N(e instanceof Error ? e.message : v("devportal.versionDeprecateFailed", "Failed to deprecate version"));
192
+ P(e instanceof Error ? e.message : y("devportal.versionDeprecateFailed", "Failed to deprecate version"));
192
193
  }
193
194
  }, pt = async () => {
194
- if (!(!z || !B.trim())) {
195
- N(null), P(null);
195
+ if (!(!B || !V.trim())) {
196
+ P(null), F(null);
196
197
  try {
197
198
  await rt({ variables: {
198
- id: z.versionId,
199
- reason: B
200
- } }), P(v("devportal.versionRejectedSuccess", "Version rejected — developer has been notified")), Ve(null), V("");
199
+ id: B.versionId,
200
+ reason: V
201
+ } }), F(y("devportal.versionRejectedSuccess", "Version rejected — developer has been notified")), Be(null), Ve("");
201
202
  } catch (e) {
202
- N(e instanceof Error ? e.message : v("devportal.versionRejectFailed", "Failed to reject version"));
203
+ P(e instanceof Error ? e.message : y("devportal.versionRejectFailed", "Failed to reject version"));
203
204
  }
204
205
  }
205
- }, mt = (e) => e.status === "published" && e.isLatest ? /* @__PURE__ */ g(ve, {
206
+ }, mt = (e) => e.status === "published" && e.isLatest ? /* @__PURE__ */ _(ge, {
206
207
  size: 16,
207
208
  className: "text-status-success-text"
208
- }) : e.status === "pending_review" ? /* @__PURE__ */ g(p, {
209
+ }) : e.status === "pending_review" ? /* @__PURE__ */ _(be, {
209
210
  size: 16,
210
211
  className: "text-status-info-text"
211
- }) : e.status === "rejected" ? /* @__PURE__ */ g(Se, {
212
+ }) : e.status === "rejected" ? /* @__PURE__ */ _(xe, {
212
213
  size: 16,
213
214
  className: "text-status-error-text"
214
- }) : e.status === "draft" ? /* @__PURE__ */ g(ye, {
215
+ }) : e.status === "draft" ? /* @__PURE__ */ _(_e, {
215
216
  size: 16,
216
217
  className: "text-status-warning-text"
217
- }) : e.status === "deprecated" ? /* @__PURE__ */ g(_e, {
218
+ }) : e.status === "deprecated" ? /* @__PURE__ */ _(he, {
218
219
  size: 16,
219
220
  className: "text-text-secondary"
220
- }) : /* @__PURE__ */ g(be, {
221
+ }) : /* @__PURE__ */ _(ve, {
221
222
  size: 16,
222
223
  className: "text-accent-blue"
223
224
  }), ht = (e, t) => {
224
- R((n) => {
225
+ z((n) => {
225
226
  let r = new Set(n);
226
227
  return t ? r.add(e) : r.delete(e), r;
227
228
  });
228
229
  }, gt = (e) => {
229
- R((t) => {
230
+ z((t) => {
230
231
  let n = new Set(t);
231
232
  return X.forEach((t) => {
232
233
  e ? n.add(t.id) : n.delete(t.id);
233
234
  }), n;
234
235
  });
235
- }, _t = () => R(/* @__PURE__ */ new Set());
236
- return Je && !Y ? /* @__PURE__ */ g(oe, {
237
- title: v("devportal.versionManagement", "Version Management"),
238
- description: v("devportal.versionManagementDescription", "Manage your application versions"),
239
- backLink: `/apps/${S}`,
240
- backLabel: v("devportal.backToApplication", "Back to Application"),
241
- children: /* @__PURE__ */ g("div", {
236
+ }, _t = () => z(/* @__PURE__ */ new Set());
237
+ return Je && !Y ? /* @__PURE__ */ _(i, {
238
+ title: y("devportal.versionManagement", "Version Management"),
239
+ description: y("devportal.versionManagementDescription", "Manage your application versions"),
240
+ backLink: `/apps/${C}`,
241
+ backLabel: y("devportal.backToApplication", "Back to Application"),
242
+ children: /* @__PURE__ */ _("div", {
242
243
  className: "flex items-center justify-center py-16",
243
- children: /* @__PURE__ */ g(f, { className: "h-8 w-8 animate-spin text-text-secondary" })
244
+ children: /* @__PURE__ */ _(m, { className: "h-8 w-8 animate-spin text-text-secondary" })
244
245
  })
245
- }) : Ye && !Y ? /* @__PURE__ */ g(oe, {
246
- title: v("devportal.versionManagement", "Version Management"),
247
- description: v("devportal.versionManagementDescription", "Manage your application versions"),
248
- backLink: `/apps/${S}`,
249
- backLabel: v("devportal.backToApplication", "Back to Application"),
250
- children: /* @__PURE__ */ g(t, {
251
- icon: /* @__PURE__ */ g(d, {
246
+ }) : Ye && !Y ? /* @__PURE__ */ _(i, {
247
+ title: y("devportal.versionManagement", "Version Management"),
248
+ description: y("devportal.versionManagementDescription", "Manage your application versions"),
249
+ backLink: `/apps/${C}`,
250
+ backLabel: y("devportal.backToApplication", "Back to Application"),
251
+ children: /* @__PURE__ */ _(t, {
252
+ icon: /* @__PURE__ */ _(p, {
252
253
  size: 32,
253
254
  className: "text-status-error-text"
254
255
  }),
255
- title: v("devportal.failedToLoadVersions", "Failed to load versions"),
256
- description: Ye.message || v("devportal.versionsLoadError", "An error occurred while loading versions")
256
+ title: y("devportal.failedToLoadVersions", "Failed to load versions"),
257
+ description: Ye.message || y("devportal.versionsLoadError", "An error occurred while loading versions")
257
258
  })
258
- }) : /* @__PURE__ */ g(de, {
259
+ }) : /* @__PURE__ */ _(le, {
259
260
  authOnly: !0,
260
- children: /* @__PURE__ */ _(oe, {
261
- title: v("devportal.versionManagement", "Version Management"),
262
- description: v("devportal.versionManagementDescription", "Manage your application versions"),
263
- purpose: W ? v("devportal.versionManagementPurposeWorkflow", "Versions track releases of your workflow. Create a version for each significant change and paste the workflow definition JSON. No zip is needed — the manifest is the workflow.") : G ? v("devportal.versionManagementPurposeNode", "Versions are the releases of your node that users install. Upload a new zip whenever the node implementation changes, and update the manifest if the node's inputs, outputs, or operations change. Bump the version for any change users will see.") : v("devportal.versionManagementPurposeIntegration", "Versions track permission and webhook changes for your integration. No zip or manifest is needed — create a new version whenever you add or change required scopes so users can review and accept the updated permissions."),
264
- backLink: `/apps/${S}`,
265
- backLabel: v("devportal.backToApplication", "Back to Application"),
266
- actions: /* @__PURE__ */ _("button", {
261
+ children: /* @__PURE__ */ v(i, {
262
+ title: y("devportal.versionManagement", "Version Management"),
263
+ description: y("devportal.versionManagementDescription", "Manage your application versions"),
264
+ purpose: W ? y("devportal.versionManagementPurposeWorkflow", "Versions track releases of your workflow. Create a version for each significant change and paste the workflow definition JSON. No zip is needed — the manifest is the workflow.") : G ? y("devportal.versionManagementPurposeNode", "Versions are the releases of your node that users install. Upload a new zip whenever the node implementation changes, and update the manifest if the node's inputs, outputs, or operations change. Bump the version for any change users will see.") : y("devportal.versionManagementPurposeIntegration", "Versions track permission and webhook changes for your integration. No zip or manifest is needed — create a new version whenever you add or change required scopes so users can review and accept the updated permissions."),
265
+ backLink: `/apps/${C}`,
266
+ backLabel: y("devportal.backToApplication", "Back to Application"),
267
+ actions: /* @__PURE__ */ v("button", {
267
268
  onClick: () => {
268
- F(null), O(!0);
269
+ I(null), k(!0);
269
270
  },
270
- disabled: !y,
271
- "aria-disabled": !y,
271
+ disabled: !b,
272
+ "aria-disabled": !b,
272
273
  className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90 disabled:opacity-50",
273
- children: [/* @__PURE__ */ g(xe, { size: 16 }), v("devportal.newVersion", "New Version")]
274
+ children: [/* @__PURE__ */ _(ye, { size: 16 }), y("devportal.newVersion", "New Version")]
274
275
  }),
275
276
  children: [
276
- Le && /* @__PURE__ */ _("div", {
277
+ Ie && /* @__PURE__ */ v("div", {
277
278
  className: "rounded-lg border border-border-subtle bg-status-error-bg-subtle p-3 flex items-center gap-2 text-sm text-status-error-text",
278
279
  children: [
279
- /* @__PURE__ */ g(d, {
280
+ /* @__PURE__ */ _(p, {
280
281
  size: 16,
281
282
  className: "flex-shrink-0"
282
283
  }),
283
- Le,
284
- /* @__PURE__ */ g("button", {
285
- onClick: () => N(null),
284
+ Ie,
285
+ /* @__PURE__ */ _("button", {
286
+ onClick: () => P(null),
286
287
  className: "ml-auto text-status-error-text hover:text-status-error-text",
287
- children: v("devportal.dismiss", "Dismiss")
288
+ children: y("devportal.dismiss", "Dismiss")
288
289
  })
289
290
  ]
290
291
  }),
291
- Re && /* @__PURE__ */ _("div", {
292
+ Le && /* @__PURE__ */ v("div", {
292
293
  className: "rounded-lg border border-border-subtle bg-status-success-bg-subtle p-3 flex items-center gap-2 text-sm text-status-success-text",
293
294
  children: [
294
- /* @__PURE__ */ g(ve, {
295
+ /* @__PURE__ */ _(ge, {
295
296
  size: 16,
296
297
  className: "flex-shrink-0"
297
298
  }),
298
- Re,
299
- /* @__PURE__ */ g("button", {
300
- onClick: () => P(null),
299
+ Le,
300
+ /* @__PURE__ */ _("button", {
301
+ onClick: () => F(null),
301
302
  className: "ml-auto text-status-success-text hover:text-status-success-text",
302
- children: v("devportal.dismiss", "Dismiss")
303
+ children: y("devportal.dismiss", "Dismiss")
303
304
  })
304
305
  ]
305
306
  }),
306
- K && !q && /* @__PURE__ */ _("div", {
307
+ K && !q && /* @__PURE__ */ v("div", {
307
308
  className: "flex items-start gap-3 rounded-lg border border-status-warning-bg bg-status-warning-bg-subtle px-4 py-3 text-sm text-status-warning-text",
308
- children: [/* @__PURE__ */ g(d, {
309
+ children: [/* @__PURE__ */ _(p, {
309
310
  size: 16,
310
311
  className: "mt-0.5 shrink-0"
311
- }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
312
+ }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
312
313
  className: "font-medium",
313
314
  children: "Complete your app setup before submitting for review"
314
- }), /* @__PURE__ */ g("ul", {
315
+ }), /* @__PURE__ */ _("ul", {
315
316
  className: "mt-1 list-disc pl-4 text-xs opacity-80",
316
- children: J.map((e) => /* @__PURE__ */ g("li", { children: e }, e))
317
+ children: J.map((e) => /* @__PURE__ */ _("li", { children: e }, e))
317
318
  })] })]
318
319
  }),
319
- K && K.status !== "PUBLISHED" && X.some((e) => e.status === "draft") && /* @__PURE__ */ _("div", {
320
+ K && K.status !== "PUBLISHED" && X.some((e) => e.status === "draft") && /* @__PURE__ */ v("div", {
320
321
  className: "flex items-start gap-3 rounded-lg border border-status-info-bg bg-status-info-bg-subtle px-4 py-3 text-sm text-status-info-text",
321
- children: [/* @__PURE__ */ g(p, {
322
+ children: [/* @__PURE__ */ _(be, {
322
323
  size: 16,
323
324
  className: "mt-0.5 shrink-0"
324
- }), /* @__PURE__ */ _("div", { children: [/* @__PURE__ */ g("p", {
325
+ }), /* @__PURE__ */ v("div", { children: [/* @__PURE__ */ _("p", {
325
326
  className: "font-medium",
326
327
  children: "Ready to submit? Go to the Submit tab"
327
- }), /* @__PURE__ */ _("p", {
328
+ }), /* @__PURE__ */ v("p", {
328
329
  className: "mt-1 text-xs opacity-80",
329
330
  children: [
330
331
  "For your first submission the app and its version are reviewed together. Head to the ",
331
- /* @__PURE__ */ g("strong", { children: "Submit" }),
332
+ /* @__PURE__ */ _("strong", { children: "Submit" }),
332
333
  " tab — your draft version will be included automatically. The per-version \"Submit for Review\" button is only for new versions after the app is already live in the marketplace."
333
334
  ]
334
335
  })] })]
335
336
  }),
336
- X.length > 0 && /* @__PURE__ */ g("div", {
337
+ X.length > 0 && /* @__PURE__ */ _("div", {
337
338
  className: "rounded-card border border-border-seam bg-bg-surface p-4",
338
- children: /* @__PURE__ */ _("div", {
339
+ children: /* @__PURE__ */ v("div", {
339
340
  className: "flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between",
340
- children: [/* @__PURE__ */ _("div", {
341
+ children: [/* @__PURE__ */ v("div", {
341
342
  className: "flex flex-wrap items-center gap-3",
342
- children: [/* @__PURE__ */ _("div", {
343
+ children: [/* @__PURE__ */ v("div", {
343
344
  className: "flex items-center gap-2",
344
- children: [/* @__PURE__ */ g(i, {
345
+ children: [/* @__PURE__ */ _(a, {
345
346
  checked: it,
346
347
  indeterminate: at,
347
348
  onChange: gt,
348
349
  ariaLabel: "Select all visible versions"
349
- }), /* @__PURE__ */ g("span", {
350
+ }), /* @__PURE__ */ _("span", {
350
351
  className: "text-sm font-medium",
351
- children: v("devportal.selectAllVisible", "Select all visible")
352
+ children: y("devportal.selectAllVisible", "Select all visible")
352
353
  })]
353
- }), L.size > 0 && /* @__PURE__ */ g("button", {
354
+ }), R.size > 0 && /* @__PURE__ */ _("button", {
354
355
  onClick: _t,
355
356
  className: "text-sm text-text-secondary hover:text-text-primary",
356
- children: v("devportal.clearSelection", "Clear selection")
357
+ children: y("devportal.clearSelection", "Clear selection")
357
358
  })]
358
- }), /* @__PURE__ */ _("div", {
359
+ }), /* @__PURE__ */ v("div", {
359
360
  className: "flex flex-wrap items-center gap-2",
360
361
  children: [
361
- /* @__PURE__ */ _("span", {
362
+ /* @__PURE__ */ v("span", {
362
363
  className: "rounded-full bg-bg-sunken px-3 py-1 text-sm font-medium text-text-secondary",
363
- children: [L.size, " selected"]
364
+ children: [R.size, " selected"]
364
365
  }),
365
- /* @__PURE__ */ _("button", {
366
+ /* @__PURE__ */ v("button", {
366
367
  onClick: () => H("publish"),
367
- disabled: Q.length === 0 || !b || !q,
368
- "aria-disabled": !b || !q,
368
+ disabled: Q.length === 0 || !x || !q,
369
+ "aria-disabled": !x || !q,
369
370
  title: q ? void 0 : J.join(" · "),
370
371
  className: "rounded-md border border-status-success-bg px-3 py-2 text-sm font-medium text-status-success-text hover:bg-status-success-bg-subtle disabled:cursor-not-allowed disabled:opacity-50",
371
- children: [v("devportal.submitForReview", "Submit for Review"), Q.length > 0 ? ` (${Q.length})` : ""]
372
+ children: [y("devportal.submitForReview", "Submit for Review"), Q.length > 0 ? ` (${Q.length})` : ""]
372
373
  }),
373
- /* @__PURE__ */ _("button", {
374
+ /* @__PURE__ */ v("button", {
374
375
  onClick: () => H("deprecate"),
375
- disabled: $.length === 0 || !x,
376
- "aria-disabled": !x,
376
+ disabled: $.length === 0 || !S,
377
+ "aria-disabled": !S,
377
378
  className: "rounded-md border border-status-warning-bg px-3 py-2 text-sm font-medium text-status-warning-text hover:bg-status-warning-bg-subtle disabled:cursor-not-allowed disabled:opacity-50",
378
- children: [v("devportal.deprecateSelected", "Deprecate Selected"), $.length > 0 ? ` (${$.length})` : ""]
379
+ children: [y("devportal.deprecateSelected", "Deprecate Selected"), $.length > 0 ? ` (${$.length})` : ""]
379
380
  })
380
381
  ]
381
382
  })]
382
383
  })
383
384
  }),
384
- X.length > 0 ? /* @__PURE__ */ g(ce, {
385
+ X.length > 0 ? /* @__PURE__ */ _(se, {
385
386
  data: X,
386
387
  keyField: "id",
387
388
  columns: [
388
389
  {
389
390
  key: "select",
390
- header: /* @__PURE__ */ g(i, {
391
+ header: /* @__PURE__ */ _(a, {
391
392
  checked: it,
392
393
  indeterminate: at,
393
394
  onChange: gt,
394
395
  ariaLabel: "Select all visible versions"
395
396
  }),
396
397
  className: "w-12",
397
- render: (e) => /* @__PURE__ */ g("div", {
398
+ render: (e) => /* @__PURE__ */ _("div", {
398
399
  onClick: (e) => e.stopPropagation(),
399
- children: /* @__PURE__ */ g(i, {
400
- checked: L.has(e.id),
400
+ children: /* @__PURE__ */ _(a, {
401
+ checked: R.has(e.id),
401
402
  onChange: (t) => ht(e.id, t),
402
403
  ariaLabel: `Select version ${e.version}`
403
404
  })
@@ -405,46 +406,46 @@ var we = () => {
405
406
  },
406
407
  {
407
408
  key: "version",
408
- header: v("devportal.version", "Version"),
409
- render: (e) => /* @__PURE__ */ _("div", {
409
+ header: y("devportal.version", "Version"),
410
+ render: (e) => /* @__PURE__ */ v("div", {
410
411
  className: "flex items-center gap-2",
411
412
  children: [
412
413
  mt(e),
413
- /* @__PURE__ */ g("span", {
414
+ /* @__PURE__ */ _("span", {
414
415
  className: "font-mono font-medium",
415
416
  children: e.version
416
417
  }),
417
- e.isLatest && /* @__PURE__ */ g("span", {
418
+ e.isLatest && /* @__PURE__ */ _("span", {
418
419
  className: "rounded-full bg-status-success-bg-subtle px-2 py-0.5 text-xs text-status-success-text",
419
- children: v("devportal.latest", "Latest")
420
+ children: y("devportal.latest", "Latest")
420
421
  }),
421
- !e.isStable && /* @__PURE__ */ g("span", {
422
+ !e.isStable && /* @__PURE__ */ _("span", {
422
423
  className: "rounded-full bg-status-warning-bg-subtle px-2 py-0.5 text-xs text-status-warning-text",
423
- children: v("devportal.beta", "Beta")
424
+ children: y("devportal.beta", "Beta")
424
425
  })
425
426
  ]
426
427
  })
427
428
  },
428
429
  {
429
430
  key: "releaseNotes",
430
- header: v("devportal.releaseNotes", "Release Notes"),
431
- render: (e) => /* @__PURE__ */ g("p", {
431
+ header: y("devportal.releaseNotes", "Release Notes"),
432
+ render: (e) => /* @__PURE__ */ _("p", {
432
433
  className: "max-w-md truncate text-sm text-text-secondary",
433
- children: e.releaseNotes || v("devportal.noReleaseNotes", "No release notes")
434
+ children: e.releaseNotes || y("devportal.noReleaseNotes", "No release notes")
434
435
  })
435
436
  },
436
437
  {
437
438
  key: "status",
438
- header: v("devportal.status", "Status"),
439
- render: (e) => /* @__PURE__ */ _("div", {
439
+ header: y("devportal.status", "Status"),
440
+ render: (e) => /* @__PURE__ */ v("div", {
440
441
  className: "space-y-1",
441
442
  children: [
442
- /* @__PURE__ */ g(se, { status: e.status === "pending_review" ? "In Review" : e.status }),
443
- e.status === "pending_review" && /* @__PURE__ */ g("p", {
443
+ /* @__PURE__ */ _(oe, { status: e.status === "pending_review" ? "In Review" : e.status }),
444
+ e.status === "pending_review" && /* @__PURE__ */ _("p", {
444
445
  className: "text-xs text-status-info-text",
445
446
  children: "Awaiting platform review"
446
447
  }),
447
- e.status === "rejected" && e.reviewNotes && /* @__PURE__ */ g("p", {
448
+ e.status === "rejected" && e.reviewNotes && /* @__PURE__ */ _("p", {
448
449
  className: "text-xs text-status-error-text max-w-xs",
449
450
  children: e.reviewNotes
450
451
  })
@@ -453,21 +454,21 @@ var we = () => {
453
454
  },
454
455
  {
455
456
  key: "publishedAt",
456
- header: v("devportal.published", "Published"),
457
- render: (e) => e.publishedAt ? pe(new Date(e.publishedAt), "MMM d, yyyy") : "-"
457
+ header: y("devportal.published", "Published"),
458
+ render: (e) => e.publishedAt ? de(new Date(e.publishedAt), "MMM d, yyyy") : "-"
458
459
  },
459
460
  {
460
461
  key: "actions",
461
462
  header: "",
462
463
  className: "w-48",
463
- render: (e) => /* @__PURE__ */ _("div", {
464
+ render: (e) => /* @__PURE__ */ v("div", {
464
465
  className: "flex flex-wrap gap-2",
465
466
  children: [
466
- (e.status === "draft" || e.status === "rejected") && y && /* @__PURE__ */ g("button", {
467
+ (e.status === "draft" || e.status === "rejected") && b && /* @__PURE__ */ _("button", {
467
468
  className: "inline-flex items-center gap-1 text-xs text-text-secondary hover:text-text-primary hover:underline",
468
469
  onClick: () => {
469
470
  let t = e.manifest ? JSON.stringify(e.manifest, null, 2) : "";
470
- A({
471
+ j({
471
472
  versionId: e.id,
472
473
  version: e.version,
473
474
  hasExistingZip: !!e.packageUrl,
@@ -475,419 +476,430 @@ var we = () => {
475
476
  newPackageSize: "",
476
477
  manifestJson: t,
477
478
  originalManifestJson: t,
478
- releaseNotes: e.releaseNotes ?? ""
479
- }), D(null), I(null);
479
+ releaseNotes: e.releaseNotes ?? "",
480
+ changelog: e.changelog ?? ""
481
+ }), O(null), L(null);
480
482
  },
481
483
  children: "Edit"
482
484
  }),
483
- (e.status === "draft" || e.status === "rejected") && K?.status === "PUBLISHED" && /* @__PURE__ */ _("button", {
485
+ (e.status === "draft" || e.status === "rejected") && K?.status === "PUBLISHED" && /* @__PURE__ */ v("button", {
484
486
  className: "inline-flex items-center gap-1 text-xs text-primary hover:underline disabled:opacity-50 disabled:cursor-not-allowed",
485
- disabled: !b || !q,
486
- "aria-disabled": !b || !q,
487
+ disabled: !x || !q,
488
+ "aria-disabled": !x || !q,
487
489
  title: q ? void 0 : J.join(" · "),
488
490
  onClick: () => dt(e.id),
489
- children: [/* @__PURE__ */ g(p, { size: 11 }), v("devportal.submitForReview", "Submit for Review")]
491
+ children: [/* @__PURE__ */ _(be, { size: 11 }), y("devportal.submitForReview", "Submit for Review")]
490
492
  }),
491
- e.status === "published" && !e.isLatest && /* @__PURE__ */ g("button", {
493
+ e.status === "published" && !e.isLatest && /* @__PURE__ */ _("button", {
492
494
  className: "text-xs text-status-warning-text hover:underline disabled:opacity-50",
493
- disabled: !x,
494
- "aria-disabled": !x,
495
+ disabled: !S,
496
+ "aria-disabled": !S,
495
497
  onClick: () => ft(e.id),
496
- children: v("devportal.deprecate", "Deprecate")
498
+ children: y("devportal.deprecate", "Deprecate")
497
499
  })
498
500
  ]
499
501
  })
500
502
  }
501
503
  ]
502
- }) : /* @__PURE__ */ g(t, {
504
+ }) : /* @__PURE__ */ _(t, {
503
505
  illustration: "empty-data",
504
- title: v("devportal.noVersionsYet", "No versions yet"),
505
- description: v("devportal.noVersionsYetDescription", "Create your first version to start distributing your app"),
506
- action: /* @__PURE__ */ _("button", {
506
+ title: y("devportal.noVersionsYet", "No versions yet"),
507
+ description: y("devportal.noVersionsYetDescription", "Create your first version to start distributing your app"),
508
+ action: /* @__PURE__ */ v("button", {
507
509
  onClick: () => {
508
- F(null), O(!0);
510
+ I(null), k(!0);
509
511
  },
510
512
  className: "inline-flex items-center gap-2 rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg/90",
511
- children: [/* @__PURE__ */ g(xe, { size: 16 }), v("devportal.createVersion", "Create Version")]
513
+ children: [/* @__PURE__ */ _(ye, { size: 16 }), y("devportal.createVersion", "Create Version")]
512
514
  })
513
515
  }),
514
- Ie && /* @__PURE__ */ g(a, {
515
- open: Ie,
516
+ Fe && /* @__PURE__ */ _(o, {
517
+ open: Fe,
516
518
  onOpenChange: (e) => {
517
- O(e), e || F(null);
519
+ k(e), e || I(null);
518
520
  },
519
521
  onConfirm: ot,
520
- title: v("devportal.createNewVersion", "Create New Version"),
521
- confirmLabel: Ze ? v("devportal.creating", "Creating...") : v("devportal.createVersion", "Create Version"),
522
- children: /* @__PURE__ */ _("div", {
522
+ title: y("devportal.createNewVersion", "Create New Version"),
523
+ confirmLabel: Ze ? y("devportal.creating", "Creating...") : y("devportal.createVersion", "Create Version"),
524
+ children: /* @__PURE__ */ v("div", {
523
525
  className: "space-y-4",
524
526
  children: [
525
- ze && /* @__PURE__ */ _("div", {
527
+ Re && /* @__PURE__ */ v("div", {
526
528
  className: "rounded-lg border border-status-error-bg bg-status-error-bg-subtle p-3 flex items-center gap-2 text-sm text-status-error-text",
527
- children: [/* @__PURE__ */ g(d, {
529
+ children: [/* @__PURE__ */ _(p, {
528
530
  size: 14,
529
531
  className: "flex-shrink-0"
530
- }), ze]
532
+ }), Re]
531
533
  }),
532
- /* @__PURE__ */ g(le, {
533
- label: v("devportal.versionNumber", "Version Number"),
534
- value: j.version,
535
- onChange: (e) => M({
536
- ...j,
534
+ /* @__PURE__ */ _(ce, {
535
+ label: y("devportal.versionNumber", "Version Number"),
536
+ value: M.version,
537
+ onChange: (e) => N({
538
+ ...M,
537
539
  version: e.target.value
538
540
  }),
539
541
  placeholder: "e.g., 2.2.0",
540
- hint: v("devportal.versionHint", "Use semantic versioning (major.minor.patch)"),
542
+ hint: y("devportal.versionHint", "Use semantic versioning (major.minor.patch)"),
541
543
  required: !0
542
544
  }),
543
- W && /* @__PURE__ */ _("div", {
545
+ W && /* @__PURE__ */ v("div", {
544
546
  className: "space-y-1",
545
547
  children: [
546
- /* @__PURE__ */ _("label", {
548
+ /* @__PURE__ */ v("label", {
547
549
  className: "text-sm font-medium",
548
550
  children: [
549
551
  "Workflow Definition (JSON)",
550
552
  " ",
551
- /* @__PURE__ */ g("span", {
553
+ /* @__PURE__ */ _("span", {
552
554
  className: "text-status-error-text",
553
555
  children: "*"
554
556
  })
555
557
  ]
556
558
  }),
557
- /* @__PURE__ */ g("textarea", {
559
+ /* @__PURE__ */ _("textarea", {
558
560
  rows: 10,
559
561
  required: !0,
560
562
  placeholder: "{\n \"nodes\": [],\n \"edges\": []\n}",
561
- value: j.manifestJson,
562
- onChange: (e) => M({
563
- ...j,
563
+ value: M.manifestJson,
564
+ onChange: (e) => N({
565
+ ...M,
564
566
  manifestJson: e.target.value
565
567
  }),
566
568
  className: "w-full rounded-md border bg-transparent px-3 py-2 text-xs font-mono resize-y placeholder:text-text-secondary focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)]"
567
569
  }),
568
- /* @__PURE__ */ _("p", {
570
+ /* @__PURE__ */ v("p", {
569
571
  className: "text-xs text-text-secondary",
570
572
  children: [
571
573
  "Paste the full ",
572
- /* @__PURE__ */ g("code", { children: "{nodes, edges}" }),
574
+ /* @__PURE__ */ _("code", { children: "{nodes, edges}" }),
573
575
  " JSON. Saved as this version's manifest — no zip needed."
574
576
  ]
575
577
  })
576
578
  ]
577
579
  }),
578
- G && /* @__PURE__ */ _("div", {
580
+ G && /* @__PURE__ */ v("div", {
579
581
  className: "space-y-1",
580
582
  children: [
581
- /* @__PURE__ */ _("label", {
583
+ /* @__PURE__ */ v("label", {
582
584
  className: "text-sm font-medium",
583
585
  children: [
584
586
  "Package (.zip)",
585
587
  " ",
586
- /* @__PURE__ */ g("span", {
588
+ /* @__PURE__ */ _("span", {
587
589
  className: "text-status-error-text",
588
590
  children: "*"
589
591
  })
590
592
  ]
591
593
  }),
592
- /* @__PURE__ */ _("div", {
594
+ /* @__PURE__ */ v("div", {
593
595
  className: "flex gap-2 items-center",
594
596
  children: [
595
- /* @__PURE__ */ g("input", {
596
- ref: Ae,
597
+ /* @__PURE__ */ _("input", {
598
+ ref: ke,
597
599
  type: "file",
598
600
  accept: ".zip",
599
601
  className: "hidden",
600
602
  onChange: st
601
603
  }),
602
- /* @__PURE__ */ g("button", {
604
+ /* @__PURE__ */ _("button", {
603
605
  type: "button",
604
- disabled: w,
605
- onClick: () => Ae.current?.click(),
606
+ disabled: T,
607
+ onClick: () => ke.current?.click(),
606
608
  className: "inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50",
607
- children: w ? /* @__PURE__ */ _(h, { children: [
608
- /* @__PURE__ */ g(f, {
609
+ children: T ? /* @__PURE__ */ v(g, { children: [
610
+ /* @__PURE__ */ _(m, {
609
611
  size: 14,
610
612
  className: "animate-spin"
611
613
  }),
612
614
  " ",
613
615
  "Uploading… ",
614
- ke,
616
+ Oe,
615
617
  "%"
616
- ] }) : /* @__PURE__ */ _(h, { children: [
617
- /* @__PURE__ */ g(m, { size: 14 }),
618
+ ] }) : /* @__PURE__ */ v(g, { children: [
619
+ /* @__PURE__ */ _(h, { size: 14 }),
618
620
  " ",
619
- j.packageUrl ? "Replace zip" : "Upload zip"
621
+ M.packageUrl ? "Replace zip" : "Upload zip"
620
622
  ] })
621
623
  }),
622
- j.packageUrl && !w && /* @__PURE__ */ g("span", {
624
+ M.packageUrl && !T && /* @__PURE__ */ _("span", {
623
625
  className: "text-xs text-status-success-text",
624
626
  children: "✓ Uploaded"
625
627
  })
626
628
  ]
627
629
  }),
628
- T && /* @__PURE__ */ g("p", {
630
+ E && /* @__PURE__ */ _("p", {
629
631
  className: "text-xs text-status-error-text",
630
- children: T
632
+ children: E
631
633
  }),
632
- /* @__PURE__ */ g("p", {
634
+ /* @__PURE__ */ _("p", {
633
635
  className: "text-xs text-text-tertiary",
634
636
  children: "The zip is the node executable. Upload it before publishing — users install exactly this artifact."
635
637
  })
636
638
  ]
637
639
  }),
638
- G && /* @__PURE__ */ _("div", {
640
+ G && /* @__PURE__ */ v("div", {
639
641
  className: "space-y-2",
640
642
  children: [
641
- /* @__PURE__ */ _("div", {
643
+ /* @__PURE__ */ v("div", {
642
644
  className: "flex items-center justify-between gap-2 flex-wrap",
643
- children: [/* @__PURE__ */ _("label", {
645
+ children: [/* @__PURE__ */ v("label", {
644
646
  className: "text-sm font-medium",
645
647
  children: [
646
648
  "manifest.json",
647
649
  " ",
648
- /* @__PURE__ */ g("span", {
650
+ /* @__PURE__ */ _("span", {
649
651
  className: "text-status-error-text",
650
652
  children: "*"
651
653
  })
652
654
  ]
653
- }), /* @__PURE__ */ _("div", {
655
+ }), /* @__PURE__ */ v("div", {
654
656
  className: "flex items-center gap-2",
655
657
  children: [
656
- Pe && /* @__PURE__ */ _("span", {
658
+ Ne && /* @__PURE__ */ v("span", {
657
659
  className: "text-xs text-status-success-text",
658
- children: ["✓ ", Pe]
660
+ children: ["✓ ", Ne]
659
661
  }),
660
- /* @__PURE__ */ g("input", {
661
- ref: je,
662
+ /* @__PURE__ */ _("input", {
663
+ ref: Ae,
662
664
  type: "file",
663
665
  accept: ".json,application/json",
664
666
  className: "hidden",
665
667
  onChange: He
666
668
  }),
667
- /* @__PURE__ */ _("button", {
669
+ /* @__PURE__ */ v("button", {
668
670
  type: "button",
669
- onClick: () => je.current?.click(),
671
+ onClick: () => Ae.current?.click(),
670
672
  className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-2.5 py-1 text-xs font-medium hover:bg-bg-sunken transition-colors",
671
- children: [/* @__PURE__ */ g(m, { size: 12 }), "Upload manifest.json"]
673
+ children: [/* @__PURE__ */ _(h, { size: 12 }), "Upload manifest.json"]
672
674
  })
673
675
  ]
674
676
  })]
675
677
  }),
676
- /* @__PURE__ */ g("textarea", {
678
+ /* @__PURE__ */ _("textarea", {
677
679
  rows: 5,
678
680
  placeholder: "{\n \"manifestVersion\": \"1.0\",\n \"itemType\": \"node\",\n \"identity\": { \"version\": \"1.0.0\", \"displayName\": \"My Node\" }\n}",
679
- value: j.manifestJson,
681
+ value: M.manifestJson,
680
682
  onChange: (e) => {
681
- E(null), M({
682
- ...j,
683
+ D(null), N({
684
+ ...M,
683
685
  manifestJson: e.target.value
684
686
  });
685
687
  },
686
688
  className: "w-full rounded-md border bg-transparent px-3 py-2 text-xs font-mono resize-y placeholder:text-text-secondary focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)]"
687
689
  }),
688
- /* @__PURE__ */ _("p", {
690
+ /* @__PURE__ */ v("p", {
689
691
  className: "text-xs text-text-tertiary",
690
692
  children: [
691
693
  "Upload or paste your ",
692
- /* @__PURE__ */ g("code", { children: "manifest.json" }),
694
+ /* @__PURE__ */ _("code", { children: "manifest.json" }),
693
695
  " — required so the platform knows your node's inputs, outputs, and operations. Not extracted from the zip automatically."
694
696
  ]
695
697
  })
696
698
  ]
697
699
  }),
698
- We && /* @__PURE__ */ _("div", {
700
+ We && /* @__PURE__ */ v("div", {
699
701
  className: "space-y-1",
700
702
  children: [
701
- /* @__PURE__ */ _("label", {
703
+ /* @__PURE__ */ v("label", {
702
704
  className: "text-sm font-medium",
703
705
  children: [
704
706
  "Required scopes",
705
707
  " ",
706
- /* @__PURE__ */ g("span", {
708
+ /* @__PURE__ */ _("span", {
707
709
  className: "text-xs font-normal text-text-secondary",
708
710
  children: "(optional)"
709
711
  })
710
712
  ]
711
713
  }),
712
- /* @__PURE__ */ g("input", {
714
+ /* @__PURE__ */ _("input", {
713
715
  type: "text",
714
- value: j.requiredScopes,
715
- onChange: (e) => M({
716
- ...j,
716
+ value: M.requiredScopes,
717
+ onChange: (e) => N({
718
+ ...M,
717
719
  requiredScopes: e.target.value
718
720
  }),
719
721
  placeholder: "e.g. read:contacts, write:messages",
720
722
  className: "w-full rounded-md border bg-transparent px-3 py-2 text-sm placeholder:text-text-secondary focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)]"
721
723
  }),
722
- /* @__PURE__ */ g("p", {
724
+ /* @__PURE__ */ _("p", {
723
725
  className: "text-xs text-text-tertiary",
724
726
  children: "Comma-separated. List every permission this version needs — users will be prompted to accept any new or changed scopes on update."
725
727
  })
726
728
  ]
727
729
  }),
728
- /* @__PURE__ */ g(ue, {
729
- label: v("devportal.releaseNotes", "Release Notes"),
730
- value: j.releaseNotes,
731
- onChange: (e) => M({
732
- ...j,
733
- releaseNotes: e.target.value
730
+ /* @__PURE__ */ _(s, {
731
+ label: y("devportal.releaseNotes", "Release Notes"),
732
+ value: M.releaseNotes,
733
+ onChange: (e) => N({
734
+ ...M,
735
+ releaseNotes: e
734
736
  }),
735
- placeholder: v("devportal.releaseNotesPlaceholder", "What changed in this release?"),
736
- rows: 2
737
+ placeholder: y("devportal.releaseNotesPlaceholder", "What changed in this release?"),
738
+ rows: 3
739
+ }),
740
+ /* @__PURE__ */ _(s, {
741
+ label: y("devportal.changelog", "Changelog"),
742
+ value: M.changelog,
743
+ onChange: (e) => N({
744
+ ...M,
745
+ changelog: e
746
+ }),
747
+ placeholder: y("devportal.changelogPlaceholder", "Detailed changelog for this version..."),
748
+ rows: 3
737
749
  })
738
750
  ]
739
751
  })
740
752
  }),
741
- z && /* @__PURE__ */ g(a, {
742
- open: !!z,
753
+ B && /* @__PURE__ */ _(o, {
754
+ open: !!B,
743
755
  onOpenChange: (e) => {
744
- e || (Ve(null), V(""));
756
+ e || (Be(null), Ve(""));
745
757
  },
746
758
  onConfirm: pt,
747
- title: `Reject version ${z.version}`,
759
+ title: `Reject version ${B.version}`,
748
760
  confirmLabel: "Reject Version",
749
- cancelLabel: v("devportal.cancel", "Cancel"),
761
+ cancelLabel: y("devportal.cancel", "Cancel"),
750
762
  variant: "danger",
751
- children: /* @__PURE__ */ _("div", {
763
+ children: /* @__PURE__ */ v("div", {
752
764
  className: "space-y-3",
753
- children: [/* @__PURE__ */ g("p", {
765
+ children: [/* @__PURE__ */ _("p", {
754
766
  className: "text-sm text-text-secondary",
755
767
  children: "The developer will be notified and can fix and resubmit. Please provide a clear reason."
756
- }), /* @__PURE__ */ _("div", {
768
+ }), /* @__PURE__ */ v("div", {
757
769
  className: "space-y-1",
758
- children: [/* @__PURE__ */ _("label", {
770
+ children: [/* @__PURE__ */ v("label", {
759
771
  className: "text-sm font-medium",
760
772
  children: [
761
773
  "Rejection reason",
762
774
  " ",
763
- /* @__PURE__ */ g("span", {
775
+ /* @__PURE__ */ _("span", {
764
776
  className: "text-status-error-text",
765
777
  children: "*"
766
778
  })
767
779
  ]
768
- }), /* @__PURE__ */ g("textarea", {
780
+ }), /* @__PURE__ */ _("textarea", {
769
781
  rows: 3,
770
- value: B,
771
- onChange: (e) => V(e.target.value),
782
+ value: V,
783
+ onChange: (e) => Ve(e.target.value),
772
784
  placeholder: "e.g. Manifest contains disallowed network calls to external domains...",
773
785
  className: "w-full rounded-md border bg-transparent px-3 py-2 text-sm placeholder:text-text-secondary focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)]"
774
786
  })]
775
787
  })]
776
788
  })
777
789
  }),
778
- k && /* @__PURE__ */ g(a, {
779
- open: !!k,
790
+ A && /* @__PURE__ */ _(o, {
791
+ open: !!A,
780
792
  onOpenChange: (e) => {
781
- e || (A(null), D(null), I(null));
793
+ e || (j(null), O(null), L(null));
782
794
  },
783
795
  onConfirm: ut,
784
- title: `Edit Version ${k.version}`,
796
+ title: `Edit Version ${A.version}`,
785
797
  confirmLabel: $e ? "Saving…" : "Save Changes",
786
- children: /* @__PURE__ */ _("div", {
798
+ children: /* @__PURE__ */ v("div", {
787
799
  className: "space-y-4",
788
800
  children: [
789
- Be && /* @__PURE__ */ _("div", {
801
+ ze && /* @__PURE__ */ v("div", {
790
802
  className: "rounded-lg border border-status-error-bg bg-status-error-bg-subtle p-3 flex items-center gap-2 text-sm text-status-error-text",
791
- children: [/* @__PURE__ */ g(d, {
803
+ children: [/* @__PURE__ */ _(p, {
792
804
  size: 14,
793
805
  className: "flex-shrink-0"
794
- }), Be]
806
+ }), ze]
795
807
  }),
796
- /* @__PURE__ */ g("div", {
808
+ /* @__PURE__ */ _("div", {
797
809
  className: "rounded-lg border border-status-info-bg bg-status-info-bg-subtle px-3 py-2 text-xs text-status-info-text",
798
810
  children: "You can fix the zip, manifest, or release notes before submitting for review. Once submitted for review these fields are locked."
799
811
  }),
800
- G && /* @__PURE__ */ _("div", {
812
+ G && /* @__PURE__ */ v("div", {
801
813
  className: "space-y-1",
802
814
  children: [
803
- /* @__PURE__ */ g("label", {
815
+ /* @__PURE__ */ _("label", {
804
816
  className: "text-sm font-medium",
805
817
  children: "Package (.zip)"
806
818
  }),
807
- /* @__PURE__ */ _("div", {
819
+ /* @__PURE__ */ v("div", {
808
820
  className: "flex gap-2 items-center",
809
821
  children: [
810
- /* @__PURE__ */ g("input", {
811
- ref: Me,
822
+ /* @__PURE__ */ _("input", {
823
+ ref: je,
812
824
  type: "file",
813
825
  accept: ".zip",
814
826
  className: "hidden",
815
827
  onChange: ct
816
828
  }),
817
- /* @__PURE__ */ g("button", {
829
+ /* @__PURE__ */ _("button", {
818
830
  type: "button",
819
- disabled: w,
820
- onClick: () => Me.current?.click(),
831
+ disabled: T,
832
+ onClick: () => je.current?.click(),
821
833
  className: "inline-flex items-center gap-1.5 rounded-md border px-3 py-1.5 text-sm font-medium hover:bg-bg-sunken transition-colors disabled:opacity-50",
822
- children: w ? /* @__PURE__ */ _(h, { children: [
823
- /* @__PURE__ */ g(f, {
834
+ children: T ? /* @__PURE__ */ v(g, { children: [
835
+ /* @__PURE__ */ _(m, {
824
836
  size: 14,
825
837
  className: "animate-spin"
826
838
  }),
827
839
  " ",
828
840
  "Uploading… ",
829
- ke,
841
+ Oe,
830
842
  "%"
831
- ] }) : /* @__PURE__ */ _(h, { children: [/* @__PURE__ */ g(m, { size: 14 }), k.newPackageUrl ? "Replace zip again" : k.hasExistingZip ? "Replace zip" : "Upload zip"] })
843
+ ] }) : /* @__PURE__ */ v(g, { children: [/* @__PURE__ */ _(h, { size: 14 }), A.newPackageUrl ? "Replace zip again" : A.hasExistingZip ? "Replace zip" : "Upload zip"] })
832
844
  }),
833
- k.newPackageUrl && !w && /* @__PURE__ */ g("span", {
845
+ A.newPackageUrl && !T && /* @__PURE__ */ _("span", {
834
846
  className: "text-xs text-status-success-text",
835
847
  children: "✓ New zip ready"
836
848
  }),
837
- !k.newPackageUrl && k.hasExistingZip && /* @__PURE__ */ g("span", {
849
+ !A.newPackageUrl && A.hasExistingZip && /* @__PURE__ */ _("span", {
838
850
  className: "text-xs text-text-secondary",
839
851
  children: "Current zip kept"
840
852
  })
841
853
  ]
842
854
  }),
843
- T && /* @__PURE__ */ g("p", {
855
+ E && /* @__PURE__ */ _("p", {
844
856
  className: "text-xs text-status-error-text",
845
- children: T
857
+ children: E
846
858
  })
847
859
  ]
848
860
  }),
849
- G && /* @__PURE__ */ _("div", {
861
+ G && /* @__PURE__ */ v("div", {
850
862
  className: "space-y-2",
851
- children: [/* @__PURE__ */ _("div", {
863
+ children: [/* @__PURE__ */ v("div", {
852
864
  className: "flex items-center justify-between gap-2 flex-wrap",
853
- children: [/* @__PURE__ */ _("label", {
865
+ children: [/* @__PURE__ */ v("label", {
854
866
  className: "text-sm font-medium",
855
867
  children: [
856
868
  "manifest.json",
857
869
  " ",
858
- /* @__PURE__ */ g("span", {
870
+ /* @__PURE__ */ _("span", {
859
871
  className: "text-xs font-normal text-text-secondary",
860
872
  children: "(edit below or upload a new file)"
861
873
  })
862
874
  ]
863
- }), /* @__PURE__ */ _("div", {
875
+ }), /* @__PURE__ */ v("div", {
864
876
  className: "flex items-center gap-2",
865
877
  children: [
866
- Fe && /* @__PURE__ */ _("span", {
878
+ Pe && /* @__PURE__ */ v("span", {
867
879
  className: "text-xs text-status-success-text",
868
- children: ["✓ ", Fe]
880
+ children: ["✓ ", Pe]
869
881
  }),
870
- /* @__PURE__ */ g("input", {
871
- ref: Ne,
882
+ /* @__PURE__ */ _("input", {
883
+ ref: Me,
872
884
  type: "file",
873
885
  accept: ".json,application/json",
874
886
  className: "hidden",
875
887
  onChange: lt
876
888
  }),
877
- /* @__PURE__ */ _("button", {
889
+ /* @__PURE__ */ v("button", {
878
890
  type: "button",
879
- onClick: () => Ne.current?.click(),
891
+ onClick: () => Me.current?.click(),
880
892
  className: "inline-flex items-center gap-1.5 rounded-md border border-border-subtle px-2.5 py-1 text-xs font-medium hover:bg-bg-sunken transition-colors",
881
- children: [/* @__PURE__ */ g(m, { size: 12 }), " Upload manifest.json"]
893
+ children: [/* @__PURE__ */ _(h, { size: 12 }), " Upload manifest.json"]
882
894
  })
883
895
  ]
884
896
  })]
885
- }), /* @__PURE__ */ g("textarea", {
897
+ }), /* @__PURE__ */ _("textarea", {
886
898
  rows: 5,
887
899
  placeholder: "{\n \"manifestVersion\": \"1.0\",\n \"itemType\": \"node\",\n \"identity\": { \"version\": \"1.0.0\", \"displayName\": \"My Node\" }\n}",
888
- value: k.manifestJson,
900
+ value: A.manifestJson,
889
901
  onChange: (e) => {
890
- D(null), A((t) => t && {
902
+ O(null), j((t) => t && {
891
903
  ...t,
892
904
  manifestJson: e.target.value
893
905
  });
@@ -895,80 +907,84 @@ var we = () => {
895
907
  className: "w-full rounded-md border bg-transparent px-3 py-2 text-xs font-mono resize-y placeholder:text-text-secondary focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)]"
896
908
  })]
897
909
  }),
898
- W && /* @__PURE__ */ _("div", {
910
+ W && /* @__PURE__ */ v("div", {
899
911
  className: "space-y-1",
900
- children: [/* @__PURE__ */ _("label", {
912
+ children: [/* @__PURE__ */ v("label", {
901
913
  className: "text-sm font-medium",
902
914
  children: [
903
915
  "Workflow Definition (JSON)",
904
916
  " ",
905
- /* @__PURE__ */ g("span", {
917
+ /* @__PURE__ */ _("span", {
906
918
  className: "text-xs font-normal text-text-secondary",
907
919
  children: "(leave empty to keep existing)"
908
920
  })
909
921
  ]
910
- }), /* @__PURE__ */ g("textarea", {
922
+ }), /* @__PURE__ */ _("textarea", {
911
923
  rows: 10,
912
924
  placeholder: "{\n \"nodes\": [],\n \"edges\": []\n}",
913
- value: k.manifestJson,
914
- onChange: (e) => A((t) => t && {
925
+ value: A.manifestJson,
926
+ onChange: (e) => j((t) => t && {
915
927
  ...t,
916
928
  manifestJson: e.target.value
917
929
  }),
918
930
  className: "w-full rounded-md border bg-transparent px-3 py-2 text-xs font-mono resize-y placeholder:text-text-secondary focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)]"
919
931
  })]
920
932
  }),
921
- /* @__PURE__ */ _("div", {
922
- className: "space-y-1",
923
- children: [/* @__PURE__ */ g("label", {
924
- className: "text-sm font-medium",
925
- children: "Release Notes"
926
- }), /* @__PURE__ */ g("textarea", {
927
- rows: 2,
928
- value: k.releaseNotes,
929
- onChange: (e) => A((t) => t && {
930
- ...t,
931
- releaseNotes: e.target.value
932
- }),
933
- placeholder: "What changed in this release?",
934
- className: "w-full rounded-md border bg-transparent px-3 py-2 text-sm placeholder:text-text-secondary focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)]"
935
- })]
933
+ /* @__PURE__ */ _(s, {
934
+ label: y("devportal.releaseNotes", "Release Notes"),
935
+ value: A.releaseNotes,
936
+ onChange: (e) => j((t) => t && {
937
+ ...t,
938
+ releaseNotes: e
939
+ }),
940
+ placeholder: y("devportal.releaseNotesPlaceholder", "What changed in this release?"),
941
+ rows: 3
942
+ }),
943
+ /* @__PURE__ */ _(s, {
944
+ label: y("devportal.changelog", "Changelog"),
945
+ value: A.changelog,
946
+ onChange: (e) => j((t) => t && {
947
+ ...t,
948
+ changelog: e
949
+ }),
950
+ placeholder: y("devportal.changelogPlaceholder", "Detailed changelog for this version..."),
951
+ rows: 3
936
952
  })
937
953
  ]
938
954
  })
939
955
  }),
940
- /* @__PURE__ */ g(a, {
956
+ /* @__PURE__ */ _(o, {
941
957
  open: Ue === "publish",
942
958
  onOpenChange: (e) => {
943
959
  e || H(null);
944
960
  },
945
961
  onConfirm: async () => {
946
962
  if (Q.length === 0) return;
947
- N(null);
963
+ P(null);
948
964
  let e = await Promise.allSettled(Q.map((e) => et({ variables: { id: e.id } }))), t = e.filter((e) => e.status === "fulfilled").length, n = e.length - t;
949
- P(`Published ${t} version${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), _t(), H(null);
965
+ F(`Published ${t} version${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), _t(), H(null);
950
966
  },
951
- title: v("devportal.submitSelectedVersions", "Submit selected versions for review"),
967
+ title: y("devportal.submitSelectedVersions", "Submit selected versions for review"),
952
968
  description: `Submit ${Q.length} selected version${Q.length === 1 ? "" : "s"} for platform review?`,
953
- confirmLabel: v("devportal.submitForReview", "Submit for Review"),
954
- cancelLabel: v("devportal.cancel", "Cancel"),
969
+ confirmLabel: y("devportal.submitForReview", "Submit for Review"),
970
+ cancelLabel: y("devportal.cancel", "Cancel"),
955
971
  variant: "success"
956
972
  }),
957
- /* @__PURE__ */ g(a, {
973
+ /* @__PURE__ */ _(o, {
958
974
  open: Ue === "deprecate",
959
975
  onOpenChange: (e) => {
960
976
  e || H(null);
961
977
  },
962
978
  onConfirm: async () => {
963
979
  if ($.length === 0) return;
964
- N(null);
980
+ P(null);
965
981
  let e = await Promise.allSettled($.map((e) => tt({ variables: { id: e.id } }))), t = e.filter((e) => e.status === "fulfilled").length, n = e.length - t;
966
- P(`Deprecated ${t} version${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), _t(), H(null);
982
+ F(`Deprecated ${t} version${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), _t(), H(null);
967
983
  },
968
- title: v("devportal.deprecateSelectedVersions", "Deprecate selected versions"),
969
- description: `${v("devportal.deprecate", "Deprecate")} ${$.length} selected version${$.length === 1 ? "" : "s"}? ${v("devportal.deprecateVersionsWarning", "Deprecated versions remain visible but should no longer be promoted.")}`,
970
- confirmLabel: v("devportal.deprecate", "Deprecate"),
971
- cancelLabel: v("devportal.cancel", "Cancel"),
984
+ title: y("devportal.deprecateSelectedVersions", "Deprecate selected versions"),
985
+ description: `${y("devportal.deprecate", "Deprecate")} ${$.length} selected version${$.length === 1 ? "" : "s"}? ${y("devportal.deprecateVersionsWarning", "Deprecated versions remain visible but should no longer be promoted.")}`,
986
+ confirmLabel: y("devportal.deprecate", "Deprecate"),
987
+ cancelLabel: y("devportal.cancel", "Cancel"),
972
988
  variant: "warning"
973
989
  })
974
990
  ]
@@ -976,6 +992,6 @@ var we = () => {
976
992
  });
977
993
  };
978
994
  //#endregion
979
- export { we as ApplicationVersionsPage };
995
+ export { Ce as ApplicationVersionsPage };
980
996
 
981
997
  //# sourceMappingURL=ApplicationVersionsPage.js.map