@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.
Files changed (144) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +45 -0
  3. package/dist/components/AgentConsole.d.ts +11 -0
  4. package/dist/components/AgentConsole.d.ts.map +1 -0
  5. package/dist/components/AgentConsole.js +139 -0
  6. package/dist/components/AgentConsole.js.map +1 -0
  7. package/dist/components/AgentSummaryCard.d.ts +9 -0
  8. package/dist/components/AgentSummaryCard.d.ts.map +1 -0
  9. package/dist/components/AgentSummaryCard.js +96 -0
  10. package/dist/components/AgentSummaryCard.js.map +1 -0
  11. package/dist/components/ChatComposer.d.ts +134 -0
  12. package/dist/components/ChatComposer.d.ts.map +1 -0
  13. package/dist/components/ChatComposer.js +411 -0
  14. package/dist/components/ChatComposer.js.map +1 -0
  15. package/dist/components/ChatConversation.d.ts +28 -0
  16. package/dist/components/ChatConversation.d.ts.map +1 -0
  17. package/dist/components/ChatConversation.js +82 -0
  18. package/dist/components/ChatConversation.js.map +1 -0
  19. package/dist/components/ChatMessage.d.ts +38 -0
  20. package/dist/components/ChatMessage.d.ts.map +1 -0
  21. package/dist/components/ChatMessage.js +208 -0
  22. package/dist/components/ChatMessage.js.map +1 -0
  23. package/dist/components/DiffBlock.d.ts +7 -0
  24. package/dist/components/DiffBlock.d.ts.map +1 -0
  25. package/dist/components/DiffBlock.js +58 -0
  26. package/dist/components/DiffBlock.js.map +1 -0
  27. package/dist/components/DiffReview/DiffBlock.d.ts +7 -0
  28. package/dist/components/DiffReview/DiffBlock.d.ts.map +1 -0
  29. package/dist/components/DiffReview/DiffBlock.js +13 -0
  30. package/dist/components/DiffReview/DiffBlock.js.map +1 -0
  31. package/dist/components/DiffReview/DiffFileGroup.d.ts +14 -0
  32. package/dist/components/DiffReview/DiffFileGroup.d.ts.map +1 -0
  33. package/dist/components/DiffReview/DiffFileGroup.js +44 -0
  34. package/dist/components/DiffReview/DiffFileGroup.js.map +1 -0
  35. package/dist/components/DiffReview/DiffReviewPanel.d.ts +16 -0
  36. package/dist/components/DiffReview/DiffReviewPanel.d.ts.map +1 -0
  37. package/dist/components/DiffReview/DiffReviewPanel.js +25 -0
  38. package/dist/components/DiffReview/DiffReviewPanel.js.map +1 -0
  39. package/dist/components/DiffReview/index.d.ts +3 -0
  40. package/dist/components/DiffReview/index.d.ts.map +1 -0
  41. package/dist/components/DiffReview/index.js +19 -0
  42. package/dist/components/DiffReview/index.js.map +1 -0
  43. package/dist/components/DiffReviewCard.d.ts +10 -0
  44. package/dist/components/DiffReviewCard.d.ts.map +1 -0
  45. package/dist/components/DiffReviewCard.js +36 -0
  46. package/dist/components/DiffReviewCard.js.map +1 -0
  47. package/dist/components/DiffStream.d.ts +12 -0
  48. package/dist/components/DiffStream.d.ts.map +1 -0
  49. package/dist/components/DiffStream.js +43 -0
  50. package/dist/components/DiffStream.js.map +1 -0
  51. package/dist/components/MarkdownMessage.d.ts +17 -0
  52. package/dist/components/MarkdownMessage.d.ts.map +1 -0
  53. package/dist/components/MarkdownMessage.js +158 -0
  54. package/dist/components/MarkdownMessage.js.map +1 -0
  55. package/dist/components/PermissionCard.d.ts +64 -0
  56. package/dist/components/PermissionCard.d.ts.map +1 -0
  57. package/dist/components/PermissionCard.js +156 -0
  58. package/dist/components/PermissionCard.js.map +1 -0
  59. package/dist/components/PlanActivity.d.ts +20 -0
  60. package/dist/components/PlanActivity.d.ts.map +1 -0
  61. package/dist/components/PlanActivity.js +186 -0
  62. package/dist/components/PlanActivity.js.map +1 -0
  63. package/dist/components/PlanTree.d.ts +13 -0
  64. package/dist/components/PlanTree.d.ts.map +1 -0
  65. package/dist/components/PlanTree.js +70 -0
  66. package/dist/components/PlanTree.js.map +1 -0
  67. package/dist/components/TaskList.d.ts +9 -0
  68. package/dist/components/TaskList.d.ts.map +1 -0
  69. package/dist/components/TaskList.js +26 -0
  70. package/dist/components/TaskList.js.map +1 -0
  71. package/dist/components/TelemetryPanel.d.ts +9 -0
  72. package/dist/components/TelemetryPanel.d.ts.map +1 -0
  73. package/dist/components/TelemetryPanel.js +54 -0
  74. package/dist/components/TelemetryPanel.js.map +1 -0
  75. package/dist/components/index.d.ts +15 -0
  76. package/dist/components/index.d.ts.map +1 -0
  77. package/dist/components/index.js +31 -0
  78. package/dist/components/index.js.map +1 -0
  79. package/dist/context/BanditContext.d.ts +14 -0
  80. package/dist/context/BanditContext.d.ts.map +1 -0
  81. package/dist/context/BanditContext.js +18 -0
  82. package/dist/context/BanditContext.js.map +1 -0
  83. package/dist/context/index.d.ts +2 -0
  84. package/dist/context/index.d.ts.map +1 -0
  85. package/dist/context/index.js +18 -0
  86. package/dist/context/index.js.map +1 -0
  87. package/dist/hooks/index.d.ts +3 -0
  88. package/dist/hooks/index.d.ts.map +1 -0
  89. package/dist/hooks/index.js +19 -0
  90. package/dist/hooks/index.js.map +1 -0
  91. package/dist/hooks/useAgentEvents.d.ts +13 -0
  92. package/dist/hooks/useAgentEvents.d.ts.map +1 -0
  93. package/dist/hooks/useAgentEvents.js +54 -0
  94. package/dist/hooks/useAgentEvents.js.map +1 -0
  95. package/dist/hooks/useTelemetry.d.ts +4 -0
  96. package/dist/hooks/useTelemetry.d.ts.map +1 -0
  97. package/dist/hooks/useTelemetry.js +198 -0
  98. package/dist/hooks/useTelemetry.js.map +1 -0
  99. package/dist/index.d.ts +12 -0
  100. package/dist/index.d.ts.map +1 -0
  101. package/dist/index.js +29 -0
  102. package/dist/index.js.map +1 -0
  103. package/dist/theme/BanditThemeProvider.d.ts +26 -0
  104. package/dist/theme/BanditThemeProvider.d.ts.map +1 -0
  105. package/dist/theme/BanditThemeProvider.js +138 -0
  106. package/dist/theme/BanditThemeProvider.js.map +1 -0
  107. package/dist/theme/catppuccin-mocha.json +23 -0
  108. package/dist/theme/charcoal.json +23 -0
  109. package/dist/theme/dark.json +23 -0
  110. package/dist/theme/dracula.json +23 -0
  111. package/dist/theme/index.d.ts +5 -0
  112. package/dist/theme/index.d.ts.map +1 -0
  113. package/dist/theme/index.js +21 -0
  114. package/dist/theme/index.js.map +1 -0
  115. package/dist/theme/light.json +23 -0
  116. package/dist/theme/midnight.json +23 -0
  117. package/dist/theme/nord.json +23 -0
  118. package/dist/theme/onyx.json +23 -0
  119. package/dist/theme/sepia.json +23 -0
  120. package/dist/theme/solarized-dark.json +23 -0
  121. package/dist/theme/solarized-light.json +23 -0
  122. package/dist/theme/theme-base.d.ts +37 -0
  123. package/dist/theme/theme-base.d.ts.map +1 -0
  124. package/dist/theme/theme-base.js +141 -0
  125. package/dist/theme/theme-base.js.map +1 -0
  126. package/dist/theme/theme-registry.d.ts +22 -0
  127. package/dist/theme/theme-registry.d.ts.map +1 -0
  128. package/dist/theme/theme-registry.js +52 -0
  129. package/dist/theme/theme-registry.js.map +1 -0
  130. package/dist/theme/tokyo-night.json +23 -0
  131. package/dist/theme/vscode-theme.d.ts +3 -0
  132. package/dist/theme/vscode-theme.d.ts.map +1 -0
  133. package/dist/theme/vscode-theme.js +128 -0
  134. package/dist/theme/vscode-theme.js.map +1 -0
  135. package/dist/types/ui-schema.d.ts +114 -0
  136. package/dist/types/ui-schema.d.ts.map +1 -0
  137. package/dist/types/ui-schema.js +3 -0
  138. package/dist/types/ui-schema.js.map +1 -0
  139. package/dist/utils/classNames.d.ts +2 -0
  140. package/dist/utils/classNames.d.ts.map +1 -0
  141. package/dist/utils/classNames.js +8 -0
  142. package/dist/utils/classNames.js.map +1 -0
  143. package/package.json +55 -0
  144. 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,3 @@
1
+ export * from "./DiffFileGroup";
2
+ export * from "./DiffReviewPanel";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}