@mastra/playground-ui 53.0.0-alpha.8 → 53.0.0
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/{code-DRGJVroV.js → code-D4Vw_fYq.js} +22 -16
- package/dist/code-D4Vw_fYq.js.map +1 -0
- package/dist/{code-BJMC6T9D.cjs → code-DhrdtZce.cjs} +22 -15
- package/dist/code-DhrdtZce.cjs.map +1 -0
- package/dist/{code-block-CBJhDEeB.js → code-block-DeksY23p.js} +2 -2
- package/dist/{code-block-CBJhDEeB.js.map → code-block-DeksY23p.js.map} +1 -1
- package/dist/{code-block-fmv8bHoT.cjs → code-block-DgHrBuR8.cjs} +2 -2
- package/dist/{code-block-fmv8bHoT.cjs.map → code-block-DgHrBuR8.cjs.map} +1 -1
- package/dist/{code-diff-C-EHXZyK.cjs → code-diff-CHZ3P1ky.cjs} +51 -43
- package/dist/code-diff-CHZ3P1ky.cjs.map +1 -0
- package/dist/{code-diff-BB4sqHpq.js → code-diff-CIRbnIfl.js} +52 -44
- package/dist/code-diff-CIRbnIfl.js.map +1 -0
- package/dist/{combobox-BQrlN0eB.cjs → combobox-JNWmgC13.cjs} +8 -3
- package/dist/combobox-JNWmgC13.cjs.map +1 -0
- package/dist/{combobox-DeeAlYti.js → combobox-nxjXzRWu.js} +8 -3
- package/dist/combobox-nxjXzRWu.js.map +1 -0
- package/dist/{command-DWFd0d4c.js → command-Be-KrIAX.js} +2 -2
- package/dist/{command-DWFd0d4c.js.map → command-Be-KrIAX.js.map} +1 -1
- package/dist/{command-CUev1UxH.cjs → command-DsTBCmQq.cjs} +2 -2
- package/dist/{command-CUev1UxH.cjs.map → command-DsTBCmQq.cjs.map} +1 -1
- package/dist/components/ChatShell.cjs.js +20 -1
- package/dist/components/ChatShell.cjs.js.map +1 -1
- package/dist/components/ChatShell.es.js +20 -1
- package/dist/components/ChatShell.es.js.map +1 -1
- package/dist/components/Code.cjs.js +3 -1
- package/dist/components/Code.cjs.js.map +1 -1
- package/dist/components/Code.es.js +1 -1
- package/dist/components/CodeBlock.cjs.js +1 -1
- package/dist/components/CodeBlock.es.js +1 -1
- package/dist/components/CodeDiff.cjs.js +1 -1
- package/dist/components/CodeDiff.es.js +1 -1
- package/dist/components/CodeEditor.cjs.js +2 -1
- package/dist/components/CodeEditor.cjs.js.map +1 -1
- package/dist/components/CodeEditor.es.js +1 -1
- package/dist/components/Combobox.cjs.js +1 -1
- package/dist/components/Combobox.es.js +1 -1
- package/dist/components/Command.cjs.js +1 -1
- package/dist/components/Command.es.js +1 -1
- package/dist/components/CommandPalette.cjs.js +1 -1
- package/dist/components/CommandPalette.es.js +1 -1
- package/dist/components/Comment.cjs.js +2 -2
- package/dist/components/Comment.cjs.js.map +1 -1
- package/dist/components/Comment.es.js +2 -2
- package/dist/components/Comment.es.js.map +1 -1
- package/dist/components/DataCodeSection.cjs.js +1 -1
- package/dist/components/DataCodeSection.es.js +1 -1
- package/dist/components/DataPanel.cjs.js +1 -1
- package/dist/components/DataPanel.es.js +1 -1
- package/dist/components/Dialog.cjs.js +181 -2
- package/dist/components/Dialog.cjs.js.map +1 -1
- package/dist/components/Dialog.es.js +183 -1
- package/dist/components/Dialog.es.js.map +1 -1
- package/dist/components/HorizontalBars.cjs.js +1 -1
- package/dist/components/HorizontalBars.es.js +1 -1
- package/dist/components/IntegrationDialog.cjs.js +105 -0
- package/dist/components/IntegrationDialog.cjs.js.map +1 -0
- package/dist/components/IntegrationDialog.d.ts +2 -0
- package/dist/components/IntegrationDialog.es.js +101 -0
- package/dist/components/IntegrationDialog.es.js.map +1 -0
- package/dist/components/LogsDataList.cjs.js +0 -1
- package/dist/components/LogsDataList.cjs.js.map +1 -1
- package/dist/components/LogsDataList.es.js +0 -1
- package/dist/components/LogsDataList.es.js.map +1 -1
- package/dist/components/MainHeader.cjs.js +1 -1
- package/dist/components/MainHeader.cjs.js.map +1 -1
- package/dist/components/MainHeader.es.js +1 -1
- package/dist/components/MainHeader.es.js.map +1 -1
- package/dist/components/MarkdownRenderer.cjs.js +1 -1
- package/dist/components/MarkdownRenderer.es.js +1 -1
- package/dist/components/PropertyFilter.cjs.js +1 -1
- package/dist/components/PropertyFilter.es.js +1 -1
- package/dist/components/ThreadRail.cjs.js +19 -0
- package/dist/components/ThreadRail.cjs.js.map +1 -1
- package/dist/components/ThreadRail.es.js +19 -1
- package/dist/components/ThreadRail.es.js.map +1 -1
- package/dist/components/ai/plan.cjs.js +1 -1
- package/dist/components/ai/plan.es.js +1 -1
- package/dist/components/ai/tool-call.cjs.js +165 -0
- package/dist/components/ai/tool-call.cjs.js.map +1 -1
- package/dist/components/ai/tool-call.es.js +159 -3
- package/dist/components/ai/tool-call.es.js.map +1 -1
- package/dist/{data-code-section-Dn9smaz4.cjs → data-code-section-B_lg_J_0.cjs} +34 -5
- package/dist/data-code-section-B_lg_J_0.cjs.map +1 -0
- package/dist/{data-code-section-DN2yPgEz.js → data-code-section-Cm_W_XhO.js} +36 -7
- package/dist/data-code-section-Cm_W_XhO.js.map +1 -0
- package/dist/{data-panel-DEatwExN.cjs → data-panel-Cv9j_IGQ.cjs} +2 -2
- package/dist/{data-panel-DEatwExN.cjs.map → data-panel-Cv9j_IGQ.cjs.map} +1 -1
- package/dist/{data-panel-2Da0Utgy.js → data-panel-DXxeSnL1.js} +2 -2
- package/dist/{data-panel-2Da0Utgy.js.map → data-panel-DXxeSnL1.js.map} +1 -1
- package/dist/dialog-CZMPDVUj.js +259 -0
- package/dist/dialog-CZMPDVUj.js.map +1 -0
- package/dist/dialog-D-7Hkb3j.cjs +293 -0
- package/dist/dialog-D-7Hkb3j.cjs.map +1 -0
- package/dist/domains/memory/components/observation-detail-view.cjs.js +1 -1
- package/dist/domains/memory/components/observation-detail-view.es.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/token-usage-by-agent-card-view.es.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.cjs.js +1 -1
- package/dist/domains/metrics/components/traces-volume-card-view.es.js +1 -1
- package/dist/domains/traces/components/span-data-panel-view.cjs.js +61 -105
- package/dist/domains/traces/components/span-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/span-data-panel-view.es.js +62 -106
- package/dist/domains/traces/components/span-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/span-summary-description.cjs.js +62 -0
- package/dist/domains/traces/components/span-summary-description.cjs.js.map +1 -0
- package/dist/domains/traces/components/span-summary-description.d.ts +2 -0
- package/dist/domains/traces/components/span-summary-description.es.js +58 -0
- package/dist/domains/traces/components/span-summary-description.es.js.map +1 -0
- package/dist/domains/traces/components/timeline-expand-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-expand-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-expand-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-expand-col.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-name-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-name-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-name-col.es.js.map +1 -1
- package/dist/domains/traces/components/timeline-timing-col.cjs.js +1 -1
- package/dist/domains/traces/components/timeline-timing-col.cjs.js.map +1 -1
- package/dist/domains/traces/components/timeline-timing-col.es.js +1 -1
- package/dist/domains/traces/components/timeline-timing-col.es.js.map +1 -1
- package/dist/domains/traces/components/trace-columns-menu.cjs.js +1 -1
- package/dist/domains/traces/components/trace-columns-menu.es.js +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.cjs.js.map +1 -1
- package/dist/domains/traces/components/trace-data-panel-view.es.js +2 -2
- package/dist/domains/traces/components/trace-data-panel-view.es.js.map +1 -1
- package/dist/domains/traces/components/traces-toolbar.cjs.js +1 -5
- package/dist/domains/traces/components/traces-toolbar.cjs.js.map +1 -1
- package/dist/domains/traces/components/traces-toolbar.es.js +1 -5
- package/dist/domains/traces/components/traces-toolbar.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-branch.cjs.js +2 -6
- package/dist/domains/traces/hooks/use-branch.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-branch.es.js +2 -6
- package/dist/domains/traces/hooks/use-branch.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-download-trace-json.cjs.js +4 -1
- package/dist/domains/traces/hooks/use-download-trace-json.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-download-trace-json.es.js +4 -1
- package/dist/domains/traces/hooks/use-download-trace-json.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js +11 -18
- package/dist/domains/traces/hooks/use-trace-filter-persistence.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js +13 -20
- package/dist/domains/traces/hooks/use-trace-filter-persistence.es.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-spans.cjs.js +10 -7
- package/dist/domains/traces/hooks/use-trace-spans.cjs.js.map +1 -1
- package/dist/domains/traces/hooks/use-trace-spans.es.js +10 -7
- package/dist/domains/traces/hooks/use-trace-spans.es.js.map +1 -1
- package/dist/domains/traces/trace-filters.cjs.js +5 -5
- package/dist/domains/traces/trace-filters.cjs.js.map +1 -1
- package/dist/domains/traces/trace-filters.es.js +5 -5
- package/dist/domains/traces/trace-filters.es.js.map +1 -1
- package/dist/domains/traces/utils/span-utils.cjs.js +6 -0
- package/dist/domains/traces/utils/span-utils.cjs.js.map +1 -1
- package/dist/domains/traces/utils/span-utils.es.js +6 -1
- package/dist/domains/traces/utils/span-utils.es.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js +0 -1
- package/dist/ee/signals/components/entity-index-list.cjs.js.map +1 -1
- package/dist/ee/signals/components/entity-index-list.es.js +0 -1
- package/dist/ee/signals/components/entity-index-list.es.js.map +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.cjs.js +1 -1
- package/dist/ee/signals/settings/signal-definition-form-dialog.es.js +1 -1
- package/dist/{highlight-CSJjjoqh.js → highlight-BmpoELR4.js} +6 -2
- package/dist/{highlight-CSJjjoqh.js.map → highlight-BmpoELR4.js.map} +1 -1
- package/dist/{highlight-CEt2vhD8.cjs → highlight-DK1dn-Fh.cjs} +6 -1
- package/dist/{highlight-CEt2vhD8.cjs.map → highlight-DK1dn-Fh.cjs.map} +1 -1
- package/dist/{horizontal-bars-DZ5J4TKv.js → horizontal-bars-CyP-B-BX.js} +37 -4
- package/dist/horizontal-bars-CyP-B-BX.js.map +1 -0
- package/dist/{horizontal-bars-CE1O-Y6G.cjs → horizontal-bars-Dgq3PYsg.cjs} +37 -4
- package/dist/horizontal-bars-Dgq3PYsg.cjs.map +1 -0
- package/dist/{markdown-renderer-DiJBbnYG.js → markdown-renderer-CaFpZTFS.js} +2 -2
- package/dist/{markdown-renderer-DiJBbnYG.js.map → markdown-renderer-CaFpZTFS.js.map} +1 -1
- package/dist/{markdown-renderer-DGIzNAQY.cjs → markdown-renderer-GVtZLunG.cjs} +2 -2
- package/dist/{markdown-renderer-DGIzNAQY.cjs.map → markdown-renderer-GVtZLunG.cjs.map} +1 -1
- package/dist/src/domains/traces/components/span-summary-description.d.ts +10 -0
- package/dist/src/domains/traces/components/traces-toolbar.d.ts +1 -5
- package/dist/src/domains/traces/hooks/index.d.ts +1 -1
- package/dist/src/domains/traces/hooks/use-trace-filter-persistence.d.ts +5 -18
- package/dist/src/domains/traces/hooks/use-trace-spans.d.ts +3 -1
- package/dist/src/domains/traces/trace-filters.d.ts +4 -3
- package/dist/src/domains/traces/utils/span-utils.d.ts +2 -0
- package/dist/src/ds/components/ChatShell/chat-shell.d.ts +19 -2
- package/dist/src/ds/components/ChatShell/index.d.ts +3 -2
- package/dist/src/ds/components/Code/index.d.ts +1 -0
- package/dist/src/ds/components/Code/use-highlight.d.ts +10 -0
- package/dist/src/ds/components/CodeDiff/code-diff.stories.d.ts +2 -0
- package/dist/src/ds/components/CodeEditor/highlight.d.ts +1 -0
- package/dist/src/ds/components/CodeEditor/index.d.ts +1 -1
- package/dist/src/ds/components/Combobox/combobox.d.ts +3 -1
- package/dist/src/ds/components/DataCodeSection/data-code-section.d.ts +9 -1
- package/dist/src/ds/components/DataCodeSection/index.d.ts +1 -1
- package/dist/src/ds/components/Dialog/dialog-action.d.ts +9 -0
- package/dist/src/ds/components/Dialog/dialog-context.d.ts +16 -0
- package/dist/src/ds/components/Dialog/dialog-new-variant.stories.d.ts +64 -0
- package/dist/src/ds/components/Dialog/dialog.d.ts +15 -6
- package/dist/src/ds/components/Dialog/index.d.ts +2 -0
- package/dist/src/ds/components/HorizontalBars/horizontal-bars.stories.d.ts +2 -0
- package/dist/src/ds/components/IntegrationDialog/__fixtures__/integrations-catalog.d.ts +2 -0
- package/dist/src/ds/components/IntegrationDialog/index.d.ts +2 -0
- package/dist/src/ds/components/IntegrationDialog/integration-dialog.d.ts +28 -0
- package/dist/src/ds/components/IntegrationDialog/integration-dialog.stories.d.ts +24 -0
- package/dist/src/ds/components/ThreadRail/index.d.ts +1 -0
- package/dist/src/ds/components/ThreadRail/turn-groups.d.ts +19 -0
- package/dist/src/ds/components/ai/tool-call/ansi.d.ts +2 -0
- package/dist/src/ds/components/ai/tool-call/group-consecutive.d.ts +17 -0
- package/dist/src/ds/components/ai/tool-call/index.d.ts +4 -0
- package/dist/src/ds/components/ai/tool-call/tool-call-edit.d.ts +4 -0
- package/dist/src/ds/components/ai/tool-call/tool-call-group.d.ts +14 -0
- package/dist/src/ds/components/ai/tool-call/tool-call.d.ts +4 -0
- package/dist/src/ds/components/ai/tool-call/tool-presentation.d.ts +10 -0
- package/dist/style.css +149 -3
- package/package.json +8 -8
- package/dist/code-BJMC6T9D.cjs.map +0 -1
- package/dist/code-DRGJVroV.js.map +0 -1
- package/dist/code-diff-BB4sqHpq.js.map +0 -1
- package/dist/code-diff-C-EHXZyK.cjs.map +0 -1
- package/dist/combobox-BQrlN0eB.cjs.map +0 -1
- package/dist/combobox-DeeAlYti.js.map +0 -1
- package/dist/data-code-section-DN2yPgEz.js.map +0 -1
- package/dist/data-code-section-Dn9smaz4.cjs.map +0 -1
- package/dist/dialog-CESxLg8S.js +0 -76
- package/dist/dialog-CESxLg8S.js.map +0 -1
- package/dist/dialog-K0q0KOOW.cjs +0 -107
- package/dist/dialog-K0q0KOOW.cjs.map +0 -1
- package/dist/horizontal-bars-CE1O-Y6G.cjs.map +0 -1
- package/dist/horizontal-bars-DZ5J4TKv.js.map +0 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
2
|
-
import { ChevronRight, X, BookOpen, FolderPlus, Trash2, FileSearch, Braces, Globe, Search, FolderSearch, CircleStop, ScrollText, SquareTerminal, SquarePen, Eye, Wrench } from 'lucide-react';
|
|
1
|
+
import { jsx, jsxs, Fragment } from 'react/jsx-runtime';
|
|
2
|
+
import { ChevronRight, X, BookOpen, FolderPlus, Trash2, FileSearch, Braces, Globe, Search, FolderSearch, CircleStop, ScrollText, SquareTerminal, SquarePen, Eye, Wrench, FoldVertical } from 'lucide-react';
|
|
3
3
|
import { useState, useId, createContext, useContext } from 'react';
|
|
4
4
|
import { u as useArriving } from '../../use-watched-CG9KoWl3.js';
|
|
5
5
|
import { C as Collapsible, a as CollapsibleContent, b as CollapsibleTrigger } from '../../collapsible-igib7hFh.js';
|
|
@@ -7,6 +7,42 @@ import { C as CopyButton } from '../../copy-button-BHmcGzIz.js';
|
|
|
7
7
|
import { S as Shimmer } from '../../shimmer-DV3ZgmuP.js';
|
|
8
8
|
import { T as Txt } from '../../Txt-ByUf-9Ic.js';
|
|
9
9
|
import { c as cn } from '../../cn-B4oPhFx9.js';
|
|
10
|
+
import { u as useHighlight, t as tokenStyle } from '../../code-D4Vw_fYq.js';
|
|
11
|
+
import { C as CodeBlock } from '../../code-block-DeksY23p.js';
|
|
12
|
+
import { l as languageForPath } from '../../highlight-BmpoELR4.js';
|
|
13
|
+
import { truncateString } from '../../utils/truncate-string.es.js';
|
|
14
|
+
import { S as ScrollArea } from '../../scroll-area-BiHnOfzg.js';
|
|
15
|
+
|
|
16
|
+
const ANSI_RE = /[\u001b\u009b][[\]()#;?]*(?:(?:[a-zA-Z\d]*(?:;[-a-zA-Z\d/#&.:=?%@~_]*)*)?\u0007|(?:\d{1,4}(?:;\d{0,4})*)?[\dA-PR-TZcf-nq-uy=><~])/g;
|
|
17
|
+
const ESCAPED_ANSI_RE = /(?<!\\)((?:\\\\)*)\\u001[bB](?:\[[0-9;?<=>]*[a-zA-Z]|\][\s\S]*?(?:\\u0007|\\u001[bB]\\\\))/g;
|
|
18
|
+
function stripAnsi(text) {
|
|
19
|
+
return text.replace(ANSI_RE, "");
|
|
20
|
+
}
|
|
21
|
+
function stripSerializedAnsi(text) {
|
|
22
|
+
return stripAnsi(text).replace(ESCAPED_ANSI_RE, "$1");
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
const TOOL_GROUP_MIN = 3;
|
|
26
|
+
function groupConsecutive(items, { key, joins, min = TOOL_GROUP_MIN }) {
|
|
27
|
+
const byFirstKey = /* @__PURE__ */ new Map();
|
|
28
|
+
const memberKeys = /* @__PURE__ */ new Set();
|
|
29
|
+
let run = [];
|
|
30
|
+
const flush = () => {
|
|
31
|
+
if (run.length >= min) {
|
|
32
|
+
for (const [index, item] of run.entries()) {
|
|
33
|
+
if (index === 0) byFirstKey.set(key(item), run);
|
|
34
|
+
else memberKeys.add(key(item));
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
run = [];
|
|
38
|
+
};
|
|
39
|
+
for (const item of items) {
|
|
40
|
+
if (joins(item)) run.push(item);
|
|
41
|
+
else flush();
|
|
42
|
+
}
|
|
43
|
+
flush();
|
|
44
|
+
return { byFirstKey, memberKeys };
|
|
45
|
+
}
|
|
10
46
|
|
|
11
47
|
const ToolCallContext = createContext(void 0);
|
|
12
48
|
const noopOpenChange = () => {
|
|
@@ -172,6 +208,65 @@ const ToolCallMono = ({ copyText, className, children, ...props }) => /* @__PURE
|
|
|
172
208
|
}
|
|
173
209
|
)
|
|
174
210
|
] });
|
|
211
|
+
const ToolCallCommand = ({ command }) => /* @__PURE__ */ jsxs(ToolCallMono, { copyText: command, className: "text-icon5", children: [
|
|
212
|
+
/* @__PURE__ */ jsx("span", { className: "text-icon3 select-none", children: "$ " }),
|
|
213
|
+
command
|
|
214
|
+
] });
|
|
215
|
+
|
|
216
|
+
const DIFF_MAX_LINES = 200;
|
|
217
|
+
const WRITTEN_FILE_MAX_CHARS = 2e3;
|
|
218
|
+
const DIFF_SIDES = {
|
|
219
|
+
removed: { sign: "-", row: "bg-error/10", gutter: "text-error" },
|
|
220
|
+
added: { sign: "+", row: "bg-accent1/10", gutter: "text-accent1" }
|
|
221
|
+
};
|
|
222
|
+
function boundedLines(text) {
|
|
223
|
+
const lines = text.split("\n");
|
|
224
|
+
return { lines: lines.slice(0, DIFF_MAX_LINES), hidden: Math.max(0, lines.length - DIFF_MAX_LINES) };
|
|
225
|
+
}
|
|
226
|
+
function DiffSide({ lines, side, lang }) {
|
|
227
|
+
const { sign, row, gutter } = DIFF_SIDES[side];
|
|
228
|
+
const code = lines.join("\n");
|
|
229
|
+
const highlighted = useHighlight(code, lang);
|
|
230
|
+
const tokens = highlighted?.code === code ? highlighted.tokens : void 0;
|
|
231
|
+
return /* @__PURE__ */ jsx(Fragment, { children: lines.map((line, index) => /* @__PURE__ */ jsxs("div", { className: cn("flex whitespace-pre", row), children: [
|
|
232
|
+
/* @__PURE__ */ jsx("span", { className: cn("w-5 shrink-0 text-center opacity-70 select-none", gutter), children: sign }),
|
|
233
|
+
/* @__PURE__ */ jsx("span", { className: "text-icon6 flex-1 pr-2.5", children: tokens?.[index]?.map((token, tokenIndex) => /* @__PURE__ */ jsx("span", { className: "shiki-token", style: tokenStyle(token), children: token.content }, tokenIndex)) ?? line })
|
|
234
|
+
] }, index)) });
|
|
235
|
+
}
|
|
236
|
+
function ToolCallEdit({ edit }) {
|
|
237
|
+
const lang = languageForPath(edit.path);
|
|
238
|
+
if ("content" in edit) {
|
|
239
|
+
return /* @__PURE__ */ jsx(
|
|
240
|
+
CodeBlock,
|
|
241
|
+
{
|
|
242
|
+
code: truncateString(edit.content, WRITTEN_FILE_MAX_CHARS),
|
|
243
|
+
lang,
|
|
244
|
+
fileName: edit.path ?? "Change",
|
|
245
|
+
overflow: "scroll"
|
|
246
|
+
}
|
|
247
|
+
);
|
|
248
|
+
}
|
|
249
|
+
const removed = boundedLines(edit.oldText);
|
|
250
|
+
const added = boundedLines(edit.newText);
|
|
251
|
+
const hidden = removed.hidden + added.hidden;
|
|
252
|
+
return /* @__PURE__ */ jsxs(
|
|
253
|
+
"div",
|
|
254
|
+
{
|
|
255
|
+
className: "border-border1 bg-neutral6/5 max-w-full min-w-0 overflow-x-auto rounded-md border font-mono text-xs leading-normal",
|
|
256
|
+
role: "group",
|
|
257
|
+
"aria-label": "File change",
|
|
258
|
+
children: [
|
|
259
|
+
/* @__PURE__ */ jsx(DiffSide, { lines: removed.lines, side: "removed", lang }),
|
|
260
|
+
/* @__PURE__ */ jsx(DiffSide, { lines: added.lines, side: "added", lang }),
|
|
261
|
+
hidden > 0 && /* @__PURE__ */ jsxs("div", { className: "text-icon3 px-2.5 py-1 select-none", children: [
|
|
262
|
+
"… ",
|
|
263
|
+
hidden,
|
|
264
|
+
" more lines"
|
|
265
|
+
] })
|
|
266
|
+
]
|
|
267
|
+
}
|
|
268
|
+
);
|
|
269
|
+
}
|
|
175
270
|
|
|
176
271
|
function stringifyToolValue(value) {
|
|
177
272
|
if (typeof value === "string") return value;
|
|
@@ -239,6 +334,67 @@ function presentTool(toolName, args) {
|
|
|
239
334
|
if (!style.isCommand) return { icon: style.icon, label: style.label, detail };
|
|
240
335
|
return { icon: style.icon, label: style.label, detail: withoutCdPrefix(detail), command: detail };
|
|
241
336
|
}
|
|
337
|
+
function stringField(args, key) {
|
|
338
|
+
if (!args || typeof args !== "object" || !hasProperty(args, key)) return void 0;
|
|
339
|
+
return typeof args[key] === "string" ? args[key] : void 0;
|
|
340
|
+
}
|
|
341
|
+
function toolEdit(toolName, args) {
|
|
342
|
+
const path = stringField(args, "path");
|
|
343
|
+
const newText = stringField(args, "new_string");
|
|
344
|
+
if (/string_replace|str_replace|edit_file/i.test(toolName) && newText !== void 0) {
|
|
345
|
+
return { path, oldText: stringField(args, "old_string") ?? "", newText };
|
|
346
|
+
}
|
|
347
|
+
const content = stringField(args, "content");
|
|
348
|
+
if (/write_file|create_file/i.test(toolName) && content !== void 0) return { path, content };
|
|
349
|
+
return void 0;
|
|
350
|
+
}
|
|
351
|
+
const TASK_TOOLS = /* @__PURE__ */ new Set(["task_write", "task_update", "task_complete", "task_check"]);
|
|
352
|
+
function isTaskTool(toolName) {
|
|
353
|
+
return TASK_TOOLS.has(toolName);
|
|
354
|
+
}
|
|
355
|
+
|
|
356
|
+
const MAX_KIND_GLYPHS = 4;
|
|
357
|
+
function ToolCallGroup({ steps, leading, children }) {
|
|
358
|
+
const running = steps.find((step) => step.status === "running");
|
|
359
|
+
const liveDetail = running && presentTool(running.toolName, running.args).detail;
|
|
360
|
+
return /* @__PURE__ */ jsxs(ToolCall, { status: running ? "running" : "idle", "aria-label": `Tool group: ${steps.length} steps`, children: [
|
|
361
|
+
/* @__PURE__ */ jsx(ToolCallTrigger, { children: /* @__PURE__ */ jsxs(ToolCallHeader, { children: [
|
|
362
|
+
leading,
|
|
363
|
+
/* @__PURE__ */ jsx(ToolCallIcon, { children: /* @__PURE__ */ jsx(FoldVertical, { size: 14, strokeWidth: 1.75, "aria-hidden": true, className: "text-icon2" }) }),
|
|
364
|
+
/* @__PURE__ */ jsxs(ToolCallLabel, { children: [
|
|
365
|
+
steps.length,
|
|
366
|
+
" steps"
|
|
367
|
+
] }),
|
|
368
|
+
liveDetail && /* @__PURE__ */ jsx(ToolCallDetail, { children: liveDetail }),
|
|
369
|
+
/* @__PURE__ */ jsx(GroupKinds, { steps }),
|
|
370
|
+
/* @__PURE__ */ jsx(ToolCallSpacer, { rule: true }),
|
|
371
|
+
/* @__PURE__ */ jsx(ToolCallTrailing, { children: /* @__PURE__ */ jsx(GroupProgress, { steps }) }),
|
|
372
|
+
/* @__PURE__ */ jsx(ToolCallDisclosure, {})
|
|
373
|
+
] }) }),
|
|
374
|
+
/* @__PURE__ */ jsx(ToolCallContent, { className: "py-0.5 pr-0 pl-2.5", children: /* @__PURE__ */ jsx(ScrollArea, { maxHeight: "18rem", autoScroll: Boolean(running), revealScrollbarOnHover: false, children }) })
|
|
375
|
+
] });
|
|
376
|
+
}
|
|
377
|
+
function GroupProgress({ steps }) {
|
|
378
|
+
const done = steps.filter((step) => step.status !== "running").length;
|
|
379
|
+
if (done < steps.length) {
|
|
380
|
+
return /* @__PURE__ */ jsxs(Txt, { as: "span", variant: "ui-xs", className: "text-icon3 shrink-0 tabular-nums", children: [
|
|
381
|
+
done,
|
|
382
|
+
"/",
|
|
383
|
+
steps.length
|
|
384
|
+
] });
|
|
385
|
+
}
|
|
386
|
+
if (steps.some((step) => step.status === "error")) {
|
|
387
|
+
return /* @__PURE__ */ jsx(X, { size: 13, role: "img", "aria-label": "Failed", className: "text-error shrink-0" });
|
|
388
|
+
}
|
|
389
|
+
return null;
|
|
390
|
+
}
|
|
391
|
+
function GroupKinds({ steps }) {
|
|
392
|
+
const iconByLabel = new Map(
|
|
393
|
+
steps.map((step) => presentTool(step.toolName, step.args)).map(({ label, icon }) => [label, icon])
|
|
394
|
+
);
|
|
395
|
+
const kinds = [...iconByLabel].slice(0, MAX_KIND_GLYPHS);
|
|
396
|
+
return /* @__PURE__ */ jsx(ToolCallSummary, { role: "img", "aria-label": kinds.map(([label]) => label).join(", "), className: "shrink-0 gap-1.5", children: kinds.map(([label, Kind]) => /* @__PURE__ */ jsx(Kind, { size: 12, strokeWidth: 1.75, className: "text-icon2" }, label)) });
|
|
397
|
+
}
|
|
242
398
|
|
|
243
|
-
export { ToolCall, ToolCallContent, ToolCallDetail, ToolCallDisclosure, ToolCallHeader, ToolCallIcon, ToolCallLabel, ToolCallMono, ToolCallPresentedHeader, ToolCallSpacer, ToolCallSummary, ToolCallTrailing, ToolCallTrigger, presentTool, stringifyToolValue };
|
|
399
|
+
export { TOOL_GROUP_MIN, ToolCall, ToolCallCommand, ToolCallContent, ToolCallDetail, ToolCallDisclosure, ToolCallEdit, ToolCallGroup, ToolCallHeader, ToolCallIcon, ToolCallLabel, ToolCallMono, ToolCallPresentedHeader, ToolCallSpacer, ToolCallSummary, ToolCallTrailing, ToolCallTrigger, groupConsecutive, isTaskTool, presentTool, stringifyToolValue, stripAnsi, stripSerializedAnsi, toolEdit };
|
|
244
400
|
//# sourceMappingURL=tool-call.es.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-call.es.js","sources":["../../../src/ds/components/ai/tool-call/tool-call.tsx","../../../src/ds/components/ai/tool-call/tool-presentation.ts"],"sourcesContent":["import { ChevronRight, X } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport { createContext, useContext, useId, useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useArriving } from '@/ds/components/Arrival';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { Shimmer } from '@/ds/components/Shimmer';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\ntype ToolCallStatus = 'idle' | 'running' | 'error';\n\ninterface ToolCallContextValue {\n open: boolean;\n status: ToolCallStatus;\n}\n\nconst ToolCallContext = createContext<ToolCallContextValue | undefined>(undefined);\n\n// Stryker disable next-line ArrowFunction: the default callback is intentionally behaviorless.\nconst noopOpenChange = () => {};\n\nfunction useToolCall() {\n const context = useContext(ToolCallContext);\n if (!context) throw new Error('ToolCall compounds must be rendered within ToolCall');\n return context;\n}\n\nexport interface ToolCallProps extends Omit<\n ComponentProps<typeof Collapsible>,\n 'defaultOpen' | 'onOpenChange' | 'open'\n> {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n status?: ToolCallStatus;\n}\n\nexport function ToolCall({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange = noopOpenChange,\n status = 'idle',\n className,\n children,\n ...props\n}: ToolCallProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const open = controlledOpen ?? uncontrolledOpen;\n const statusId = useId();\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(nextOpen);\n onOpenChange(nextOpen);\n };\n\n return (\n <ToolCallContext.Provider value={{ open, status }}>\n <Collapsible\n open={open}\n onOpenChange={handleOpenChange}\n className={cn('max-w-full min-w-0', className)}\n role=\"group\"\n aria-busy={status === 'running'}\n aria-invalid={status === 'error' || undefined}\n aria-describedby={status === 'idle' ? undefined : statusId}\n data-status={status}\n {...props}\n >\n {children}\n {status !== 'idle' && (\n <span id={statusId} className=\"sr-only\">\n {status === 'running' ? 'Tool call running' : 'Tool call failed'}\n </span>\n )}\n </Collapsible>\n </ToolCallContext.Provider>\n );\n}\n\nexport const ToolCallTrigger = ({ className, ...props }: ComponentProps<typeof CollapsibleTrigger>) => (\n <CollapsibleTrigger\n className={cn(\n 'group/row w-full cursor-pointer rounded-md text-left transition-colors hover:bg-neutral6/5 focus-visible:ring-1 focus-visible:ring-accent1 focus-visible:outline-hidden motion-reduce:transition-none',\n className,\n )}\n {...props}\n />\n);\n\nexport const ToolCallHeader = ({ className, children, ...props }: ComponentProps<'span'>) => {\n const { status } = useToolCall();\n\n return (\n <Shimmer\n active={status === 'running'}\n className={cn('flex w-full min-w-0 items-center gap-2 px-1.5 py-1', className)}\n {...props}\n >\n {children}\n </Shimmer>\n );\n};\n\nexport const ToolCallIcon = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('flex size-4 shrink-0 items-center justify-center', className)} {...props} />\n);\n\nexport const ToolCallLabel = ({ className, ...props }: ComponentProps<typeof Txt>) => (\n <Txt as=\"span\" variant=\"ui-sm\" className={cn('text-icon3 max-w-[55%] shrink-0 truncate', className)} {...props} />\n);\n\nexport const ToolCallDetail = ({ className, ...props }: ComponentProps<typeof Txt>) => {\n const arriving = useArriving();\n\n return (\n <Txt\n as=\"span\"\n variant=\"ui-xs\"\n font=\"mono\"\n className={cn('text-icon3 min-w-0 truncate', arriving, className)}\n {...props}\n />\n );\n};\n\nexport const ToolCallSummary = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('flex min-w-0 items-center gap-1', className)} {...props} />\n);\n\nexport interface ToolCallSpacerProps extends ComponentProps<'span'> {\n rule?: boolean;\n}\n\nexport const ToolCallSpacer = ({ rule, className, ...props }: ToolCallSpacerProps) => (\n <span\n aria-hidden\n className={cn('min-w-2 flex-1', rule && 'h-px bg-border1 mask-r-from-[calc(100%-min(100%,160px))]', className)}\n {...props}\n />\n);\n\nexport const ToolCallTrailing = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('flex shrink-0 items-center', className)} {...props} />\n);\n\nexport const ToolCallDisclosure = ({ className, children, ...props }: ComponentProps<'span'>) => {\n const { open } = useToolCall();\n\n return (\n <span className={cn('flex size-4 shrink-0 items-center justify-center', className)} {...props}>\n <span\n aria-hidden\n className={cn(\n 'text-icon3 flex shrink-0 items-center opacity-0 transition duration-150 motion-reduce:transition-none',\n 'group-hover/row:opacity-100 group-focus-visible/row:opacity-100',\n open && 'rotate-90 opacity-100',\n )}\n >\n {children ?? <ChevronRight size={13} />}\n </span>\n </span>\n );\n};\n\nexport interface ToolCallPresentedHeaderProps extends Omit<ComponentProps<typeof ToolCallHeader>, 'children'> {\n /** Rendered ahead of the icon, e.g. a timestamp. */\n leading?: ReactNode;\n icon: LucideIcon;\n label: string;\n detail?: string;\n disclosure?: boolean;\n}\n\n/** The canonical header of a presented tool call: icon, label, detail, failure mark, chevron. */\nexport const ToolCallPresentedHeader = ({\n leading,\n icon: Icon,\n label,\n detail,\n disclosure = true,\n ...props\n}: ToolCallPresentedHeaderProps) => {\n const { status } = useToolCall();\n\n return (\n <ToolCallHeader {...props}>\n {leading}\n <ToolCallIcon>\n <Icon\n size={14}\n strokeWidth={1.75}\n aria-hidden\n className={status === 'error' ? 'text-error/80' : 'text-icon2'}\n />\n </ToolCallIcon>\n <ToolCallLabel>{label}</ToolCallLabel>\n {detail && <ToolCallDetail>{detail}</ToolCallDetail>}\n <ToolCallSpacer />\n {status === 'error' && (\n <ToolCallTrailing>\n <X size={13} role=\"img\" aria-label=\"Failed\" className=\"text-error shrink-0\" />\n </ToolCallTrailing>\n )}\n {disclosure && <ToolCallDisclosure />}\n </ToolCallHeader>\n );\n};\n\nexport const ToolCallContent = ({ className, children, ...props }: ComponentProps<typeof CollapsibleContent>) => (\n <CollapsibleContent className=\"max-w-full min-w-0\" {...props}>\n <div\n className={cn(\n \"relative ml-[14px] flex max-w-full min-w-0 flex-col gap-1.5 py-1.5 pr-1 pl-4 before:absolute before:inset-y-0 before:left-0 before:w-px before:bg-border1 before:mask-b-from-[calc(100%-min(40%,80px))] before:content-['']\",\n className,\n )}\n >\n {children}\n </div>\n </CollapsibleContent>\n);\n\nexport interface ToolCallMonoProps extends ComponentProps<'pre'> {\n copyText: string;\n}\n\n/** Monospace body block of an expanded call — arguments, command, output — with a hover copy. */\nexport const ToolCallMono = ({ copyText, className, children, ...props }: ToolCallMonoProps) => (\n <div className=\"group/block relative max-w-full min-w-0\">\n <pre\n className={cn(\n 'm-0 max-h-60 max-w-full overflow-auto rounded-md bg-neutral6/5 px-3 py-2 font-mono text-xs leading-normal break-words whitespace-pre-wrap',\n className,\n )}\n {...props}\n >\n {children}\n </pre>\n <CopyButton\n content={copyText}\n size=\"sm\"\n variant=\"ghost\"\n className=\"absolute top-1 right-1 opacity-0 transition-opacity group-hover/block:opacity-100 focus-visible:opacity-100\"\n />\n </div>\n);\n\nexport type { ToolCallStatus };\n","import {\n BookOpen,\n Braces,\n CircleStop,\n Eye,\n FileSearch,\n FolderPlus,\n FolderSearch,\n Globe,\n ScrollText,\n Search,\n SquarePen,\n SquareTerminal,\n Trash2,\n Wrench,\n} from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport interface ToolPresentation {\n icon: LucideIcon;\n label: string;\n /** Salient argument shown next to the label: command, path, pattern… */\n detail?: string;\n /** Shell command, when the tool is terminal-style. Drives the expanded body. */\n command?: string;\n}\n\n/** Tool arguments and results as the mono body shows them: strings verbatim, the rest pretty JSON. */\nexport function stringifyToolValue(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value, null, 2) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction hasProperty<K extends string>(value: object, key: K): value is object & Record<K, unknown> {\n return key in value;\n}\n\nfunction stringArg(args: unknown, key: string): string | undefined {\n if (!args || typeof args !== 'object' || !hasProperty(args, key)) return undefined;\n const value = args[key];\n if (typeof value === 'number') return String(value);\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction firstStringArg(args: unknown, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = stringArg(args, key);\n if (value) return value;\n }\n return undefined;\n}\n\ninterface ToolStyle {\n icon: LucideIcon;\n label: string;\n detailKeys?: string[];\n isCommand?: boolean;\n}\n\nconst TOOL_STYLES: Record<string, ToolStyle> = {\n view: { icon: Eye, label: 'Read', detailKeys: ['path'] },\n read_file: { icon: Eye, label: 'Read', detailKeys: ['path'] },\n write_file: { icon: SquarePen, label: 'Write', detailKeys: ['path'] },\n create_file: { icon: SquarePen, label: 'Write', detailKeys: ['path'] },\n edit_file: { icon: SquarePen, label: 'Edit', detailKeys: ['path'] },\n string_replace: { icon: SquarePen, label: 'Edit', detailKeys: ['path'] },\n str_replace: { icon: SquarePen, label: 'Edit', detailKeys: ['path'] },\n ast_edit: { icon: SquarePen, label: 'Edit', detailKeys: ['path'] },\n execute_command: { icon: SquareTerminal, label: 'Run', detailKeys: ['command'], isCommand: true },\n get_process_output: { icon: ScrollText, label: 'Process output', detailKeys: ['pid'] },\n kill_process: { icon: CircleStop, label: 'Stop process', detailKeys: ['pid'] },\n find_files: { icon: FolderSearch, label: 'Find files', detailKeys: ['pattern', 'path'] },\n list_files: { icon: FolderSearch, label: 'List files', detailKeys: ['pattern', 'path'] },\n grep: { icon: Search, label: 'Search', detailKeys: ['pattern', 'path'] },\n search_content: { icon: Search, label: 'Search', detailKeys: ['pattern', 'query'] },\n search: { icon: Search, label: 'Search', detailKeys: ['query'] },\n web_search: { icon: Globe, label: 'Search the web', detailKeys: ['query'] },\n lsp_inspect: { icon: Braces, label: 'Inspect code', detailKeys: ['path'] },\n file_stat: { icon: FileSearch, label: 'File info', detailKeys: ['path'] },\n delete: { icon: Trash2, label: 'Delete', detailKeys: ['path'] },\n delete_file: { icon: Trash2, label: 'Delete', detailKeys: ['path'] },\n mkdir: { icon: FolderPlus, label: 'New folder', detailKeys: ['path'] },\n skill: { icon: BookOpen, label: 'Skill', detailKeys: ['name'] },\n skill_search: { icon: BookOpen, label: 'Search skills', detailKeys: ['query'] },\n skill_read: { icon: BookOpen, label: 'Skill file', detailKeys: ['path'] },\n};\n\nfunction prettifyToolName(toolName: string): string {\n const words = toolName.replace(/[_-]+/g, ' ').trim();\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : toolName;\n}\n\n/** Agents prefix commands with `cd <workspace> &&`, which crowds out the command itself on a one-line row. */\nfunction withoutCdPrefix(command: string): string {\n return command.replace(/^\\s*cd\\s+(?:'[^']*'|\"[^\"]*\"|[^\\s&|;]+)\\s*&&\\s*/, '') || command;\n}\n\nexport function presentTool(toolName: string, args: unknown): ToolPresentation {\n const style = TOOL_STYLES[toolName.replace(/^mastra_workspace_/, '')];\n if (!style) return { icon: Wrench, label: prettifyToolName(toolName) };\n\n const detail = style.detailKeys ? firstStringArg(args, style.detailKeys) : undefined;\n if (!detail) return { icon: style.icon, label: style.label };\n if (!style.isCommand) return { icon: style.icon, label: style.label, detail };\n return { icon: style.icon, label: style.label, detail: withoutCdPrefix(detail), command: detail };\n}\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"tool-call.es.js","sources":["../../../src/ds/components/ai/tool-call/ansi.ts","../../../src/ds/components/ai/tool-call/group-consecutive.ts","../../../src/ds/components/ai/tool-call/tool-call.tsx","../../../src/ds/components/ai/tool-call/tool-call-edit.tsx","../../../src/ds/components/ai/tool-call/tool-presentation.ts","../../../src/ds/components/ai/tool-call/tool-call-group.tsx"],"sourcesContent":["// Sandbox commands run in a PTY, so CLIs emit color escapes even under NO_COLOR.\n// eslint-disable-next-line no-control-regex\nconst ANSI_RE =\n /[\\u001b\\u009b][[\\]()#;?]*(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d/#&.:=?%@~_]*)*)?\\u0007|(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-nq-uy=><~])/g;\n\n// The same sequences once JSON.stringify escaped the bytes; an even backslash run before the `u` is source text spelling the escape, kept.\nconst ESCAPED_ANSI_RE = /(?<!\\\\)((?:\\\\\\\\)*)\\\\u001[bB](?:\\[[0-9;?<=>]*[a-zA-Z]|\\][\\s\\S]*?(?:\\\\u0007|\\\\u001[bB]\\\\\\\\))/g;\n\nexport function stripAnsi(text: string): string {\n return text.replace(ANSI_RE, '');\n}\n\nexport function stripSerializedAnsi(text: string): string {\n return stripAnsi(text).replace(ESCAPED_ANSI_RE, '$1');\n}\n","export interface ConsecutiveGroups<T> {\n /** Each run, keyed by its first member. */\n byFirstKey: Map<string, T[]>;\n /** The members after the first, which draw nothing of their own. */\n memberKeys: Set<string>;\n}\n\nexport interface ConsecutiveRules<T, U extends T> {\n key: (item: U) => string;\n /** Whether an item extends the run; anything else ends it. */\n joins: (item: T) => item is U;\n /** Runs shorter than this stay individual rows. */\n min?: number;\n}\n\n/** Consecutive tool calls this long fold into one group row. */\nexport const TOOL_GROUP_MIN = 3;\n\n/** Cuts a list into runs of joining items, keeping only the runs long enough to fold. */\nexport function groupConsecutive<T, U extends T>(\n items: readonly T[],\n { key, joins, min = TOOL_GROUP_MIN }: ConsecutiveRules<T, U>,\n): ConsecutiveGroups<U> {\n const byFirstKey = new Map<string, U[]>();\n const memberKeys = new Set<string>();\n let run: U[] = [];\n\n const flush = () => {\n if (run.length >= min) {\n for (const [index, item] of run.entries()) {\n if (index === 0) byFirstKey.set(key(item), run);\n else memberKeys.add(key(item));\n }\n }\n run = [];\n };\n\n for (const item of items) {\n if (joins(item)) run.push(item);\n else flush();\n }\n flush();\n\n return { byFirstKey, memberKeys };\n}\n","import { ChevronRight, X } from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\nimport { createContext, useContext, useId, useState } from 'react';\nimport type { ComponentProps, ReactNode } from 'react';\nimport { useArriving } from '@/ds/components/Arrival';\nimport { Collapsible, CollapsibleContent, CollapsibleTrigger } from '@/ds/components/Collapsible';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { Shimmer } from '@/ds/components/Shimmer';\nimport { Txt } from '@/ds/components/Txt';\nimport { cn } from '@/lib/utils';\n\ntype ToolCallStatus = 'idle' | 'running' | 'error';\n\ninterface ToolCallContextValue {\n open: boolean;\n status: ToolCallStatus;\n}\n\nconst ToolCallContext = createContext<ToolCallContextValue | undefined>(undefined);\n\n// Stryker disable next-line ArrowFunction: the default callback is intentionally behaviorless.\nconst noopOpenChange = () => {};\n\nfunction useToolCall() {\n const context = useContext(ToolCallContext);\n if (!context) throw new Error('ToolCall compounds must be rendered within ToolCall');\n return context;\n}\n\nexport interface ToolCallProps extends Omit<\n ComponentProps<typeof Collapsible>,\n 'defaultOpen' | 'onOpenChange' | 'open'\n> {\n open?: boolean;\n defaultOpen?: boolean;\n onOpenChange?: (open: boolean) => void;\n status?: ToolCallStatus;\n}\n\nexport function ToolCall({\n open: controlledOpen,\n defaultOpen = false,\n onOpenChange = noopOpenChange,\n status = 'idle',\n className,\n children,\n ...props\n}: ToolCallProps) {\n const [uncontrolledOpen, setUncontrolledOpen] = useState(defaultOpen);\n const open = controlledOpen ?? uncontrolledOpen;\n const statusId = useId();\n\n const handleOpenChange = (nextOpen: boolean) => {\n if (controlledOpen === undefined) setUncontrolledOpen(nextOpen);\n onOpenChange(nextOpen);\n };\n\n return (\n <ToolCallContext.Provider value={{ open, status }}>\n <Collapsible\n open={open}\n onOpenChange={handleOpenChange}\n className={cn('max-w-full min-w-0', className)}\n role=\"group\"\n aria-busy={status === 'running'}\n aria-invalid={status === 'error' || undefined}\n aria-describedby={status === 'idle' ? undefined : statusId}\n data-status={status}\n {...props}\n >\n {children}\n {status !== 'idle' && (\n <span id={statusId} className=\"sr-only\">\n {status === 'running' ? 'Tool call running' : 'Tool call failed'}\n </span>\n )}\n </Collapsible>\n </ToolCallContext.Provider>\n );\n}\n\nexport const ToolCallTrigger = ({ className, ...props }: ComponentProps<typeof CollapsibleTrigger>) => (\n <CollapsibleTrigger\n className={cn(\n 'group/row w-full cursor-pointer rounded-md text-left transition-colors hover:bg-neutral6/5 focus-visible:ring-1 focus-visible:ring-accent1 focus-visible:outline-hidden motion-reduce:transition-none',\n className,\n )}\n {...props}\n />\n);\n\nexport const ToolCallHeader = ({ className, children, ...props }: ComponentProps<'span'>) => {\n const { status } = useToolCall();\n\n return (\n <Shimmer\n active={status === 'running'}\n className={cn('flex w-full min-w-0 items-center gap-2 px-1.5 py-1', className)}\n {...props}\n >\n {children}\n </Shimmer>\n );\n};\n\nexport const ToolCallIcon = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('flex size-4 shrink-0 items-center justify-center', className)} {...props} />\n);\n\nexport const ToolCallLabel = ({ className, ...props }: ComponentProps<typeof Txt>) => (\n <Txt as=\"span\" variant=\"ui-sm\" className={cn('text-icon3 max-w-[55%] shrink-0 truncate', className)} {...props} />\n);\n\nexport const ToolCallDetail = ({ className, ...props }: ComponentProps<typeof Txt>) => {\n const arriving = useArriving();\n\n return (\n <Txt\n as=\"span\"\n variant=\"ui-xs\"\n font=\"mono\"\n className={cn('text-icon3 min-w-0 truncate', arriving, className)}\n {...props}\n />\n );\n};\n\nexport const ToolCallSummary = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('flex min-w-0 items-center gap-1', className)} {...props} />\n);\n\nexport interface ToolCallSpacerProps extends ComponentProps<'span'> {\n rule?: boolean;\n}\n\nexport const ToolCallSpacer = ({ rule, className, ...props }: ToolCallSpacerProps) => (\n <span\n aria-hidden\n className={cn('min-w-2 flex-1', rule && 'h-px bg-border1 mask-r-from-[calc(100%-min(100%,160px))]', className)}\n {...props}\n />\n);\n\nexport const ToolCallTrailing = ({ className, ...props }: ComponentProps<'span'>) => (\n <span className={cn('flex shrink-0 items-center', className)} {...props} />\n);\n\nexport const ToolCallDisclosure = ({ className, children, ...props }: ComponentProps<'span'>) => {\n const { open } = useToolCall();\n\n return (\n <span className={cn('flex size-4 shrink-0 items-center justify-center', className)} {...props}>\n <span\n aria-hidden\n className={cn(\n 'text-icon3 flex shrink-0 items-center opacity-0 transition duration-150 motion-reduce:transition-none',\n 'group-hover/row:opacity-100 group-focus-visible/row:opacity-100',\n open && 'rotate-90 opacity-100',\n )}\n >\n {children ?? <ChevronRight size={13} />}\n </span>\n </span>\n );\n};\n\nexport interface ToolCallPresentedHeaderProps extends Omit<ComponentProps<typeof ToolCallHeader>, 'children'> {\n /** Rendered ahead of the icon, e.g. a timestamp. */\n leading?: ReactNode;\n icon: LucideIcon;\n label: string;\n detail?: string;\n disclosure?: boolean;\n}\n\n/** The canonical header of a presented tool call: icon, label, detail, failure mark, chevron. */\nexport const ToolCallPresentedHeader = ({\n leading,\n icon: Icon,\n label,\n detail,\n disclosure = true,\n ...props\n}: ToolCallPresentedHeaderProps) => {\n const { status } = useToolCall();\n\n return (\n <ToolCallHeader {...props}>\n {leading}\n <ToolCallIcon>\n <Icon\n size={14}\n strokeWidth={1.75}\n aria-hidden\n className={status === 'error' ? 'text-error/80' : 'text-icon2'}\n />\n </ToolCallIcon>\n <ToolCallLabel>{label}</ToolCallLabel>\n {detail && <ToolCallDetail>{detail}</ToolCallDetail>}\n <ToolCallSpacer />\n {status === 'error' && (\n <ToolCallTrailing>\n <X size={13} role=\"img\" aria-label=\"Failed\" className=\"text-error shrink-0\" />\n </ToolCallTrailing>\n )}\n {disclosure && <ToolCallDisclosure />}\n </ToolCallHeader>\n );\n};\n\nexport const ToolCallContent = ({ className, children, ...props }: ComponentProps<typeof CollapsibleContent>) => (\n <CollapsibleContent className=\"max-w-full min-w-0\" {...props}>\n <div\n className={cn(\n \"relative ml-[14px] flex max-w-full min-w-0 flex-col gap-1.5 py-1.5 pr-1 pl-4 before:absolute before:inset-y-0 before:left-0 before:w-px before:bg-border1 before:mask-b-from-[calc(100%-min(40%,80px))] before:content-['']\",\n className,\n )}\n >\n {children}\n </div>\n </CollapsibleContent>\n);\n\nexport interface ToolCallMonoProps extends ComponentProps<'pre'> {\n copyText: string;\n}\n\n/** Monospace body block of an expanded call — arguments, command, output — with a hover copy. */\nexport const ToolCallMono = ({ copyText, className, children, ...props }: ToolCallMonoProps) => (\n <div className=\"group/block relative max-w-full min-w-0\">\n <pre\n className={cn(\n 'm-0 max-h-60 max-w-full overflow-auto rounded-md bg-neutral6/5 px-3 py-2 font-mono text-xs leading-normal break-words whitespace-pre-wrap',\n className,\n )}\n {...props}\n >\n {children}\n </pre>\n <CopyButton\n content={copyText}\n size=\"sm\"\n variant=\"ghost\"\n className=\"absolute top-1 right-1 opacity-0 transition-opacity group-hover/block:opacity-100 focus-visible:opacity-100\"\n />\n </div>\n);\n\n/** A shell command as the body shows it: `$` in the margin, the copy takes the command alone. */\nexport const ToolCallCommand = ({ command }: { command: string }) => (\n <ToolCallMono copyText={command} className=\"text-icon5\">\n <span className=\"text-icon3 select-none\">$ </span>\n {command}\n </ToolCallMono>\n);\n\nexport type { ToolCallStatus };\n","import type { ToolEdit } from './tool-presentation';\nimport { tokenStyle, useHighlight } from '@/ds/components/Code';\nimport { CodeBlock } from '@/ds/components/CodeBlock';\nimport { languageForPath } from '@/ds/components/CodeEditor/highlight';\nimport { truncateString } from '@/lib/truncate-string';\nimport { cn } from '@/lib/utils';\n\nconst DIFF_MAX_LINES = 200;\nconst WRITTEN_FILE_MAX_CHARS = 2000;\n\nconst DIFF_SIDES = {\n removed: { sign: '-', row: 'bg-error/10', gutter: 'text-error' },\n added: { sign: '+', row: 'bg-accent1/10', gutter: 'text-accent1' },\n} as const;\n\nfunction boundedLines(text: string): { lines: string[]; hidden: number } {\n const lines = text.split('\\n');\n return { lines: lines.slice(0, DIFF_MAX_LINES), hidden: Math.max(0, lines.length - DIFF_MAX_LINES) };\n}\n\nfunction DiffSide({ lines, side, lang }: { lines: string[]; side: keyof typeof DIFF_SIDES; lang: string | undefined }) {\n const { sign, row, gutter } = DIFF_SIDES[side];\n const code = lines.join('\\n');\n const highlighted = useHighlight(code, lang);\n const tokens = highlighted?.code === code ? highlighted.tokens : undefined;\n\n return (\n <>\n {lines.map((line, index) => (\n <div key={index} className={cn('flex whitespace-pre', row)}>\n <span className={cn('w-5 shrink-0 text-center opacity-70 select-none', gutter)}>{sign}</span>\n <span className=\"text-icon6 flex-1 pr-2.5\">\n {tokens?.[index]?.map((token, tokenIndex) => (\n <span key={tokenIndex} className=\"shiki-token\" style={tokenStyle(token)}>\n {token.content}\n </span>\n )) ?? line}\n </span>\n </div>\n ))}\n </>\n );\n}\n\nexport function ToolCallEdit({ edit }: { edit: ToolEdit }) {\n const lang = languageForPath(edit.path);\n\n if ('content' in edit) {\n return (\n <CodeBlock\n code={truncateString(edit.content, WRITTEN_FILE_MAX_CHARS)}\n lang={lang}\n fileName={edit.path ?? 'Change'}\n overflow=\"scroll\"\n />\n );\n }\n\n const removed = boundedLines(edit.oldText);\n const added = boundedLines(edit.newText);\n const hidden = removed.hidden + added.hidden;\n\n return (\n <div\n className=\"border-border1 bg-neutral6/5 max-w-full min-w-0 overflow-x-auto rounded-md border font-mono text-xs leading-normal\"\n role=\"group\"\n aria-label=\"File change\"\n >\n <DiffSide lines={removed.lines} side=\"removed\" lang={lang} />\n <DiffSide lines={added.lines} side=\"added\" lang={lang} />\n {hidden > 0 && <div className=\"text-icon3 px-2.5 py-1 select-none\">… {hidden} more lines</div>}\n </div>\n );\n}\n","import {\n BookOpen,\n Braces,\n CircleStop,\n Eye,\n FileSearch,\n FolderPlus,\n FolderSearch,\n Globe,\n ScrollText,\n Search,\n SquarePen,\n SquareTerminal,\n Trash2,\n Wrench,\n} from 'lucide-react';\nimport type { LucideIcon } from 'lucide-react';\n\nexport interface ToolPresentation {\n icon: LucideIcon;\n label: string;\n /** Salient argument shown next to the label: command, path, pattern… */\n detail?: string;\n /** Shell command, when the tool is terminal-style. Drives the expanded body. */\n command?: string;\n}\n\n/** Tool arguments and results as the mono body shows them: strings verbatim, the rest pretty JSON. */\nexport function stringifyToolValue(value: unknown): string {\n if (typeof value === 'string') return value;\n try {\n return JSON.stringify(value, null, 2) ?? String(value);\n } catch {\n return String(value);\n }\n}\n\nfunction hasProperty<K extends string>(value: object, key: K): value is object & Record<K, unknown> {\n return key in value;\n}\n\nfunction stringArg(args: unknown, key: string): string | undefined {\n if (!args || typeof args !== 'object' || !hasProperty(args, key)) return undefined;\n const value = args[key];\n if (typeof value === 'number') return String(value);\n return typeof value === 'string' && value.length > 0 ? value : undefined;\n}\n\nfunction firstStringArg(args: unknown, keys: string[]): string | undefined {\n for (const key of keys) {\n const value = stringArg(args, key);\n if (value) return value;\n }\n return undefined;\n}\n\ninterface ToolStyle {\n icon: LucideIcon;\n label: string;\n detailKeys?: string[];\n isCommand?: boolean;\n}\n\nconst TOOL_STYLES: Record<string, ToolStyle> = {\n view: { icon: Eye, label: 'Read', detailKeys: ['path'] },\n read_file: { icon: Eye, label: 'Read', detailKeys: ['path'] },\n write_file: { icon: SquarePen, label: 'Write', detailKeys: ['path'] },\n create_file: { icon: SquarePen, label: 'Write', detailKeys: ['path'] },\n edit_file: { icon: SquarePen, label: 'Edit', detailKeys: ['path'] },\n string_replace: { icon: SquarePen, label: 'Edit', detailKeys: ['path'] },\n str_replace: { icon: SquarePen, label: 'Edit', detailKeys: ['path'] },\n ast_edit: { icon: SquarePen, label: 'Edit', detailKeys: ['path'] },\n execute_command: { icon: SquareTerminal, label: 'Run', detailKeys: ['command'], isCommand: true },\n get_process_output: { icon: ScrollText, label: 'Process output', detailKeys: ['pid'] },\n kill_process: { icon: CircleStop, label: 'Stop process', detailKeys: ['pid'] },\n find_files: { icon: FolderSearch, label: 'Find files', detailKeys: ['pattern', 'path'] },\n list_files: { icon: FolderSearch, label: 'List files', detailKeys: ['pattern', 'path'] },\n grep: { icon: Search, label: 'Search', detailKeys: ['pattern', 'path'] },\n search_content: { icon: Search, label: 'Search', detailKeys: ['pattern', 'query'] },\n search: { icon: Search, label: 'Search', detailKeys: ['query'] },\n web_search: { icon: Globe, label: 'Search the web', detailKeys: ['query'] },\n lsp_inspect: { icon: Braces, label: 'Inspect code', detailKeys: ['path'] },\n file_stat: { icon: FileSearch, label: 'File info', detailKeys: ['path'] },\n delete: { icon: Trash2, label: 'Delete', detailKeys: ['path'] },\n delete_file: { icon: Trash2, label: 'Delete', detailKeys: ['path'] },\n mkdir: { icon: FolderPlus, label: 'New folder', detailKeys: ['path'] },\n skill: { icon: BookOpen, label: 'Skill', detailKeys: ['name'] },\n skill_search: { icon: BookOpen, label: 'Search skills', detailKeys: ['query'] },\n skill_read: { icon: BookOpen, label: 'Skill file', detailKeys: ['path'] },\n};\n\nfunction prettifyToolName(toolName: string): string {\n const words = toolName.replace(/[_-]+/g, ' ').trim();\n return words ? words.charAt(0).toUpperCase() + words.slice(1) : toolName;\n}\n\n/** Agents prefix commands with `cd <workspace> &&`, which crowds out the command itself on a one-line row. */\nfunction withoutCdPrefix(command: string): string {\n return command.replace(/^\\s*cd\\s+(?:'[^']*'|\"[^\"]*\"|[^\\s&|;]+)\\s*&&\\s*/, '') || command;\n}\n\nexport function presentTool(toolName: string, args: unknown): ToolPresentation {\n const style = TOOL_STYLES[toolName.replace(/^mastra_workspace_/, '')];\n if (!style) return { icon: Wrench, label: prettifyToolName(toolName) };\n\n const detail = style.detailKeys ? firstStringArg(args, style.detailKeys) : undefined;\n if (!detail) return { icon: style.icon, label: style.label };\n if (!style.isCommand) return { icon: style.icon, label: style.label, detail };\n return { icon: style.icon, label: style.label, detail: withoutCdPrefix(detail), command: detail };\n}\n\nexport type ToolEdit = { path?: string } & ({ oldText: string; newText: string } | { content: string });\n\nfunction stringField(args: unknown, key: string): string | undefined {\n if (!args || typeof args !== 'object' || !hasProperty(args, key)) return undefined;\n return typeof args[key] === 'string' ? args[key] : undefined;\n}\n\nexport function toolEdit(toolName: string, args: unknown): ToolEdit | undefined {\n const path = stringField(args, 'path');\n const newText = stringField(args, 'new_string');\n if (/string_replace|str_replace|edit_file/i.test(toolName) && newText !== undefined) {\n return { path, oldText: stringField(args, 'old_string') ?? '', newText };\n }\n const content = stringField(args, 'content');\n if (/write_file|create_file/i.test(toolName) && content !== undefined) return { path, content };\n return undefined;\n}\n\n/** Task tools draw in the docked task list, never as a transcript row. */\nconst TASK_TOOLS = new Set(['task_write', 'task_update', 'task_complete', 'task_check']);\n\nexport function isTaskTool(toolName: string): boolean {\n return TASK_TOOLS.has(toolName);\n}\n","import { FoldVertical, X } from 'lucide-react';\nimport type { ReactNode } from 'react';\nimport {\n ToolCall,\n ToolCallContent,\n ToolCallDetail,\n ToolCallDisclosure,\n ToolCallHeader,\n ToolCallIcon,\n ToolCallLabel,\n ToolCallSpacer,\n ToolCallSummary,\n ToolCallTrailing,\n ToolCallTrigger,\n} from './tool-call';\nimport type { ToolCallStatus } from './tool-call';\nimport { presentTool } from './tool-presentation';\nimport { ScrollArea } from '@/ds/components/ScrollArea';\nimport { Txt } from '@/ds/components/Txt';\n\nexport interface ToolCallGroupStep {\n toolName: string;\n args: unknown;\n status: ToolCallStatus;\n}\n\nexport interface ToolCallGroupProps {\n steps: ToolCallGroupStep[];\n /** Rendered ahead of the icon, e.g. the time the first step began. */\n leading?: ReactNode;\n children: ReactNode;\n}\n\nconst MAX_KIND_GLYPHS = 4;\n\nexport function ToolCallGroup({ steps, leading, children }: ToolCallGroupProps) {\n const running = steps.find(step => step.status === 'running');\n const liveDetail = running && presentTool(running.toolName, running.args).detail;\n\n return (\n <ToolCall status={running ? 'running' : 'idle'} aria-label={`Tool group: ${steps.length} steps`}>\n <ToolCallTrigger>\n <ToolCallHeader>\n {leading}\n <ToolCallIcon>\n <FoldVertical size={14} strokeWidth={1.75} aria-hidden className=\"text-icon2\" />\n </ToolCallIcon>\n <ToolCallLabel>{steps.length} steps</ToolCallLabel>\n {liveDetail && <ToolCallDetail>{liveDetail}</ToolCallDetail>}\n <GroupKinds steps={steps} />\n <ToolCallSpacer rule />\n <ToolCallTrailing>\n <GroupProgress steps={steps} />\n </ToolCallTrailing>\n <ToolCallDisclosure />\n </ToolCallHeader>\n </ToolCallTrigger>\n <ToolCallContent className=\"py-0.5 pr-0 pl-2.5\">\n <ScrollArea maxHeight=\"18rem\" autoScroll={Boolean(running)} revealScrollbarOnHover={false}>\n {children}\n </ScrollArea>\n </ToolCallContent>\n </ToolCall>\n );\n}\n\nfunction GroupProgress({ steps }: { steps: ToolCallGroupStep[] }) {\n const done = steps.filter(step => step.status !== 'running').length;\n if (done < steps.length) {\n return (\n <Txt as=\"span\" variant=\"ui-xs\" className=\"text-icon3 shrink-0 tabular-nums\">\n {done}/{steps.length}\n </Txt>\n );\n }\n if (steps.some(step => step.status === 'error')) {\n return <X size={13} role=\"img\" aria-label=\"Failed\" className=\"text-error shrink-0\" />;\n }\n return null;\n}\n\nfunction GroupKinds({ steps }: { steps: ToolCallGroupStep[] }) {\n const iconByLabel = new Map(\n steps.map(step => presentTool(step.toolName, step.args)).map(({ label, icon }) => [label, icon]),\n );\n const kinds = [...iconByLabel].slice(0, MAX_KIND_GLYPHS);\n\n return (\n <ToolCallSummary role=\"img\" aria-label={kinds.map(([label]) => label).join(', ')} className=\"shrink-0 gap-1.5\">\n {kinds.map(([label, Kind]) => (\n <Kind key={label} size={12} strokeWidth={1.75} className=\"text-icon2\" />\n ))}\n </ToolCallSummary>\n );\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@
|
|
|
3
3
|
const jsxRuntime = require('react/jsx-runtime');
|
|
4
4
|
const langJson = require('@codemirror/lang-json');
|
|
5
5
|
const language = require('@codemirror/language');
|
|
6
|
+
const merge = require('@codemirror/merge');
|
|
6
7
|
const search = require('@codemirror/search');
|
|
7
8
|
const state = require('@codemirror/state');
|
|
8
9
|
const view = require('@codemirror/view');
|
|
@@ -15,7 +16,7 @@ const Button = require('./Button-D10WB4vc.cjs');
|
|
|
15
16
|
const buttonsGroup = require('./buttons-group-Cn36DWYX.cjs');
|
|
16
17
|
const copyButton = require('./copy-button-BtnbaMvl.cjs');
|
|
17
18
|
const utils_cn = require('./cn-DCPcv4xv.cjs');
|
|
18
|
-
const dialog = require('./dialog-
|
|
19
|
+
const dialog = require('./dialog-D-7Hkb3j.cjs');
|
|
19
20
|
const searchFieldBlock = require('./search-field-block-CiinIsub.cjs');
|
|
20
21
|
const themeProvider = require('./theme-provider-aO5-jZVp.cjs');
|
|
21
22
|
|
|
@@ -67,6 +68,32 @@ const searchHighlightTheme = view.EditorView.baseTheme({
|
|
|
67
68
|
function searchHighlightExtension() {
|
|
68
69
|
return [searchHighlightField, searchHighlightTheme];
|
|
69
70
|
}
|
|
71
|
+
const diffLineTheme = view.EditorView.theme({
|
|
72
|
+
".cm-line.cm-diff-removed, .cm-line.cm-diff-removed.cm-activeLine": {
|
|
73
|
+
backgroundColor: "color-mix(in srgb, var(--accent2) 18%, transparent)"
|
|
74
|
+
},
|
|
75
|
+
".cm-line.cm-diff-added, .cm-line.cm-diff-added.cm-activeLine": {
|
|
76
|
+
backgroundColor: "color-mix(in srgb, var(--accent1) 18%, transparent)"
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
function diffHighlightExtension(doc, { against, side }) {
|
|
80
|
+
const [a, b] = side === "a" ? [doc, against] : [against, doc];
|
|
81
|
+
const text = state.Text.of(doc.split("\n"));
|
|
82
|
+
const line = view.Decoration.line({ class: side === "a" ? "cm-diff-removed" : "cm-diff-added" });
|
|
83
|
+
const builder = new state.RangeSetBuilder();
|
|
84
|
+
for (const chunk of merge.Chunk.build(state.Text.of(a.split("\n")), state.Text.of(b.split("\n")))) {
|
|
85
|
+
const from = side === "a" ? chunk.fromA : chunk.fromB;
|
|
86
|
+
const to = side === "a" ? chunk.endA : chunk.endB;
|
|
87
|
+
if (from >= to) continue;
|
|
88
|
+
for (let pos = from; pos <= Math.min(to, text.length); ) {
|
|
89
|
+
const l = text.lineAt(pos);
|
|
90
|
+
builder.add(l.from, l.from, line);
|
|
91
|
+
if (l.to >= to) break;
|
|
92
|
+
pos = l.to + 1;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
return [view.EditorView.decorations.of(builder.finish()), diffLineTheme];
|
|
96
|
+
}
|
|
70
97
|
function buildDarkTheme() {
|
|
71
98
|
return codemirrorThemeDracula.draculaInit({
|
|
72
99
|
settings: {
|
|
@@ -134,9 +161,11 @@ function DataCodeSection({
|
|
|
134
161
|
dialogTitle,
|
|
135
162
|
icon,
|
|
136
163
|
simplified = false,
|
|
137
|
-
className
|
|
164
|
+
className,
|
|
165
|
+
diff
|
|
138
166
|
}) {
|
|
139
167
|
const theme = useCodemirrorTheme();
|
|
168
|
+
const diffExtension = React.useMemo(() => diff ? diffHighlightExtension(codeStr, diff) : [], [codeStr, diff]);
|
|
140
169
|
const [showAsMultilineText, setShowAsMultilineText] = React.useState(false);
|
|
141
170
|
const [searchMinimized, setSearchMinimized] = React.useState(true);
|
|
142
171
|
const [searchQuery, setSearchQueryState] = React.useState("");
|
|
@@ -262,7 +291,7 @@ function DataCodeSection({
|
|
|
262
291
|
ReactCodeMirror,
|
|
263
292
|
{
|
|
264
293
|
ref: editorRef,
|
|
265
|
-
extensions: [langJson.json(), view.EditorView.lineWrapping, searchHighlightExtension()],
|
|
294
|
+
extensions: [langJson.json(), view.EditorView.lineWrapping, searchHighlightExtension(), diffExtension],
|
|
266
295
|
theme,
|
|
267
296
|
value: codeStr,
|
|
268
297
|
editable: false
|
|
@@ -309,7 +338,7 @@ function DataCodeSection({
|
|
|
309
338
|
ReactCodeMirror,
|
|
310
339
|
{
|
|
311
340
|
ref: expandedEditorRef,
|
|
312
|
-
extensions: [langJson.json(), view.EditorView.lineWrapping, searchHighlightExtension()],
|
|
341
|
+
extensions: [langJson.json(), view.EditorView.lineWrapping, searchHighlightExtension(), diffExtension],
|
|
313
342
|
theme,
|
|
314
343
|
value: codeStr,
|
|
315
344
|
editable: false
|
|
@@ -332,4 +361,4 @@ function containsInnerNewline(obj) {
|
|
|
332
361
|
|
|
333
362
|
exports.DataCodeSection = DataCodeSection;
|
|
334
363
|
exports.DataPanelSectionHeading = DataPanelSectionHeading;
|
|
335
|
-
//# sourceMappingURL=data-code-section-
|
|
364
|
+
//# sourceMappingURL=data-code-section-B_lg_J_0.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"data-code-section-B_lg_J_0.cjs","sources":["../src/ds/components/DataPanel/data-panel-section-heading.tsx","../src/ds/components/DataCodeSection/data-code-section.tsx"],"sourcesContent":["import type { ReactNode } from 'react';\nimport { cn } from '@/lib/utils';\n\nexport interface DataPanelSectionHeadingProps {\n /** Optional leading icon. Rendered before `children` and sized via `[&>svg]:size-3.5`. */\n icon?: ReactNode;\n className?: string;\n children: ReactNode;\n}\n\n/**\n * Section heading inside a DataPanel.Content (e.g. above a code block or a key-values list).\n * Used by `DataCodeSection` and any consumer that needs a matching small-caps label.\n */\nexport function DataPanelSectionHeading({ icon, className, children }: DataPanelSectionHeadingProps) {\n return (\n <div\n className={cn(\n 'flex items-center gap-1.5 text-ui-sm tracking-widest text-neutral2 uppercase [&>svg]:size-3.5',\n className,\n )}\n >\n {icon}\n {children}\n </div>\n );\n}\n","import { json } from '@codemirror/lang-json';\nimport { HighlightStyle, syntaxHighlighting } from '@codemirror/language';\nimport { Chunk } from '@codemirror/merge';\nimport { SearchCursor } from '@codemirror/search';\nimport type { Extension } from '@codemirror/state';\nimport { StateEffect, StateField, RangeSetBuilder, Text } from '@codemirror/state';\nimport type { DecorationSet } from '@codemirror/view';\nimport { Decoration, EditorView } from '@codemirror/view';\nimport { tags as t } from '@lezer/highlight';\nimport { draculaInit } from '@uiw/codemirror-theme-dracula';\nimport type { ReactCodeMirrorRef } from '@uiw/react-codemirror';\nimport ReactCodeMirror from '@uiw/react-codemirror';\nimport { AlignJustifyIcon, AlignLeftIcon, ExpandIcon, XIcon } from 'lucide-react';\nimport { useCallback, useMemo, useRef, useState } from 'react';\nimport { Button } from '@/ds/components/Button';\nimport { ButtonsGroup } from '@/ds/components/ButtonsGroup';\nimport { CopyButton } from '@/ds/components/CopyButton';\nimport { DataPanelSectionHeading } from '@/ds/components/DataPanel/data-panel-section-heading';\nimport {\n Dialog,\n DialogClose,\n DialogContent,\n DialogHeader,\n DialogTitle,\n DialogDescription,\n} from '@/ds/components/Dialog';\nimport { SearchFieldBlock } from '@/ds/components/FormFieldBlocks/fields/search-field-block';\nimport { useTheme } from '@/ds/components/ThemeProvider';\nimport { cn } from '@/lib/utils';\n\n// -- Search highlight extension -----------------------------------------------\n\nconst setSearchQuery = StateEffect.define<string>();\n\nconst searchHighlightMark = Decoration.mark({ class: 'cm-search-match' });\n\nconst searchHighlightField = StateField.define<DecorationSet>({\n create() {\n return Decoration.none;\n },\n update(decorations, tr) {\n for (const effect of tr.effects) {\n if (effect.is(setSearchQuery)) {\n const query = effect.value;\n if (!query) return Decoration.none;\n const builder = new RangeSetBuilder<Decoration>();\n const cursor = new SearchCursor(tr.state.doc, query, 0, tr.state.doc.length, (a: string) => a.toLowerCase());\n while (!cursor.next().done) {\n builder.add(cursor.value.from, cursor.value.to, searchHighlightMark);\n }\n return builder.finish();\n }\n }\n return decorations;\n },\n provide: f => EditorView.decorations.from(f),\n});\n\nconst searchHighlightTheme = EditorView.baseTheme({\n '.cm-search-match': {\n backgroundColor: 'color-mix(in srgb, var(--accent1) 60%, transparent)',\n borderRadius: 'var(--radius-sm)',\n },\n});\n\nfunction searchHighlightExtension(): Extension {\n return [searchHighlightField, searchHighlightTheme];\n}\n\n// -- Diff highlight extension -------------------------------------------------\n\nexport interface DataCodeSectionDiff {\n /** The other document to compare against. */\n against: string;\n /** `a` = this document is the \"before\" (changes in red), `b` = \"after\" (changes in green). */\n side: 'a' | 'b';\n}\n\n// `EditorView.theme` (not baseTheme) so these win over the app theme's `.cm-activeLine { background: transparent }`.\nconst diffLineTheme = EditorView.theme({\n '.cm-line.cm-diff-removed, .cm-line.cm-diff-removed.cm-activeLine': {\n backgroundColor: 'color-mix(in srgb, var(--accent2) 18%, transparent)',\n },\n '.cm-line.cm-diff-added, .cm-line.cm-diff-added.cm-activeLine': {\n backgroundColor: 'color-mix(in srgb, var(--accent1) 18%, transparent)',\n },\n});\n\nfunction diffHighlightExtension(doc: string, { against, side }: DataCodeSectionDiff): Extension {\n const [a, b] = side === 'a' ? [doc, against] : [against, doc];\n const text = Text.of(doc.split('\\n'));\n const line = Decoration.line({ class: side === 'a' ? 'cm-diff-removed' : 'cm-diff-added' });\n const builder = new RangeSetBuilder<Decoration>();\n for (const chunk of Chunk.build(Text.of(a.split('\\n')), Text.of(b.split('\\n')))) {\n const from = side === 'a' ? chunk.fromA : chunk.fromB;\n const to = side === 'a' ? chunk.endA : chunk.endB;\n if (from >= to) continue;\n for (let pos = from; pos <= Math.min(to, text.length);) {\n const l = text.lineAt(pos);\n builder.add(l.from, l.from, line);\n if (l.to >= to) break;\n pos = l.to + 1;\n }\n }\n return [EditorView.decorations.of(builder.finish()), diffLineTheme];\n}\n\n// -- Themes -------------------------------------------------------------------\n\nfunction buildDarkTheme(): Extension {\n return draculaInit({\n settings: {\n fontFamily: 'var(--font-mono)',\n fontSize: '0.75rem',\n lineHighlight: 'transparent',\n gutterBackground: 'transparent',\n gutterForeground: '#939393',\n background: 'transparent',\n },\n styles: [{ tag: [t.className, t.propertyName] }],\n });\n}\n\nfunction buildLightTheme(): Extension {\n const editorTheme = EditorView.theme({\n '&': {\n backgroundColor: 'transparent',\n color: 'var(--neutral6)',\n fontSize: '0.75rem',\n },\n '&.cm-editor .cm-scroller': {\n fontFamily: 'var(--font-mono)',\n },\n '.cm-gutters': {\n backgroundColor: 'transparent',\n color: 'var(--neutral2)',\n borderRight: 'none',\n },\n '.cm-content': {\n color: 'var(--neutral6)',\n caretColor: 'var(--neutral6)',\n },\n '.cm-activeLine': {\n backgroundColor: 'transparent',\n },\n '.cm-activeLineGutter': {\n backgroundColor: 'transparent',\n },\n '.cm-cursor, .cm-dropCursor': {\n borderLeftColor: 'var(--neutral6)',\n },\n });\n\n const highlightStyle = HighlightStyle.define([\n { tag: [t.comment, t.bracket], color: 'var(--neutral2)' },\n { tag: [t.string, t.meta, t.regexp], color: 'var(--accent1)' },\n { tag: [t.atom, t.bool, t.special(t.variableName)], color: 'var(--accent6)' },\n { tag: [t.keyword, t.operator, t.tagName], color: 'var(--accent2)' },\n { tag: [t.function(t.propertyName), t.propertyName], color: 'var(--accent5)' },\n {\n tag: [t.definition(t.variableName), t.function(t.variableName), t.className, t.attributeName],\n color: 'var(--accent3)',\n },\n { tag: [t.variableName, t.number], color: 'var(--accent5)' },\n { tag: [t.name, t.quote], color: 'var(--accent1)' },\n ]);\n\n return [editorTheme, syntaxHighlighting(highlightStyle)];\n}\n\nconst useCodemirrorTheme = (): Extension => {\n const isDark = useTheme().resolvedTheme === 'dark';\n return useMemo(() => (isDark ? buildDarkTheme() : buildLightTheme()), [isDark]);\n};\n\n// -- Component ----------------------------------------------------------------\n\nexport interface DataCodeSectionProps {\n title: React.ReactNode;\n dialogTitle?: React.ReactNode;\n icon?: React.ReactNode;\n codeStr?: string;\n simplified?: boolean;\n className?: string;\n /** Highlight lines that differ from another document. */\n diff?: DataCodeSectionDiff;\n}\n\nexport function DataCodeSection({\n codeStr = '',\n title,\n dialogTitle,\n icon,\n simplified = false,\n className,\n diff,\n}: DataCodeSectionProps) {\n const theme = useCodemirrorTheme();\n const diffExtension = useMemo(() => (diff ? diffHighlightExtension(codeStr, diff) : []), [codeStr, diff]);\n const [showAsMultilineText, setShowAsMultilineText] = useState(false);\n const [searchMinimized, setSearchMinimized] = useState(true);\n const [searchQuery, setSearchQueryState] = useState('');\n const [expandedOpen, setExpandedOpen] = useState(false);\n const [expandedSearchQuery, setExpandedSearchQuery] = useState('');\n const [expandedMultiline, setExpandedMultiline] = useState(false);\n const editorRef = useRef<ReactCodeMirrorRef>(null);\n const expandedEditorRef = useRef<ReactCodeMirrorRef>(null);\n\n const hasMultilineText = useMemo(() => {\n try {\n const parsed = JSON.parse(codeStr);\n return containsInnerNewline(parsed || '');\n } catch {\n return false;\n }\n }, [codeStr]);\n\n const dispatchSearch = useCallback((query: string) => {\n const view = editorRef.current?.view;\n if (view) {\n view.dispatch({ effects: setSearchQuery.of(query) });\n if (query) {\n const cursor = new SearchCursor(view.state.doc, query, 0, view.state.doc.length, (a: string) =>\n a.toLowerCase(),\n );\n if (!cursor.next().done) {\n view.dispatch({\n selection: { anchor: cursor.value.from },\n scrollIntoView: true,\n });\n }\n }\n }\n }, []);\n\n const handleSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setSearchQueryState(val);\n dispatchSearch(val);\n },\n [dispatchSearch],\n );\n\n const handleSearchReset = useCallback(() => {\n setSearchQueryState('');\n dispatchSearch('');\n }, [dispatchSearch]);\n\n const dispatchExpandedSearch = useCallback((query: string) => {\n const view = expandedEditorRef.current?.view;\n if (view) {\n view.dispatch({ effects: setSearchQuery.of(query) });\n if (query) {\n const cursor = new SearchCursor(view.state.doc, query, 0, view.state.doc.length, (a: string) =>\n a.toLowerCase(),\n );\n if (!cursor.next().done) {\n view.dispatch({\n selection: { anchor: cursor.value.from },\n scrollIntoView: true,\n });\n }\n }\n }\n }, []);\n\n const handleExpandedSearchChange = useCallback(\n (e: React.ChangeEvent<HTMLInputElement>) => {\n const val = e.target.value;\n setExpandedSearchQuery(val);\n dispatchExpandedSearch(val);\n },\n [dispatchExpandedSearch],\n );\n\n const handleExpandedSearchReset = useCallback(() => {\n setExpandedSearchQuery('');\n dispatchExpandedSearch('');\n }, [dispatchExpandedSearch]);\n\n const finalCodeStr = showAsMultilineText ? codeStr?.replace(/\\\\n/g, '\\n') : codeStr;\n const expandedFinalCodeStr = expandedMultiline ? codeStr?.replace(/\\\\n/g, '\\n') : codeStr;\n const usePlainTextView = simplified || showAsMultilineText;\n\n if (!codeStr || codeStr === 'null') return null;\n\n return (\n <div className={cn('flex flex-col gap-2', className)}>\n <div className=\"flex items-center justify-between\">\n <DataPanelSectionHeading icon={icon}>{title}</DataPanelSectionHeading>\n <div className=\"flex items-center gap-2\">\n {!usePlainTextView && (\n <SearchFieldBlock\n name=\"code-section-search\"\n label=\"Search code\"\n labelIsHidden\n placeholder=\"Search...\"\n value={searchQuery}\n onChange={handleSearchChange}\n onReset={handleSearchReset}\n size=\"sm\"\n isMinimized={searchMinimized}\n onMinimizedChange={setSearchMinimized}\n />\n )}\n <ButtonsGroup>\n <CopyButton content={codeStr || 'No content'} size=\"sm\" />\n {hasMultilineText && (\n <Button\n size=\"sm\"\n aria-label={showAsMultilineText ? 'Show escaped newlines' : 'Show multiline text'}\n tooltip={showAsMultilineText ? 'Show escaped newlines' : 'Show multiline text'}\n onClick={() => setShowAsMultilineText(v => !v)}\n >\n {showAsMultilineText ? <AlignLeftIcon /> : <AlignJustifyIcon />}\n </Button>\n )}\n <Button size=\"sm\" aria-label=\"Expand\" tooltip=\"Expand\" onClick={() => setExpandedOpen(true)}>\n <ExpandIcon />\n </Button>\n </ButtonsGroup>\n </div>\n </div>\n\n <div className=\"border-border1 bg-surface3 text-ui-sm text-neutral4 max-h-[30vh] overflow-hidden overflow-y-auto rounded-lg border p-3 break-all dark:border-white/10 dark:bg-black/20\">\n {usePlainTextView ? (\n <div className=\"text-neutral4 font-mono break-all\">\n <pre className=\"text-wrap\">{finalCodeStr}</pre>\n </div>\n ) : (\n <ReactCodeMirror\n ref={editorRef}\n extensions={[json(), EditorView.lineWrapping, searchHighlightExtension(), diffExtension]}\n theme={theme}\n value={codeStr}\n editable={false}\n />\n )}\n </div>\n\n <Dialog open={expandedOpen} onOpenChange={setExpandedOpen}>\n <DialogContent className=\"grid h-[calc(100vh-6rem)]! max-w-[90vw]! grid-rows-[auto_1fr] [&>.absolute]:hidden\">\n <DialogHeader className=\"flex-row items-center justify-between\">\n <DialogTitle className=\"text-ui-sm flex min-w-0 items-center gap-1.5 truncate [&>svg]:size-3.5\">\n {dialogTitle ?? (\n <>\n {icon}\n {title}\n </>\n )}\n </DialogTitle>\n <DialogDescription>Expanded code view</DialogDescription>\n <div className=\"flex shrink-0 items-center gap-2\">\n {!expandedMultiline && (\n <SearchFieldBlock\n name=\"expanded-code-search\"\n label=\"Search code\"\n labelIsHidden\n placeholder=\"Search...\"\n value={expandedSearchQuery}\n onChange={handleExpandedSearchChange}\n onReset={handleExpandedSearchReset}\n size=\"sm\"\n />\n )}\n <ButtonsGroup>\n <CopyButton content={codeStr || 'No content'} size=\"sm\" />\n {hasMultilineText && (\n <Button\n size=\"sm\"\n aria-label={expandedMultiline ? 'Show escaped newlines' : 'Show multiline text'}\n tooltip={expandedMultiline ? 'Show escaped newlines' : 'Show multiline text'}\n onClick={() => setExpandedMultiline(v => !v)}\n >\n {expandedMultiline ? <AlignLeftIcon /> : <AlignJustifyIcon />}\n </Button>\n )}\n <DialogClose asChild>\n <Button size=\"sm\" aria-label=\"Close\" tooltip=\"Close\">\n <XIcon />\n </Button>\n </DialogClose>\n </ButtonsGroup>\n </div>\n </DialogHeader>\n <div className=\"overflow-auto px-6 pb-6\">\n {expandedMultiline ? (\n <div className=\"border-border1 bg-surface3 text-ui-sm text-neutral4 overflow-hidden overflow-y-auto rounded-lg border p-3 break-all dark:border-white/10 dark:bg-black/20\">\n <div className=\"text-neutral4 font-mono break-all\">\n <pre className=\"text-wrap\">{expandedFinalCodeStr}</pre>\n </div>\n </div>\n ) : (\n <ReactCodeMirror\n ref={expandedEditorRef}\n extensions={[json(), EditorView.lineWrapping, searchHighlightExtension(), diffExtension]}\n theme={theme}\n value={codeStr}\n editable={false}\n />\n )}\n </div>\n </DialogContent>\n </Dialog>\n </div>\n );\n}\n\nfunction containsInnerNewline(obj: unknown): boolean {\n if (typeof obj === 'string') {\n const idx = obj.indexOf('\\n');\n return idx !== -1 && idx !== obj.length - 1;\n } else if (Array.isArray(obj)) {\n return obj.some(item => containsInnerNewline(item));\n } else if (obj && typeof obj === 'object') {\n return Object.values(obj).some(value => containsInnerNewline(value));\n }\n return false;\n}\n"],"names":["jsxs","cn","StateEffect","Decoration","StateField","RangeSetBuilder","SearchCursor","EditorView","Text","Chunk","draculaInit","t","HighlightStyle","syntaxHighlighting","useTheme","useMemo","useState","useRef","useCallback","jsx","SearchFieldBlock","ButtonsGroup","CopyButton","Button","AlignLeftIcon","AlignJustifyIcon","ExpandIcon","json","Dialog","DialogContent","DialogHeader","DialogTitle","Fragment","DialogDescription","DialogClose","XIcon"],"mappings":"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"}
|
|
@@ -1,19 +1,20 @@
|
|
|
1
1
|
import { jsxs, jsx, Fragment } from 'react/jsx-runtime';
|
|
2
2
|
import { json } from '@codemirror/lang-json';
|
|
3
3
|
import { HighlightStyle, syntaxHighlighting } from '@codemirror/language';
|
|
4
|
+
import { Chunk } from '@codemirror/merge';
|
|
4
5
|
import { SearchCursor } from '@codemirror/search';
|
|
5
|
-
import { StateEffect, StateField
|
|
6
|
+
import { Text, RangeSetBuilder, StateEffect, StateField } from '@codemirror/state';
|
|
6
7
|
import { EditorView, Decoration } from '@codemirror/view';
|
|
7
8
|
import { tags } from '@lezer/highlight';
|
|
8
9
|
import { draculaInit } from '@uiw/codemirror-theme-dracula';
|
|
9
10
|
import ReactCodeMirror from '@uiw/react-codemirror';
|
|
10
11
|
import { AlignLeftIcon, AlignJustifyIcon, ExpandIcon, XIcon } from 'lucide-react';
|
|
11
|
-
import { useState, useRef,
|
|
12
|
+
import { useMemo, useState, useRef, useCallback } from 'react';
|
|
12
13
|
import { B as Button } from './Button-BsfLQEC6.js';
|
|
13
14
|
import { B as ButtonsGroup } from './buttons-group-BjM12HPx.js';
|
|
14
15
|
import { C as CopyButton } from './copy-button-BHmcGzIz.js';
|
|
15
16
|
import { c as cn } from './cn-B4oPhFx9.js';
|
|
16
|
-
import { D as Dialog,
|
|
17
|
+
import { D as Dialog, a as DialogContent, b as DialogHeader, c as DialogTitle, d as DialogDescription, j as DialogClose } from './dialog-CZMPDVUj.js';
|
|
17
18
|
import { S as SearchFieldBlock } from './search-field-block-D51aN1d9.js';
|
|
18
19
|
import { u as useTheme } from './theme-provider-C9ih9jSS.js';
|
|
19
20
|
|
|
@@ -65,6 +66,32 @@ const searchHighlightTheme = EditorView.baseTheme({
|
|
|
65
66
|
function searchHighlightExtension() {
|
|
66
67
|
return [searchHighlightField, searchHighlightTheme];
|
|
67
68
|
}
|
|
69
|
+
const diffLineTheme = EditorView.theme({
|
|
70
|
+
".cm-line.cm-diff-removed, .cm-line.cm-diff-removed.cm-activeLine": {
|
|
71
|
+
backgroundColor: "color-mix(in srgb, var(--accent2) 18%, transparent)"
|
|
72
|
+
},
|
|
73
|
+
".cm-line.cm-diff-added, .cm-line.cm-diff-added.cm-activeLine": {
|
|
74
|
+
backgroundColor: "color-mix(in srgb, var(--accent1) 18%, transparent)"
|
|
75
|
+
}
|
|
76
|
+
});
|
|
77
|
+
function diffHighlightExtension(doc, { against, side }) {
|
|
78
|
+
const [a, b] = side === "a" ? [doc, against] : [against, doc];
|
|
79
|
+
const text = Text.of(doc.split("\n"));
|
|
80
|
+
const line = Decoration.line({ class: side === "a" ? "cm-diff-removed" : "cm-diff-added" });
|
|
81
|
+
const builder = new RangeSetBuilder();
|
|
82
|
+
for (const chunk of Chunk.build(Text.of(a.split("\n")), Text.of(b.split("\n")))) {
|
|
83
|
+
const from = side === "a" ? chunk.fromA : chunk.fromB;
|
|
84
|
+
const to = side === "a" ? chunk.endA : chunk.endB;
|
|
85
|
+
if (from >= to) continue;
|
|
86
|
+
for (let pos = from; pos <= Math.min(to, text.length); ) {
|
|
87
|
+
const l = text.lineAt(pos);
|
|
88
|
+
builder.add(l.from, l.from, line);
|
|
89
|
+
if (l.to >= to) break;
|
|
90
|
+
pos = l.to + 1;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return [EditorView.decorations.of(builder.finish()), diffLineTheme];
|
|
94
|
+
}
|
|
68
95
|
function buildDarkTheme() {
|
|
69
96
|
return draculaInit({
|
|
70
97
|
settings: {
|
|
@@ -132,9 +159,11 @@ function DataCodeSection({
|
|
|
132
159
|
dialogTitle,
|
|
133
160
|
icon,
|
|
134
161
|
simplified = false,
|
|
135
|
-
className
|
|
162
|
+
className,
|
|
163
|
+
diff
|
|
136
164
|
}) {
|
|
137
165
|
const theme = useCodemirrorTheme();
|
|
166
|
+
const diffExtension = useMemo(() => diff ? diffHighlightExtension(codeStr, diff) : [], [codeStr, diff]);
|
|
138
167
|
const [showAsMultilineText, setShowAsMultilineText] = useState(false);
|
|
139
168
|
const [searchMinimized, setSearchMinimized] = useState(true);
|
|
140
169
|
const [searchQuery, setSearchQueryState] = useState("");
|
|
@@ -260,7 +289,7 @@ function DataCodeSection({
|
|
|
260
289
|
ReactCodeMirror,
|
|
261
290
|
{
|
|
262
291
|
ref: editorRef,
|
|
263
|
-
extensions: [json(), EditorView.lineWrapping, searchHighlightExtension()],
|
|
292
|
+
extensions: [json(), EditorView.lineWrapping, searchHighlightExtension(), diffExtension],
|
|
264
293
|
theme,
|
|
265
294
|
value: codeStr,
|
|
266
295
|
editable: false
|
|
@@ -307,7 +336,7 @@ function DataCodeSection({
|
|
|
307
336
|
ReactCodeMirror,
|
|
308
337
|
{
|
|
309
338
|
ref: expandedEditorRef,
|
|
310
|
-
extensions: [json(), EditorView.lineWrapping, searchHighlightExtension()],
|
|
339
|
+
extensions: [json(), EditorView.lineWrapping, searchHighlightExtension(), diffExtension],
|
|
311
340
|
theme,
|
|
312
341
|
value: codeStr,
|
|
313
342
|
editable: false
|
|
@@ -329,4 +358,4 @@ function containsInnerNewline(obj) {
|
|
|
329
358
|
}
|
|
330
359
|
|
|
331
360
|
export { DataCodeSection as D, DataPanelSectionHeading as a };
|
|
332
|
-
//# sourceMappingURL=data-code-section-
|
|
361
|
+
//# sourceMappingURL=data-code-section-Cm_W_XhO.js.map
|