@burdenoff/microfe-vibecontrols 2026.1023.8 → 2026.1031.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -14,7 +14,7 @@ var u = (u) => {
|
|
|
14
14
|
...r,
|
|
15
15
|
children: /* @__PURE__ */ a("div", {
|
|
16
16
|
className: "flex flex-col h-full w-full min-h-0",
|
|
17
|
-
children: [/* @__PURE__ */ i(n, {}), /* @__PURE__ */ i("div", {
|
|
17
|
+
children: [u.presentation !== "compact" && /* @__PURE__ */ i(n, {}), /* @__PURE__ */ i("div", {
|
|
18
18
|
className: "flex-1 min-h-0",
|
|
19
19
|
children: /* @__PURE__ */ i(o, {
|
|
20
20
|
...u,
|
|
@@ -42,9 +42,11 @@ var e = /* @__PURE__ */ function(e) {
|
|
|
42
42
|
}({}), b = /* @__PURE__ */ function(e) {
|
|
43
43
|
return e.Action = "ACTION", e.AiContext = "AI_CONTEXT", e.AiPrompt = "AI_PROMPT", e.InstructionFile = "INSTRUCTION_FILE", e.Sandbox = "SANDBOX", e.ScheduledJob = "SCHEDULED_JOB", e.Tunnel = "TUNNEL", e.VibeDeck = "VIBE_DECK", e;
|
|
44
44
|
}({}), x = /* @__PURE__ */ function(e) {
|
|
45
|
-
return e.
|
|
45
|
+
return e.Custom = "CUSTOM", e.Monorepo = "MONOREPO", e.Package = "PACKAGE", e.Project = "PROJECT", e.Repository = "REPOSITORY", e.Workspace = "WORKSPACE", e;
|
|
46
46
|
}({}), S = /* @__PURE__ */ function(e) {
|
|
47
|
+
return e.Private = "PRIVATE", e.SharedWithVibe = "SHARED_WITH_VIBE", e;
|
|
48
|
+
}({}), C = /* @__PURE__ */ function(e) {
|
|
47
49
|
return e.Custom = "CUSTOM", e.Script = "SCRIPT", e.Ssh = "SSH", e.Terminal = "TERMINAL", e.Tmux = "TMUX", e.Wezterm = "WEZTERM", e.Zellij = "ZELLIJ", e;
|
|
48
50
|
}({});
|
|
49
51
|
//#endregion
|
|
50
|
-
export { e as AgentCapabilityScope, t as AnalyticsEntityType, n as CollaboratorRole, r as ComponentType, i as DeploymentEnvironment, a as InstructionFilename, o as InstructionScope, s as MeshSessionKind, c as NoteVisibility, l as ScorecardTier, u as SessionSharePermission, d as TunnelDomainType, f as TunnelDomainVerificationStatus, p as TunnelEnvironment, m as TunnelProtocol, h as TunnelProviderKey, g as TunnelSessionStatus, _ as TunnelStatus, v as VibeAuditExportFormat, y as VibeDeckSharePermission, b as VibeEntityType, x as
|
|
52
|
+
export { e as AgentCapabilityScope, t as AnalyticsEntityType, n as CollaboratorRole, r as ComponentType, i as DeploymentEnvironment, a as InstructionFilename, o as InstructionScope, s as MeshSessionKind, c as NoteVisibility, l as ScorecardTier, u as SessionSharePermission, d as TunnelDomainType, f as TunnelDomainVerificationStatus, p as TunnelEnvironment, m as TunnelProtocol, h as TunnelProviderKey, g as TunnelSessionStatus, _ as TunnelStatus, v as VibeAuditExportFormat, y as VibeDeckSharePermission, b as VibeEntityType, x as VibeType, S as VibeVisibility, C as VibecontrolsSessionType };
|
package/dist/pages/VibesPage.js
CHANGED
|
@@ -8,134 +8,135 @@ import ue from "../hooks/useCachedInitialData.js";
|
|
|
8
8
|
import { PageHeader as de } from "../components/shared/PageHeader.js";
|
|
9
9
|
import { LoadingState as fe } from "../components/shared/LoadingState.js";
|
|
10
10
|
import { ErrorState as pe } from "../components/shared/ErrorState.js";
|
|
11
|
+
import { VibeType as a } from "../generated/wspace-types.js";
|
|
11
12
|
import { EntityTagPicker as me } from "../components/shared/EntityTagPicker.js";
|
|
12
13
|
import { useDraftEntityTags as he } from "../hooks/useDraftEntityTags.js";
|
|
13
14
|
import { EmptyState as ge } from "../components/shared/EmptyState.js";
|
|
14
15
|
import { SearchInput as _e } from "../components/shared/SearchInput.js";
|
|
15
|
-
import { FilterDropdown as
|
|
16
|
-
import { GetHelpButton as
|
|
17
|
-
import { SelectionCheckbox as
|
|
16
|
+
import { FilterDropdown as o } from "../components/shared/FilterDropdown.js";
|
|
17
|
+
import { GetHelpButton as ve } from "../components/shared/GetHelpButton.js";
|
|
18
|
+
import { SelectionCheckbox as ye } from "../components/shared/SelectionCheckbox.js";
|
|
18
19
|
import "../components/shared/index.js";
|
|
19
|
-
import { VIBE_PERMISSIONS as
|
|
20
|
-
import { PageSkeleton as
|
|
21
|
-
import { buildProtocolUrl as
|
|
22
|
-
import { VibeCard as
|
|
23
|
-
import { DeleteVibeDialog as
|
|
24
|
-
import { VibeList as
|
|
20
|
+
import { VIBE_PERMISSIONS as s } from "../constants/permissions.js";
|
|
21
|
+
import { PageSkeleton as be } from "../components/shared/PageSkeleton.js";
|
|
22
|
+
import { buildProtocolUrl as xe, getIdePreset as Se, resolveEffectiveIdeCommand as Ce } from "../components/agents/idePresets.js";
|
|
23
|
+
import { VibeCard as we } from "../components/vibes/VibeCard.js";
|
|
24
|
+
import { DeleteVibeDialog as Te } from "../components/vibes/DeleteVibeDialog.js";
|
|
25
|
+
import { VibeList as Ee } from "../components/vibes/VibeList.js";
|
|
25
26
|
import "../components/vibes/index.js";
|
|
26
|
-
import { useCallback as
|
|
27
|
-
import { useI18n as
|
|
28
|
-
import { useUpgradePrompt as
|
|
29
|
-
import { Archive as
|
|
30
|
-
import { useSearchParams as
|
|
31
|
-
import { usePermissions as
|
|
32
|
-
import { AnimatePresence as
|
|
33
|
-
import { Fragment as
|
|
34
|
-
import { Button as
|
|
35
|
-
import { AccessDenied as
|
|
36
|
-
import { MotionItem as
|
|
27
|
+
import { useCallback as c, useEffect as De, useMemo as l, useRef as u, useState as d } from "react";
|
|
28
|
+
import { useI18n as Oe } from "@burdenoff/fe-libs/shared/providers/shell/I18nProvider";
|
|
29
|
+
import { useUpgradePrompt as ke } from "@burdenoff/fe-libs/shared/hooks";
|
|
30
|
+
import { Archive as Ae, Grid as je, List as Me, Play as Ne, Plus as Pe, RefreshCw as Fe, Zap as Ie } from "lucide-react";
|
|
31
|
+
import { useSearchParams as Le } from "react-router";
|
|
32
|
+
import { usePermissions as Re } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
33
|
+
import { AnimatePresence as ze } from "framer-motion";
|
|
34
|
+
import { Fragment as Be, jsx as f, jsxs as p } from "react/jsx-runtime";
|
|
35
|
+
import { Button as Ve, CTAOverflowMenu as He, PagePurpose as Ue } from "@burdenoff/fe-libs/ui";
|
|
36
|
+
import { AccessDenied as We, PermissionButton as m, PermissionGate as Ge } from "@burdenoff/fe-libs/shared/components";
|
|
37
|
+
import { MotionItem as Ke, MotionList as qe, MotionPage as Je } from "@burdenoff/fe-libs/shared/motion";
|
|
37
38
|
import { useAssistantPageControls as Ye } from "@burdenoff/fe-libs/shared/assistant/appControls/useAssistantControl";
|
|
38
39
|
import { enumFilter as Xe, filtersOf as Ze, openersOf as Qe, searchOf as $e } from "@burdenoff/fe-libs/shared/assistant/appControls/pageAdapters";
|
|
39
40
|
//#region src/pages/VibesPage.tsx
|
|
40
41
|
function et() {
|
|
41
|
-
let { onVibeActivate: et, workspaceId:
|
|
42
|
+
let { onVibeActivate: et, workspaceId: h } = se(), tt = ce(), { hasPermission: g, isLoading: _, permissions: nt } = Re(), { t: rt } = Oe(), { isFree: it, approachingLimits: at } = ke({ resource: "vibes" }), v = at[0], y = c((e, t, n) => {
|
|
42
43
|
let r = rt(e, n), i = r === e ? t : r;
|
|
43
44
|
return n ? Object.entries(n).reduce((e, [t, n]) => e.replace(`{{${t}}}`, String(n)), i) : i;
|
|
44
|
-
}, [rt]),
|
|
45
|
+
}, [rt]), b = l(() => [
|
|
45
46
|
{
|
|
46
47
|
value: "all",
|
|
47
|
-
label:
|
|
48
|
+
label: y("vibesPage.statusAll", "All Statuses")
|
|
48
49
|
},
|
|
49
50
|
{
|
|
50
51
|
value: "ACTIVE",
|
|
51
|
-
label:
|
|
52
|
+
label: y("vibesPage.statusActive", "Active")
|
|
52
53
|
},
|
|
53
54
|
{
|
|
54
55
|
value: "INACTIVE",
|
|
55
|
-
label:
|
|
56
|
+
label: y("vibesPage.statusInactive", "Inactive")
|
|
56
57
|
},
|
|
57
58
|
{
|
|
58
59
|
value: "ARCHIVED",
|
|
59
|
-
label:
|
|
60
|
+
label: y("vibesPage.statusArchived", "Archived")
|
|
60
61
|
},
|
|
61
62
|
{
|
|
62
63
|
value: "ERROR",
|
|
63
|
-
label:
|
|
64
|
+
label: y("vibesPage.statusError", "Error")
|
|
64
65
|
}
|
|
65
|
-
], [
|
|
66
|
+
], [y]), x = l(() => [
|
|
66
67
|
{
|
|
67
68
|
value: "all",
|
|
68
|
-
label:
|
|
69
|
+
label: y("vibesPage.typeAll", "All Types")
|
|
69
70
|
},
|
|
70
71
|
{
|
|
71
|
-
value:
|
|
72
|
-
label:
|
|
72
|
+
value: a.Project,
|
|
73
|
+
label: y("vibesPage.typeProject", "Project")
|
|
73
74
|
},
|
|
74
75
|
{
|
|
75
|
-
value:
|
|
76
|
-
label:
|
|
76
|
+
value: a.Repository,
|
|
77
|
+
label: y("vibesPage.typeRepository", "Repository")
|
|
77
78
|
},
|
|
78
79
|
{
|
|
79
|
-
value:
|
|
80
|
-
label:
|
|
80
|
+
value: a.Workspace,
|
|
81
|
+
label: y("vibesPage.typeWorkspace", "Workspace")
|
|
81
82
|
},
|
|
82
83
|
{
|
|
83
|
-
value:
|
|
84
|
-
label:
|
|
84
|
+
value: a.Monorepo,
|
|
85
|
+
label: y("vibesPage.typeMonorepo", "Monorepo")
|
|
85
86
|
},
|
|
86
87
|
{
|
|
87
|
-
value:
|
|
88
|
-
label:
|
|
88
|
+
value: a.Package,
|
|
89
|
+
label: y("vibesPage.typePackage", "Package")
|
|
89
90
|
},
|
|
90
91
|
{
|
|
91
|
-
value:
|
|
92
|
-
label:
|
|
92
|
+
value: a.Custom,
|
|
93
|
+
label: y("vibesPage.typeCustom", "Custom")
|
|
93
94
|
}
|
|
94
|
-
], [
|
|
95
|
-
|
|
96
|
-
|
|
95
|
+
], [y]), ot = g(s.VIBE_LIST), st = g(s.VIBE_UPDATE), ct = g(s.VIBE_DELETE), S = _ || !ot, [C, lt] = d(""), [w, ut] = d("all"), [T, dt] = d("all"), [E, ft] = d("all"), [D, pt] = d("grid"), [mt, O] = d(!1), [ht, k] = d(null), [A, gt] = d(!1), [_t, j] = d(null), [vt, M] = d(!1), [N, P] = d({}), [yt, F] = d(null), [I, L] = d(/* @__PURE__ */ new Set()), [bt, R] = d(null), z = u(null);
|
|
96
|
+
De(() => () => {
|
|
97
|
+
z.current && clearTimeout(z.current);
|
|
97
98
|
}, []);
|
|
98
|
-
let
|
|
99
|
-
|
|
100
|
-
}, []),
|
|
101
|
-
variables:
|
|
99
|
+
let xt = c(() => {
|
|
100
|
+
F(null), z.current &&= (clearTimeout(z.current), null);
|
|
101
|
+
}, []), St = u(null), Ct = u(null), wt = u(null), Tt = u(null), [Et] = n(), [Dt] = t(), { setDraftTagIds: Ot, flushTags: kt } = he("VIBECONTROLS_VIBE"), [At] = te(), [jt] = e(), [Mt, { loading: Nt }] = r(), [B, V] = d(null), { data: Pt, loading: H, error: Ft, refetch: U } = ee({
|
|
102
|
+
variables: l(() => {
|
|
102
103
|
let e = {};
|
|
103
|
-
return
|
|
104
|
+
return h && (e.workspaceId = h), w !== "all" && (e.status = w), T !== "all" && (e.type = T), E !== "all" && (e.attachedAgentIds = [E]), {
|
|
104
105
|
filter: e,
|
|
105
106
|
pagination: { limit: 50 }
|
|
106
107
|
};
|
|
107
108
|
}, [
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
109
|
+
h,
|
|
110
|
+
w,
|
|
111
|
+
T,
|
|
112
|
+
E
|
|
112
113
|
]),
|
|
113
|
-
fetchPolicy:
|
|
114
|
+
fetchPolicy: w === "all" && T === "all" && E === "all" ? "cache-first" : "cache-and-network",
|
|
114
115
|
nextFetchPolicy: "cache-first",
|
|
115
|
-
skip:
|
|
116
|
+
skip: S,
|
|
116
117
|
notifyOnNetworkStatusChange: !0
|
|
117
|
-
}), { agents:
|
|
118
|
-
|
|
119
|
-
}, [
|
|
120
|
-
let e =
|
|
118
|
+
}), { agents: It } = ue(), [Lt, { data: Rt }] = i({ fetchPolicy: "cache-first" }), zt = u(!1), W = c(() => {
|
|
119
|
+
zt.current || S || (zt.current = !0, Lt({ variables: { pagination: { limit: 100 } } }));
|
|
120
|
+
}, [Lt, S]), Bt = l(() => {
|
|
121
|
+
let e = Rt?.vibecontrolsAgents ?? null, t = e ? e.map((e) => ({
|
|
121
122
|
id: e.id,
|
|
122
123
|
name: e.name
|
|
123
|
-
})) :
|
|
124
|
+
})) : It.map((e) => ({
|
|
124
125
|
id: e.id,
|
|
125
126
|
name: e.name
|
|
126
127
|
}));
|
|
127
128
|
return [{
|
|
128
129
|
value: "all",
|
|
129
|
-
label:
|
|
130
|
+
label: y("vibesPage.allAgents", "All Agents")
|
|
130
131
|
}, ...t.map((e) => ({
|
|
131
132
|
value: e.id,
|
|
132
133
|
label: e.name
|
|
133
134
|
}))];
|
|
134
135
|
}, [
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
]),
|
|
136
|
+
Rt?.vibecontrolsAgents,
|
|
137
|
+
It,
|
|
138
|
+
y
|
|
139
|
+
]), G = l(() => (Pt?.vibes?.items ?? []).map((e) => ({
|
|
139
140
|
id: e.id,
|
|
140
141
|
workspaceId: e.workspaceId,
|
|
141
142
|
name: e.name,
|
|
@@ -153,17 +154,17 @@ function et() {
|
|
|
153
154
|
createdAt: e.createdAt,
|
|
154
155
|
updatedAt: e.updatedAt,
|
|
155
156
|
agents: []
|
|
156
|
-
})), [
|
|
157
|
-
if (
|
|
158
|
-
let t =
|
|
157
|
+
})), [Pt?.vibes?.items]), K = l(() => G.filter((e) => {
|
|
158
|
+
if (C) {
|
|
159
|
+
let t = C.toLowerCase();
|
|
159
160
|
if (!(e.name.toLowerCase().includes(t) || e.description?.toLowerCase().includes(t) || e.path?.toLowerCase().includes(t) || e.tags?.some((e) => e.toLowerCase().includes(t)))) return !1;
|
|
160
161
|
}
|
|
161
162
|
return !0;
|
|
162
|
-
}), [
|
|
163
|
+
}), [G, C]), Vt = l(() => G.filter((e) => I.has(e.id)), [G, I]), q = Vt.filter((e) => e.status !== "ACTIVE"), J = Vt.filter((e) => e.status !== "ARCHIVED"), Y = K.length > 0 && K.every((e) => I.has(e.id)), Ht = K.some((e) => I.has(e.id)) && !Y, Ut = (e) => {
|
|
163
164
|
tt(`/vibes/${e.id}`);
|
|
164
|
-
},
|
|
165
|
+
}, Wt = async (e) => {
|
|
165
166
|
try {
|
|
166
|
-
(await
|
|
167
|
+
(await At({ variables: {
|
|
167
168
|
id: e.id,
|
|
168
169
|
status: "ACTIVE"
|
|
169
170
|
} })).data?.updateVibeStatus && (et?.({
|
|
@@ -171,21 +172,21 @@ function et() {
|
|
|
171
172
|
name: e.name,
|
|
172
173
|
type: e.type,
|
|
173
174
|
status: "ACTIVE"
|
|
174
|
-
}), await
|
|
175
|
+
}), await U());
|
|
175
176
|
} catch (e) {
|
|
176
177
|
console.error("Failed to activate vibe:", e);
|
|
177
178
|
}
|
|
178
179
|
}, Gt = async (e) => {
|
|
179
180
|
try {
|
|
180
|
-
await
|
|
181
|
+
await jt({ variables: { id: e.id } }), await U();
|
|
181
182
|
} catch (e) {
|
|
182
183
|
console.error("Failed to archive vibe:", e);
|
|
183
184
|
}
|
|
184
185
|
}, Kt = async (e) => {
|
|
185
|
-
if (!
|
|
186
|
-
let t =
|
|
186
|
+
if (!B) return;
|
|
187
|
+
let t = B.id;
|
|
187
188
|
try {
|
|
188
|
-
await
|
|
189
|
+
await Mt({
|
|
189
190
|
variables: {
|
|
190
191
|
id: t,
|
|
191
192
|
deleteRelatedEntities: e
|
|
@@ -196,98 +197,98 @@ function et() {
|
|
|
196
197
|
id: t
|
|
197
198
|
}) }), e.gc();
|
|
198
199
|
}
|
|
199
|
-
}),
|
|
200
|
+
}), V(null), await U();
|
|
200
201
|
} catch (e) {
|
|
201
202
|
console.error("Failed to delete vibe:", e);
|
|
202
203
|
}
|
|
203
204
|
}, qt = le((e) => e.preferredIdeCommand), Jt = le((e) => e.vibeIdeOverrides), Yt = (e) => {
|
|
204
205
|
if (!e.path) {
|
|
205
|
-
|
|
206
|
-
|
|
206
|
+
F(y("vibesPage.openEditorPathMissing", "No path available to open in editor")), z.current = setTimeout(() => {
|
|
207
|
+
F(null), z.current = null;
|
|
207
208
|
}, 3e3);
|
|
208
209
|
return;
|
|
209
210
|
}
|
|
210
|
-
let t =
|
|
211
|
-
r ? window.location.href = r : (
|
|
212
|
-
|
|
211
|
+
let t = Ce(e.id, qt, Jt), n = Se(t), r = n ? xe(n, e.path) : `vscode://file/${e.path}`;
|
|
212
|
+
r ? window.location.href = r : (F(y("vibesPage.openEditorNoProtocol", `${n?.label ?? t} has no URL handler — open this Vibe and use the editor menu.`)), z.current = setTimeout(() => {
|
|
213
|
+
F(null), z.current = null;
|
|
213
214
|
}, 4e3));
|
|
214
|
-
},
|
|
215
|
-
|
|
216
|
-
}, [
|
|
217
|
-
Ye(
|
|
218
|
-
page:
|
|
215
|
+
}, X = c(() => {
|
|
216
|
+
k(null), O(!0), W();
|
|
217
|
+
}, [W]), Xt = g(s.VIBE_CREATE);
|
|
218
|
+
Ye(l(() => ({
|
|
219
|
+
page: y("vibesPage.assistantPage", "Vibes"),
|
|
219
220
|
filters: Ze([Xe({
|
|
220
221
|
id: "status",
|
|
221
|
-
label:
|
|
222
|
-
options:
|
|
222
|
+
label: y("vibesPage.filterStatus", "Status"),
|
|
223
|
+
options: b,
|
|
223
224
|
neutral: "all",
|
|
224
|
-
value:
|
|
225
|
-
set:
|
|
225
|
+
value: w,
|
|
226
|
+
set: ut
|
|
226
227
|
}), Xe({
|
|
227
228
|
id: "type",
|
|
228
|
-
label:
|
|
229
|
-
options:
|
|
229
|
+
label: y("vibesPage.assistantType", "Type"),
|
|
230
|
+
options: x,
|
|
230
231
|
neutral: "all",
|
|
231
|
-
value:
|
|
232
|
-
set:
|
|
232
|
+
value: T,
|
|
233
|
+
set: dt
|
|
233
234
|
})]),
|
|
234
|
-
search: $e(
|
|
235
|
+
search: $e(lt),
|
|
235
236
|
...Xt ? { openers: Qe([{
|
|
236
237
|
id: "create-vibe",
|
|
237
|
-
label:
|
|
238
|
-
open:
|
|
238
|
+
label: y("vibesPage.assistantCreateVibe", "Create vibe"),
|
|
239
|
+
open: X
|
|
239
240
|
}]) } : {}
|
|
240
241
|
}), [
|
|
241
|
-
v,
|
|
242
242
|
y,
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
243
|
+
b,
|
|
244
|
+
x,
|
|
245
|
+
w,
|
|
246
|
+
T,
|
|
246
247
|
Xt,
|
|
247
|
-
|
|
248
|
+
X
|
|
248
249
|
]));
|
|
249
|
-
let [
|
|
250
|
-
|
|
251
|
-
if (
|
|
252
|
-
|
|
253
|
-
let e = new URLSearchParams(
|
|
250
|
+
let [Z, Zt] = Le();
|
|
251
|
+
De(() => {
|
|
252
|
+
if (Z.get("create") === "true") {
|
|
253
|
+
X();
|
|
254
|
+
let e = new URLSearchParams(Z);
|
|
254
255
|
e.delete("create"), Zt(e, { replace: !0 });
|
|
255
256
|
}
|
|
256
257
|
}, [
|
|
257
|
-
|
|
258
|
+
Z,
|
|
258
259
|
Zt,
|
|
259
|
-
|
|
260
|
+
X
|
|
260
261
|
]);
|
|
261
262
|
let Qt = (e, t) => {
|
|
262
|
-
|
|
263
|
+
L((n) => {
|
|
263
264
|
let r = new Set(n);
|
|
264
265
|
return t ? r.add(e.id) : r.delete(e.id), r;
|
|
265
266
|
});
|
|
266
267
|
}, $t = (e) => {
|
|
267
|
-
|
|
268
|
+
L((t) => {
|
|
268
269
|
let n = new Set(t);
|
|
269
|
-
return
|
|
270
|
+
return K.forEach((t) => {
|
|
270
271
|
e ? n.add(t.id) : n.delete(t.id);
|
|
271
272
|
}), n;
|
|
272
273
|
});
|
|
273
|
-
},
|
|
274
|
-
if (
|
|
275
|
-
let e = await Promise.allSettled(
|
|
274
|
+
}, en = () => L(/* @__PURE__ */ new Set()), tn = async () => {
|
|
275
|
+
if (q.length === 0) return;
|
|
276
|
+
let e = await Promise.allSettled(q.map((e) => At({ variables: {
|
|
276
277
|
id: e.id,
|
|
277
278
|
status: "ACTIVE"
|
|
278
279
|
} }))), t = e.filter((e) => e.status === "fulfilled").length, n = e.length - t;
|
|
279
|
-
|
|
280
|
-
}, tn = async () => {
|
|
281
|
-
if (K.length === 0) return;
|
|
282
|
-
let e = await Promise.allSettled(K.map((e) => Mt({ variables: { id: e.id } }))), t = e.filter((e) => e.status === "fulfilled").length, n = e.length - t;
|
|
283
|
-
k(`Archived ${t} vibe${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), setTimeout(() => k(null), 4e3), Z(), I(null), await V();
|
|
280
|
+
j(`Activated ${t} vibe${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), setTimeout(() => j(null), 4e3), en(), R(null), await U();
|
|
284
281
|
}, nn = async () => {
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
282
|
+
if (J.length === 0) return;
|
|
283
|
+
let e = await Promise.allSettled(J.map((e) => jt({ variables: { id: e.id } }))), t = e.filter((e) => e.status === "fulfilled").length, n = e.length - t;
|
|
284
|
+
j(`Archived ${t} vibe${t === 1 ? "" : "s"}${n > 0 ? ` • ${n} failed` : ""}`), setTimeout(() => j(null), 4e3), en(), R(null), await U();
|
|
285
|
+
}, rn = async () => {
|
|
286
|
+
let e = St.current?.value?.trim(), t = Ct.current?.value?.trim(), n = wt.current?.value, r = Tt.current?.value, i = {};
|
|
287
|
+
if (e || (i.name = y("vibesPage.nameRequired", "Name is required")), i.name) {
|
|
288
|
+
P(i), k(y("vibesPage.fillRequired", "Please fill in all required fields"));
|
|
288
289
|
return;
|
|
289
290
|
}
|
|
290
|
-
|
|
291
|
+
P({});
|
|
291
292
|
let ee = [
|
|
292
293
|
"PROJECT",
|
|
293
294
|
"REPOSITORY",
|
|
@@ -296,219 +297,232 @@ function et() {
|
|
|
296
297
|
"PACKAGE",
|
|
297
298
|
"CUSTOM"
|
|
298
299
|
].includes(r) ? r : "PROJECT";
|
|
299
|
-
|
|
300
|
+
gt(!0), k(null);
|
|
300
301
|
try {
|
|
301
|
-
let r = await
|
|
302
|
+
let r = await Et({ variables: { input: {
|
|
302
303
|
name: e,
|
|
303
304
|
path: t ?? "",
|
|
304
305
|
type: ee
|
|
305
306
|
} } });
|
|
306
|
-
if (!r.data?.createVibe?.id) throw Error(
|
|
307
|
+
if (!r.data?.createVibe?.id) throw Error(y("vibesPage.failedCreate", "Failed to create vibe"));
|
|
307
308
|
let i = r.data.createVibe.id;
|
|
308
309
|
if (n) try {
|
|
309
|
-
await
|
|
310
|
+
await Dt({ variables: { input: {
|
|
310
311
|
vibeId: i,
|
|
311
312
|
agentId: n
|
|
312
313
|
} } });
|
|
313
314
|
} catch {}
|
|
314
|
-
|
|
315
|
+
O(!1), j(y("vibesPage.createdSuccess", "Vibe created successfully")), await kt(i), await U(), setTimeout(() => j(null), 3e3);
|
|
315
316
|
} catch (e) {
|
|
316
317
|
if (ie(e)) {
|
|
317
|
-
|
|
318
|
+
O(!1), k(null), P({}), ae(), M(!0);
|
|
318
319
|
return;
|
|
319
320
|
}
|
|
320
|
-
|
|
321
|
+
k(e instanceof Error ? e.message : y("vibesPage.failedCreate", "Failed to create vibe"));
|
|
321
322
|
} finally {
|
|
322
|
-
|
|
323
|
+
gt(!1);
|
|
323
324
|
}
|
|
324
|
-
},
|
|
325
|
-
total:
|
|
326
|
-
active:
|
|
327
|
-
inactive:
|
|
328
|
-
}, Q =
|
|
329
|
-
return /* @__PURE__ */
|
|
325
|
+
}, an = {
|
|
326
|
+
total: G.length,
|
|
327
|
+
active: G.filter((e) => e.status === "ACTIVE").length,
|
|
328
|
+
inactive: G.filter((e) => e.status === "INACTIVE").length
|
|
329
|
+
}, Q = _, $ = !_ && !!nt && (nt.permissionStrings?.length ?? 0) > 0 && !ot, on = !Q && !$ && H && G.length === 0, sn = !Q && !$ && !!Ft && G.length === 0, cn = !Q && !$ && !sn;
|
|
330
|
+
return /* @__PURE__ */ p(Je, {
|
|
330
331
|
className: "space-y-6 px-6 lg:px-8 py-6 bg-bg-canvas min-h-screen",
|
|
331
332
|
children: [
|
|
332
|
-
Q && /* @__PURE__ */
|
|
333
|
-
$ && /* @__PURE__ */
|
|
334
|
-
title:
|
|
335
|
-
description:
|
|
333
|
+
Q && /* @__PURE__ */ f(fe, { message: y("vibesPage.loadingPermissions", "Loading permissions...") }),
|
|
334
|
+
$ && /* @__PURE__ */ f(We, {
|
|
335
|
+
title: y("vibesPage.accessDeniedTitle", "Access Denied"),
|
|
336
|
+
description: y("vibesPage.accessDeniedDescription", "You don't have permission to view vibes. Contact your workspace administrator for access.")
|
|
336
337
|
}),
|
|
337
|
-
|
|
338
|
-
title:
|
|
339
|
-
message:
|
|
340
|
-
onRetry: () =>
|
|
338
|
+
sn && /* @__PURE__ */ f(pe, {
|
|
339
|
+
title: y("vibesPage.failedLoad", "Failed to load vibes"),
|
|
340
|
+
message: Ft?.message ?? "",
|
|
341
|
+
onRetry: () => U()
|
|
341
342
|
}),
|
|
342
|
-
|
|
343
|
-
/* @__PURE__ */
|
|
344
|
-
title:
|
|
345
|
-
description:
|
|
346
|
-
active:
|
|
347
|
-
total:
|
|
343
|
+
cn && /* @__PURE__ */ p(Be, { children: [
|
|
344
|
+
/* @__PURE__ */ f(de, {
|
|
345
|
+
title: y("vibesPage.title", "Vibes"),
|
|
346
|
+
description: y("vibesPage.descriptionActive", "{{active}} of {{total}} vibes active", {
|
|
347
|
+
active: an.active,
|
|
348
|
+
total: an.total
|
|
348
349
|
}),
|
|
349
|
-
actions: /* @__PURE__ */
|
|
350
|
+
actions: /* @__PURE__ */ p("div", {
|
|
350
351
|
className: "flex items-center gap-2",
|
|
351
352
|
children: [
|
|
352
|
-
it &&
|
|
353
|
+
it && v && typeof v.limit == "number" && /* @__PURE__ */ f("a", {
|
|
353
354
|
href: "/billing/plans",
|
|
354
|
-
className: `inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-md border ${
|
|
355
|
-
title:
|
|
356
|
-
children:
|
|
357
|
-
current:
|
|
358
|
-
limit:
|
|
355
|
+
className: `inline-flex items-center gap-1 px-2 py-1 text-xs font-medium rounded-md border ${v.current >= v.limit ? "border-status-error-border bg-status-error-bg-subtle text-status-error-text" : "border-status-warning-border bg-status-warning-bg-subtle text-status-warning-text"}`,
|
|
356
|
+
title: y("vibesPage.upgradeChipTooltip", "Free plan limit — upgrade for more vibes"),
|
|
357
|
+
children: y("vibesPage.usageChip", "{{current}} of {{limit}} vibes used", {
|
|
358
|
+
current: v.current,
|
|
359
|
+
limit: v.limit
|
|
359
360
|
})
|
|
360
361
|
}),
|
|
361
|
-
/* @__PURE__ */
|
|
362
|
-
permission:
|
|
362
|
+
/* @__PURE__ */ f(m, {
|
|
363
|
+
permission: s.VIBE_CREATE,
|
|
363
364
|
deniedBehavior: "disable",
|
|
364
|
-
deniedTooltip:
|
|
365
|
-
children: /* @__PURE__ */
|
|
365
|
+
deniedTooltip: y("vibesPage.deniedCreateTooltip", "You don't have permission to create vibes"),
|
|
366
|
+
children: /* @__PURE__ */ p(Ve, {
|
|
366
367
|
type: "button",
|
|
367
|
-
onClick:
|
|
368
|
+
onClick: X,
|
|
368
369
|
className: "gap-2",
|
|
369
|
-
children: [/* @__PURE__ */
|
|
370
|
+
children: [/* @__PURE__ */ f(Pe, { className: "size-4" }), y("vibesPage.addVibe", "Add Vibe")]
|
|
370
371
|
})
|
|
371
372
|
}),
|
|
372
|
-
/* @__PURE__ */
|
|
373
|
-
label:
|
|
374
|
-
onSelect: () => void
|
|
375
|
-
disabled:
|
|
376
|
-
icon: /* @__PURE__ */
|
|
373
|
+
/* @__PURE__ */ f(He, { actions: [{
|
|
374
|
+
label: y("vibesPage.refreshTitle", "Refresh vibes"),
|
|
375
|
+
onSelect: () => void U(),
|
|
376
|
+
disabled: H,
|
|
377
|
+
icon: /* @__PURE__ */ f(Fe, { className: `size-4 ${H ? "animate-spin" : ""}` })
|
|
377
378
|
}] })
|
|
378
379
|
]
|
|
379
380
|
})
|
|
380
381
|
}),
|
|
381
|
-
/* @__PURE__ */
|
|
382
|
-
icon: /* @__PURE__ */
|
|
383
|
-
children:
|
|
382
|
+
/* @__PURE__ */ f(Ue, {
|
|
383
|
+
icon: /* @__PURE__ */ f(Ie, { className: "size-4" }),
|
|
384
|
+
children: y("vibesPage.purpose", "A vibe is a workspace for a piece of work — a project, an experiment, a support task. It ties together the agent that runs your commands, the sessions you open, notes, schedules and audit history in one place. Create a vibe whenever you want a focused, shareable space to get something done with AI and your own machines.")
|
|
384
385
|
}),
|
|
385
|
-
/* @__PURE__ */
|
|
386
|
+
/* @__PURE__ */ p("div", {
|
|
386
387
|
className: "space-y-3",
|
|
387
|
-
children: [/* @__PURE__ */
|
|
388
|
+
children: [/* @__PURE__ */ p("div", {
|
|
388
389
|
className: "flex items-center gap-2",
|
|
389
|
-
children: [/* @__PURE__ */
|
|
390
|
+
children: [/* @__PURE__ */ f("div", {
|
|
390
391
|
"data-tour": "vibecontrols-vibes-search",
|
|
391
392
|
className: "flex-1 sm:w-64 sm:flex-none",
|
|
392
|
-
children: /* @__PURE__ */
|
|
393
|
-
value:
|
|
394
|
-
onChange:
|
|
395
|
-
placeholder:
|
|
393
|
+
children: /* @__PURE__ */ f(_e, {
|
|
394
|
+
value: C,
|
|
395
|
+
onChange: lt,
|
|
396
|
+
placeholder: y("vibesPage.searchPlaceholder", "Search vibes..."),
|
|
396
397
|
className: "w-full"
|
|
397
398
|
})
|
|
398
|
-
}), /* @__PURE__ */
|
|
399
|
+
}), /* @__PURE__ */ p("div", {
|
|
399
400
|
"data-tour": "vibecontrols-vibes-view-toggle",
|
|
400
401
|
className: "flex items-center gap-1 bg-bg-sunken rounded-button p-1 flex-shrink-0 border border-border-subtle",
|
|
401
|
-
children: [/* @__PURE__ */
|
|
402
|
+
children: [/* @__PURE__ */ f("button", {
|
|
402
403
|
type: "button",
|
|
403
|
-
onClick: () =>
|
|
404
|
-
className: `p-1.5 sm:p-2 rounded ${
|
|
405
|
-
title:
|
|
406
|
-
children: /* @__PURE__ */
|
|
407
|
-
}), /* @__PURE__ */
|
|
404
|
+
onClick: () => pt("grid"),
|
|
405
|
+
className: `p-1.5 sm:p-2 rounded ${D === "grid" ? "bg-[var(--color-accent-soft)] text-text-primary" : "text-text-secondary hover:bg-bg-surface/60"}`,
|
|
406
|
+
title: y("vibesPage.gridViewTitle", "Grid view"),
|
|
407
|
+
children: /* @__PURE__ */ f(je, { className: "size-4 text-text-secondary" })
|
|
408
|
+
}), /* @__PURE__ */ f("button", {
|
|
408
409
|
type: "button",
|
|
409
|
-
onClick: () =>
|
|
410
|
-
className: `p-1.5 sm:p-2 rounded ${
|
|
411
|
-
title:
|
|
412
|
-
children: /* @__PURE__ */
|
|
410
|
+
onClick: () => pt("list"),
|
|
411
|
+
className: `p-1.5 sm:p-2 rounded ${D === "list" ? "bg-[var(--color-accent-soft)] text-text-primary" : "text-text-secondary hover:bg-bg-surface/60"}`,
|
|
412
|
+
title: y("vibesPage.listViewTitle", "List view"),
|
|
413
|
+
children: /* @__PURE__ */ f(Me, { className: "size-4 text-text-secondary" })
|
|
413
414
|
})]
|
|
414
415
|
})]
|
|
415
|
-
}), /* @__PURE__ */
|
|
416
|
+
}), /* @__PURE__ */ p("div", {
|
|
416
417
|
className: "flex items-center gap-2 sm:gap-3 flex-wrap",
|
|
417
|
-
children: [
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
418
|
+
children: [
|
|
419
|
+
/* @__PURE__ */ f("div", {
|
|
420
|
+
"data-tour": "vibecontrols-vibes-status-filter",
|
|
421
|
+
children: /* @__PURE__ */ f(o, {
|
|
422
|
+
label: y("vibesPage.filterStatus", "Status"),
|
|
423
|
+
value: w,
|
|
424
|
+
options: b,
|
|
425
|
+
onChange: ut
|
|
426
|
+
})
|
|
427
|
+
}),
|
|
428
|
+
/* @__PURE__ */ f("div", {
|
|
429
|
+
"data-tour": "vibecontrols-vibes-type-filter",
|
|
430
|
+
children: /* @__PURE__ */ f(o, {
|
|
431
|
+
label: y("vibesPage.filterType", "Type"),
|
|
432
|
+
value: T,
|
|
433
|
+
options: x,
|
|
434
|
+
onChange: dt,
|
|
435
|
+
allLabel: y("vibesPage.typeAll", "All Types")
|
|
436
|
+
})
|
|
437
|
+
}),
|
|
438
|
+
/* @__PURE__ */ f("div", {
|
|
439
|
+
"data-tour": "vibecontrols-vibes-agent-filter",
|
|
440
|
+
onMouseDown: W,
|
|
441
|
+
onFocus: W,
|
|
442
|
+
children: /* @__PURE__ */ f(o, {
|
|
443
|
+
label: y("vibesPage.filterAgent", "Agent"),
|
|
444
|
+
value: E,
|
|
445
|
+
options: Bt,
|
|
446
|
+
onChange: ft
|
|
447
|
+
})
|
|
434
448
|
})
|
|
435
|
-
|
|
449
|
+
]
|
|
436
450
|
})]
|
|
437
451
|
}),
|
|
438
|
-
|
|
452
|
+
C || w !== "all" || T !== "all" || E !== "all" ? /* @__PURE__ */ p("p", {
|
|
439
453
|
className: "text-sm text-text-secondary",
|
|
440
|
-
children: [
|
|
441
|
-
filtered:
|
|
442
|
-
total:
|
|
443
|
-
}),
|
|
454
|
+
children: [y("vibesPage.showingResults", "Showing {{filtered}} of {{total}} vibes", {
|
|
455
|
+
filtered: K.length,
|
|
456
|
+
total: G.length
|
|
457
|
+
}), H && /* @__PURE__ */ f("span", {
|
|
444
458
|
className: "ml-2 text-text-muted",
|
|
445
|
-
children:
|
|
459
|
+
children: y("vibesPage.refreshing", "(refreshing...)")
|
|
446
460
|
})]
|
|
447
461
|
}) : null,
|
|
448
|
-
|
|
462
|
+
K.length > 0 && /* @__PURE__ */ f("div", {
|
|
449
463
|
"data-tour": "vibecontrols-vibes-bulk-actions-toolbar",
|
|
450
464
|
className: "rounded-card border border-border-subtle bg-bg-surface shadow-elevation-1 p-5",
|
|
451
|
-
children: /* @__PURE__ */
|
|
465
|
+
children: /* @__PURE__ */ p("div", {
|
|
452
466
|
className: "flex flex-col gap-3 lg:flex-row lg:items-center lg:justify-between",
|
|
453
|
-
children: [/* @__PURE__ */
|
|
467
|
+
children: [/* @__PURE__ */ p("div", {
|
|
454
468
|
className: "flex flex-wrap items-center gap-3",
|
|
455
|
-
children: [/* @__PURE__ */
|
|
469
|
+
children: [/* @__PURE__ */ p("div", {
|
|
456
470
|
className: "flex items-center gap-2",
|
|
457
|
-
children: [/* @__PURE__ */
|
|
458
|
-
checked:
|
|
459
|
-
indeterminate:
|
|
471
|
+
children: [/* @__PURE__ */ f(ye, {
|
|
472
|
+
checked: Y,
|
|
473
|
+
indeterminate: Ht,
|
|
460
474
|
onChange: $t,
|
|
461
475
|
ariaLabel: "Select all visible vibes"
|
|
462
|
-
}), /* @__PURE__ */
|
|
476
|
+
}), /* @__PURE__ */ f("span", {
|
|
463
477
|
className: "text-sm font-medium text-text-primary",
|
|
464
478
|
children: "Select all visible"
|
|
465
479
|
})]
|
|
466
|
-
}),
|
|
480
|
+
}), I.size > 0 && /* @__PURE__ */ f("button", {
|
|
467
481
|
type: "button",
|
|
468
|
-
onClick:
|
|
482
|
+
onClick: en,
|
|
469
483
|
className: "text-sm text-text-secondary hover:text-text-primary",
|
|
470
484
|
children: "Clear selection"
|
|
471
485
|
})]
|
|
472
|
-
}), /* @__PURE__ */
|
|
486
|
+
}), /* @__PURE__ */ p("div", {
|
|
473
487
|
className: "flex flex-wrap items-center gap-2",
|
|
474
488
|
children: [
|
|
475
|
-
/* @__PURE__ */
|
|
489
|
+
/* @__PURE__ */ p("span", {
|
|
476
490
|
className: "rounded-full bg-bg-sunken px-3 py-1 text-sm font-medium text-text-secondary",
|
|
477
|
-
children: [
|
|
491
|
+
children: [I.size, " selected"]
|
|
478
492
|
}),
|
|
479
|
-
/* @__PURE__ */
|
|
480
|
-
permission:
|
|
493
|
+
/* @__PURE__ */ f(m, {
|
|
494
|
+
permission: s.VIBE_UPDATE,
|
|
481
495
|
deniedBehavior: "hide",
|
|
482
|
-
children: /* @__PURE__ */
|
|
496
|
+
children: /* @__PURE__ */ f("button", {
|
|
483
497
|
type: "button",
|
|
484
|
-
onClick: () =>
|
|
485
|
-
disabled:
|
|
498
|
+
onClick: () => R("activate"),
|
|
499
|
+
disabled: q.length === 0,
|
|
486
500
|
title: "Mark selected vibes as ACTIVE so they appear in the default vibe list and can run sessions/tunnels via their attached agent(s).",
|
|
487
501
|
className: "rounded-button border border-status-success-border px-3 py-2 text-sm font-medium text-status-success-text hover:bg-status-success-bg-subtle transition-colors disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
488
|
-
children: /* @__PURE__ */
|
|
502
|
+
children: /* @__PURE__ */ p("span", {
|
|
489
503
|
className: "inline-flex items-center gap-2",
|
|
490
504
|
children: [
|
|
491
|
-
/* @__PURE__ */
|
|
505
|
+
/* @__PURE__ */ f(Ne, { className: "size-4" }),
|
|
492
506
|
"Activate Selected",
|
|
493
|
-
|
|
507
|
+
q.length > 0 ? ` (${q.length})` : ""
|
|
494
508
|
]
|
|
495
509
|
})
|
|
496
510
|
})
|
|
497
511
|
}),
|
|
498
|
-
/* @__PURE__ */
|
|
499
|
-
permission:
|
|
512
|
+
/* @__PURE__ */ f(m, {
|
|
513
|
+
permission: s.VIBE_UPDATE,
|
|
500
514
|
deniedBehavior: "hide",
|
|
501
|
-
children: /* @__PURE__ */
|
|
515
|
+
children: /* @__PURE__ */ f("button", {
|
|
502
516
|
type: "button",
|
|
503
|
-
onClick: () =>
|
|
504
|
-
disabled:
|
|
517
|
+
onClick: () => R("archive"),
|
|
518
|
+
disabled: J.length === 0,
|
|
505
519
|
className: "rounded-button border border-status-warning-border px-3 py-2 text-sm font-medium text-status-warning-text hover:bg-status-warning-bg-subtle transition-colors disabled:cursor-not-allowed disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
506
|
-
children: /* @__PURE__ */
|
|
520
|
+
children: /* @__PURE__ */ p("span", {
|
|
507
521
|
className: "inline-flex items-center gap-2",
|
|
508
522
|
children: [
|
|
509
|
-
/* @__PURE__ */
|
|
523
|
+
/* @__PURE__ */ f(Ae, { className: "size-4" }),
|
|
510
524
|
"Archive Selected",
|
|
511
|
-
|
|
525
|
+
J.length > 0 ? ` (${J.length})` : ""
|
|
512
526
|
]
|
|
513
527
|
})
|
|
514
528
|
})
|
|
@@ -517,217 +531,217 @@ function et() {
|
|
|
517
531
|
})]
|
|
518
532
|
})
|
|
519
533
|
}),
|
|
520
|
-
|
|
534
|
+
on ? /* @__PURE__ */ f(be, {
|
|
521
535
|
variant: "cards",
|
|
522
536
|
count: 6
|
|
523
|
-
}) :
|
|
537
|
+
}) : K.length > 0 ? /* @__PURE__ */ f(ze, {
|
|
524
538
|
mode: "wait",
|
|
525
|
-
children:
|
|
539
|
+
children: D === "grid" ? /* @__PURE__ */ f(qe, {
|
|
526
540
|
"data-tour": "vibes-page-grid-view",
|
|
527
541
|
stagger: .04,
|
|
528
542
|
className: "grid grid-cols-1 sm:grid-cols-2 lg:grid-cols-3 xl:grid-cols-4 2xl:grid-cols-5 gap-4 xl:gap-3",
|
|
529
|
-
children:
|
|
543
|
+
children: K.map((e) => /* @__PURE__ */ f(Ke, { children: /* @__PURE__ */ f(we, {
|
|
530
544
|
vibe: e,
|
|
531
|
-
onOpen:
|
|
532
|
-
onActivate:
|
|
533
|
-
onArchive:
|
|
534
|
-
onDelete:
|
|
545
|
+
onOpen: Ut,
|
|
546
|
+
onActivate: st ? Wt : void 0,
|
|
547
|
+
onArchive: st ? Gt : void 0,
|
|
548
|
+
onDelete: ct ? V : void 0,
|
|
535
549
|
onOpenInEditor: Yt,
|
|
536
|
-
selected:
|
|
550
|
+
selected: I.has(e.id),
|
|
537
551
|
onToggleSelect: (t) => Qt(e, t)
|
|
538
552
|
}) }, e.id))
|
|
539
|
-
}, "grid") : /* @__PURE__ */
|
|
540
|
-
vibes:
|
|
541
|
-
onOpen:
|
|
542
|
-
onActivate:
|
|
553
|
+
}, "grid") : /* @__PURE__ */ f(qe, { children: /* @__PURE__ */ f(Ee, {
|
|
554
|
+
vibes: K,
|
|
555
|
+
onOpen: Ut,
|
|
556
|
+
onActivate: Wt,
|
|
543
557
|
onArchive: Gt,
|
|
544
|
-
onDelete:
|
|
558
|
+
onDelete: ct ? V : void 0,
|
|
545
559
|
onOpenInEditor: Yt,
|
|
546
|
-
selectedVibeIds:
|
|
560
|
+
selectedVibeIds: I,
|
|
547
561
|
onToggleSelect: Qt,
|
|
548
562
|
onToggleAllVisible: $t,
|
|
549
|
-
allVisibleSelected:
|
|
550
|
-
partiallySelected:
|
|
563
|
+
allVisibleSelected: Y,
|
|
564
|
+
partiallySelected: Ht
|
|
551
565
|
}) }, "list")
|
|
552
|
-
}) : /* @__PURE__ */
|
|
553
|
-
icon: /* @__PURE__ */
|
|
554
|
-
illustration:
|
|
555
|
-
title:
|
|
556
|
-
description:
|
|
557
|
-
action: !
|
|
566
|
+
}) : /* @__PURE__ */ f(ge, {
|
|
567
|
+
icon: /* @__PURE__ */ f(Ie, { className: "size-8 text-text-secondary" }),
|
|
568
|
+
illustration: C || w !== "all" || T !== "all" || E !== "all" ? "empty-search" : "empty-vibes",
|
|
569
|
+
title: C || w !== "all" || T !== "all" || E !== "all" ? y("vibesPage.emptyNoVibesFound", "No vibes found") : y("vibesPage.emptyNoVibesConfigured", "No vibes configured"),
|
|
570
|
+
description: C || w !== "all" || T !== "all" || E !== "all" ? y("vibesPage.emptyAdjustSearch", "Try adjusting your search or filters") : y("vibesPage.emptyNoVibesDescription", "Add your first vibe to start managing your development projects"),
|
|
571
|
+
action: !C && w === "all" && T === "all" && E === "all" ? /* @__PURE__ */ p("div", {
|
|
558
572
|
className: "flex items-center gap-2",
|
|
559
|
-
children: [/* @__PURE__ */
|
|
560
|
-
permission:
|
|
561
|
-
children: /* @__PURE__ */
|
|
573
|
+
children: [/* @__PURE__ */ f(Ge, {
|
|
574
|
+
permission: s.VIBE_CREATE,
|
|
575
|
+
children: /* @__PURE__ */ p("button", {
|
|
562
576
|
type: "button",
|
|
563
|
-
onClick:
|
|
577
|
+
onClick: X,
|
|
564
578
|
className: "flex items-center gap-2 px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-button hover:bg-action-primary-bgHover transition-all duration-200 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
565
|
-
children: [/* @__PURE__ */
|
|
579
|
+
children: [/* @__PURE__ */ f(Pe, { className: "size-4" }), y("vibesPage.addVibe", "Add Vibe")]
|
|
566
580
|
})
|
|
567
|
-
}), /* @__PURE__ */
|
|
581
|
+
}), /* @__PURE__ */ f(ve, { prompt: "What is a Vibe in VibeControls and how do I create one?" })]
|
|
568
582
|
}) : void 0
|
|
569
583
|
}),
|
|
570
|
-
|
|
584
|
+
_t && /* @__PURE__ */ f("div", {
|
|
571
585
|
className: "fixed bottom-4 right-4 z-50 px-4 py-3 bg-status-success-bg-subtle text-status-success-text border border-status-success-border rounded-card shadow-elevation-3 text-sm",
|
|
572
|
-
children:
|
|
586
|
+
children: _t
|
|
573
587
|
}),
|
|
574
|
-
/* @__PURE__ */
|
|
575
|
-
isOpen:
|
|
576
|
-
onClose: () =>
|
|
577
|
-
onConfirm:
|
|
588
|
+
/* @__PURE__ */ f(ne, {
|
|
589
|
+
isOpen: bt === "activate",
|
|
590
|
+
onClose: () => R(null),
|
|
591
|
+
onConfirm: tn,
|
|
578
592
|
title: "Activate selected vibes",
|
|
579
|
-
message: `Activate ${
|
|
593
|
+
message: `Activate ${q.length} selected vibe${q.length === 1 ? "" : "s"}?`,
|
|
580
594
|
confirmLabel: "Activate",
|
|
581
595
|
variant: "default"
|
|
582
596
|
}),
|
|
583
|
-
/* @__PURE__ */
|
|
584
|
-
isOpen:
|
|
585
|
-
onClose: () =>
|
|
586
|
-
onConfirm:
|
|
597
|
+
/* @__PURE__ */ f(ne, {
|
|
598
|
+
isOpen: bt === "archive",
|
|
599
|
+
onClose: () => R(null),
|
|
600
|
+
onConfirm: nn,
|
|
587
601
|
title: "Archive selected vibes",
|
|
588
|
-
message: `Archive ${
|
|
602
|
+
message: `Archive ${J.length} selected vibe${J.length === 1 ? "" : "s"}? Archived vibes will be hidden from active workflows.`,
|
|
589
603
|
confirmLabel: "Archive",
|
|
590
604
|
variant: "warning"
|
|
591
605
|
}),
|
|
592
|
-
|
|
606
|
+
yt && /* @__PURE__ */ p("div", {
|
|
593
607
|
role: "alert",
|
|
594
608
|
className: "fixed bottom-4 right-4 z-50 px-4 py-3 bg-status-error-bg-subtle text-status-error-text border border-status-error-border rounded-card shadow-elevation-3 text-sm",
|
|
595
|
-
children: [
|
|
609
|
+
children: [yt, /* @__PURE__ */ f("button", {
|
|
596
610
|
type: "button",
|
|
597
|
-
onClick:
|
|
611
|
+
onClick: xt,
|
|
598
612
|
className: "ml-3 text-xs underline opacity-80 hover:opacity-100",
|
|
599
|
-
children:
|
|
613
|
+
children: y("vibesPage.dismiss", "Dismiss")
|
|
600
614
|
})]
|
|
601
615
|
}),
|
|
602
|
-
|
|
616
|
+
mt && /* @__PURE__ */ f("div", {
|
|
603
617
|
className: "fixed inset-0 bg-bg-overlay flex items-center justify-center z-50 p-4",
|
|
604
|
-
children: /* @__PURE__ */
|
|
618
|
+
children: /* @__PURE__ */ p("div", {
|
|
605
619
|
className: "bg-bg-surface rounded-card border border-border-subtle shadow-[var(--shadow-elevation-4)] p-6 w-full max-w-lg",
|
|
606
620
|
children: [
|
|
607
|
-
/* @__PURE__ */
|
|
621
|
+
/* @__PURE__ */ f("h2", {
|
|
608
622
|
className: "text-lg font-semibold text-text-primary mb-4",
|
|
609
|
-
children:
|
|
623
|
+
children: y("vibesPage.addNewVibe", "Add New Vibe")
|
|
610
624
|
}),
|
|
611
|
-
/* @__PURE__ */
|
|
625
|
+
/* @__PURE__ */ p("div", {
|
|
612
626
|
className: "space-y-4",
|
|
613
627
|
children: [
|
|
614
|
-
|
|
628
|
+
ht && /* @__PURE__ */ f("div", {
|
|
615
629
|
className: "p-3 bg-status-error-bg-subtle text-status-error-text border border-status-error-border text-sm rounded-card",
|
|
616
|
-
children:
|
|
630
|
+
children: ht
|
|
617
631
|
}),
|
|
618
|
-
/* @__PURE__ */
|
|
619
|
-
/* @__PURE__ */
|
|
632
|
+
/* @__PURE__ */ p("div", { children: [
|
|
633
|
+
/* @__PURE__ */ f("label", {
|
|
620
634
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
621
|
-
children:
|
|
635
|
+
children: y("vibesPage.nameLabel", "Name *")
|
|
622
636
|
}),
|
|
623
|
-
/* @__PURE__ */
|
|
637
|
+
/* @__PURE__ */ f("input", {
|
|
624
638
|
"aria-label": "control",
|
|
625
|
-
ref:
|
|
639
|
+
ref: St,
|
|
626
640
|
type: "text",
|
|
627
|
-
placeholder:
|
|
628
|
-
onChange: () =>
|
|
641
|
+
placeholder: y("vibesPage.namePlaceholder", "My Project"),
|
|
642
|
+
onChange: () => N.name && P((e) => ({
|
|
629
643
|
...e,
|
|
630
644
|
name: void 0
|
|
631
645
|
})),
|
|
632
|
-
className: `w-full px-3 py-2 bg-bg-sunken border rounded-input text-text-primary placeholder:text-text-placeholder transition-colors focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)] focus:border-border-strong ${
|
|
646
|
+
className: `w-full px-3 py-2 bg-bg-sunken border rounded-input text-text-primary placeholder:text-text-placeholder transition-colors focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)] focus:border-border-strong ${N.name ? "border-status-error-border" : "border-border-subtle"}`
|
|
633
647
|
}),
|
|
634
|
-
|
|
648
|
+
N.name && /* @__PURE__ */ f("p", {
|
|
635
649
|
className: "mt-1 text-xs text-status-error-text",
|
|
636
|
-
children:
|
|
650
|
+
children: N.name
|
|
637
651
|
})
|
|
638
652
|
] }),
|
|
639
|
-
/* @__PURE__ */
|
|
640
|
-
/* @__PURE__ */
|
|
653
|
+
/* @__PURE__ */ p("div", { children: [
|
|
654
|
+
/* @__PURE__ */ p("label", {
|
|
641
655
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
642
|
-
children: [
|
|
656
|
+
children: [y("vibesPage.pathLabel", "Path"), /* @__PURE__ */ f("span", {
|
|
643
657
|
className: "ml-1 text-xs text-text-tertiary font-normal",
|
|
644
|
-
children:
|
|
658
|
+
children: y("vibesPage.pathOptional", "(optional)")
|
|
645
659
|
})]
|
|
646
660
|
}),
|
|
647
|
-
/* @__PURE__ */
|
|
661
|
+
/* @__PURE__ */ f("input", {
|
|
648
662
|
"aria-label": "control",
|
|
649
|
-
ref:
|
|
663
|
+
ref: Ct,
|
|
650
664
|
type: "text",
|
|
651
|
-
placeholder:
|
|
652
|
-
onChange: () =>
|
|
665
|
+
placeholder: y("vibesPage.pathPlaceholder", "/path/to/project"),
|
|
666
|
+
onChange: () => N.path && P((e) => ({
|
|
653
667
|
...e,
|
|
654
668
|
path: void 0
|
|
655
669
|
})),
|
|
656
|
-
className: `w-full px-3 py-2 bg-bg-sunken border rounded-input text-text-primary placeholder:text-text-placeholder transition-colors focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)] focus:border-border-strong ${
|
|
670
|
+
className: `w-full px-3 py-2 bg-bg-sunken border rounded-input text-text-primary placeholder:text-text-placeholder transition-colors focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)] focus:border-border-strong ${N.path ? "border-status-error-border" : "border-border-subtle"}`
|
|
657
671
|
}),
|
|
658
|
-
|
|
672
|
+
N.path && /* @__PURE__ */ f("p", {
|
|
659
673
|
className: "mt-1 text-xs text-status-error-text",
|
|
660
|
-
children:
|
|
674
|
+
children: N.path
|
|
661
675
|
})
|
|
662
676
|
] }),
|
|
663
|
-
/* @__PURE__ */
|
|
677
|
+
/* @__PURE__ */ p("div", { children: [/* @__PURE__ */ f("label", {
|
|
664
678
|
className: "block text-sm font-medium text-text-primary mb-1",
|
|
665
|
-
children:
|
|
666
|
-
}), /* @__PURE__ */
|
|
667
|
-
ref:
|
|
679
|
+
children: y("vibesPage.agentLabel", "Agent")
|
|
680
|
+
}), /* @__PURE__ */ p("select", {
|
|
681
|
+
ref: wt,
|
|
668
682
|
className: "w-full px-3 py-2 bg-bg-sunken border border-border-subtle rounded-input text-text-primary transition-colors focus:outline-none focus:ring-1 focus:ring-[var(--color-focus-ring)] focus:border-border-strong",
|
|
669
|
-
children: [/* @__PURE__ */
|
|
683
|
+
children: [/* @__PURE__ */ f("option", {
|
|
670
684
|
value: "",
|
|
671
|
-
children:
|
|
672
|
-
}),
|
|
685
|
+
children: y("vibesPage.selectAgent", "Select an agent")
|
|
686
|
+
}), Bt.filter((e) => e.value !== "all").map((e) => /* @__PURE__ */ f("option", {
|
|
673
687
|
value: e.value,
|
|
674
688
|
children: e.label
|
|
675
689
|
}, e.value))]
|
|
676
690
|
})] }),
|
|
677
|
-
/* @__PURE__ */
|
|
678
|
-
ref:
|
|
691
|
+
/* @__PURE__ */ f("input", {
|
|
692
|
+
ref: Tt,
|
|
679
693
|
type: "hidden",
|
|
680
694
|
value: "PROJECT"
|
|
681
695
|
})
|
|
682
696
|
]
|
|
683
697
|
}),
|
|
684
|
-
/* @__PURE__ */
|
|
698
|
+
/* @__PURE__ */ p("div", {
|
|
685
699
|
className: "mt-4 border-t border-border-subtle pt-4",
|
|
686
|
-
children: [/* @__PURE__ */
|
|
700
|
+
children: [/* @__PURE__ */ f("h3", {
|
|
687
701
|
className: "text-sm font-medium text-text-secondary mb-2",
|
|
688
|
-
children:
|
|
689
|
-
}), /* @__PURE__ */
|
|
702
|
+
children: y("vibesPage.tags", "Tags")
|
|
703
|
+
}), /* @__PURE__ */ f(me, {
|
|
690
704
|
entityType: "VIBECONTROLS_VIBE",
|
|
691
|
-
onDraftChange:
|
|
705
|
+
onDraftChange: Ot
|
|
692
706
|
})]
|
|
693
707
|
}),
|
|
694
|
-
/* @__PURE__ */
|
|
708
|
+
/* @__PURE__ */ p("div", {
|
|
695
709
|
className: "flex flex-col sm:flex-row justify-end gap-3 mt-6",
|
|
696
|
-
children: [/* @__PURE__ */
|
|
710
|
+
children: [/* @__PURE__ */ f("button", {
|
|
697
711
|
type: "button",
|
|
698
|
-
onClick: () =>
|
|
699
|
-
disabled:
|
|
712
|
+
onClick: () => O(!1),
|
|
713
|
+
disabled: A,
|
|
700
714
|
className: "px-4 py-2 text-text-primary hover:bg-bg-sunken rounded-md transition-colors disabled:opacity-50",
|
|
701
|
-
children:
|
|
702
|
-
}), /* @__PURE__ */
|
|
715
|
+
children: y("vibesPage.cancel", "Cancel")
|
|
716
|
+
}), /* @__PURE__ */ f("button", {
|
|
703
717
|
type: "button",
|
|
704
|
-
onClick:
|
|
705
|
-
disabled:
|
|
718
|
+
onClick: rn,
|
|
719
|
+
disabled: A,
|
|
706
720
|
className: "px-4 py-2 bg-action-primary-bg text-action-primary-text rounded-button hover:bg-action-primary-bgHover transition-all duration-200 disabled:opacity-50 focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-border-focus",
|
|
707
|
-
children:
|
|
721
|
+
children: A ? y("vibesPage.creating", "Creating...") : y("vibesPage.createVibe", "Create Vibe")
|
|
708
722
|
})]
|
|
709
723
|
})
|
|
710
724
|
]
|
|
711
725
|
})
|
|
712
726
|
}),
|
|
713
|
-
/* @__PURE__ */
|
|
714
|
-
isOpen:
|
|
715
|
-
onClose: () =>
|
|
727
|
+
/* @__PURE__ */ f(re, {
|
|
728
|
+
isOpen: vt,
|
|
729
|
+
onClose: () => M(!1),
|
|
716
730
|
onConfirm: () => {
|
|
717
|
-
|
|
731
|
+
M(!1), tt(oe);
|
|
718
732
|
},
|
|
719
733
|
title: "Vibe Quota Reached",
|
|
720
734
|
message: "You've used all available vibe creation quota on your current plan. Upgrade your plan to create more vibes."
|
|
721
735
|
})
|
|
722
736
|
] }),
|
|
723
|
-
|
|
737
|
+
B && /* @__PURE__ */ f(Te, {
|
|
724
738
|
vibe: {
|
|
725
|
-
id:
|
|
726
|
-
name:
|
|
739
|
+
id: B.id,
|
|
740
|
+
name: B.name
|
|
727
741
|
},
|
|
728
|
-
deleting:
|
|
742
|
+
deleting: Nt,
|
|
729
743
|
onConfirm: Kt,
|
|
730
|
-
onCancel: () =>
|
|
744
|
+
onCancel: () => V(null)
|
|
731
745
|
})
|
|
732
746
|
]
|
|
733
747
|
});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burdenoff/microfe-vibecontrols",
|
|
3
|
-
"version": "2026.
|
|
3
|
+
"version": "2026.1031.1",
|
|
4
4
|
"description": "VibeControls microfrontend for Burdenoff products",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"files": [
|
|
@@ -63,7 +63,7 @@
|
|
|
63
63
|
"license": "PROPRIETARY",
|
|
64
64
|
"dependencies": {
|
|
65
65
|
"@apollo/client": "4.1.9",
|
|
66
|
-
"@burdenoff/fe-libs": "2026.
|
|
66
|
+
"@burdenoff/fe-libs": "2026.1030.14",
|
|
67
67
|
"@tanstack/react-query": "^5.90.16",
|
|
68
68
|
"@xyflow/react": "^12.10.2",
|
|
69
69
|
"clsx": "^2.1.1",
|