@burdenoff/microfe-vibecontrols 2026.1023.1 → 2026.1023.3
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.
- package/dist/components/shared/QuotaExhaustedDialog.js +16 -12
- package/dist/components/tunnels/TunnelCreateWizard.js +4 -4
- package/dist/pages/AgentsPage.js +10 -10
- package/dist/pages/SessionsPage.js +4 -4
- package/dist/pages/VibeDeckPage.js +4 -4
- package/dist/pages/tunnels/TunnelsTab.js +45 -45
- package/package.json +1 -1
|
@@ -1,19 +1,23 @@
|
|
|
1
1
|
import { useTr as e } from "../../shared/hooks/useTr.js";
|
|
2
2
|
import { ConfirmDialog as t } from "./ConfirmDialog.js";
|
|
3
|
-
import {
|
|
3
|
+
import { useCallback as n } from "react";
|
|
4
|
+
import { jsx as r } from "react/jsx-runtime";
|
|
5
|
+
import { useEventBus as i } from "@burdenoff/fe-libs/shared/events";
|
|
4
6
|
//#region src/components/shared/QuotaExhaustedDialog.tsx
|
|
5
|
-
function
|
|
6
|
-
let
|
|
7
|
-
return /* @__PURE__ */
|
|
8
|
-
isOpen:
|
|
9
|
-
onClose:
|
|
10
|
-
onConfirm:
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
7
|
+
function a({ isOpen: a, onClose: o, onConfirm: s, title: c, message: l, confirmLabel: u, cancelLabel: d }) {
|
|
8
|
+
let f = e(), p = i();
|
|
9
|
+
return /* @__PURE__ */ r(t, {
|
|
10
|
+
isOpen: a,
|
|
11
|
+
onClose: o,
|
|
12
|
+
onConfirm: n(() => {
|
|
13
|
+
p.emitCustom("vibecontrols.billing.upgrade_clicked", {}), s();
|
|
14
|
+
}, [p, s]),
|
|
15
|
+
title: c ?? f("vibecontrols.shared.quotaExhaustedDialog.title", "Quota Reached"),
|
|
16
|
+
message: l,
|
|
17
|
+
confirmLabel: u ?? f("vibecontrols.shared.quotaExhaustedDialog.viewBilling", "View Billing"),
|
|
18
|
+
cancelLabel: d ?? f("vibecontrols.shared.quotaExhaustedDialog.dismiss", "Dismiss"),
|
|
15
19
|
variant: "warning"
|
|
16
20
|
});
|
|
17
21
|
}
|
|
18
22
|
//#endregion
|
|
19
|
-
export {
|
|
23
|
+
export { a as QuotaExhaustedDialog };
|
|
@@ -15,8 +15,8 @@ import { useCallback as m, useMemo as h, useState as g } from "react";
|
|
|
15
15
|
import { useNavigate as oe } from "react-router";
|
|
16
16
|
import { AnimatePresence as se, motion as _ } from "framer-motion";
|
|
17
17
|
import { Fragment as v, jsx as y, jsxs as b } from "react/jsx-runtime";
|
|
18
|
-
import {
|
|
19
|
-
import {
|
|
18
|
+
import { useEventBus as x } from "@burdenoff/fe-libs/shared/events";
|
|
19
|
+
import { Stepper as S } from "@burdenoff/fe-libs/ui";
|
|
20
20
|
//#region src/components/tunnels/TunnelCreateWizard.tsx
|
|
21
21
|
var C = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/, w = {
|
|
22
22
|
providerKey: d.Vibetunnels,
|
|
@@ -55,7 +55,7 @@ var C = /^[a-z0-9]([a-z0-9-]{0,61}[a-z0-9])?$/, w = {
|
|
|
55
55
|
}
|
|
56
56
|
];
|
|
57
57
|
function E() {
|
|
58
|
-
let E = r(), k = oe(), A =
|
|
58
|
+
let E = r(), k = oe(), A = x(), { workspaceId: j } = s(), [M, N] = g(0), [P, F] = g(w), [I, L] = g(null), [R, z] = g(!1), [B, V] = g(!1), [H, U] = g(re), { setDraftTagIds: W, flushTags: G } = p("VIBECONTROLS_TUNNEL"), { data: K, loading: ce, error: q } = n(), { data: le } = t({ variables: { pagination: { limit: 100 } } }), [ue, { loading: J }] = e(), Y = m((e, t) => {
|
|
59
59
|
F((n) => ({
|
|
60
60
|
...n,
|
|
61
61
|
[e]: t
|
|
@@ -138,7 +138,7 @@ function E() {
|
|
|
138
138
|
title: E("vibecontrols.tunnels.createTitle", "Create tunnel"),
|
|
139
139
|
description: E("vibecontrols.tunnels.createDescription", "Expose a local service through a managed tunnel.")
|
|
140
140
|
}),
|
|
141
|
-
/* @__PURE__ */ y(
|
|
141
|
+
/* @__PURE__ */ y(S, {
|
|
142
142
|
className: "mb-6",
|
|
143
143
|
active: M,
|
|
144
144
|
onStepClick: (e) => e <= M && N(e),
|
package/dist/pages/AgentsPage.js
CHANGED
|
@@ -34,13 +34,13 @@ import { useSearchParams as He } from "react-router";
|
|
|
34
34
|
import { usePermissions as Ue } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
35
35
|
import { AnimatePresence as We } from "framer-motion";
|
|
36
36
|
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
37
|
-
import {
|
|
38
|
-
import {
|
|
37
|
+
import { useEventBus as Ge } from "@burdenoff/fe-libs/shared/events";
|
|
38
|
+
import { Button as Ke, Input as qe, PagePurpose as Je, ResponsiveDialog as Ye, ResponsiveDialogContent as Xe, ResponsiveDialogDescription as Ze, ResponsiveDialogFooter as Qe, ResponsiveDialogHeader as $e, ResponsiveDialogTitle as et } from "@burdenoff/fe-libs/ui";
|
|
39
39
|
import { AccessDenied as tt, PermissionButton as nt } from "@burdenoff/fe-libs/shared/components";
|
|
40
40
|
import { MotionItem as rt, MotionList as it, MotionPage as v } from "@burdenoff/fe-libs/shared/motion";
|
|
41
41
|
//#region src/pages/AgentsPage.tsx
|
|
42
42
|
function at() {
|
|
43
|
-
let { onAgentSelect: at, workspaceId: y } = me(), b = he(), x =
|
|
43
|
+
let { onAgentSelect: at, workspaceId: y } = me(), b = he(), x = Ge(), { hasPermission: ot, isLoading: st, permissions: ct } = Ue(), S = le(), lt = [
|
|
44
44
|
{
|
|
45
45
|
value: "all",
|
|
46
46
|
label: S("agentsPage.statusAll", "All Statuses")
|
|
@@ -489,7 +489,7 @@ function at() {
|
|
|
489
489
|
})]
|
|
490
490
|
})
|
|
491
491
|
}),
|
|
492
|
-
/* @__PURE__ */ g(
|
|
492
|
+
/* @__PURE__ */ g(Je, {
|
|
493
493
|
icon: /* @__PURE__ */ g(Fe, { className: "size-4" }),
|
|
494
494
|
children: S("agentsPage.purpose", "Agents are the lightweight programs you install on your own machines (laptop, server, CI runner) that let VibeControls securely run terminal sessions and tasks there. Register an agent here, then attach it to a vibe to give that workspace a place to actually execute work — your code never leaves your hardware.")
|
|
495
495
|
}),
|
|
@@ -726,15 +726,15 @@ function at() {
|
|
|
726
726
|
variant: "danger",
|
|
727
727
|
isLoading: Et
|
|
728
728
|
}),
|
|
729
|
-
/* @__PURE__ */ g(
|
|
729
|
+
/* @__PURE__ */ g(Ye, {
|
|
730
730
|
open: A !== null,
|
|
731
731
|
onOpenChange: (e) => {
|
|
732
732
|
e || j(null);
|
|
733
733
|
},
|
|
734
|
-
children: A ? /* @__PURE__ */ _(
|
|
734
|
+
children: A ? /* @__PURE__ */ _(Xe, {
|
|
735
735
|
className: "sm:max-w-md",
|
|
736
736
|
children: [
|
|
737
|
-
/* @__PURE__ */ _(
|
|
737
|
+
/* @__PURE__ */ _($e, { children: [/* @__PURE__ */ g(et, { children: S("agentsPage.editTunnelTitle", "Edit Tunnel") }), /* @__PURE__ */ g(Ze, { children: S("agentsPage.editTunnelDescription", "Configure the cloudflared tunnel URL and API key for {{name}}.", { name: A.name }) })] }),
|
|
738
738
|
/* @__PURE__ */ _("div", {
|
|
739
739
|
className: "py-4",
|
|
740
740
|
children: [
|
|
@@ -743,7 +743,7 @@ function at() {
|
|
|
743
743
|
className: "mb-1.5 block text-sm font-medium text-text-primary",
|
|
744
744
|
children: S("agentsPage.tunnelUrlLabel", "Tunnel URL")
|
|
745
745
|
}),
|
|
746
|
-
/* @__PURE__ */ g(
|
|
746
|
+
/* @__PURE__ */ g(qe, {
|
|
747
747
|
...R.inputProps,
|
|
748
748
|
ref: Dt,
|
|
749
749
|
type: "url",
|
|
@@ -758,13 +758,13 @@ function at() {
|
|
|
758
758
|
})
|
|
759
759
|
]
|
|
760
760
|
}),
|
|
761
|
-
/* @__PURE__ */ _(
|
|
761
|
+
/* @__PURE__ */ _(Qe, { children: [/* @__PURE__ */ g(Ke, {
|
|
762
762
|
type: "button",
|
|
763
763
|
variant: "outline",
|
|
764
764
|
onClick: () => j(null),
|
|
765
765
|
className: "max-md:min-h-11",
|
|
766
766
|
children: S("agentsPage.cancel", "Cancel")
|
|
767
|
-
}), /* @__PURE__ */ g(
|
|
767
|
+
}), /* @__PURE__ */ g(Ke, {
|
|
768
768
|
type: "button",
|
|
769
769
|
onClick: un,
|
|
770
770
|
disabled: M,
|
|
@@ -43,8 +43,8 @@ import { useSearchParams as yt } from "react-router";
|
|
|
43
43
|
import { usePermissions as bt } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
44
44
|
import { AnimatePresence as xt } from "framer-motion";
|
|
45
45
|
import { Fragment as St, jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
46
|
-
import {
|
|
47
|
-
import {
|
|
46
|
+
import { useEventBus as Ct } from "@burdenoff/fe-libs/shared/events";
|
|
47
|
+
import { PagePurpose as wt } from "@burdenoff/fe-libs/ui";
|
|
48
48
|
import { AccessDenied as Tt, PermissionButton as Et } from "@burdenoff/fe-libs/shared/components";
|
|
49
49
|
import { MotionItem as Dt, MotionList as Ot, MotionPage as _ } from "@burdenoff/fe-libs/shared/motion";
|
|
50
50
|
import { useSafeShellUi as kt } from "@burdenoff/fe-libs/shared/providers/shell/ShellUiProvider";
|
|
@@ -81,7 +81,7 @@ function Mt(e, t, n, r) {
|
|
|
81
81
|
return e;
|
|
82
82
|
}
|
|
83
83
|
function Nt() {
|
|
84
|
-
let { t: Nt } = Ze(), { onSessionStart: Pt, workspaceId: v } = _e(), y =
|
|
84
|
+
let { t: Nt } = Ze(), { onSessionStart: Pt, workspaceId: v } = _e(), y = Ct(), b = ve(), { hasPermission: Ft, isLoading: It, permissions: Lt } = bt(), [Rt, zt] = yt(), x = u((e, t, n) => {
|
|
85
85
|
let r = Nt(e, n), i = r === e ? t : r;
|
|
86
86
|
return n ? Object.entries(n).reduce((e, [t, n]) => e.replace(`{{${t}}}`, String(n)), i) : i;
|
|
87
87
|
}, [Nt]), Bt = f(() => [
|
|
@@ -1838,7 +1838,7 @@ function Nt() {
|
|
|
1838
1838
|
]
|
|
1839
1839
|
})
|
|
1840
1840
|
}),
|
|
1841
|
-
/* @__PURE__ */ h(
|
|
1841
|
+
/* @__PURE__ */ h(wt, {
|
|
1842
1842
|
icon: /* @__PURE__ */ h(gt, { className: "size-4" }),
|
|
1843
1843
|
children: x("sessions.purpose", "Sessions are the live terminals and tasks running on your agents. Open a session to get a real shell (or an AI task) executing on your own machine through a vibe — watch its output stream in, share a read-only link, or review the logs afterwards. This page lists every session across your vibes so you can jump back into work or see what is still running.")
|
|
1844
1844
|
}),
|
|
@@ -37,13 +37,13 @@ import { Copy as Ge, Eye as Ke, LayoutGrid as qe, Link2 as Je, Pencil as Ye, Pla
|
|
|
37
37
|
import { usePermissions as et } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
38
38
|
import { AnimatePresence as tt } from "framer-motion";
|
|
39
39
|
import { jsx as u, jsxs as d } from "react/jsx-runtime";
|
|
40
|
-
import {
|
|
41
|
-
import {
|
|
40
|
+
import { useEventBus as nt } from "@burdenoff/fe-libs/shared/events";
|
|
41
|
+
import { PagePurpose as rt } from "@burdenoff/fe-libs/ui";
|
|
42
42
|
import { AccessDenied as it } from "@burdenoff/fe-libs/shared/components";
|
|
43
43
|
import { MotionPage as f } from "@burdenoff/fe-libs/shared/motion";
|
|
44
44
|
//#region src/pages/VibeDeckPage.tsx
|
|
45
45
|
function at() {
|
|
46
|
-
let at = fe(), { workspaceId: p } = de(), ot =
|
|
46
|
+
let at = fe(), { workspaceId: p } = de(), ot = nt(), { hasPermission: m, isLoading: st, permissions: h } = et(), g = ((e) => (t, n) => {
|
|
47
47
|
let r = e.t(t);
|
|
48
48
|
return r === t ? n : r;
|
|
49
49
|
})(We()), _ = (Array.isArray(h) ? h : h?.permissionStrings)?.some?.((e) => e.startsWith("vibedeck:")), ct = _ ? m(s.VIBEDECK_LIST) : !0, v = _ ? m(s.VIBEDECK_CREATE) : !0, lt = _ ? m(s.VIBEDECK_UPDATE) : !0, ut = _ ? m(s.VIBEDECK_DELETE) : !0, dt = _ ? m(s.VIBEDECK_EXECUTE) : !0, y = (Array.isArray(h) ? h : h?.permissionStrings)?.some?.((e) => e.startsWith("vibedeck-button:")), ft = y ? m(s.VIBEDECK_BUTTON_CREATE) : v, pt = y ? m(s.VIBEDECK_BUTTON_UPDATE) : lt, mt = y ? m(s.VIBEDECK_BUTTON_DELETE) : ut, ht = y ? m(s.VIBEDECK_BUTTON_EXECUTE) : dt, gt = st, { activeVibeDeckId: b, setActiveVibeDeckId: x, vibeDeckMode: _t, setVibeDeckMode: vt } = pe(), S = _t === "preview", yt = S ? !1 : v, bt = S ? !1 : lt, xt = S ? !1 : ut, St = S ? !1 : ft, Ct = S ? !1 : pt, wt = S ? !1 : mt, [C, w] = l({ type: "none" }), [Tt, Et] = l(null), [T, Dt] = l(/* @__PURE__ */ new Set()), [E, D] = l(/* @__PURE__ */ new Set()), [Ot, kt] = l(null), [At, O] = l(null), [k, A] = l(null), [jt, Mt] = l([]), j = Ue(/* @__PURE__ */ new Map()), [Nt, Pt] = l(Se), [Ft, It] = l([]), [Lt, Rt] = l(!0), [zt, Bt] = l(/* @__PURE__ */ new Map()), [Vt, Ht] = l(null), [M, Ut] = l(null), [Wt, Gt] = l(!1), { profiles: Kt } = Oe(M?.agentId ?? null), qt = Kt.find((e) => e.isDefault)?.name ?? "default", N = Ue(/* @__PURE__ */ new Map());
|
|
@@ -597,7 +597,7 @@ function at() {
|
|
|
597
597
|
]
|
|
598
598
|
})
|
|
599
599
|
}),
|
|
600
|
-
/* @__PURE__ */ u(
|
|
600
|
+
/* @__PURE__ */ u(rt, {
|
|
601
601
|
icon: /* @__PURE__ */ u(qe, { className: "size-4" }),
|
|
602
602
|
children: g("vibeDeck.purpose", "The Vibe Deck is your one-click command board: arrange the actions and webhooks you run most into tiles, then fire them with a single tap. Build a deck for a workflow (deploy, restart, run tests) so the whole team can execute the same operations consistently — Preview mode lets you try a layout safely before going live.")
|
|
603
603
|
}),
|
|
@@ -1,31 +1,31 @@
|
|
|
1
1
|
import { useDeleteTunnelMutation as e, useListAgentsQuery as t, useListTunnelsQuery as n, useStartTunnelMutation as r, useStopTunnelMutation as ee } from "../../generated/wspace-operations.js";
|
|
2
2
|
import { useTr as te } from "../../shared/hooks/useTr.js";
|
|
3
|
-
import { ConfirmDialog as
|
|
4
|
-
import { QuotaExhaustedDialog as
|
|
5
|
-
import { getQuotaDialogContent as
|
|
6
|
-
import { useVibeControls as
|
|
7
|
-
import { PageHeader as
|
|
8
|
-
import { LoadingState as
|
|
9
|
-
import { ErrorState as
|
|
10
|
-
import { EmptyState as
|
|
11
|
-
import { SearchInput as
|
|
12
|
-
import { FilterDropdown as
|
|
13
|
-
import { VIBE_PERMISSIONS as
|
|
14
|
-
import { TunnelCard as
|
|
15
|
-
import { useEffect as
|
|
16
|
-
import { Link as
|
|
17
|
-
import { usePermissions as
|
|
18
|
-
import { motion as
|
|
19
|
-
import { jsx as
|
|
20
|
-
import {
|
|
21
|
-
import {
|
|
3
|
+
import { ConfirmDialog as i } from "../../components/shared/ConfirmDialog.js";
|
|
4
|
+
import { QuotaExhaustedDialog as a } from "../../components/shared/QuotaExhaustedDialog.js";
|
|
5
|
+
import { getQuotaDialogContent as ne, isQuotaExhaustedError as o, markQuotaHandledLocally as s } from "../../utils/quotaUtils.js";
|
|
6
|
+
import { useVibeControls as re } from "../../providers/VibeControlsProvider.js";
|
|
7
|
+
import { PageHeader as c } from "../../components/shared/PageHeader.js";
|
|
8
|
+
import { LoadingState as l } from "../../components/shared/LoadingState.js";
|
|
9
|
+
import { ErrorState as u } from "../../components/shared/ErrorState.js";
|
|
10
|
+
import { EmptyState as d } from "../../components/shared/EmptyState.js";
|
|
11
|
+
import { SearchInput as f } from "../../components/shared/SearchInput.js";
|
|
12
|
+
import { FilterDropdown as p } from "../../components/shared/FilterDropdown.js";
|
|
13
|
+
import { VIBE_PERMISSIONS as m } from "../../constants/permissions.js";
|
|
14
|
+
import { TunnelCard as h } from "../../components/tunnels/TunnelCard.js";
|
|
15
|
+
import { useEffect as ie, useMemo as ae, useState as g } from "react";
|
|
16
|
+
import { Link as _, useNavigate as oe } from "react-router";
|
|
17
|
+
import { usePermissions as se } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
18
|
+
import { motion as ce } from "framer-motion";
|
|
19
|
+
import { jsx as v, jsxs as y } from "react/jsx-runtime";
|
|
20
|
+
import { useEventBus as le } from "@burdenoff/fe-libs/shared/events";
|
|
21
|
+
import { Button as b } from "@burdenoff/fe-libs/ui";
|
|
22
22
|
import { AccessDenied as x } from "@burdenoff/fe-libs/shared/components";
|
|
23
23
|
//#region src/pages/tunnels/TunnelsTab.tsx
|
|
24
24
|
var S = 4e3;
|
|
25
25
|
function C() {
|
|
26
|
-
let C = te(), { hasPermission: w, isLoading: T } =
|
|
26
|
+
let C = te(), { hasPermission: w, isLoading: T } = se(), E = w(m.TUNNEL_READ), D = w(m.TUNNEL_CREATE), O = w(m.TUNNEL_EXECUTE), ue = w(m.TUNNEL_DELETE), de = w(m.AGENT_READ), k = oe(), A = le(), { workspaceId: j } = re(), [M, N] = g(""), [P, F] = g("all"), [I, L] = g("all"), [R, z] = g(null), [B, V] = g(!1), [H, U] = g(/* @__PURE__ */ new Set()), { data: W, loading: fe, error: G, refetch: K, startPolling: q, stopPolling: J } = n({
|
|
27
27
|
variables: {
|
|
28
|
-
filter:
|
|
28
|
+
filter: ae(() => {
|
|
29
29
|
let e = {};
|
|
30
30
|
return P !== "all" && (e.providerKey = P), I !== "all" && (e.status = [I]), M.trim() && (e.search = M.trim()), e;
|
|
31
31
|
}, [
|
|
@@ -51,7 +51,7 @@ function C() {
|
|
|
51
51
|
window.dispatchEvent(new CustomEvent("vibecontrols:toast", { detail: t })), k("/vibecontrols/agents");
|
|
52
52
|
}
|
|
53
53
|
}, Z = H.size > 0 || X.some((e) => e.status === "PROVISIONING" || e.status === "DELETING" || e.status === "ACTIVE" && !e.primaryDomain?.hostname);
|
|
54
|
-
|
|
54
|
+
ie(() => {
|
|
55
55
|
Z ? q(S) : J();
|
|
56
56
|
}, [
|
|
57
57
|
Z,
|
|
@@ -74,12 +74,12 @@ function C() {
|
|
|
74
74
|
__typename: "Tunnel"
|
|
75
75
|
} }
|
|
76
76
|
});
|
|
77
|
-
n.error &&
|
|
77
|
+
n.error && o(n.error) ? (s(), V(!0), A.emitCustom("vibecontrols.quota.tunnel_limit_hit", { workspaceId: j ?? void 0 })) : n.error || A.emitCustom("vibecontrols.tunnel.started", {
|
|
78
78
|
workspaceId: j ?? void 0,
|
|
79
79
|
tunnelId: e
|
|
80
80
|
});
|
|
81
81
|
} catch (e) {
|
|
82
|
-
|
|
82
|
+
o(e) ? (s(), V(!0), A.emitCustom("vibecontrols.quota.tunnel_limit_hit", { workspaceId: j ?? void 0 })) : console.error("[TunnelsTab] startTunnel failed", e);
|
|
83
83
|
} finally {
|
|
84
84
|
$(e);
|
|
85
85
|
}
|
|
@@ -104,34 +104,34 @@ function C() {
|
|
|
104
104
|
}, [ye, { loading: be }] = e({ onCompleted: () => {
|
|
105
105
|
z(null), K();
|
|
106
106
|
} });
|
|
107
|
-
return T ? /* @__PURE__ */
|
|
107
|
+
return T ? /* @__PURE__ */ v(l, { message: C("common.loadingPermissions", "Loading permissions…") }) : E ? /* @__PURE__ */ y("div", {
|
|
108
108
|
className: "p-6 max-w-7xl mx-auto",
|
|
109
109
|
children: [
|
|
110
|
-
/* @__PURE__ */
|
|
110
|
+
/* @__PURE__ */ v(c, {
|
|
111
111
|
title: C("vibecontrols.tunnels.list.title", "Tunnels"),
|
|
112
112
|
description: C("vibecontrols.tunnels.list.description", "Expose local services on *.vibetunnels.com and custom domains."),
|
|
113
|
-
actions: D ? /* @__PURE__ */
|
|
113
|
+
actions: D ? /* @__PURE__ */ v(b, {
|
|
114
114
|
variant: "default",
|
|
115
115
|
asChild: !0,
|
|
116
|
-
children: /* @__PURE__ */ _
|
|
116
|
+
children: /* @__PURE__ */ v(_, {
|
|
117
117
|
to: "/vibecontrols/tunnels/new",
|
|
118
118
|
onClick: me,
|
|
119
119
|
children: C("vibecontrols.tunnels.list.newTunnel", "New tunnel")
|
|
120
120
|
})
|
|
121
121
|
}) : void 0
|
|
122
122
|
}),
|
|
123
|
-
/* @__PURE__ */
|
|
123
|
+
/* @__PURE__ */ y("div", {
|
|
124
124
|
className: "flex flex-col sm:flex-row gap-3 mb-4",
|
|
125
125
|
children: [
|
|
126
|
-
/* @__PURE__ */
|
|
126
|
+
/* @__PURE__ */ v("div", {
|
|
127
127
|
className: "flex-1",
|
|
128
|
-
children: /* @__PURE__ */
|
|
128
|
+
children: /* @__PURE__ */ v(f, {
|
|
129
129
|
value: M,
|
|
130
130
|
onChange: N,
|
|
131
131
|
placeholder: "Search tunnels by name or slug"
|
|
132
132
|
})
|
|
133
133
|
}),
|
|
134
|
-
/* @__PURE__ */
|
|
134
|
+
/* @__PURE__ */ v(p, {
|
|
135
135
|
label: "Provider",
|
|
136
136
|
value: P,
|
|
137
137
|
onChange: F,
|
|
@@ -150,7 +150,7 @@ function C() {
|
|
|
150
150
|
}
|
|
151
151
|
]
|
|
152
152
|
}),
|
|
153
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ v(p, {
|
|
154
154
|
label: "Status",
|
|
155
155
|
value: I,
|
|
156
156
|
onChange: L,
|
|
@@ -183,35 +183,35 @@ function C() {
|
|
|
183
183
|
})
|
|
184
184
|
]
|
|
185
185
|
}),
|
|
186
|
-
fe && !W && /* @__PURE__ */
|
|
187
|
-
G && /* @__PURE__ */
|
|
186
|
+
fe && !W && /* @__PURE__ */ v(l, { message: "Loading tunnels" }),
|
|
187
|
+
G && /* @__PURE__ */ v(u, {
|
|
188
188
|
title: "Failed to load tunnels",
|
|
189
189
|
message: G.message,
|
|
190
190
|
onRetry: () => K()
|
|
191
191
|
}),
|
|
192
|
-
W && X.length === 0 && !Y && /* @__PURE__ */
|
|
192
|
+
W && X.length === 0 && !Y && /* @__PURE__ */ v(d, {
|
|
193
193
|
title: C("vibecontrols.tunnels.list.noAgentTitle", "Create an agent first"),
|
|
194
194
|
description: C("vibecontrols.tunnels.list.noAgentDescription", "Tunnels need a VibeControls agent to forward traffic. Install + register an agent, then come back to create your first tunnel."),
|
|
195
|
-
action: /* @__PURE__ */
|
|
195
|
+
action: /* @__PURE__ */ v(b, {
|
|
196
196
|
variant: "default",
|
|
197
197
|
onClick: () => k("/vibecontrols/agents"),
|
|
198
198
|
children: C("vibecontrols.tunnels.list.setupAgent", "Set up an agent")
|
|
199
199
|
})
|
|
200
200
|
}),
|
|
201
|
-
W && X.length === 0 && Y && /* @__PURE__ */
|
|
201
|
+
W && X.length === 0 && Y && /* @__PURE__ */ v(d, {
|
|
202
202
|
title: C("vibecontrols.tunnels.list.emptyTitle", "No tunnels yet"),
|
|
203
203
|
description: C("vibecontrols.tunnels.list.emptyDescription", "Create your first tunnel to expose a local service."),
|
|
204
|
-
action: D ? /* @__PURE__ */
|
|
204
|
+
action: D ? /* @__PURE__ */ v(b, {
|
|
205
205
|
variant: "default",
|
|
206
206
|
onClick: () => k("/vibecontrols/tunnels/new"),
|
|
207
207
|
children: C("vibecontrols.tunnels.list.createTunnel", "Create tunnel")
|
|
208
208
|
}) : void 0
|
|
209
209
|
}),
|
|
210
|
-
X.length > 0 && /* @__PURE__ */
|
|
210
|
+
X.length > 0 && /* @__PURE__ */ v(ce.div, {
|
|
211
211
|
initial: { opacity: 0 },
|
|
212
212
|
animate: { opacity: 1 },
|
|
213
213
|
className: "space-y-3",
|
|
214
|
-
children: X.map((e) => /* @__PURE__ */
|
|
214
|
+
children: X.map((e) => /* @__PURE__ */ v(h, {
|
|
215
215
|
tunnel: e,
|
|
216
216
|
isPending: H.has(e.id),
|
|
217
217
|
onOpen: (e) => k(`/vibecontrols/tunnels/${e}`),
|
|
@@ -223,7 +223,7 @@ function C() {
|
|
|
223
223
|
}) : void 0
|
|
224
224
|
}, e.id))
|
|
225
225
|
}),
|
|
226
|
-
/* @__PURE__ */
|
|
226
|
+
/* @__PURE__ */ v(i, {
|
|
227
227
|
isOpen: R !== null,
|
|
228
228
|
onClose: () => z(null),
|
|
229
229
|
onConfirm: () => {
|
|
@@ -235,16 +235,16 @@ function C() {
|
|
|
235
235
|
variant: "danger",
|
|
236
236
|
isLoading: be
|
|
237
237
|
}),
|
|
238
|
-
/* @__PURE__ */
|
|
238
|
+
/* @__PURE__ */ v(a, {
|
|
239
239
|
isOpen: B,
|
|
240
240
|
onClose: () => V(!1),
|
|
241
241
|
onConfirm: () => {
|
|
242
242
|
V(!1), k("/billing/plans");
|
|
243
243
|
},
|
|
244
|
-
...
|
|
244
|
+
...ne("tunnel-start")
|
|
245
245
|
})
|
|
246
246
|
]
|
|
247
|
-
}) : /* @__PURE__ */
|
|
247
|
+
}) : /* @__PURE__ */ v(x, {
|
|
248
248
|
title: C("vibecontrols.tunnels.list.denied.title", "Access Denied"),
|
|
249
249
|
description: C("vibecontrols.tunnels.list.denied.description", "You do not have permission to view tunnels.")
|
|
250
250
|
});
|