@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.
Files changed (45) hide show
  1. package/dist/components/agent-manager/AgentManagerBookmarksDrawer.js +87 -85
  2. package/dist/components/agent-manager/AgentManagerBookmarksDrawer.js.map +1 -1
  3. package/dist/components/ai/InstructionFilesManager.js +138 -136
  4. package/dist/components/ai/InstructionFilesManager.js.map +1 -1
  5. package/dist/components/ai/PluginHarnessPicker.js +70 -64
  6. package/dist/components/ai/PluginHarnessPicker.js.map +1 -1
  7. package/dist/components/docs/DocsEditPanel.js +1 -1
  8. package/dist/components/docs/DocsEditPanel.js.map +1 -1
  9. package/dist/components/docs/DocsPageTree.js +1 -1
  10. package/dist/components/docs/DocsPageTree.js.map +1 -1
  11. package/dist/components/docs/DocsTabPanel.js +108 -106
  12. package/dist/components/docs/DocsTabPanel.js.map +1 -1
  13. package/dist/components/notes/NotesTabPanel.js +99 -99
  14. package/dist/components/notes/NotesTabPanel.js.map +1 -1
  15. package/dist/components/scorecard/ScorecardPanel.js +309 -308
  16. package/dist/components/scorecard/ScorecardPanel.js.map +1 -1
  17. package/dist/components/sessions/SessionPublicLinkPanel.js +104 -102
  18. package/dist/components/sessions/SessionPublicLinkPanel.js.map +1 -1
  19. package/dist/components/settings/AdvancedSection.js +92 -90
  20. package/dist/components/settings/AdvancedSection.js.map +1 -1
  21. package/dist/components/vibedeck/VibeDeckPublicLinkPanel.js +104 -102
  22. package/dist/components/vibedeck/VibeDeckPublicLinkPanel.js.map +1 -1
  23. package/dist/constants/permissions.js +7 -0
  24. package/dist/constants/permissions.js.map +1 -1
  25. package/dist/pages/ActionsPage.js +303 -303
  26. package/dist/pages/ActionsPage.js.map +1 -1
  27. package/dist/pages/AgentDetailsPage.js +520 -516
  28. package/dist/pages/AgentDetailsPage.js.map +1 -1
  29. package/dist/pages/AgentsPage.js +375 -371
  30. package/dist/pages/AgentsPage.js.map +1 -1
  31. package/dist/pages/TargetsPage.js +554 -549
  32. package/dist/pages/TargetsPage.js.map +1 -1
  33. package/dist/pages/VibeAuditPage.js +2 -2
  34. package/dist/pages/VibeAuditPage.js.map +1 -1
  35. package/dist/pages/VibeDeckPage.js +257 -257
  36. package/dist/pages/VibeDeckPage.js.map +1 -1
  37. package/dist/pages/VibeDetailsPage.js +688 -693
  38. package/dist/pages/VibeDetailsPage.js.map +1 -1
  39. package/dist/pages/VibesPage.js +49 -41
  40. package/dist/pages/VibesPage.js.map +1 -1
  41. package/dist/pages/WebhooksPage.js +162 -138
  42. package/dist/pages/WebhooksPage.js.map +1 -1
  43. package/dist/pages/tunnels/DomainsTab.js +54 -47
  44. package/dist/pages/tunnels/DomainsTab.js.map +1 -1
  45. 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 { relativeTime as i } from "../../utils/relativeTime.js";
4
- import { useState as a } from "react";
5
- import { Bookmark as o, Check as s, ChevronRight as c, ExternalLink as l, Pencil as u, Trash2 as d, X as f } from "lucide-react";
6
- import { useNavigate as p } from "react-router-dom";
7
- import { jsx as m, jsxs as h } from "react/jsx-runtime";
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 g = 80;
10
- function _(e) {
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 > g ? `${t.slice(0, g)}…` : t;
15
+ return t.length > v ? `${t.slice(0, v)}…` : t;
14
16
  }
15
- var v = ({ open: g, onClose: v, sessionId: y, messages: b, onJump: x }) => {
16
- let S = p(), C = r(), [w, T] = a(null), [E, D] = a(""), { data: O, loading: k } = t({
17
- variables: { filter: { sessionId: y } },
18
- skip: !g,
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
- }), [A] = n({ refetchQueries: ["MyAgentMessageBookmarks"] }), [j] = e({ refetchQueries: ["MyAgentMessageBookmarks"] }), M = O?.myAgentMessageBookmarks.items ?? [], N = new Map(b.map((e) => [e.id, e])), P = (e, t) => {
21
- T(e), D(t ?? "");
22
- }, F = async (e) => {
23
- await A({ variables: {
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: E || null }
26
- } }), T(null), D("");
27
- }, I = async (e) => {
28
- await j({ variables: { id: e } });
27
+ input: { label: j || null }
28
+ } }), A(null), M("");
29
+ }, V = async (e) => {
30
+ await I({ variables: { id: e } });
29
31
  };
30
- return g ? /* @__PURE__ */ h("div", {
32
+ return v ? /* @__PURE__ */ _("div", {
31
33
  className: "fixed inset-0 z-40 flex",
32
- children: [/* @__PURE__ */ m("div", {
34
+ children: [/* @__PURE__ */ g("div", {
33
35
  className: "flex-1 bg-bg-overlay/40",
34
- onClick: v,
36
+ onClick: b,
35
37
  "aria-hidden": !0
36
- }), /* @__PURE__ */ h("aside", {
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": C("vibecontrols.agentManager.bookmarksDrawer.title", "Bookmarks in this session"),
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__ */ h("header", {
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__ */ h("div", {
46
+ children: [/* @__PURE__ */ _("div", {
45
47
  className: "flex items-center gap-2",
46
- children: [/* @__PURE__ */ m(o, { className: "size-4 text-text-secondary" }), /* @__PURE__ */ m("h3", {
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: C("vibecontrols.agentManager.bookmarksDrawer.title", "Bookmarks in this session")
50
+ children: T("vibecontrols.agentManager.bookmarksDrawer.title", "Bookmarks in this session")
49
51
  })]
50
- }), /* @__PURE__ */ m("button", {
52
+ }), /* @__PURE__ */ g("button", {
51
53
  type: "button",
52
- onClick: v,
54
+ onClick: b,
53
55
  className: "p-1 rounded hover:bg-bg-sunken transition-colors",
54
- "aria-label": C("vibecontrols.common.close", "Close"),
55
- children: /* @__PURE__ */ m(f, { className: "size-4 text-text-secondary" })
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__ */ h("div", {
60
+ /* @__PURE__ */ _("div", {
59
61
  className: "flex-1 min-h-0 overflow-y-auto",
60
62
  children: [
61
- k && M.length === 0 && /* @__PURE__ */ m("div", {
63
+ P && L.length === 0 && /* @__PURE__ */ g("div", {
62
64
  className: "px-4 py-6 text-xs text-text-tertiary",
63
- children: C("vibecontrols.common.loading", "Loading...")
65
+ children: T("vibecontrols.common.loading", "Loading...")
64
66
  }),
65
- !k && M.length === 0 && /* @__PURE__ */ h("div", {
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__ */ m(o, { className: "size-8 text-text-muted" }),
69
- /* @__PURE__ */ m("p", {
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: C("vibecontrols.agentManager.bookmarksDrawer.empty", "No bookmarks in this session yet")
73
+ children: T("vibecontrols.agentManager.bookmarksDrawer.empty", "No bookmarks in this session yet")
72
74
  }),
73
- /* @__PURE__ */ m("p", {
75
+ /* @__PURE__ */ g("p", {
74
76
  className: "text-xs text-text-secondary max-w-xs",
75
- children: C("vibecontrols.agentManager.bookmarksDrawer.emptyHint", "Click the bookmark icon on any message to save it for later.")
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__ */ m("ul", {
81
+ /* @__PURE__ */ g("ul", {
80
82
  className: "divide-y divide-border-subtle",
81
- children: M.map((e) => {
82
- let t = N.get(e.messageId), n = !t, r = w === e.id;
83
- return /* @__PURE__ */ m("li", {
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__ */ h("div", {
87
+ children: /* @__PURE__ */ _("div", {
86
88
  className: "flex items-start gap-2",
87
- children: [/* @__PURE__ */ h("div", {
89
+ children: [/* @__PURE__ */ _("div", {
88
90
  className: "flex-1 min-w-0",
89
91
  children: [
90
- r ? /* @__PURE__ */ m("input", {
92
+ r ? /* @__PURE__ */ g("input", {
91
93
  "aria-label": "control",
92
- value: E,
93
- onChange: (e) => D(e.target.value),
94
+ value: j,
95
+ onChange: (e) => M(e.target.value),
94
96
  onKeyDown: (t) => {
95
- t.key === "Enter" && F(e.id), t.key === "Escape" && (T(null), D(""));
97
+ t.key === "Enter" && B(e.id), t.key === "Escape" && (A(null), M(""));
96
98
  },
97
- placeholder: C("vibecontrols.agentManager.bookmarksDrawer.labelPlaceholder", "Add a label (optional)"),
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__ */ m("p", {
101
+ }) : /* @__PURE__ */ g("p", {
100
102
  className: "text-sm font-medium text-text-primary truncate",
101
- children: e.label || (t?.role === "user" ? C("vibecontrols.agentManager.bookmarksDrawer.fromUser", "From you") : C("vibecontrols.agentManager.bookmarksDrawer.fromAssistant", "Assistant reply"))
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__ */ m("p", {
105
+ n ? /* @__PURE__ */ g("p", {
104
106
  className: "text-xs text-text-tertiary italic mt-1",
105
- children: C("vibecontrols.agentManager.bookmarksDrawer.stale", "Message no longer available")
106
- }) : /* @__PURE__ */ m("p", {
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: _(t.content)
110
+ children: y(t.content)
109
111
  }),
110
- /* @__PURE__ */ m("p", {
112
+ /* @__PURE__ */ g("p", {
111
113
  className: "text-[10px] text-text-tertiary mt-1",
112
- children: i(e.createdAt)
114
+ children: a(e.createdAt)
113
115
  })
114
116
  ]
115
- }), /* @__PURE__ */ h("div", {
117
+ }), /* @__PURE__ */ _("div", {
116
118
  className: "flex items-center gap-0.5 shrink-0",
117
119
  children: [
118
- !n && !r && /* @__PURE__ */ m("button", {
120
+ !n && !r && /* @__PURE__ */ g("button", {
119
121
  type: "button",
120
122
  onClick: () => {
121
- x(e.messageId), v();
123
+ C(e.messageId), b();
122
124
  },
123
125
  className: "p-1 rounded hover:bg-bg-sunken transition-colors",
124
- title: C("vibecontrols.agentManager.bookmarksDrawer.jump", "Jump to message"),
125
- "aria-label": C("vibecontrols.agentManager.bookmarksDrawer.jump", "Jump to message"),
126
- children: /* @__PURE__ */ m(c, { className: "size-3.5 text-text-secondary" })
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__ */ m("button", {
130
+ r ? /* @__PURE__ */ g("button", {
129
131
  type: "button",
130
- onClick: () => void F(e.id),
132
+ onClick: () => void B(e.id),
131
133
  className: "p-1 rounded hover:bg-bg-sunken transition-colors",
132
- "aria-label": C("vibecontrols.common.save", "Save"),
133
- children: /* @__PURE__ */ m(s, { className: "size-3.5 text-status-success-text" })
134
- }) : /* @__PURE__ */ m("button", {
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: () => P(e.id, e.label),
138
+ onClick: () => z(e.id, e.label),
137
139
  className: "p-1 rounded hover:bg-bg-sunken transition-colors",
138
- "aria-label": C("vibecontrols.agentManager.bookmarksDrawer.editLabel", "Edit label"),
139
- children: /* @__PURE__ */ m(u, { className: "size-3.5 text-text-secondary" })
140
- }),
141
- /* @__PURE__ */ m("button", {
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 I(e.id),
145
+ onClick: () => void V(e.id),
144
146
  className: "p-1 rounded hover:bg-bg-sunken transition-colors",
145
- "aria-label": C("vibecontrols.agentManager.messageItem.removeBookmark", "Remove bookmark"),
146
- children: /* @__PURE__ */ m(d, { className: "size-3.5 text-status-error-text" })
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__ */ m("footer", {
158
+ /* @__PURE__ */ g("footer", {
157
159
  className: "px-4 py-3 border-t border-border-default flex-shrink-0",
158
- children: /* @__PURE__ */ h("button", {
160
+ children: /* @__PURE__ */ _("button", {
159
161
  type: "button",
160
162
  onClick: () => {
161
- v(), S("/vibecontrols/ai/bookmarks");
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__ */ m(l, { className: "size-3" }), C("vibecontrols.agentManager.bookmarksDrawer.seeAll", "See all bookmarks across sessions")]
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 { v as AgentManagerBookmarksDrawer };
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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"}