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