@burdenoff/microfe-vibecontrols 2026.519.2 → 2026.519.4

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 (40) hide show
  1. package/dist/components/actions/ActionForm.js +138 -134
  2. package/dist/components/actions/ActionForm.js.map +1 -1
  3. package/dist/components/docs/DocsPageEditor.js +83 -69
  4. package/dist/components/docs/DocsPageEditor.js.map +1 -1
  5. package/dist/components/notes/NotesTabPanel.js +4 -5
  6. package/dist/components/notes/NotesTabPanel.js.map +1 -1
  7. package/dist/components/shared/EntityTagPicker.js +110 -81
  8. package/dist/components/shared/EntityTagPicker.js.map +1 -1
  9. package/dist/components/shared/TagFilter.js +4 -4
  10. package/dist/components/shared/index.js +1 -1
  11. package/dist/components/tunnels/TunnelCreateWizard.js +208 -187
  12. package/dist/components/tunnels/TunnelCreateWizard.js.map +1 -1
  13. package/dist/components/vibedeck/VibeDeckForm.js +41 -37
  14. package/dist/components/vibedeck/VibeDeckForm.js.map +1 -1
  15. package/dist/pages/ActionsPage.js +225 -217
  16. package/dist/pages/ActionsPage.js.map +1 -1
  17. package/dist/pages/AgentDetailsPage.js +13 -13
  18. package/dist/pages/AgentDetailsPage.js.map +1 -1
  19. package/dist/pages/CatalogDetailPage.js +248 -234
  20. package/dist/pages/CatalogDetailPage.js.map +1 -1
  21. package/dist/pages/CatalogDocsPage.js +119 -105
  22. package/dist/pages/CatalogDocsPage.js.map +1 -1
  23. package/dist/pages/ComponentDetailPage.js +257 -243
  24. package/dist/pages/ComponentDetailPage.js.map +1 -1
  25. package/dist/pages/ComponentDocsPage.js +119 -105
  26. package/dist/pages/ComponentDocsPage.js.map +1 -1
  27. package/dist/pages/SessionDetailsPage.js +4 -4
  28. package/dist/pages/TargetDetailsPage.js +136 -119
  29. package/dist/pages/TargetDetailsPage.js.map +1 -1
  30. package/dist/pages/TemplateDetailPage.js +47 -33
  31. package/dist/pages/TemplateDetailPage.js.map +1 -1
  32. package/dist/pages/VibeDeckPage.js +161 -153
  33. package/dist/pages/VibeDeckPage.js.map +1 -1
  34. package/dist/pages/VibeDetailsPage.js +407 -407
  35. package/dist/pages/VibeDetailsPage.js.map +1 -1
  36. package/dist/pages/VibeDocsPage.js +119 -105
  37. package/dist/pages/VibeDocsPage.js.map +1 -1
  38. package/dist/pages/tunnels/TunnelDetailsPage.js +95 -77
  39. package/dist/pages/tunnels/TunnelDetailsPage.js.map +1 -1
  40. package/package.json +1 -1
@@ -6,12 +6,14 @@ import { ErrorState as o } from "../shared/ErrorState.js";
6
6
  import { QuotaExhaustedDialog as s } from "../shared/QuotaExhaustedDialog.js";
7
7
  import { TunnelEnvironment as c, TunnelProtocol as l, TunnelProviderKey as u } from "../../generated/wspace-types.js";
8
8
  import { getQuotaDialogContent as d, isQuotaExhaustedError as f } from "../../utils/quotaUtils.js";
9
- import { useCallback as p, useMemo as m, useState as h } from "react";
10
- import { useNavigate as g } from "react-router-dom";
11
- import { AnimatePresence as _, motion as v } from "framer-motion";
12
- import { Fragment as y, jsx as b, jsxs as x } from "react/jsx-runtime";
9
+ import { useTagEntity as p } from "../../hooks/useEntityTags.js";
10
+ import { EntityTagPicker as m } from "../shared/EntityTagPicker.js";
11
+ import { useCallback as h, useMemo as g, useState as _ } from "react";
12
+ import { useNavigate as v } from "react-router-dom";
13
+ import { AnimatePresence as y, motion as b } from "framer-motion";
14
+ import { Fragment as x, jsx as S, jsxs as C } from "react/jsx-runtime";
13
15
  //#region src/components/tunnels/TunnelCreateWizard.tsx
14
- var S = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/, C = {
16
+ var w = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/, T = {
15
17
  providerKey: u.Vibetunnels,
16
18
  agentId: "",
17
19
  name: "",
@@ -25,7 +27,7 @@ var S = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/, C = {
25
27
  customDomain: "",
26
28
  basicAuthUser: "",
27
29
  basicAuthPassword: ""
28
- }, w = [
30
+ }, E = [
29
31
  {
30
32
  id: "provider",
31
33
  label: "Provider"
@@ -47,88 +49,97 @@ var S = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/, C = {
47
49
  label: "Review"
48
50
  }
49
51
  ];
50
- function T() {
51
- let T = e(), O = g(), [k, A] = h(0), [j, M] = h(C), [N, P] = h(null), [F, I] = h(!1), { data: L, loading: R, error: z } = r(), { data: B } = n({ variables: { pagination: { limit: 100 } } }), [V, { loading: H }] = t(), U = p((e, t) => {
52
- M((n) => ({
52
+ function D() {
53
+ let D = e(), A = v(), [j, M] = _(0), [N, P] = _(T), [F, I] = _(null), [L, R] = _(!1), [z, B] = _([]), [V] = p(), { data: H, loading: U, error: W } = r(), { data: G } = n({ variables: { pagination: { limit: 100 } } }), [K, { loading: q }] = t(), J = h((e, t) => {
54
+ P((n) => ({
53
55
  ...n,
54
56
  [e]: t
55
57
  }));
56
- }, []), W = p((e) => {
57
- M((t) => ({
58
+ }, []), Y = h((e) => {
59
+ P((t) => ({
58
60
  ...t,
59
61
  providerKey: e,
60
62
  hostnameKind: e === u.Cloudflare ? "auto" : "managed"
61
63
  }));
62
- }, []), G = m(() => [...L?.tunnelProviders ?? []].sort((e, t) => {
64
+ }, []), X = g(() => [...H?.tunnelProviders ?? []].sort((e, t) => {
63
65
  let n = (e) => e === "VIBETUNNELS" ? 0 : e === "CLOUDFLARE" ? 1 : 2, r = n(e.key) - n(t.key);
64
66
  return r === 0 ? e.key.localeCompare(t.key) : r;
65
- }), [L]), K = m(() => G.find((e) => e.key === j.providerKey), [G, j.providerKey])?.capabilities, q = j.providerKey === u.Cloudflare, J = m(() => {
66
- if (!K) return [l.Http];
67
+ }), [H]), Z = g(() => X.find((e) => e.key === N.providerKey), [X, N.providerKey])?.capabilities, Q = N.providerKey === u.Cloudflare, $ = g(() => {
68
+ if (!Z) return [l.Http];
67
69
  let e = [];
68
- return K.supportsHttp && e.push(l.Http), K.supportsHttps && e.push(l.Https), K.supportsTcp && e.push(l.Tcp), e;
69
- }, [K]), Y = m(() => k === 0 ? !!(j.providerKey && j.agentId && j.name.trim()) : k === 1 ? j.localPort > 0 && j.localPort < 65536 : k === 2 ? j.hostnameKind === "managed" ? !!(j.subdomain && S.test(j.subdomain)) : j.hostnameKind === "custom" ? j.customDomain.trim().includes(".") : q : !0, [
70
- k,
70
+ return Z.supportsHttp && e.push(l.Http), Z.supportsHttps && e.push(l.Https), Z.supportsTcp && e.push(l.Tcp), e;
71
+ }, [Z]), ee = g(() => j === 0 ? !!(N.providerKey && N.agentId && N.name.trim()) : j === 1 ? N.localPort > 0 && N.localPort < 65536 : j === 2 ? N.hostnameKind === "managed" ? !!(N.subdomain && w.test(N.subdomain)) : N.hostnameKind === "custom" ? N.customDomain.trim().includes(".") : Q : !0, [
71
72
  j,
72
- q
73
- ]), X = () => A((e) => Math.min(e + 1, w.length - 1)), Z = () => A((e) => Math.max(e - 1, 0)), Q = async () => {
74
- P(null);
73
+ N,
74
+ Q
75
+ ]), te = () => M((e) => Math.min(e + 1, E.length - 1)), ne = () => M((e) => Math.max(e - 1, 0)), re = async () => {
76
+ I(null);
75
77
  try {
76
- let e = await V({ variables: { input: {
77
- agentId: j.agentId,
78
- name: j.name,
79
- description: j.description || void 0,
80
- providerKey: j.providerKey,
81
- protocol: j.protocol,
82
- localHost: j.localHost,
83
- localPort: j.localPort,
84
- environment: j.environment,
85
- basicAuthUser: j.basicAuthUser || void 0,
86
- basicAuthPassword: j.basicAuthPassword || void 0,
87
- managedSubdomain: j.hostnameKind === "managed" ? j.subdomain : void 0
78
+ let e = await K({ variables: { input: {
79
+ agentId: N.agentId,
80
+ name: N.name,
81
+ description: N.description || void 0,
82
+ providerKey: N.providerKey,
83
+ protocol: N.protocol,
84
+ localHost: N.localHost,
85
+ localPort: N.localPort,
86
+ environment: N.environment,
87
+ basicAuthUser: N.basicAuthUser || void 0,
88
+ basicAuthPassword: N.basicAuthPassword || void 0,
89
+ managedSubdomain: N.hostnameKind === "managed" ? N.subdomain : void 0
88
90
  } } });
89
91
  if (e.error) {
90
92
  if (f(e.error)) {
91
- I(!0);
93
+ R(!0);
92
94
  return;
93
95
  }
94
- P(e.error.message);
96
+ I(e.error.message);
95
97
  return;
96
98
  }
97
99
  let t = e.data?.createTunnel.id;
98
- t && O(`/vibecontrols/tunnels/${t}`);
100
+ if (t) {
101
+ if (z.length > 0) try {
102
+ await Promise.all(z.map((e) => V({ variables: { input: {
103
+ entityType: "VIBECONTROLS_TUNNEL",
104
+ entityId: t,
105
+ tagId: e
106
+ } } })));
107
+ } catch {}
108
+ A(`/vibecontrols/tunnels/${t}`);
109
+ }
99
110
  } catch (e) {
100
111
  if (f(e)) {
101
- P(null), I(!0);
112
+ I(null), R(!0);
102
113
  return;
103
114
  }
104
- P(e instanceof Error ? e.message : String(e));
115
+ I(e instanceof Error ? e.message : String(e));
105
116
  }
106
117
  };
107
- return R ? /* @__PURE__ */ b(a, { message: "Loading providers" }) : z ? /* @__PURE__ */ b(o, {
118
+ return U ? /* @__PURE__ */ S(a, { message: "Loading providers" }) : W ? /* @__PURE__ */ S(o, {
108
119
  title: "Failed to load providers",
109
- message: z.message,
120
+ message: W.message,
110
121
  onRetry: () => window.location.reload()
111
- }) : /* @__PURE__ */ x("div", {
122
+ }) : /* @__PURE__ */ C("div", {
112
123
  className: "p-6 max-w-3xl mx-auto",
113
124
  children: [
114
- /* @__PURE__ */ b(i, {
125
+ /* @__PURE__ */ S(i, {
115
126
  breadcrumb: [{
116
127
  label: "Tunnels",
117
128
  path: "/vibecontrols/tunnels"
118
129
  }, { label: "New tunnel" }],
119
- title: T("vibecontrols.tunnels.createTitle", "Create tunnel"),
120
- description: T("vibecontrols.tunnels.createDescription", "Expose a local service through a managed tunnel.")
130
+ title: D("vibecontrols.tunnels.createTitle", "Create tunnel"),
131
+ description: D("vibecontrols.tunnels.createDescription", "Expose a local service through a managed tunnel.")
121
132
  }),
122
- /* @__PURE__ */ b("div", {
133
+ /* @__PURE__ */ S("div", {
123
134
  className: "mb-6 flex items-center gap-2",
124
- children: w.map((e, t) => /* @__PURE__ */ b("div", {
125
- className: `flex-1 h-1.5 rounded-full ${t <= k ? "bg-action-primary-bg" : "bg-bg-sunken"}`,
135
+ children: E.map((e, t) => /* @__PURE__ */ S("div", {
136
+ className: `flex-1 h-1.5 rounded-full ${t <= j ? "bg-action-primary-bg" : "bg-bg-sunken"}`,
126
137
  "aria-label": `Step ${t + 1}: ${e.label}`
127
138
  }, e.id))
128
139
  }),
129
- /* @__PURE__ */ b(_, {
140
+ /* @__PURE__ */ S(y, {
130
141
  mode: "wait",
131
- children: /* @__PURE__ */ x(v.div, {
142
+ children: /* @__PURE__ */ C(b.div, {
132
143
  initial: {
133
144
  opacity: 0,
134
145
  x: 6
@@ -144,105 +155,105 @@ function T() {
144
155
  transition: { duration: .15 },
145
156
  className: "rounded-lg border border-border-subtle bg-bg-surface p-6",
146
157
  children: [
147
- k === 0 && /* @__PURE__ */ x("div", {
158
+ j === 0 && /* @__PURE__ */ C("div", {
148
159
  className: "space-y-4",
149
160
  children: [
150
- /* @__PURE__ */ b("h3", {
161
+ /* @__PURE__ */ S("h3", {
151
162
  className: "text-sm font-semibold text-text-primary",
152
163
  children: "Provider"
153
164
  }),
154
- /* @__PURE__ */ b("div", {
165
+ /* @__PURE__ */ S("div", {
155
166
  className: "grid gap-3 sm:grid-cols-2",
156
- children: G.map((e) => /* @__PURE__ */ x("button", {
167
+ children: X.map((e) => /* @__PURE__ */ C("button", {
157
168
  type: "button",
158
- onClick: () => W(e.key),
159
- className: `rounded-lg border p-4 text-left transition-colors ${j.providerKey === e.key ? "border-action-primary-bg bg-bg-sunken" : "border-border-subtle hover:border-border-default"}`,
169
+ onClick: () => Y(e.key),
170
+ className: `rounded-lg border p-4 text-left transition-colors ${N.providerKey === e.key ? "border-action-primary-bg bg-bg-sunken" : "border-border-subtle hover:border-border-default"}`,
160
171
  children: [
161
- /* @__PURE__ */ b("div", {
172
+ /* @__PURE__ */ S("div", {
162
173
  className: "font-semibold text-text-primary",
163
174
  children: e.displayName
164
175
  }),
165
- /* @__PURE__ */ b("div", {
176
+ /* @__PURE__ */ S("div", {
166
177
  className: "text-xs text-text-muted mt-1",
167
178
  children: e.key
168
179
  }),
169
- e.description && /* @__PURE__ */ b("div", {
180
+ e.description && /* @__PURE__ */ S("div", {
170
181
  className: "text-xs text-text-secondary mt-2",
171
182
  children: e.description
172
183
  })
173
184
  ]
174
185
  }, e.id))
175
186
  }),
176
- /* @__PURE__ */ b(E, {
187
+ /* @__PURE__ */ S(O, {
177
188
  label: "Agent",
178
- children: /* @__PURE__ */ x("select", {
179
- value: j.agentId,
180
- onChange: (e) => U("agentId", e.target.value),
189
+ children: /* @__PURE__ */ C("select", {
190
+ value: N.agentId,
191
+ onChange: (e) => J("agentId", e.target.value),
181
192
  className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary",
182
- children: [/* @__PURE__ */ b("option", {
193
+ children: [/* @__PURE__ */ S("option", {
183
194
  value: "",
184
195
  children: "Select agent"
185
- }), (B?.vibecontrolsAgents ?? []).map((e) => /* @__PURE__ */ b("option", {
196
+ }), (G?.vibecontrolsAgents ?? []).map((e) => /* @__PURE__ */ S("option", {
186
197
  value: e.id,
187
198
  children: e.name
188
199
  }, e.id))]
189
200
  })
190
201
  }),
191
- /* @__PURE__ */ b(E, {
202
+ /* @__PURE__ */ S(O, {
192
203
  label: "Name",
193
- children: /* @__PURE__ */ b("input", {
204
+ children: /* @__PURE__ */ S("input", {
194
205
  type: "text",
195
- value: j.name,
196
- onChange: (e) => U("name", e.target.value),
206
+ value: N.name,
207
+ onChange: (e) => J("name", e.target.value),
197
208
  placeholder: "My dev tunnel",
198
209
  className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-muted"
199
210
  })
200
211
  }),
201
- /* @__PURE__ */ b(E, {
212
+ /* @__PURE__ */ S(O, {
202
213
  label: "Description (optional)",
203
- children: /* @__PURE__ */ b("input", {
214
+ children: /* @__PURE__ */ S("input", {
204
215
  type: "text",
205
- value: j.description,
206
- onChange: (e) => U("description", e.target.value),
216
+ value: N.description,
217
+ onChange: (e) => J("description", e.target.value),
207
218
  className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary placeholder:text-text-muted"
208
219
  })
209
220
  })
210
221
  ]
211
222
  }),
212
- k === 1 && /* @__PURE__ */ x("div", {
223
+ j === 1 && /* @__PURE__ */ C("div", {
213
224
  className: "space-y-4",
214
225
  children: [
215
- /* @__PURE__ */ b("h3", {
226
+ /* @__PURE__ */ S("h3", {
216
227
  className: "text-sm font-semibold text-text-primary",
217
228
  children: "Protocol & target"
218
229
  }),
219
- /* @__PURE__ */ b(E, {
230
+ /* @__PURE__ */ S(O, {
220
231
  label: "Protocol",
221
- children: /* @__PURE__ */ b("div", {
232
+ children: /* @__PURE__ */ S("div", {
222
233
  className: "flex gap-2",
223
- children: J.map((e) => /* @__PURE__ */ b("button", {
234
+ children: $.map((e) => /* @__PURE__ */ S("button", {
224
235
  type: "button",
225
- onClick: () => U("protocol", e),
226
- className: `rounded-md border px-4 py-2 text-sm ${j.protocol === e ? "border-action-primary-bg bg-bg-sunken text-text-primary" : "border-border-subtle text-text-secondary hover:border-border-default"}`,
236
+ onClick: () => J("protocol", e),
237
+ className: `rounded-md border px-4 py-2 text-sm ${N.protocol === e ? "border-action-primary-bg bg-bg-sunken text-text-primary" : "border-border-subtle text-text-secondary hover:border-border-default"}`,
227
238
  children: e
228
239
  }, e))
229
240
  })
230
241
  }),
231
- /* @__PURE__ */ b(E, {
242
+ /* @__PURE__ */ S(O, {
232
243
  label: "Local host",
233
- children: /* @__PURE__ */ b("input", {
244
+ children: /* @__PURE__ */ S("input", {
234
245
  type: "text",
235
- value: j.localHost,
236
- onChange: (e) => U("localHost", e.target.value),
246
+ value: N.localHost,
247
+ onChange: (e) => J("localHost", e.target.value),
237
248
  className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary"
238
249
  })
239
250
  }),
240
- /* @__PURE__ */ b(E, {
251
+ /* @__PURE__ */ S(O, {
241
252
  label: "Local port",
242
- children: /* @__PURE__ */ b("input", {
253
+ children: /* @__PURE__ */ S("input", {
243
254
  type: "number",
244
- value: j.localPort,
245
- onChange: (e) => U("localPort", parseInt(e.target.value, 10) || 0),
255
+ value: N.localPort,
256
+ onChange: (e) => J("localPort", parseInt(e.target.value, 10) || 0),
246
257
  min: 1,
247
258
  max: 65535,
248
259
  className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary"
@@ -250,263 +261,273 @@ function T() {
250
261
  })
251
262
  ]
252
263
  }),
253
- k === 2 && /* @__PURE__ */ x("div", {
264
+ j === 2 && /* @__PURE__ */ C("div", {
254
265
  className: "space-y-4",
255
266
  children: [
256
- /* @__PURE__ */ b("h3", {
267
+ /* @__PURE__ */ S("h3", {
257
268
  className: "text-sm font-semibold text-text-primary",
258
269
  children: "Hostname"
259
270
  }),
260
- /* @__PURE__ */ x("div", {
271
+ /* @__PURE__ */ C("div", {
261
272
  className: "flex gap-2",
262
273
  children: [
263
- /* @__PURE__ */ b(D, {
264
- active: j.hostnameKind === "managed",
265
- onClick: () => U("hostnameKind", "managed"),
266
- disabled: !K?.supportsManagedSubdomains,
274
+ /* @__PURE__ */ S(k, {
275
+ active: N.hostnameKind === "managed",
276
+ onClick: () => J("hostnameKind", "managed"),
277
+ disabled: !Z?.supportsManagedSubdomains,
267
278
  label: "Managed subdomain",
268
279
  hint: "*.vibetunnels.com"
269
280
  }),
270
- /* @__PURE__ */ b(D, {
271
- active: j.hostnameKind === "custom",
272
- onClick: () => U("hostnameKind", "custom"),
273
- disabled: !K?.supportsCustomDomains,
281
+ /* @__PURE__ */ S(k, {
282
+ active: N.hostnameKind === "custom",
283
+ onClick: () => J("hostnameKind", "custom"),
284
+ disabled: !Z?.supportsCustomDomains,
274
285
  label: "Custom domain",
275
286
  hint: "TXT verification"
276
287
  }),
277
- /* @__PURE__ */ b(D, {
278
- active: j.hostnameKind === "auto",
279
- onClick: () => U("hostnameKind", "auto"),
280
- disabled: !q,
288
+ /* @__PURE__ */ S(k, {
289
+ active: N.hostnameKind === "auto",
290
+ onClick: () => J("hostnameKind", "auto"),
291
+ disabled: !Q,
281
292
  label: "Auto",
282
293
  hint: "provider default"
283
294
  })
284
295
  ]
285
296
  }),
286
- j.hostnameKind === "managed" && /* @__PURE__ */ x(y, { children: [
287
- /* @__PURE__ */ b(E, {
297
+ N.hostnameKind === "managed" && /* @__PURE__ */ C(x, { children: [
298
+ /* @__PURE__ */ S(O, {
288
299
  label: "Environment",
289
- children: /* @__PURE__ */ x("div", {
300
+ children: /* @__PURE__ */ C("div", {
290
301
  className: "flex gap-2",
291
- children: [/* @__PURE__ */ b("button", {
302
+ children: [/* @__PURE__ */ S("button", {
292
303
  type: "button",
293
- onClick: () => U("environment", c.Prod),
294
- className: `rounded-md border px-4 py-2 text-sm ${j.environment === c.Prod ? "border-action-primary-bg bg-bg-sunken text-text-primary" : "border-border-subtle text-text-secondary hover:border-border-default"}`,
304
+ onClick: () => J("environment", c.Prod),
305
+ className: `rounded-md border px-4 py-2 text-sm ${N.environment === c.Prod ? "border-action-primary-bg bg-bg-sunken text-text-primary" : "border-border-subtle text-text-secondary hover:border-border-default"}`,
295
306
  children: "Prod (vibetunnels.com)"
296
- }), /* @__PURE__ */ b("button", {
307
+ }), /* @__PURE__ */ S("button", {
297
308
  type: "button",
298
- onClick: () => U("environment", c.Alpha),
299
- className: `rounded-md border px-4 py-2 text-sm ${j.environment === c.Alpha ? "border-action-primary-bg bg-bg-sunken text-text-primary" : "border-border-subtle text-text-secondary hover:border-border-default"}`,
309
+ onClick: () => J("environment", c.Alpha),
310
+ className: `rounded-md border px-4 py-2 text-sm ${N.environment === c.Alpha ? "border-action-primary-bg bg-bg-sunken text-text-primary" : "border-border-subtle text-text-secondary hover:border-border-default"}`,
300
311
  children: "Alpha"
301
312
  })]
302
313
  })
303
314
  }),
304
- /* @__PURE__ */ b(E, {
315
+ /* @__PURE__ */ S(O, {
305
316
  label: "Subdomain label",
306
- children: /* @__PURE__ */ b("input", {
317
+ children: /* @__PURE__ */ S("input", {
307
318
  type: "text",
308
- value: j.subdomain,
309
- onChange: (e) => U("subdomain", e.target.value.toLowerCase()),
319
+ value: N.subdomain,
320
+ onChange: (e) => J("subdomain", e.target.value.toLowerCase()),
310
321
  placeholder: "demo",
311
322
  className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary"
312
323
  })
313
324
  }),
314
- j.subdomain && /* @__PURE__ */ x("p", {
325
+ N.subdomain && /* @__PURE__ */ C("p", {
315
326
  className: "text-xs text-text-secondary",
316
327
  children: [
317
328
  "Will be reserved as",
318
329
  " ",
319
- /* @__PURE__ */ x("span", {
330
+ /* @__PURE__ */ C("span", {
320
331
  className: "font-mono text-text-primary",
321
- children: [j.subdomain, j.environment === c.Alpha ? ".alpha.vibetunnels.com" : ".vibetunnels.com"]
332
+ children: [N.subdomain, N.environment === c.Alpha ? ".alpha.vibetunnels.com" : ".vibetunnels.com"]
322
333
  })
323
334
  ]
324
335
  })
325
336
  ] }),
326
- j.hostnameKind === "custom" && /* @__PURE__ */ x(E, {
337
+ N.hostnameKind === "custom" && /* @__PURE__ */ C(O, {
327
338
  label: "Custom domain",
328
- children: [/* @__PURE__ */ b("input", {
339
+ children: [/* @__PURE__ */ S("input", {
329
340
  type: "text",
330
- value: j.customDomain,
331
- onChange: (e) => U("customDomain", e.target.value.toLowerCase()),
341
+ value: N.customDomain,
342
+ onChange: (e) => J("customDomain", e.target.value.toLowerCase()),
332
343
  placeholder: "preview.example.com",
333
344
  className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary"
334
- }), /* @__PURE__ */ b("p", {
345
+ }), /* @__PURE__ */ S("p", {
335
346
  className: "text-xs text-text-muted mt-2",
336
347
  children: "Custom domains are registered on create but must be verified via a TXT record before they can be attached. You'll see the verification challenge in the Domains tab after creation."
337
348
  })]
338
349
  })
339
350
  ]
340
351
  }),
341
- k === 3 && /* @__PURE__ */ x("div", {
352
+ j === 3 && /* @__PURE__ */ C("div", {
342
353
  className: "space-y-4",
343
354
  children: [
344
- /* @__PURE__ */ b("h3", {
355
+ /* @__PURE__ */ S("h3", {
345
356
  className: "text-sm font-semibold text-text-primary",
346
357
  children: "Policies (optional)"
347
358
  }),
348
- /* @__PURE__ */ b(E, {
359
+ /* @__PURE__ */ S(O, {
349
360
  label: "Basic auth user",
350
- children: /* @__PURE__ */ b("input", {
361
+ children: /* @__PURE__ */ S("input", {
351
362
  type: "text",
352
- value: j.basicAuthUser,
353
- onChange: (e) => U("basicAuthUser", e.target.value),
363
+ value: N.basicAuthUser,
364
+ onChange: (e) => J("basicAuthUser", e.target.value),
354
365
  className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary"
355
366
  })
356
367
  }),
357
- /* @__PURE__ */ b(E, {
368
+ /* @__PURE__ */ S(O, {
358
369
  label: "Basic auth password",
359
- children: /* @__PURE__ */ b("input", {
370
+ children: /* @__PURE__ */ S("input", {
360
371
  type: "password",
361
- value: j.basicAuthPassword,
362
- onChange: (e) => U("basicAuthPassword", e.target.value),
372
+ value: N.basicAuthPassword,
373
+ onChange: (e) => J("basicAuthPassword", e.target.value),
363
374
  className: "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary"
364
375
  })
365
376
  })
366
377
  ]
367
378
  }),
368
- k === 4 && /* @__PURE__ */ x("div", {
379
+ j === 4 && /* @__PURE__ */ C("div", {
369
380
  className: "space-y-3",
370
381
  children: [
371
- /* @__PURE__ */ b("h3", {
382
+ /* @__PURE__ */ S("h3", {
372
383
  className: "text-sm font-semibold text-text-primary",
373
- children: T("vibecontrols.tunnels.review", "Review")
384
+ children: D("vibecontrols.tunnels.review", "Review")
374
385
  }),
375
- /* @__PURE__ */ x("dl", {
386
+ /* @__PURE__ */ C("dl", {
376
387
  className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 text-sm",
377
388
  children: [
378
- /* @__PURE__ */ b("dt", {
389
+ /* @__PURE__ */ S("dt", {
379
390
  className: "text-text-muted",
380
391
  children: "Provider"
381
392
  }),
382
- /* @__PURE__ */ b("dd", {
393
+ /* @__PURE__ */ S("dd", {
383
394
  className: "text-text-primary",
384
- children: j.providerKey
395
+ children: N.providerKey
385
396
  }),
386
- /* @__PURE__ */ b("dt", {
397
+ /* @__PURE__ */ S("dt", {
387
398
  className: "text-text-muted",
388
399
  children: "Name"
389
400
  }),
390
- /* @__PURE__ */ b("dd", {
401
+ /* @__PURE__ */ S("dd", {
391
402
  className: "text-text-primary",
392
- children: j.name
403
+ children: N.name
393
404
  }),
394
- /* @__PURE__ */ b("dt", {
405
+ /* @__PURE__ */ S("dt", {
395
406
  className: "text-text-muted",
396
407
  children: "Agent"
397
408
  }),
398
- /* @__PURE__ */ b("dd", {
409
+ /* @__PURE__ */ S("dd", {
399
410
  className: "text-text-primary font-mono",
400
- children: j.agentId
411
+ children: N.agentId
401
412
  }),
402
- /* @__PURE__ */ b("dt", {
413
+ /* @__PURE__ */ S("dt", {
403
414
  className: "text-text-muted",
404
415
  children: "Protocol"
405
416
  }),
406
- /* @__PURE__ */ b("dd", {
417
+ /* @__PURE__ */ S("dd", {
407
418
  className: "text-text-primary",
408
- children: j.protocol
419
+ children: N.protocol
409
420
  }),
410
- /* @__PURE__ */ b("dt", {
421
+ /* @__PURE__ */ S("dt", {
411
422
  className: "text-text-muted",
412
423
  children: "Target"
413
424
  }),
414
- /* @__PURE__ */ x("dd", {
425
+ /* @__PURE__ */ C("dd", {
415
426
  className: "text-text-primary font-mono",
416
427
  children: [
417
- j.localHost,
428
+ N.localHost,
418
429
  ":",
419
- j.localPort
430
+ N.localPort
420
431
  ]
421
432
  }),
422
- /* @__PURE__ */ b("dt", {
433
+ /* @__PURE__ */ S("dt", {
423
434
  className: "text-text-muted",
424
435
  children: "Hostname"
425
436
  }),
426
- /* @__PURE__ */ b("dd", {
437
+ /* @__PURE__ */ S("dd", {
427
438
  className: "text-text-primary",
428
- children: j.hostnameKind === "managed" ? `${j.subdomain}.${j.environment === "ALPHA" ? "alpha." : ""}vibetunnels.com` : j.hostnameKind === "custom" ? j.customDomain : "auto-assigned"
439
+ children: N.hostnameKind === "managed" ? `${N.subdomain}.${N.environment === "ALPHA" ? "alpha." : ""}vibetunnels.com` : N.hostnameKind === "custom" ? N.customDomain : "auto-assigned"
429
440
  }),
430
- /* @__PURE__ */ b("dt", {
441
+ /* @__PURE__ */ S("dt", {
431
442
  className: "text-text-muted",
432
443
  children: "Basic auth"
433
444
  }),
434
- /* @__PURE__ */ b("dd", {
445
+ /* @__PURE__ */ S("dd", {
435
446
  className: "text-text-primary",
436
- children: j.basicAuthUser ? "yes" : "no"
447
+ children: N.basicAuthUser ? "yes" : "no"
437
448
  })
438
449
  ]
439
450
  }),
440
- N && /* @__PURE__ */ b("div", {
451
+ /* @__PURE__ */ C("div", {
452
+ className: "border-t border-border-subtle pt-3",
453
+ children: [/* @__PURE__ */ S("h4", {
454
+ className: "mb-2 text-sm font-medium text-text-secondary",
455
+ children: D("vibecontrols.tunnels.tags", "Tags")
456
+ }), /* @__PURE__ */ S(m, {
457
+ entityType: "VIBECONTROLS_TUNNEL",
458
+ onDraftChange: B
459
+ })]
460
+ }),
461
+ F && /* @__PURE__ */ S("div", {
441
462
  className: "rounded-md bg-status-error-bg p-3 text-sm text-status-error-fg",
442
- children: N
463
+ children: F
443
464
  })
444
465
  ]
445
466
  })
446
467
  ]
447
- }, k)
468
+ }, j)
448
469
  }),
449
- /* @__PURE__ */ x("div", {
470
+ /* @__PURE__ */ C("div", {
450
471
  className: "flex items-center justify-between mt-4",
451
- children: [/* @__PURE__ */ b("button", {
472
+ children: [/* @__PURE__ */ S("button", {
452
473
  type: "button",
453
- disabled: k === 0,
454
- onClick: Z,
474
+ disabled: j === 0,
475
+ onClick: ne,
455
476
  className: "rounded-md border border-border-default px-4 py-2 text-sm text-text-primary hover:bg-bg-elevated disabled:opacity-50",
456
- children: T("vibecontrols.tunnels.back", "Back")
457
- }), k < w.length - 1 ? /* @__PURE__ */ b("button", {
477
+ children: D("vibecontrols.tunnels.back", "Back")
478
+ }), j < E.length - 1 ? /* @__PURE__ */ S("button", {
458
479
  type: "button",
459
- disabled: !Y,
460
- onClick: X,
480
+ disabled: !ee,
481
+ onClick: te,
461
482
  className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-fg hover:bg-action-primary-bg-hover disabled:opacity-50",
462
- children: T("vibecontrols.tunnels.next", "Next")
463
- }) : /* @__PURE__ */ b("button", {
483
+ children: D("vibecontrols.tunnels.next", "Next")
484
+ }) : /* @__PURE__ */ S("button", {
464
485
  type: "button",
465
- disabled: H,
466
- onClick: () => void Q(),
486
+ disabled: q,
487
+ onClick: () => void re(),
467
488
  className: "rounded-md bg-action-primary-bg px-4 py-2 text-sm font-medium text-action-primary-fg hover:bg-action-primary-bg-hover disabled:opacity-50",
468
- children: H ? T("vibecontrols.tunnels.creating", "Creating...") : T("vibecontrols.tunnels.createTunnel", "Create tunnel")
489
+ children: q ? D("vibecontrols.tunnels.creating", "Creating...") : D("vibecontrols.tunnels.createTunnel", "Create tunnel")
469
490
  })]
470
491
  }),
471
- /* @__PURE__ */ b(s, {
472
- isOpen: F,
473
- onClose: () => I(!1),
492
+ /* @__PURE__ */ S(s, {
493
+ isOpen: L,
494
+ onClose: () => R(!1),
474
495
  onConfirm: () => {
475
- I(!1), O("/billing");
496
+ R(!1), A("/billing");
476
497
  },
477
498
  ...d("tunnel-subdomain")
478
499
  })
479
500
  ]
480
501
  });
481
502
  }
482
- function E({ label: e, children: t }) {
483
- return /* @__PURE__ */ x("label", {
503
+ function O({ label: e, children: t }) {
504
+ return /* @__PURE__ */ C("label", {
484
505
  className: "block",
485
- children: [/* @__PURE__ */ b("span", {
506
+ children: [/* @__PURE__ */ S("span", {
486
507
  className: "text-xs font-medium text-text-secondary",
487
508
  children: e
488
- }), /* @__PURE__ */ b("div", {
509
+ }), /* @__PURE__ */ S("div", {
489
510
  className: "mt-1",
490
511
  children: t
491
512
  })]
492
513
  });
493
514
  }
494
- function D({ active: e, disabled: t, onClick: n, label: r, hint: i }) {
495
- return /* @__PURE__ */ x("button", {
515
+ function k({ active: e, disabled: t, onClick: n, label: r, hint: i }) {
516
+ return /* @__PURE__ */ C("button", {
496
517
  type: "button",
497
518
  disabled: t,
498
519
  onClick: n,
499
520
  className: `flex-1 rounded-md border p-3 text-left transition-colors ${e ? "border-action-primary-bg bg-bg-sunken" : "border-border-subtle hover:border-border-default"} ${t ? "opacity-50 cursor-not-allowed" : ""}`,
500
- children: [/* @__PURE__ */ b("div", {
521
+ children: [/* @__PURE__ */ S("div", {
501
522
  className: "text-sm font-medium text-text-primary",
502
523
  children: r
503
- }), /* @__PURE__ */ b("div", {
524
+ }), /* @__PURE__ */ S("div", {
504
525
  className: "text-xs text-text-muted mt-0.5",
505
526
  children: i
506
527
  })]
507
528
  });
508
529
  }
509
530
  //#endregion
510
- export { T as TunnelCreateWizard };
531
+ export { D as TunnelCreateWizard };
511
532
 
512
533
  //# sourceMappingURL=TunnelCreateWizard.js.map