@burdenoff/microfe-vibecontrols 2026.1022.4 → 2026.1023.2

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.
@@ -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 { jsx as n } from "react/jsx-runtime";
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 r({ isOpen: r, onClose: i, onConfirm: a, title: o, message: s, confirmLabel: c, cancelLabel: l }) {
6
- let u = e();
7
- return /* @__PURE__ */ n(t, {
8
- isOpen: r,
9
- onClose: i,
10
- onConfirm: a,
11
- title: o ?? u("vibecontrols.shared.quotaExhaustedDialog.title", "Quota Reached"),
12
- message: s,
13
- confirmLabel: c ?? u("vibecontrols.shared.quotaExhaustedDialog.viewBilling", "View Billing"),
14
- cancelLabel: l ?? u("vibecontrols.shared.quotaExhaustedDialog.dismiss", "Dismiss"),
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 { r as QuotaExhaustedDialog };
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 { Stepper as x } from "@burdenoff/fe-libs/ui";
19
- import { useEventBus as S } from "@burdenoff/fe-libs/shared/events";
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 = S(), { 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) => {
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(x, {
141
+ /* @__PURE__ */ y(S, {
142
142
  className: "mb-6",
143
143
  active: M,
144
144
  onStepClick: (e) => e <= M && N(e),
@@ -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 { Button as Ge, Input as Ke, PagePurpose as qe, ResponsiveDialog as Je, ResponsiveDialogContent as Ye, ResponsiveDialogDescription as Xe, ResponsiveDialogFooter as Ze, ResponsiveDialogHeader as Qe, ResponsiveDialogTitle as $e } from "@burdenoff/fe-libs/ui";
38
- import { useEventBus as et } from "@burdenoff/fe-libs/shared/events";
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 = et(), { hasPermission: ot, isLoading: st, permissions: ct } = Ue(), S = le(), lt = [
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(qe, {
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(Je, {
729
+ /* @__PURE__ */ g(Ye, {
730
730
  open: A !== null,
731
731
  onOpenChange: (e) => {
732
732
  e || j(null);
733
733
  },
734
- children: A ? /* @__PURE__ */ _(Ye, {
734
+ children: A ? /* @__PURE__ */ _(Xe, {
735
735
  className: "sm:max-w-md",
736
736
  children: [
737
- /* @__PURE__ */ _(Qe, { children: [/* @__PURE__ */ g($e, { children: S("agentsPage.editTunnelTitle", "Edit Tunnel") }), /* @__PURE__ */ g(Xe, { children: S("agentsPage.editTunnelDescription", "Configure the cloudflared tunnel URL and API key for {{name}}.", { name: A.name }) })] }),
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(Ke, {
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__ */ _(Ze, { children: [/* @__PURE__ */ g(Ge, {
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(Ge, {
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 { PagePurpose as Ct } from "@burdenoff/fe-libs/ui";
47
- import { useEventBus as wt } from "@burdenoff/fe-libs/shared/events";
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 = wt(), b = ve(), { hasPermission: Ft, isLoading: It, permissions: Lt } = bt(), [Rt, zt] = yt(), x = u((e, t, n) => {
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(Ct, {
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 { PagePurpose as nt } from "@burdenoff/fe-libs/ui";
41
- import { useEventBus as rt } from "@burdenoff/fe-libs/shared/events";
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 = rt(), { hasPermission: m, isLoading: st, permissions: h } = et(), g = ((e) => (t, n) => {
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(nt, {
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 ne } from "../../components/shared/ConfirmDialog.js";
4
- import { QuotaExhaustedDialog as i } from "../../components/shared/QuotaExhaustedDialog.js";
5
- import { getQuotaDialogContent as re, isQuotaExhaustedError as a, markQuotaHandledLocally as o } from "../../utils/quotaUtils.js";
6
- import { useVibeControls as ie } from "../../providers/VibeControlsProvider.js";
7
- import { PageHeader as s } from "../../components/shared/PageHeader.js";
8
- import { LoadingState as c } from "../../components/shared/LoadingState.js";
9
- import { ErrorState as l } from "../../components/shared/ErrorState.js";
10
- import { EmptyState as u } from "../../components/shared/EmptyState.js";
11
- import { SearchInput as d } from "../../components/shared/SearchInput.js";
12
- import { FilterDropdown as f } from "../../components/shared/FilterDropdown.js";
13
- import { VIBE_PERMISSIONS as p } from "../../constants/permissions.js";
14
- import { TunnelCard as m } from "../../components/tunnels/TunnelCard.js";
15
- import { useEffect as ae, useMemo as oe, useState as h } from "react";
16
- import { Link as g, useNavigate as se } from "react-router";
17
- import { usePermissions as ce } from "@burdenoff/fe-libs/shared/providers/shell";
18
- import { motion as le } from "framer-motion";
19
- import { jsx as _, jsxs as v } from "react/jsx-runtime";
20
- import { Button as y } from "@burdenoff/fe-libs/ui";
21
- import { useEventBus as b } from "@burdenoff/fe-libs/shared/events";
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 } = ce(), E = w(p.TUNNEL_READ), D = w(p.TUNNEL_CREATE), O = w(p.TUNNEL_EXECUTE), ue = w(p.TUNNEL_DELETE), de = w(p.AGENT_READ), k = se(), A = b(), { workspaceId: j } = ie(), [M, N] = h(""), [P, F] = h("all"), [I, L] = h("all"), [R, z] = h(null), [B, V] = h(!1), [H, U] = h(/* @__PURE__ */ new Set()), { data: W, loading: fe, error: G, refetch: K, startPolling: q, stopPolling: J } = n({
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: oe(() => {
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
- ae(() => {
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 && a(n.error) ? (o(), V(!0), A.emitCustom("vibecontrols.quota.tunnel_limit_hit", { workspaceId: j ?? void 0 })) : n.error || A.emitCustom("vibecontrols.tunnel.started", {
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
- a(e) ? (o(), V(!0), A.emitCustom("vibecontrols.quota.tunnel_limit_hit", { workspaceId: j ?? void 0 })) : console.error("[TunnelsTab] startTunnel failed", e);
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__ */ _(c, { message: C("common.loadingPermissions", "Loading permissions…") }) : E ? /* @__PURE__ */ v("div", {
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__ */ _(s, {
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__ */ _(y, {
113
+ actions: D ? /* @__PURE__ */ v(b, {
114
114
  variant: "default",
115
115
  asChild: !0,
116
- children: /* @__PURE__ */ _(g, {
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__ */ v("div", {
123
+ /* @__PURE__ */ y("div", {
124
124
  className: "flex flex-col sm:flex-row gap-3 mb-4",
125
125
  children: [
126
- /* @__PURE__ */ _("div", {
126
+ /* @__PURE__ */ v("div", {
127
127
  className: "flex-1",
128
- children: /* @__PURE__ */ _(d, {
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__ */ _(f, {
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__ */ _(f, {
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__ */ _(c, { message: "Loading tunnels" }),
187
- G && /* @__PURE__ */ _(l, {
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__ */ _(u, {
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__ */ _(y, {
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__ */ _(u, {
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__ */ _(y, {
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__ */ _(le.div, {
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__ */ _(m, {
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__ */ _(ne, {
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__ */ _(i, {
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
- ...re("tunnel-start")
244
+ ...ne("tunnel-start")
245
245
  })
246
246
  ]
247
- }) : /* @__PURE__ */ _(x, {
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
  });
package/dist/plugin.js CHANGED
@@ -4,7 +4,7 @@ var i = {
4
4
  manifest: {
5
5
  id: "vibecontrols",
6
6
  name: "VibeControls",
7
- version: "2026.328.1",
7
+ version: "2026.1023.1",
8
8
  description: "Development environment management — agents, sessions, tunnels, vibes",
9
9
  activationEvents: [{ type: "eager" }],
10
10
  contributes: { commands: [
@@ -56,7 +56,7 @@ var i = {
56
56
  id: "vc:toggle-ai-assistant",
57
57
  pluginId: "vibecontrols",
58
58
  label: "Toggle AI Assistant",
59
- description: "Open or close the AI assistant panel",
59
+ description: "Open or close the AI assistant panel (Ctrl+Shift+A)",
60
60
  icon: t,
61
61
  keywords: [
62
62
  "ai",
@@ -64,7 +64,6 @@ var i = {
64
64
  "chat",
65
65
  "help"
66
66
  ],
67
- shortcut: "Ctrl+Shift+A",
68
67
  section: "VibeControls",
69
68
  execute: () => {}
70
69
  }
@@ -75,7 +74,6 @@ var i = {
75
74
  for (let n of t) n.id === "vc:go-to-agents" ? n.execute = () => e.shell.navigate("/vibecontrols/agents") : n.id === "vc:go-to-vibes" ? n.execute = () => e.shell.navigate("/vibecontrols/vibes") : n.id === "vc:go-to-sessions" ? n.execute = () => e.shell.navigate("/vibecontrols/sessions") : n.id === "vc:toggle-ai-assistant" && (n.execute = () => {
76
75
  window.dispatchEvent(new CustomEvent("vc:toggle-ai-assistant"));
77
76
  });
78
- e.events.on("context:workspace-changed", () => {});
79
77
  }
80
78
  };
81
79
  //#endregion
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@burdenoff/microfe-vibecontrols",
3
- "version": "2026.1022.4",
3
+ "version": "2026.1023.2",
4
4
  "description": "VibeControls microfrontend for Burdenoff products",
5
5
  "type": "module",
6
6
  "files": [