@burdenoff/microfe-vibecontrols 2026.709.2 → 2026.710.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.
- package/dist/components/agent-manager/AgentManagerBookmarksDrawer.js +87 -85
- package/dist/components/agent-manager/AgentManagerBookmarksDrawer.js.map +1 -1
- package/dist/components/ai/InstructionFilesManager.js +138 -136
- package/dist/components/ai/InstructionFilesManager.js.map +1 -1
- package/dist/components/ai/PluginHarnessPicker.js +70 -64
- package/dist/components/ai/PluginHarnessPicker.js.map +1 -1
- package/dist/components/docs/DocsEditPanel.js +1 -1
- package/dist/components/docs/DocsEditPanel.js.map +1 -1
- package/dist/components/docs/DocsPageTree.js +1 -1
- package/dist/components/docs/DocsPageTree.js.map +1 -1
- package/dist/components/docs/DocsTabPanel.js +108 -106
- package/dist/components/docs/DocsTabPanel.js.map +1 -1
- package/dist/components/notes/NotesTabPanel.js +99 -99
- package/dist/components/notes/NotesTabPanel.js.map +1 -1
- package/dist/components/scorecard/ScorecardPanel.js +309 -308
- package/dist/components/scorecard/ScorecardPanel.js.map +1 -1
- package/dist/components/sessions/SessionPublicLinkPanel.js +104 -102
- package/dist/components/sessions/SessionPublicLinkPanel.js.map +1 -1
- package/dist/components/settings/AdvancedSection.js +92 -90
- package/dist/components/settings/AdvancedSection.js.map +1 -1
- package/dist/components/vibedeck/VibeDeckPublicLinkPanel.js +104 -102
- package/dist/components/vibedeck/VibeDeckPublicLinkPanel.js.map +1 -1
- package/dist/constants/permissions.js +7 -0
- package/dist/constants/permissions.js.map +1 -1
- package/dist/pages/ActionsPage.js +303 -303
- package/dist/pages/ActionsPage.js.map +1 -1
- package/dist/pages/AgentDetailsPage.js +520 -516
- package/dist/pages/AgentDetailsPage.js.map +1 -1
- package/dist/pages/AgentsPage.js +287 -283
- package/dist/pages/AgentsPage.js.map +1 -1
- package/dist/pages/TargetsPage.js +554 -549
- package/dist/pages/TargetsPage.js.map +1 -1
- package/dist/pages/VibeAuditPage.js +2 -2
- package/dist/pages/VibeAuditPage.js.map +1 -1
- package/dist/pages/VibeDeckPage.js +257 -257
- package/dist/pages/VibeDeckPage.js.map +1 -1
- package/dist/pages/VibeDetailsPage.js +688 -693
- package/dist/pages/VibeDetailsPage.js.map +1 -1
- package/dist/pages/VibesPage.js +49 -41
- package/dist/pages/VibesPage.js.map +1 -1
- package/dist/pages/WebhooksPage.js +162 -138
- package/dist/pages/WebhooksPage.js.map +1 -1
- package/dist/pages/tunnels/DomainsTab.js +54 -47
- package/dist/pages/tunnels/DomainsTab.js.map +1 -1
- package/package.json +1 -1
|
@@ -2,13 +2,15 @@ import { useCreateAgentInstructionFileMutation as e, useDeleteAgentInstructionFi
|
|
|
2
2
|
import { InstructionFilename as i, InstructionScope as a, VibeEntityType as o, VibeVisibility as s } from "../../generated/wspace-types.js";
|
|
3
3
|
import { LINK_TO_VIBE_DEFAULT as c, LinkToVibePanel as l } from "../shared/LinkToVibePanel.js";
|
|
4
4
|
import { EntityVibeLinkControl as u } from "../shared/EntityVibeLinkControl.js";
|
|
5
|
-
import {
|
|
5
|
+
import { VIBE_PERMISSIONS as d } from "../../constants/permissions.js";
|
|
6
|
+
import { EntityShareButton as f } from "../sharing/EntityShareButton.js";
|
|
6
7
|
import "../sharing/index.js";
|
|
7
|
-
import { CommandEditor as
|
|
8
|
-
import { useMemo as
|
|
9
|
-
import {
|
|
8
|
+
import { CommandEditor as p } from "../common/CommandEditor.js";
|
|
9
|
+
import { useMemo as ee, useState as m } from "react";
|
|
10
|
+
import { usePermissions as h } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
11
|
+
import { Fragment as g, jsx as _, jsxs as v } from "react/jsx-runtime";
|
|
10
12
|
//#region src/components/ai/InstructionFilesManager.tsx
|
|
11
|
-
var
|
|
13
|
+
var y = [
|
|
12
14
|
{
|
|
13
15
|
value: i.AgentsMd,
|
|
14
16
|
label: "AGENTS.md"
|
|
@@ -25,14 +27,14 @@ var v = [
|
|
|
25
27
|
value: i.Custom,
|
|
26
28
|
label: "Custom"
|
|
27
29
|
}
|
|
28
|
-
],
|
|
30
|
+
], b = [{
|
|
29
31
|
value: a.Agent,
|
|
30
32
|
label: "Agent"
|
|
31
33
|
}, {
|
|
32
34
|
value: a.Vibe,
|
|
33
35
|
label: "Vibe"
|
|
34
|
-
}],
|
|
35
|
-
function
|
|
36
|
+
}], x = "w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary", S = "inline-flex items-center rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-50", C = "inline-flex items-center rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken", w = "inline-flex items-center rounded-md bg-action-danger-bg px-3 py-2 text-sm font-medium text-action-danger-text disabled:opacity-50", T = "inline-flex items-center rounded bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary";
|
|
37
|
+
function E() {
|
|
36
38
|
return {
|
|
37
39
|
filename: i.AgentsMd,
|
|
38
40
|
customName: "",
|
|
@@ -41,13 +43,13 @@ function T() {
|
|
|
41
43
|
link: c
|
|
42
44
|
};
|
|
43
45
|
}
|
|
44
|
-
function
|
|
46
|
+
function D(e) {
|
|
45
47
|
return e === s.SharedWithVibe ? "SHARED_WITH_VIBE" : "PRIVATE";
|
|
46
48
|
}
|
|
47
|
-
function
|
|
49
|
+
function O(e) {
|
|
48
50
|
return e === "SHARED_WITH_VIBE" ? s.SharedWithVibe : s.Private;
|
|
49
51
|
}
|
|
50
|
-
function
|
|
52
|
+
function k(e) {
|
|
51
53
|
return {
|
|
52
54
|
filename: e.filename,
|
|
53
55
|
customName: e.customName ?? "",
|
|
@@ -55,16 +57,16 @@ function O(e) {
|
|
|
55
57
|
content: e.content,
|
|
56
58
|
link: {
|
|
57
59
|
vibeId: e.vibeId ?? null,
|
|
58
|
-
visibility:
|
|
60
|
+
visibility: D(e.visibility)
|
|
59
61
|
}
|
|
60
62
|
};
|
|
61
63
|
}
|
|
62
|
-
function
|
|
64
|
+
function A(e) {
|
|
63
65
|
let t = new Date(e);
|
|
64
66
|
return Number.isNaN(t.getTime()) ? e : t.toLocaleString();
|
|
65
67
|
}
|
|
66
|
-
function
|
|
67
|
-
let { data:
|
|
68
|
+
function j({ agentId: c }) {
|
|
69
|
+
let { hasPermission: D } = h(), j = D(d.INSTRUCTION_FILE_CREATE), M = D(d.INSTRUCTION_FILE_UPDATE), te = D(d.INSTRUCTION_FILE_DELETE), { data: N, loading: ne, error: P } = n({
|
|
68
70
|
variables: {
|
|
69
71
|
filter: c ? { agentId: c } : void 0,
|
|
70
72
|
pagination: {
|
|
@@ -73,267 +75,267 @@ function A({ agentId: c }) {
|
|
|
73
75
|
}
|
|
74
76
|
},
|
|
75
77
|
fetchPolicy: "cache-and-network"
|
|
76
|
-
}), [
|
|
77
|
-
|
|
78
|
-
},
|
|
79
|
-
|
|
80
|
-
},
|
|
81
|
-
|
|
82
|
-
},
|
|
83
|
-
if (
|
|
84
|
-
|
|
78
|
+
}), [F, { loading: I }] = e({ refetchQueries: ["ListAgentInstructionFiles"] }), [L, { loading: R }] = r({ refetchQueries: ["ListAgentInstructionFiles"] }), [z, { loading: B }] = t({ refetchQueries: ["ListAgentInstructionFiles"] }), [V, H] = m(!1), [U, W] = m(null), [G, K] = m(E), [q, J] = m(null), [Y, X] = m(null), Z = ee(() => N?.agentInstructionFiles?.items ?? [], [N?.agentInstructionFiles?.items]), Q = I || R, re = () => {
|
|
79
|
+
W(null), K(E()), X(null), H(!0);
|
|
80
|
+
}, ie = (e) => {
|
|
81
|
+
W(e.id), K(k(e)), X(null), H(!0);
|
|
82
|
+
}, $ = () => {
|
|
83
|
+
H(!1), W(null), K(E()), X(null);
|
|
84
|
+
}, ae = async () => {
|
|
85
|
+
if (X(null), G.filename === i.Custom && G.customName.trim() === "") {
|
|
86
|
+
X("Please provide a name for the custom instruction file.");
|
|
85
87
|
return;
|
|
86
88
|
}
|
|
87
|
-
if (
|
|
88
|
-
|
|
89
|
+
if (G.content.trim() === "") {
|
|
90
|
+
X("Instruction file content cannot be empty.");
|
|
89
91
|
return;
|
|
90
92
|
}
|
|
91
|
-
let e =
|
|
93
|
+
let e = G.filename === i.Custom ? G.customName.trim() : null;
|
|
92
94
|
try {
|
|
93
|
-
if (
|
|
94
|
-
id:
|
|
95
|
+
if (U) await L({ variables: {
|
|
96
|
+
id: U,
|
|
95
97
|
input: {
|
|
96
|
-
content:
|
|
97
|
-
filename:
|
|
98
|
+
content: G.content,
|
|
99
|
+
filename: G.filename,
|
|
98
100
|
customName: e
|
|
99
101
|
}
|
|
100
102
|
} });
|
|
101
103
|
else {
|
|
102
|
-
if (
|
|
103
|
-
|
|
104
|
+
if (G.scope === a.Vibe && !G.link.vibeId) {
|
|
105
|
+
X("Pick a vibe to link before saving a vibe-scoped file.");
|
|
104
106
|
return;
|
|
105
107
|
}
|
|
106
108
|
let t = {
|
|
107
|
-
filename:
|
|
109
|
+
filename: G.filename,
|
|
108
110
|
customName: e,
|
|
109
|
-
content:
|
|
110
|
-
scope:
|
|
111
|
+
content: G.content,
|
|
112
|
+
scope: G.scope
|
|
111
113
|
};
|
|
112
|
-
|
|
114
|
+
G.scope === a.Vibe && G.link.vibeId ? (t.vibeId = G.link.vibeId, t.visibility = O(G.link.visibility)) : t.agentId = c ?? null, await F({ variables: { input: t } });
|
|
113
115
|
}
|
|
114
|
-
|
|
116
|
+
$();
|
|
115
117
|
} catch (e) {
|
|
116
|
-
|
|
118
|
+
X(e instanceof Error ? e.message : "Failed to save the instruction file.");
|
|
117
119
|
}
|
|
118
|
-
},
|
|
120
|
+
}, oe = async (e) => {
|
|
119
121
|
try {
|
|
120
|
-
await
|
|
122
|
+
await z({ variables: { id: e } });
|
|
121
123
|
} finally {
|
|
122
|
-
|
|
124
|
+
J(null);
|
|
123
125
|
}
|
|
124
126
|
};
|
|
125
|
-
return /* @__PURE__ */
|
|
127
|
+
return /* @__PURE__ */ v("section", {
|
|
126
128
|
"data-testid": "instruction-files-manager",
|
|
127
129
|
className: "space-y-4 rounded-lg border border-border-default bg-bg-surface p-4",
|
|
128
130
|
children: [
|
|
129
|
-
/* @__PURE__ */
|
|
131
|
+
/* @__PURE__ */ v("header", {
|
|
130
132
|
className: "flex flex-wrap items-start justify-between gap-3",
|
|
131
|
-
children: [/* @__PURE__ */
|
|
133
|
+
children: [/* @__PURE__ */ v("div", {
|
|
132
134
|
className: "space-y-1",
|
|
133
|
-
children: [/* @__PURE__ */
|
|
135
|
+
children: [/* @__PURE__ */ _("h2", {
|
|
134
136
|
className: "text-lg font-semibold text-text-primary",
|
|
135
137
|
children: "Instruction files"
|
|
136
|
-
}), /* @__PURE__ */
|
|
138
|
+
}), /* @__PURE__ */ _("p", {
|
|
137
139
|
className: "max-w-2xl text-sm text-text-secondary",
|
|
138
140
|
children: "AGENTS.md / CLAUDE.md / GEMINI.md maintained centrally and pushed to your agent on chat open."
|
|
139
141
|
})]
|
|
140
|
-
}), /* @__PURE__ */
|
|
142
|
+
}), j && /* @__PURE__ */ _("button", {
|
|
141
143
|
type: "button",
|
|
142
144
|
"data-testid": "instruction-file-new",
|
|
143
|
-
className:
|
|
144
|
-
onClick:
|
|
145
|
-
children:
|
|
145
|
+
className: S,
|
|
146
|
+
onClick: V && !U ? $ : re,
|
|
147
|
+
children: V && !U ? "Close" : "New file"
|
|
146
148
|
})]
|
|
147
149
|
}),
|
|
148
|
-
|
|
150
|
+
V && /* @__PURE__ */ v("div", {
|
|
149
151
|
className: "space-y-4 rounded-md border border-border-default bg-bg-elevated p-4",
|
|
150
152
|
children: [
|
|
151
|
-
/* @__PURE__ */
|
|
153
|
+
/* @__PURE__ */ _("h3", {
|
|
152
154
|
className: "text-sm font-medium text-text-primary",
|
|
153
|
-
children:
|
|
155
|
+
children: U ? "Edit instruction file" : "New instruction file"
|
|
154
156
|
}),
|
|
155
|
-
/* @__PURE__ */
|
|
157
|
+
/* @__PURE__ */ v("div", {
|
|
156
158
|
className: "grid gap-4 sm:grid-cols-2",
|
|
157
|
-
children: [/* @__PURE__ */
|
|
159
|
+
children: [/* @__PURE__ */ v("label", {
|
|
158
160
|
className: "space-y-1.5",
|
|
159
|
-
children: [/* @__PURE__ */
|
|
161
|
+
children: [/* @__PURE__ */ _("span", {
|
|
160
162
|
className: "block text-sm font-medium text-text-secondary",
|
|
161
163
|
children: "Filename"
|
|
162
|
-
}), /* @__PURE__ */
|
|
163
|
-
className:
|
|
164
|
-
value:
|
|
165
|
-
onChange: (e) =>
|
|
164
|
+
}), /* @__PURE__ */ _("select", {
|
|
165
|
+
className: x,
|
|
166
|
+
value: G.filename,
|
|
167
|
+
onChange: (e) => K((t) => ({
|
|
166
168
|
...t,
|
|
167
169
|
filename: e.target.value
|
|
168
170
|
})),
|
|
169
|
-
children:
|
|
171
|
+
children: y.map((e) => /* @__PURE__ */ _("option", {
|
|
170
172
|
value: e.value,
|
|
171
173
|
children: e.label
|
|
172
174
|
}, e.value))
|
|
173
175
|
})]
|
|
174
|
-
}), /* @__PURE__ */
|
|
176
|
+
}), /* @__PURE__ */ v("label", {
|
|
175
177
|
className: "space-y-1.5",
|
|
176
|
-
children: [/* @__PURE__ */
|
|
178
|
+
children: [/* @__PURE__ */ _("span", {
|
|
177
179
|
className: "block text-sm font-medium text-text-secondary",
|
|
178
180
|
children: "Scope"
|
|
179
|
-
}), /* @__PURE__ */
|
|
180
|
-
className:
|
|
181
|
-
value:
|
|
182
|
-
disabled:
|
|
183
|
-
onChange: (e) =>
|
|
181
|
+
}), /* @__PURE__ */ _("select", {
|
|
182
|
+
className: x,
|
|
183
|
+
value: G.scope,
|
|
184
|
+
disabled: U !== null,
|
|
185
|
+
onChange: (e) => K((t) => ({
|
|
184
186
|
...t,
|
|
185
187
|
scope: e.target.value
|
|
186
188
|
})),
|
|
187
|
-
children:
|
|
189
|
+
children: b.map((e) => /* @__PURE__ */ _("option", {
|
|
188
190
|
value: e.value,
|
|
189
191
|
children: e.label
|
|
190
192
|
}, e.value))
|
|
191
193
|
})]
|
|
192
194
|
})]
|
|
193
195
|
}),
|
|
194
|
-
|
|
196
|
+
G.filename === i.Custom && /* @__PURE__ */ v("label", {
|
|
195
197
|
className: "space-y-1.5",
|
|
196
|
-
children: [/* @__PURE__ */
|
|
198
|
+
children: [/* @__PURE__ */ _("span", {
|
|
197
199
|
className: "block text-sm font-medium text-text-secondary",
|
|
198
200
|
children: "Custom name"
|
|
199
|
-
}), /* @__PURE__ */
|
|
201
|
+
}), /* @__PURE__ */ _("input", {
|
|
200
202
|
type: "text",
|
|
201
|
-
className:
|
|
203
|
+
className: x,
|
|
202
204
|
placeholder: "e.g. CONTRIBUTING.md",
|
|
203
|
-
value:
|
|
204
|
-
onChange: (e) =>
|
|
205
|
+
value: G.customName,
|
|
206
|
+
onChange: (e) => K((t) => ({
|
|
205
207
|
...t,
|
|
206
208
|
customName: e.target.value
|
|
207
209
|
}))
|
|
208
210
|
})]
|
|
209
211
|
}),
|
|
210
|
-
!
|
|
211
|
-
value:
|
|
212
|
-
onChange: (e) =>
|
|
212
|
+
!U && G.scope === a.Vibe && /* @__PURE__ */ _(l, {
|
|
213
|
+
value: G.link,
|
|
214
|
+
onChange: (e) => K((t) => ({
|
|
213
215
|
...t,
|
|
214
216
|
link: e
|
|
215
217
|
})),
|
|
216
|
-
disabled:
|
|
218
|
+
disabled: Q
|
|
217
219
|
}),
|
|
218
|
-
/* @__PURE__ */
|
|
220
|
+
/* @__PURE__ */ v("label", {
|
|
219
221
|
className: "space-y-1.5",
|
|
220
|
-
children: [/* @__PURE__ */
|
|
222
|
+
children: [/* @__PURE__ */ _("span", {
|
|
221
223
|
className: "block text-sm font-medium text-text-secondary",
|
|
222
224
|
children: "Content"
|
|
223
|
-
}), /* @__PURE__ */
|
|
225
|
+
}), /* @__PURE__ */ _(p, {
|
|
224
226
|
language: "markdown",
|
|
225
227
|
rows: 12,
|
|
226
228
|
style: { minHeight: "14rem" },
|
|
227
229
|
placeholder: "# Project instructions…",
|
|
228
|
-
value:
|
|
229
|
-
onChange: (e) =>
|
|
230
|
+
value: G.content,
|
|
231
|
+
onChange: (e) => K((t) => ({
|
|
230
232
|
...t,
|
|
231
233
|
content: e.target.value
|
|
232
234
|
}))
|
|
233
235
|
})]
|
|
234
236
|
}),
|
|
235
|
-
|
|
237
|
+
Y && /* @__PURE__ */ _("p", {
|
|
236
238
|
className: "text-sm text-status-error-text",
|
|
237
239
|
role: "alert",
|
|
238
|
-
children:
|
|
240
|
+
children: Y
|
|
239
241
|
}),
|
|
240
|
-
/* @__PURE__ */
|
|
242
|
+
/* @__PURE__ */ v("div", {
|
|
241
243
|
className: "flex items-center gap-2",
|
|
242
|
-
children: [/* @__PURE__ */
|
|
244
|
+
children: [/* @__PURE__ */ _("button", {
|
|
243
245
|
type: "button",
|
|
244
246
|
"data-testid": "instruction-file-save",
|
|
245
|
-
className:
|
|
246
|
-
disabled:
|
|
247
|
+
className: S,
|
|
248
|
+
disabled: Q,
|
|
247
249
|
onClick: () => {
|
|
248
|
-
|
|
250
|
+
ae();
|
|
249
251
|
},
|
|
250
|
-
children:
|
|
251
|
-
}), /* @__PURE__ */
|
|
252
|
+
children: Q ? "Saving…" : "Save"
|
|
253
|
+
}), /* @__PURE__ */ _("button", {
|
|
252
254
|
type: "button",
|
|
253
|
-
className:
|
|
254
|
-
disabled:
|
|
255
|
-
onClick:
|
|
255
|
+
className: C,
|
|
256
|
+
disabled: Q,
|
|
257
|
+
onClick: $,
|
|
256
258
|
children: "Cancel"
|
|
257
259
|
})]
|
|
258
260
|
})
|
|
259
261
|
]
|
|
260
262
|
}),
|
|
261
|
-
|
|
263
|
+
P ? /* @__PURE__ */ v("p", {
|
|
262
264
|
className: "rounded-md border border-border-default bg-bg-sunken p-4 text-sm text-status-error-text",
|
|
263
|
-
children: ["Could not load instruction files: ",
|
|
264
|
-
}) :
|
|
265
|
+
children: ["Could not load instruction files: ", P.message]
|
|
266
|
+
}) : ne && Z.length === 0 ? /* @__PURE__ */ _("p", {
|
|
265
267
|
className: "rounded-md border border-border-default bg-bg-sunken p-4 text-sm text-text-secondary",
|
|
266
268
|
children: "Loading instruction files…"
|
|
267
|
-
}) :
|
|
269
|
+
}) : Z.length === 0 ? /* @__PURE__ */ _("p", {
|
|
268
270
|
className: "rounded-md border border-border-default bg-bg-sunken p-4 text-sm text-text-secondary",
|
|
269
271
|
children: "No instruction files yet. Create one to share it with your agent."
|
|
270
|
-
}) : /* @__PURE__ */
|
|
272
|
+
}) : /* @__PURE__ */ _("ul", {
|
|
271
273
|
className: "space-y-2",
|
|
272
|
-
children:
|
|
273
|
-
let t =
|
|
274
|
-
return /* @__PURE__ */
|
|
274
|
+
children: Z.map((e) => {
|
|
275
|
+
let t = q === e.id, n = e.visibility === s.SharedWithVibe, r = e.scope === a.Vibe ? "Vibe" : "Agent";
|
|
276
|
+
return /* @__PURE__ */ v("li", {
|
|
275
277
|
"data-testid": "instruction-file-row",
|
|
276
278
|
className: "flex flex-wrap items-center justify-between gap-3 rounded-md border border-border-default bg-bg-elevated p-3",
|
|
277
|
-
children: [/* @__PURE__ */
|
|
279
|
+
children: [/* @__PURE__ */ v("div", {
|
|
278
280
|
className: "min-w-0 space-y-1",
|
|
279
|
-
children: [/* @__PURE__ */
|
|
281
|
+
children: [/* @__PURE__ */ v("div", {
|
|
280
282
|
className: "flex flex-wrap items-center gap-2",
|
|
281
283
|
children: [
|
|
282
|
-
/* @__PURE__ */
|
|
284
|
+
/* @__PURE__ */ _("span", {
|
|
283
285
|
className: "font-mono text-sm font-bold text-text-primary",
|
|
284
286
|
children: e.effectiveFilename
|
|
285
287
|
}),
|
|
286
|
-
/* @__PURE__ */
|
|
287
|
-
className:
|
|
288
|
+
/* @__PURE__ */ _("span", {
|
|
289
|
+
className: T,
|
|
288
290
|
children: r
|
|
289
291
|
}),
|
|
290
|
-
/* @__PURE__ */
|
|
291
|
-
className:
|
|
292
|
+
/* @__PURE__ */ _("span", {
|
|
293
|
+
className: T,
|
|
292
294
|
children: n ? "Shared" : "Private"
|
|
293
295
|
})
|
|
294
296
|
]
|
|
295
|
-
}), /* @__PURE__ */
|
|
297
|
+
}), /* @__PURE__ */ v("p", {
|
|
296
298
|
className: "text-xs text-text-tertiary",
|
|
297
|
-
children: ["Updated ",
|
|
299
|
+
children: ["Updated ", A(e.updatedAt)]
|
|
298
300
|
})]
|
|
299
|
-
}), /* @__PURE__ */
|
|
301
|
+
}), /* @__PURE__ */ _("div", {
|
|
300
302
|
className: "flex items-center gap-2",
|
|
301
|
-
children: t ? /* @__PURE__ */
|
|
302
|
-
/* @__PURE__ */
|
|
303
|
+
children: t ? /* @__PURE__ */ v(g, { children: [
|
|
304
|
+
/* @__PURE__ */ _("span", {
|
|
303
305
|
className: "text-xs text-text-secondary",
|
|
304
306
|
children: "Delete this file?"
|
|
305
307
|
}),
|
|
306
|
-
/* @__PURE__ */
|
|
308
|
+
/* @__PURE__ */ _("button", {
|
|
307
309
|
type: "button",
|
|
308
|
-
className:
|
|
309
|
-
disabled:
|
|
310
|
+
className: w,
|
|
311
|
+
disabled: B,
|
|
310
312
|
onClick: () => {
|
|
311
|
-
|
|
313
|
+
oe(e.id);
|
|
312
314
|
},
|
|
313
|
-
children:
|
|
315
|
+
children: B ? "Deleting…" : "Confirm"
|
|
314
316
|
}),
|
|
315
|
-
/* @__PURE__ */
|
|
317
|
+
/* @__PURE__ */ _("button", {
|
|
316
318
|
type: "button",
|
|
317
|
-
className:
|
|
318
|
-
disabled:
|
|
319
|
-
onClick: () =>
|
|
319
|
+
className: C,
|
|
320
|
+
disabled: B,
|
|
321
|
+
onClick: () => J(null),
|
|
320
322
|
children: "Cancel"
|
|
321
323
|
})
|
|
322
|
-
] }) : /* @__PURE__ */
|
|
323
|
-
/* @__PURE__ */
|
|
324
|
+
] }) : /* @__PURE__ */ v(g, { children: [
|
|
325
|
+
M && /* @__PURE__ */ _("button", {
|
|
324
326
|
type: "button",
|
|
325
|
-
className:
|
|
326
|
-
onClick: () =>
|
|
327
|
+
className: C,
|
|
328
|
+
onClick: () => ie(e),
|
|
327
329
|
children: "Edit"
|
|
328
330
|
}),
|
|
329
|
-
/* @__PURE__ */
|
|
331
|
+
/* @__PURE__ */ _(u, {
|
|
330
332
|
entityType: o.InstructionFile,
|
|
331
333
|
entityId: e.id,
|
|
332
334
|
currentVibeId: e.vibeId ?? null,
|
|
333
335
|
currentVisibility: e.visibility,
|
|
334
336
|
refetchQueries: ["ListAgentInstructionFiles"]
|
|
335
337
|
}),
|
|
336
|
-
/* @__PURE__ */
|
|
338
|
+
/* @__PURE__ */ _(f, {
|
|
337
339
|
entity: "instructionfile",
|
|
338
340
|
resource: {
|
|
339
341
|
id: e.id,
|
|
@@ -342,10 +344,10 @@ function A({ agentId: c }) {
|
|
|
342
344
|
},
|
|
343
345
|
label: "Share"
|
|
344
346
|
}),
|
|
345
|
-
/* @__PURE__ */
|
|
347
|
+
te && /* @__PURE__ */ _("button", {
|
|
346
348
|
type: "button",
|
|
347
|
-
className:
|
|
348
|
-
onClick: () =>
|
|
349
|
+
className: w,
|
|
350
|
+
onClick: () => J(e.id),
|
|
349
351
|
children: "Delete"
|
|
350
352
|
})
|
|
351
353
|
] })
|
|
@@ -357,6 +359,6 @@ function A({ agentId: c }) {
|
|
|
357
359
|
});
|
|
358
360
|
}
|
|
359
361
|
//#endregion
|
|
360
|
-
export {
|
|
362
|
+
export { j as InstructionFilesManager };
|
|
361
363
|
|
|
362
364
|
//# sourceMappingURL=InstructionFilesManager.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"InstructionFilesManager.js","names":[],"sources":["../../../src/components/ai/InstructionFilesManager.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n useListAgentInstructionFilesQuery,\n useCreateAgentInstructionFileMutation,\n useUpdateAgentInstructionFileMutation,\n useDeleteAgentInstructionFileMutation,\n} from '@/generated/wspace-operations';\nimport {\n InstructionFilename,\n InstructionScope,\n VibeVisibility,\n VibeEntityType,\n type CreateAgentInstructionFileInput,\n type UpdateAgentInstructionFileInput,\n} from '@/generated/wspace-types';\nimport {\n LinkToVibePanel,\n LINK_TO_VIBE_DEFAULT,\n type LinkToVibeValue,\n type LinkToVibeVisibility,\n} from '@/components/shared/LinkToVibePanel';\nimport { EntityVibeLinkControl } from '@/components/shared/EntityVibeLinkControl';\nimport { EntityShareButton } from '@/components/sharing';\nimport { CommandEditor } from '@/components/common/CommandEditor';\n\n/**\n * Shape of a single instruction file as returned by ListAgentInstructionFiles.\n * Mirrors the InstructionFileFields fragment in wspace-operations.\n */\ninterface InstructionFile {\n id: string;\n workspaceId: string;\n filename: InstructionFilename;\n customName?: string | null;\n effectiveFilename: string;\n content: string;\n scope: InstructionScope;\n agentId?: string | null;\n tags: string[];\n vibeId?: string | null;\n visibility: VibeVisibility;\n createdBy: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface InstructionFilesManagerProps {\n /** Default AGENT-scope target for newly-created files. */\n agentId?: string | null;\n}\n\nconst FILENAME_OPTIONS: ReadonlyArray<{ value: InstructionFilename; label: string }> = [\n { value: InstructionFilename.AgentsMd, label: 'AGENTS.md' },\n { value: InstructionFilename.ClaudeMd, label: 'CLAUDE.md' },\n { value: InstructionFilename.GeminiMd, label: 'GEMINI.md' },\n { value: InstructionFilename.Custom, label: 'Custom' },\n];\n\nconst SCOPE_OPTIONS: ReadonlyArray<{ value: InstructionScope; label: string }> = [\n { value: InstructionScope.Agent, label: 'Agent' },\n { value: InstructionScope.Vibe, label: 'Vibe' },\n];\n\nconst INPUT_CLASS =\n 'w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary';\n\nconst PRIMARY_BTN_CLASS =\n 'inline-flex items-center rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-50';\n\nconst SECONDARY_BTN_CLASS =\n 'inline-flex items-center rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken';\n\nconst DANGER_BTN_CLASS =\n 'inline-flex items-center rounded-md bg-action-danger-bg px-3 py-2 text-sm font-medium text-action-danger-text disabled:opacity-50';\n\nconst BADGE_CLASS =\n 'inline-flex items-center rounded bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary';\n\n/** Internal state for the create/edit form. */\ninterface FormState {\n filename: InstructionFilename;\n customName: string;\n scope: InstructionScope;\n content: string;\n link: LinkToVibeValue;\n}\n\nfunction emptyFormState(): FormState {\n return {\n filename: InstructionFilename.AgentsMd,\n customName: '',\n scope: InstructionScope.Agent,\n content: '',\n link: LINK_TO_VIBE_DEFAULT,\n };\n}\n\n/** Map the file's stored visibility enum onto the LinkToVibePanel string union. */\nfunction toLinkVisibility(visibility: VibeVisibility): LinkToVibeVisibility {\n return visibility === VibeVisibility.SharedWithVibe ? 'SHARED_WITH_VIBE' : 'PRIVATE';\n}\n\n/** Map the LinkToVibePanel string union back onto the generated enum. */\nfunction toVibeVisibility(visibility: LinkToVibeVisibility): VibeVisibility {\n return visibility === 'SHARED_WITH_VIBE' ? VibeVisibility.SharedWithVibe : VibeVisibility.Private;\n}\n\nfunction formStateFromFile(file: InstructionFile): FormState {\n return {\n filename: file.filename,\n customName: file.customName ?? '',\n scope: file.scope,\n content: file.content,\n link: {\n vibeId: file.vibeId ?? null,\n visibility: toLinkVisibility(file.visibility),\n },\n };\n}\n\nfunction formatTimestamp(value: string): string {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return value;\n }\n return parsed.toLocaleString();\n}\n\nexport function InstructionFilesManager({\n agentId,\n}: InstructionFilesManagerProps): React.ReactElement {\n const { data, loading, error } = useListAgentInstructionFilesQuery({\n variables: {\n filter: agentId ? { agentId } : undefined,\n pagination: { limit: 100, offset: 0 },\n },\n fetchPolicy: 'cache-and-network',\n });\n\n const [createFile, { loading: creating }] = useCreateAgentInstructionFileMutation({\n refetchQueries: ['ListAgentInstructionFiles'],\n });\n const [updateFile, { loading: updating }] = useUpdateAgentInstructionFileMutation({\n refetchQueries: ['ListAgentInstructionFiles'],\n });\n const [deleteFile, { loading: deleting }] = useDeleteAgentInstructionFileMutation({\n refetchQueries: ['ListAgentInstructionFiles'],\n });\n\n const [formOpen, setFormOpen] = useState(false);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [form, setForm] = useState<FormState>(emptyFormState);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n\n const items = useMemo<InstructionFile[]>(\n () => data?.agentInstructionFiles?.items ?? [],\n [data?.agentInstructionFiles?.items]\n );\n\n const submitting = creating || updating;\n\n const openCreateForm = (): void => {\n setEditingId(null);\n setForm(emptyFormState());\n setFormError(null);\n setFormOpen(true);\n };\n\n const openEditForm = (file: InstructionFile): void => {\n setEditingId(file.id);\n setForm(formStateFromFile(file));\n setFormError(null);\n setFormOpen(true);\n };\n\n const closeForm = (): void => {\n setFormOpen(false);\n setEditingId(null);\n setForm(emptyFormState());\n setFormError(null);\n };\n\n const handleSubmit = async (): Promise<void> => {\n setFormError(null);\n\n if (form.filename === InstructionFilename.Custom && form.customName.trim() === '') {\n setFormError('Please provide a name for the custom instruction file.');\n return;\n }\n if (form.content.trim() === '') {\n setFormError('Instruction file content cannot be empty.');\n return;\n }\n\n const customName = form.filename === InstructionFilename.Custom ? form.customName.trim() : null;\n\n try {\n if (editingId) {\n // On edit only content / filename / customName / tags are updatable.\n const input: UpdateAgentInstructionFileInput = {\n content: form.content,\n filename: form.filename,\n customName,\n };\n await updateFile({ variables: { id: editingId, input } });\n } else {\n if (form.scope === InstructionScope.Vibe && !form.link.vibeId) {\n setFormError('Pick a vibe to link before saving a vibe-scoped file.');\n return;\n }\n\n const input: CreateAgentInstructionFileInput = {\n filename: form.filename,\n customName,\n content: form.content,\n scope: form.scope,\n };\n\n if (form.scope === InstructionScope.Vibe && form.link.vibeId) {\n input.vibeId = form.link.vibeId;\n input.visibility = toVibeVisibility(form.link.visibility);\n } else {\n input.agentId = agentId ?? null;\n }\n\n await createFile({ variables: { input } });\n }\n closeForm();\n } catch (submitErr) {\n setFormError(\n submitErr instanceof Error ? submitErr.message : 'Failed to save the instruction file.'\n );\n }\n };\n\n const handleDelete = async (id: string): Promise<void> => {\n try {\n await deleteFile({ variables: { id } });\n } finally {\n setConfirmDeleteId(null);\n }\n };\n\n return (\n <section\n data-testid=\"instruction-files-manager\"\n className=\"space-y-4 rounded-lg border border-border-default bg-bg-surface p-4\"\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Instruction files</h2>\n <p className=\"max-w-2xl text-sm text-text-secondary\">\n AGENTS.md / CLAUDE.md / GEMINI.md maintained centrally and pushed to your agent on chat\n open.\n </p>\n </div>\n <button\n type=\"button\"\n data-testid=\"instruction-file-new\"\n className={PRIMARY_BTN_CLASS}\n onClick={formOpen && !editingId ? closeForm : openCreateForm}\n >\n {formOpen && !editingId ? 'Close' : 'New file'}\n </button>\n </header>\n\n {formOpen && (\n <div className=\"space-y-4 rounded-md border border-border-default bg-bg-elevated p-4\">\n <h3 className=\"text-sm font-medium text-text-primary\">\n {editingId ? 'Edit instruction file' : 'New instruction file'}\n </h3>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <label className=\"space-y-1.5\">\n <span className=\"block text-sm font-medium text-text-secondary\">Filename</span>\n <select\n className={INPUT_CLASS}\n value={form.filename}\n onChange={(e) =>\n setForm((prev) => ({\n ...prev,\n filename: e.target.value as InstructionFilename,\n }))\n }\n >\n {FILENAME_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"space-y-1.5\">\n <span className=\"block text-sm font-medium text-text-secondary\">Scope</span>\n <select\n className={INPUT_CLASS}\n value={form.scope}\n disabled={editingId !== null}\n onChange={(e) =>\n setForm((prev) => ({\n ...prev,\n scope: e.target.value as InstructionScope,\n }))\n }\n >\n {SCOPE_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {form.filename === InstructionFilename.Custom && (\n <label className=\"space-y-1.5\">\n <span className=\"block text-sm font-medium text-text-secondary\">Custom name</span>\n <input\n type=\"text\"\n className={INPUT_CLASS}\n placeholder=\"e.g. CONTRIBUTING.md\"\n value={form.customName}\n onChange={(e) => setForm((prev) => ({ ...prev, customName: e.target.value }))}\n />\n </label>\n )}\n\n {!editingId && form.scope === InstructionScope.Vibe && (\n <LinkToVibePanel\n value={form.link}\n onChange={(link) => setForm((prev) => ({ ...prev, link }))}\n disabled={submitting}\n />\n )}\n\n <label className=\"space-y-1.5\">\n <span className=\"block text-sm font-medium text-text-secondary\">Content</span>\n <CommandEditor\n language=\"markdown\"\n rows={12}\n style={{ minHeight: '14rem' }}\n placeholder=\"# Project instructions…\"\n value={form.content}\n onChange={(e) => setForm((prev) => ({ ...prev, content: e.target.value }))}\n />\n </label>\n\n {formError && (\n <p className=\"text-sm text-status-error-text\" role=\"alert\">\n {formError}\n </p>\n )}\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n data-testid=\"instruction-file-save\"\n className={PRIMARY_BTN_CLASS}\n disabled={submitting}\n onClick={() => {\n void handleSubmit();\n }}\n >\n {submitting ? 'Saving…' : 'Save'}\n </button>\n <button\n type=\"button\"\n className={SECONDARY_BTN_CLASS}\n disabled={submitting}\n onClick={closeForm}\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n {error ? (\n <p className=\"rounded-md border border-border-default bg-bg-sunken p-4 text-sm text-status-error-text\">\n Could not load instruction files: {error.message}\n </p>\n ) : loading && items.length === 0 ? (\n <p className=\"rounded-md border border-border-default bg-bg-sunken p-4 text-sm text-text-secondary\">\n Loading instruction files…\n </p>\n ) : items.length === 0 ? (\n <p className=\"rounded-md border border-border-default bg-bg-sunken p-4 text-sm text-text-secondary\">\n No instruction files yet. Create one to share it with your agent.\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {items.map((file) => {\n const isConfirming = confirmDeleteId === file.id;\n const isShared = file.visibility === VibeVisibility.SharedWithVibe;\n const scopeLabel = file.scope === InstructionScope.Vibe ? 'Vibe' : 'Agent';\n return (\n <li\n key={file.id}\n data-testid=\"instruction-file-row\"\n className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border-default bg-bg-elevated p-3\"\n >\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-mono text-sm font-bold text-text-primary\">\n {file.effectiveFilename}\n </span>\n <span className={BADGE_CLASS}>{scopeLabel}</span>\n <span className={BADGE_CLASS}>{isShared ? 'Shared' : 'Private'}</span>\n </div>\n <p className=\"text-xs text-text-tertiary\">\n Updated {formatTimestamp(file.updatedAt)}\n </p>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {isConfirming ? (\n <>\n <span className=\"text-xs text-text-secondary\">Delete this file?</span>\n <button\n type=\"button\"\n className={DANGER_BTN_CLASS}\n disabled={deleting}\n onClick={() => {\n void handleDelete(file.id);\n }}\n >\n {deleting ? 'Deleting…' : 'Confirm'}\n </button>\n <button\n type=\"button\"\n className={SECONDARY_BTN_CLASS}\n disabled={deleting}\n onClick={() => setConfirmDeleteId(null)}\n >\n Cancel\n </button>\n </>\n ) : (\n <>\n <button\n type=\"button\"\n className={SECONDARY_BTN_CLASS}\n onClick={() => openEditForm(file)}\n >\n Edit\n </button>\n <EntityVibeLinkControl\n entityType={VibeEntityType.InstructionFile}\n entityId={file.id}\n currentVibeId={file.vibeId ?? null}\n currentVisibility={file.visibility}\n refetchQueries={['ListAgentInstructionFiles']}\n />\n <EntityShareButton\n entity=\"instructionfile\"\n resource={{\n id: file.id,\n name: file.effectiveFilename,\n vibeId: file.vibeId ?? null,\n }}\n label=\"Share\"\n />\n <button\n type=\"button\"\n className={DANGER_BTN_CLASS}\n onClick={() => setConfirmDeleteId(file.id)}\n >\n Delete\n </button>\n </>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n );\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"InstructionFilesManager.js","names":[],"sources":["../../../src/components/ai/InstructionFilesManager.tsx"],"sourcesContent":["import { useMemo, useState } from 'react';\nimport {\n useListAgentInstructionFilesQuery,\n useCreateAgentInstructionFileMutation,\n useUpdateAgentInstructionFileMutation,\n useDeleteAgentInstructionFileMutation,\n} from '@/generated/wspace-operations';\nimport {\n InstructionFilename,\n InstructionScope,\n VibeVisibility,\n VibeEntityType,\n type CreateAgentInstructionFileInput,\n type UpdateAgentInstructionFileInput,\n} from '@/generated/wspace-types';\nimport {\n LinkToVibePanel,\n LINK_TO_VIBE_DEFAULT,\n type LinkToVibeValue,\n type LinkToVibeVisibility,\n} from '@/components/shared/LinkToVibePanel';\nimport { EntityVibeLinkControl } from '@/components/shared/EntityVibeLinkControl';\nimport { EntityShareButton } from '@/components/sharing';\nimport { CommandEditor } from '@/components/common/CommandEditor';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { VIBE_PERMISSIONS } from '@/constants/permissions';\n\n/**\n * Shape of a single instruction file as returned by ListAgentInstructionFiles.\n * Mirrors the InstructionFileFields fragment in wspace-operations.\n */\ninterface InstructionFile {\n id: string;\n workspaceId: string;\n filename: InstructionFilename;\n customName?: string | null;\n effectiveFilename: string;\n content: string;\n scope: InstructionScope;\n agentId?: string | null;\n tags: string[];\n vibeId?: string | null;\n visibility: VibeVisibility;\n createdBy: string;\n createdAt: string;\n updatedAt: string;\n}\n\ninterface InstructionFilesManagerProps {\n /** Default AGENT-scope target for newly-created files. */\n agentId?: string | null;\n}\n\nconst FILENAME_OPTIONS: ReadonlyArray<{ value: InstructionFilename; label: string }> = [\n { value: InstructionFilename.AgentsMd, label: 'AGENTS.md' },\n { value: InstructionFilename.ClaudeMd, label: 'CLAUDE.md' },\n { value: InstructionFilename.GeminiMd, label: 'GEMINI.md' },\n { value: InstructionFilename.Custom, label: 'Custom' },\n];\n\nconst SCOPE_OPTIONS: ReadonlyArray<{ value: InstructionScope; label: string }> = [\n { value: InstructionScope.Agent, label: 'Agent' },\n { value: InstructionScope.Vibe, label: 'Vibe' },\n];\n\nconst INPUT_CLASS =\n 'w-full rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm text-text-primary';\n\nconst PRIMARY_BTN_CLASS =\n 'inline-flex items-center rounded-md bg-action-primary-bg px-3 py-2 text-sm font-medium text-action-primary-text hover:bg-action-primary-bg-hover disabled:opacity-50';\n\nconst SECONDARY_BTN_CLASS =\n 'inline-flex items-center rounded-md border border-border-default bg-bg-surface px-3 py-2 text-sm font-medium text-text-primary hover:bg-bg-sunken';\n\nconst DANGER_BTN_CLASS =\n 'inline-flex items-center rounded-md bg-action-danger-bg px-3 py-2 text-sm font-medium text-action-danger-text disabled:opacity-50';\n\nconst BADGE_CLASS =\n 'inline-flex items-center rounded bg-bg-sunken px-2 py-0.5 text-xs text-text-secondary';\n\n/** Internal state for the create/edit form. */\ninterface FormState {\n filename: InstructionFilename;\n customName: string;\n scope: InstructionScope;\n content: string;\n link: LinkToVibeValue;\n}\n\nfunction emptyFormState(): FormState {\n return {\n filename: InstructionFilename.AgentsMd,\n customName: '',\n scope: InstructionScope.Agent,\n content: '',\n link: LINK_TO_VIBE_DEFAULT,\n };\n}\n\n/** Map the file's stored visibility enum onto the LinkToVibePanel string union. */\nfunction toLinkVisibility(visibility: VibeVisibility): LinkToVibeVisibility {\n return visibility === VibeVisibility.SharedWithVibe ? 'SHARED_WITH_VIBE' : 'PRIVATE';\n}\n\n/** Map the LinkToVibePanel string union back onto the generated enum. */\nfunction toVibeVisibility(visibility: LinkToVibeVisibility): VibeVisibility {\n return visibility === 'SHARED_WITH_VIBE' ? VibeVisibility.SharedWithVibe : VibeVisibility.Private;\n}\n\nfunction formStateFromFile(file: InstructionFile): FormState {\n return {\n filename: file.filename,\n customName: file.customName ?? '',\n scope: file.scope,\n content: file.content,\n link: {\n vibeId: file.vibeId ?? null,\n visibility: toLinkVisibility(file.visibility),\n },\n };\n}\n\nfunction formatTimestamp(value: string): string {\n const parsed = new Date(value);\n if (Number.isNaN(parsed.getTime())) {\n return value;\n }\n return parsed.toLocaleString();\n}\n\nexport function InstructionFilesManager({\n agentId,\n}: InstructionFilesManagerProps): React.ReactElement {\n const { hasPermission } = usePermissions();\n const canCreate = hasPermission(VIBE_PERMISSIONS.INSTRUCTION_FILE_CREATE);\n const canUpdate = hasPermission(VIBE_PERMISSIONS.INSTRUCTION_FILE_UPDATE);\n const canDelete = hasPermission(VIBE_PERMISSIONS.INSTRUCTION_FILE_DELETE);\n\n const { data, loading, error } = useListAgentInstructionFilesQuery({\n variables: {\n filter: agentId ? { agentId } : undefined,\n pagination: { limit: 100, offset: 0 },\n },\n fetchPolicy: 'cache-and-network',\n });\n\n const [createFile, { loading: creating }] = useCreateAgentInstructionFileMutation({\n refetchQueries: ['ListAgentInstructionFiles'],\n });\n const [updateFile, { loading: updating }] = useUpdateAgentInstructionFileMutation({\n refetchQueries: ['ListAgentInstructionFiles'],\n });\n const [deleteFile, { loading: deleting }] = useDeleteAgentInstructionFileMutation({\n refetchQueries: ['ListAgentInstructionFiles'],\n });\n\n const [formOpen, setFormOpen] = useState(false);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [form, setForm] = useState<FormState>(emptyFormState);\n const [confirmDeleteId, setConfirmDeleteId] = useState<string | null>(null);\n const [formError, setFormError] = useState<string | null>(null);\n\n const items = useMemo<InstructionFile[]>(\n () => data?.agentInstructionFiles?.items ?? [],\n [data?.agentInstructionFiles?.items]\n );\n\n const submitting = creating || updating;\n\n const openCreateForm = (): void => {\n setEditingId(null);\n setForm(emptyFormState());\n setFormError(null);\n setFormOpen(true);\n };\n\n const openEditForm = (file: InstructionFile): void => {\n setEditingId(file.id);\n setForm(formStateFromFile(file));\n setFormError(null);\n setFormOpen(true);\n };\n\n const closeForm = (): void => {\n setFormOpen(false);\n setEditingId(null);\n setForm(emptyFormState());\n setFormError(null);\n };\n\n const handleSubmit = async (): Promise<void> => {\n setFormError(null);\n\n if (form.filename === InstructionFilename.Custom && form.customName.trim() === '') {\n setFormError('Please provide a name for the custom instruction file.');\n return;\n }\n if (form.content.trim() === '') {\n setFormError('Instruction file content cannot be empty.');\n return;\n }\n\n const customName = form.filename === InstructionFilename.Custom ? form.customName.trim() : null;\n\n try {\n if (editingId) {\n // On edit only content / filename / customName / tags are updatable.\n const input: UpdateAgentInstructionFileInput = {\n content: form.content,\n filename: form.filename,\n customName,\n };\n await updateFile({ variables: { id: editingId, input } });\n } else {\n if (form.scope === InstructionScope.Vibe && !form.link.vibeId) {\n setFormError('Pick a vibe to link before saving a vibe-scoped file.');\n return;\n }\n\n const input: CreateAgentInstructionFileInput = {\n filename: form.filename,\n customName,\n content: form.content,\n scope: form.scope,\n };\n\n if (form.scope === InstructionScope.Vibe && form.link.vibeId) {\n input.vibeId = form.link.vibeId;\n input.visibility = toVibeVisibility(form.link.visibility);\n } else {\n input.agentId = agentId ?? null;\n }\n\n await createFile({ variables: { input } });\n }\n closeForm();\n } catch (submitErr) {\n setFormError(\n submitErr instanceof Error ? submitErr.message : 'Failed to save the instruction file.'\n );\n }\n };\n\n const handleDelete = async (id: string): Promise<void> => {\n try {\n await deleteFile({ variables: { id } });\n } finally {\n setConfirmDeleteId(null);\n }\n };\n\n return (\n <section\n data-testid=\"instruction-files-manager\"\n className=\"space-y-4 rounded-lg border border-border-default bg-bg-surface p-4\"\n >\n <header className=\"flex flex-wrap items-start justify-between gap-3\">\n <div className=\"space-y-1\">\n <h2 className=\"text-lg font-semibold text-text-primary\">Instruction files</h2>\n <p className=\"max-w-2xl text-sm text-text-secondary\">\n AGENTS.md / CLAUDE.md / GEMINI.md maintained centrally and pushed to your agent on chat\n open.\n </p>\n </div>\n {canCreate && (\n <button\n type=\"button\"\n data-testid=\"instruction-file-new\"\n className={PRIMARY_BTN_CLASS}\n onClick={formOpen && !editingId ? closeForm : openCreateForm}\n >\n {formOpen && !editingId ? 'Close' : 'New file'}\n </button>\n )}\n </header>\n\n {formOpen && (\n <div className=\"space-y-4 rounded-md border border-border-default bg-bg-elevated p-4\">\n <h3 className=\"text-sm font-medium text-text-primary\">\n {editingId ? 'Edit instruction file' : 'New instruction file'}\n </h3>\n\n <div className=\"grid gap-4 sm:grid-cols-2\">\n <label className=\"space-y-1.5\">\n <span className=\"block text-sm font-medium text-text-secondary\">Filename</span>\n <select\n className={INPUT_CLASS}\n value={form.filename}\n onChange={(e) =>\n setForm((prev) => ({\n ...prev,\n filename: e.target.value as InstructionFilename,\n }))\n }\n >\n {FILENAME_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n\n <label className=\"space-y-1.5\">\n <span className=\"block text-sm font-medium text-text-secondary\">Scope</span>\n <select\n className={INPUT_CLASS}\n value={form.scope}\n disabled={editingId !== null}\n onChange={(e) =>\n setForm((prev) => ({\n ...prev,\n scope: e.target.value as InstructionScope,\n }))\n }\n >\n {SCOPE_OPTIONS.map((opt) => (\n <option key={opt.value} value={opt.value}>\n {opt.label}\n </option>\n ))}\n </select>\n </label>\n </div>\n\n {form.filename === InstructionFilename.Custom && (\n <label className=\"space-y-1.5\">\n <span className=\"block text-sm font-medium text-text-secondary\">Custom name</span>\n <input\n type=\"text\"\n className={INPUT_CLASS}\n placeholder=\"e.g. CONTRIBUTING.md\"\n value={form.customName}\n onChange={(e) => setForm((prev) => ({ ...prev, customName: e.target.value }))}\n />\n </label>\n )}\n\n {!editingId && form.scope === InstructionScope.Vibe && (\n <LinkToVibePanel\n value={form.link}\n onChange={(link) => setForm((prev) => ({ ...prev, link }))}\n disabled={submitting}\n />\n )}\n\n <label className=\"space-y-1.5\">\n <span className=\"block text-sm font-medium text-text-secondary\">Content</span>\n <CommandEditor\n language=\"markdown\"\n rows={12}\n style={{ minHeight: '14rem' }}\n placeholder=\"# Project instructions…\"\n value={form.content}\n onChange={(e) => setForm((prev) => ({ ...prev, content: e.target.value }))}\n />\n </label>\n\n {formError && (\n <p className=\"text-sm text-status-error-text\" role=\"alert\">\n {formError}\n </p>\n )}\n\n <div className=\"flex items-center gap-2\">\n <button\n type=\"button\"\n data-testid=\"instruction-file-save\"\n className={PRIMARY_BTN_CLASS}\n disabled={submitting}\n onClick={() => {\n void handleSubmit();\n }}\n >\n {submitting ? 'Saving…' : 'Save'}\n </button>\n <button\n type=\"button\"\n className={SECONDARY_BTN_CLASS}\n disabled={submitting}\n onClick={closeForm}\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n {error ? (\n <p className=\"rounded-md border border-border-default bg-bg-sunken p-4 text-sm text-status-error-text\">\n Could not load instruction files: {error.message}\n </p>\n ) : loading && items.length === 0 ? (\n <p className=\"rounded-md border border-border-default bg-bg-sunken p-4 text-sm text-text-secondary\">\n Loading instruction files…\n </p>\n ) : items.length === 0 ? (\n <p className=\"rounded-md border border-border-default bg-bg-sunken p-4 text-sm text-text-secondary\">\n No instruction files yet. Create one to share it with your agent.\n </p>\n ) : (\n <ul className=\"space-y-2\">\n {items.map((file) => {\n const isConfirming = confirmDeleteId === file.id;\n const isShared = file.visibility === VibeVisibility.SharedWithVibe;\n const scopeLabel = file.scope === InstructionScope.Vibe ? 'Vibe' : 'Agent';\n return (\n <li\n key={file.id}\n data-testid=\"instruction-file-row\"\n className=\"flex flex-wrap items-center justify-between gap-3 rounded-md border border-border-default bg-bg-elevated p-3\"\n >\n <div className=\"min-w-0 space-y-1\">\n <div className=\"flex flex-wrap items-center gap-2\">\n <span className=\"font-mono text-sm font-bold text-text-primary\">\n {file.effectiveFilename}\n </span>\n <span className={BADGE_CLASS}>{scopeLabel}</span>\n <span className={BADGE_CLASS}>{isShared ? 'Shared' : 'Private'}</span>\n </div>\n <p className=\"text-xs text-text-tertiary\">\n Updated {formatTimestamp(file.updatedAt)}\n </p>\n </div>\n\n <div className=\"flex items-center gap-2\">\n {isConfirming ? (\n <>\n <span className=\"text-xs text-text-secondary\">Delete this file?</span>\n <button\n type=\"button\"\n className={DANGER_BTN_CLASS}\n disabled={deleting}\n onClick={() => {\n void handleDelete(file.id);\n }}\n >\n {deleting ? 'Deleting…' : 'Confirm'}\n </button>\n <button\n type=\"button\"\n className={SECONDARY_BTN_CLASS}\n disabled={deleting}\n onClick={() => setConfirmDeleteId(null)}\n >\n Cancel\n </button>\n </>\n ) : (\n <>\n {canUpdate && (\n <button\n type=\"button\"\n className={SECONDARY_BTN_CLASS}\n onClick={() => openEditForm(file)}\n >\n Edit\n </button>\n )}\n <EntityVibeLinkControl\n entityType={VibeEntityType.InstructionFile}\n entityId={file.id}\n currentVibeId={file.vibeId ?? null}\n currentVisibility={file.visibility}\n refetchQueries={['ListAgentInstructionFiles']}\n />\n <EntityShareButton\n entity=\"instructionfile\"\n resource={{\n id: file.id,\n name: file.effectiveFilename,\n vibeId: file.vibeId ?? null,\n }}\n label=\"Share\"\n />\n {canDelete && (\n <button\n type=\"button\"\n className={DANGER_BTN_CLASS}\n onClick={() => setConfirmDeleteId(file.id)}\n >\n Delete\n </button>\n )}\n </>\n )}\n </div>\n </li>\n );\n })}\n </ul>\n )}\n </section>\n );\n}\n"],"mappings":"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"}
|