@burtson-labs/agent-ui 1.0.11
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/LICENSE +201 -0
- package/README.md +45 -0
- package/dist/components/AgentConsole.d.ts +11 -0
- package/dist/components/AgentConsole.d.ts.map +1 -0
- package/dist/components/AgentConsole.js +139 -0
- package/dist/components/AgentConsole.js.map +1 -0
- package/dist/components/AgentSummaryCard.d.ts +9 -0
- package/dist/components/AgentSummaryCard.d.ts.map +1 -0
- package/dist/components/AgentSummaryCard.js +96 -0
- package/dist/components/AgentSummaryCard.js.map +1 -0
- package/dist/components/ChatComposer.d.ts +134 -0
- package/dist/components/ChatComposer.d.ts.map +1 -0
- package/dist/components/ChatComposer.js +411 -0
- package/dist/components/ChatComposer.js.map +1 -0
- package/dist/components/ChatConversation.d.ts +28 -0
- package/dist/components/ChatConversation.d.ts.map +1 -0
- package/dist/components/ChatConversation.js +82 -0
- package/dist/components/ChatConversation.js.map +1 -0
- package/dist/components/ChatMessage.d.ts +38 -0
- package/dist/components/ChatMessage.d.ts.map +1 -0
- package/dist/components/ChatMessage.js +208 -0
- package/dist/components/ChatMessage.js.map +1 -0
- package/dist/components/DiffBlock.d.ts +7 -0
- package/dist/components/DiffBlock.d.ts.map +1 -0
- package/dist/components/DiffBlock.js +58 -0
- package/dist/components/DiffBlock.js.map +1 -0
- package/dist/components/DiffReview/DiffBlock.d.ts +7 -0
- package/dist/components/DiffReview/DiffBlock.d.ts.map +1 -0
- package/dist/components/DiffReview/DiffBlock.js +13 -0
- package/dist/components/DiffReview/DiffBlock.js.map +1 -0
- package/dist/components/DiffReview/DiffFileGroup.d.ts +14 -0
- package/dist/components/DiffReview/DiffFileGroup.d.ts.map +1 -0
- package/dist/components/DiffReview/DiffFileGroup.js +44 -0
- package/dist/components/DiffReview/DiffFileGroup.js.map +1 -0
- package/dist/components/DiffReview/DiffReviewPanel.d.ts +16 -0
- package/dist/components/DiffReview/DiffReviewPanel.d.ts.map +1 -0
- package/dist/components/DiffReview/DiffReviewPanel.js +25 -0
- package/dist/components/DiffReview/DiffReviewPanel.js.map +1 -0
- package/dist/components/DiffReview/index.d.ts +3 -0
- package/dist/components/DiffReview/index.d.ts.map +1 -0
- package/dist/components/DiffReview/index.js +19 -0
- package/dist/components/DiffReview/index.js.map +1 -0
- package/dist/components/DiffReviewCard.d.ts +10 -0
- package/dist/components/DiffReviewCard.d.ts.map +1 -0
- package/dist/components/DiffReviewCard.js +36 -0
- package/dist/components/DiffReviewCard.js.map +1 -0
- package/dist/components/DiffStream.d.ts +12 -0
- package/dist/components/DiffStream.d.ts.map +1 -0
- package/dist/components/DiffStream.js +43 -0
- package/dist/components/DiffStream.js.map +1 -0
- package/dist/components/MarkdownMessage.d.ts +17 -0
- package/dist/components/MarkdownMessage.d.ts.map +1 -0
- package/dist/components/MarkdownMessage.js +158 -0
- package/dist/components/MarkdownMessage.js.map +1 -0
- package/dist/components/PermissionCard.d.ts +64 -0
- package/dist/components/PermissionCard.d.ts.map +1 -0
- package/dist/components/PermissionCard.js +156 -0
- package/dist/components/PermissionCard.js.map +1 -0
- package/dist/components/PlanActivity.d.ts +20 -0
- package/dist/components/PlanActivity.d.ts.map +1 -0
- package/dist/components/PlanActivity.js +186 -0
- package/dist/components/PlanActivity.js.map +1 -0
- package/dist/components/PlanTree.d.ts +13 -0
- package/dist/components/PlanTree.d.ts.map +1 -0
- package/dist/components/PlanTree.js +70 -0
- package/dist/components/PlanTree.js.map +1 -0
- package/dist/components/TaskList.d.ts +9 -0
- package/dist/components/TaskList.d.ts.map +1 -0
- package/dist/components/TaskList.js +26 -0
- package/dist/components/TaskList.js.map +1 -0
- package/dist/components/TelemetryPanel.d.ts +9 -0
- package/dist/components/TelemetryPanel.d.ts.map +1 -0
- package/dist/components/TelemetryPanel.js +54 -0
- package/dist/components/TelemetryPanel.js.map +1 -0
- package/dist/components/index.d.ts +15 -0
- package/dist/components/index.d.ts.map +1 -0
- package/dist/components/index.js +31 -0
- package/dist/components/index.js.map +1 -0
- package/dist/context/BanditContext.d.ts +14 -0
- package/dist/context/BanditContext.d.ts.map +1 -0
- package/dist/context/BanditContext.js +18 -0
- package/dist/context/BanditContext.js.map +1 -0
- package/dist/context/index.d.ts +2 -0
- package/dist/context/index.d.ts.map +1 -0
- package/dist/context/index.js +18 -0
- package/dist/context/index.js.map +1 -0
- package/dist/hooks/index.d.ts +3 -0
- package/dist/hooks/index.d.ts.map +1 -0
- package/dist/hooks/index.js +19 -0
- package/dist/hooks/index.js.map +1 -0
- package/dist/hooks/useAgentEvents.d.ts +13 -0
- package/dist/hooks/useAgentEvents.d.ts.map +1 -0
- package/dist/hooks/useAgentEvents.js +54 -0
- package/dist/hooks/useAgentEvents.js.map +1 -0
- package/dist/hooks/useTelemetry.d.ts +4 -0
- package/dist/hooks/useTelemetry.d.ts.map +1 -0
- package/dist/hooks/useTelemetry.js +198 -0
- package/dist/hooks/useTelemetry.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +29 -0
- package/dist/index.js.map +1 -0
- package/dist/theme/BanditThemeProvider.d.ts +26 -0
- package/dist/theme/BanditThemeProvider.d.ts.map +1 -0
- package/dist/theme/BanditThemeProvider.js +138 -0
- package/dist/theme/BanditThemeProvider.js.map +1 -0
- package/dist/theme/catppuccin-mocha.json +23 -0
- package/dist/theme/charcoal.json +23 -0
- package/dist/theme/dark.json +23 -0
- package/dist/theme/dracula.json +23 -0
- package/dist/theme/index.d.ts +5 -0
- package/dist/theme/index.d.ts.map +1 -0
- package/dist/theme/index.js +21 -0
- package/dist/theme/index.js.map +1 -0
- package/dist/theme/light.json +23 -0
- package/dist/theme/midnight.json +23 -0
- package/dist/theme/nord.json +23 -0
- package/dist/theme/onyx.json +23 -0
- package/dist/theme/sepia.json +23 -0
- package/dist/theme/solarized-dark.json +23 -0
- package/dist/theme/solarized-light.json +23 -0
- package/dist/theme/theme-base.d.ts +37 -0
- package/dist/theme/theme-base.d.ts.map +1 -0
- package/dist/theme/theme-base.js +141 -0
- package/dist/theme/theme-base.js.map +1 -0
- package/dist/theme/theme-registry.d.ts +22 -0
- package/dist/theme/theme-registry.d.ts.map +1 -0
- package/dist/theme/theme-registry.js +52 -0
- package/dist/theme/theme-registry.js.map +1 -0
- package/dist/theme/tokyo-night.json +23 -0
- package/dist/theme/vscode-theme.d.ts +3 -0
- package/dist/theme/vscode-theme.d.ts.map +1 -0
- package/dist/theme/vscode-theme.js +128 -0
- package/dist/theme/vscode-theme.js.map +1 -0
- package/dist/types/ui-schema.d.ts +114 -0
- package/dist/types/ui-schema.d.ts.map +1 -0
- package/dist/types/ui-schema.js +3 -0
- package/dist/types/ui-schema.js.map +1 -0
- package/dist/utils/classNames.d.ts +2 -0
- package/dist/utils/classNames.d.ts.map +1 -0
- package/dist/utils/classNames.js +8 -0
- package/dist/utils/classNames.js.map +1 -0
- package/package.json +55 -0
- package/styles/agent-ui.css +3844 -0
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import type { JSX } from "react";
|
|
2
|
+
export interface DiffItem {
|
|
3
|
+
filePath: string;
|
|
4
|
+
diffText: string;
|
|
5
|
+
added?: number;
|
|
6
|
+
removed?: number;
|
|
7
|
+
confidence?: number;
|
|
8
|
+
review?: string | null;
|
|
9
|
+
}
|
|
10
|
+
export interface DiffReviewPanelProps {
|
|
11
|
+
diffs: DiffItem[];
|
|
12
|
+
onCopyDiff?: (filePath: string, diffText: string) => void;
|
|
13
|
+
onOpenFile?: (filePath: string) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare const DiffReviewPanel: ({ diffs, onCopyDiff, onOpenFile }: DiffReviewPanelProps) => JSX.Element | null;
|
|
16
|
+
//# sourceMappingURL=DiffReviewPanel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffReviewPanel.d.ts","sourceRoot":"","sources":["../../../src/components/DiffReview/DiffReviewPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAGjC,MAAM,WAAW,QAAQ;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;IAC1D,UAAU,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;CACzC;AAiBD,eAAO,MAAM,eAAe,GAAI,mCAI7B,oBAAoB,KAAG,GAAG,CAAC,OAAO,GAAG,IA+BvC,CAAC"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DiffReviewPanel = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const DiffFileGroup_1 = require("./DiffFileGroup");
|
|
6
|
+
const aggregateTotals = (items) => {
|
|
7
|
+
return items.reduce((acc, item) => {
|
|
8
|
+
if (typeof item.added === "number" && Number.isFinite(item.added)) {
|
|
9
|
+
acc.added += item.added;
|
|
10
|
+
}
|
|
11
|
+
if (typeof item.removed === "number" && Number.isFinite(item.removed)) {
|
|
12
|
+
acc.removed += item.removed;
|
|
13
|
+
}
|
|
14
|
+
return acc;
|
|
15
|
+
}, { added: 0, removed: 0 });
|
|
16
|
+
};
|
|
17
|
+
const DiffReviewPanel = ({ diffs, onCopyDiff, onOpenFile }) => {
|
|
18
|
+
if (!Array.isArray(diffs) || diffs.length === 0) {
|
|
19
|
+
return null;
|
|
20
|
+
}
|
|
21
|
+
const totals = aggregateTotals(diffs);
|
|
22
|
+
return ((0, jsx_runtime_1.jsxs)("section", { className: "diff-review-panel", "aria-label": "Diff review", children: [(0, jsx_runtime_1.jsxs)("header", { className: "diff-review-header", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("p", { className: "diff-review-eyebrow", children: "Diff Review" }), (0, jsx_runtime_1.jsx)("h4", { className: "diff-review-title", children: "Proposed changes" })] }), (0, jsx_runtime_1.jsxs)("span", { className: "diff-review-metrics", children: ["Total \u0394 +", totals.added, " / -", totals.removed] })] }), (0, jsx_runtime_1.jsx)("div", { className: "diff-review-list", children: diffs.map((diff, index) => ((0, jsx_runtime_1.jsx)(DiffFileGroup_1.DiffFileGroup, { ...diff, defaultOpen: index === 0, onCopyDiff: onCopyDiff, onOpenFile: onOpenFile }, diff.filePath))) })] }));
|
|
23
|
+
};
|
|
24
|
+
exports.DiffReviewPanel = DiffReviewPanel;
|
|
25
|
+
//# sourceMappingURL=DiffReviewPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffReviewPanel.js","sourceRoot":"","sources":["../../../src/components/DiffReview/DiffReviewPanel.tsx"],"names":[],"mappings":";;;;AACA,mDAAgD;AAiBhD,MAAM,eAAe,GAAG,CAAC,KAAiB,EAAsC,EAAE;IAChF,OAAO,KAAK,CAAC,MAAM,CACjB,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE;QACZ,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAClE,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC;QAC1B,CAAC;QACD,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;YACtE,GAAG,CAAC,OAAO,IAAI,IAAI,CAAC,OAAO,CAAC;QAC9B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EACD,EAAE,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CACzB,CAAC;AACJ,CAAC,CAAC;AAEK,MAAM,eAAe,GAAG,CAAC,EAC9B,KAAK,EACL,UAAU,EACV,UAAU,EACW,EAAsB,EAAE;IAC7C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,CAAC;IAEtC,OAAO,CACL,qCAAS,SAAS,EAAC,mBAAmB,gBAAY,aAAa,aAC7D,oCAAQ,SAAS,EAAC,oBAAoB,aACpC,4CACE,8BAAG,SAAS,EAAC,qBAAqB,4BAAgB,EAClD,+BAAI,SAAS,EAAC,mBAAmB,iCAAsB,IACnD,EACN,kCAAM,SAAS,EAAC,qBAAqB,+BACzB,MAAM,CAAC,KAAK,UAAM,MAAM,CAAC,OAAO,IACrC,IACA,EACT,gCAAK,SAAS,EAAC,kBAAkB,YAC9B,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAC1B,uBAAC,6BAAa,OAER,IAAI,EACR,WAAW,EAAE,KAAK,KAAK,CAAC,EACxB,UAAU,EAAE,UAAU,EACtB,UAAU,EAAE,UAAU,IAJjB,IAAI,CAAC,QAAQ,CAKlB,CACH,CAAC,GACE,IACE,CACX,CAAC;AACJ,CAAC,CAAC;AAnCW,QAAA,eAAe,mBAmC1B"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/components/DiffReview/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,mBAAmB,CAAC"}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
14
|
+
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
15
|
+
};
|
|
16
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
|
+
__exportStar(require("./DiffFileGroup"), exports);
|
|
18
|
+
__exportStar(require("./DiffReviewPanel"), exports);
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/components/DiffReview/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,oDAAkC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import type { JSX } from "react";
|
|
2
|
+
import type { DiffReviewPayload } from "../types/ui-schema";
|
|
3
|
+
export interface DiffReviewCardProps {
|
|
4
|
+
data: DiffReviewPayload;
|
|
5
|
+
onAction?: (action: "apply" | "explain" | "discard") => void;
|
|
6
|
+
onCopyDiff?: (path: string) => void;
|
|
7
|
+
state?: DiffReviewPayload["state"];
|
|
8
|
+
}
|
|
9
|
+
export declare const DiffReviewCard: ({ data, onAction, state }: DiffReviewCardProps) => JSX.Element;
|
|
10
|
+
//# sourceMappingURL=DiffReviewCard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffReviewCard.d.ts","sourceRoot":"","sources":["../../src/components/DiffReviewCard.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,oBAAoB,CAAC;AAE5D,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,iBAAiB,CAAC;IACxB,QAAQ,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,GAAG,SAAS,GAAG,SAAS,KAAK,IAAI,CAAC;IAC7D,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,iBAAiB,CAAC,OAAO,CAAC,CAAC;CACpC;AAED,eAAO,MAAM,cAAc,GAAI,2BAI5B,mBAAmB,KAAG,GAAG,CAAC,OA4D5B,CAAC"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DiffReviewCard = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const classNames_1 = require("../utils/classNames");
|
|
6
|
+
const DiffReviewCard = ({ data, onAction, state = data.state ?? "pending" }) => {
|
|
7
|
+
const actions = [
|
|
8
|
+
{ label: "Apply", action: "apply", variant: "primary" },
|
|
9
|
+
{ label: "Explain", action: "explain", variant: "secondary" }
|
|
10
|
+
];
|
|
11
|
+
if (data.hasBackup) {
|
|
12
|
+
actions.push({ label: "Discard", action: "discard", variant: "danger" });
|
|
13
|
+
}
|
|
14
|
+
const handleAction = (action) => {
|
|
15
|
+
if (state === "pending") {
|
|
16
|
+
onAction?.(action);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
const statusMessage = () => {
|
|
20
|
+
switch (state) {
|
|
21
|
+
case "apply":
|
|
22
|
+
return "Changes applied.";
|
|
23
|
+
case "explain":
|
|
24
|
+
return "Explaining changes in chat.";
|
|
25
|
+
case "discard":
|
|
26
|
+
return "Changes discarded.";
|
|
27
|
+
case "error":
|
|
28
|
+
return data.message ?? "Unable to perform that action.";
|
|
29
|
+
default:
|
|
30
|
+
return "";
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
return ((0, jsx_runtime_1.jsx)("article", { className: "message assistant diff-review", "data-state": state, children: (0, jsx_runtime_1.jsx)("div", { className: "message-body assistant", children: (0, jsx_runtime_1.jsxs)("div", { className: "message-content", children: [(0, jsx_runtime_1.jsxs)("header", { className: "diff-review-header", children: [(0, jsx_runtime_1.jsx)("span", { className: "diff-review-badge", children: "Review" }), (0, jsx_runtime_1.jsx)("code", { className: "diff-review-path", children: data.path })] }), (0, jsx_runtime_1.jsx)("p", { className: "diff-review-message", children: data.message ?? "Choose how to handle the proposed changes." }), (0, jsx_runtime_1.jsx)("div", { className: "diff-review-actions", children: actions.map(({ label, action, variant }) => ((0, jsx_runtime_1.jsx)("button", { type: "button", className: (0, classNames_1.classNames)("diff-review-button", `diff-review-${variant}`, state !== "pending" && "pending"), disabled: state !== "pending", onClick: () => handleAction(action), children: label }, action))) }), statusMessage() && (0, jsx_runtime_1.jsx)("p", { className: "diff-review-status", children: statusMessage() })] }) }) }));
|
|
34
|
+
};
|
|
35
|
+
exports.DiffReviewCard = DiffReviewCard;
|
|
36
|
+
//# sourceMappingURL=DiffReviewCard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffReviewCard.js","sourceRoot":"","sources":["../../src/components/DiffReviewCard.tsx"],"names":[],"mappings":";;;;AACA,oDAAiD;AAU1C,MAAM,cAAc,GAAG,CAAC,EAC7B,IAAI,EACJ,QAAQ,EACR,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,SAAS,EACX,EAAe,EAAE;IACrC,MAAM,OAAO,GAAuF;QAClG,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE;QACvD,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,WAAW,EAAE;KAC9D,CAAC;IAEF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACnB,OAAO,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IAC3E,CAAC;IAED,MAAM,YAAY,GAAG,CAAC,MAAuC,EAAQ,EAAE;QACrE,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,QAAQ,EAAE,CAAC,MAAM,CAAC,CAAC;QACrB,CAAC;IACH,CAAC,CAAC;IAEF,MAAM,aAAa,GAAG,GAAW,EAAE;QACjC,QAAQ,KAAK,EAAE,CAAC;YACd,KAAK,OAAO;gBACV,OAAO,kBAAkB,CAAC;YAC5B,KAAK,SAAS;gBACZ,OAAO,6BAA6B,CAAC;YACvC,KAAK,SAAS;gBACZ,OAAO,oBAAoB,CAAC;YAC9B,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,OAAO,IAAI,gCAAgC,CAAC;YAC1D;gBACE,OAAO,EAAE,CAAC;QACd,CAAC;IACH,CAAC,CAAC;IAEF,OAAO,CACL,oCAAS,SAAS,EAAC,+BAA+B,gBAAa,KAAK,YAClE,gCAAK,SAAS,EAAC,wBAAwB,YACrC,iCAAK,SAAS,EAAC,iBAAiB,aAC9B,oCAAQ,SAAS,EAAC,oBAAoB,aACpC,iCAAM,SAAS,EAAC,mBAAmB,uBAAc,EACjD,iCAAM,SAAS,EAAC,kBAAkB,YAAE,IAAI,CAAC,IAAI,GAAQ,IAC9C,EACT,8BAAG,SAAS,EAAC,qBAAqB,YAC/B,IAAI,CAAC,OAAO,IAAI,4CAA4C,GAC3D,EACJ,gCAAK,SAAS,EAAC,qBAAqB,YACjC,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC,CAC3C,mCAEE,IAAI,EAAC,QAAQ,EACb,SAAS,EAAE,IAAA,uBAAU,EAAC,oBAAoB,EAAE,eAAe,OAAO,EAAE,EAAE,KAAK,KAAK,SAAS,IAAI,SAAS,CAAC,EACvG,QAAQ,EAAE,KAAK,KAAK,SAAS,EAC7B,OAAO,EAAE,GAAG,EAAE,CAAC,YAAY,CAAC,MAAM,CAAC,YAElC,KAAK,IAND,MAAM,CAOJ,CACV,CAAC,GACE,EACL,aAAa,EAAE,IAAI,8BAAG,SAAS,EAAC,oBAAoB,YAAE,aAAa,EAAE,GAAK,IACvE,GACF,GACE,CACX,CAAC;AACJ,CAAC,CAAC;AAhEW,QAAA,cAAc,kBAgEzB"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { JSX, ReactNode } from "react";
|
|
2
|
+
import type { AgentEvent } from "@burtson-labs/agent-core";
|
|
3
|
+
interface DiffStreamProps {
|
|
4
|
+
events?: AgentEvent[];
|
|
5
|
+
limit?: number;
|
|
6
|
+
emptyState?: ReactNode;
|
|
7
|
+
title?: string;
|
|
8
|
+
className?: string;
|
|
9
|
+
}
|
|
10
|
+
export declare const DiffStream: ({ events, limit, emptyState, title, className }: DiffStreamProps) => JSX.Element;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=DiffStream.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffStream.d.ts","sourceRoot":"","sources":["../../src/components/DiffStream.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,GAAG,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,KAAK,EAAa,UAAU,EAAa,MAAM,0BAA0B,CAAC;AAKjF,UAAU,eAAe;IACvB,MAAM,CAAC,EAAE,UAAU,EAAE,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,SAAS,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAwCD,eAAO,MAAM,UAAU,GAAI,iDAMxB,eAAe,KAAG,GAAG,CAAC,OAkDxB,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DiffStream = void 0;
|
|
4
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
|
+
const react_1 = require("react");
|
|
6
|
+
const classNames_1 = require("../utils/classNames");
|
|
7
|
+
const DiffBlock_1 = require("./DiffBlock");
|
|
8
|
+
const toEntries = (events, limit) => {
|
|
9
|
+
const diffEvents = events.filter((event) => event.type === "diff:apply");
|
|
10
|
+
const entries = [];
|
|
11
|
+
for (const event of diffEvents) {
|
|
12
|
+
const payload = event.payload;
|
|
13
|
+
if (!payload?.diff?.length) {
|
|
14
|
+
continue;
|
|
15
|
+
}
|
|
16
|
+
payload.diff.forEach((diff, index) => {
|
|
17
|
+
entries.push({
|
|
18
|
+
id: `${event.timestamp}:${diff.path}:${index}`,
|
|
19
|
+
timestamp: event.timestamp,
|
|
20
|
+
stepId: payload.step?.id,
|
|
21
|
+
stepTitle: payload.step?.title,
|
|
22
|
+
diff
|
|
23
|
+
});
|
|
24
|
+
});
|
|
25
|
+
}
|
|
26
|
+
if (typeof limit === "number" && limit > 0) {
|
|
27
|
+
return entries.slice(-limit);
|
|
28
|
+
}
|
|
29
|
+
return entries;
|
|
30
|
+
};
|
|
31
|
+
const formatDiffLabel = (diff) => {
|
|
32
|
+
const verb = diff.type === "create" ? "Created" : diff.type === "delete" ? "Deleted" : "Updated";
|
|
33
|
+
return `${verb} ${diff.path}`;
|
|
34
|
+
};
|
|
35
|
+
const DiffStream = ({ events = [], limit = 25, emptyState, title = "Live Diffs", className }) => {
|
|
36
|
+
const entries = (0, react_1.useMemo)(() => toEntries(events, limit), [events, limit]);
|
|
37
|
+
if (!entries.length) {
|
|
38
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: (0, classNames_1.classNames)("agent-ui-panel agent-ui-empty-state", className), children: emptyState ?? (0, jsx_runtime_1.jsx)("p", { children: "No diffs have been streamed yet." }) }));
|
|
39
|
+
}
|
|
40
|
+
return ((0, jsx_runtime_1.jsxs)("div", { className: (0, classNames_1.classNames)("agent-ui-panel agent-ui-diff-stream", className), children: [(0, jsx_runtime_1.jsxs)("header", { className: "agent-ui-panel__header", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("p", { className: "agent-ui-panel__eyebrow", children: title }), (0, jsx_runtime_1.jsx)("h3", { className: "agent-ui-panel__title", children: "Recent file activity" })] }), (0, jsx_runtime_1.jsxs)("span", { className: "agent-ui-panel__meta", children: ["Showing ", entries.length, " recent change", entries.length === 1 ? "" : "s"] })] }), (0, jsx_runtime_1.jsx)("div", { className: "agent-ui-diff-stream__list", children: entries.map((entry) => ((0, jsx_runtime_1.jsxs)("article", { className: "agent-ui-diff-card", "data-type": entry.diff.type, children: [(0, jsx_runtime_1.jsxs)("div", { className: "agent-ui-diff-card__header", children: [(0, jsx_runtime_1.jsxs)("div", { children: [(0, jsx_runtime_1.jsx)("p", { className: "agent-ui-plan-step__title", children: entry.diff.path }), entry.stepTitle && ((0, jsx_runtime_1.jsxs)("p", { className: "agent-ui-plan-step__description", children: ["Step: ", entry.stepTitle] }))] }), (0, jsx_runtime_1.jsx)("span", { className: "agent-ui-badge", children: entry.diff.type })] }), entry.diff.preview && ((0, jsx_runtime_1.jsx)(DiffBlock_1.DiffBlock, { source: entry.diff.preview, className: "agent-ui-diff-preview" })), !entry.diff.preview && ((0, jsx_runtime_1.jsx)("p", { className: "agent-ui-plan-step__description", children: formatDiffLabel(entry.diff) }))] }, entry.id))) })] }));
|
|
41
|
+
};
|
|
42
|
+
exports.DiffStream = DiffStream;
|
|
43
|
+
//# sourceMappingURL=DiffStream.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DiffStream.js","sourceRoot":"","sources":["../../src/components/DiffStream.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { JSX, MouseEvent } from "react";
|
|
2
|
+
export interface MarkdownRenderOptions {
|
|
3
|
+
resolveFileHref?: (reference: string) => string | undefined;
|
|
4
|
+
}
|
|
5
|
+
export interface MarkdownMessageProps extends MarkdownRenderOptions {
|
|
6
|
+
content: string;
|
|
7
|
+
className?: string;
|
|
8
|
+
/**
|
|
9
|
+
* Optional override for rendering markdown to HTML. If not provided,
|
|
10
|
+
* a shared MarkdownIt renderer with linkify + syntax highlighting is used.
|
|
11
|
+
*/
|
|
12
|
+
renderHtml?: (content: string) => string;
|
|
13
|
+
onFileReferenceClick?: (reference: string, event: MouseEvent<HTMLDivElement>) => void;
|
|
14
|
+
}
|
|
15
|
+
export declare const renderMarkdownToHtml: (content: string, options?: MarkdownRenderOptions) => string;
|
|
16
|
+
export declare const MarkdownMessage: ({ content, className, renderHtml, resolveFileHref, onFileReferenceClick }: MarkdownMessageProps) => JSX.Element;
|
|
17
|
+
//# sourceMappingURL=MarkdownMessage.d.ts.map
|
|
@@ -0,0 +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;AAiB7C,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;AA8HD,eAAO,MAAM,oBAAoB,GAC/B,SAAS,MAAM,EACf,UAAU,qBAAqB,KAC9B,MAGF,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,2EAM7B,oBAAoB,KAAG,GAAG,CAAC,OA+B7B,CAAC"}
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.MarkdownMessage = exports.renderMarkdownToHtml = void 0;
|
|
7
|
+
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
+
const react_1 = require("react");
|
|
9
|
+
const core_chat_1 = require("@burtson-labs/core-chat");
|
|
10
|
+
const dompurify_1 = __importDefault(require("dompurify"));
|
|
11
|
+
const highlight_js_1 = __importDefault(require("highlight.js"));
|
|
12
|
+
const markdown_it_1 = __importDefault(require("markdown-it"));
|
|
13
|
+
// The Token constructor lives under markdown-it/lib/token and isn't typed in @types,
|
|
14
|
+
// so suppress the type error on import.
|
|
15
|
+
// @ts-expect-error no types for markdown-it/lib/token
|
|
16
|
+
const token_1 = __importDefault(require("markdown-it/lib/token"));
|
|
17
|
+
const FILE_REFERENCE_REGEX = /(?:[A-Za-z0-9._-]+\/)+(?:[A-Za-z0-9._-]+)(?:\.[A-Za-z0-9]+)?(?::\d+(?:-\d+)?)?/g;
|
|
18
|
+
const createFileLinkTokens = (md, reference, href) => {
|
|
19
|
+
const linkOpen = new token_1.default("link_open", "a", 1);
|
|
20
|
+
linkOpen.attrSet("href", href ?? "#");
|
|
21
|
+
linkOpen.attrSet("data-file-ref", reference);
|
|
22
|
+
if (href) {
|
|
23
|
+
linkOpen.attrSet("target", "_blank");
|
|
24
|
+
linkOpen.attrSet("rel", "noreferrer");
|
|
25
|
+
}
|
|
26
|
+
const textToken = new token_1.default("text", "", 0);
|
|
27
|
+
textToken.content = reference;
|
|
28
|
+
const linkClose = new token_1.default("link_close", "a", -1);
|
|
29
|
+
return [linkOpen, textToken, linkClose];
|
|
30
|
+
};
|
|
31
|
+
const fileReferencePlugin = (md, resolveFileHref) => {
|
|
32
|
+
md.core.ruler.after("inline", "file-references", (state) => {
|
|
33
|
+
state.tokens.forEach((blockToken) => {
|
|
34
|
+
if (blockToken.type !== "inline" || !blockToken.children) {
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
const children = [];
|
|
38
|
+
let insideLink = false;
|
|
39
|
+
blockToken.children.forEach((token) => {
|
|
40
|
+
if (token.type === "link_open") {
|
|
41
|
+
insideLink = true;
|
|
42
|
+
children.push(token);
|
|
43
|
+
return;
|
|
44
|
+
}
|
|
45
|
+
if (token.type === "link_close") {
|
|
46
|
+
insideLink = false;
|
|
47
|
+
children.push(token);
|
|
48
|
+
return;
|
|
49
|
+
}
|
|
50
|
+
if (token.type === "code_inline" || token.type !== "text" || insideLink) {
|
|
51
|
+
children.push(token);
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const content = token.content;
|
|
55
|
+
const matches = Array.from(content.matchAll(new RegExp(FILE_REFERENCE_REGEX)));
|
|
56
|
+
if (matches.length === 0) {
|
|
57
|
+
children.push(token);
|
|
58
|
+
return;
|
|
59
|
+
}
|
|
60
|
+
let lastIndex = 0;
|
|
61
|
+
matches.forEach((match) => {
|
|
62
|
+
const matchText = match[0];
|
|
63
|
+
const startIndex = match.index ?? 0;
|
|
64
|
+
if (startIndex > lastIndex) {
|
|
65
|
+
const textToken = new token_1.default("text", "", 0);
|
|
66
|
+
textToken.content = content.slice(lastIndex, startIndex);
|
|
67
|
+
children.push(textToken);
|
|
68
|
+
}
|
|
69
|
+
const href = resolveFileHref?.(matchText);
|
|
70
|
+
children.push(...createFileLinkTokens(state.md, matchText, href));
|
|
71
|
+
lastIndex = startIndex + matchText.length;
|
|
72
|
+
});
|
|
73
|
+
if (lastIndex < content.length) {
|
|
74
|
+
const trailing = new token_1.default("text", "", 0);
|
|
75
|
+
trailing.content = content.slice(lastIndex);
|
|
76
|
+
children.push(trailing);
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
blockToken.children = children;
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
};
|
|
83
|
+
const createMarkdownRenderer = (options) => {
|
|
84
|
+
const md = new markdown_it_1.default({
|
|
85
|
+
html: false,
|
|
86
|
+
linkify: true,
|
|
87
|
+
breaks: true
|
|
88
|
+
});
|
|
89
|
+
md.options.highlight = (code, language) => {
|
|
90
|
+
if (language && highlight_js_1.default.getLanguage(language)) {
|
|
91
|
+
try {
|
|
92
|
+
const highlighted = highlight_js_1.default.highlight(code, { language }).value;
|
|
93
|
+
// Diff blocks get wrapped in a Claude-style expandable card:
|
|
94
|
+
// `<details>` with a `<summary>` that shows the line counts so
|
|
95
|
+
// users can collapse long diffs but still see what changed.
|
|
96
|
+
// Open by default when the diff is short, closed when long so
|
|
97
|
+
// the chat doesn't become a wall of +/- lines on big edits.
|
|
98
|
+
if (language === 'diff') {
|
|
99
|
+
const rawLines = code.split('\n').filter(l => l.length > 0);
|
|
100
|
+
const added = rawLines.filter(l => l.startsWith('+')).length;
|
|
101
|
+
const removed = rawLines.filter(l => l.startsWith('-')).length;
|
|
102
|
+
const openByDefault = rawLines.length <= 18;
|
|
103
|
+
const summary = `<summary class="bandit-diff-card__summary">`
|
|
104
|
+
+ `<span class="bandit-diff-card__icon">⎔</span>`
|
|
105
|
+
+ `<span class="bandit-diff-card__title">diff</span>`
|
|
106
|
+
+ `<span class="bandit-diff-card__stats">`
|
|
107
|
+
+ `<span class="bandit-diff-card__plus">+${added}</span>`
|
|
108
|
+
+ ` `
|
|
109
|
+
+ `<span class="bandit-diff-card__minus">−${removed}</span>`
|
|
110
|
+
+ `</span>`
|
|
111
|
+
+ `</summary>`;
|
|
112
|
+
return `<details class="bandit-diff-card" ${openByDefault ? 'open' : ''}>`
|
|
113
|
+
+ summary
|
|
114
|
+
+ `<pre><code class="hljs language-diff">${highlighted}</code></pre>`
|
|
115
|
+
+ `</details>`;
|
|
116
|
+
}
|
|
117
|
+
return `<pre><code class="hljs language-${md.utils.escapeHtml(language)}">${highlighted}</code></pre>`;
|
|
118
|
+
}
|
|
119
|
+
catch {
|
|
120
|
+
// Fall through to plain escape below.
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
const escaped = md.utils.escapeHtml(code);
|
|
124
|
+
return `<pre><code class="hljs">${escaped}</code></pre>`;
|
|
125
|
+
};
|
|
126
|
+
fileReferencePlugin(md, options?.resolveFileHref);
|
|
127
|
+
return md;
|
|
128
|
+
};
|
|
129
|
+
const renderMarkdownToHtml = (content, options) => {
|
|
130
|
+
const md = createMarkdownRenderer(options);
|
|
131
|
+
return md.render(content);
|
|
132
|
+
};
|
|
133
|
+
exports.renderMarkdownToHtml = renderMarkdownToHtml;
|
|
134
|
+
const MarkdownMessage = ({ content, className, renderHtml, resolveFileHref, onFileReferenceClick }) => {
|
|
135
|
+
const sanitizedContent = (0, react_1.useMemo)(() => (0, core_chat_1.sanitizeModelOutput)(content), [content]);
|
|
136
|
+
const html = (0, react_1.useMemo)(() => {
|
|
137
|
+
const rendered = renderHtml
|
|
138
|
+
? renderHtml(sanitizedContent)
|
|
139
|
+
: (0, exports.renderMarkdownToHtml)(sanitizedContent, { resolveFileHref });
|
|
140
|
+
return dompurify_1.default.sanitize(rendered, { ADD_ATTR: ["data-file-ref", "target", "rel"] });
|
|
141
|
+
}, [renderHtml, resolveFileHref, sanitizedContent]);
|
|
142
|
+
const handleClick = (event) => {
|
|
143
|
+
if (!onFileReferenceClick) {
|
|
144
|
+
return;
|
|
145
|
+
}
|
|
146
|
+
const target = event.target;
|
|
147
|
+
const anchor = target?.closest?.("a[data-file-ref]");
|
|
148
|
+
const reference = anchor?.getAttribute("data-file-ref");
|
|
149
|
+
if (anchor && reference) {
|
|
150
|
+
event.preventDefault();
|
|
151
|
+
onFileReferenceClick(reference, event);
|
|
152
|
+
}
|
|
153
|
+
};
|
|
154
|
+
const mergedClassName = className ? `markdown-message ${className}` : "markdown-message";
|
|
155
|
+
return ((0, jsx_runtime_1.jsx)("div", { className: mergedClassName, onClick: handleClick, dangerouslySetInnerHTML: { __html: html } }));
|
|
156
|
+
};
|
|
157
|
+
exports.MarkdownMessage = MarkdownMessage;
|
|
158
|
+
//# sourceMappingURL=MarkdownMessage.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"MarkdownMessage.js","sourceRoot":"","sources":["../../src/components/MarkdownMessage.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { type JSX } from "react";
|
|
2
|
+
/**
|
|
3
|
+
* Permission payload emitted by the extension when a tool call needs user
|
|
4
|
+
* approval (write_file, run_command, etc). The webview extracts this from a
|
|
5
|
+
* `bandit-permission` fenced block in the assistant message and renders the
|
|
6
|
+
* interactive card in-place. Once the user picks, we post back and flip the
|
|
7
|
+
* card into a resolved state — so the card is authoritative UI rather than
|
|
8
|
+
* the extension's chat-message text copy (which is for history).
|
|
9
|
+
*/
|
|
10
|
+
export interface BanditPermissionPayload {
|
|
11
|
+
type: "bandit:permission";
|
|
12
|
+
id: string;
|
|
13
|
+
tool: string;
|
|
14
|
+
primary: string;
|
|
15
|
+
description: string;
|
|
16
|
+
/** Short risk summary from the host permission gate. */
|
|
17
|
+
risk?: string;
|
|
18
|
+
bodyPreview?: string;
|
|
19
|
+
/**
|
|
20
|
+
* Optional advisory the extension surfaces on the card BEFORE the user
|
|
21
|
+
* decides. Used for the "creating a new file at X — did you mean to
|
|
22
|
+
* edit an existing one?" warning when write_file targets a path that
|
|
23
|
+
* doesn't yet exist and the user's prompt implied editing.
|
|
24
|
+
*/
|
|
25
|
+
warning?: string;
|
|
26
|
+
/**
|
|
27
|
+
* +/- line counts extracted from bodyPreview so we can show a compact
|
|
28
|
+
* "Modified · +12 -3" summary instead of the full diff. When omitted,
|
|
29
|
+
* the card falls back to rendering bodyPreview expanded (back-compat).
|
|
30
|
+
*/
|
|
31
|
+
diffStats?: {
|
|
32
|
+
added: number;
|
|
33
|
+
removed: number;
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Raw command text for run_command prompts — the full shell string the
|
|
37
|
+
* agent wants to execute (e.g. `grep -rE "pattern" ~/path | head -40`).
|
|
38
|
+
* Shown in a monospace block above the buttons so the user can audit
|
|
39
|
+
* the command verbatim before approving. Claude Code shows the whole
|
|
40
|
+
* command; we were only showing the tool name + first param, which hid
|
|
41
|
+
* pipes / flags / second args. Undefined for non-command tools.
|
|
42
|
+
*/
|
|
43
|
+
command?: string;
|
|
44
|
+
/**
|
|
45
|
+
* Formatted key=value param dump for non-command tools. When present
|
|
46
|
+
* and `bodyPreview` is empty, we render this in the same position as
|
|
47
|
+
* `command` so the user can see exactly what'll be invoked
|
|
48
|
+
* (apply_edit find/replace, git_checkout branch name, etc).
|
|
49
|
+
*/
|
|
50
|
+
paramsPreview?: string;
|
|
51
|
+
}
|
|
52
|
+
export type PermissionChoice = "once" | "session" | "save" | "deny";
|
|
53
|
+
export interface PermissionCardProps {
|
|
54
|
+
payload: BanditPermissionPayload;
|
|
55
|
+
/**
|
|
56
|
+
* Fires once per card. `notes` is populated only when the user picked
|
|
57
|
+
* "Deny with notes" and typed follow-up guidance — the extension pipes
|
|
58
|
+
* that back to the model as part of the denial reason so the agent
|
|
59
|
+
* adjusts its plan rather than just seeing "blocked."
|
|
60
|
+
*/
|
|
61
|
+
onChoice: (id: string, choice: PermissionChoice, notes?: string) => void;
|
|
62
|
+
}
|
|
63
|
+
export declare const PermissionCard: ({ payload, onChoice }: PermissionCardProps) => JSX.Element;
|
|
64
|
+
//# sourceMappingURL=PermissionCard.d.ts.map
|
|
@@ -0,0 +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;CACxB;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;AAiBD,eAAO,MAAM,cAAc,GAAI,uBAAuB,mBAAmB,KAAG,GAAG,CAAC,OAkK/E,CAAC"}
|