@burtson-labs/agent-ui 1.0.16 → 1.0.18
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/MarkdownMessage.d.ts +46 -0
- package/dist/components/MarkdownMessage.d.ts.map +1 -1
- package/dist/components/MarkdownMessage.js +78 -2
- package/dist/components/MarkdownMessage.js.map +1 -1
- package/dist/components/PermissionCard.d.ts +22 -0
- package/dist/components/PermissionCard.d.ts.map +1 -1
- package/dist/components/PermissionCard.js +6 -3
- package/dist/components/PermissionCard.js.map +1 -1
- package/package.json +8 -5
- package/styles/agent-ui.css +42 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import type { JSX, MouseEvent } from "react";
|
|
2
|
+
import MarkdownIt from "markdown-it";
|
|
2
3
|
export interface MarkdownRenderOptions {
|
|
3
4
|
resolveFileHref?: (reference: string) => string | undefined;
|
|
4
5
|
}
|
|
@@ -12,6 +13,51 @@ export interface MarkdownMessageProps extends MarkdownRenderOptions {
|
|
|
12
13
|
renderHtml?: (content: string) => string;
|
|
13
14
|
onFileReferenceClick?: (reference: string, event: MouseEvent<HTMLDivElement>) => void;
|
|
14
15
|
}
|
|
16
|
+
/**
|
|
17
|
+
* Replace markdown-it's `image` renderer so `` becomes visible text
|
|
18
|
+
* instead of an element that fetches `url` on render.
|
|
19
|
+
*
|
|
20
|
+
* This is the primary control for the exfiltration channel described on
|
|
21
|
+
* REMOTE_CONTENT_TAGS; the sanitizer's FORBID_TAGS is defense in depth behind
|
|
22
|
+
* it. Two reasons it belongs here rather than only at the sanitizer:
|
|
23
|
+
*
|
|
24
|
+
* - It is a pure string transform with no DOM in the loop, so it behaves
|
|
25
|
+
* identically in Node, happy-dom, and the webview's Chromium, and can be
|
|
26
|
+
* tested without any of them.
|
|
27
|
+
* - Sanitizer-level tag removal depends on the host DOM's tree traversal
|
|
28
|
+
* being faithful. Ours is not, in at least one environment: under
|
|
29
|
+
* happy-dom 19, `DOMPurify.sanitize(html, {FORBID_TAGS:['img']})` drops only
|
|
30
|
+
* the FIRST matching element and leaves later siblings in place. That is
|
|
31
|
+
* very likely a happy-dom traversal bug rather than a DOMPurify or Chromium
|
|
32
|
+
* one — but "probably fine in the real browser" is not a foundation to put
|
|
33
|
+
* an exfiltration control on, so the control does not depend on it.
|
|
34
|
+
*
|
|
35
|
+
* Rendering the URL as text keeps the attempt reviewable. A silently deleted
|
|
36
|
+
* beacon looks the same as no beacon.
|
|
37
|
+
*/
|
|
38
|
+
export declare const disableRemoteImages: (md: MarkdownIt) => void;
|
|
15
39
|
export declare const renderMarkdownToHtml: (content: string, options?: MarkdownRenderOptions) => string;
|
|
40
|
+
/**
|
|
41
|
+
* Tags that fetch a remote resource on render, stripped from any markdown the
|
|
42
|
+
* MODEL produced.
|
|
43
|
+
*
|
|
44
|
+
* An `<img>` in assistant markdown is a silent outbound GET the moment it
|
|
45
|
+
* paints — no click, no prompt, no permission card. That turns any prompt
|
|
46
|
+
* injection into an exfiltration channel: content the agent just read (a repo
|
|
47
|
+
* file, a fetched page, an MCP response) instructs it to emit
|
|
48
|
+
* ``, and the panel leaks it on render.
|
|
49
|
+
* The host CSP has to allow `img-src https:` for legitimate product imagery,
|
|
50
|
+
* so the block belongs at the sanitizer.
|
|
51
|
+
*
|
|
52
|
+
* Images are close to worthless in a coding-agent transcript, so the trade is
|
|
53
|
+
* lopsided — and the URL still renders as visible text, which is strictly more
|
|
54
|
+
* reviewable than a hidden 1x1 request.
|
|
55
|
+
*
|
|
56
|
+
* Apply to model-authored markdown ONLY. Trusted first-party content (an
|
|
57
|
+
* extension README, product chrome) renders through its own path and keeps
|
|
58
|
+
* images. User-attached images are React elements, not markdown, and are
|
|
59
|
+
* unaffected.
|
|
60
|
+
*/
|
|
61
|
+
export declare const REMOTE_CONTENT_TAGS: string[];
|
|
16
62
|
export declare const MarkdownMessage: ({ content, className, renderHtml, resolveFileHref, onFileReferenceClick }: MarkdownMessageProps) => JSX.Element;
|
|
17
63
|
//# sourceMappingURL=MarkdownMessage.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownMessage.d.ts","sourceRoot":"","sources":["../../src/components/MarkdownMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"MarkdownMessage.d.ts","sourceRoot":"","sources":["../../src/components/MarkdownMessage.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,OAAO,CAAC;AAK7C,OAAO,UAAU,MAAM,aAAa,CAAC;AAarC,MAAM,WAAW,qBAAqB;IACpC,eAAe,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,MAAM,GAAG,SAAS,CAAC;CAC7D;AAED,MAAM,WAAW,oBAAqB,SAAQ,qBAAqB;IACjE,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,UAAU,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,MAAM,CAAC;IACzC,oBAAoB,CAAC,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,EAAE,UAAU,CAAC,cAAc,CAAC,KAAK,IAAI,CAAC;CACvF;AAqID;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,eAAO,MAAM,mBAAmB,GAAI,IAAI,UAAU,KAAG,IAUpD,CAAC;AAEF,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,UAAU,qBAAqB,KAC9B,MAGF,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,eAAO,MAAM,mBAAmB,UAU/B,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,2EAM7B,oBAAoB,KAAG,GAAG,CAAC,OAkE7B,CAAC"}
|
|
@@ -3,7 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.MarkdownMessage = exports.renderMarkdownToHtml = void 0;
|
|
6
|
+
exports.MarkdownMessage = exports.REMOTE_CONTENT_TAGS = exports.renderMarkdownToHtml = exports.disableRemoteImages = void 0;
|
|
7
7
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
8
|
const react_1 = require("react");
|
|
9
9
|
const core_chat_1 = require("@burtson-labs/core-chat");
|
|
@@ -87,6 +87,12 @@ const createMarkdownRenderer = (options) => {
|
|
|
87
87
|
linkify: true,
|
|
88
88
|
breaks: true
|
|
89
89
|
});
|
|
90
|
+
// No fuzzy links: linkify's bare-domain matching turns FILENAMES into
|
|
91
|
+
// external URLs, because file extensions collide with ccTLDs — README.md
|
|
92
|
+
// is Moldova, main.rs is Serbia, anything .app/.dev/.io "links". A chat
|
|
93
|
+
// full of file references cannot afford that; explicit http(s):// links
|
|
94
|
+
// still linkify, and the file-reference plugin below owns filenames.
|
|
95
|
+
md.linkify.set({ fuzzyLink: false });
|
|
90
96
|
md.options.highlight = (code, language) => {
|
|
91
97
|
if (language && highlight_js_1.default.getLanguage(language)) {
|
|
92
98
|
try {
|
|
@@ -125,20 +131,90 @@ const createMarkdownRenderer = (options) => {
|
|
|
125
131
|
return `<pre><code class="hljs">${escaped}</code></pre>`;
|
|
126
132
|
};
|
|
127
133
|
fileReferencePlugin(md, options?.resolveFileHref);
|
|
134
|
+
(0, exports.disableRemoteImages)(md);
|
|
128
135
|
return md;
|
|
129
136
|
};
|
|
137
|
+
/**
|
|
138
|
+
* Replace markdown-it's `image` renderer so `` becomes visible text
|
|
139
|
+
* instead of an element that fetches `url` on render.
|
|
140
|
+
*
|
|
141
|
+
* This is the primary control for the exfiltration channel described on
|
|
142
|
+
* REMOTE_CONTENT_TAGS; the sanitizer's FORBID_TAGS is defense in depth behind
|
|
143
|
+
* it. Two reasons it belongs here rather than only at the sanitizer:
|
|
144
|
+
*
|
|
145
|
+
* - It is a pure string transform with no DOM in the loop, so it behaves
|
|
146
|
+
* identically in Node, happy-dom, and the webview's Chromium, and can be
|
|
147
|
+
* tested without any of them.
|
|
148
|
+
* - Sanitizer-level tag removal depends on the host DOM's tree traversal
|
|
149
|
+
* being faithful. Ours is not, in at least one environment: under
|
|
150
|
+
* happy-dom 19, `DOMPurify.sanitize(html, {FORBID_TAGS:['img']})` drops only
|
|
151
|
+
* the FIRST matching element and leaves later siblings in place. That is
|
|
152
|
+
* very likely a happy-dom traversal bug rather than a DOMPurify or Chromium
|
|
153
|
+
* one — but "probably fine in the real browser" is not a foundation to put
|
|
154
|
+
* an exfiltration control on, so the control does not depend on it.
|
|
155
|
+
*
|
|
156
|
+
* Rendering the URL as text keeps the attempt reviewable. A silently deleted
|
|
157
|
+
* beacon looks the same as no beacon.
|
|
158
|
+
*/
|
|
159
|
+
const disableRemoteImages = (md) => {
|
|
160
|
+
md.renderer.rules.image = (tokens, idx) => {
|
|
161
|
+
const token = tokens[idx];
|
|
162
|
+
const src = token.attrGet?.('src') ?? '';
|
|
163
|
+
const alt = typeof token.content === 'string' ? token.content : '';
|
|
164
|
+
const label = alt ? `${alt}: ${src}` : src;
|
|
165
|
+
return `<span class="bandit-blocked-image" title="Image not loaded">`
|
|
166
|
+
+ `[image] ${md.utils.escapeHtml(label)}`
|
|
167
|
+
+ `</span>`;
|
|
168
|
+
};
|
|
169
|
+
};
|
|
170
|
+
exports.disableRemoteImages = disableRemoteImages;
|
|
130
171
|
const renderMarkdownToHtml = (content, options) => {
|
|
131
172
|
const md = createMarkdownRenderer(options);
|
|
132
173
|
return md.render(content);
|
|
133
174
|
};
|
|
134
175
|
exports.renderMarkdownToHtml = renderMarkdownToHtml;
|
|
176
|
+
/**
|
|
177
|
+
* Tags that fetch a remote resource on render, stripped from any markdown the
|
|
178
|
+
* MODEL produced.
|
|
179
|
+
*
|
|
180
|
+
* An `<img>` in assistant markdown is a silent outbound GET the moment it
|
|
181
|
+
* paints — no click, no prompt, no permission card. That turns any prompt
|
|
182
|
+
* injection into an exfiltration channel: content the agent just read (a repo
|
|
183
|
+
* file, a fetched page, an MCP response) instructs it to emit
|
|
184
|
+
* ``, and the panel leaks it on render.
|
|
185
|
+
* The host CSP has to allow `img-src https:` for legitimate product imagery,
|
|
186
|
+
* so the block belongs at the sanitizer.
|
|
187
|
+
*
|
|
188
|
+
* Images are close to worthless in a coding-agent transcript, so the trade is
|
|
189
|
+
* lopsided — and the URL still renders as visible text, which is strictly more
|
|
190
|
+
* reviewable than a hidden 1x1 request.
|
|
191
|
+
*
|
|
192
|
+
* Apply to model-authored markdown ONLY. Trusted first-party content (an
|
|
193
|
+
* extension README, product chrome) renders through its own path and keeps
|
|
194
|
+
* images. User-attached images are React elements, not markdown, and are
|
|
195
|
+
* unaffected.
|
|
196
|
+
*/
|
|
197
|
+
exports.REMOTE_CONTENT_TAGS = [
|
|
198
|
+
"img",
|
|
199
|
+
"picture",
|
|
200
|
+
"source",
|
|
201
|
+
"video",
|
|
202
|
+
"audio",
|
|
203
|
+
"iframe",
|
|
204
|
+
"object",
|
|
205
|
+
"embed",
|
|
206
|
+
"link"
|
|
207
|
+
];
|
|
135
208
|
const MarkdownMessage = ({ content, className, renderHtml, resolveFileHref, onFileReferenceClick }) => {
|
|
136
209
|
const sanitizedContent = (0, react_1.useMemo)(() => (0, core_chat_1.sanitizeModelOutput)(content), [content]);
|
|
137
210
|
const html = (0, react_1.useMemo)(() => {
|
|
138
211
|
const rendered = renderHtml
|
|
139
212
|
? renderHtml(sanitizedContent)
|
|
140
213
|
: (0, exports.renderMarkdownToHtml)(sanitizedContent, { resolveFileHref });
|
|
141
|
-
return dompurify_1.default.sanitize(rendered, {
|
|
214
|
+
return dompurify_1.default.sanitize(rendered, {
|
|
215
|
+
ADD_ATTR: ["data-file-ref", "target", "rel"],
|
|
216
|
+
FORBID_TAGS: exports.REMOTE_CONTENT_TAGS
|
|
217
|
+
});
|
|
142
218
|
}, [renderHtml, resolveFileHref, sanitizedContent]);
|
|
143
219
|
// Morph the new HTML into the existing DOM instead of replacing
|
|
144
220
|
// innerHTML wholesale. `el.innerHTML = html` (what
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"MarkdownMessage.js","sourceRoot":"","sources":["../../src/components/MarkdownMessage.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"MarkdownMessage.js","sourceRoot":"","sources":["../../src/components/MarkdownMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -48,6 +48,28 @@ export interface BanditPermissionPayload {
|
|
|
48
48
|
* (apply_edit find/replace, git_checkout branch name, etc).
|
|
49
49
|
*/
|
|
50
50
|
paramsPreview?: string;
|
|
51
|
+
/**
|
|
52
|
+
* Risk tier from the shared classifier: `routine` | `elevated` | `critical`.
|
|
53
|
+
* Drives the card's visual weight — users approve dozens of these a session,
|
|
54
|
+
* and if a delete renders identically to a file read the card stops being
|
|
55
|
+
* read at all.
|
|
56
|
+
*/
|
|
57
|
+
tier?: string;
|
|
58
|
+
/**
|
|
59
|
+
* What each grant scope would actually authorize, keyed by choice. Rendered
|
|
60
|
+
* as the button's hint so the user reads the blast radius before clicking.
|
|
61
|
+
* Generated host-side by `grantRuleFor` — the same call that computes the
|
|
62
|
+
* rule that gets stored, so the card cannot promise one scope and save
|
|
63
|
+
* another. Falls back to the static hints below when absent.
|
|
64
|
+
*/
|
|
65
|
+
scopeHints?: Record<string, string>;
|
|
66
|
+
/**
|
|
67
|
+
* True when a saved allow rule already covered this call but the
|
|
68
|
+
* critical-tier floor overrode it. Without saying so, the user sees a prompt
|
|
69
|
+
* for something they believe they already approved and concludes the grant
|
|
70
|
+
* is broken.
|
|
71
|
+
*/
|
|
72
|
+
flooredByRisk?: boolean;
|
|
51
73
|
}
|
|
52
74
|
export type PermissionChoice = "once" | "session" | "save" | "deny";
|
|
53
75
|
export interface PermissionCardProps {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionCard.d.ts","sourceRoot":"","sources":["../../src/components/PermissionCard.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAG9D;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;
|
|
1
|
+
{"version":3,"file":"PermissionCard.d.ts","sourceRoot":"","sources":["../../src/components/PermissionCard.tsx"],"names":[],"mappings":"AAAA,OAAO,EAA+B,KAAK,GAAG,EAAE,MAAM,OAAO,CAAC;AAG9D;;;;;;;GAOG;AACH,MAAM,WAAW,uBAAuB;IACtC,IAAI,EAAE,mBAAmB,CAAC;IAC1B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;OAKG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;OAIG;IACH,SAAS,CAAC,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,CAAC;IAC/C;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC;;;;;OAKG;IACH,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,MAAM,CAAC;AAEpE,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,uBAAuB,CAAC;IACjC;;;;;OAKG;IACH,QAAQ,EAAE,CAAC,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,gBAAgB,EAAE,KAAK,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC1E;AAoBD,eAAO,MAAM,cAAc,GAAI,uBAAuB,mBAAmB,KAAG,GAAG,CAAC,OA+L/E,CAAC"}
|
|
@@ -15,10 +15,13 @@ const clsx_1 = __importDefault(require("clsx"));
|
|
|
15
15
|
* persists across restarts via .bandit/settings.json.
|
|
16
16
|
*/
|
|
17
17
|
const CHOICE_ORDER = ["once", "session", "save", "deny"];
|
|
18
|
+
// Fallback hints. When the host supplies `scopeHints` these are replaced with
|
|
19
|
+
// the real blast radius of the rule that would be stored — "Always for target"
|
|
20
|
+
// was actively misleading, since the stored rule was the binary, not the target.
|
|
18
21
|
const CHOICE_LABELS = {
|
|
19
22
|
once: { label: "Allow once", hint: "Run this single tool call", key: "1" },
|
|
20
|
-
session: { label: "Allow session", hint: "Allow this
|
|
21
|
-
save: { label: "Always
|
|
23
|
+
session: { label: "Allow session", hint: "Allow calls like this until you close the window", key: "2" },
|
|
24
|
+
save: { label: "Always allow", hint: "Save the rule to .bandit/settings.json", key: "3" },
|
|
22
25
|
deny: { label: "Deny", hint: "Abort the tool call", key: "4" }
|
|
23
26
|
};
|
|
24
27
|
const PermissionCard = ({ payload, onChoice }) => {
|
|
@@ -96,7 +99,7 @@ const PermissionCard = ({ payload, onChoice }) => {
|
|
|
96
99
|
const hasCommand = typeof payload.command === "string" && payload.command.trim().length > 0;
|
|
97
100
|
const hasParams = !hasCommand && typeof payload.paramsPreview === "string" && payload.paramsPreview.trim().length > 0;
|
|
98
101
|
const hasDiff = !hasCommand && !hasParams && typeof payload.bodyPreview === "string" && payload.bodyPreview.trim().length > 0;
|
|
99
|
-
return ((0, jsx_runtime_1.jsxs)("div", { ref: cardRef, tabIndex: -1, className: (0, clsx_1.default)("permission-card", resolved && "is-resolved", resolved === "deny" && "is-denied"), role: "group", "aria-label": `Permission prompt for ${payload.tool}`, onKeyDown: handleKeyDown, children: [(0, jsx_runtime_1.jsxs)("div", { className: "permission-card__header", children: [(0, jsx_runtime_1.jsx)("div", { className: "permission-card__icon", "aria-hidden": "true", children: "!" }), (0, jsx_runtime_1.jsx)("div", { className: "permission-card__title", children: (0, jsx_runtime_1.jsxs)("div", { className: "permission-card__tool", children: ["Allow this ", (0, jsx_runtime_1.jsx)("code", { children: payload.tool }), "?"] }) })] }), hasCommand && ((0, jsx_runtime_1.jsx)("pre", { className: "permission-card__command", "aria-label": "Command to run", children: (0, jsx_runtime_1.jsx)("code", { children: payload.command }) })), hasParams && ((0, jsx_runtime_1.jsx)("pre", { className: "permission-card__command", "aria-label": "Tool parameters", children: (0, jsx_runtime_1.jsx)("code", { children: payload.paramsPreview }) })), payload.description && payload.description !== `${payload.tool} ${payload.primary}`.trim() && ((0, jsx_runtime_1.jsx)("div", { className: "permission-card__desc", children: payload.description })), payload.risk && ((0, jsx_runtime_1.jsxs)("div", { className: "permission-card__risk", children: [(0, jsx_runtime_1.jsx)("span", { className: "permission-card__risk-label", children: "Risk" }), (0, jsx_runtime_1.jsx)("span", { children: payload.risk })] })), payload.warning && ((0, jsx_runtime_1.jsxs)("div", { className: "permission-card__warning", role: "alert", children: [(0, jsx_runtime_1.jsx)("span", { className: "permission-card__warning-icon", "aria-hidden": "true", children: "\u26A0" }), (0, jsx_runtime_1.jsx)("span", { children: payload.warning })] })), hasDiff && ((0, jsx_runtime_1.jsx)(CollapsibleDiff, { preview: payload.bodyPreview, stats: payload.diffStats })), (0, jsx_runtime_1.jsx)("div", { className: "permission-card__choices", role: "radiogroup", "aria-label": "Approval choices", children: CHOICE_ORDER.map((choice) => ((0, jsx_runtime_1.jsxs)("button", { type: "button", className: (0, clsx_1.default)("permission-card__choice", `permission-card__choice--${choice}`, resolved === choice && "is-selected"), disabled: resolved !== null, onClick: () => pick(choice, choice === "deny" ? notesDraft : undefined), title: CHOICE_LABELS[choice].hint, role: "radio", "aria-checked": resolved === choice, children: [(0, jsx_runtime_1.jsx)("span", { className: "permission-card__choice-key", "aria-hidden": "true", children: CHOICE_LABELS[choice].key }), (0, jsx_runtime_1.jsx)("span", { className: "permission-card__choice-label", children: CHOICE_LABELS[choice].label })] }, choice))) }), !resolved && ((0, jsx_runtime_1.jsxs)("div", { className: "permission-card__notes", children: [(0, jsx_runtime_1.jsx)("textarea", { className: "permission-card__notes-input", value: notesDraft, onChange: (e) => setNotesDraft(e.target.value), onKeyDown: handleNotesKeyDown, placeholder: "Tell Bandit what to do instead (optional)", rows: 2 }), (0, jsx_runtime_1.jsx)("span", { className: "permission-card__notes-hint", children: "Esc to cancel \u00B7 Cmd+Enter to deny with notes" })] })), resolved && ((0, jsx_runtime_1.jsx)("div", { className: "permission-card__resolved", role: "status", children: resolved === "deny"
|
|
102
|
+
return ((0, jsx_runtime_1.jsxs)("div", { ref: cardRef, tabIndex: -1, className: (0, clsx_1.default)("permission-card", resolved && "is-resolved", resolved === "deny" && "is-denied"), role: "group", "aria-label": `Permission prompt for ${payload.tool}`, onKeyDown: handleKeyDown, children: [(0, jsx_runtime_1.jsxs)("div", { className: "permission-card__header", children: [(0, jsx_runtime_1.jsx)("div", { className: "permission-card__icon", "aria-hidden": "true", children: "!" }), (0, jsx_runtime_1.jsx)("div", { className: "permission-card__title", children: (0, jsx_runtime_1.jsxs)("div", { className: "permission-card__tool", children: ["Allow this ", (0, jsx_runtime_1.jsx)("code", { children: payload.tool }), "?"] }) })] }), hasCommand && ((0, jsx_runtime_1.jsx)("pre", { className: "permission-card__command", "aria-label": "Command to run", children: (0, jsx_runtime_1.jsx)("code", { children: payload.command }) })), hasParams && ((0, jsx_runtime_1.jsx)("pre", { className: "permission-card__command", "aria-label": "Tool parameters", children: (0, jsx_runtime_1.jsx)("code", { children: payload.paramsPreview }) })), payload.description && payload.description !== `${payload.tool} ${payload.primary}`.trim() && ((0, jsx_runtime_1.jsx)("div", { className: "permission-card__desc", children: payload.description })), payload.risk && ((0, jsx_runtime_1.jsxs)("div", { className: (0, clsx_1.default)("permission-card__risk", payload.tier && `permission-card__risk--${payload.tier}`), children: [(0, jsx_runtime_1.jsx)("span", { className: "permission-card__risk-label", children: payload.tier === "critical" ? "Destructive" : "Risk" }), (0, jsx_runtime_1.jsx)("span", { children: payload.risk })] })), payload.flooredByRisk && ((0, jsx_runtime_1.jsxs)("div", { className: "permission-card__warning", role: "alert", children: [(0, jsx_runtime_1.jsx)("span", { className: "permission-card__warning-icon", "aria-hidden": "true", children: "\u26A0" }), (0, jsx_runtime_1.jsx)("span", { children: "An existing allow rule covers this call, but destructive actions always ask." })] })), payload.warning && ((0, jsx_runtime_1.jsxs)("div", { className: "permission-card__warning", role: "alert", children: [(0, jsx_runtime_1.jsx)("span", { className: "permission-card__warning-icon", "aria-hidden": "true", children: "\u26A0" }), (0, jsx_runtime_1.jsx)("span", { children: payload.warning })] })), hasDiff && ((0, jsx_runtime_1.jsx)(CollapsibleDiff, { preview: payload.bodyPreview, stats: payload.diffStats })), (0, jsx_runtime_1.jsx)("div", { className: "permission-card__choices", role: "radiogroup", "aria-label": "Approval choices", children: CHOICE_ORDER.map((choice) => ((0, jsx_runtime_1.jsxs)("button", { type: "button", className: (0, clsx_1.default)("permission-card__choice", `permission-card__choice--${choice}`, resolved === choice && "is-selected"), disabled: resolved !== null, onClick: () => pick(choice, choice === "deny" ? notesDraft : undefined), title: payload.scopeHints?.[choice] ?? CHOICE_LABELS[choice].hint, role: "radio", "aria-checked": resolved === choice, children: [(0, jsx_runtime_1.jsx)("span", { className: "permission-card__choice-key", "aria-hidden": "true", children: CHOICE_LABELS[choice].key }), (0, jsx_runtime_1.jsx)("span", { className: "permission-card__choice-label", children: CHOICE_LABELS[choice].label })] }, choice))) }), !resolved && payload.scopeHints && ((0, jsx_runtime_1.jsx)("div", { className: "permission-card__scopes", children: CHOICE_ORDER.filter((ch) => ch !== "deny" && payload.scopeHints?.[ch]).map((ch) => ((0, jsx_runtime_1.jsxs)("div", { className: "permission-card__scope", children: [(0, jsx_runtime_1.jsx)("span", { className: "permission-card__scope-key", children: CHOICE_LABELS[ch].key }), (0, jsx_runtime_1.jsx)("span", { className: "permission-card__scope-text", children: payload.scopeHints?.[ch] })] }, ch))) })), !resolved && ((0, jsx_runtime_1.jsxs)("div", { className: "permission-card__notes", children: [(0, jsx_runtime_1.jsx)("textarea", { className: "permission-card__notes-input", value: notesDraft, onChange: (e) => setNotesDraft(e.target.value), onKeyDown: handleNotesKeyDown, placeholder: "Tell Bandit what to do instead (optional)", rows: 2 }), (0, jsx_runtime_1.jsx)("span", { className: "permission-card__notes-hint", children: "Esc to cancel \u00B7 Cmd+Enter to deny with notes" })] })), resolved && ((0, jsx_runtime_1.jsx)("div", { className: "permission-card__resolved", role: "status", children: resolved === "deny"
|
|
100
103
|
? (resolvedNotes ? `Denied · "${resolvedNotes}"` : "Denied")
|
|
101
104
|
: resolved === "save" ? "Allowed (saved to .bandit/settings.json)"
|
|
102
105
|
: resolved === "session" ? "Allowed for this session"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PermissionCard.js","sourceRoot":"","sources":["../../src/components/PermissionCard.tsx"],"names":[],"mappings":";;;;;;;AAAA,iCAA8D;AAC9D,gDAAwB;
|
|
1
|
+
{"version":3,"file":"PermissionCard.js","sourceRoot":"","sources":["../../src/components/PermissionCard.tsx"],"names":[],"mappings":";;;;;;;AAAA,iCAA8D;AAC9D,gDAAwB;AAqFxB;;;;;;GAMG;AACH,MAAM,YAAY,GAAuB,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;AAC7E,8EAA8E;AAC9E,+EAA+E;AAC/E,iFAAiF;AACjF,MAAM,aAAa,GAA2E;IAC5F,IAAI,EAAE,EAAE,KAAK,EAAE,YAAY,EAAE,IAAI,EAAE,2BAA2B,EAAE,GAAG,EAAE,GAAG,EAAE;IAC1E,OAAO,EAAE,EAAE,KAAK,EAAE,eAAe,EAAE,IAAI,EAAE,kDAAkD,EAAE,GAAG,EAAE,GAAG,EAAE;IACvG,IAAI,EAAE,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,wCAAwC,EAAE,GAAG,EAAE,GAAG,EAAE;IACzF,IAAI,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,IAAI,EAAE,qBAAqB,EAAE,GAAG,EAAE,GAAG,EAAE;CAC/D,CAAC;AAEK,MAAM,cAAc,GAAG,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAuB,EAAe,EAAE;IACxF,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,IAAA,gBAAQ,EAA0B,IAAI,CAAC,CAAC;IACxE,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,IAAA,gBAAQ,EAAqB,SAAS,CAAC,CAAC;IAClF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,IAAA,gBAAQ,EAAS,EAAE,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAA,cAAM,EAAwB,IAAI,CAAC,CAAC;IACpD,sEAAsE;IACtE,mEAAmE;IACnE,qDAAqD;IACrD,IAAA,iBAAS,EAAC,GAAG,EAAE;QACb,IAAI,CAAC,QAAQ,EAAE,CAAC;YAAA,OAAO,CAAC,OAAO,EAAE,KAAK,EAAE,CAAC;QAAA,CAAC;IAC5C,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,IAAI,GAAG,CAAC,MAAwB,EAAE,KAAc,EAAQ,EAAE;QAC9D,IAAI,QAAQ,EAAE,CAAC;YAAA,OAAO;QAAA,CAAC;QACvB,MAAM,OAAO,GAAG,KAAK,EAAE,IAAI,EAAE,IAAI,SAAS,CAAC;QAC3C,WAAW,CAAC,MAAM,CAAC,CAAC;QACpB,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC1B,QAAQ,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,CAAC,CAAsC,EAAQ,EAAE;QACrE,IAAI,QAAQ,EAAE,CAAC;YAAA,OAAO;QAAA,CAAC;QACvB,yEAAyE;QACzE,iEAAiE;QACjE,+DAA+D;QAC/D,MAAM,MAAM,GAAG,CAAC,CAAC,MAA4B,CAAC;QAC9C,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,KAAK,UAAU,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;QACxF,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;gBAAC,CAAC,CAAC,cAAc,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAChE,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;gBAAC,CAAC,CAAC,cAAc,EAAE,CAAC;gBAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YACnE,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;gBAAC,CAAC,CAAC,cAAc,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;YAChE,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,EAAE,CAAC;gBAAC,CAAC,CAAC,cAAc,EAAE,CAAC;gBAAC,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;gBAAC,OAAO;YAAC,CAAC;QAC9E,CAAC;QACD,IAAI,CAAC,CAAC,GAAG,KAAK,QAAQ,EAAE,CAAC;YACvB,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,kBAAkB,GAAG,CAAC,CAA2C,EAAQ,EAAE;QAC/E,mEAAmE;QACnE,iEAAiE;QACjE,IAAI,CAAC,CAAC,GAAG,KAAK,OAAO,IAAI,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;YAClD,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC,CAAC;IAEF,gEAAgE;IAChE,kEAAkE;IAClE,+DAA+D;IAC/D,kEAAkE;IAClE,+DAA+D;IAC/D,oEAAoE;IACpE,MAAM,UAAU,GAAG,OAAO,OAAO,CAAC,OAAO,KAAK,QAAQ,IAAI,OAAO,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAC5F,MAAM,SAAS,GAAG,CAAC,UAAU,IAAI,OAAO,OAAO,CAAC,aAAa,KAAK,QAAQ,IAAI,OAAO,CAAC,aAAa,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IACtH,MAAM,OAAO,GAAG,CAAC,UAAU,IAAI,CAAC,SAAS,IAAI,OAAO,OAAO,CAAC,WAAW,KAAK,QAAQ,IAAI,OAAO,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC,CAAC;IAE9H,OAAO,CACL,iCACE,GAAG,EAAE,OAAO,EACZ,QAAQ,EAAE,CAAC,CAAC,EACZ,SAAS,EAAE,IAAA,cAAI,EAAC,iBAAiB,EAAE,QAAQ,IAAI,aAAa,EAAE,QAAQ,KAAK,MAAM,IAAI,WAAW,CAAC,EACjG,IAAI,EAAC,OAAO,gBACA,yBAAyB,OAAO,CAAC,IAAI,EAAE,EACnD,SAAS,EAAE,aAAa,aAExB,iCAAK,SAAS,EAAC,yBAAyB,aACtC,gCAAK,SAAS,EAAC,uBAAuB,iBAAa,MAAM,kBAAQ,EACjE,gCAAK,SAAS,EAAC,wBAAwB,YACrC,iCAAK,SAAS,EAAC,uBAAuB,4BACzB,2CAAO,OAAO,CAAC,IAAI,GAAQ,SAClC,GACF,IACF,EAEL,UAAU,IAAI,CACb,gCAAK,SAAS,EAAC,0BAA0B,gBAAY,gBAAgB,YACnE,2CAAO,OAAO,CAAC,OAAO,GAAQ,GAC1B,CACP,EACA,SAAS,IAAI,CACZ,gCAAK,SAAS,EAAC,0BAA0B,gBAAY,iBAAiB,YACpE,2CAAO,OAAO,CAAC,aAAa,GAAQ,GAChC,CACP,EAEA,OAAO,CAAC,WAAW,IAAI,OAAO,CAAC,WAAW,KAAK,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAC7F,gCAAK,SAAS,EAAC,uBAAuB,YAAE,OAAO,CAAC,WAAW,GAAO,CACnE,EAEA,OAAO,CAAC,IAAI,IAAI,CACf,iCAAK,SAAS,EAAE,IAAA,cAAI,EAAC,uBAAuB,EAAE,OAAO,CAAC,IAAI,IAAI,0BAA0B,OAAO,CAAC,IAAI,EAAE,CAAC,aACrG,iCAAM,SAAS,EAAC,6BAA6B,YAC1C,OAAO,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,GAChD,EACP,2CAAO,OAAO,CAAC,IAAI,GAAQ,IACvB,CACP,EAKA,OAAO,CAAC,aAAa,IAAI,CACxB,iCAAK,SAAS,EAAC,0BAA0B,EAAC,IAAI,EAAC,OAAO,aACpD,iCAAM,SAAS,EAAC,+BAA+B,iBAAa,MAAM,uBAAS,EAC3E,4HAEO,IACH,CACP,EAEA,OAAO,CAAC,OAAO,IAAI,CAClB,iCAAK,SAAS,EAAC,0BAA0B,EAAC,IAAI,EAAC,OAAO,aACpD,iCAAM,SAAS,EAAC,+BAA+B,iBAAa,MAAM,uBAAS,EAC3E,2CAAO,OAAO,CAAC,OAAO,GAAQ,IAC1B,CACP,EAEA,OAAO,IAAI,CACV,uBAAC,eAAe,IAAC,OAAO,EAAE,OAAO,CAAC,WAAY,EAAE,KAAK,EAAE,OAAO,CAAC,SAAS,GAAI,CAC7E,EAED,gCAAK,SAAS,EAAC,0BAA0B,EAAC,IAAI,EAAC,YAAY,gBAAY,kBAAkB,YACtF,YAAY,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAC5B,oCAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAA,cAAI,EACb,yBAAyB,EACzB,4BAA4B,MAAM,EAAE,EACpC,QAAQ,KAAK,MAAM,IAAI,aAAa,CACrC,EACD,QAAQ,EAAE,QAAQ,KAAK,IAAI,EAC3B,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,MAAM,KAAK,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,EACvE,KAAK,EAAE,OAAO,CAAC,UAAU,EAAE,CAAC,MAAM,CAAC,IAAI,aAAa,CAAC,MAAM,CAAC,CAAC,IAAI,EACjE,IAAI,EAAC,OAAO,kBACE,QAAQ,KAAK,MAAM,aAEjC,iCAAM,SAAS,EAAC,6BAA6B,iBAAa,MAAM,YAC7D,aAAa,CAAC,MAAM,CAAC,CAAC,GAAG,GACrB,EACP,iCAAM,SAAS,EAAC,+BAA+B,YAC5C,aAAa,CAAC,MAAM,CAAC,CAAC,KAAK,GACvB,KAlBF,MAAM,CAmBJ,CACV,CAAC,GACE,EAML,CAAC,QAAQ,IAAI,OAAO,CAAC,UAAU,IAAI,CAClC,gCAAK,SAAS,EAAC,yBAAyB,YACrC,YAAY,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,KAAK,MAAM,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAClF,iCAAc,SAAS,EAAC,wBAAwB,aAC9C,iCAAM,SAAS,EAAC,4BAA4B,YAAE,aAAa,CAAC,EAAE,CAAC,CAAC,GAAG,GAAQ,EAC3E,iCAAM,SAAS,EAAC,6BAA6B,YAAE,OAAO,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,GAAQ,KAFvE,EAAE,CAGN,CACP,CAAC,GACE,CACP,EAEA,CAAC,QAAQ,IAAI,CACZ,iCAAK,SAAS,EAAC,wBAAwB,aACrC,qCACE,SAAS,EAAC,8BAA8B,EACxC,KAAK,EAAE,UAAU,EACjB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAC9C,SAAS,EAAE,kBAAkB,EAC7B,WAAW,EAAC,2CAA2C,EACvD,IAAI,EAAE,CAAC,GACP,EACF,iCAAM,SAAS,EAAC,6BAA6B,kEAEtC,IACH,CACP,EAEA,QAAQ,IAAI,CACX,gCAAK,SAAS,EAAC,2BAA2B,EAAC,IAAI,EAAC,QAAQ,YACrD,QAAQ,KAAK,MAAM;oBAClB,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,aAAa,aAAa,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC;oBAC5D,CAAC,CAAC,QAAQ,KAAK,MAAM,CAAC,CAAC,CAAC,0CAA0C;wBAClE,CAAC,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,0BAA0B;4BACrD,CAAC,CAAC,cAAc,GACd,CACP,IACG,CACP,CAAC;AACJ,CAAC,CAAC;AA/LW,QAAA,cAAc,kBA+LzB;AAEF;;;;;;GAMG;AACH,SAAS,eAAe,CAAC,EACvB,OAAO,EACP,KAAK,EAIN;IACC,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,IAAA,gBAAQ,EAAU,KAAK,CAAC,CAAC;IACzD,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,WAAW,EAAE,GAAG,cAAc,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvE,OAAO,CACL,iCAAK,SAAS,EAAE,IAAA,cAAI,EAAC,uBAAuB,EAAE,QAAQ,IAAI,aAAa,CAAC,aACtE,oCACE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAC,+BAA+B,EACzC,OAAO,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,mBACpB,QAAQ,gBACX,QAAQ,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,aAAa,aAEtD,iCAAM,SAAS,EAAC,6BAA6B,yBAAgB,EAC5D,CAAC,KAAK,GAAG,CAAC,IAAI,OAAO,GAAG,CAAC,CAAC,IAAI,CAC7B,kCAAM,SAAS,EAAC,6BAA6B,aAC1C,KAAK,GAAG,CAAC,IAAI,kCAAM,SAAS,EAAC,6BAA6B,kBAAG,KAAK,IAAQ,EAC1E,OAAO,GAAG,CAAC,IAAI,kCAAM,SAAS,EAAC,+BAA+B,kBAAG,OAAO,IAAQ,IAC5E,CACR,EACA,CAAC,QAAQ,IAAI,WAAW,IAAI,CAC3B,iCAAM,SAAS,EAAC,kCAAkC,EAAC,KAAK,EAAE,WAAW,YAClE,WAAW,GACP,CACR,EACD,iCAAM,SAAS,EAAC,+BAA+B,iBAAa,MAAM,YAC/D,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,GAChB,IACA,EACR,QAAQ,IAAI,CACX,gCAAK,SAAS,EAAC,0BAA0B,YACvC,2CAAO,OAAO,GAAQ,GAClB,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,SAAS,cAAc,CACrB,OAAe,EACf,KAA0C;IAE1C,IAAI,KAAK,EAAE,CAAC;QACV,MAAM,WAAW,GAAG,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC9C,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,CAAC;YACjC,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,EAAE,GAAG,CAAC;YACrC,WAAW;SACZ,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,OAAO,GAAG,CAAC,CAAC;IAChB,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QAC1C,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAAA,KAAK,EAAE,CAAC;QAAA,CAAC;aAC1D,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;YAAA,OAAO,EAAE,CAAC;QAAA,CAAC;IACxE,CAAC;IACD,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,GAAG,CAAC;QAC3B,OAAO,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,EAAE,GAAG,CAAC;QAC/B,WAAW,EAAE,gBAAgB,CAAC,OAAO,CAAC;KACvC,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CAAC,OAAe;IACvC,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC;QAC9B,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;YACvD,CAAC,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YAC5D,MAAM,IAAI,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACrC,IAAI,IAAI,EAAE,CAAC;gBAAA,OAAO,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;YAAA,CAAC;QACvE,CAAC;IACH,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@burtson-labs/agent-ui",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.18",
|
|
4
4
|
"author": {
|
|
5
5
|
"name": "Burtson Labs",
|
|
6
6
|
"email": "team@burtson.ai",
|
|
@@ -33,8 +33,8 @@
|
|
|
33
33
|
"highlight.js": "^11.10.0",
|
|
34
34
|
"markdown-it": "^14.2.0",
|
|
35
35
|
"morphdom": "^2.7.4",
|
|
36
|
-
"@burtson-labs/core-chat": "1.0.
|
|
37
|
-
"@burtson-labs/agent-core": "1.6.
|
|
36
|
+
"@burtson-labs/core-chat": "1.0.10",
|
|
37
|
+
"@burtson-labs/agent-core": "1.6.21"
|
|
38
38
|
},
|
|
39
39
|
"peerDependencies": {
|
|
40
40
|
"@emotion/react": ">=11.0.0",
|
|
@@ -48,8 +48,10 @@
|
|
|
48
48
|
"@types/markdown-it": "^14.1.2",
|
|
49
49
|
"@types/react": "19.2.2",
|
|
50
50
|
"clsx": "^2.1.0",
|
|
51
|
+
"happy-dom": "^19.0.2",
|
|
51
52
|
"react": "19.2.0",
|
|
52
|
-
"react-dom": "19.2.0"
|
|
53
|
+
"react-dom": "19.2.0",
|
|
54
|
+
"vitest": "^4.0.10"
|
|
53
55
|
},
|
|
54
56
|
"keywords": [
|
|
55
57
|
"ai",
|
|
@@ -70,6 +72,7 @@
|
|
|
70
72
|
"build": "tsc -p tsconfig.build.json",
|
|
71
73
|
"dev": "tsc -p tsconfig.build.json --watch",
|
|
72
74
|
"lint": "eslint \"src/**/*.{ts,tsx}\"",
|
|
73
|
-
"clean": "rm -rf dist"
|
|
75
|
+
"clean": "rm -rf dist",
|
|
76
|
+
"test": "vitest run"
|
|
74
77
|
}
|
|
75
78
|
}
|
package/styles/agent-ui.css
CHANGED
|
@@ -2414,6 +2414,48 @@
|
|
|
2414
2414
|
min-width: 0;
|
|
2415
2415
|
overflow-wrap: anywhere;
|
|
2416
2416
|
}
|
|
2417
|
+
/* Tier weighting. Users approve dozens of cards a session; if a delete looks
|
|
2418
|
+
identical to a file read, the card stops being read at all. Routine calls
|
|
2419
|
+
recede, critical ones take the error color and a rule to break the scan. */
|
|
2420
|
+
.permission-card__risk--routine .permission-card__risk-label {
|
|
2421
|
+
color: var(--agent-ui-text-dim, rgba(148, 163, 184, 0.85));
|
|
2422
|
+
}
|
|
2423
|
+
.permission-card__risk--critical {
|
|
2424
|
+
padding: 0.35rem 0.55rem;
|
|
2425
|
+
border-left: 3px solid var(--agent-ui-error, #f87171);
|
|
2426
|
+
background: color-mix(in srgb, var(--agent-ui-error, #f87171) 10%, transparent);
|
|
2427
|
+
border-radius: 4px;
|
|
2428
|
+
}
|
|
2429
|
+
.permission-card__risk--critical .permission-card__risk-label {
|
|
2430
|
+
color: var(--agent-ui-error, #f87171);
|
|
2431
|
+
}
|
|
2432
|
+
|
|
2433
|
+
/* Blast radius per grant scope, shown under the buttons rather than hidden in
|
|
2434
|
+
a tooltip — the whole point is that the user reads it BEFORE clicking. */
|
|
2435
|
+
.permission-card__scopes {
|
|
2436
|
+
margin: 0.5rem 0 0.15rem;
|
|
2437
|
+
display: flex;
|
|
2438
|
+
flex-direction: column;
|
|
2439
|
+
gap: 0.2rem;
|
|
2440
|
+
font-size: 0.78em;
|
|
2441
|
+
line-height: 1.4;
|
|
2442
|
+
color: var(--agent-ui-text-dim, rgba(148, 163, 184, 0.85));
|
|
2443
|
+
}
|
|
2444
|
+
.permission-card__scope {
|
|
2445
|
+
display: flex;
|
|
2446
|
+
gap: 0.45rem;
|
|
2447
|
+
align-items: baseline;
|
|
2448
|
+
}
|
|
2449
|
+
.permission-card__scope-key {
|
|
2450
|
+
flex: 0 0 auto;
|
|
2451
|
+
min-width: 1em;
|
|
2452
|
+
font-variant-numeric: tabular-nums;
|
|
2453
|
+
opacity: 0.75;
|
|
2454
|
+
}
|
|
2455
|
+
.permission-card__scope-text {
|
|
2456
|
+
min-width: 0;
|
|
2457
|
+
overflow-wrap: anywhere;
|
|
2458
|
+
}
|
|
2417
2459
|
.permission-card__preview {
|
|
2418
2460
|
margin: 0.5rem 0 0.6rem;
|
|
2419
2461
|
padding: 0.5rem 0.75rem;
|