@burdenoff/microfe-vibecontrols 2026.602.2 → 2026.602.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/sessions/SessionShareDialog.js +24 -462
- package/dist/components/sessions/SessionShareDialog.js.map +1 -1
- package/dist/components/sharing/entityShareOps.js +106 -0
- package/dist/components/sharing/entityShareOps.js.map +1 -1
- package/dist/components/sharing/shareRegistry.js +3 -3
- package/dist/components/sharing/shareRegistry.js.map +1 -1
- package/dist/components/vibedeck/VibeDeckShareDialog.js +19 -335
- package/dist/components/vibedeck/VibeDeckShareDialog.js.map +1 -1
- package/dist/constants/permissions.js +1 -0
- package/dist/constants/permissions.js.map +1 -1
- package/dist/generated/wspace-types.js +9 -11
- package/dist/generated/wspace-types.js.map +1 -1
- package/dist/pages/SessionsPage.js +1011 -1007
- package/dist/pages/SessionsPage.js.map +1 -1
- package/dist/pages/VibeDeckPage.js +40 -41
- package/dist/pages/VibeDeckPage.js.map +1 -1
- package/package.json +1 -1
- package/dist/utils/shareUrl.js +0 -41
- package/dist/utils/shareUrl.js.map +0 -1
|
@@ -1,341 +1,25 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { Check as l, Code as u, Copy as d, Eye as f, Globe as p, Link2 as m, Loader2 as h, Lock as g, Play as _, Shield as v, Trash2 as te, Users as ne, X as y } from "lucide-react";
|
|
6
|
-
import { Fragment as b, jsx as x, jsxs as S } from "react/jsx-runtime";
|
|
1
|
+
import { useEntityShareController as e } from "../sharing/useEntityShareController.js";
|
|
2
|
+
import { getStoredWorkspaceId as t } from "@burdenoff/fe-libs/shared/graphql";
|
|
3
|
+
import { jsx as n } from "react/jsx-runtime";
|
|
4
|
+
import { ShareDialog as r } from "@burdenoff/fe-libs/sharing";
|
|
7
5
|
//#region src/components/vibedeck/VibeDeckShareDialog.tsx
|
|
8
|
-
var
|
|
9
|
-
{
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
value: "RESTRICTED",
|
|
23
|
-
label: "Restricted",
|
|
24
|
-
description: "Only people with permission can access (requires login)",
|
|
25
|
-
icon: g
|
|
26
|
-
}
|
|
27
|
-
], w = [{
|
|
28
|
-
value: "VIEW",
|
|
29
|
-
label: "Viewer",
|
|
30
|
-
description: "Can view the deck",
|
|
31
|
-
icon: f
|
|
32
|
-
}, {
|
|
33
|
-
value: "EXECUTE",
|
|
34
|
-
label: "Can execute",
|
|
35
|
-
description: "Can view and execute buttons",
|
|
36
|
-
icon: _
|
|
37
|
-
}], T = ({ vibeDeckId: T, vibeDeckName: E, onClose: D }) => {
|
|
38
|
-
let O = ee(), [k, A] = c(null), [re, j] = c(null), [M, N] = c(null), [P, F] = c(null), [I, L] = c("SIGNED_LINK"), [R, z] = c("EXECUTE"), [B, V] = c(""), [H, U] = c(""), [W, G] = c(!1), [K, q] = c(""), { data: J, loading: Y, refetch: ie } = t({ variables: { vibeDeckId: T } }), [X, { loading: Z }] = e({ refetchQueries: ["ListVibeDeckShareLinks"] }), [Q] = n({ refetchQueries: ["ListVibeDeckShareLinks"] }), $ = J?.vibeDeckShareLinks || [], ae = s(async () => {
|
|
39
|
-
try {
|
|
40
|
-
await X({ variables: { input: {
|
|
41
|
-
vibeDeckId: T,
|
|
42
|
-
name: K || null,
|
|
43
|
-
visibility: I,
|
|
44
|
-
permission: R,
|
|
45
|
-
expiresInHours: B ? parseInt(B, 10) : null,
|
|
46
|
-
password: H || null,
|
|
47
|
-
allowIframe: W
|
|
48
|
-
} } }), q(""), U(""), V(""), G(!1);
|
|
49
|
-
} catch {}
|
|
50
|
-
}, [
|
|
51
|
-
X,
|
|
52
|
-
T,
|
|
53
|
-
K,
|
|
54
|
-
I,
|
|
55
|
-
R,
|
|
56
|
-
B,
|
|
57
|
-
H,
|
|
58
|
-
W
|
|
59
|
-
]), oe = s(async (e) => {
|
|
60
|
-
try {
|
|
61
|
-
await Q({ variables: { id: e } });
|
|
62
|
-
} catch {}
|
|
63
|
-
}, [Q]), se = s(async (e, t) => {
|
|
64
|
-
let n = await i(o(t)).then(() => !0, (e) => (console.warn("Failed to copy VibeDeck share link:", e), !1));
|
|
65
|
-
A(n ? e : null), N(n ? null : e), setTimeout(() => {
|
|
66
|
-
A(null), N(null);
|
|
67
|
-
}, 2e3);
|
|
68
|
-
}, []), ce = s(async (e, t) => {
|
|
69
|
-
let n = await i(`<iframe src="${a(r(t))}" width="100%" height="600" frameborder="0" allow="clipboard-write" style="border-radius: 8px; border: 1px solid var(--color-border-subtle);"></iframe>`).then(() => !0, (e) => (console.warn("Failed to copy VibeDeck embed code:", e), !1));
|
|
70
|
-
j(n ? e : null), F(n ? null : e), setTimeout(() => {
|
|
71
|
-
j(null), F(null);
|
|
72
|
-
}, 2e3);
|
|
73
|
-
}, []), le = (e) => {
|
|
74
|
-
switch (e) {
|
|
75
|
-
case "PUBLIC": return /* @__PURE__ */ x(p, {
|
|
76
|
-
size: 14,
|
|
77
|
-
className: "text-status-success-text"
|
|
78
|
-
});
|
|
79
|
-
case "RESTRICTED": return /* @__PURE__ */ x(g, {
|
|
80
|
-
size: 14,
|
|
81
|
-
className: "text-status-warning-text"
|
|
82
|
-
});
|
|
83
|
-
default: return /* @__PURE__ */ x(m, {
|
|
84
|
-
size: 14,
|
|
85
|
-
className: "text-status-info-text"
|
|
86
|
-
});
|
|
87
|
-
}
|
|
88
|
-
};
|
|
89
|
-
return /* @__PURE__ */ x("div", {
|
|
90
|
-
className: "fixed inset-0 z-50 flex items-center justify-center bg-bg-elevated/60 backdrop-blur-sm",
|
|
91
|
-
children: /* @__PURE__ */ S("div", {
|
|
92
|
-
className: "bg-bg-surface border border-border-default rounded-xl shadow-2xl w-full max-w-lg mx-4 max-h-[85vh] flex flex-col",
|
|
93
|
-
children: [/* @__PURE__ */ S("div", {
|
|
94
|
-
className: "flex items-center justify-between px-6 py-4 border-b border-border-default",
|
|
95
|
-
children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ S("h2", {
|
|
96
|
-
className: "text-lg font-semibold text-text-primary",
|
|
97
|
-
children: [
|
|
98
|
-
"Share \"",
|
|
99
|
-
E,
|
|
100
|
-
"\""
|
|
101
|
-
]
|
|
102
|
-
}), /* @__PURE__ */ x("p", {
|
|
103
|
-
className: "text-sm text-text-secondary mt-0.5",
|
|
104
|
-
children: O("vibecontrols.vibedeck.share.manageAccess", "Manage access to this VibeDeck")
|
|
105
|
-
})] }), /* @__PURE__ */ x("button", {
|
|
106
|
-
type: "button",
|
|
107
|
-
onClick: D,
|
|
108
|
-
className: "p-1.5 rounded-lg hover:bg-bg-tertiary text-text-tertiary hover:text-text-primary transition-colors",
|
|
109
|
-
children: /* @__PURE__ */ x(y, { size: 18 })
|
|
110
|
-
})]
|
|
111
|
-
}), /* @__PURE__ */ S("div", {
|
|
112
|
-
className: "overflow-y-auto flex-1 px-6 py-4 space-y-6",
|
|
113
|
-
children: [/* @__PURE__ */ S("div", {
|
|
114
|
-
className: "space-y-4",
|
|
115
|
-
children: [
|
|
116
|
-
/* @__PURE__ */ S("h3", {
|
|
117
|
-
className: "text-sm font-medium text-text-primary flex items-center gap-2",
|
|
118
|
-
children: [/* @__PURE__ */ x(m, { size: 14 }), O("vibecontrols.vibedeck.share.createShareLink", "Create share link")]
|
|
119
|
-
}),
|
|
120
|
-
/* @__PURE__ */ x("input", {
|
|
121
|
-
"aria-label": "Link name (optional)",
|
|
122
|
-
type: "text",
|
|
123
|
-
value: K,
|
|
124
|
-
onChange: (e) => q(e.target.value),
|
|
125
|
-
placeholder: "Link name (optional)",
|
|
126
|
-
className: "w-full px-3 py-2 text-sm bg-bg-sunken border border-border-default rounded-lg text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-action-primary-bg"
|
|
127
|
-
}),
|
|
128
|
-
/* @__PURE__ */ S("div", {
|
|
129
|
-
className: "space-y-2",
|
|
130
|
-
children: [/* @__PURE__ */ x("label", {
|
|
131
|
-
htmlFor: "vibedecksharedialog-37",
|
|
132
|
-
className: "text-xs font-medium text-text-secondary uppercase tracking-wider",
|
|
133
|
-
children: "Access"
|
|
134
|
-
}), /* @__PURE__ */ x("div", {
|
|
135
|
-
className: "grid grid-cols-3 gap-2",
|
|
136
|
-
children: C.map((e) => {
|
|
137
|
-
let t = e.icon;
|
|
138
|
-
return /* @__PURE__ */ S("button", {
|
|
139
|
-
type: "button",
|
|
140
|
-
onClick: () => L(e.value),
|
|
141
|
-
className: `flex flex-col items-center gap-1.5 p-3 rounded-lg border-2 text-xs font-medium transition-all ${I === e.value ? "border-action-primary-bg bg-action-primary-bg/10 text-action-primary-bg" : "border-border-default text-text-secondary hover:border-border-default hover:bg-bg-secondary"}`,
|
|
142
|
-
title: e.description,
|
|
143
|
-
children: [/* @__PURE__ */ x(t, { size: 16 }), /* @__PURE__ */ x("span", {
|
|
144
|
-
className: "text-center leading-tight",
|
|
145
|
-
children: e.label
|
|
146
|
-
})]
|
|
147
|
-
}, e.value);
|
|
148
|
-
})
|
|
149
|
-
})]
|
|
150
|
-
}),
|
|
151
|
-
/* @__PURE__ */ S("div", {
|
|
152
|
-
className: "space-y-2",
|
|
153
|
-
children: [/* @__PURE__ */ x("label", {
|
|
154
|
-
htmlFor: "vibedecksharedialog-37",
|
|
155
|
-
className: "text-xs font-medium text-text-secondary uppercase tracking-wider",
|
|
156
|
-
children: "Permission"
|
|
157
|
-
}), /* @__PURE__ */ x("div", {
|
|
158
|
-
className: "grid grid-cols-2 gap-2",
|
|
159
|
-
children: w.map((e) => {
|
|
160
|
-
let t = e.icon;
|
|
161
|
-
return /* @__PURE__ */ S("button", {
|
|
162
|
-
type: "button",
|
|
163
|
-
onClick: () => z(e.value),
|
|
164
|
-
className: `flex items-center gap-2 p-3 rounded-lg border-2 text-sm font-medium transition-all ${R === e.value ? "border-action-primary-bg bg-action-primary-bg/10 text-action-primary-bg" : "border-border-default text-text-secondary hover:border-border-default hover:bg-bg-secondary"}`,
|
|
165
|
-
children: [/* @__PURE__ */ x(t, { size: 14 }), e.label]
|
|
166
|
-
}, e.value);
|
|
167
|
-
})
|
|
168
|
-
})]
|
|
169
|
-
}),
|
|
170
|
-
/* @__PURE__ */ S("div", {
|
|
171
|
-
className: "grid grid-cols-2 gap-3",
|
|
172
|
-
children: [/* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("label", {
|
|
173
|
-
htmlFor: "vibedecksharedialog-37",
|
|
174
|
-
className: "text-xs font-medium text-text-secondary",
|
|
175
|
-
children: "Expires in (hours)"
|
|
176
|
-
}), /* @__PURE__ */ x("input", {
|
|
177
|
-
id: "vibedecksharedialog-37",
|
|
178
|
-
"aria-label": "Never",
|
|
179
|
-
type: "number",
|
|
180
|
-
min: "1",
|
|
181
|
-
value: B,
|
|
182
|
-
onChange: (e) => V(e.target.value),
|
|
183
|
-
placeholder: "Never",
|
|
184
|
-
className: "w-full mt-1 px-3 py-2 text-sm bg-bg-sunken border border-border-default rounded-lg text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-action-primary-bg"
|
|
185
|
-
})] }), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("label", {
|
|
186
|
-
htmlFor: "vibedecksharedialog-36",
|
|
187
|
-
className: "text-xs font-medium text-text-secondary",
|
|
188
|
-
children: "Password (optional)"
|
|
189
|
-
}), /* @__PURE__ */ x("input", {
|
|
190
|
-
id: "vibedecksharedialog-36",
|
|
191
|
-
"aria-label": "No password",
|
|
192
|
-
type: "password",
|
|
193
|
-
value: H,
|
|
194
|
-
onChange: (e) => U(e.target.value),
|
|
195
|
-
placeholder: "No password",
|
|
196
|
-
className: "w-full mt-1 px-3 py-2 text-sm bg-bg-sunken border border-border-default rounded-lg text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-action-primary-bg"
|
|
197
|
-
})] })]
|
|
198
|
-
}),
|
|
199
|
-
/* @__PURE__ */ S("label", {
|
|
200
|
-
className: "flex items-center gap-3 cursor-pointer",
|
|
201
|
-
children: [/* @__PURE__ */ x("input", {
|
|
202
|
-
"aria-label": "control",
|
|
203
|
-
type: "checkbox",
|
|
204
|
-
checked: W,
|
|
205
|
-
onChange: (e) => G(e.target.checked),
|
|
206
|
-
className: "size-4 rounded border-border-default text-action-primary-bg focus:ring-action-primary-bg"
|
|
207
|
-
}), /* @__PURE__ */ S("div", { children: [/* @__PURE__ */ x("span", {
|
|
208
|
-
className: "text-sm text-text-primary",
|
|
209
|
-
children: "Allow iframe embedding"
|
|
210
|
-
}), /* @__PURE__ */ x("p", {
|
|
211
|
-
className: "text-xs text-text-tertiary",
|
|
212
|
-
children: "Enable embedding this deck in other websites"
|
|
213
|
-
})] })]
|
|
214
|
-
}),
|
|
215
|
-
/* @__PURE__ */ S("button", {
|
|
216
|
-
type: "button",
|
|
217
|
-
onClick: ae,
|
|
218
|
-
disabled: Z,
|
|
219
|
-
className: "w-full px-4 py-2.5 rounded-lg bg-action-primary-bg text-action-primary-text text-sm font-medium hover:bg-action-primary-bg-hover disabled:opacity-50 transition-colors flex items-center justify-center gap-2",
|
|
220
|
-
children: [Z ? /* @__PURE__ */ x(h, {
|
|
221
|
-
size: 14,
|
|
222
|
-
className: "animate-spin"
|
|
223
|
-
}) : /* @__PURE__ */ x(m, { size: 14 }), O("vibecontrols.vibedeck.share.createLink", "Create Link")]
|
|
224
|
-
})
|
|
225
|
-
]
|
|
226
|
-
}), Y ? /* @__PURE__ */ x("div", {
|
|
227
|
-
className: "flex items-center justify-center py-6",
|
|
228
|
-
children: /* @__PURE__ */ x(h, {
|
|
229
|
-
size: 20,
|
|
230
|
-
className: "animate-spin text-text-tertiary"
|
|
231
|
-
})
|
|
232
|
-
}) : $.length > 0 ? /* @__PURE__ */ S("div", {
|
|
233
|
-
className: "space-y-3",
|
|
234
|
-
children: [/* @__PURE__ */ S("h3", {
|
|
235
|
-
className: "text-sm font-medium text-text-primary flex items-center gap-2",
|
|
236
|
-
children: [
|
|
237
|
-
/* @__PURE__ */ x(v, { size: 14 }),
|
|
238
|
-
"Active links (",
|
|
239
|
-
$.length,
|
|
240
|
-
")"
|
|
241
|
-
]
|
|
242
|
-
}), $.map((e) => /* @__PURE__ */ S("div", {
|
|
243
|
-
className: `rounded-lg border p-3 space-y-2 ${e.status === "ACTIVE" ? "border-border-default bg-bg-secondary" : "border-border-default/50 bg-bg-secondary/50 opacity-60"}`,
|
|
244
|
-
children: [/* @__PURE__ */ S("div", {
|
|
245
|
-
className: "flex items-center justify-between",
|
|
246
|
-
children: [/* @__PURE__ */ S("div", {
|
|
247
|
-
className: "flex items-center gap-2",
|
|
248
|
-
children: [
|
|
249
|
-
le(e.visibility),
|
|
250
|
-
/* @__PURE__ */ x("span", {
|
|
251
|
-
className: "text-sm font-medium text-text-primary",
|
|
252
|
-
children: e.name || "Unnamed link"
|
|
253
|
-
}),
|
|
254
|
-
/* @__PURE__ */ x("span", {
|
|
255
|
-
className: `text-[10px] font-bold uppercase px-1.5 py-0.5 rounded ${e.status === "ACTIVE" ? "bg-status-success-bg/20 text-status-success-text" : e.status === "REVOKED" ? "bg-status-error-bg/20 text-status-error-text" : "bg-status-warning-bg/20 text-status-warning-text"}`,
|
|
256
|
-
children: e.status
|
|
257
|
-
})
|
|
258
|
-
]
|
|
259
|
-
}), /* @__PURE__ */ x("div", {
|
|
260
|
-
className: "flex items-center gap-1",
|
|
261
|
-
children: e.status === "ACTIVE" && /* @__PURE__ */ S(b, { children: [
|
|
262
|
-
/* @__PURE__ */ x("button", {
|
|
263
|
-
type: "button",
|
|
264
|
-
onClick: () => se(e.id, e.shareUrl),
|
|
265
|
-
className: "p-1.5 rounded hover:bg-bg-tertiary text-text-tertiary hover:text-text-primary transition-colors",
|
|
266
|
-
title: "Copy link",
|
|
267
|
-
children: k === e.id ? /* @__PURE__ */ x(l, {
|
|
268
|
-
size: 14,
|
|
269
|
-
className: "text-status-success-text"
|
|
270
|
-
}) : M === e.id ? /* @__PURE__ */ x(y, {
|
|
271
|
-
size: 14,
|
|
272
|
-
className: "text-status-error-text"
|
|
273
|
-
}) : /* @__PURE__ */ x(d, { size: 14 })
|
|
274
|
-
}),
|
|
275
|
-
e.allowIframe && /* @__PURE__ */ x("button", {
|
|
276
|
-
type: "button",
|
|
277
|
-
onClick: () => ce(e.id, e.shareUrl),
|
|
278
|
-
className: "p-1.5 rounded hover:bg-bg-tertiary text-text-tertiary hover:text-text-primary transition-colors",
|
|
279
|
-
title: "Copy embed code",
|
|
280
|
-
children: re === e.id ? /* @__PURE__ */ x(l, {
|
|
281
|
-
size: 14,
|
|
282
|
-
className: "text-status-success-text"
|
|
283
|
-
}) : P === e.id ? /* @__PURE__ */ x(y, {
|
|
284
|
-
size: 14,
|
|
285
|
-
className: "text-status-error-text"
|
|
286
|
-
}) : /* @__PURE__ */ x(u, { size: 14 })
|
|
287
|
-
}),
|
|
288
|
-
/* @__PURE__ */ x("button", {
|
|
289
|
-
type: "button",
|
|
290
|
-
onClick: () => oe(e.id),
|
|
291
|
-
className: "p-1.5 rounded hover:bg-bg-tertiary text-text-tertiary hover:text-status-error-text transition-colors",
|
|
292
|
-
title: "Revoke link",
|
|
293
|
-
children: /* @__PURE__ */ x(te, { size: 14 })
|
|
294
|
-
})
|
|
295
|
-
] })
|
|
296
|
-
})]
|
|
297
|
-
}), /* @__PURE__ */ S("div", {
|
|
298
|
-
className: "flex items-center gap-3 text-xs text-text-tertiary",
|
|
299
|
-
children: [
|
|
300
|
-
/* @__PURE__ */ S("span", {
|
|
301
|
-
className: "flex items-center gap-1",
|
|
302
|
-
children: [e.permission === "EXECUTE" ? /* @__PURE__ */ x(_, { size: 10 }) : /* @__PURE__ */ x(f, { size: 10 }), e.permission === "EXECUTE" ? "Can execute" : "View only"]
|
|
303
|
-
}),
|
|
304
|
-
e.hasPassword && /* @__PURE__ */ S("span", {
|
|
305
|
-
className: "flex items-center gap-1",
|
|
306
|
-
children: [/* @__PURE__ */ x(g, { size: 10 }), "Password"]
|
|
307
|
-
}),
|
|
308
|
-
e.allowIframe && /* @__PURE__ */ S("span", {
|
|
309
|
-
className: "flex items-center gap-1",
|
|
310
|
-
children: [/* @__PURE__ */ x(u, { size: 10 }), "Embeddable"]
|
|
311
|
-
}),
|
|
312
|
-
/* @__PURE__ */ S("span", { children: [e.useCount, " uses"] }),
|
|
313
|
-
e.expiresAt && /* @__PURE__ */ S("span", { children: ["Expires ", new Date(e.expiresAt).toLocaleDateString()] })
|
|
314
|
-
]
|
|
315
|
-
})]
|
|
316
|
-
}, e.id))]
|
|
317
|
-
}) : /* @__PURE__ */ S("div", {
|
|
318
|
-
className: "text-center py-6",
|
|
319
|
-
children: [
|
|
320
|
-
/* @__PURE__ */ x(ne, {
|
|
321
|
-
size: 24,
|
|
322
|
-
className: "mx-auto text-text-tertiary mb-2"
|
|
323
|
-
}),
|
|
324
|
-
/* @__PURE__ */ x("p", {
|
|
325
|
-
className: "text-sm text-text-secondary",
|
|
326
|
-
children: O("vibecontrols.vibedeck.share.noLinks", "No share links yet")
|
|
327
|
-
}),
|
|
328
|
-
/* @__PURE__ */ x("p", {
|
|
329
|
-
className: "text-xs text-text-tertiary mt-1",
|
|
330
|
-
children: O("vibecontrols.vibedeck.share.createLinkHint", "Create a link above to share this VibeDeck")
|
|
331
|
-
})
|
|
332
|
-
]
|
|
333
|
-
})]
|
|
334
|
-
})]
|
|
335
|
-
})
|
|
6
|
+
var i = ({ vibeDeckId: i, vibeDeckName: a, onClose: o }) => {
|
|
7
|
+
let s = e("vibedeck", { id: i });
|
|
8
|
+
return /* @__PURE__ */ n(r, {
|
|
9
|
+
resource: {
|
|
10
|
+
type: "vibedeck",
|
|
11
|
+
id: i,
|
|
12
|
+
name: a
|
|
13
|
+
},
|
|
14
|
+
controller: s,
|
|
15
|
+
open: !0,
|
|
16
|
+
onOpenChange: (e) => {
|
|
17
|
+
e || o();
|
|
18
|
+
},
|
|
19
|
+
workspaceId: t() ?? void 0
|
|
336
20
|
});
|
|
337
21
|
};
|
|
338
22
|
//#endregion
|
|
339
|
-
export {
|
|
23
|
+
export { i as VibeDeckShareDialog };
|
|
340
24
|
|
|
341
25
|
//# sourceMappingURL=VibeDeckShareDialog.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"VibeDeckShareDialog.js","names":[],"sources":["../../../src/components/vibedeck/VibeDeckShareDialog.tsx"],"sourcesContent":["import { type FC, useState, useCallback } from 'react';\nimport {\n X,\n Link2,\n Copy,\n Check,\n Trash2,\n Globe,\n Lock,\n Users,\n Code,\n Eye,\n Play,\n Shield,\n Loader2,\n} from 'lucide-react';\nimport { type VibeDeckShareLink } from '@/generated/wspace-types';\nimport {\n useListVibeDeckShareLinksQuery,\n useCreateVibeDeckShareLinkMutation,\n useRevokeVibeDeckShareLinkMutation,\n} from '@/generated/wspace-operations';\nimport { useTr } from '../../shared/hooks/useTr';\nimport {\n buildEmbedUrl,\n copyTextToClipboard,\n escapeHtmlAttribute,\n normalizeShareUrl,\n} from '../../utils/shareUrl';\n\ninterface VibeDeckShareDialogProps {\n vibeDeckId: string;\n vibeDeckName: string;\n onClose: () => void;\n}\n\nconst VISIBILITY_OPTIONS = [\n {\n value: 'SIGNED_LINK' as const,\n label: 'Anyone with the link',\n description: 'Anyone who has the link can access, no login required',\n icon: Link2,\n },\n {\n value: 'PUBLIC' as const,\n label: 'Public',\n description: 'Anyone can discover and access this deck',\n icon: Globe,\n },\n {\n value: 'RESTRICTED' as const,\n label: 'Restricted',\n description: 'Only people with permission can access (requires login)',\n icon: Lock,\n },\n];\n\nconst PERMISSION_OPTIONS = [\n {\n value: 'VIEW' as const,\n label: 'Viewer',\n description: 'Can view the deck',\n icon: Eye,\n },\n {\n value: 'EXECUTE' as const,\n label: 'Can execute',\n description: 'Can view and execute buttons',\n icon: Play,\n },\n];\n\nexport const VibeDeckShareDialog: FC<VibeDeckShareDialogProps> = ({\n vibeDeckId,\n vibeDeckName,\n onClose,\n}) => {\n const tr = useTr();\n const [copiedId, setCopiedId] = useState<string | null>(null);\n const [copiedEmbed, setCopiedEmbed] = useState<string | null>(null);\n const [copyFailedId, setCopyFailedId] = useState<string | null>(null);\n const [copyFailedEmbed, setCopyFailedEmbed] = useState<string | null>(null);\n\n // New link form state\n const [visibility, setVisibility] = useState<'SIGNED_LINK' | 'PUBLIC' | 'RESTRICTED'>(\n 'SIGNED_LINK'\n );\n const [permission, setPermission] = useState<'VIEW' | 'EXECUTE'>('EXECUTE');\n const [expiresInHours, setExpiresInHours] = useState<string>('');\n const [password, setPassword] = useState('');\n const [allowIframe, setAllowIframe] = useState(false);\n const [linkName, setLinkName] = useState('');\n\n const { data, loading, refetch } = useListVibeDeckShareLinksQuery({\n variables: { vibeDeckId },\n });\n\n const [createShareLink, { loading: creating }] = useCreateVibeDeckShareLinkMutation({\n refetchQueries: ['ListVibeDeckShareLinks'],\n });\n\n const [revokeShareLink] = useRevokeVibeDeckShareLinkMutation({\n refetchQueries: ['ListVibeDeckShareLinks'],\n });\n\n const shareLinks = data?.vibeDeckShareLinks || [];\n\n const handleCreate = useCallback(async () => {\n try {\n await createShareLink({\n variables: {\n input: {\n vibeDeckId,\n name: linkName || null,\n visibility,\n permission,\n expiresInHours: expiresInHours ? parseInt(expiresInHours, 10) : null,\n password: password || null,\n allowIframe,\n },\n },\n });\n // Reset form\n setLinkName('');\n setPassword('');\n setExpiresInHours('');\n setAllowIframe(false);\n } catch {\n // Error handled by Apollo\n }\n }, [\n createShareLink,\n vibeDeckId,\n linkName,\n visibility,\n permission,\n expiresInHours,\n password,\n allowIframe,\n ]);\n\n const handleRevoke = useCallback(\n async (id: string) => {\n try {\n await revokeShareLink({ variables: { id } });\n } catch {\n // Error handled by Apollo\n }\n },\n [revokeShareLink]\n );\n\n const handleCopyUrl = useCallback(async (id: string, url: string) => {\n const ok = await copyTextToClipboard(normalizeShareUrl(url)).then(\n () => true,\n (error) => {\n console.warn('Failed to copy VibeDeck share link:', error);\n return false;\n }\n );\n setCopiedId(ok ? id : null);\n setCopyFailedId(ok ? null : id);\n setTimeout(() => {\n setCopiedId(null);\n setCopyFailedId(null);\n }, 2000);\n }, []);\n\n const handleCopyEmbed = useCallback(async (id: string, url: string) => {\n const embedCode = `<iframe src=\"${escapeHtmlAttribute(buildEmbedUrl(url))}\" width=\"100%\" height=\"600\" frameborder=\"0\" allow=\"clipboard-write\" style=\"border-radius: 8px; border: 1px solid var(--color-border-subtle);\"></iframe>`;\n const ok = await copyTextToClipboard(embedCode).then(\n () => true,\n (error) => {\n console.warn('Failed to copy VibeDeck embed code:', error);\n return false;\n }\n );\n setCopiedEmbed(ok ? id : null);\n setCopyFailedEmbed(ok ? null : id);\n setTimeout(() => {\n setCopiedEmbed(null);\n setCopyFailedEmbed(null);\n }, 2000);\n }, []);\n\n const visibilityIcon = (v: string) => {\n switch (v) {\n case 'PUBLIC':\n return <Globe size={14} className=\"text-status-success-text\" />;\n case 'RESTRICTED':\n return <Lock size={14} className=\"text-status-warning-text\" />;\n default:\n return <Link2 size={14} className=\"text-status-info-text\" />;\n }\n };\n\n return (\n <div className=\"fixed inset-0 z-50 flex items-center justify-center bg-bg-elevated/60 backdrop-blur-sm\">\n <div className=\"bg-bg-surface border border-border-default rounded-xl shadow-2xl w-full max-w-lg mx-4 max-h-[85vh] flex flex-col\">\n {/* Header */}\n <div className=\"flex items-center justify-between px-6 py-4 border-b border-border-default\">\n <div>\n <h2 className=\"text-lg font-semibold text-text-primary\">Share \"{vibeDeckName}\"</h2>\n <p className=\"text-sm text-text-secondary mt-0.5\">\n {tr('vibecontrols.vibedeck.share.manageAccess', 'Manage access to this VibeDeck')}\n </p>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1.5 rounded-lg hover:bg-bg-tertiary text-text-tertiary hover:text-text-primary transition-colors\"\n >\n <X size={18} />\n </button>\n </div>\n\n <div className=\"overflow-y-auto flex-1 px-6 py-4 space-y-6\">\n {/* Create new link section */}\n <div className=\"space-y-4\">\n <h3 className=\"text-sm font-medium text-text-primary flex items-center gap-2\">\n <Link2 size={14} />\n {tr('vibecontrols.vibedeck.share.createShareLink', 'Create share link')}\n </h3>\n\n {/* Link name (optional) */}\n <input\n aria-label=\"Link name (optional)\"\n type=\"text\"\n value={linkName}\n onChange={(e) => setLinkName(e.target.value)}\n placeholder=\"Link name (optional)\"\n className=\"w-full px-3 py-2 text-sm bg-bg-sunken border border-border-default rounded-lg text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n />\n\n {/* Visibility selector */}\n <div className=\"space-y-2\">\n <label\n htmlFor=\"vibedecksharedialog-37\"\n className=\"text-xs font-medium text-text-secondary uppercase tracking-wider\"\n >\n Access\n </label>\n <div className=\"grid grid-cols-3 gap-2\">\n {VISIBILITY_OPTIONS.map((opt) => {\n const Icon = opt.icon;\n const isSelected = visibility === opt.value;\n return (\n <button\n type=\"button\"\n key={opt.value}\n onClick={() => setVisibility(opt.value)}\n className={`flex flex-col items-center gap-1.5 p-3 rounded-lg border-2 text-xs font-medium transition-all ${\n isSelected\n ? 'border-action-primary-bg bg-action-primary-bg/10 text-action-primary-bg'\n : 'border-border-default text-text-secondary hover:border-border-default hover:bg-bg-secondary'\n }`}\n title={opt.description}\n >\n <Icon size={16} />\n <span className=\"text-center leading-tight\">{opt.label}</span>\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Permission selector */}\n <div className=\"space-y-2\">\n <label\n htmlFor=\"vibedecksharedialog-37\"\n className=\"text-xs font-medium text-text-secondary uppercase tracking-wider\"\n >\n Permission\n </label>\n <div className=\"grid grid-cols-2 gap-2\">\n {PERMISSION_OPTIONS.map((opt) => {\n const Icon = opt.icon;\n const isSelected = permission === opt.value;\n return (\n <button\n type=\"button\"\n key={opt.value}\n onClick={() => setPermission(opt.value)}\n className={`flex items-center gap-2 p-3 rounded-lg border-2 text-sm font-medium transition-all ${\n isSelected\n ? 'border-action-primary-bg bg-action-primary-bg/10 text-action-primary-bg'\n : 'border-border-default text-text-secondary hover:border-border-default hover:bg-bg-secondary'\n }`}\n >\n <Icon size={14} />\n {opt.label}\n </button>\n );\n })}\n </div>\n </div>\n\n {/* Options row */}\n <div className=\"grid grid-cols-2 gap-3\">\n <div>\n <label\n htmlFor=\"vibedecksharedialog-37\"\n className=\"text-xs font-medium text-text-secondary\"\n >\n Expires in (hours)\n </label>\n <input\n id=\"vibedecksharedialog-37\"\n aria-label=\"Never\"\n type=\"number\"\n min=\"1\"\n value={expiresInHours}\n onChange={(e) => setExpiresInHours(e.target.value)}\n placeholder=\"Never\"\n className=\"w-full mt-1 px-3 py-2 text-sm bg-bg-sunken border border-border-default rounded-lg text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n />\n </div>\n <div>\n <label\n htmlFor=\"vibedecksharedialog-36\"\n className=\"text-xs font-medium text-text-secondary\"\n >\n Password (optional)\n </label>\n <input\n id=\"vibedecksharedialog-36\"\n aria-label=\"No password\"\n type=\"password\"\n value={password}\n onChange={(e) => setPassword(e.target.value)}\n placeholder=\"No password\"\n className=\"w-full mt-1 px-3 py-2 text-sm bg-bg-sunken border border-border-default rounded-lg text-text-primary placeholder:text-text-placeholder focus:outline-none focus:ring-2 focus:ring-action-primary-bg\"\n />\n </div>\n </div>\n\n {/* Allow iframe toggle */}\n <label className=\"flex items-center gap-3 cursor-pointer\">\n <input\n aria-label=\"control\"\n type=\"checkbox\"\n checked={allowIframe}\n onChange={(e) => setAllowIframe(e.target.checked)}\n className=\"size-4 rounded border-border-default text-action-primary-bg focus:ring-action-primary-bg\"\n />\n <div>\n <span className=\"text-sm text-text-primary\">Allow iframe embedding</span>\n <p className=\"text-xs text-text-tertiary\">\n Enable embedding this deck in other websites\n </p>\n </div>\n </label>\n\n {/* Create button */}\n <button\n type=\"button\"\n onClick={handleCreate}\n disabled={creating}\n className=\"w-full px-4 py-2.5 rounded-lg bg-action-primary-bg text-action-primary-text text-sm font-medium hover:bg-action-primary-bg-hover disabled:opacity-50 transition-colors flex items-center justify-center gap-2\"\n >\n {creating ? <Loader2 size={14} className=\"animate-spin\" /> : <Link2 size={14} />}\n {tr('vibecontrols.vibedeck.share.createLink', 'Create Link')}\n </button>\n </div>\n\n {/* Existing links */}\n {loading ? (\n <div className=\"flex items-center justify-center py-6\">\n <Loader2 size={20} className=\"animate-spin text-text-tertiary\" />\n </div>\n ) : shareLinks.length > 0 ? (\n <div className=\"space-y-3\">\n <h3 className=\"text-sm font-medium text-text-primary flex items-center gap-2\">\n <Shield size={14} />\n Active links ({shareLinks.length})\n </h3>\n {shareLinks.map((link: VibeDeckShareLink) => (\n <div\n key={link.id}\n className={`rounded-lg border p-3 space-y-2 ${\n link.status === 'ACTIVE'\n ? 'border-border-default bg-bg-secondary'\n : 'border-border-default/50 bg-bg-secondary/50 opacity-60'\n }`}\n >\n <div className=\"flex items-center justify-between\">\n <div className=\"flex items-center gap-2\">\n {visibilityIcon(link.visibility)}\n <span className=\"text-sm font-medium text-text-primary\">\n {link.name || 'Unnamed link'}\n </span>\n <span\n className={`text-[10px] font-bold uppercase px-1.5 py-0.5 rounded ${\n link.status === 'ACTIVE'\n ? 'bg-status-success-bg/20 text-status-success-text'\n : link.status === 'REVOKED'\n ? 'bg-status-error-bg/20 text-status-error-text'\n : 'bg-status-warning-bg/20 text-status-warning-text'\n }`}\n >\n {link.status}\n </span>\n </div>\n <div className=\"flex items-center gap-1\">\n {link.status === 'ACTIVE' && (\n <>\n <button\n type=\"button\"\n onClick={() => handleCopyUrl(link.id, link.shareUrl)}\n className=\"p-1.5 rounded hover:bg-bg-tertiary text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Copy link\"\n >\n {copiedId === link.id ? (\n <Check size={14} className=\"text-status-success-text\" />\n ) : copyFailedId === link.id ? (\n <X size={14} className=\"text-status-error-text\" />\n ) : (\n <Copy size={14} />\n )}\n </button>\n {link.allowIframe && (\n <button\n type=\"button\"\n onClick={() => handleCopyEmbed(link.id, link.shareUrl)}\n className=\"p-1.5 rounded hover:bg-bg-tertiary text-text-tertiary hover:text-text-primary transition-colors\"\n title=\"Copy embed code\"\n >\n {copiedEmbed === link.id ? (\n <Check size={14} className=\"text-status-success-text\" />\n ) : copyFailedEmbed === link.id ? (\n <X size={14} className=\"text-status-error-text\" />\n ) : (\n <Code size={14} />\n )}\n </button>\n )}\n <button\n type=\"button\"\n onClick={() => handleRevoke(link.id)}\n className=\"p-1.5 rounded hover:bg-bg-tertiary text-text-tertiary hover:text-status-error-text transition-colors\"\n title=\"Revoke link\"\n >\n <Trash2 size={14} />\n </button>\n </>\n )}\n </div>\n </div>\n <div className=\"flex items-center gap-3 text-xs text-text-tertiary\">\n <span className=\"flex items-center gap-1\">\n {link.permission === 'EXECUTE' ? <Play size={10} /> : <Eye size={10} />}\n {link.permission === 'EXECUTE' ? 'Can execute' : 'View only'}\n </span>\n {link.hasPassword && (\n <span className=\"flex items-center gap-1\">\n <Lock size={10} />\n Password\n </span>\n )}\n {link.allowIframe && (\n <span className=\"flex items-center gap-1\">\n <Code size={10} />\n Embeddable\n </span>\n )}\n <span>{link.useCount} uses</span>\n {link.expiresAt && (\n <span>Expires {new Date(link.expiresAt).toLocaleDateString()}</span>\n )}\n </div>\n </div>\n ))}\n </div>\n ) : (\n <div className=\"text-center py-6\">\n <Users size={24} className=\"mx-auto text-text-tertiary mb-2\" />\n <p className=\"text-sm text-text-secondary\">\n {tr('vibecontrols.vibedeck.share.noLinks', 'No share links yet')}\n </p>\n <p className=\"text-xs text-text-tertiary mt-1\">\n {tr(\n 'vibecontrols.vibedeck.share.createLinkHint',\n 'Create a link above to share this VibeDeck'\n )}\n </p>\n </div>\n )}\n </div>\n </div>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"VibeDeckShareDialog.js","names":[],"sources":["../../../src/components/vibedeck/VibeDeckShareDialog.tsx"],"sourcesContent":["import type { FC } from 'react';\nimport { ShareDialog } from '@burdenoff/fe-libs/sharing';\nimport { getStoredWorkspaceId } from '@burdenoff/fe-libs/shared/graphql';\n\nimport { useEntityShareController } from '../sharing/useEntityShareController';\n\ninterface VibeDeckShareDialogProps {\n vibeDeckId: string;\n vibeDeckName: string;\n onClose: () => void;\n}\n\n/**\n * VibeDeckShareDialog — thin wrapper around the generic fe-libs `<ShareDialog>`\n * for a VibeDeck.\n *\n * It previously hosted a bespoke link-only share UI (legacy\n * `createVibeDeckShareLink` + `VibeDeckShareLink` table). That surface was pure\n * share-record management with no realtime entanglement, so the body has been\n * replaced with the richer generic dialog (email invite + accept-gate + four\n * visibility modes + expiry + public link) backed by the generic\n * `shareVibeDeckGrant` grant mutations.\n *\n * The mount-to-open `{ vibeDeckId, vibeDeckName, onClose }` API is preserved so\n * the page's existing triggers (header button, deck-card share action) keep\n * working unchanged. `vibeId` is resolved by the controller's own read query\n * (the deck list fragment does not project it), enabling \"Everyone with Vibe\".\n */\nexport const VibeDeckShareDialog: FC<VibeDeckShareDialogProps> = ({\n vibeDeckId,\n vibeDeckName,\n onClose,\n}) => {\n const controller = useEntityShareController('vibedeck', { id: vibeDeckId });\n\n return (\n <ShareDialog\n resource={{ type: 'vibedeck', id: vibeDeckId, name: vibeDeckName }}\n controller={controller}\n open\n onOpenChange={(next) => {\n if (!next) onClose();\n }}\n workspaceId={getStoredWorkspaceId() ?? undefined}\n />\n );\n};\n"],"mappings":";;;;;AA4BA,IAAa,KAAqD,EAChE,eACA,iBACA,iBACI;CACJ,IAAM,IAAa,EAAyB,YAAY,EAAE,IAAI,GAAY,CAAC;AAE3E,QACE,kBAAC,GAAD;EACE,UAAU;GAAE,MAAM;GAAY,IAAI;GAAY,MAAM;GAAc;EACtD;EACZ,MAAA;EACA,eAAe,MAAS;AACtB,GAAK,KAAM,GAAS;;EAEtB,aAAa,GAAsB,IAAI,KAAA;EACvC,CAAA"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"permissions.js","names":[],"sources":["../../src/constants/permissions.ts"],"sourcesContent":["/**\n * VibeControls Permission Constants\n *\n * All permission strings for VibeControls resources.\n * Use with fe-libs usePermissions hook: hasPermission(VIBE_PERMISSIONS.VIBE_CREATE)\n *\n * Resource types:\n * - vibe: list, read, create, update, delete, scan, manage\n * - vibecommand: list, read, create, update, delete\n * - agent: list, read, create, update, delete\n * - session: list, read, create, update, delete, execute\n * - note: list, read, create, update, delete\n * - webhook: list, read, create, update, delete\n * - action: list, read, create, update, delete, execute\n * - calendar-agent-task: list, read, create, update, delete, execute\n * - configuration: list, read, create, update, delete\n * - docs_site: list, read, create, update, delete, execute\n * - docs_page: list, read, create, update, delete\n * - target: list, read, create, update, delete\n * - tunnel: list, read, create, delete\n * - analytics: list, read\n * - log: list, read\n */\n\nexport const VIBE_PERMISSIONS = {\n // Vibe resources\n VIBE_LIST: 'vibe:list',\n VIBE_READ: 'vibe:read',\n VIBE_CREATE: 'vibe:create',\n VIBE_UPDATE: 'vibe:update',\n VIBE_DELETE: 'vibe:delete',\n VIBE_SCAN: 'vibe:scan',\n VIBE_MANAGE: 'vibe:manage',\n\n // VibeCommand resources\n VIBECOMMAND_LIST: 'vibecommand:list',\n VIBECOMMAND_READ: 'vibecommand:read',\n VIBECOMMAND_CREATE: 'vibecommand:create',\n VIBECOMMAND_UPDATE: 'vibecommand:update',\n VIBECOMMAND_DELETE: 'vibecommand:delete',\n\n // Agent resources\n AGENT_LIST: 'agent:list',\n AGENT_READ: 'agent:read',\n AGENT_CREATE: 'agent:create',\n AGENT_UPDATE: 'agent:update',\n AGENT_DELETE: 'agent:delete',\n\n // Session resources\n SESSION_LIST: 'session:list',\n SESSION_READ: 'session:read',\n SESSION_CREATE: 'session:create',\n SESSION_UPDATE: 'session:update',\n SESSION_DELETE: 'session:delete',\n SESSION_EXECUTE: 'session:execute',\n\n // Note resources\n NOTE_LIST: 'note:list',\n NOTE_READ: 'note:read',\n NOTE_CREATE: 'note:create',\n NOTE_UPDATE: 'note:update',\n NOTE_DELETE: 'note:delete',\n\n // Webhook resources\n WEBHOOK_LIST: 'webhook:list',\n WEBHOOK_READ: 'webhook:read',\n WEBHOOK_CREATE: 'webhook:create',\n WEBHOOK_UPDATE: 'webhook:update',\n WEBHOOK_DELETE: 'webhook:delete',\n\n // VibeDeck resources\n VIBEDECK_LIST: 'vibedeck:list',\n VIBEDECK_READ: 'vibedeck:read',\n VIBEDECK_CREATE: 'vibedeck:create',\n VIBEDECK_UPDATE: 'vibedeck:update',\n VIBEDECK_DELETE: 'vibedeck:delete',\n VIBEDECK_EXECUTE: 'vibedeck:execute',\n VIBEDECK_SHARE: 'vibedeck:share',\n\n // Calendar Agent Task resources\n CALENDAR_AGENT_TASK_LIST: 'calendar-agent-task:list',\n CALENDAR_AGENT_TASK_READ: 'calendar-agent-task:read',\n CALENDAR_AGENT_TASK_CREATE: 'calendar-agent-task:create',\n CALENDAR_AGENT_TASK_UPDATE: 'calendar-agent-task:update',\n CALENDAR_AGENT_TASK_DELETE: 'calendar-agent-task:delete',\n CALENDAR_AGENT_TASK_EXECUTE: 'calendar-agent-task:execute',\n\n // Schedule resources (wspace-scheduler-svc — the unified-source\n // ScheduledJobs surfaced on the Calendar agenda live here).\n // `scheduledJob`/`scheduledJobs` enforce `schedule:read`;\n // `executeJobNow` enforces `schedule:execute`. Distinct from\n // `calendar-agent-task:*` so RBAC denials don't cross-bleed\n // between the two services.\n SCHEDULE_LIST: 'schedule:list',\n SCHEDULE_READ: 'schedule:read',\n SCHEDULE_EXECUTE: 'schedule:execute',\n\n // Configuration resources\n CONFIG_LIST: 'configuration:list',\n CONFIG_READ: 'configuration:read',\n CONFIG_CREATE: 'configuration:create',\n CONFIG_UPDATE: 'configuration:update',\n CONFIG_DELETE: 'configuration:delete',\n\n // Docs Site resources\n DOCS_SITE_LIST: 'docs_site:list',\n DOCS_SITE_READ: 'docs_site:read',\n DOCS_SITE_CREATE: 'docs_site:create',\n DOCS_SITE_UPDATE: 'docs_site:update',\n DOCS_SITE_DELETE: 'docs_site:delete',\n DOCS_COMPILE: 'docs_site:execute',\n\n // Docs Page resources\n DOCS_PAGE_LIST: 'docs_page:list',\n DOCS_PAGE_READ: 'docs_page:read',\n DOCS_PAGE_CREATE: 'docs_page:create',\n DOCS_PAGE_UPDATE: 'docs_page:update',\n DOCS_PAGE_DELETE: 'docs_page:delete',\n // Docs Site generic-sharing surface (backend `shareDocs`, @rbac resource `docs_site`)\n DOCS_SITE_SHARE: 'docs_site:share',\n\n // Action resources\n ACTION_LIST: 'action:list',\n ACTION_READ: 'action:read',\n ACTION_CREATE: 'action:create',\n ACTION_UPDATE: 'action:update',\n ACTION_DELETE: 'action:delete',\n ACTION_EXECUTE: 'action:execute',\n ACTION_SHARE: 'action:share',\n\n // AI Prompt resources — generic-sharing surface (backend `shareAiPrompt`)\n AIPROMPT_SHARE: 'ai-prompt:share',\n\n // AI Context resources — generic-sharing surface (backend `shareAiContext`)\n AICONTEXT_SHARE: 'ai-context:share',\n\n // Agent Instruction File resources — generic-sharing surface\n // (backend `shareAgentInstructionFile`)\n INSTRUCTION_FILE_SHARE: 'instruction-file:share',\n\n // Audit resources\n AUDIT_LIST: 'audit:list',\n AUDIT_READ: 'audit:read',\n AUDIT_DELETE: 'audit:delete',\n AUDIT_EXPORT: 'audit:export',\n\n // Target resources — guards wired in BOFF-2034 (Remaining Pages Audit)\n TARGET_LIST: 'target:list',\n TARGET_READ: 'target:read',\n TARGET_CREATE: 'target:create',\n TARGET_UPDATE: 'target:update',\n TARGET_DELETE: 'target:delete',\n // Target generic-sharing surface (backend `shareTarget`, @rbac resource `target`)\n TARGET_SHARE: 'target:share',\n\n // Catalog resources — generic-sharing surface (backend `shareCatalog`)\n CATALOG_SHARE: 'catalog:share',\n\n // Component resources — generic-sharing surface (backend `shareComponent`)\n COMPONENT_SHARE: 'component:share',\n\n // Template resources — generic-sharing surface (backend `shareTemplate`)\n TEMPLATE_SHARE: 'template:share',\n\n // Scorecard resources — generic-sharing surface (backend `shareScorecard`)\n SCORECARD_SHARE: 'scorecard:share',\n\n // Tunnel resources — no TUNNEL_UPDATE: tunnels are create-or-delete only\n TUNNEL_LIST: 'tunnel:list',\n TUNNEL_READ: 'tunnel:read',\n TUNNEL_CREATE: 'tunnel:create',\n TUNNEL_DELETE: 'tunnel:delete',\n TUNNEL_SHARE: 'tunnel:share',\n\n // Analytics resources\n ANALYTICS_LIST: 'analytics:list',\n ANALYTICS_READ: 'analytics:read',\n\n // Log resources\n LOG_LIST: 'log:list',\n LOG_READ: 'log:read',\n} as const;\n\nexport type VibePermission = (typeof VIBE_PERMISSIONS)[keyof typeof VIBE_PERMISSIONS];\n"],"mappings":";AAwBA,IAAa,IAAmB;CAE9B,WAAW;CACX,WAAW;CACX,aAAa;CACb,aAAa;CACb,aAAa;CACb,WAAW;CACX,aAAa;CAGb,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,oBAAoB;CAGpB,YAAY;CACZ,YAAY;CACZ,cAAc;CACd,cAAc;CACd,cAAc;CAGd,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;
|
|
1
|
+
{"version":3,"file":"permissions.js","names":[],"sources":["../../src/constants/permissions.ts"],"sourcesContent":["/**\n * VibeControls Permission Constants\n *\n * All permission strings for VibeControls resources.\n * Use with fe-libs usePermissions hook: hasPermission(VIBE_PERMISSIONS.VIBE_CREATE)\n *\n * Resource types:\n * - vibe: list, read, create, update, delete, scan, manage\n * - vibecommand: list, read, create, update, delete\n * - agent: list, read, create, update, delete\n * - session: list, read, create, update, delete, execute\n * - note: list, read, create, update, delete\n * - webhook: list, read, create, update, delete\n * - action: list, read, create, update, delete, execute\n * - calendar-agent-task: list, read, create, update, delete, execute\n * - configuration: list, read, create, update, delete\n * - docs_site: list, read, create, update, delete, execute\n * - docs_page: list, read, create, update, delete\n * - target: list, read, create, update, delete\n * - tunnel: list, read, create, delete\n * - analytics: list, read\n * - log: list, read\n */\n\nexport const VIBE_PERMISSIONS = {\n // Vibe resources\n VIBE_LIST: 'vibe:list',\n VIBE_READ: 'vibe:read',\n VIBE_CREATE: 'vibe:create',\n VIBE_UPDATE: 'vibe:update',\n VIBE_DELETE: 'vibe:delete',\n VIBE_SCAN: 'vibe:scan',\n VIBE_MANAGE: 'vibe:manage',\n\n // VibeCommand resources\n VIBECOMMAND_LIST: 'vibecommand:list',\n VIBECOMMAND_READ: 'vibecommand:read',\n VIBECOMMAND_CREATE: 'vibecommand:create',\n VIBECOMMAND_UPDATE: 'vibecommand:update',\n VIBECOMMAND_DELETE: 'vibecommand:delete',\n\n // Agent resources\n AGENT_LIST: 'agent:list',\n AGENT_READ: 'agent:read',\n AGENT_CREATE: 'agent:create',\n AGENT_UPDATE: 'agent:update',\n AGENT_DELETE: 'agent:delete',\n\n // Session resources\n SESSION_LIST: 'session:list',\n SESSION_READ: 'session:read',\n SESSION_CREATE: 'session:create',\n SESSION_UPDATE: 'session:update',\n SESSION_DELETE: 'session:delete',\n SESSION_EXECUTE: 'session:execute',\n SESSION_SHARE: 'session:share',\n\n // Note resources\n NOTE_LIST: 'note:list',\n NOTE_READ: 'note:read',\n NOTE_CREATE: 'note:create',\n NOTE_UPDATE: 'note:update',\n NOTE_DELETE: 'note:delete',\n\n // Webhook resources\n WEBHOOK_LIST: 'webhook:list',\n WEBHOOK_READ: 'webhook:read',\n WEBHOOK_CREATE: 'webhook:create',\n WEBHOOK_UPDATE: 'webhook:update',\n WEBHOOK_DELETE: 'webhook:delete',\n\n // VibeDeck resources\n VIBEDECK_LIST: 'vibedeck:list',\n VIBEDECK_READ: 'vibedeck:read',\n VIBEDECK_CREATE: 'vibedeck:create',\n VIBEDECK_UPDATE: 'vibedeck:update',\n VIBEDECK_DELETE: 'vibedeck:delete',\n VIBEDECK_EXECUTE: 'vibedeck:execute',\n VIBEDECK_SHARE: 'vibedeck:share',\n\n // Calendar Agent Task resources\n CALENDAR_AGENT_TASK_LIST: 'calendar-agent-task:list',\n CALENDAR_AGENT_TASK_READ: 'calendar-agent-task:read',\n CALENDAR_AGENT_TASK_CREATE: 'calendar-agent-task:create',\n CALENDAR_AGENT_TASK_UPDATE: 'calendar-agent-task:update',\n CALENDAR_AGENT_TASK_DELETE: 'calendar-agent-task:delete',\n CALENDAR_AGENT_TASK_EXECUTE: 'calendar-agent-task:execute',\n\n // Schedule resources (wspace-scheduler-svc — the unified-source\n // ScheduledJobs surfaced on the Calendar agenda live here).\n // `scheduledJob`/`scheduledJobs` enforce `schedule:read`;\n // `executeJobNow` enforces `schedule:execute`. Distinct from\n // `calendar-agent-task:*` so RBAC denials don't cross-bleed\n // between the two services.\n SCHEDULE_LIST: 'schedule:list',\n SCHEDULE_READ: 'schedule:read',\n SCHEDULE_EXECUTE: 'schedule:execute',\n\n // Configuration resources\n CONFIG_LIST: 'configuration:list',\n CONFIG_READ: 'configuration:read',\n CONFIG_CREATE: 'configuration:create',\n CONFIG_UPDATE: 'configuration:update',\n CONFIG_DELETE: 'configuration:delete',\n\n // Docs Site resources\n DOCS_SITE_LIST: 'docs_site:list',\n DOCS_SITE_READ: 'docs_site:read',\n DOCS_SITE_CREATE: 'docs_site:create',\n DOCS_SITE_UPDATE: 'docs_site:update',\n DOCS_SITE_DELETE: 'docs_site:delete',\n DOCS_COMPILE: 'docs_site:execute',\n\n // Docs Page resources\n DOCS_PAGE_LIST: 'docs_page:list',\n DOCS_PAGE_READ: 'docs_page:read',\n DOCS_PAGE_CREATE: 'docs_page:create',\n DOCS_PAGE_UPDATE: 'docs_page:update',\n DOCS_PAGE_DELETE: 'docs_page:delete',\n // Docs Site generic-sharing surface (backend `shareDocs`, @rbac resource `docs_site`)\n DOCS_SITE_SHARE: 'docs_site:share',\n\n // Action resources\n ACTION_LIST: 'action:list',\n ACTION_READ: 'action:read',\n ACTION_CREATE: 'action:create',\n ACTION_UPDATE: 'action:update',\n ACTION_DELETE: 'action:delete',\n ACTION_EXECUTE: 'action:execute',\n ACTION_SHARE: 'action:share',\n\n // AI Prompt resources — generic-sharing surface (backend `shareAiPrompt`)\n AIPROMPT_SHARE: 'ai-prompt:share',\n\n // AI Context resources — generic-sharing surface (backend `shareAiContext`)\n AICONTEXT_SHARE: 'ai-context:share',\n\n // Agent Instruction File resources — generic-sharing surface\n // (backend `shareAgentInstructionFile`)\n INSTRUCTION_FILE_SHARE: 'instruction-file:share',\n\n // Audit resources\n AUDIT_LIST: 'audit:list',\n AUDIT_READ: 'audit:read',\n AUDIT_DELETE: 'audit:delete',\n AUDIT_EXPORT: 'audit:export',\n\n // Target resources — guards wired in BOFF-2034 (Remaining Pages Audit)\n TARGET_LIST: 'target:list',\n TARGET_READ: 'target:read',\n TARGET_CREATE: 'target:create',\n TARGET_UPDATE: 'target:update',\n TARGET_DELETE: 'target:delete',\n // Target generic-sharing surface (backend `shareTarget`, @rbac resource `target`)\n TARGET_SHARE: 'target:share',\n\n // Catalog resources — generic-sharing surface (backend `shareCatalog`)\n CATALOG_SHARE: 'catalog:share',\n\n // Component resources — generic-sharing surface (backend `shareComponent`)\n COMPONENT_SHARE: 'component:share',\n\n // Template resources — generic-sharing surface (backend `shareTemplate`)\n TEMPLATE_SHARE: 'template:share',\n\n // Scorecard resources — generic-sharing surface (backend `shareScorecard`)\n SCORECARD_SHARE: 'scorecard:share',\n\n // Tunnel resources — no TUNNEL_UPDATE: tunnels are create-or-delete only\n TUNNEL_LIST: 'tunnel:list',\n TUNNEL_READ: 'tunnel:read',\n TUNNEL_CREATE: 'tunnel:create',\n TUNNEL_DELETE: 'tunnel:delete',\n TUNNEL_SHARE: 'tunnel:share',\n\n // Analytics resources\n ANALYTICS_LIST: 'analytics:list',\n ANALYTICS_READ: 'analytics:read',\n\n // Log resources\n LOG_LIST: 'log:list',\n LOG_READ: 'log:read',\n} as const;\n\nexport type VibePermission = (typeof VIBE_PERMISSIONS)[keyof typeof VIBE_PERMISSIONS];\n"],"mappings":";AAwBA,IAAa,IAAmB;CAE9B,WAAW;CACX,WAAW;CACX,aAAa;CACb,aAAa;CACb,aAAa;CACb,WAAW;CACX,aAAa;CAGb,kBAAkB;CAClB,kBAAkB;CAClB,oBAAoB;CACpB,oBAAoB;CACpB,oBAAoB;CAGpB,YAAY;CACZ,YAAY;CACZ,cAAc;CACd,cAAc;CACd,cAAc;CAGd,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAChB,iBAAiB;CACjB,eAAe;CAGf,WAAW;CACX,WAAW;CACX,aAAa;CACb,aAAa;CACb,aAAa;CAGb,cAAc;CACd,cAAc;CACd,gBAAgB;CAChB,gBAAgB;CAChB,gBAAgB;CAGhB,eAAe;CACf,eAAe;CACf,iBAAiB;CACjB,iBAAiB;CACjB,iBAAiB;CACjB,kBAAkB;CAClB,gBAAgB;CAGhB,0BAA0B;CAC1B,0BAA0B;CAC1B,4BAA4B;CAC5B,4BAA4B;CAC5B,4BAA4B;CAC5B,6BAA6B;CAQ7B,eAAe;CACf,eAAe;CACf,kBAAkB;CAGlB,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CAGf,gBAAgB;CAChB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAClB,cAAc;CAGd,gBAAgB;CAChB,gBAAgB;CAChB,kBAAkB;CAClB,kBAAkB;CAClB,kBAAkB;CAElB,iBAAiB;CAGjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CACf,gBAAgB;CAChB,cAAc;CAGd,gBAAgB;CAGhB,iBAAiB;CAIjB,wBAAwB;CAGxB,YAAY;CACZ,YAAY;CACZ,cAAc;CACd,cAAc;CAGd,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,eAAe;CAEf,cAAc;CAGd,eAAe;CAGf,iBAAiB;CAGjB,gBAAgB;CAGhB,iBAAiB;CAGjB,aAAa;CACb,aAAa;CACb,eAAe;CACf,eAAe;CACf,cAAc;CAGd,gBAAgB;CAChB,gBAAgB;CAGhB,UAAU;CACV,UAAU;CACX"}
|
|
@@ -16,27 +16,25 @@ var e = /* @__PURE__ */ function(e) {
|
|
|
16
16
|
}({}), s = /* @__PURE__ */ function(e) {
|
|
17
17
|
return e.Interact = "INTERACT", e.View = "VIEW", e;
|
|
18
18
|
}({}), c = /* @__PURE__ */ function(e) {
|
|
19
|
-
return e.Active = "ACTIVE", e.Expired = "EXPIRED", e.Pending = "PENDING", e.Revoked = "REVOKED", e;
|
|
20
|
-
}({}), l = /* @__PURE__ */ function(e) {
|
|
21
19
|
return e.Custom = "CUSTOM", e.ManagedSubdomain = "MANAGED_SUBDOMAIN", e;
|
|
22
|
-
}({}),
|
|
20
|
+
}({}), l = /* @__PURE__ */ function(e) {
|
|
23
21
|
return e.Expired = "EXPIRED", e.Failed = "FAILED", e.Pending = "PENDING", e.Verified = "VERIFIED", e.Verifying = "VERIFYING", e;
|
|
24
|
-
}({}),
|
|
22
|
+
}({}), u = /* @__PURE__ */ function(e) {
|
|
25
23
|
return e.Alpha = "ALPHA", e.Prod = "PROD", e;
|
|
26
|
-
}({}),
|
|
24
|
+
}({}), d = /* @__PURE__ */ function(e) {
|
|
27
25
|
return e.Http = "HTTP", e.Https = "HTTPS", e.Tcp = "TCP", e.Udp = "UDP", e;
|
|
28
|
-
}({}),
|
|
26
|
+
}({}), f = /* @__PURE__ */ function(e) {
|
|
29
27
|
return e.Cloudflare = "CLOUDFLARE", e.Vibetunnels = "VIBETUNNELS", e;
|
|
30
|
-
}({}),
|
|
28
|
+
}({}), p = /* @__PURE__ */ function(e) {
|
|
31
29
|
return e.Connected = "CONNECTED", e.Disconnected = "DISCONNECTED", e.Expired = "EXPIRED", e.Issued = "ISSUED", e.Revoked = "REVOKED", e;
|
|
32
|
-
}({}),
|
|
30
|
+
}({}), m = /* @__PURE__ */ function(e) {
|
|
33
31
|
return e.Active = "ACTIVE", e.Degraded = "DEGRADED", e.Deleting = "DELETING", e.Draft = "DRAFT", e.Error = "ERROR", e.Provisioning = "PROVISIONING", e.Stopped = "STOPPED", e;
|
|
34
|
-
}({}),
|
|
32
|
+
}({}), h = /* @__PURE__ */ function(e) {
|
|
35
33
|
return e.Csv = "CSV", e.Json = "JSON", e;
|
|
36
|
-
}({}),
|
|
34
|
+
}({}), g = /* @__PURE__ */ function(e) {
|
|
37
35
|
return e.Private = "PRIVATE", e.SharedWithVibe = "SHARED_WITH_VIBE", e;
|
|
38
36
|
}({});
|
|
39
37
|
//#endregion
|
|
40
|
-
export { e as AgentCapabilityScope, t as AnalyticsEntityType, n as CollaboratorRole, r as InstructionFilename, i as InstructionScope, a as MeshSessionKind, o as NoteVisibility, s as SessionSharePermission, c as
|
|
38
|
+
export { e as AgentCapabilityScope, t as AnalyticsEntityType, n as CollaboratorRole, r as InstructionFilename, i as InstructionScope, a as MeshSessionKind, o as NoteVisibility, s as SessionSharePermission, c as TunnelDomainType, l as TunnelDomainVerificationStatus, u as TunnelEnvironment, d as TunnelProtocol, f as TunnelProviderKey, p as TunnelSessionStatus, m as TunnelStatus, h as VibeAuditExportFormat, g as VibeVisibility };
|
|
41
39
|
|
|
42
40
|
//# sourceMappingURL=wspace-types.js.map
|