@burdenoff/microfe-vibecontrols 2026.528.7 → 2026.528.8
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/VibeControlsRoot.js +1 -0
- package/dist/VibeControlsRoot.js.map +1 -1
- package/dist/components/audit/AuditLogFilters.js +71 -47
- package/dist/components/audit/AuditLogFilters.js.map +1 -1
- package/dist/components/shared/AgentSetupBanner.js +50 -45
- package/dist/components/shared/AgentSetupBanner.js.map +1 -1
- package/dist/components/shared/LinkToVibePanel.js +97 -0
- package/dist/components/shared/LinkToVibePanel.js.map +1 -0
- package/dist/components/shared/index.js +1 -0
- package/dist/components/vibe/VibeLinkedEntitiesPanel.js +60 -0
- package/dist/components/vibe/VibeLinkedEntitiesPanel.js.map +1 -0
- package/dist/components/vibedeck/VibeDeckButtonTile.js +25 -23
- package/dist/components/vibedeck/VibeDeckButtonTile.js.map +1 -1
- package/dist/components/vibedeck/VibeDeckGrid.js +2 -2
- package/dist/components/vibedeck/VibeDeckGrid.js.map +1 -1
- package/dist/microfe-vibecontrols.css +1 -1
- package/dist/pages/AgentDetailsPage.js +2 -2
- package/dist/pages/AgentDetailsPage.js.map +1 -1
- package/dist/pages/AnalyticsPage.js +255 -204
- package/dist/pages/AnalyticsPage.js.map +1 -1
- package/dist/pages/OverviewPage.js +1 -11
- package/dist/pages/OverviewPage.js.map +1 -1
- package/dist/pages/SessionsPage.js +825 -629
- package/dist/pages/SessionsPage.js.map +1 -1
- package/dist/pages/VibeAuditPage.js +184 -153
- package/dist/pages/VibeAuditPage.js.map +1 -1
- package/dist/pages/VibeDeckPage.js +416 -379
- package/dist/pages/VibeDeckPage.js.map +1 -1
- package/dist/pages/VibeDetailsPage.js +621 -557
- package/dist/pages/VibeDetailsPage.js.map +1 -1
- package/dist/pages/tunnels/TunnelsTab.js +115 -90
- package/dist/pages/tunnels/TunnelsTab.js.map +1 -1
- package/package.json +1 -1
|
@@ -11,31 +11,31 @@ import { EntityTagPicker as Se } from "../components/shared/EntityTagPicker.js";
|
|
|
11
11
|
import { useDraftEntityTags as Ce } from "../hooks/useDraftEntityTags.js";
|
|
12
12
|
import { EmptyState as we } from "../components/shared/EmptyState.js";
|
|
13
13
|
import { SearchInput as Te } from "../components/shared/SearchInput.js";
|
|
14
|
-
import { FilterDropdown as
|
|
15
|
-
import { AgentSetupBanner as
|
|
16
|
-
import { GetHelpButton as
|
|
17
|
-
import { SearchableSelect as
|
|
18
|
-
import
|
|
14
|
+
import { FilterDropdown as Ee } from "../components/shared/FilterDropdown.js";
|
|
15
|
+
import { AgentSetupBanner as De } from "../components/shared/AgentSetupBanner.js";
|
|
16
|
+
import { GetHelpButton as Oe } from "../components/shared/GetHelpButton.js";
|
|
17
|
+
import { SearchableSelect as l } from "../components/shared/SearchableSelect.js";
|
|
18
|
+
import ke from "../components/shared/SessionNotificationBanner.js";
|
|
19
19
|
import "../components/shared/index.js";
|
|
20
|
-
import { VIBE_PERMISSIONS as
|
|
21
|
-
import { SessionCard as
|
|
22
|
-
import { SessionList as
|
|
23
|
-
import { TerminalPanel as
|
|
24
|
-
import { SessionShareDialog as
|
|
20
|
+
import { VIBE_PERMISSIONS as Ae } from "../constants/permissions.js";
|
|
21
|
+
import { SessionCard as je } from "../components/sessions/SessionCard.js";
|
|
22
|
+
import { SessionList as Me } from "../components/sessions/SessionList.js";
|
|
23
|
+
import { TerminalPanel as Ne } from "../components/sessions/TerminalPanel.js";
|
|
24
|
+
import { SessionShareDialog as Pe } from "../components/sessions/SessionShareDialog.js";
|
|
25
25
|
import "../components/sessions/index.js";
|
|
26
|
-
import { useCallback as
|
|
27
|
-
import { useI18n as
|
|
28
|
-
import { Activity as
|
|
29
|
-
import { useSearchParams as
|
|
30
|
-
import { usePermissions as
|
|
31
|
-
import { AnimatePresence as
|
|
32
|
-
import { jsx as
|
|
33
|
-
import { SaveToFilesButton as
|
|
34
|
-
import { MotionItem as
|
|
35
|
-
import { AccessDenied as
|
|
26
|
+
import { useCallback as u, useEffect as d, useMemo as f, useRef as p, useState as m } from "react";
|
|
27
|
+
import { useI18n as Fe } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
28
|
+
import { Activity as Ie, CheckSquare as Le, Grid as Re, List as ze, Monitor as Be, Play as Ve, Plus as He, RefreshCw as Ue, RotateCcw as We, Square as Ge, Terminal as Ke, Trash2 as qe, XSquare as Je } from "lucide-react";
|
|
29
|
+
import { useSearchParams as Ye } from "react-router-dom";
|
|
30
|
+
import { usePermissions as Xe } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
31
|
+
import { AnimatePresence as Ze } from "framer-motion";
|
|
32
|
+
import { jsx as h, jsxs as g } from "react/jsx-runtime";
|
|
33
|
+
import { SaveToFilesButton as Qe } from "@burdenoff/fe-libs/storage";
|
|
34
|
+
import { MotionItem as $e, MotionList as et, MotionPage as _ } from "@burdenoff/fe-libs/shared/motion";
|
|
35
|
+
import { AccessDenied as tt, PermissionButton as nt } from "@burdenoff/fe-libs/shared/components";
|
|
36
36
|
//#region src/pages/SessionsPage.tsx
|
|
37
|
-
var
|
|
38
|
-
function
|
|
37
|
+
var rt = 3e5;
|
|
38
|
+
function it(e, t) {
|
|
39
39
|
if (!e) return null;
|
|
40
40
|
try {
|
|
41
41
|
let n = new URL(e);
|
|
@@ -52,7 +52,7 @@ function nt(e, t) {
|
|
|
52
52
|
return e;
|
|
53
53
|
}
|
|
54
54
|
}
|
|
55
|
-
function
|
|
55
|
+
function at(e, t, n, r) {
|
|
56
56
|
if (e !== "RUNNING") return e;
|
|
57
57
|
if (r === !1) return "ERROR";
|
|
58
58
|
if (!t) return e;
|
|
@@ -65,223 +65,236 @@ function rt(e, t, n, r) {
|
|
|
65
65
|
}
|
|
66
66
|
return e;
|
|
67
67
|
}
|
|
68
|
-
function
|
|
69
|
-
let { t:
|
|
70
|
-
let r =
|
|
68
|
+
function ot() {
|
|
69
|
+
let { t: ot } = Fe(), { onSessionStart: st, workspaceId: ct } = he(), lt = ge(), { hasPermission: ut, isLoading: dt, permissions: ft } = Xe(), [pt, mt] = Ye(), v = u((e, t, n) => {
|
|
70
|
+
let r = ot(e, n), i = r === e ? t : r;
|
|
71
71
|
return n ? Object.entries(n).reduce((e, [t, n]) => e.replace(`{{${t}}}`, String(n)), i) : i;
|
|
72
|
-
}, [
|
|
72
|
+
}, [ot]), ht = f(() => [
|
|
73
73
|
{
|
|
74
74
|
value: "all",
|
|
75
|
-
label:
|
|
75
|
+
label: v("sessions.statusAll", "All Statuses")
|
|
76
76
|
},
|
|
77
77
|
{
|
|
78
78
|
value: "RUNNING",
|
|
79
|
-
label:
|
|
79
|
+
label: v("sessions.running", "Running")
|
|
80
80
|
},
|
|
81
81
|
{
|
|
82
82
|
value: "STOPPED",
|
|
83
|
-
label:
|
|
83
|
+
label: v("sessions.stopped", "Stopped")
|
|
84
84
|
},
|
|
85
85
|
{
|
|
86
86
|
value: "STARTING",
|
|
87
|
-
label:
|
|
87
|
+
label: v("sessions.starting", "Starting")
|
|
88
88
|
},
|
|
89
89
|
{
|
|
90
90
|
value: "ERROR",
|
|
91
|
-
label:
|
|
91
|
+
label: v("common.error", "Error")
|
|
92
92
|
}
|
|
93
|
-
], [
|
|
93
|
+
], [v]), gt = f(() => [
|
|
94
94
|
{
|
|
95
95
|
value: "all",
|
|
96
|
-
label:
|
|
96
|
+
label: v("sessions.typeAll", "All Types")
|
|
97
97
|
},
|
|
98
98
|
{
|
|
99
99
|
value: "TMUX",
|
|
100
|
-
label:
|
|
100
|
+
label: v("sessions.typeTmux", "Tmux")
|
|
101
101
|
},
|
|
102
102
|
{
|
|
103
103
|
value: "TERMINAL",
|
|
104
|
-
label:
|
|
104
|
+
label: v("sessions.typeTerminal", "Terminal")
|
|
105
105
|
},
|
|
106
106
|
{
|
|
107
107
|
value: "SCRIPT",
|
|
108
|
-
label:
|
|
108
|
+
label: v("sessions.typeScript", "Script")
|
|
109
109
|
},
|
|
110
110
|
{
|
|
111
111
|
value: "CUSTOM",
|
|
112
|
-
label:
|
|
112
|
+
label: v("sessions.typeCustom", "Custom")
|
|
113
113
|
}
|
|
114
|
-
], [
|
|
115
|
-
|
|
116
|
-
U || (W === "terminal" || W === "grid" || W === "list" ?
|
|
114
|
+
], [v]), _t = ut(Ae.SESSION_LIST), vt = ut(Ae.SESSION_CREATE), [y, yt] = m(""), [b, bt] = m("all"), [x, xt] = m("all"), [S, St] = m("all"), [C, Ct] = m("all"), [w, T] = m("terminal"), [wt, E] = m(!1), [Tt, D] = m(!1), [Et, O] = m(null), [Dt, Ot] = m(!1), [k, A] = m(null), [j, M] = m(/* @__PURE__ */ new Set()), [kt, N] = m(!1), [At, jt] = m(!1), Mt = p(null), Nt = p(null), Pt = p(null), Ft = p(null), [It, Lt] = m(""), [Rt, zt] = m(""), [P, Bt] = m("TMUX"), [Vt, Ht] = m(!1), { terminalTabs: Ut, activeTerminalTabId: Wt, sessionsViewMode: Gt, setTerminalTabs: Kt, setActiveTerminalTabId: qt, setSessionsViewMode: Jt, activeSessionId: F } = _e(), [I, L] = m([]), [R, z] = m(null), [Yt, Xt] = m(!1), [Zt, B] = m(!1), [V, Qt] = m(""), [$t, H] = m(!1), [en, tn] = m(null), [nn, rn] = m(!1), [U, an] = m(!1), W = pt.get("view"), on = pt.get("session"), [sn] = c({ refetchQueries: ["ListSessions"] }), { setDraftTagIds: cn, flushTags: ln } = Ce("VIBECONTROLS_SESSION"), [un, dn] = m(!1), [fn, pn] = m(""), [mn, hn] = m(null), [gn, _n] = m(null), [vn, { data: yn, loading: bn }] = a({ fetchPolicy: "network-only" }), [xn] = i({ refetchQueries: ["ListSessions"] }), [Sn] = se({ refetchQueries: ["ListSessions"] }), [Cn] = le({ refetchQueries: ["ListSessions"] }), [wn] = ie({ refetchQueries: ["ListSessions"] }), [G] = ce({ refetchQueries: ["ListSessions"] }), [Tn] = ue({ refetchQueries: ["ListSessions"] }), [En] = ae({ refetchQueries: ["ListSessions"] }), [Dn] = fe({ refetchQueries: ["ListSessions"] }), [On] = de({ refetchQueries: ["ListSessions"] }), [kn] = s({ refetchQueries: ["ListSessions"] }), [An] = te({ refetchQueries: ["ListSessions"] }), [jn] = ee({ refetchQueries: ["ListSessions"] }), [Mn] = o({ refetchQueries: ["ListSessions"] }), [Nn] = ne();
|
|
115
|
+
d(() => {
|
|
116
|
+
U || (W === "terminal" || W === "grid" || W === "list" ? T(W) : Gt && T(Gt), on ? z(on) : Wt && z(Wt), Ut.length > 0 && L(Ut.map((e) => ({
|
|
117
117
|
sessionId: e.sessionId,
|
|
118
118
|
name: e.name,
|
|
119
119
|
terminalUrl: null,
|
|
120
120
|
loading: !1,
|
|
121
121
|
error: null
|
|
122
|
-
}))),
|
|
122
|
+
}))), an(!0));
|
|
123
123
|
}, [
|
|
124
|
-
Vt,
|
|
125
|
-
Ht,
|
|
126
124
|
Ut,
|
|
127
|
-
|
|
125
|
+
Wt,
|
|
126
|
+
Gt,
|
|
127
|
+
on,
|
|
128
128
|
W,
|
|
129
129
|
U
|
|
130
130
|
]);
|
|
131
|
-
let
|
|
132
|
-
|
|
133
|
-
U &&
|
|
131
|
+
let Pn = p(!1);
|
|
132
|
+
d(() => {
|
|
133
|
+
U && Kt(I.map((e) => ({
|
|
134
134
|
sessionId: e.sessionId,
|
|
135
135
|
name: e.name
|
|
136
136
|
})));
|
|
137
137
|
}, [
|
|
138
|
-
|
|
138
|
+
I,
|
|
139
139
|
U,
|
|
140
|
-
|
|
141
|
-
]),
|
|
142
|
-
U &&
|
|
140
|
+
Kt
|
|
141
|
+
]), d(() => {
|
|
142
|
+
U && qt(R);
|
|
143
143
|
}, [
|
|
144
|
-
|
|
144
|
+
R,
|
|
145
145
|
U,
|
|
146
|
-
|
|
147
|
-
]),
|
|
148
|
-
U &&
|
|
146
|
+
qt
|
|
147
|
+
]), d(() => {
|
|
148
|
+
U && Jt(w);
|
|
149
149
|
}, [
|
|
150
|
-
|
|
150
|
+
w,
|
|
151
151
|
U,
|
|
152
|
-
|
|
153
|
-
]),
|
|
152
|
+
Jt
|
|
153
|
+
]), d(() => {
|
|
154
154
|
if (!U) return;
|
|
155
|
-
let e = new URLSearchParams(
|
|
156
|
-
n ? e.get("view") !== n && (e.set("view", n), t = !0) : e.has("view") && (e.delete("view"), t = !0),
|
|
155
|
+
let e = new URLSearchParams(pt), t = !1, n = w === "terminal" ? null : w;
|
|
156
|
+
n ? e.get("view") !== n && (e.set("view", n), t = !0) : e.has("view") && (e.delete("view"), t = !0), R ? e.get("session") !== R && (e.set("session", R), t = !0) : e.has("session") && (e.delete("session"), t = !0), t && mt(e, { replace: !0 });
|
|
157
157
|
}, [
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
158
|
+
R,
|
|
159
|
+
pt,
|
|
160
|
+
mt,
|
|
161
161
|
U,
|
|
162
|
-
|
|
162
|
+
w
|
|
163
163
|
]);
|
|
164
|
-
let K =
|
|
164
|
+
let K = p(null);
|
|
165
165
|
oe({
|
|
166
|
-
skip: !
|
|
167
|
-
variables: { workspaceId:
|
|
168
|
-
}),
|
|
166
|
+
skip: !ct,
|
|
167
|
+
variables: { workspaceId: ct || "" }
|
|
168
|
+
}), d(() => {
|
|
169
169
|
let e = setInterval(() => {
|
|
170
|
-
|
|
171
|
-
},
|
|
170
|
+
kn().catch(() => {});
|
|
171
|
+
}, rt);
|
|
172
172
|
return () => clearInterval(e);
|
|
173
|
-
}, [
|
|
173
|
+
}, [kn]), d(() => {
|
|
174
174
|
let e = (e) => {
|
|
175
175
|
let t = e.target;
|
|
176
176
|
if (t.tagName === "INPUT" || t.tagName === "TEXTAREA" || t.tagName === "SELECT" || t.isContentEditable) return;
|
|
177
177
|
let n = e.metaKey || e.ctrlKey;
|
|
178
178
|
if (n && e.key === "t") {
|
|
179
|
-
e.preventDefault(),
|
|
179
|
+
e.preventDefault(), E(!0);
|
|
180
180
|
return;
|
|
181
181
|
}
|
|
182
|
-
if (n && e.key === "w" &&
|
|
182
|
+
if (n && e.key === "w" && R) {
|
|
183
183
|
e.preventDefault();
|
|
184
|
-
let t =
|
|
185
|
-
|
|
186
|
-
let e =
|
|
184
|
+
let t = R;
|
|
185
|
+
L((e) => e.filter((e) => e.sessionId !== t)), z(() => {
|
|
186
|
+
let e = I.filter((e) => e.sessionId !== t);
|
|
187
187
|
return e.length > 0 ? e[e.length - 1].sessionId : null;
|
|
188
188
|
});
|
|
189
189
|
return;
|
|
190
190
|
}
|
|
191
|
-
if (e.ctrlKey && e.key === "Tab" && !e.shiftKey &&
|
|
192
|
-
e.preventDefault(),
|
|
191
|
+
if (e.ctrlKey && e.key === "Tab" && !e.shiftKey && I.length > 1) {
|
|
192
|
+
e.preventDefault(), z(I[(I.findIndex((e) => e.sessionId === R) + 1) % I.length].sessionId);
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
if (e.ctrlKey && e.key === "Tab" && e.shiftKey && I.length > 1) {
|
|
196
|
+
e.preventDefault(), z(I[(I.findIndex((e) => e.sessionId === R) - 1 + I.length) % I.length].sessionId);
|
|
193
197
|
return;
|
|
194
198
|
}
|
|
195
|
-
if (
|
|
196
|
-
|
|
199
|
+
if (n && /^[1-9]$/.test(e.key) && I.length > 0) {
|
|
200
|
+
let t = Number(e.key) - 1;
|
|
201
|
+
t < I.length && (e.preventDefault(), z(I[t].sessionId));
|
|
202
|
+
return;
|
|
203
|
+
}
|
|
204
|
+
if (n && (e.key === "p" || e.key === "P")) {
|
|
205
|
+
e.preventDefault(), Qt(""), B(!0);
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
if (!n && !e.altKey && !e.shiftKey && e.key === "?") {
|
|
209
|
+
e.preventDefault(), Xt(!0);
|
|
197
210
|
return;
|
|
198
211
|
}
|
|
199
212
|
};
|
|
200
213
|
return document.addEventListener("keydown", e), () => document.removeEventListener("keydown", e);
|
|
201
|
-
}, [
|
|
202
|
-
let { data:
|
|
214
|
+
}, [R, I]);
|
|
215
|
+
let { data: Fn, previousData: In, loading: q, error: Ln, refetch: J } = re({
|
|
203
216
|
variables: {
|
|
204
217
|
filter: {
|
|
205
|
-
status:
|
|
206
|
-
type:
|
|
207
|
-
vibeId:
|
|
208
|
-
agentId:
|
|
218
|
+
status: b === "all" ? void 0 : b,
|
|
219
|
+
type: x === "all" ? void 0 : x,
|
|
220
|
+
vibeId: S !== "all" && S !== "none" ? S : void 0,
|
|
221
|
+
agentId: C === "all" ? void 0 : C
|
|
209
222
|
},
|
|
210
223
|
pagination: { limit: 50 }
|
|
211
224
|
},
|
|
212
|
-
fetchPolicy:
|
|
213
|
-
}),
|
|
225
|
+
fetchPolicy: b === "all" && x === "all" && S === "all" && C === "all" ? "cache-first" : "cache-and-network"
|
|
226
|
+
}), Rn = Fn ?? In, { agents: zn, vibes: Y } = ve(), [Bn, Vn] = me({
|
|
214
227
|
fetchPolicy: "network-only",
|
|
215
228
|
notifyOnNetworkStatusChange: !0
|
|
216
|
-
}), { data:
|
|
217
|
-
let e = /* @__PURE__ */ new Map(), t =
|
|
229
|
+
}), { data: Hn } = pe(), Un = f(() => {
|
|
230
|
+
let e = /* @__PURE__ */ new Map(), t = Hn?.vibecontrolsAgentHealthProbeStream ?? Vn.data?.vibecontrolsAgentHealthProbes ?? [];
|
|
218
231
|
for (let n of t) e.set(n.agentId, {
|
|
219
232
|
healthy: n.healthy,
|
|
220
233
|
error: n.errorMessage ?? null
|
|
221
234
|
});
|
|
222
235
|
return e;
|
|
223
|
-
}, [
|
|
236
|
+
}, [Vn.data, Hn]), Wn = f(() => [
|
|
224
237
|
{
|
|
225
238
|
value: "all",
|
|
226
|
-
label:
|
|
239
|
+
label: v("sessions.filterVibeAll", "All Vibes")
|
|
227
240
|
},
|
|
228
241
|
{
|
|
229
242
|
value: "none",
|
|
230
|
-
label:
|
|
243
|
+
label: v("sessions.filterVibeNone", "No Vibe")
|
|
231
244
|
},
|
|
232
245
|
...Y.map((e) => ({
|
|
233
246
|
value: e.id,
|
|
234
247
|
label: e.name
|
|
235
248
|
}))
|
|
236
|
-
], [Y,
|
|
249
|
+
], [Y, v]), Gn = f(() => [{
|
|
237
250
|
value: "all",
|
|
238
|
-
label:
|
|
239
|
-
}, ...
|
|
251
|
+
label: v("sessions.filterAgentAll", "All Agents")
|
|
252
|
+
}, ...zn.map((e) => ({
|
|
240
253
|
value: e.id,
|
|
241
|
-
label: `${e.name} ${e.isActive ? "" : `(${
|
|
242
|
-
}))], [
|
|
254
|
+
label: `${e.name} ${e.isActive ? "" : `(${v("sessions.offline", "Offline")})`}`
|
|
255
|
+
}))], [zn, v]), Kn = f(() => [{
|
|
243
256
|
value: "",
|
|
244
|
-
label:
|
|
257
|
+
label: v("sessions.noVibe", "No vibe")
|
|
245
258
|
}, ...Y.map((e) => ({
|
|
246
259
|
value: e.id,
|
|
247
260
|
label: e.name
|
|
248
|
-
}))], [Y,
|
|
261
|
+
}))], [Y, v]), qn = f(() => [{
|
|
249
262
|
value: "",
|
|
250
|
-
label:
|
|
251
|
-
}, ...
|
|
263
|
+
label: v("sessions.selectAgent", "Select an agent")
|
|
264
|
+
}, ...zn.map((e) => ({
|
|
252
265
|
value: e.id,
|
|
253
|
-
label: `${e.name} ${e.isActive ? `(${
|
|
254
|
-
}))], [
|
|
266
|
+
label: `${e.name} ${e.isActive ? `(${v("sessions.active", "Active")})` : `(${v("sessions.offline", "Offline")})`}`
|
|
267
|
+
}))], [zn, v]), Jn = f(() => [
|
|
255
268
|
{
|
|
256
269
|
value: "TMUX",
|
|
257
|
-
label:
|
|
270
|
+
label: v("sessions.typeTmuxLower", "tmux")
|
|
258
271
|
},
|
|
259
272
|
{
|
|
260
273
|
value: "WEZTERM",
|
|
261
|
-
label:
|
|
274
|
+
label: v("sessions.typeWezTerm", "WezTerm")
|
|
262
275
|
},
|
|
263
276
|
{
|
|
264
277
|
value: "ZELLIJ",
|
|
265
|
-
label:
|
|
278
|
+
label: v("sessions.typeZellij", "Zellij")
|
|
266
279
|
},
|
|
267
280
|
{
|
|
268
281
|
value: "TERMINAL",
|
|
269
|
-
label:
|
|
282
|
+
label: v("sessions.typeTerminal", "Terminal")
|
|
270
283
|
},
|
|
271
284
|
{
|
|
272
285
|
value: "SSH",
|
|
273
|
-
label:
|
|
286
|
+
label: v("sessions.typeSsh", "SSH")
|
|
274
287
|
},
|
|
275
288
|
{
|
|
276
289
|
value: "SCRIPT",
|
|
277
|
-
label:
|
|
290
|
+
label: v("sessions.typeScript", "Script")
|
|
278
291
|
},
|
|
279
292
|
{
|
|
280
293
|
value: "CUSTOM",
|
|
281
|
-
label:
|
|
294
|
+
label: v("sessions.typeCustom", "Custom")
|
|
282
295
|
}
|
|
283
|
-
], [
|
|
284
|
-
let t =
|
|
296
|
+
], [v]), X = f(() => (Rn?.sessions?.items ?? []).map((e) => {
|
|
297
|
+
let t = it(e.ttydUrl || null, e.agent?.tunnelUrl || null);
|
|
285
298
|
return {
|
|
286
299
|
id: e.id,
|
|
287
300
|
workspaceId: e.workspaceId,
|
|
@@ -289,7 +302,7 @@ function it() {
|
|
|
289
302
|
agentId: e.agentId || null,
|
|
290
303
|
name: e.name,
|
|
291
304
|
type: e.type,
|
|
292
|
-
status:
|
|
305
|
+
status: at(e.status, e.ttydUrl || null, t, e.agent?.isActive),
|
|
293
306
|
command: e.command || null,
|
|
294
307
|
workingDirectory: e.workingDirectory || null,
|
|
295
308
|
environmentVariables: e.environmentVariables || {},
|
|
@@ -314,20 +327,20 @@ function it() {
|
|
|
314
327
|
isActive: e.agent.isActive
|
|
315
328
|
} : void 0
|
|
316
329
|
};
|
|
317
|
-
}), [
|
|
318
|
-
|
|
319
|
-
|
|
330
|
+
}), [Rn?.sessions?.items]);
|
|
331
|
+
d(() => {
|
|
332
|
+
Pn.current || X.length === 0 || I.length === 0 || (Pn.current = !0, Promise.allSettled(I.map(async (e) => {
|
|
320
333
|
let t = X.find((t) => t.id === e.sessionId);
|
|
321
334
|
if (t) try {
|
|
322
|
-
let n = await G({ variables: { id: e.sessionId } }), r = t.agent?.tunnelUrl ?? null, i =
|
|
323
|
-
|
|
335
|
+
let n = await G({ variables: { id: e.sessionId } }), r = t.agent?.tunnelUrl ?? null, i = it(n.data?.startSessionTerminal?.ttydUrl ?? null, r);
|
|
336
|
+
L((t) => t.map((t) => t.sessionId === e.sessionId ? {
|
|
324
337
|
...t,
|
|
325
338
|
terminalUrl: i,
|
|
326
339
|
loading: !1,
|
|
327
340
|
error: null
|
|
328
341
|
} : t));
|
|
329
342
|
} catch (n) {
|
|
330
|
-
console.warn("[sessions] tab restore startSessionTerminal failed", n),
|
|
343
|
+
console.warn("[sessions] tab restore startSessionTerminal failed", n), L((n) => n.map((n) => n.sessionId === e.sessionId && t.ttydUrl ? {
|
|
331
344
|
...n,
|
|
332
345
|
terminalUrl: t.ttydUrl,
|
|
333
346
|
loading: !1
|
|
@@ -336,21 +349,21 @@ function it() {
|
|
|
336
349
|
})));
|
|
337
350
|
}, [
|
|
338
351
|
X,
|
|
339
|
-
|
|
352
|
+
I,
|
|
340
353
|
G
|
|
341
|
-
]),
|
|
342
|
-
if (!U || !
|
|
343
|
-
K.current =
|
|
354
|
+
]), d(() => {
|
|
355
|
+
if (!U || !F) {
|
|
356
|
+
K.current = F;
|
|
344
357
|
return;
|
|
345
358
|
}
|
|
346
|
-
if (K.current === null &&
|
|
347
|
-
K.current =
|
|
359
|
+
if (K.current === null && F) {
|
|
360
|
+
K.current = F;
|
|
348
361
|
return;
|
|
349
362
|
}
|
|
350
|
-
if (K.current ===
|
|
351
|
-
K.current =
|
|
352
|
-
let e = X.find((e) => e.id ===
|
|
353
|
-
if (e) if (
|
|
363
|
+
if (K.current === F) return;
|
|
364
|
+
K.current = F;
|
|
365
|
+
let e = X.find((e) => e.id === F);
|
|
366
|
+
if (e) if (I.find((e) => e.sessionId === F)) z(F), H(!1);
|
|
354
367
|
else {
|
|
355
368
|
let t = e.ttydUrl || null, n = {
|
|
356
369
|
sessionId: e.id,
|
|
@@ -359,17 +372,17 @@ function it() {
|
|
|
359
372
|
loading: !t,
|
|
360
373
|
error: null
|
|
361
374
|
};
|
|
362
|
-
|
|
375
|
+
L((e) => [...e, n]), z(F), H(!1), t || G({ variables: { id: e.id } }).then((t) => {
|
|
363
376
|
let n = t.data?.startSessionTerminal?.ttydUrl || null;
|
|
364
|
-
|
|
377
|
+
L((t) => t.map((t) => t.sessionId === e.id ? {
|
|
365
378
|
...t,
|
|
366
379
|
terminalUrl: n,
|
|
367
380
|
loading: !1,
|
|
368
|
-
error: n ? null :
|
|
381
|
+
error: n ? null : v("sessions.terminalStartedNoUrl", "Terminal started but no URL was returned. Try restarting.")
|
|
369
382
|
} : t));
|
|
370
383
|
}).catch((t) => {
|
|
371
|
-
let n = t instanceof Error ? t.message :
|
|
372
|
-
|
|
384
|
+
let n = t instanceof Error ? t.message : v("sessions.failedStartTerminal", "Failed to start terminal");
|
|
385
|
+
L((t) => t.map((t) => t.sessionId === e.id ? {
|
|
373
386
|
...t,
|
|
374
387
|
loading: !1,
|
|
375
388
|
error: n
|
|
@@ -377,132 +390,132 @@ function it() {
|
|
|
377
390
|
});
|
|
378
391
|
}
|
|
379
392
|
}, [
|
|
380
|
-
|
|
393
|
+
F,
|
|
381
394
|
X,
|
|
382
|
-
|
|
395
|
+
I,
|
|
383
396
|
U,
|
|
384
397
|
G
|
|
385
398
|
]);
|
|
386
|
-
let Z =
|
|
387
|
-
if (
|
|
388
|
-
let t =
|
|
399
|
+
let Z = f(() => X.filter((e) => {
|
|
400
|
+
if (y) {
|
|
401
|
+
let t = y.toLowerCase();
|
|
389
402
|
if (!(e.name.toLowerCase().includes(t) || e.command?.toLowerCase().includes(t) || e.workingDirectory?.toLowerCase().includes(t))) return !1;
|
|
390
403
|
}
|
|
391
|
-
return !(
|
|
404
|
+
return !(S === "none" && e.vibeId);
|
|
392
405
|
}), [
|
|
393
406
|
X,
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
]),
|
|
397
|
-
|
|
407
|
+
y,
|
|
408
|
+
S
|
|
409
|
+
]), Yn = u((e) => {
|
|
410
|
+
M((t) => {
|
|
398
411
|
let n = new Set(t);
|
|
399
412
|
return n.has(e) ? n.delete(e) : n.add(e), n;
|
|
400
413
|
});
|
|
401
|
-
}, []),
|
|
402
|
-
|
|
403
|
-
}, [Z]),
|
|
404
|
-
|
|
405
|
-
}, []),
|
|
406
|
-
if (
|
|
407
|
-
|
|
414
|
+
}, []), Xn = u(() => {
|
|
415
|
+
M(new Set(Z.map((e) => e.id)));
|
|
416
|
+
}, [Z]), Zn = u(() => {
|
|
417
|
+
M(/* @__PURE__ */ new Set());
|
|
418
|
+
}, []), Qn = Z.length > 0 && j.size === Z.length, $n = j.size > 0, er = u(async () => {
|
|
419
|
+
if (j.size !== 0) {
|
|
420
|
+
N(!0);
|
|
408
421
|
try {
|
|
409
|
-
let e = (await
|
|
410
|
-
|
|
422
|
+
let e = (await An({ variables: { ids: Array.from(j) } })).data?.bulkStopSessions;
|
|
423
|
+
A(`${v("sessions.stopped", "Stopped")} ${e?.succeeded ?? 0} ${v("nav.sessions", "sessions")}${e?.failed ? `, ${e.failed} ${v("sessions.failed", "failed")}` : ""}`), M(/* @__PURE__ */ new Set()), setTimeout(() => A(null), 3e3);
|
|
411
424
|
} catch (e) {
|
|
412
|
-
|
|
425
|
+
A(`${v("sessions.errorPrefix", "Error")}: ${e instanceof Error ? e.message : v("sessions.failedStop", "Failed to stop sessions")}`), setTimeout(() => A(null), 5e3);
|
|
413
426
|
} finally {
|
|
414
|
-
|
|
427
|
+
N(!1);
|
|
415
428
|
}
|
|
416
429
|
}
|
|
417
430
|
}, [
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
]),
|
|
422
|
-
if (
|
|
423
|
-
|
|
431
|
+
j,
|
|
432
|
+
An,
|
|
433
|
+
v
|
|
434
|
+
]), tr = u(async () => {
|
|
435
|
+
if (j.size !== 0) {
|
|
436
|
+
N(!0);
|
|
424
437
|
try {
|
|
425
|
-
let e = (await
|
|
426
|
-
|
|
438
|
+
let e = (await jn({ variables: { ids: Array.from(j) } })).data?.bulkRestartSessions;
|
|
439
|
+
A(`${v("sessions.restarted", "Restarted")} ${e?.succeeded ?? 0} ${v("nav.sessions", "sessions")}${e?.failed ? `, ${e.failed} ${v("sessions.failed", "failed")}` : ""}`), M(/* @__PURE__ */ new Set()), setTimeout(() => A(null), 3e3);
|
|
427
440
|
} catch (e) {
|
|
428
|
-
|
|
441
|
+
A(`${v("sessions.errorPrefix", "Error")}: ${e instanceof Error ? e.message : v("sessions.failedRestart", "Failed to restart sessions")}`), setTimeout(() => A(null), 5e3);
|
|
429
442
|
} finally {
|
|
430
|
-
|
|
443
|
+
N(!1);
|
|
431
444
|
}
|
|
432
445
|
}
|
|
433
446
|
}, [
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
]),
|
|
438
|
-
if (
|
|
439
|
-
|
|
447
|
+
j,
|
|
448
|
+
jn,
|
|
449
|
+
v
|
|
450
|
+
]), nr = u(async () => {
|
|
451
|
+
if (j.size !== 0 && confirm(`${v("sessions.confirmRemovePrefix", "Are you sure you want to remove")} ${j.size} ${v("nav.sessions", "session(s)")}? ${v("sessions.confirmRemoveSuffix", "This cannot be undone.")}`)) {
|
|
452
|
+
N(!0);
|
|
440
453
|
try {
|
|
441
|
-
let e = (await
|
|
442
|
-
|
|
454
|
+
let e = (await Mn({ variables: { ids: Array.from(j) } })).data?.bulkTerminateSessions;
|
|
455
|
+
A(`${v("sessions.removed", "Removed")} ${e?.succeeded ?? 0} ${v("nav.sessions", "sessions")}${e?.failed ? `, ${e.failed} ${v("sessions.failed", "failed")}` : ""}`), M(/* @__PURE__ */ new Set()), setTimeout(() => A(null), 3e3);
|
|
443
456
|
} catch (e) {
|
|
444
|
-
|
|
457
|
+
A(`${v("sessions.errorPrefix", "Error")}: ${e instanceof Error ? e.message : v("sessions.failedRemove", "Failed to remove sessions")}`), setTimeout(() => A(null), 5e3);
|
|
445
458
|
} finally {
|
|
446
|
-
|
|
459
|
+
N(!1);
|
|
447
460
|
}
|
|
448
461
|
}
|
|
449
462
|
}, [
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
]),
|
|
454
|
-
|
|
463
|
+
j,
|
|
464
|
+
Mn,
|
|
465
|
+
v
|
|
466
|
+
]), rr = u(async (e = "CSV") => {
|
|
467
|
+
jt(!0);
|
|
455
468
|
try {
|
|
456
|
-
let t = (await
|
|
469
|
+
let t = (await Nn({ variables: { input: {
|
|
457
470
|
filter: {
|
|
458
|
-
status:
|
|
459
|
-
type:
|
|
460
|
-
vibeId:
|
|
461
|
-
agentId:
|
|
471
|
+
status: b === "all" ? void 0 : b,
|
|
472
|
+
type: x === "all" ? void 0 : x,
|
|
473
|
+
vibeId: S !== "all" && S !== "none" ? S : void 0,
|
|
474
|
+
agentId: C === "all" ? void 0 : C
|
|
462
475
|
},
|
|
463
476
|
format: e
|
|
464
477
|
} } })).data?.exportSessions;
|
|
465
478
|
if (!t) return;
|
|
466
479
|
let n = e === "CSV" ? "text/csv" : "application/json", r = new Blob([t.data], { type: n }), i = URL.createObjectURL(r), a = document.createElement("a");
|
|
467
|
-
a.href = i, a.download = `sessions-export-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.${e.toLowerCase()}`, a.click(), URL.revokeObjectURL(i),
|
|
480
|
+
a.href = i, a.download = `sessions-export-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.${e.toLowerCase()}`, a.click(), URL.revokeObjectURL(i), A(v("sessions.exportSuccess", "Exported {{count}} sessions as {{format}}", {
|
|
468
481
|
count: t.count,
|
|
469
482
|
format: e
|
|
470
|
-
})), setTimeout(() =>
|
|
483
|
+
})), setTimeout(() => A(null), 3e3);
|
|
471
484
|
} catch (e) {
|
|
472
|
-
|
|
485
|
+
A(`${v("sessions.errorPrefix", "Error")}: ${e instanceof Error ? e.message : v("sessions.failedExport", "Failed to export sessions")}`), setTimeout(() => A(null), 5e3);
|
|
473
486
|
} finally {
|
|
474
|
-
|
|
487
|
+
jt(!1);
|
|
475
488
|
}
|
|
476
489
|
}, [
|
|
477
|
-
|
|
490
|
+
Nn,
|
|
491
|
+
b,
|
|
492
|
+
x,
|
|
478
493
|
S,
|
|
479
494
|
C,
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
},
|
|
486
|
-
|
|
487
|
-
}, er = async () => {
|
|
488
|
-
let e = At.current?.value?.trim(), t = Pt, i = It, a = I, ee = jt.current?.value?.trim(), te = Mt.current?.checked ?? !1;
|
|
495
|
+
v
|
|
496
|
+
]), ir = (e) => {
|
|
497
|
+
lt(`/sessions/${e.id}`);
|
|
498
|
+
}, ar = () => {
|
|
499
|
+
O(null), E(!0);
|
|
500
|
+
}, or = async () => {
|
|
501
|
+
let e = Mt.current?.value?.trim(), t = It, i = Rt, a = P, ee = Nt.current?.value?.trim(), te = Pt.current?.checked ?? !1;
|
|
489
502
|
if (!e) {
|
|
490
|
-
|
|
503
|
+
O(v("sessions.nameRequired", "Name is required"));
|
|
491
504
|
return;
|
|
492
505
|
}
|
|
493
506
|
let o = Y.find((e) => e.id === t)?.agents ?? [], s = null;
|
|
494
507
|
if (i && (!t || o.some((e) => e.id === i)) ? s = i : o.length === 1 && (s = o[0]?.id ?? null), !s) {
|
|
495
|
-
|
|
508
|
+
O(t && o.length === 0 ? v("sessions.noAgentAttached", "This vibe has no agents attached. Attach one from the Vibe → Agents tab before creating sessions.") : t && o.length > 1 ? v("sessions.pickAgentFromVibe", "This vibe has multiple agents attached. Pick one before creating the session.") : v("sessions.agentRequired", "Please select an agent for this session."));
|
|
496
509
|
return;
|
|
497
510
|
}
|
|
498
|
-
let c =
|
|
511
|
+
let c = Un.get(s);
|
|
499
512
|
if (c && !c.healthy) {
|
|
500
|
-
|
|
513
|
+
O(v("sessions.agentNotHealthy", "The selected agent isn’t fully reachable right now. Please wait for the agent badge to turn green and retry.") + (c.error ? ` (${c.error})` : ""));
|
|
501
514
|
return;
|
|
502
515
|
}
|
|
503
|
-
|
|
516
|
+
Ot(!0), O(null);
|
|
504
517
|
try {
|
|
505
|
-
let n =
|
|
518
|
+
let n = Ft.current?.value?.trim() || void 0, r = await sn({ variables: { input: {
|
|
506
519
|
name: e,
|
|
507
520
|
type: a || "TMUX",
|
|
508
521
|
command: ee || void 0,
|
|
@@ -511,7 +524,7 @@ function it() {
|
|
|
511
524
|
autoStart: te,
|
|
512
525
|
externalSessionName: n
|
|
513
526
|
} } }), i = r.data?.createSession?.id;
|
|
514
|
-
|
|
527
|
+
E(!1), A(v("sessions.createdSuccess", "Session created successfully")), i && await ln(i), setTimeout(() => A(null), 3e3), w === "terminal" && r.data?.createSession && Q({
|
|
515
528
|
id: r.data.createSession.id,
|
|
516
529
|
workspaceId: r.data.createSession.workspaceId,
|
|
517
530
|
vibeId: r.data.createSession.vibeId || null,
|
|
@@ -535,16 +548,16 @@ function it() {
|
|
|
535
548
|
});
|
|
536
549
|
} catch (e) {
|
|
537
550
|
if (n(e)) {
|
|
538
|
-
|
|
551
|
+
E(!1), r(), D(!0);
|
|
539
552
|
return;
|
|
540
553
|
}
|
|
541
|
-
|
|
554
|
+
O(e instanceof Error ? e.message : v("sessions.failedCreate", "Failed to create session"));
|
|
542
555
|
} finally {
|
|
543
|
-
|
|
556
|
+
Ot(!1);
|
|
544
557
|
}
|
|
545
|
-
},
|
|
558
|
+
}, sr = async (e) => {
|
|
546
559
|
try {
|
|
547
|
-
await
|
|
560
|
+
await Sn({ variables: { id: e.id } }), st?.({
|
|
548
561
|
id: e.id,
|
|
549
562
|
name: e.name,
|
|
550
563
|
type: e.type,
|
|
@@ -552,41 +565,41 @@ function it() {
|
|
|
552
565
|
});
|
|
553
566
|
} catch (e) {
|
|
554
567
|
if (n(e)) {
|
|
555
|
-
r(),
|
|
568
|
+
r(), D(!0);
|
|
556
569
|
return;
|
|
557
570
|
}
|
|
558
571
|
console.error("Failed to start session:", e);
|
|
559
572
|
}
|
|
560
|
-
},
|
|
573
|
+
}, cr = async (e) => {
|
|
561
574
|
try {
|
|
562
|
-
await
|
|
575
|
+
await Cn({ variables: { id: e.id } });
|
|
563
576
|
} catch (e) {
|
|
564
577
|
console.error("Failed to stop session:", e);
|
|
565
578
|
}
|
|
566
|
-
},
|
|
579
|
+
}, lr = async (e) => {
|
|
567
580
|
try {
|
|
568
|
-
await
|
|
581
|
+
await wn({ variables: { id: e.id } });
|
|
569
582
|
} catch (e) {
|
|
570
583
|
if (n(e)) {
|
|
571
|
-
r(),
|
|
584
|
+
r(), D(!0);
|
|
572
585
|
return;
|
|
573
586
|
}
|
|
574
587
|
console.error("Failed to restart session:", e);
|
|
575
588
|
}
|
|
576
|
-
},
|
|
589
|
+
}, ur = async (e) => {
|
|
577
590
|
try {
|
|
578
|
-
await
|
|
591
|
+
await On({ variables: { id: e.id } });
|
|
579
592
|
} catch (e) {
|
|
580
593
|
console.error("Failed to terminate session:", e);
|
|
581
594
|
}
|
|
582
|
-
},
|
|
583
|
-
|
|
584
|
-
}, []), Q =
|
|
585
|
-
if (
|
|
586
|
-
|
|
595
|
+
}, dr = u((e) => e.ttydUrl || null, []), fr = u((e) => {
|
|
596
|
+
tn(e);
|
|
597
|
+
}, []), Q = u(async (e) => {
|
|
598
|
+
if (I.find((t) => t.sessionId === e.id)?.terminalUrl) {
|
|
599
|
+
z(e.id), H(!1);
|
|
587
600
|
return;
|
|
588
601
|
}
|
|
589
|
-
let t =
|
|
602
|
+
let t = dr(e);
|
|
590
603
|
if (t) {
|
|
591
604
|
let n = {
|
|
592
605
|
sessionId: e.id,
|
|
@@ -595,7 +608,7 @@ function it() {
|
|
|
595
608
|
loading: !1,
|
|
596
609
|
error: null
|
|
597
610
|
};
|
|
598
|
-
|
|
611
|
+
L((t) => [...t.filter((t) => t.sessionId !== e.id), n]), z(e.id), H(!1);
|
|
599
612
|
return;
|
|
600
613
|
}
|
|
601
614
|
let i = {
|
|
@@ -605,342 +618,525 @@ function it() {
|
|
|
605
618
|
loading: !0,
|
|
606
619
|
error: null
|
|
607
620
|
};
|
|
608
|
-
|
|
621
|
+
L((t) => [...t.filter((t) => t.sessionId !== e.id), i]), z(e.id), H(!1);
|
|
609
622
|
try {
|
|
610
623
|
let t = await G({ variables: { id: e.id } });
|
|
611
624
|
if (t.error && n(t.error)) {
|
|
612
|
-
let t =
|
|
613
|
-
|
|
625
|
+
let t = I.filter((t) => t.sessionId !== e.id);
|
|
626
|
+
L(t), R === e.id && z(t.length > 0 ? t[t.length - 1].sessionId : null), r(), D(!0);
|
|
614
627
|
return;
|
|
615
628
|
}
|
|
616
|
-
let i =
|
|
617
|
-
|
|
629
|
+
let i = it(t.data?.startSessionTerminal?.ttydUrl || null, X.find((t) => t.id === e.id)?.agent?.tunnelUrl ?? null);
|
|
630
|
+
L((t) => t.map((t) => t.sessionId === e.id ? {
|
|
618
631
|
...t,
|
|
619
632
|
terminalUrl: i,
|
|
620
633
|
loading: !1,
|
|
621
|
-
error: i ? null :
|
|
634
|
+
error: i ? null : v("sessions.terminalStartedNoTunnelUrl", "Terminal started but no tunnel URL was returned. Try restarting.")
|
|
622
635
|
} : t));
|
|
623
636
|
} catch (t) {
|
|
624
637
|
if (n(t)) {
|
|
625
|
-
let t =
|
|
626
|
-
|
|
638
|
+
let t = I.filter((t) => t.sessionId !== e.id);
|
|
639
|
+
L(t), R === e.id && z(t.length > 0 ? t[t.length - 1].sessionId : null), r(), D(!0);
|
|
627
640
|
return;
|
|
628
641
|
}
|
|
629
|
-
let i = t instanceof Error ? t.message :
|
|
630
|
-
|
|
642
|
+
let i = t instanceof Error ? t.message : v("sessions.failedStartTerminal", "Failed to start terminal");
|
|
643
|
+
L((t) => t.map((t) => t.sessionId === e.id ? {
|
|
631
644
|
...t,
|
|
632
645
|
loading: !1,
|
|
633
646
|
error: i
|
|
634
647
|
} : t));
|
|
635
648
|
}
|
|
636
649
|
}, [
|
|
637
|
-
B,
|
|
638
650
|
R,
|
|
639
|
-
|
|
651
|
+
I,
|
|
652
|
+
dr,
|
|
640
653
|
G
|
|
641
654
|
]);
|
|
642
|
-
|
|
643
|
-
if (!U || !
|
|
644
|
-
let e = X.find((e) => e.id ===
|
|
655
|
+
d(() => {
|
|
656
|
+
if (!U || !R || I.some((e) => e.sessionId === R)) return;
|
|
657
|
+
let e = X.find((e) => e.id === R);
|
|
645
658
|
e && Q(e);
|
|
646
659
|
}, [
|
|
647
|
-
|
|
660
|
+
R,
|
|
648
661
|
Q,
|
|
649
662
|
X,
|
|
650
|
-
|
|
663
|
+
I,
|
|
651
664
|
U
|
|
652
665
|
]);
|
|
653
|
-
let
|
|
654
|
-
|
|
655
|
-
let t =
|
|
666
|
+
let pr = u((e) => {
|
|
667
|
+
L((t) => t.filter((t) => t.sessionId !== e)), R === e && z(() => {
|
|
668
|
+
let t = I.filter((t) => t.sessionId !== e);
|
|
656
669
|
return t.length > 0 ? t[t.length - 1].sessionId : null;
|
|
657
670
|
});
|
|
658
|
-
}, [
|
|
659
|
-
let t =
|
|
671
|
+
}, [R, I]), mr = u((e) => {
|
|
672
|
+
let t = I.find((t) => t.sessionId === e);
|
|
660
673
|
t?.terminalUrl && window.open(t.terminalUrl, "_blank");
|
|
661
|
-
}, [
|
|
674
|
+
}, [I]), hr = u(async (e, t) => {
|
|
662
675
|
try {
|
|
663
|
-
await
|
|
676
|
+
await Dn({ variables: {
|
|
664
677
|
id: e,
|
|
665
678
|
input: { name: t }
|
|
666
|
-
} }),
|
|
679
|
+
} }), L((n) => n.map((n) => n.sessionId === e ? {
|
|
667
680
|
...n,
|
|
668
681
|
name: t
|
|
669
682
|
} : n));
|
|
670
683
|
} catch (e) {
|
|
671
684
|
console.error("Failed to rename session:", e);
|
|
672
685
|
}
|
|
673
|
-
}, [
|
|
686
|
+
}, [Dn]), gr = u(async (e) => {
|
|
674
687
|
try {
|
|
675
|
-
await
|
|
688
|
+
await Tn({ variables: { id: e } }), L((t) => t.map((t) => t.sessionId === e ? {
|
|
676
689
|
...t,
|
|
677
690
|
terminalUrl: null,
|
|
678
|
-
error:
|
|
691
|
+
error: v("sessions.terminalStopped", "Terminal stopped")
|
|
679
692
|
} : t));
|
|
680
693
|
} catch (e) {
|
|
681
694
|
console.error("Failed to stop terminal:", e);
|
|
682
695
|
}
|
|
683
|
-
}, [
|
|
684
|
-
let t =
|
|
696
|
+
}, [Tn]), _r = u(async (e) => {
|
|
697
|
+
let t = I.find((t) => t.sessionId === e) || null;
|
|
685
698
|
try {
|
|
686
|
-
|
|
699
|
+
L((t) => t.map((t) => t.sessionId === e ? {
|
|
687
700
|
...t,
|
|
688
701
|
loading: !0,
|
|
689
702
|
error: null,
|
|
690
703
|
terminalUrl: null
|
|
691
704
|
} : t));
|
|
692
|
-
let i = await
|
|
705
|
+
let i = await En({ variables: { id: e } });
|
|
693
706
|
if (i.error && n(i.error)) {
|
|
694
|
-
|
|
707
|
+
L((n) => n.map((n) => n.sessionId === e ? {
|
|
695
708
|
...n,
|
|
696
709
|
loading: !1,
|
|
697
710
|
error: null,
|
|
698
711
|
terminalUrl: t?.terminalUrl ?? n.terminalUrl
|
|
699
|
-
} : n)), r(),
|
|
712
|
+
} : n)), r(), D(!0);
|
|
700
713
|
return;
|
|
701
714
|
}
|
|
702
715
|
let a = i.data?.restartSessionTerminal?.ttydUrl || null;
|
|
703
|
-
|
|
716
|
+
L((t) => t.map((t) => t.sessionId === e ? {
|
|
704
717
|
...t,
|
|
705
718
|
terminalUrl: a,
|
|
706
719
|
loading: !1,
|
|
707
|
-
error: a ? null :
|
|
720
|
+
error: a ? null : v("sessions.terminalRestartedNoUrl", "Terminal restarted but no URL returned.")
|
|
708
721
|
} : t));
|
|
709
722
|
} catch (i) {
|
|
710
723
|
if (n(i)) {
|
|
711
|
-
|
|
724
|
+
L((n) => n.map((n) => n.sessionId === e ? {
|
|
712
725
|
...n,
|
|
713
726
|
loading: !1,
|
|
714
727
|
error: null,
|
|
715
728
|
terminalUrl: t?.terminalUrl ?? n.terminalUrl
|
|
716
|
-
} : n)), r(),
|
|
729
|
+
} : n)), r(), D(!0);
|
|
717
730
|
return;
|
|
718
731
|
}
|
|
719
|
-
let a = i instanceof Error ? i.message :
|
|
720
|
-
|
|
732
|
+
let a = i instanceof Error ? i.message : v("sessions.failedRestartTerminal", "Failed to restart terminal");
|
|
733
|
+
L((t) => t.map((t) => t.sessionId === e ? {
|
|
721
734
|
...t,
|
|
722
735
|
loading: !1,
|
|
723
736
|
error: a
|
|
724
737
|
} : t));
|
|
725
738
|
}
|
|
726
|
-
}, [
|
|
727
|
-
|
|
739
|
+
}, [En, I]), vr = u(() => {
|
|
740
|
+
rn((e) => !e);
|
|
728
741
|
}, []), $ = {
|
|
729
742
|
total: X.length,
|
|
730
743
|
running: X.filter((e) => e.status === "RUNNING").length,
|
|
731
744
|
stopped: X.filter((e) => e.status === "STOPPED").length
|
|
732
745
|
};
|
|
733
|
-
if (
|
|
746
|
+
if (dt) return /* @__PURE__ */ h(_, {
|
|
734
747
|
className: "space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen",
|
|
735
|
-
children: /* @__PURE__ */
|
|
748
|
+
children: /* @__PURE__ */ h(be, { message: v("sessions.loadingPermissions", "Loading permissions...") })
|
|
736
749
|
});
|
|
737
|
-
if (
|
|
750
|
+
if (ft && ft.permissionStrings?.length > 0 && !_t) return /* @__PURE__ */ h(_, {
|
|
738
751
|
className: "space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen",
|
|
739
|
-
children: /* @__PURE__ */
|
|
740
|
-
title:
|
|
741
|
-
description:
|
|
742
|
-
details:
|
|
752
|
+
children: /* @__PURE__ */ h(tt, {
|
|
753
|
+
title: v("common.accessDeniedTitle", "Access Denied"),
|
|
754
|
+
description: v("sessions.accessDeniedDescription", "You don't have permission to view sessions."),
|
|
755
|
+
details: v("sessions.requiredPermission", "Required permission: session:list")
|
|
743
756
|
})
|
|
744
757
|
});
|
|
745
|
-
if (q && !
|
|
758
|
+
if (q && !In && X.length === 0) return /* @__PURE__ */ h(_, {
|
|
746
759
|
className: "space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen",
|
|
747
|
-
children: /* @__PURE__ */
|
|
760
|
+
children: /* @__PURE__ */ h(be, { message: v("sessions.loading", "Loading sessions...") })
|
|
748
761
|
});
|
|
749
|
-
if (
|
|
762
|
+
if (Ln && X.length === 0) return /* @__PURE__ */ h(_, {
|
|
750
763
|
className: "space-y-6 p-4 sm:p-6 bg-bg-surface min-h-screen",
|
|
751
|
-
children: /* @__PURE__ */
|
|
752
|
-
title:
|
|
753
|
-
message:
|
|
764
|
+
children: /* @__PURE__ */ h(xe, {
|
|
765
|
+
title: v("sessions.failedLoad", "Failed to load sessions"),
|
|
766
|
+
message: Ln.message,
|
|
754
767
|
onRetry: () => J()
|
|
755
768
|
})
|
|
756
769
|
});
|
|
757
|
-
let
|
|
770
|
+
let yr = () => !$n || w === "terminal" ? null : /* @__PURE__ */ g("div", {
|
|
758
771
|
className: "flex flex-col sm:flex-row items-start sm:items-center gap-3 px-4 py-2 bg-action-primary-bg/10 border border-action-primary-bg/20 rounded-lg",
|
|
759
|
-
children: [/* @__PURE__ */
|
|
772
|
+
children: [/* @__PURE__ */ h("span", {
|
|
760
773
|
className: "text-sm font-medium text-text-primary",
|
|
761
|
-
children:
|
|
762
|
-
}), /* @__PURE__ */
|
|
774
|
+
children: v(j.size === 1 ? "sessions.selectionCountSingle" : "sessions.selectionCountPlural", j.size === 1 ? "{{count}} session selected" : "{{count}} sessions selected", { count: j.size })
|
|
775
|
+
}), /* @__PURE__ */ g("div", {
|
|
763
776
|
className: "flex items-center gap-1.5 sm:ml-auto flex-wrap",
|
|
764
777
|
children: [
|
|
765
|
-
/* @__PURE__ */
|
|
778
|
+
/* @__PURE__ */ g("button", {
|
|
766
779
|
type: "button",
|
|
767
|
-
onClick:
|
|
768
|
-
disabled:
|
|
780
|
+
onClick: er,
|
|
781
|
+
disabled: kt,
|
|
769
782
|
className: "flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-text-primary bg-bg-surface border border-border-default rounded-md hover:bg-bg-sunken transition-colors disabled:opacity-50",
|
|
770
783
|
children: [
|
|
771
|
-
/* @__PURE__ */
|
|
784
|
+
/* @__PURE__ */ h(Ge, { className: "size-3" }),
|
|
772
785
|
" ",
|
|
773
|
-
|
|
786
|
+
v("sessions.stop", "Stop")
|
|
774
787
|
]
|
|
775
788
|
}),
|
|
776
|
-
/* @__PURE__ */
|
|
789
|
+
/* @__PURE__ */ g("button", {
|
|
777
790
|
type: "button",
|
|
778
|
-
onClick:
|
|
779
|
-
disabled:
|
|
791
|
+
onClick: tr,
|
|
792
|
+
disabled: kt,
|
|
780
793
|
className: "flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-text-primary bg-bg-surface border border-border-default rounded-md hover:bg-bg-sunken transition-colors disabled:opacity-50",
|
|
781
794
|
children: [
|
|
782
|
-
/* @__PURE__ */
|
|
795
|
+
/* @__PURE__ */ h(We, { className: "size-3" }),
|
|
783
796
|
" ",
|
|
784
|
-
|
|
797
|
+
v("sessions.restart", "Restart")
|
|
785
798
|
]
|
|
786
799
|
}),
|
|
787
|
-
/* @__PURE__ */
|
|
800
|
+
/* @__PURE__ */ g("button", {
|
|
788
801
|
type: "button",
|
|
789
|
-
onClick:
|
|
790
|
-
disabled:
|
|
802
|
+
onClick: nr,
|
|
803
|
+
disabled: kt,
|
|
791
804
|
className: "flex items-center gap-1.5 px-3 py-1.5 text-xs font-medium text-status-error-text bg-status-error-bg border border-status-error-text/20 rounded-md hover:bg-status-error-bg/80 transition-colors disabled:opacity-50",
|
|
792
805
|
children: [
|
|
793
|
-
/* @__PURE__ */
|
|
806
|
+
/* @__PURE__ */ h(qe, { className: "size-3" }),
|
|
794
807
|
" ",
|
|
795
|
-
|
|
808
|
+
v("sessions.remove", "Remove")
|
|
796
809
|
]
|
|
797
810
|
}),
|
|
798
|
-
/* @__PURE__ */
|
|
811
|
+
/* @__PURE__ */ g("button", {
|
|
799
812
|
type: "button",
|
|
800
|
-
onClick:
|
|
813
|
+
onClick: Zn,
|
|
801
814
|
className: "flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary transition-colors",
|
|
802
815
|
children: [
|
|
803
|
-
/* @__PURE__ */
|
|
816
|
+
/* @__PURE__ */ h(Je, { className: "size-3" }),
|
|
804
817
|
" ",
|
|
805
|
-
|
|
818
|
+
v("sessions.deselect", "Deselect")
|
|
806
819
|
]
|
|
807
820
|
})
|
|
808
821
|
]
|
|
809
822
|
})]
|
|
810
823
|
});
|
|
811
|
-
if (
|
|
824
|
+
if (w === "terminal") return /* @__PURE__ */ g(_, {
|
|
812
825
|
className: "flex flex-col bg-bg-surface h-screen",
|
|
813
826
|
children: [
|
|
814
|
-
/* @__PURE__ */
|
|
827
|
+
/* @__PURE__ */ g("div", {
|
|
815
828
|
className: "flex flex-col sm:flex-row items-start sm:items-center justify-between gap-2 px-4 py-2 border-b border-border-default bg-bg-sunken",
|
|
816
|
-
children: [/* @__PURE__ */
|
|
829
|
+
children: [/* @__PURE__ */ g("div", {
|
|
817
830
|
className: "flex flex-wrap items-center gap-3",
|
|
818
|
-
children: [/* @__PURE__ */
|
|
831
|
+
children: [/* @__PURE__ */ h("h1", {
|
|
819
832
|
className: "text-sm font-semibold text-text-primary",
|
|
820
|
-
children:
|
|
821
|
-
}), /* @__PURE__ */
|
|
833
|
+
children: v("nav.sessions", "Sessions")
|
|
834
|
+
}), /* @__PURE__ */ h("span", {
|
|
822
835
|
className: "text-xs text-text-muted",
|
|
823
|
-
children:
|
|
836
|
+
children: v("sessions.runningSummary", "{{running}} running / {{total}} total", {
|
|
824
837
|
running: $.running,
|
|
825
838
|
total: $.total
|
|
826
839
|
})
|
|
827
840
|
})]
|
|
828
|
-
}), /* @__PURE__ */
|
|
841
|
+
}), /* @__PURE__ */ g("div", {
|
|
829
842
|
className: "flex w-full flex-wrap items-center gap-2 sm:w-auto sm:justify-end",
|
|
830
843
|
children: [
|
|
831
|
-
/* @__PURE__ */
|
|
844
|
+
/* @__PURE__ */ h("button", {
|
|
832
845
|
type: "button",
|
|
833
|
-
onClick: () =>
|
|
846
|
+
onClick: () => kn().then(() => J()),
|
|
834
847
|
className: "p-1.5 text-text-secondary hover:bg-bg-surface rounded transition-colors",
|
|
835
|
-
title:
|
|
836
|
-
children: /* @__PURE__ */
|
|
848
|
+
title: v("sessions.checkHealth", "Check session health"),
|
|
849
|
+
children: /* @__PURE__ */ h(Ie, { className: "size-3.5" })
|
|
837
850
|
}),
|
|
838
|
-
/* @__PURE__ */
|
|
851
|
+
/* @__PURE__ */ h("button", {
|
|
839
852
|
type: "button",
|
|
840
853
|
onClick: () => {
|
|
841
|
-
J(),
|
|
854
|
+
J(), Bn();
|
|
842
855
|
},
|
|
843
856
|
disabled: q,
|
|
844
857
|
className: "p-1.5 text-text-secondary hover:bg-bg-surface rounded transition-colors disabled:opacity-50",
|
|
845
|
-
title:
|
|
846
|
-
children: /* @__PURE__ */
|
|
858
|
+
title: v("common.refresh", "Refresh"),
|
|
859
|
+
children: /* @__PURE__ */ h(Ue, { className: `size-3.5 ${q ? "animate-spin" : ""}` })
|
|
847
860
|
}),
|
|
848
|
-
/* @__PURE__ */
|
|
861
|
+
/* @__PURE__ */ g("div", {
|
|
849
862
|
className: "flex items-center gap-0.5 rounded bg-bg-surface p-0.5",
|
|
850
863
|
children: [
|
|
851
|
-
/* @__PURE__ */
|
|
864
|
+
/* @__PURE__ */ h("button", {
|
|
852
865
|
type: "button",
|
|
853
|
-
onClick: () =>
|
|
866
|
+
onClick: () => T("terminal"),
|
|
854
867
|
className: "p-1.5 rounded bg-bg-sunken shadow-sm",
|
|
855
|
-
title:
|
|
856
|
-
children: /* @__PURE__ */
|
|
868
|
+
title: v("sessions.terminalViewTitle", "Terminal view"),
|
|
869
|
+
children: /* @__PURE__ */ h(Be, { className: "size-3.5 text-text-secondary" })
|
|
857
870
|
}),
|
|
858
|
-
/* @__PURE__ */
|
|
871
|
+
/* @__PURE__ */ h("button", {
|
|
859
872
|
type: "button",
|
|
860
|
-
onClick: () =>
|
|
873
|
+
onClick: () => T("grid"),
|
|
861
874
|
className: "p-1.5 rounded hover:bg-bg-sunken/50",
|
|
862
|
-
title:
|
|
863
|
-
children: /* @__PURE__ */
|
|
875
|
+
title: v("sessions.gridViewTitle", "Grid view"),
|
|
876
|
+
children: /* @__PURE__ */ h(Re, { className: "size-3.5 text-text-secondary" })
|
|
864
877
|
}),
|
|
865
|
-
/* @__PURE__ */
|
|
878
|
+
/* @__PURE__ */ h("button", {
|
|
866
879
|
type: "button",
|
|
867
|
-
onClick: () =>
|
|
880
|
+
onClick: () => T("list"),
|
|
868
881
|
className: "p-1.5 rounded hover:bg-bg-sunken/50",
|
|
869
|
-
title:
|
|
870
|
-
children: /* @__PURE__ */
|
|
882
|
+
title: v("sessions.listViewTitle", "List view"),
|
|
883
|
+
children: /* @__PURE__ */ h(ze, { className: "size-3.5 text-text-secondary" })
|
|
871
884
|
})
|
|
872
885
|
]
|
|
873
886
|
})
|
|
874
887
|
]
|
|
875
888
|
})]
|
|
876
889
|
}),
|
|
877
|
-
/* @__PURE__ */
|
|
890
|
+
/* @__PURE__ */ h("div", {
|
|
878
891
|
className: "px-4 pt-3",
|
|
879
|
-
children: /* @__PURE__ */
|
|
892
|
+
children: /* @__PURE__ */ h(ke, {
|
|
880
893
|
showConnectionStatus: !0,
|
|
881
894
|
maxVisible: 3
|
|
882
895
|
})
|
|
883
896
|
}),
|
|
884
|
-
/* @__PURE__ */
|
|
885
|
-
tabs:
|
|
886
|
-
activeTabId:
|
|
887
|
-
onTabSelect:
|
|
888
|
-
onTabClose:
|
|
889
|
-
onOpenExternal:
|
|
897
|
+
/* @__PURE__ */ h(Ne, {
|
|
898
|
+
tabs: I,
|
|
899
|
+
activeTabId: R,
|
|
900
|
+
onTabSelect: z,
|
|
901
|
+
onTabClose: pr,
|
|
902
|
+
onOpenExternal: mr,
|
|
890
903
|
collapsed: !1,
|
|
891
904
|
sessions: Z,
|
|
892
905
|
onOpenTerminal: Q,
|
|
893
906
|
onRetryTerminal: Q,
|
|
894
|
-
onRenameSession:
|
|
895
|
-
onStopTerminal:
|
|
896
|
-
onRestartTerminal:
|
|
897
|
-
onCreateSession:
|
|
907
|
+
onRenameSession: hr,
|
|
908
|
+
onStopTerminal: gr,
|
|
909
|
+
onRestartTerminal: _r,
|
|
910
|
+
onCreateSession: ar,
|
|
898
911
|
fullScreen: !0,
|
|
899
|
-
isImmersiveFullscreen:
|
|
900
|
-
onToggleImmersiveFullscreen:
|
|
912
|
+
isImmersiveFullscreen: nn,
|
|
913
|
+
onToggleImmersiveFullscreen: vr,
|
|
901
914
|
contextSwitcher: void 0
|
|
902
915
|
}),
|
|
903
|
-
|
|
916
|
+
/* @__PURE__ */ g("div", {
|
|
917
|
+
className: "flex items-center justify-between gap-3 px-4 py-1.5 border-t border-border-default bg-bg-sunken text-[11px] text-text-tertiary",
|
|
918
|
+
children: [/* @__PURE__ */ g("div", {
|
|
919
|
+
className: "flex items-center gap-3",
|
|
920
|
+
children: [
|
|
921
|
+
/* @__PURE__ */ g("span", {
|
|
922
|
+
className: "inline-flex items-center gap-1.5",
|
|
923
|
+
children: [/* @__PURE__ */ h("span", {
|
|
924
|
+
className: "size-1.5 rounded-full bg-status-success-bg",
|
|
925
|
+
"aria-hidden": !0
|
|
926
|
+
}), v("sessions.statusOnline", "Online")]
|
|
927
|
+
}),
|
|
928
|
+
/* @__PURE__ */ g("span", { children: [
|
|
929
|
+
I.length,
|
|
930
|
+
" ",
|
|
931
|
+
I.length === 1 ? "tab" : "tabs"
|
|
932
|
+
] }),
|
|
933
|
+
R && /* @__PURE__ */ h("span", {
|
|
934
|
+
className: "truncate max-w-[40ch]",
|
|
935
|
+
children: I.find((e) => e.sessionId === R)?.name
|
|
936
|
+
})
|
|
937
|
+
]
|
|
938
|
+
}), /* @__PURE__ */ g("div", {
|
|
939
|
+
className: "hidden sm:flex items-center gap-3",
|
|
940
|
+
children: [/* @__PURE__ */ h("button", {
|
|
941
|
+
type: "button",
|
|
942
|
+
onClick: () => Xt(!0),
|
|
943
|
+
className: "hover:text-text-secondary transition-colors",
|
|
944
|
+
children: v("sessions.shortcutsHint", "Press ? for shortcuts")
|
|
945
|
+
}), /* @__PURE__ */ h("button", {
|
|
946
|
+
type: "button",
|
|
947
|
+
onClick: () => {
|
|
948
|
+
Qt(""), B(!0);
|
|
949
|
+
},
|
|
950
|
+
className: "hover:text-text-secondary transition-colors",
|
|
951
|
+
children: v("sessions.paletteHint", "Cmd+P · Command palette")
|
|
952
|
+
})]
|
|
953
|
+
})]
|
|
954
|
+
}),
|
|
955
|
+
k && /* @__PURE__ */ h("div", {
|
|
904
956
|
className: "fixed bottom-4 right-4 z-50 px-4 py-3 bg-status-success-bg text-status-success-text rounded-md shadow-lg text-sm",
|
|
905
|
-
children:
|
|
957
|
+
children: k
|
|
958
|
+
}),
|
|
959
|
+
wt && xr(),
|
|
960
|
+
br(),
|
|
961
|
+
Yt && /* @__PURE__ */ h("div", {
|
|
962
|
+
className: "fixed inset-0 z-50 flex items-center justify-center bg-bg-overlay/80 backdrop-blur-sm p-4",
|
|
963
|
+
role: "dialog",
|
|
964
|
+
"aria-modal": "true",
|
|
965
|
+
"aria-labelledby": "sessions-cheatsheet-title",
|
|
966
|
+
onClick: () => Xt(!1),
|
|
967
|
+
children: /* @__PURE__ */ g("div", {
|
|
968
|
+
className: "bg-bg-surface border border-border-default rounded-xl shadow-2xl p-6 max-w-md w-full",
|
|
969
|
+
onClick: (e) => e.stopPropagation(),
|
|
970
|
+
children: [
|
|
971
|
+
/* @__PURE__ */ h("h2", {
|
|
972
|
+
id: "sessions-cheatsheet-title",
|
|
973
|
+
className: "text-lg font-semibold text-text-primary mb-4",
|
|
974
|
+
children: v("sessions.cheatsheet.title", "Keyboard shortcuts")
|
|
975
|
+
}),
|
|
976
|
+
/* @__PURE__ */ g("dl", {
|
|
977
|
+
className: "grid grid-cols-[auto_1fr] gap-x-4 gap-y-2 text-sm",
|
|
978
|
+
children: [
|
|
979
|
+
/* @__PURE__ */ h("dt", {
|
|
980
|
+
className: "font-mono text-text-secondary",
|
|
981
|
+
children: "Cmd / Ctrl + T"
|
|
982
|
+
}),
|
|
983
|
+
/* @__PURE__ */ h("dd", {
|
|
984
|
+
className: "text-text-primary",
|
|
985
|
+
children: "New session"
|
|
986
|
+
}),
|
|
987
|
+
/* @__PURE__ */ h("dt", {
|
|
988
|
+
className: "font-mono text-text-secondary",
|
|
989
|
+
children: "Cmd / Ctrl + W"
|
|
990
|
+
}),
|
|
991
|
+
/* @__PURE__ */ h("dd", {
|
|
992
|
+
className: "text-text-primary",
|
|
993
|
+
children: "Close active tab"
|
|
994
|
+
}),
|
|
995
|
+
/* @__PURE__ */ h("dt", {
|
|
996
|
+
className: "font-mono text-text-secondary",
|
|
997
|
+
children: "Cmd / Ctrl + 1–9"
|
|
998
|
+
}),
|
|
999
|
+
/* @__PURE__ */ h("dd", {
|
|
1000
|
+
className: "text-text-primary",
|
|
1001
|
+
children: "Switch to tab N"
|
|
1002
|
+
}),
|
|
1003
|
+
/* @__PURE__ */ h("dt", {
|
|
1004
|
+
className: "font-mono text-text-secondary",
|
|
1005
|
+
children: "Ctrl + Tab"
|
|
1006
|
+
}),
|
|
1007
|
+
/* @__PURE__ */ h("dd", {
|
|
1008
|
+
className: "text-text-primary",
|
|
1009
|
+
children: "Next tab"
|
|
1010
|
+
}),
|
|
1011
|
+
/* @__PURE__ */ h("dt", {
|
|
1012
|
+
className: "font-mono text-text-secondary",
|
|
1013
|
+
children: "Ctrl + Shift + Tab"
|
|
1014
|
+
}),
|
|
1015
|
+
/* @__PURE__ */ h("dd", {
|
|
1016
|
+
className: "text-text-primary",
|
|
1017
|
+
children: "Previous tab"
|
|
1018
|
+
}),
|
|
1019
|
+
/* @__PURE__ */ h("dt", {
|
|
1020
|
+
className: "font-mono text-text-secondary",
|
|
1021
|
+
children: "Cmd / Ctrl + P"
|
|
1022
|
+
}),
|
|
1023
|
+
/* @__PURE__ */ h("dd", {
|
|
1024
|
+
className: "text-text-primary",
|
|
1025
|
+
children: "Command palette"
|
|
1026
|
+
}),
|
|
1027
|
+
/* @__PURE__ */ h("dt", {
|
|
1028
|
+
className: "font-mono text-text-secondary",
|
|
1029
|
+
children: "?"
|
|
1030
|
+
}),
|
|
1031
|
+
/* @__PURE__ */ h("dd", {
|
|
1032
|
+
className: "text-text-primary",
|
|
1033
|
+
children: "This cheatsheet"
|
|
1034
|
+
})
|
|
1035
|
+
]
|
|
1036
|
+
}),
|
|
1037
|
+
/* @__PURE__ */ h("div", {
|
|
1038
|
+
className: "mt-5 flex justify-end",
|
|
1039
|
+
children: /* @__PURE__ */ h("button", {
|
|
1040
|
+
type: "button",
|
|
1041
|
+
onClick: () => Xt(!1),
|
|
1042
|
+
className: "px-3 py-1.5 text-sm rounded-md bg-bg-sunken hover:bg-bg-secondary text-text-primary transition-colors",
|
|
1043
|
+
children: v("common.close", "Close")
|
|
1044
|
+
})
|
|
1045
|
+
})
|
|
1046
|
+
]
|
|
1047
|
+
})
|
|
906
1048
|
}),
|
|
907
|
-
|
|
908
|
-
|
|
1049
|
+
Zt && /* @__PURE__ */ h("div", {
|
|
1050
|
+
className: "fixed inset-0 z-50 flex items-start justify-center bg-bg-overlay/80 backdrop-blur-sm p-4 pt-20",
|
|
1051
|
+
role: "dialog",
|
|
1052
|
+
"aria-modal": "true",
|
|
1053
|
+
"aria-labelledby": "sessions-palette-title",
|
|
1054
|
+
onClick: () => B(!1),
|
|
1055
|
+
children: /* @__PURE__ */ g("div", {
|
|
1056
|
+
className: "bg-bg-surface border border-border-default rounded-xl shadow-2xl w-full max-w-lg overflow-hidden",
|
|
1057
|
+
onClick: (e) => e.stopPropagation(),
|
|
1058
|
+
children: [/* @__PURE__ */ h("input", {
|
|
1059
|
+
autoFocus: !0,
|
|
1060
|
+
type: "search",
|
|
1061
|
+
value: V,
|
|
1062
|
+
onChange: (e) => Qt(e.target.value),
|
|
1063
|
+
onKeyDown: (e) => {
|
|
1064
|
+
e.key === "Escape" && B(!1);
|
|
1065
|
+
},
|
|
1066
|
+
placeholder: v("sessions.palette.placeholder", "Search sessions or type a command…"),
|
|
1067
|
+
"aria-label": "Command palette search",
|
|
1068
|
+
className: "w-full px-4 py-3 bg-bg-surface border-b border-border-default text-text-primary placeholder:text-text-muted focus:outline-none"
|
|
1069
|
+
}), /* @__PURE__ */ g("ul", {
|
|
1070
|
+
id: "sessions-palette-title",
|
|
1071
|
+
className: "max-h-80 overflow-y-auto divide-y divide-border-subtle",
|
|
1072
|
+
children: [["new"].map((e) => {
|
|
1073
|
+
let t = v("sessions.palette.new", "New session");
|
|
1074
|
+
return V && !t.toLowerCase().includes(V.toLowerCase()) ? null : /* @__PURE__ */ h("li", { children: /* @__PURE__ */ g("button", {
|
|
1075
|
+
type: "button",
|
|
1076
|
+
onClick: () => {
|
|
1077
|
+
B(!1), E(!0);
|
|
1078
|
+
},
|
|
1079
|
+
className: "w-full text-left px-4 py-2.5 text-sm hover:bg-bg-sunken transition-colors",
|
|
1080
|
+
children: [/* @__PURE__ */ h("span", {
|
|
1081
|
+
className: "font-medium text-text-primary",
|
|
1082
|
+
children: t
|
|
1083
|
+
}), /* @__PURE__ */ h("span", {
|
|
1084
|
+
className: "ml-2 text-xs text-text-muted",
|
|
1085
|
+
children: "Cmd+T"
|
|
1086
|
+
})]
|
|
1087
|
+
}) }, e);
|
|
1088
|
+
}), Z.filter((e) => !V || e.name.toLowerCase().includes(V.toLowerCase())).slice(0, 20).map((e) => /* @__PURE__ */ h("li", { children: /* @__PURE__ */ g("button", {
|
|
1089
|
+
type: "button",
|
|
1090
|
+
onClick: () => {
|
|
1091
|
+
B(!1), Q(e);
|
|
1092
|
+
},
|
|
1093
|
+
className: "w-full text-left px-4 py-2.5 text-sm hover:bg-bg-sunken transition-colors flex items-center justify-between",
|
|
1094
|
+
children: [/* @__PURE__ */ h("span", {
|
|
1095
|
+
className: "text-text-primary truncate",
|
|
1096
|
+
children: e.name
|
|
1097
|
+
}), /* @__PURE__ */ h("span", {
|
|
1098
|
+
className: "ml-2 text-xs text-text-muted",
|
|
1099
|
+
children: e.status
|
|
1100
|
+
})]
|
|
1101
|
+
}) }, e.id))]
|
|
1102
|
+
})]
|
|
1103
|
+
})
|
|
1104
|
+
})
|
|
909
1105
|
]
|
|
910
1106
|
});
|
|
911
|
-
return /* @__PURE__ */
|
|
1107
|
+
return /* @__PURE__ */ g(_, {
|
|
912
1108
|
className: "flex flex-col bg-bg-surface min-h-screen",
|
|
913
1109
|
children: [
|
|
914
|
-
/* @__PURE__ */
|
|
1110
|
+
/* @__PURE__ */ g("div", {
|
|
915
1111
|
className: "flex-1 overflow-y-auto space-y-6 p-4 sm:p-6",
|
|
916
1112
|
children: [
|
|
917
|
-
/* @__PURE__ */
|
|
918
|
-
title:
|
|
919
|
-
description:
|
|
1113
|
+
/* @__PURE__ */ h(ye, {
|
|
1114
|
+
title: v("nav.sessions", "Sessions"),
|
|
1115
|
+
description: v("sessions.pageDescription", "{{running}} of {{total}} sessions running", {
|
|
920
1116
|
running: $.running,
|
|
921
1117
|
total: $.total
|
|
922
1118
|
}),
|
|
923
|
-
actions: /* @__PURE__ */
|
|
1119
|
+
actions: /* @__PURE__ */ g("div", {
|
|
924
1120
|
className: "flex flex-col sm:flex-row items-stretch sm:items-center gap-2",
|
|
925
1121
|
children: [
|
|
926
|
-
/* @__PURE__ */
|
|
1122
|
+
/* @__PURE__ */ h("button", {
|
|
927
1123
|
type: "button",
|
|
928
|
-
onClick: () =>
|
|
1124
|
+
onClick: () => kn().then(() => J()),
|
|
929
1125
|
className: "flex items-center gap-2 px-3 py-2 text-text-secondary hover:bg-bg-sunken rounded-md transition-colors",
|
|
930
|
-
title:
|
|
931
|
-
children: /* @__PURE__ */
|
|
1126
|
+
title: v("sessions.checkHealth", "Check session health"),
|
|
1127
|
+
children: /* @__PURE__ */ h(Ie, { className: "size-4" })
|
|
932
1128
|
}),
|
|
933
|
-
/* @__PURE__ */
|
|
1129
|
+
/* @__PURE__ */ h("button", {
|
|
934
1130
|
type: "button",
|
|
935
1131
|
onClick: () => J(),
|
|
936
1132
|
disabled: q,
|
|
937
1133
|
className: "flex items-center gap-2 px-3 py-2 text-text-secondary hover:bg-bg-sunken rounded-md transition-colors disabled:opacity-50",
|
|
938
|
-
title:
|
|
939
|
-
children: /* @__PURE__ */
|
|
1134
|
+
title: v("sessions.refreshTitle", "Refresh sessions"),
|
|
1135
|
+
children: /* @__PURE__ */ h(Ue, { className: `size-4 ${q ? "animate-spin" : ""}` })
|
|
940
1136
|
}),
|
|
941
|
-
/* @__PURE__ */
|
|
942
|
-
label:
|
|
943
|
-
disabled:
|
|
1137
|
+
/* @__PURE__ */ h(Qe, {
|
|
1138
|
+
label: v("sessions.export", "Export"),
|
|
1139
|
+
disabled: At,
|
|
944
1140
|
testId: "sessions-export",
|
|
945
1141
|
defaultFolderPath: "/Vibecontrols/Sessions",
|
|
946
1142
|
source: {
|
|
@@ -948,267 +1144,267 @@ function it() {
|
|
|
948
1144
|
filename: `sessions-export-${(/* @__PURE__ */ new Date()).toISOString().slice(0, 10)}.csv`,
|
|
949
1145
|
mimeType: "text/csv",
|
|
950
1146
|
getBlob: async () => {
|
|
951
|
-
let e = (await
|
|
1147
|
+
let e = (await Nn({ variables: { input: {
|
|
952
1148
|
filter: {
|
|
953
|
-
status:
|
|
954
|
-
type:
|
|
955
|
-
vibeId:
|
|
956
|
-
agentId:
|
|
1149
|
+
status: b === "all" ? void 0 : b,
|
|
1150
|
+
type: x === "all" ? void 0 : x,
|
|
1151
|
+
vibeId: S !== "all" && S !== "none" ? S : void 0,
|
|
1152
|
+
agentId: C === "all" ? void 0 : C
|
|
957
1153
|
},
|
|
958
1154
|
format: "CSV"
|
|
959
1155
|
} } })).data?.exportSessions;
|
|
960
1156
|
return e ? { blob: new Blob([e.data], { type: "text/csv" }) } : null;
|
|
961
1157
|
}
|
|
962
1158
|
},
|
|
963
|
-
onDownload: () =>
|
|
1159
|
+
onDownload: () => rr("CSV")
|
|
964
1160
|
}),
|
|
965
|
-
/* @__PURE__ */
|
|
966
|
-
permission:
|
|
967
|
-
children: /* @__PURE__ */
|
|
1161
|
+
/* @__PURE__ */ h(nt, {
|
|
1162
|
+
permission: Ae.SESSION_CREATE,
|
|
1163
|
+
children: /* @__PURE__ */ g("button", {
|
|
968
1164
|
type: "button",
|
|
969
|
-
onClick: () =>
|
|
1165
|
+
onClick: () => dn(!0),
|
|
970
1166
|
className: "flex items-center gap-2 px-3 py-2 text-text-primary border border-border-default rounded-md hover:bg-bg-sunken transition-colors",
|
|
971
1167
|
"data-testid": "sessions-reconnect-button",
|
|
972
|
-
title:
|
|
973
|
-
children: [/* @__PURE__ */
|
|
1168
|
+
title: v("sessions.reconnectTooltip", "Reconnect orphan tmux/wezterm/zellij sessions left over from a previous agent run"),
|
|
1169
|
+
children: [/* @__PURE__ */ h(Ue, { className: "size-4" }), v("sessions.reconnect", "Reconnect")]
|
|
974
1170
|
})
|
|
975
1171
|
}),
|
|
976
|
-
/* @__PURE__ */
|
|
977
|
-
permission:
|
|
978
|
-
children: /* @__PURE__ */
|
|
1172
|
+
/* @__PURE__ */ h(nt, {
|
|
1173
|
+
permission: Ae.SESSION_CREATE,
|
|
1174
|
+
children: /* @__PURE__ */ g("button", {
|
|
979
1175
|
type: "button",
|
|
980
|
-
onClick:
|
|
1176
|
+
onClick: ar,
|
|
981
1177
|
className: "flex items-center gap-2 px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors",
|
|
982
|
-
children: [/* @__PURE__ */
|
|
1178
|
+
children: [/* @__PURE__ */ h(He, { className: "size-4" }), v("sessions.newSession", "New Session")]
|
|
983
1179
|
})
|
|
984
1180
|
})
|
|
985
1181
|
]
|
|
986
1182
|
})
|
|
987
1183
|
}),
|
|
988
|
-
/* @__PURE__ */
|
|
1184
|
+
/* @__PURE__ */ h(ke, {
|
|
989
1185
|
showConnectionStatus: !0,
|
|
990
1186
|
maxVisible: 3
|
|
991
1187
|
}),
|
|
992
|
-
/* @__PURE__ */
|
|
1188
|
+
/* @__PURE__ */ g("div", {
|
|
993
1189
|
"data-tour": "sessions-filters",
|
|
994
1190
|
className: "space-y-3",
|
|
995
|
-
children: [/* @__PURE__ */
|
|
1191
|
+
children: [/* @__PURE__ */ g("div", {
|
|
996
1192
|
className: "flex flex-col sm:flex-row items-stretch sm:items-center gap-2",
|
|
997
|
-
children: [/* @__PURE__ */
|
|
998
|
-
value:
|
|
999
|
-
onChange:
|
|
1000
|
-
placeholder:
|
|
1193
|
+
children: [/* @__PURE__ */ h(Te, {
|
|
1194
|
+
value: y,
|
|
1195
|
+
onChange: yt,
|
|
1196
|
+
placeholder: v("sessions.searchPlaceholder", "Search sessions..."),
|
|
1001
1197
|
className: "flex-1 sm:w-64 sm:flex-none"
|
|
1002
|
-
}), /* @__PURE__ */
|
|
1198
|
+
}), /* @__PURE__ */ g("div", {
|
|
1003
1199
|
className: "flex items-center gap-1 bg-bg-sunken rounded-md p-1 flex-shrink-0",
|
|
1004
1200
|
children: [
|
|
1005
|
-
/* @__PURE__ */
|
|
1201
|
+
/* @__PURE__ */ h("button", {
|
|
1006
1202
|
type: "button",
|
|
1007
|
-
onClick: () =>
|
|
1203
|
+
onClick: () => T("terminal"),
|
|
1008
1204
|
className: "p-1.5 sm:p-2 rounded hover:bg-bg-surface/50",
|
|
1009
|
-
title:
|
|
1010
|
-
children: /* @__PURE__ */
|
|
1205
|
+
title: v("sessions.terminalViewTitle", "Terminal view"),
|
|
1206
|
+
children: /* @__PURE__ */ h(Be, { className: "size-4 text-text-secondary" })
|
|
1011
1207
|
}),
|
|
1012
|
-
/* @__PURE__ */
|
|
1208
|
+
/* @__PURE__ */ h("button", {
|
|
1013
1209
|
type: "button",
|
|
1014
|
-
onClick: () =>
|
|
1015
|
-
className: `p-1.5 sm:p-2 rounded ${
|
|
1016
|
-
title:
|
|
1017
|
-
children: /* @__PURE__ */
|
|
1210
|
+
onClick: () => T("grid"),
|
|
1211
|
+
className: `p-1.5 sm:p-2 rounded ${w === "grid" ? "bg-bg-surface shadow-sm" : "hover:bg-bg-surface/50"}`,
|
|
1212
|
+
title: v("sessions.gridViewTitle", "Grid view"),
|
|
1213
|
+
children: /* @__PURE__ */ h(Re, { className: "size-4 text-text-secondary" })
|
|
1018
1214
|
}),
|
|
1019
|
-
/* @__PURE__ */
|
|
1215
|
+
/* @__PURE__ */ h("button", {
|
|
1020
1216
|
type: "button",
|
|
1021
|
-
onClick: () =>
|
|
1022
|
-
className: `p-1.5 sm:p-2 rounded ${
|
|
1023
|
-
title:
|
|
1024
|
-
children: /* @__PURE__ */
|
|
1217
|
+
onClick: () => T("list"),
|
|
1218
|
+
className: `p-1.5 sm:p-2 rounded ${w === "list" ? "bg-bg-surface shadow-sm" : "hover:bg-bg-surface/50"}`,
|
|
1219
|
+
title: v("sessions.listViewTitle", "List view"),
|
|
1220
|
+
children: /* @__PURE__ */ h(ze, { className: "size-4 text-text-secondary" })
|
|
1025
1221
|
})
|
|
1026
1222
|
]
|
|
1027
1223
|
})]
|
|
1028
|
-
}), /* @__PURE__ */
|
|
1224
|
+
}), /* @__PURE__ */ g("div", {
|
|
1029
1225
|
className: "flex items-center gap-2 sm:gap-3 flex-wrap",
|
|
1030
1226
|
children: [
|
|
1031
|
-
/* @__PURE__ */
|
|
1032
|
-
label:
|
|
1033
|
-
value:
|
|
1034
|
-
options:
|
|
1035
|
-
onChange: vt
|
|
1036
|
-
}),
|
|
1037
|
-
/* @__PURE__ */ _(l, {
|
|
1038
|
-
label: b("sessions.filterType", "Type"),
|
|
1039
|
-
value: C,
|
|
1040
|
-
options: mt,
|
|
1041
|
-
onChange: yt
|
|
1042
|
-
}),
|
|
1043
|
-
/* @__PURE__ */ _(l, {
|
|
1044
|
-
label: b("sessions.filterVibe", "Vibe"),
|
|
1045
|
-
value: w,
|
|
1046
|
-
options: Rn,
|
|
1227
|
+
/* @__PURE__ */ h(Ee, {
|
|
1228
|
+
label: v("sessions.filterStatus", "Status"),
|
|
1229
|
+
value: b,
|
|
1230
|
+
options: ht,
|
|
1047
1231
|
onChange: bt
|
|
1048
1232
|
}),
|
|
1049
|
-
/* @__PURE__ */
|
|
1050
|
-
label:
|
|
1051
|
-
value:
|
|
1052
|
-
options:
|
|
1233
|
+
/* @__PURE__ */ h(Ee, {
|
|
1234
|
+
label: v("sessions.filterType", "Type"),
|
|
1235
|
+
value: x,
|
|
1236
|
+
options: gt,
|
|
1053
1237
|
onChange: xt
|
|
1238
|
+
}),
|
|
1239
|
+
/* @__PURE__ */ h(Ee, {
|
|
1240
|
+
label: v("sessions.filterVibe", "Vibe"),
|
|
1241
|
+
value: S,
|
|
1242
|
+
options: Wn,
|
|
1243
|
+
onChange: St
|
|
1244
|
+
}),
|
|
1245
|
+
/* @__PURE__ */ h(Ee, {
|
|
1246
|
+
label: v("sessions.filterAgent", "Agent"),
|
|
1247
|
+
value: C,
|
|
1248
|
+
options: Gn,
|
|
1249
|
+
onChange: Ct
|
|
1054
1250
|
})
|
|
1055
1251
|
]
|
|
1056
1252
|
})]
|
|
1057
1253
|
}),
|
|
1058
|
-
/* @__PURE__ */
|
|
1254
|
+
/* @__PURE__ */ g("div", {
|
|
1059
1255
|
className: "flex flex-col sm:flex-row items-start sm:items-center gap-2 flex-wrap",
|
|
1060
1256
|
children: [
|
|
1061
|
-
/* @__PURE__ */
|
|
1257
|
+
/* @__PURE__ */ g("button", {
|
|
1062
1258
|
type: "button",
|
|
1063
|
-
onClick: () =>
|
|
1064
|
-
className: `flex items-center gap-2 px-3 py-1.5 text-sm rounded-full transition-colors ${
|
|
1259
|
+
onClick: () => bt("RUNNING"),
|
|
1260
|
+
className: `flex items-center gap-2 px-3 py-1.5 text-sm rounded-full transition-colors ${b === "RUNNING" ? "bg-status-success-bg text-status-success-text" : "bg-bg-sunken text-text-secondary hover:bg-bg-sunken/80"}`,
|
|
1065
1261
|
children: [
|
|
1066
|
-
/* @__PURE__ */
|
|
1262
|
+
/* @__PURE__ */ h(Ve, { className: "size-3" }),
|
|
1067
1263
|
" ",
|
|
1068
|
-
|
|
1264
|
+
v("sessions.running", "Running"),
|
|
1069
1265
|
" (",
|
|
1070
1266
|
$.running,
|
|
1071
1267
|
")"
|
|
1072
1268
|
]
|
|
1073
1269
|
}),
|
|
1074
|
-
/* @__PURE__ */
|
|
1270
|
+
/* @__PURE__ */ g("button", {
|
|
1075
1271
|
type: "button",
|
|
1076
|
-
onClick: () =>
|
|
1077
|
-
className: `flex items-center gap-2 px-3 py-1.5 text-sm rounded-full transition-colors ${
|
|
1272
|
+
onClick: () => bt("STOPPED"),
|
|
1273
|
+
className: `flex items-center gap-2 px-3 py-1.5 text-sm rounded-full transition-colors ${b === "STOPPED" ? "bg-bg-sunken text-text-secondary" : "bg-bg-sunken text-text-secondary hover:bg-bg-sunken/80"}`,
|
|
1078
1274
|
children: [
|
|
1079
|
-
/* @__PURE__ */
|
|
1275
|
+
/* @__PURE__ */ h(Ge, { className: "size-3" }),
|
|
1080
1276
|
" ",
|
|
1081
|
-
|
|
1277
|
+
v("sessions.stoppedState", "Stopped"),
|
|
1082
1278
|
" (",
|
|
1083
1279
|
$.stopped,
|
|
1084
1280
|
")"
|
|
1085
1281
|
]
|
|
1086
1282
|
}),
|
|
1087
|
-
/* @__PURE__ */
|
|
1283
|
+
/* @__PURE__ */ h("div", {
|
|
1088
1284
|
className: "sm:ml-auto flex items-center gap-2",
|
|
1089
|
-
children: Z.length > 0 && /* @__PURE__ */
|
|
1285
|
+
children: Z.length > 0 && /* @__PURE__ */ g("button", {
|
|
1090
1286
|
type: "button",
|
|
1091
|
-
onClick:
|
|
1287
|
+
onClick: Qn ? Zn : Xn,
|
|
1092
1288
|
className: "flex items-center gap-1.5 px-3 py-1.5 text-xs text-text-secondary hover:text-text-primary transition-colors",
|
|
1093
|
-
children: [/* @__PURE__ */
|
|
1289
|
+
children: [/* @__PURE__ */ h(Le, { className: "size-3.5" }), Qn ? v("sessions.deselectAll", "Deselect All") : v("sessions.selectAll", "Select All")]
|
|
1094
1290
|
})
|
|
1095
1291
|
})
|
|
1096
1292
|
]
|
|
1097
1293
|
}),
|
|
1098
|
-
|
|
1099
|
-
|
|
1294
|
+
yr(),
|
|
1295
|
+
y || b !== "all" || x !== "all" || S !== "all" || C !== "all" ? /* @__PURE__ */ g("p", {
|
|
1100
1296
|
className: "text-sm text-text-secondary",
|
|
1101
1297
|
children: [
|
|
1102
|
-
|
|
1298
|
+
v("sessions.showing", "Showing"),
|
|
1103
1299
|
" ",
|
|
1104
1300
|
Z.length,
|
|
1105
1301
|
" ",
|
|
1106
|
-
|
|
1302
|
+
v("sessions.of", "of"),
|
|
1107
1303
|
" ",
|
|
1108
1304
|
X.length,
|
|
1109
1305
|
" ",
|
|
1110
|
-
|
|
1111
|
-
q && /* @__PURE__ */
|
|
1306
|
+
v("nav.sessions", "sessions"),
|
|
1307
|
+
q && /* @__PURE__ */ g("span", {
|
|
1112
1308
|
className: "ml-2 text-text-muted",
|
|
1113
1309
|
children: [
|
|
1114
1310
|
"(",
|
|
1115
|
-
|
|
1311
|
+
v("sessions.refreshing", "refreshing..."),
|
|
1116
1312
|
")"
|
|
1117
1313
|
]
|
|
1118
1314
|
})
|
|
1119
1315
|
]
|
|
1120
1316
|
}) : null,
|
|
1121
|
-
/* @__PURE__ */
|
|
1317
|
+
/* @__PURE__ */ h(Ze, {
|
|
1122
1318
|
mode: "wait",
|
|
1123
|
-
children: Z.length > 0 ?
|
|
1319
|
+
children: Z.length > 0 ? w === "grid" ? /* @__PURE__ */ h(et, {
|
|
1124
1320
|
stagger: .04,
|
|
1125
1321
|
className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 gap-4",
|
|
1126
|
-
children: Z.map((e) => /* @__PURE__ */
|
|
1322
|
+
children: Z.map((e) => /* @__PURE__ */ h($e, { children: /* @__PURE__ */ h(je, {
|
|
1127
1323
|
session: e,
|
|
1128
|
-
onOpen:
|
|
1129
|
-
onStart:
|
|
1130
|
-
onStop:
|
|
1131
|
-
onRestart:
|
|
1324
|
+
onOpen: ir,
|
|
1325
|
+
onStart: sr,
|
|
1326
|
+
onStop: cr,
|
|
1327
|
+
onRestart: lr,
|
|
1132
1328
|
onOpenTerminal: Q,
|
|
1133
|
-
onShare:
|
|
1134
|
-
selected:
|
|
1135
|
-
onToggleSelect: () =>
|
|
1329
|
+
onShare: fr,
|
|
1330
|
+
selected: j.has(e.id),
|
|
1331
|
+
onToggleSelect: () => Yn(e.id)
|
|
1136
1332
|
}) }, e.id))
|
|
1137
|
-
}, "grid-view") : /* @__PURE__ */
|
|
1333
|
+
}, "grid-view") : /* @__PURE__ */ h($e, { children: /* @__PURE__ */ h(Me, {
|
|
1138
1334
|
sessions: Z,
|
|
1139
|
-
onOpen:
|
|
1140
|
-
onStart:
|
|
1141
|
-
onStop:
|
|
1142
|
-
onRestart:
|
|
1143
|
-
onTerminate:
|
|
1335
|
+
onOpen: ir,
|
|
1336
|
+
onStart: sr,
|
|
1337
|
+
onStop: cr,
|
|
1338
|
+
onRestart: lr,
|
|
1339
|
+
onTerminate: ur,
|
|
1144
1340
|
onOpenTerminal: Q,
|
|
1145
|
-
onShare:
|
|
1146
|
-
selectedIds:
|
|
1147
|
-
onToggleSelect:
|
|
1148
|
-
onSelectAll:
|
|
1149
|
-
onDeselectAll:
|
|
1150
|
-
}) }, "list-view") : /* @__PURE__ */
|
|
1341
|
+
onShare: fr,
|
|
1342
|
+
selectedIds: j,
|
|
1343
|
+
onToggleSelect: Yn,
|
|
1344
|
+
onSelectAll: Xn,
|
|
1345
|
+
onDeselectAll: Zn
|
|
1346
|
+
}) }, "list-view") : /* @__PURE__ */ g("div", {
|
|
1151
1347
|
className: "space-y-4",
|
|
1152
|
-
children: [/* @__PURE__ */
|
|
1348
|
+
children: [/* @__PURE__ */ h(De, {
|
|
1153
1349
|
variant: "compact",
|
|
1154
1350
|
dismissKey: "vibecontrols-sessions-setup-banner"
|
|
1155
|
-
}), /* @__PURE__ */
|
|
1156
|
-
icon: /* @__PURE__ */
|
|
1157
|
-
title:
|
|
1158
|
-
description:
|
|
1159
|
-
action: !
|
|
1351
|
+
}), /* @__PURE__ */ h(we, {
|
|
1352
|
+
icon: /* @__PURE__ */ h(Ke, { className: "size-8 text-text-secondary" }),
|
|
1353
|
+
title: y || b !== "all" || x !== "all" || S !== "all" || C !== "all" ? v("sessions.emptyFound", "No sessions found") : v("sessions.emptyConfigured", "No sessions configured"),
|
|
1354
|
+
description: y || b !== "all" || x !== "all" || S !== "all" || C !== "all" ? v("sessions.emptyAdjustSearch", "Try adjusting your search or filters") : v("sessions.emptyDescription", "Sessions require an active agent. Install the CLI agent first, then start a session."),
|
|
1355
|
+
action: !y && b === "all" && x === "all" && S === "all" && C === "all" ? /* @__PURE__ */ g("div", {
|
|
1160
1356
|
className: "flex items-center gap-2",
|
|
1161
|
-
children: [
|
|
1357
|
+
children: [vt && /* @__PURE__ */ g("button", {
|
|
1162
1358
|
type: "button",
|
|
1163
|
-
onClick:
|
|
1359
|
+
onClick: ar,
|
|
1164
1360
|
className: "flex items-center gap-2 px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors",
|
|
1165
1361
|
children: [
|
|
1166
|
-
/* @__PURE__ */
|
|
1362
|
+
/* @__PURE__ */ h(He, { className: "size-4" }),
|
|
1167
1363
|
" ",
|
|
1168
|
-
|
|
1364
|
+
v("sessions.newSession", "New Session")
|
|
1169
1365
|
]
|
|
1170
|
-
}), /* @__PURE__ */
|
|
1366
|
+
}), /* @__PURE__ */ h(Oe, { prompt: "What is a Session in VibeControls and how do I start one?" })]
|
|
1171
1367
|
}) : void 0
|
|
1172
1368
|
})]
|
|
1173
1369
|
})
|
|
1174
1370
|
}),
|
|
1175
|
-
|
|
1371
|
+
k && /* @__PURE__ */ h("div", {
|
|
1176
1372
|
className: "fixed bottom-4 right-4 z-50 px-4 py-3 bg-status-success-bg text-status-success-text rounded-md shadow-lg text-sm",
|
|
1177
|
-
children:
|
|
1373
|
+
children: k
|
|
1178
1374
|
})
|
|
1179
1375
|
]
|
|
1180
1376
|
}),
|
|
1181
|
-
|
|
1182
|
-
tabs:
|
|
1183
|
-
activeTabId:
|
|
1184
|
-
onTabSelect:
|
|
1185
|
-
onTabClose:
|
|
1186
|
-
onOpenExternal:
|
|
1377
|
+
I.length > 0 && /* @__PURE__ */ h(Ne, {
|
|
1378
|
+
tabs: I,
|
|
1379
|
+
activeTabId: R,
|
|
1380
|
+
onTabSelect: z,
|
|
1381
|
+
onTabClose: pr,
|
|
1382
|
+
onOpenExternal: mr,
|
|
1187
1383
|
onToggleCollapse: () => H((e) => !e),
|
|
1188
|
-
collapsed:
|
|
1384
|
+
collapsed: $t,
|
|
1189
1385
|
sessions: Z,
|
|
1190
1386
|
onOpenTerminal: Q,
|
|
1191
1387
|
onRetryTerminal: Q,
|
|
1192
|
-
onRenameSession:
|
|
1193
|
-
onStopTerminal:
|
|
1194
|
-
onRestartTerminal:
|
|
1388
|
+
onRenameSession: hr,
|
|
1389
|
+
onStopTerminal: gr,
|
|
1390
|
+
onRestartTerminal: _r,
|
|
1195
1391
|
heightClass: "h-[280px] sm:h-[380px]",
|
|
1196
|
-
isImmersiveFullscreen:
|
|
1197
|
-
onToggleImmersiveFullscreen:
|
|
1392
|
+
isImmersiveFullscreen: nn,
|
|
1393
|
+
onToggleImmersiveFullscreen: vr,
|
|
1198
1394
|
contextSwitcher: void 0
|
|
1199
1395
|
}),
|
|
1200
|
-
|
|
1201
|
-
|
|
1202
|
-
|
|
1203
|
-
session:
|
|
1204
|
-
isOpen: !!
|
|
1205
|
-
onClose: () =>
|
|
1396
|
+
wt && xr(),
|
|
1397
|
+
br(),
|
|
1398
|
+
en && /* @__PURE__ */ h(Pe, {
|
|
1399
|
+
session: en,
|
|
1400
|
+
isOpen: !!en,
|
|
1401
|
+
onClose: () => tn(null)
|
|
1206
1402
|
}),
|
|
1207
|
-
/* @__PURE__ */
|
|
1208
|
-
isOpen:
|
|
1209
|
-
onClose: () =>
|
|
1403
|
+
/* @__PURE__ */ h(e, {
|
|
1404
|
+
isOpen: Tt,
|
|
1405
|
+
onClose: () => D(!1),
|
|
1210
1406
|
onConfirm: () => {
|
|
1211
|
-
|
|
1407
|
+
D(!1), lt("/billing");
|
|
1212
1408
|
},
|
|
1213
1409
|
title: t("session").title,
|
|
1214
1410
|
message: t("session").message,
|
|
@@ -1218,62 +1414,62 @@ function it() {
|
|
|
1218
1414
|
})
|
|
1219
1415
|
]
|
|
1220
1416
|
});
|
|
1221
|
-
function
|
|
1222
|
-
if (!
|
|
1223
|
-
let e =
|
|
1224
|
-
return /* @__PURE__ */
|
|
1417
|
+
function br() {
|
|
1418
|
+
if (!un) return null;
|
|
1419
|
+
let e = yn?.agentSessionOrphans ?? [];
|
|
1420
|
+
return /* @__PURE__ */ h("div", {
|
|
1225
1421
|
className: "fixed inset-0 bg-bg-overlay flex items-center justify-center z-50 p-4",
|
|
1226
1422
|
"data-testid": "sessions-reconnect-modal",
|
|
1227
|
-
children: /* @__PURE__ */
|
|
1423
|
+
children: /* @__PURE__ */ g("div", {
|
|
1228
1424
|
className: "bg-bg-surface rounded-lg p-6 w-full max-w-2xl max-h-[80vh] overflow-y-auto",
|
|
1229
1425
|
children: [
|
|
1230
|
-
/* @__PURE__ */
|
|
1426
|
+
/* @__PURE__ */ h("h2", {
|
|
1231
1427
|
className: "text-lg font-semibold text-text-primary mb-1",
|
|
1232
|
-
children:
|
|
1428
|
+
children: v("sessions.reconnectTitle", "Reconnect orphan sessions")
|
|
1233
1429
|
}),
|
|
1234
|
-
/* @__PURE__ */
|
|
1430
|
+
/* @__PURE__ */ h("p", {
|
|
1235
1431
|
className: "text-sm text-text-secondary mb-4",
|
|
1236
|
-
children:
|
|
1432
|
+
children: v("sessions.reconnectDesc", "Pick an agent to scan its host for tmux / wezterm / zellij sessions named vibe-* that are not currently tracked. Adopt one to start a web terminal and bring it back into the UI.")
|
|
1237
1433
|
}),
|
|
1238
|
-
/* @__PURE__ */
|
|
1434
|
+
/* @__PURE__ */ g("div", {
|
|
1239
1435
|
className: "space-y-4",
|
|
1240
1436
|
children: [
|
|
1241
|
-
/* @__PURE__ */
|
|
1437
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
1242
1438
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
1243
|
-
children:
|
|
1244
|
-
}), /* @__PURE__ */
|
|
1245
|
-
options:
|
|
1246
|
-
value:
|
|
1439
|
+
children: v("sessions.agent", "Agent")
|
|
1440
|
+
}), /* @__PURE__ */ h(l, {
|
|
1441
|
+
options: qn,
|
|
1442
|
+
value: fn,
|
|
1247
1443
|
onChange: (e) => {
|
|
1248
|
-
|
|
1444
|
+
pn(e), hn(null), e && vn({ variables: { agentId: e } });
|
|
1249
1445
|
},
|
|
1250
|
-
placeholder:
|
|
1251
|
-
searchPlaceholder:
|
|
1446
|
+
placeholder: v("sessions.selectAgent", "Select an agent"),
|
|
1447
|
+
searchPlaceholder: v("sessions.searchAgents", "Search agents..."),
|
|
1252
1448
|
clearable: !0
|
|
1253
1449
|
})] }),
|
|
1254
|
-
|
|
1450
|
+
mn && /* @__PURE__ */ h("div", {
|
|
1255
1451
|
className: "p-3 bg-status-error-bg text-status-error-text text-sm rounded-md",
|
|
1256
1452
|
"data-testid": "sessions-reconnect-error",
|
|
1257
|
-
children:
|
|
1453
|
+
children: mn
|
|
1258
1454
|
}),
|
|
1259
|
-
|
|
1455
|
+
fn && /* @__PURE__ */ h("div", {
|
|
1260
1456
|
"data-testid": "sessions-reconnect-list",
|
|
1261
1457
|
className: "space-y-2",
|
|
1262
|
-
children:
|
|
1458
|
+
children: bn ? /* @__PURE__ */ h("div", {
|
|
1263
1459
|
className: "text-sm text-text-secondary",
|
|
1264
|
-
children:
|
|
1265
|
-
}) : e.length === 0 ? /* @__PURE__ */
|
|
1460
|
+
children: v("sessions.scanningHost", "Scanning host...")
|
|
1461
|
+
}) : e.length === 0 ? /* @__PURE__ */ h("div", {
|
|
1266
1462
|
className: "text-sm text-text-secondary",
|
|
1267
|
-
children:
|
|
1268
|
-
}) : e.map((e) => /* @__PURE__ */
|
|
1463
|
+
children: v("sessions.noOrphans", "No orphan vibe-* sessions found on this agent.")
|
|
1464
|
+
}) : e.map((e) => /* @__PURE__ */ g("div", {
|
|
1269
1465
|
className: "flex items-center justify-between gap-3 p-3 border border-border-default rounded-md bg-bg-sunken/40",
|
|
1270
1466
|
"data-testid": "sessions-reconnect-row",
|
|
1271
|
-
children: [/* @__PURE__ */
|
|
1467
|
+
children: [/* @__PURE__ */ g("div", {
|
|
1272
1468
|
className: "min-w-0 flex-1",
|
|
1273
|
-
children: [/* @__PURE__ */
|
|
1469
|
+
children: [/* @__PURE__ */ h("div", {
|
|
1274
1470
|
className: "font-mono text-sm text-text-primary break-all",
|
|
1275
1471
|
children: e.externalName
|
|
1276
|
-
}), /* @__PURE__ */
|
|
1472
|
+
}), /* @__PURE__ */ g("div", {
|
|
1277
1473
|
className: "text-xs text-text-tertiary mt-0.5",
|
|
1278
1474
|
children: [
|
|
1279
1475
|
e.provider,
|
|
@@ -1285,196 +1481,196 @@ function it() {
|
|
|
1285
1481
|
e.createdAt ? ` · created ${e.createdAt}` : ""
|
|
1286
1482
|
]
|
|
1287
1483
|
})]
|
|
1288
|
-
}), /* @__PURE__ */
|
|
1484
|
+
}), /* @__PURE__ */ h("button", {
|
|
1289
1485
|
type: "button",
|
|
1290
|
-
disabled:
|
|
1486
|
+
disabled: gn === e.externalName,
|
|
1291
1487
|
onClick: async () => {
|
|
1292
|
-
|
|
1488
|
+
_n(e.externalName), hn(null);
|
|
1293
1489
|
try {
|
|
1294
|
-
await
|
|
1295
|
-
agentId:
|
|
1490
|
+
await xn({ variables: {
|
|
1491
|
+
agentId: fn,
|
|
1296
1492
|
externalName: e.externalName,
|
|
1297
1493
|
name: e.externalName
|
|
1298
|
-
} }), await
|
|
1494
|
+
} }), await vn({ variables: { agentId: fn } });
|
|
1299
1495
|
} catch (e) {
|
|
1300
|
-
|
|
1496
|
+
hn(e instanceof Error ? e.message : String(e));
|
|
1301
1497
|
} finally {
|
|
1302
|
-
|
|
1498
|
+
_n(null);
|
|
1303
1499
|
}
|
|
1304
1500
|
},
|
|
1305
1501
|
className: "shrink-0 px-3 py-1.5 text-xs bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors disabled:opacity-50",
|
|
1306
1502
|
"data-testid": `sessions-reconnect-adopt-${e.externalName}`,
|
|
1307
|
-
children:
|
|
1503
|
+
children: gn === e.externalName ? v("sessions.adopting", "Adopting…") : v("sessions.adopt", "Adopt")
|
|
1308
1504
|
})]
|
|
1309
1505
|
}, e.externalName))
|
|
1310
1506
|
})
|
|
1311
1507
|
]
|
|
1312
1508
|
}),
|
|
1313
|
-
/* @__PURE__ */
|
|
1509
|
+
/* @__PURE__ */ h("div", {
|
|
1314
1510
|
className: "flex justify-end gap-3 mt-6",
|
|
1315
|
-
children: /* @__PURE__ */
|
|
1511
|
+
children: /* @__PURE__ */ h("button", {
|
|
1316
1512
|
type: "button",
|
|
1317
1513
|
onClick: () => {
|
|
1318
|
-
|
|
1514
|
+
dn(!1), hn(null);
|
|
1319
1515
|
},
|
|
1320
1516
|
className: "px-4 py-2 text-text-primary hover:bg-bg-sunken rounded-md transition-colors",
|
|
1321
|
-
children:
|
|
1517
|
+
children: v("common.close", "Close")
|
|
1322
1518
|
})
|
|
1323
1519
|
})
|
|
1324
1520
|
]
|
|
1325
1521
|
})
|
|
1326
1522
|
});
|
|
1327
1523
|
}
|
|
1328
|
-
function
|
|
1329
|
-
return /* @__PURE__ */
|
|
1524
|
+
function xr() {
|
|
1525
|
+
return /* @__PURE__ */ h("div", {
|
|
1330
1526
|
className: "fixed inset-0 bg-bg-overlay flex items-center justify-center z-50 p-4",
|
|
1331
|
-
children: /* @__PURE__ */
|
|
1527
|
+
children: /* @__PURE__ */ g("div", {
|
|
1332
1528
|
className: "bg-bg-surface rounded-lg p-6 w-full max-w-lg",
|
|
1333
1529
|
children: [
|
|
1334
|
-
/* @__PURE__ */
|
|
1530
|
+
/* @__PURE__ */ h("h2", {
|
|
1335
1531
|
className: "text-lg font-semibold text-text-primary mb-4",
|
|
1336
|
-
children:
|
|
1532
|
+
children: v("sessions.newSession", "New Session")
|
|
1337
1533
|
}),
|
|
1338
|
-
/* @__PURE__ */
|
|
1534
|
+
/* @__PURE__ */ g("div", {
|
|
1339
1535
|
className: "space-y-4",
|
|
1340
1536
|
children: [
|
|
1341
|
-
|
|
1537
|
+
Et && /* @__PURE__ */ h("div", {
|
|
1342
1538
|
className: "p-3 bg-status-error-bg text-status-error-text text-sm rounded-md",
|
|
1343
|
-
children:
|
|
1539
|
+
children: Et
|
|
1344
1540
|
}),
|
|
1345
|
-
/* @__PURE__ */
|
|
1541
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
1346
1542
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
1347
|
-
children:
|
|
1348
|
-
}), /* @__PURE__ */
|
|
1543
|
+
children: v("sessions.name", "Name")
|
|
1544
|
+
}), /* @__PURE__ */ h("input", {
|
|
1349
1545
|
"aria-label": "control",
|
|
1350
|
-
ref:
|
|
1546
|
+
ref: Mt,
|
|
1351
1547
|
type: "text",
|
|
1352
|
-
placeholder:
|
|
1548
|
+
placeholder: v("sessions.namePlaceholder", "dev-server"),
|
|
1353
1549
|
className: "w-full px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary placeholder:text-text-placeholder"
|
|
1354
1550
|
})] }),
|
|
1355
|
-
/* @__PURE__ */
|
|
1551
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
1356
1552
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
1357
|
-
children:
|
|
1358
|
-
}), /* @__PURE__ */
|
|
1359
|
-
options:
|
|
1360
|
-
value:
|
|
1361
|
-
onChange:
|
|
1362
|
-
placeholder:
|
|
1363
|
-
searchPlaceholder:
|
|
1553
|
+
children: v("sessions.filterVibe", "Vibe")
|
|
1554
|
+
}), /* @__PURE__ */ h(l, {
|
|
1555
|
+
options: Kn,
|
|
1556
|
+
value: It,
|
|
1557
|
+
onChange: Lt,
|
|
1558
|
+
placeholder: v("sessions.noVibe", "No vibe"),
|
|
1559
|
+
searchPlaceholder: v("sessions.searchVibes", "Search vibes..."),
|
|
1364
1560
|
clearable: !0
|
|
1365
1561
|
})] }),
|
|
1366
|
-
/* @__PURE__ */
|
|
1367
|
-
/* @__PURE__ */
|
|
1562
|
+
/* @__PURE__ */ g("div", { children: [
|
|
1563
|
+
/* @__PURE__ */ h("label", {
|
|
1368
1564
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
1369
|
-
children:
|
|
1565
|
+
children: v("sessions.filterAgent", "Agent")
|
|
1370
1566
|
}),
|
|
1371
|
-
/* @__PURE__ */
|
|
1372
|
-
options:
|
|
1373
|
-
value:
|
|
1374
|
-
onChange:
|
|
1375
|
-
placeholder:
|
|
1376
|
-
searchPlaceholder:
|
|
1567
|
+
/* @__PURE__ */ h(l, {
|
|
1568
|
+
options: qn,
|
|
1569
|
+
value: Rt,
|
|
1570
|
+
onChange: zt,
|
|
1571
|
+
placeholder: v("sessions.selectAgent", "Select an agent"),
|
|
1572
|
+
searchPlaceholder: v("sessions.searchAgents", "Search agents..."),
|
|
1377
1573
|
clearable: !0
|
|
1378
1574
|
}),
|
|
1379
|
-
/* @__PURE__ */
|
|
1575
|
+
/* @__PURE__ */ h("p", {
|
|
1380
1576
|
className: "text-xs text-text-muted mt-1",
|
|
1381
|
-
children:
|
|
1577
|
+
children: v("sessions.agentHint", "Required when no vibe is selected. Overridden by the vibe's agent if a vibe is chosen.")
|
|
1382
1578
|
})
|
|
1383
1579
|
] }),
|
|
1384
|
-
/* @__PURE__ */
|
|
1580
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
1385
1581
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
1386
|
-
children:
|
|
1387
|
-
}), /* @__PURE__ */
|
|
1388
|
-
options:
|
|
1389
|
-
value:
|
|
1390
|
-
onChange:
|
|
1391
|
-
placeholder:
|
|
1392
|
-
searchPlaceholder:
|
|
1582
|
+
children: v("sessions.filterType", "Type")
|
|
1583
|
+
}), /* @__PURE__ */ h(l, {
|
|
1584
|
+
options: Jn,
|
|
1585
|
+
value: P,
|
|
1586
|
+
onChange: Bt,
|
|
1587
|
+
placeholder: v("sessions.selectType", "Select type"),
|
|
1588
|
+
searchPlaceholder: v("sessions.searchTypes", "Search types...")
|
|
1393
1589
|
})] }),
|
|
1394
|
-
/* @__PURE__ */
|
|
1590
|
+
/* @__PURE__ */ g("div", { children: [/* @__PURE__ */ h("label", {
|
|
1395
1591
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
1396
|
-
children:
|
|
1397
|
-
}), /* @__PURE__ */
|
|
1592
|
+
children: v("sessions.command", "Command")
|
|
1593
|
+
}), /* @__PURE__ */ h("input", {
|
|
1398
1594
|
"aria-label": "control",
|
|
1399
|
-
ref:
|
|
1595
|
+
ref: Nt,
|
|
1400
1596
|
type: "text",
|
|
1401
|
-
placeholder:
|
|
1597
|
+
placeholder: v("sessions.commandPlaceholder", "bun run dev"),
|
|
1402
1598
|
className: "w-full px-3 py-2 bg-bg-sunken border border-border-default rounded-md text-text-primary placeholder:text-text-placeholder"
|
|
1403
1599
|
})] }),
|
|
1404
|
-
/* @__PURE__ */
|
|
1600
|
+
/* @__PURE__ */ g("div", {
|
|
1405
1601
|
className: "flex items-center gap-2",
|
|
1406
|
-
children: [/* @__PURE__ */
|
|
1602
|
+
children: [/* @__PURE__ */ h("input", {
|
|
1407
1603
|
"aria-label": "autoStart",
|
|
1408
|
-
ref:
|
|
1604
|
+
ref: Pt,
|
|
1409
1605
|
type: "checkbox",
|
|
1410
1606
|
id: "autoStart",
|
|
1411
1607
|
className: "size-4 rounded border-border-default"
|
|
1412
|
-
}), /* @__PURE__ */
|
|
1608
|
+
}), /* @__PURE__ */ h("label", {
|
|
1413
1609
|
htmlFor: "autoStart",
|
|
1414
1610
|
className: "text-sm text-text-primary",
|
|
1415
|
-
children:
|
|
1611
|
+
children: v("sessions.autoStartWithVibe", "Auto-start with vibe")
|
|
1416
1612
|
})]
|
|
1417
1613
|
}),
|
|
1418
|
-
(
|
|
1614
|
+
(P === "TMUX" || P === "WEZTERM" || P === "ZELLIJ") && /* @__PURE__ */ g("div", {
|
|
1419
1615
|
className: "rounded-md border border-border-default bg-bg-sunken/40",
|
|
1420
1616
|
"data-testid": "sessions-create-advanced",
|
|
1421
|
-
children: [/* @__PURE__ */
|
|
1617
|
+
children: [/* @__PURE__ */ g("button", {
|
|
1422
1618
|
type: "button",
|
|
1423
|
-
onClick: () =>
|
|
1619
|
+
onClick: () => Ht((e) => !e),
|
|
1424
1620
|
className: "w-full flex items-center justify-between px-3 py-2 text-sm font-medium text-text-primary",
|
|
1425
|
-
"aria-expanded":
|
|
1426
|
-
children: [/* @__PURE__ */
|
|
1621
|
+
"aria-expanded": Vt,
|
|
1622
|
+
children: [/* @__PURE__ */ h("span", { children: v("sessions.advanced", "Advanced options") }), /* @__PURE__ */ h("span", {
|
|
1427
1623
|
className: "text-text-tertiary text-xs",
|
|
1428
|
-
children:
|
|
1624
|
+
children: Vt ? "▾" : "▸"
|
|
1429
1625
|
})]
|
|
1430
|
-
}),
|
|
1626
|
+
}), Vt && /* @__PURE__ */ g("div", {
|
|
1431
1627
|
className: "px-3 pb-3 space-y-2",
|
|
1432
1628
|
children: [
|
|
1433
|
-
/* @__PURE__ */
|
|
1629
|
+
/* @__PURE__ */ h("label", {
|
|
1434
1630
|
className: "block text-xs font-medium text-text-secondary",
|
|
1435
|
-
children:
|
|
1631
|
+
children: v("sessions.attachExistingLabel", "Attach to existing session (optional)")
|
|
1436
1632
|
}),
|
|
1437
|
-
/* @__PURE__ */
|
|
1633
|
+
/* @__PURE__ */ h("input", {
|
|
1438
1634
|
"aria-label": "control",
|
|
1439
|
-
ref:
|
|
1635
|
+
ref: Ft,
|
|
1440
1636
|
type: "text",
|
|
1441
1637
|
"data-testid": "sessions-create-external-name",
|
|
1442
|
-
placeholder:
|
|
1638
|
+
placeholder: P === "WEZTERM" ? "e.g. vibe-051c9c62 (existing wezterm workspace)" : P === "ZELLIJ" ? "e.g. vibe-051c9c62 (existing zellij session)" : "e.g. vibe-051c9c62 (existing tmux session)",
|
|
1443
1639
|
className: "w-full px-3 py-2 text-sm bg-bg-sunken border border-border-default rounded-md text-text-primary placeholder:text-text-placeholder font-mono"
|
|
1444
1640
|
}),
|
|
1445
|
-
/* @__PURE__ */
|
|
1641
|
+
/* @__PURE__ */ h("p", {
|
|
1446
1642
|
className: "text-xs text-text-tertiary",
|
|
1447
|
-
children:
|
|
1643
|
+
children: v("sessions.attachExistingHint", "When set, the agent attaches to that existing session instead of creating a new one. Leave blank to spawn fresh.")
|
|
1448
1644
|
})
|
|
1449
1645
|
]
|
|
1450
1646
|
})]
|
|
1451
1647
|
})
|
|
1452
1648
|
]
|
|
1453
1649
|
}),
|
|
1454
|
-
/* @__PURE__ */
|
|
1650
|
+
/* @__PURE__ */ g("div", {
|
|
1455
1651
|
className: "border-t border-border-default pt-4",
|
|
1456
|
-
children: [/* @__PURE__ */
|
|
1652
|
+
children: [/* @__PURE__ */ h("h3", {
|
|
1457
1653
|
className: "text-sm font-medium text-text-secondary mb-2",
|
|
1458
|
-
children:
|
|
1459
|
-
}), /* @__PURE__ */
|
|
1654
|
+
children: v("sessions.tags", "Tags")
|
|
1655
|
+
}), /* @__PURE__ */ h(Se, {
|
|
1460
1656
|
entityType: "VIBECONTROLS_SESSION",
|
|
1461
|
-
onDraftChange:
|
|
1657
|
+
onDraftChange: cn
|
|
1462
1658
|
})]
|
|
1463
1659
|
}),
|
|
1464
|
-
/* @__PURE__ */
|
|
1660
|
+
/* @__PURE__ */ g("div", {
|
|
1465
1661
|
className: "flex justify-end gap-3 mt-6",
|
|
1466
|
-
children: [/* @__PURE__ */
|
|
1662
|
+
children: [/* @__PURE__ */ h("button", {
|
|
1467
1663
|
type: "button",
|
|
1468
|
-
onClick: () =>
|
|
1469
|
-
disabled:
|
|
1664
|
+
onClick: () => E(!1),
|
|
1665
|
+
disabled: Dt,
|
|
1470
1666
|
className: "px-4 py-2 text-text-primary hover:bg-bg-sunken rounded-md transition-colors disabled:opacity-50",
|
|
1471
|
-
children:
|
|
1472
|
-
}), /* @__PURE__ */
|
|
1667
|
+
children: v("common.cancel", "Cancel")
|
|
1668
|
+
}), /* @__PURE__ */ h("button", {
|
|
1473
1669
|
type: "button",
|
|
1474
|
-
onClick:
|
|
1475
|
-
disabled:
|
|
1670
|
+
onClick: or,
|
|
1671
|
+
disabled: Dt,
|
|
1476
1672
|
className: "px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-md hover:bg-action-primary-bg-hover transition-colors disabled:opacity-50",
|
|
1477
|
-
children:
|
|
1673
|
+
children: Dt ? v("sessions.creating", "Creating...") : v("sessions.createSession", "Create Session")
|
|
1478
1674
|
})]
|
|
1479
1675
|
})
|
|
1480
1676
|
]
|
|
@@ -1483,6 +1679,6 @@ function it() {
|
|
|
1483
1679
|
}
|
|
1484
1680
|
}
|
|
1485
1681
|
//#endregion
|
|
1486
|
-
export {
|
|
1682
|
+
export { ot as SessionsPage };
|
|
1487
1683
|
|
|
1488
1684
|
//# sourceMappingURL=SessionsPage.js.map
|