@burdenoff/microfe-vibecontrols 2026.709.1 → 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 +375 -371
- 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
|
@@ -1,149 +1,151 @@
|
|
|
1
1
|
import { useDeleteAgentMessageBookmarkMutation as e, useMyAgentMessageBookmarksQuery as t, useUpdateAgentMessageBookmarkMutation as n } from "../../generated/wspace-operations.js";
|
|
2
2
|
import { useTr as r } from "../../shared/hooks/useTr.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
3
|
+
import { VIBE_PERMISSIONS as i } from "../../constants/permissions.js";
|
|
4
|
+
import { relativeTime as a } from "../../utils/relativeTime.js";
|
|
5
|
+
import { useState as o } from "react";
|
|
6
|
+
import { Bookmark as s, Check as c, ChevronRight as l, ExternalLink as u, Pencil as d, Trash2 as f, X as p } from "lucide-react";
|
|
7
|
+
import { useNavigate as m } from "react-router-dom";
|
|
8
|
+
import { usePermissions as h } from "@burdenoff/fe-libs/shared/providers/shell";
|
|
9
|
+
import { jsx as g, jsxs as _ } from "react/jsx-runtime";
|
|
8
10
|
//#region src/components/agent-manager/AgentManagerBookmarksDrawer.tsx
|
|
9
|
-
var
|
|
10
|
-
function
|
|
11
|
+
var v = 80;
|
|
12
|
+
function y(e) {
|
|
11
13
|
if (!e) return "";
|
|
12
14
|
let t = e.trim().replace(/\s+/g, " ");
|
|
13
|
-
return t.length >
|
|
15
|
+
return t.length > v ? `${t.slice(0, v)}…` : t;
|
|
14
16
|
}
|
|
15
|
-
var
|
|
16
|
-
let
|
|
17
|
-
variables: { filter: { sessionId:
|
|
18
|
-
skip: !
|
|
17
|
+
var b = ({ open: v, onClose: b, sessionId: x, messages: S, onJump: C }) => {
|
|
18
|
+
let w = m(), T = r(), { hasPermission: E } = h(), D = E(i.AGENT_MESSAGE_BOOKMARK_UPDATE), O = E(i.AGENT_MESSAGE_BOOKMARK_DELETE), [k, A] = o(null), [j, M] = o(""), { data: N, loading: P } = t({
|
|
19
|
+
variables: { filter: { sessionId: x } },
|
|
20
|
+
skip: !v,
|
|
19
21
|
fetchPolicy: "cache-and-network"
|
|
20
|
-
}), [
|
|
21
|
-
|
|
22
|
-
},
|
|
23
|
-
await
|
|
22
|
+
}), [F] = n({ refetchQueries: ["MyAgentMessageBookmarks"] }), [I] = e({ refetchQueries: ["MyAgentMessageBookmarks"] }), L = N?.myAgentMessageBookmarks.items ?? [], R = new Map(S.map((e) => [e.id, e])), z = (e, t) => {
|
|
23
|
+
A(e), M(t ?? "");
|
|
24
|
+
}, B = async (e) => {
|
|
25
|
+
await F({ variables: {
|
|
24
26
|
id: e,
|
|
25
|
-
input: { label:
|
|
26
|
-
} }),
|
|
27
|
-
},
|
|
28
|
-
await
|
|
27
|
+
input: { label: j || null }
|
|
28
|
+
} }), A(null), M("");
|
|
29
|
+
}, V = async (e) => {
|
|
30
|
+
await I({ variables: { id: e } });
|
|
29
31
|
};
|
|
30
|
-
return
|
|
32
|
+
return v ? /* @__PURE__ */ _("div", {
|
|
31
33
|
className: "fixed inset-0 z-40 flex",
|
|
32
|
-
children: [/* @__PURE__ */
|
|
34
|
+
children: [/* @__PURE__ */ g("div", {
|
|
33
35
|
className: "flex-1 bg-bg-overlay/40",
|
|
34
|
-
onClick:
|
|
36
|
+
onClick: b,
|
|
35
37
|
"aria-hidden": !0
|
|
36
|
-
}), /* @__PURE__ */
|
|
38
|
+
}), /* @__PURE__ */ _("aside", {
|
|
37
39
|
className: "w-full max-w-md h-full bg-bg-surface border-l border-border-default shadow-xl flex flex-col",
|
|
38
40
|
role: "dialog",
|
|
39
|
-
"aria-label":
|
|
41
|
+
"aria-label": T("vibecontrols.agentManager.bookmarksDrawer.title", "Bookmarks in this session"),
|
|
40
42
|
"data-testid": "agent-manager-bookmarks-drawer",
|
|
41
43
|
children: [
|
|
42
|
-
/* @__PURE__ */
|
|
44
|
+
/* @__PURE__ */ _("header", {
|
|
43
45
|
className: "flex items-center justify-between px-4 py-3 border-b border-border-default flex-shrink-0",
|
|
44
|
-
children: [/* @__PURE__ */
|
|
46
|
+
children: [/* @__PURE__ */ _("div", {
|
|
45
47
|
className: "flex items-center gap-2",
|
|
46
|
-
children: [/* @__PURE__ */
|
|
48
|
+
children: [/* @__PURE__ */ g(s, { className: "size-4 text-text-secondary" }), /* @__PURE__ */ g("h3", {
|
|
47
49
|
className: "text-sm font-semibold text-text-primary",
|
|
48
|
-
children:
|
|
50
|
+
children: T("vibecontrols.agentManager.bookmarksDrawer.title", "Bookmarks in this session")
|
|
49
51
|
})]
|
|
50
|
-
}), /* @__PURE__ */
|
|
52
|
+
}), /* @__PURE__ */ g("button", {
|
|
51
53
|
type: "button",
|
|
52
|
-
onClick:
|
|
54
|
+
onClick: b,
|
|
53
55
|
className: "p-1 rounded hover:bg-bg-sunken transition-colors",
|
|
54
|
-
"aria-label":
|
|
55
|
-
children: /* @__PURE__ */
|
|
56
|
+
"aria-label": T("vibecontrols.common.close", "Close"),
|
|
57
|
+
children: /* @__PURE__ */ g(p, { className: "size-4 text-text-secondary" })
|
|
56
58
|
})]
|
|
57
59
|
}),
|
|
58
|
-
/* @__PURE__ */
|
|
60
|
+
/* @__PURE__ */ _("div", {
|
|
59
61
|
className: "flex-1 min-h-0 overflow-y-auto",
|
|
60
62
|
children: [
|
|
61
|
-
|
|
63
|
+
P && L.length === 0 && /* @__PURE__ */ g("div", {
|
|
62
64
|
className: "px-4 py-6 text-xs text-text-tertiary",
|
|
63
|
-
children:
|
|
65
|
+
children: T("vibecontrols.common.loading", "Loading...")
|
|
64
66
|
}),
|
|
65
|
-
!
|
|
67
|
+
!P && L.length === 0 && /* @__PURE__ */ _("div", {
|
|
66
68
|
className: "px-4 py-10 flex flex-col items-center text-center gap-2",
|
|
67
69
|
children: [
|
|
68
|
-
/* @__PURE__ */
|
|
69
|
-
/* @__PURE__ */
|
|
70
|
+
/* @__PURE__ */ g(s, { className: "size-8 text-text-muted" }),
|
|
71
|
+
/* @__PURE__ */ g("p", {
|
|
70
72
|
className: "text-sm font-medium text-text-primary",
|
|
71
|
-
children:
|
|
73
|
+
children: T("vibecontrols.agentManager.bookmarksDrawer.empty", "No bookmarks in this session yet")
|
|
72
74
|
}),
|
|
73
|
-
/* @__PURE__ */
|
|
75
|
+
/* @__PURE__ */ g("p", {
|
|
74
76
|
className: "text-xs text-text-secondary max-w-xs",
|
|
75
|
-
children:
|
|
77
|
+
children: T("vibecontrols.agentManager.bookmarksDrawer.emptyHint", "Click the bookmark icon on any message to save it for later.")
|
|
76
78
|
})
|
|
77
79
|
]
|
|
78
80
|
}),
|
|
79
|
-
/* @__PURE__ */
|
|
81
|
+
/* @__PURE__ */ g("ul", {
|
|
80
82
|
className: "divide-y divide-border-subtle",
|
|
81
|
-
children:
|
|
82
|
-
let t =
|
|
83
|
-
return /* @__PURE__ */
|
|
83
|
+
children: L.map((e) => {
|
|
84
|
+
let t = R.get(e.messageId), n = !t, r = k === e.id;
|
|
85
|
+
return /* @__PURE__ */ g("li", {
|
|
84
86
|
className: "px-4 py-3 hover:bg-bg-elevated/40 transition-colors",
|
|
85
|
-
children: /* @__PURE__ */
|
|
87
|
+
children: /* @__PURE__ */ _("div", {
|
|
86
88
|
className: "flex items-start gap-2",
|
|
87
|
-
children: [/* @__PURE__ */
|
|
89
|
+
children: [/* @__PURE__ */ _("div", {
|
|
88
90
|
className: "flex-1 min-w-0",
|
|
89
91
|
children: [
|
|
90
|
-
r ? /* @__PURE__ */
|
|
92
|
+
r ? /* @__PURE__ */ g("input", {
|
|
91
93
|
"aria-label": "control",
|
|
92
|
-
value:
|
|
93
|
-
onChange: (e) =>
|
|
94
|
+
value: j,
|
|
95
|
+
onChange: (e) => M(e.target.value),
|
|
94
96
|
onKeyDown: (t) => {
|
|
95
|
-
t.key === "Enter" &&
|
|
97
|
+
t.key === "Enter" && B(e.id), t.key === "Escape" && (A(null), M(""));
|
|
96
98
|
},
|
|
97
|
-
placeholder:
|
|
99
|
+
placeholder: T("vibecontrols.agentManager.bookmarksDrawer.labelPlaceholder", "Add a label (optional)"),
|
|
98
100
|
className: "w-full bg-bg-sunken border border-border-subtle rounded px-2 py-1 text-xs text-text-primary placeholder:text-text-tertiary focus:outline-none focus:border-action-primary-bg"
|
|
99
|
-
}) : /* @__PURE__ */
|
|
101
|
+
}) : /* @__PURE__ */ g("p", {
|
|
100
102
|
className: "text-sm font-medium text-text-primary truncate",
|
|
101
|
-
children: e.label || (t?.role === "user" ?
|
|
103
|
+
children: e.label || (t?.role === "user" ? T("vibecontrols.agentManager.bookmarksDrawer.fromUser", "From you") : T("vibecontrols.agentManager.bookmarksDrawer.fromAssistant", "Assistant reply"))
|
|
102
104
|
}),
|
|
103
|
-
n ? /* @__PURE__ */
|
|
105
|
+
n ? /* @__PURE__ */ g("p", {
|
|
104
106
|
className: "text-xs text-text-tertiary italic mt-1",
|
|
105
|
-
children:
|
|
106
|
-
}) : /* @__PURE__ */
|
|
107
|
+
children: T("vibecontrols.agentManager.bookmarksDrawer.stale", "Message no longer available")
|
|
108
|
+
}) : /* @__PURE__ */ g("p", {
|
|
107
109
|
className: "text-xs text-text-secondary mt-1 line-clamp-2",
|
|
108
|
-
children:
|
|
110
|
+
children: y(t.content)
|
|
109
111
|
}),
|
|
110
|
-
/* @__PURE__ */
|
|
112
|
+
/* @__PURE__ */ g("p", {
|
|
111
113
|
className: "text-[10px] text-text-tertiary mt-1",
|
|
112
|
-
children:
|
|
114
|
+
children: a(e.createdAt)
|
|
113
115
|
})
|
|
114
116
|
]
|
|
115
|
-
}), /* @__PURE__ */
|
|
117
|
+
}), /* @__PURE__ */ _("div", {
|
|
116
118
|
className: "flex items-center gap-0.5 shrink-0",
|
|
117
119
|
children: [
|
|
118
|
-
!n && !r && /* @__PURE__ */
|
|
120
|
+
!n && !r && /* @__PURE__ */ g("button", {
|
|
119
121
|
type: "button",
|
|
120
122
|
onClick: () => {
|
|
121
|
-
|
|
123
|
+
C(e.messageId), b();
|
|
122
124
|
},
|
|
123
125
|
className: "p-1 rounded hover:bg-bg-sunken transition-colors",
|
|
124
|
-
title:
|
|
125
|
-
"aria-label":
|
|
126
|
-
children: /* @__PURE__ */
|
|
126
|
+
title: T("vibecontrols.agentManager.bookmarksDrawer.jump", "Jump to message"),
|
|
127
|
+
"aria-label": T("vibecontrols.agentManager.bookmarksDrawer.jump", "Jump to message"),
|
|
128
|
+
children: /* @__PURE__ */ g(l, { className: "size-3.5 text-text-secondary" })
|
|
127
129
|
}),
|
|
128
|
-
r ? /* @__PURE__ */
|
|
130
|
+
r ? /* @__PURE__ */ g("button", {
|
|
129
131
|
type: "button",
|
|
130
|
-
onClick: () => void
|
|
132
|
+
onClick: () => void B(e.id),
|
|
131
133
|
className: "p-1 rounded hover:bg-bg-sunken transition-colors",
|
|
132
|
-
"aria-label":
|
|
133
|
-
children: /* @__PURE__ */
|
|
134
|
-
}) : /* @__PURE__ */
|
|
134
|
+
"aria-label": T("vibecontrols.common.save", "Save"),
|
|
135
|
+
children: /* @__PURE__ */ g(c, { className: "size-3.5 text-status-success-text" })
|
|
136
|
+
}) : D ? /* @__PURE__ */ g("button", {
|
|
135
137
|
type: "button",
|
|
136
|
-
onClick: () =>
|
|
138
|
+
onClick: () => z(e.id, e.label),
|
|
137
139
|
className: "p-1 rounded hover:bg-bg-sunken transition-colors",
|
|
138
|
-
"aria-label":
|
|
139
|
-
children: /* @__PURE__ */
|
|
140
|
-
}),
|
|
141
|
-
/* @__PURE__ */
|
|
140
|
+
"aria-label": T("vibecontrols.agentManager.bookmarksDrawer.editLabel", "Edit label"),
|
|
141
|
+
children: /* @__PURE__ */ g(d, { className: "size-3.5 text-text-secondary" })
|
|
142
|
+
}) : null,
|
|
143
|
+
O && /* @__PURE__ */ g("button", {
|
|
142
144
|
type: "button",
|
|
143
|
-
onClick: () => void
|
|
145
|
+
onClick: () => void V(e.id),
|
|
144
146
|
className: "p-1 rounded hover:bg-bg-sunken transition-colors",
|
|
145
|
-
"aria-label":
|
|
146
|
-
children: /* @__PURE__ */
|
|
147
|
+
"aria-label": T("vibecontrols.agentManager.messageItem.removeBookmark", "Remove bookmark"),
|
|
148
|
+
children: /* @__PURE__ */ g(f, { className: "size-3.5 text-status-error-text" })
|
|
147
149
|
})
|
|
148
150
|
]
|
|
149
151
|
})]
|
|
@@ -153,15 +155,15 @@ var v = ({ open: g, onClose: v, sessionId: y, messages: b, onJump: x }) => {
|
|
|
153
155
|
})
|
|
154
156
|
]
|
|
155
157
|
}),
|
|
156
|
-
/* @__PURE__ */
|
|
158
|
+
/* @__PURE__ */ g("footer", {
|
|
157
159
|
className: "px-4 py-3 border-t border-border-default flex-shrink-0",
|
|
158
|
-
children: /* @__PURE__ */
|
|
160
|
+
children: /* @__PURE__ */ _("button", {
|
|
159
161
|
type: "button",
|
|
160
162
|
onClick: () => {
|
|
161
|
-
|
|
163
|
+
b(), w("/vibecontrols/ai/bookmarks");
|
|
162
164
|
},
|
|
163
165
|
className: "inline-flex items-center gap-1.5 text-xs font-medium text-action-primary-text hover:underline",
|
|
164
|
-
children: [/* @__PURE__ */
|
|
166
|
+
children: [/* @__PURE__ */ g(u, { className: "size-3" }), T("vibecontrols.agentManager.bookmarksDrawer.seeAll", "See all bookmarks across sessions")]
|
|
165
167
|
})
|
|
166
168
|
})
|
|
167
169
|
]
|
|
@@ -169,6 +171,6 @@ var v = ({ open: g, onClose: v, sessionId: y, messages: b, onJump: x }) => {
|
|
|
169
171
|
}) : null;
|
|
170
172
|
};
|
|
171
173
|
//#endregion
|
|
172
|
-
export {
|
|
174
|
+
export { b as AgentManagerBookmarksDrawer };
|
|
173
175
|
|
|
174
176
|
//# sourceMappingURL=AgentManagerBookmarksDrawer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AgentManagerBookmarksDrawer.js","names":[],"sources":["../../../src/components/agent-manager/AgentManagerBookmarksDrawer.tsx"],"sourcesContent":["/**\n * Side drawer listing the current user's bookmarks for ONE chat session.\n *\n * Each row resolves its message body from the currently-loaded session\n * messages. When the bookmarked message is no longer in the session\n * (agent log pruning / rotation), the row degrades to a \"Message no\n * longer available\" affordance with a remove-only action.\n */\n\nimport { useState, type FC } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Bookmark, X, ChevronRight, Pencil, Trash2, Check, ExternalLink } from 'lucide-react';\nimport { relativeTime } from '@/utils/relativeTime';\nimport {\n useDeleteAgentMessageBookmarkMutation,\n useMyAgentMessageBookmarksQuery,\n useUpdateAgentMessageBookmarkMutation,\n type AgentMessageBookmarkFieldsFragment,\n} from '../../generated/wspace-operations';\nimport type { AgentManagerMessage } from '@/types/agentManager';\nimport { useTr } from '../../shared/hooks/useTr';\n\ninterface AgentManagerBookmarksDrawerProps {\n open: boolean;\n onClose: () => void;\n sessionId: string;\n messages: AgentManagerMessage[];\n onJump: (messageId: string) => void;\n}\n\nconst PREVIEW_LEN = 80;\n\nfunction snippet(content: string): string {\n if (!content) return '';\n const trimmed = content.trim().replace(/\\s+/g, ' ');\n return trimmed.length > PREVIEW_LEN ? `${trimmed.slice(0, PREVIEW_LEN)}…` : trimmed;\n}\n\nexport const AgentManagerBookmarksDrawer: FC<AgentManagerBookmarksDrawerProps> = ({\n open,\n onClose,\n sessionId,\n messages,\n onJump,\n}) => {\n const navigate = useNavigate();\n const tr = useTr();\n const [editingId, setEditingId] = useState<string | null>(null);\n const [labelDraft, setLabelDraft] = useState('');\n\n const { data, loading } = useMyAgentMessageBookmarksQuery({\n variables: { filter: { sessionId } },\n skip: !open,\n fetchPolicy: 'cache-and-network',\n });\n\n const [updateMutation] = useUpdateAgentMessageBookmarkMutation({\n refetchQueries: ['MyAgentMessageBookmarks'],\n });\n const [deleteMutation] = useDeleteAgentMessageBookmarkMutation({\n refetchQueries: ['MyAgentMessageBookmarks'],\n });\n\n const bookmarks = data?.myAgentMessageBookmarks.items ?? [];\n const messageById = new Map(messages.map((m) => [m.id, m]));\n\n const startEdit = (id: string, current: string | null | undefined) => {\n setEditingId(id);\n setLabelDraft(current ?? '');\n };\n\n const saveEdit = async (id: string) => {\n await updateMutation({ variables: { id, input: { label: labelDraft || null } } });\n setEditingId(null);\n setLabelDraft('');\n };\n\n const removeBookmark = async (id: string) => {\n await deleteMutation({ variables: { id } });\n };\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-40 flex\">\n <div className=\"flex-1 bg-bg-overlay/40\" onClick={onClose} aria-hidden />\n <aside\n className=\"w-full max-w-md h-full bg-bg-surface border-l border-border-default shadow-xl flex flex-col\"\n role=\"dialog\"\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.title',\n 'Bookmarks in this session'\n )}\n data-testid=\"agent-manager-bookmarks-drawer\"\n >\n <header className=\"flex items-center justify-between px-4 py-3 border-b border-border-default flex-shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Bookmark className=\"size-4 text-text-secondary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr('vibecontrols.agentManager.bookmarksDrawer.title', 'Bookmarks in this session')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr('vibecontrols.common.close', 'Close')}\n >\n <X className=\"size-4 text-text-secondary\" />\n </button>\n </header>\n\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {loading && bookmarks.length === 0 && (\n <div className=\"px-4 py-6 text-xs text-text-tertiary\">\n {tr('vibecontrols.common.loading', 'Loading...')}\n </div>\n )}\n\n {!loading && bookmarks.length === 0 && (\n <div className=\"px-4 py-10 flex flex-col items-center text-center gap-2\">\n <Bookmark className=\"size-8 text-text-muted\" />\n <p className=\"text-sm font-medium text-text-primary\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.empty',\n 'No bookmarks in this session yet'\n )}\n </p>\n <p className=\"text-xs text-text-secondary max-w-xs\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.emptyHint',\n 'Click the bookmark icon on any message to save it for later.'\n )}\n </p>\n </div>\n )}\n\n <ul className=\"divide-y divide-border-subtle\">\n {bookmarks.map((bm: AgentMessageBookmarkFieldsFragment) => {\n const msg = messageById.get(bm.messageId);\n const isStale = !msg;\n const isEditing = editingId === bm.id;\n\n return (\n <li key={bm.id} className=\"px-4 py-3 hover:bg-bg-elevated/40 transition-colors\">\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1 min-w-0\">\n {isEditing ? (\n <input\n aria-label=\"control\"\n value={labelDraft}\n onChange={(e) => setLabelDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') void saveEdit(bm.id);\n if (e.key === 'Escape') {\n setEditingId(null);\n setLabelDraft('');\n }\n }}\n placeholder={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.labelPlaceholder',\n 'Add a label (optional)'\n )}\n className=\"w-full bg-bg-sunken border border-border-subtle rounded px-2 py-1 text-xs text-text-primary placeholder:text-text-tertiary focus:outline-none focus:border-action-primary-bg\"\n />\n ) : (\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {bm.label ||\n (msg?.role === 'user'\n ? tr('vibecontrols.agentManager.bookmarksDrawer.fromUser', 'From you')\n : tr(\n 'vibecontrols.agentManager.bookmarksDrawer.fromAssistant',\n 'Assistant reply'\n ))}\n </p>\n )}\n\n {isStale ? (\n <p className=\"text-xs text-text-tertiary italic mt-1\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.stale',\n 'Message no longer available'\n )}\n </p>\n ) : (\n <p className=\"text-xs text-text-secondary mt-1 line-clamp-2\">\n {snippet(msg.content)}\n </p>\n )}\n\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n {relativeTime(bm.createdAt)}\n </p>\n </div>\n\n <div className=\"flex items-center gap-0.5 shrink-0\">\n {!isStale && !isEditing && (\n <button\n type=\"button\"\n onClick={() => {\n onJump(bm.messageId);\n onClose();\n }}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n title={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.jump',\n 'Jump to message'\n )}\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.jump',\n 'Jump to message'\n )}\n >\n <ChevronRight className=\"size-3.5 text-text-secondary\" />\n </button>\n )}\n\n {isEditing ? (\n <button\n type=\"button\"\n onClick={() => void saveEdit(bm.id)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr('vibecontrols.common.save', 'Save')}\n >\n <Check className=\"size-3.5 text-status-success-text\" />\n </button>\n ) : (\n <button\n type=\"button\"\n onClick={() => startEdit(bm.id, bm.label)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.editLabel',\n 'Edit label'\n )}\n >\n <Pencil className=\"size-3.5 text-text-secondary\" />\n </button>\n )}\n\n <button\n type=\"button\"\n onClick={() => void removeBookmark(bm.id)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr(\n 'vibecontrols.agentManager.messageItem.removeBookmark',\n 'Remove bookmark'\n )}\n >\n <Trash2 className=\"size-3.5 text-status-error-text\" />\n </button>\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n\n <footer className=\"px-4 py-3 border-t border-border-default flex-shrink-0\">\n <button\n type=\"button\"\n onClick={() => {\n onClose();\n navigate('/vibecontrols/ai/bookmarks');\n }}\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-action-primary-text hover:underline\"\n >\n <ExternalLink className=\"size-3\" />\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.seeAll',\n 'See all bookmarks across sessions'\n )}\n </button>\n </footer>\n </aside>\n </div>\n );\n};\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AgentManagerBookmarksDrawer.js","names":[],"sources":["../../../src/components/agent-manager/AgentManagerBookmarksDrawer.tsx"],"sourcesContent":["/**\n * Side drawer listing the current user's bookmarks for ONE chat session.\n *\n * Each row resolves its message body from the currently-loaded session\n * messages. When the bookmarked message is no longer in the session\n * (agent log pruning / rotation), the row degrades to a \"Message no\n * longer available\" affordance with a remove-only action.\n */\n\nimport { useState, type FC } from 'react';\nimport { useNavigate } from 'react-router-dom';\nimport { Bookmark, X, ChevronRight, Pencil, Trash2, Check, ExternalLink } from 'lucide-react';\nimport { relativeTime } from '@/utils/relativeTime';\nimport {\n useDeleteAgentMessageBookmarkMutation,\n useMyAgentMessageBookmarksQuery,\n useUpdateAgentMessageBookmarkMutation,\n type AgentMessageBookmarkFieldsFragment,\n} from '../../generated/wspace-operations';\nimport type { AgentManagerMessage } from '@/types/agentManager';\nimport { useTr } from '../../shared/hooks/useTr';\nimport { usePermissions } from '@burdenoff/fe-libs/shared/providers/shell';\nimport { VIBE_PERMISSIONS } from '@/constants/permissions';\n\ninterface AgentManagerBookmarksDrawerProps {\n open: boolean;\n onClose: () => void;\n sessionId: string;\n messages: AgentManagerMessage[];\n onJump: (messageId: string) => void;\n}\n\nconst PREVIEW_LEN = 80;\n\nfunction snippet(content: string): string {\n if (!content) return '';\n const trimmed = content.trim().replace(/\\s+/g, ' ');\n return trimmed.length > PREVIEW_LEN ? `${trimmed.slice(0, PREVIEW_LEN)}…` : trimmed;\n}\n\nexport const AgentManagerBookmarksDrawer: FC<AgentManagerBookmarksDrawerProps> = ({\n open,\n onClose,\n sessionId,\n messages,\n onJump,\n}) => {\n const navigate = useNavigate();\n const tr = useTr();\n const { hasPermission } = usePermissions();\n const canUpdateBookmark = hasPermission(VIBE_PERMISSIONS.AGENT_MESSAGE_BOOKMARK_UPDATE);\n const canDeleteBookmark = hasPermission(VIBE_PERMISSIONS.AGENT_MESSAGE_BOOKMARK_DELETE);\n const [editingId, setEditingId] = useState<string | null>(null);\n const [labelDraft, setLabelDraft] = useState('');\n\n const { data, loading } = useMyAgentMessageBookmarksQuery({\n variables: { filter: { sessionId } },\n skip: !open,\n fetchPolicy: 'cache-and-network',\n });\n\n const [updateMutation] = useUpdateAgentMessageBookmarkMutation({\n refetchQueries: ['MyAgentMessageBookmarks'],\n });\n const [deleteMutation] = useDeleteAgentMessageBookmarkMutation({\n refetchQueries: ['MyAgentMessageBookmarks'],\n });\n\n const bookmarks = data?.myAgentMessageBookmarks.items ?? [];\n const messageById = new Map(messages.map((m) => [m.id, m]));\n\n const startEdit = (id: string, current: string | null | undefined) => {\n setEditingId(id);\n setLabelDraft(current ?? '');\n };\n\n const saveEdit = async (id: string) => {\n await updateMutation({ variables: { id, input: { label: labelDraft || null } } });\n setEditingId(null);\n setLabelDraft('');\n };\n\n const removeBookmark = async (id: string) => {\n await deleteMutation({ variables: { id } });\n };\n\n if (!open) return null;\n\n return (\n <div className=\"fixed inset-0 z-40 flex\">\n <div className=\"flex-1 bg-bg-overlay/40\" onClick={onClose} aria-hidden />\n <aside\n className=\"w-full max-w-md h-full bg-bg-surface border-l border-border-default shadow-xl flex flex-col\"\n role=\"dialog\"\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.title',\n 'Bookmarks in this session'\n )}\n data-testid=\"agent-manager-bookmarks-drawer\"\n >\n <header className=\"flex items-center justify-between px-4 py-3 border-b border-border-default flex-shrink-0\">\n <div className=\"flex items-center gap-2\">\n <Bookmark className=\"size-4 text-text-secondary\" />\n <h3 className=\"text-sm font-semibold text-text-primary\">\n {tr('vibecontrols.agentManager.bookmarksDrawer.title', 'Bookmarks in this session')}\n </h3>\n </div>\n <button\n type=\"button\"\n onClick={onClose}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr('vibecontrols.common.close', 'Close')}\n >\n <X className=\"size-4 text-text-secondary\" />\n </button>\n </header>\n\n <div className=\"flex-1 min-h-0 overflow-y-auto\">\n {loading && bookmarks.length === 0 && (\n <div className=\"px-4 py-6 text-xs text-text-tertiary\">\n {tr('vibecontrols.common.loading', 'Loading...')}\n </div>\n )}\n\n {!loading && bookmarks.length === 0 && (\n <div className=\"px-4 py-10 flex flex-col items-center text-center gap-2\">\n <Bookmark className=\"size-8 text-text-muted\" />\n <p className=\"text-sm font-medium text-text-primary\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.empty',\n 'No bookmarks in this session yet'\n )}\n </p>\n <p className=\"text-xs text-text-secondary max-w-xs\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.emptyHint',\n 'Click the bookmark icon on any message to save it for later.'\n )}\n </p>\n </div>\n )}\n\n <ul className=\"divide-y divide-border-subtle\">\n {bookmarks.map((bm: AgentMessageBookmarkFieldsFragment) => {\n const msg = messageById.get(bm.messageId);\n const isStale = !msg;\n const isEditing = editingId === bm.id;\n\n return (\n <li key={bm.id} className=\"px-4 py-3 hover:bg-bg-elevated/40 transition-colors\">\n <div className=\"flex items-start gap-2\">\n <div className=\"flex-1 min-w-0\">\n {isEditing ? (\n <input\n aria-label=\"control\"\n value={labelDraft}\n onChange={(e) => setLabelDraft(e.target.value)}\n onKeyDown={(e) => {\n if (e.key === 'Enter') void saveEdit(bm.id);\n if (e.key === 'Escape') {\n setEditingId(null);\n setLabelDraft('');\n }\n }}\n placeholder={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.labelPlaceholder',\n 'Add a label (optional)'\n )}\n className=\"w-full bg-bg-sunken border border-border-subtle rounded px-2 py-1 text-xs text-text-primary placeholder:text-text-tertiary focus:outline-none focus:border-action-primary-bg\"\n />\n ) : (\n <p className=\"text-sm font-medium text-text-primary truncate\">\n {bm.label ||\n (msg?.role === 'user'\n ? tr('vibecontrols.agentManager.bookmarksDrawer.fromUser', 'From you')\n : tr(\n 'vibecontrols.agentManager.bookmarksDrawer.fromAssistant',\n 'Assistant reply'\n ))}\n </p>\n )}\n\n {isStale ? (\n <p className=\"text-xs text-text-tertiary italic mt-1\">\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.stale',\n 'Message no longer available'\n )}\n </p>\n ) : (\n <p className=\"text-xs text-text-secondary mt-1 line-clamp-2\">\n {snippet(msg.content)}\n </p>\n )}\n\n <p className=\"text-[10px] text-text-tertiary mt-1\">\n {relativeTime(bm.createdAt)}\n </p>\n </div>\n\n <div className=\"flex items-center gap-0.5 shrink-0\">\n {!isStale && !isEditing && (\n <button\n type=\"button\"\n onClick={() => {\n onJump(bm.messageId);\n onClose();\n }}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n title={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.jump',\n 'Jump to message'\n )}\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.jump',\n 'Jump to message'\n )}\n >\n <ChevronRight className=\"size-3.5 text-text-secondary\" />\n </button>\n )}\n\n {isEditing ? (\n <button\n type=\"button\"\n onClick={() => void saveEdit(bm.id)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr('vibecontrols.common.save', 'Save')}\n >\n <Check className=\"size-3.5 text-status-success-text\" />\n </button>\n ) : canUpdateBookmark ? (\n <button\n type=\"button\"\n onClick={() => startEdit(bm.id, bm.label)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr(\n 'vibecontrols.agentManager.bookmarksDrawer.editLabel',\n 'Edit label'\n )}\n >\n <Pencil className=\"size-3.5 text-text-secondary\" />\n </button>\n ) : null}\n\n {canDeleteBookmark && (\n <button\n type=\"button\"\n onClick={() => void removeBookmark(bm.id)}\n className=\"p-1 rounded hover:bg-bg-sunken transition-colors\"\n aria-label={tr(\n 'vibecontrols.agentManager.messageItem.removeBookmark',\n 'Remove bookmark'\n )}\n >\n <Trash2 className=\"size-3.5 text-status-error-text\" />\n </button>\n )}\n </div>\n </div>\n </li>\n );\n })}\n </ul>\n </div>\n\n <footer className=\"px-4 py-3 border-t border-border-default flex-shrink-0\">\n <button\n type=\"button\"\n onClick={() => {\n onClose();\n navigate('/vibecontrols/ai/bookmarks');\n }}\n className=\"inline-flex items-center gap-1.5 text-xs font-medium text-action-primary-text hover:underline\"\n >\n <ExternalLink className=\"size-3\" />\n {tr(\n 'vibecontrols.agentManager.bookmarksDrawer.seeAll',\n 'See all bookmarks across sessions'\n )}\n </button>\n </footer>\n </aside>\n </div>\n );\n};\n"],"mappings":"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"}
|