@stigmer/react 0.0.43 → 0.0.45

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 (83) hide show
  1. package/execution/ArtifactContentRenderer.d.ts +58 -0
  2. package/execution/ArtifactContentRenderer.d.ts.map +1 -0
  3. package/execution/ArtifactContentRenderer.js +163 -0
  4. package/execution/ArtifactContentRenderer.js.map +1 -0
  5. package/execution/ArtifactPreviewModal.d.ts +3 -2
  6. package/execution/ArtifactPreviewModal.d.ts.map +1 -1
  7. package/execution/ArtifactPreviewModal.js +11 -62
  8. package/execution/ArtifactPreviewModal.js.map +1 -1
  9. package/execution/ExecutionPhaseBadge.js +1 -1
  10. package/execution/ExecutionPhaseBadge.js.map +1 -1
  11. package/execution/MessageThread.d.ts.map +1 -1
  12. package/execution/MessageThread.js +21 -2
  13. package/execution/MessageThread.js.map +1 -1
  14. package/execution/SetupProgress.d.ts +35 -0
  15. package/execution/SetupProgress.d.ts.map +1 -0
  16. package/execution/SetupProgress.js +65 -0
  17. package/execution/SetupProgress.js.map +1 -0
  18. package/execution/ToolCallGroup.d.ts.map +1 -1
  19. package/execution/ToolCallGroup.js +9 -1
  20. package/execution/ToolCallGroup.js.map +1 -1
  21. package/execution/ToolCallItem.js +8 -3
  22. package/execution/ToolCallItem.js.map +1 -1
  23. package/execution/artifact-utils.d.ts +50 -0
  24. package/execution/artifact-utils.d.ts.map +1 -1
  25. package/execution/artifact-utils.js +67 -5
  26. package/execution/artifact-utils.js.map +1 -1
  27. package/execution/index.d.ts +6 -1
  28. package/execution/index.d.ts.map +1 -1
  29. package/execution/index.js +3 -1
  30. package/execution/index.js.map +1 -1
  31. package/index.d.ts +4 -4
  32. package/index.d.ts.map +1 -1
  33. package/index.js +2 -2
  34. package/index.js.map +1 -1
  35. package/mcp-server/ApprovalPolicyGeneratorPanel.d.ts +34 -0
  36. package/mcp-server/ApprovalPolicyGeneratorPanel.d.ts.map +1 -0
  37. package/mcp-server/ApprovalPolicyGeneratorPanel.js +55 -0
  38. package/mcp-server/ApprovalPolicyGeneratorPanel.js.map +1 -0
  39. package/mcp-server/McpServerDetailView.d.ts.map +1 -1
  40. package/mcp-server/McpServerDetailView.js +101 -2
  41. package/mcp-server/McpServerDetailView.js.map +1 -1
  42. package/mcp-server/index.d.ts +8 -0
  43. package/mcp-server/index.d.ts.map +1 -1
  44. package/mcp-server/index.js +4 -0
  45. package/mcp-server/index.js.map +1 -1
  46. package/mcp-server/useDiscoverCapabilities.d.ts +59 -0
  47. package/mcp-server/useDiscoverCapabilities.d.ts.map +1 -0
  48. package/mcp-server/useDiscoverCapabilities.js +77 -0
  49. package/mcp-server/useDiscoverCapabilities.js.map +1 -0
  50. package/mcp-server/useMcpServerCredentials.d.ts +63 -0
  51. package/mcp-server/useMcpServerCredentials.d.ts.map +1 -0
  52. package/mcp-server/useMcpServerCredentials.js +64 -0
  53. package/mcp-server/useMcpServerCredentials.js.map +1 -0
  54. package/mcp-server/useTriggerApprovalPolicySession.d.ts +42 -0
  55. package/mcp-server/useTriggerApprovalPolicySession.d.ts.map +1 -0
  56. package/mcp-server/useTriggerApprovalPolicySession.js +111 -0
  57. package/mcp-server/useTriggerApprovalPolicySession.js.map +1 -0
  58. package/package.json +4 -4
  59. package/session/__tests__/useSessionConversation.test.js +223 -2
  60. package/session/__tests__/useSessionConversation.test.js.map +1 -1
  61. package/session/useSessionConversation.d.ts +8 -1
  62. package/session/useSessionConversation.d.ts.map +1 -1
  63. package/session/useSessionConversation.js +77 -6
  64. package/session/useSessionConversation.js.map +1 -1
  65. package/src/execution/ArtifactContentRenderer.tsx +376 -0
  66. package/src/execution/ArtifactPreviewModal.tsx +22 -114
  67. package/src/execution/ExecutionPhaseBadge.tsx +1 -1
  68. package/src/execution/MessageThread.tsx +35 -3
  69. package/src/execution/SetupProgress.tsx +120 -0
  70. package/src/execution/ToolCallGroup.tsx +15 -1
  71. package/src/execution/ToolCallItem.tsx +10 -3
  72. package/src/execution/artifact-utils.ts +88 -4
  73. package/src/execution/index.ts +9 -0
  74. package/src/index.ts +16 -0
  75. package/src/mcp-server/ApprovalPolicyGeneratorPanel.tsx +164 -0
  76. package/src/mcp-server/McpServerDetailView.tsx +428 -2
  77. package/src/mcp-server/index.ts +15 -0
  78. package/src/mcp-server/useDiscoverCapabilities.ts +117 -0
  79. package/src/mcp-server/useMcpServerCredentials.ts +108 -0
  80. package/src/mcp-server/useTriggerApprovalPolicySession.ts +161 -0
  81. package/src/session/__tests__/useSessionConversation.test.tsx +355 -2
  82. package/src/session/useSessionConversation.ts +104 -9
  83. package/styles.css +1 -1
@@ -1,5 +1,6 @@
1
1
  "use client";
2
- import { useCallback, useEffect, useMemo, useState } from "react";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from "react";
3
+ import { ExecutionPhase } from "@stigmer/protos/ai/stigmer/agentic/agentexecution/v1/enum_pb";
3
4
  import { isTerminalPhase } from "../execution/execution-phases";
4
5
  import { useStigmer } from "../hooks";
5
6
  import { useCreateAgentExecution } from "../execution/useCreateAgentExecution";
@@ -8,6 +9,10 @@ import { useSubmitApproval } from "../execution/useSubmitApproval";
8
9
  import { useSession } from "./useSession";
9
10
  import { useSessionExecutions } from "./useSessionExecutions";
10
11
  import { useUpdateSession } from "./useUpdateSession";
12
+ const APPROVAL_POLL_INITIAL_MS = 3_000;
13
+ const APPROVAL_POLL_MAX_MS = 30_000;
14
+ const STALE_DISMISSAL_MS = 15_000;
15
+ const STALE_CHECK_INTERVAL_MS = 5_000;
11
16
  /**
12
17
  * Behavior hook that encapsulates the full conversation lifecycle for
13
18
  * a session: loading data, streaming the active execution, submitting
@@ -60,7 +65,10 @@ export function useSessionConversation(sessionId, org) {
60
65
  const { submitApproval: rawSubmitApproval, submittingToolCallIds, error: approvalError, clearError: clearApprovalError, } = useSubmitApproval();
61
66
  const [pendingExecutionId, setPendingExecutionId] = useState(null);
62
67
  const [pendingUserMessage, setPendingUserMessage] = useState(null);
63
- const [dismissedApprovalIds, setDismissedApprovalIds] = useState(new Set());
68
+ const [dismissedAtMap, setDismissedAtMap] = useState(new Map());
69
+ const dismissedAtMapRef = useRef(dismissedAtMap);
70
+ dismissedAtMapRef.current = dismissedAtMap;
71
+ const dismissedApprovalIds = useMemo(() => new Set(dismissedAtMap.keys()), [dismissedAtMap]);
64
72
  const listActiveId = useMemo(() => {
65
73
  for (let i = executions.length - 1; i >= 0; i--) {
66
74
  const phase = executions[i].status?.phase;
@@ -73,7 +81,7 @@ export function useSessionConversation(sessionId, org) {
73
81
  const activeExecutionId = pendingExecutionId ?? listActiveId;
74
82
  const stream = useExecutionStream(activeExecutionId);
75
83
  useEffect(() => {
76
- setDismissedApprovalIds(new Set());
84
+ setDismissedAtMap(new Map());
77
85
  }, [activeExecutionId]);
78
86
  // Clear pendingExecutionId once the execution appears in the fetched list
79
87
  useEffect(() => {
@@ -158,13 +166,75 @@ export function useSessionConversation(sessionId, org) {
158
166
  return all;
159
167
  return all.filter((a) => !dismissedApprovalIds.has(a.toolCallId));
160
168
  }, [activeStreamExecution, dismissedApprovalIds]);
169
+ // Poll-based fallback: when the execution is WAITING_FOR_APPROVAL but
170
+ // the server has not delivered any approval data (raw approvals empty),
171
+ // refetch with exponential backoff until data arrives. Checks raw
172
+ // (unfiltered) approvals so dismissed-but-present approvals don't
173
+ // trigger unnecessary network requests — that case is handled by the
174
+ // staleness detection below.
175
+ const rawApprovalCount = activeStreamExecution?.status?.pendingApprovals?.length ?? 0;
176
+ const approvalPollRef = useRef(null);
177
+ const pollAttemptRef = useRef(0);
178
+ useEffect(() => {
179
+ if (approvalPollRef.current) {
180
+ clearTimeout(approvalPollRef.current);
181
+ approvalPollRef.current = null;
182
+ }
183
+ pollAttemptRef.current = 0;
184
+ const isWaiting = activePhase === ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL;
185
+ if (!isWaiting || rawApprovalCount > 0 || !activeExecutionId)
186
+ return;
187
+ function scheduleNextPoll() {
188
+ const delay = Math.min(APPROVAL_POLL_INITIAL_MS * 2 ** pollAttemptRef.current, APPROVAL_POLL_MAX_MS);
189
+ approvalPollRef.current = setTimeout(() => {
190
+ pollAttemptRef.current += 1;
191
+ refetch();
192
+ scheduleNextPoll();
193
+ }, delay);
194
+ }
195
+ scheduleNextPoll();
196
+ return () => {
197
+ if (approvalPollRef.current) {
198
+ clearTimeout(approvalPollRef.current);
199
+ approvalPollRef.current = null;
200
+ }
201
+ };
202
+ }, [activePhase, rawApprovalCount, activeExecutionId, refetch]);
203
+ // Staleness detection: when an approval was optimistically dismissed
204
+ // but the execution remains in WAITING_FOR_APPROVAL longer than
205
+ // expected, the downstream Temporal signal may have failed. Remove
206
+ // stale dismissals so the card reappears and the user can retry.
207
+ useEffect(() => {
208
+ const isWaiting = activePhase === ExecutionPhase.EXECUTION_WAITING_FOR_APPROVAL;
209
+ if (!isWaiting || dismissedAtMap.size === 0)
210
+ return;
211
+ const id = setInterval(() => {
212
+ const now = Date.now();
213
+ const currentMap = dismissedAtMapRef.current;
214
+ const staleKeys = [];
215
+ for (const [key, ts] of currentMap) {
216
+ if (now - ts > STALE_DISMISSAL_MS)
217
+ staleKeys.push(key);
218
+ }
219
+ if (staleKeys.length === 0)
220
+ return;
221
+ setDismissedAtMap((prev) => {
222
+ const next = new Map(prev);
223
+ for (const key of staleKeys)
224
+ next.delete(key);
225
+ return next.size < prev.size ? next : prev;
226
+ });
227
+ refetch();
228
+ }, STALE_CHECK_INTERVAL_MS);
229
+ return () => clearInterval(id);
230
+ }, [activePhase, dismissedAtMap.size, refetch]);
161
231
  const submitApproval = useCallback(async (toolCallId, action, comment) => {
162
232
  if (!activeExecutionId)
163
233
  return;
164
234
  await rawSubmitApproval(activeExecutionId, toolCallId, action, comment);
165
- setDismissedApprovalIds((prev) => {
166
- const next = new Set(prev);
167
- next.add(toolCallId);
235
+ setDismissedAtMap((prev) => {
236
+ const next = new Map(prev);
237
+ next.set(toolCallId, Date.now());
168
238
  return next;
169
239
  });
170
240
  }, [activeExecutionId, rawSubmitApproval]);
@@ -176,6 +246,7 @@ export function useSessionConversation(sessionId, org) {
176
246
  activeStreamExecution,
177
247
  activePhase,
178
248
  isStreaming: stream.isStreaming,
249
+ isConnecting: stream.isConnecting,
179
250
  sendFollowUp,
180
251
  canSendFollowUp,
181
252
  isSending: isCreating,
@@ -1 +1 @@
1
- {"version":3,"file":"useSessionConversation.js","sourceRoot":"","sources":["../../src/session/useSessionConversation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"useSessionConversation.js","sourceRoot":"","sources":["../../src/session/useSessionConversation.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,376 @@
1
+ "use client";
2
+
3
+ import { useState, type ReactNode } from "react";
4
+ import Markdown from "react-markdown";
5
+ import { cn } from "@stigmer/theme";
6
+ import {
7
+ MARKDOWN_COMPONENTS,
8
+ REMARK_PLUGINS,
9
+ } from "../internal/markdown-components";
10
+ import {
11
+ getArtifactRenderMode,
12
+ type ArtifactRenderMode,
13
+ } from "./artifact-utils";
14
+
15
+ export interface ArtifactContentRendererProps {
16
+ /** The text content to render. */
17
+ readonly content: string;
18
+ /**
19
+ * File name used to determine the rendering strategy
20
+ * (e.g., `"README.md"` → markdown, `"config.yaml"` → YAML).
21
+ */
22
+ readonly fileName: string;
23
+ /**
24
+ * Optional MIME content type from the server. Used as a fallback
25
+ * when the file extension is ambiguous or missing.
26
+ */
27
+ readonly contentType?: string | null;
28
+ /** When `true`, shows a truncation warning below the content. */
29
+ readonly isTruncated?: boolean;
30
+ /** Additional CSS classes for the root element. */
31
+ readonly className?: string;
32
+ }
33
+
34
+ /**
35
+ * File-type-aware content renderer for execution artifacts.
36
+ *
37
+ * Determines the rendering strategy from the file name (via
38
+ * {@link getArtifactRenderMode}) and dispatches to the appropriate
39
+ * view:
40
+ *
41
+ * - **Markdown** (`.md`, `.mdx`) — rendered HTML via `react-markdown`
42
+ * with themed {@link MARKDOWN_COMPONENTS}, plus a source/rendered
43
+ * toggle so developers can inspect the raw markup.
44
+ * - **YAML** (`.yaml`, `.yml`) — CSS-only syntax highlighting with
45
+ * key, comment, and value colorization.
46
+ * - **JSON** (`.json`) — pretty-printed with basic key/value coloring.
47
+ * - **Plain text** (all other extensions) — monospace display with
48
+ * line numbers.
49
+ *
50
+ * All visual properties flow through `--stgm-*` tokens. The component
51
+ * is self-contained and works identically in the Stigmer Console and
52
+ * in a third-party host application.
53
+ *
54
+ * Platform builders who want to render artifact content outside of
55
+ * {@link ArtifactPreviewModal} can import this component directly:
56
+ *
57
+ * @example
58
+ * ```tsx
59
+ * import { ArtifactContentRenderer, useArtifactContent } from "@stigmer/react";
60
+ *
61
+ * function MyArtifactPanel({ executionId, storageKey, fileName }) {
62
+ * const { content } = useArtifactContent(executionId, storageKey);
63
+ * if (!content) return null;
64
+ * return <ArtifactContentRenderer content={content} fileName={fileName} />;
65
+ * }
66
+ * ```
67
+ *
68
+ * @see {@link getArtifactRenderMode} — pure utility for mode detection
69
+ * @see {@link ArtifactPreviewModal} — full modal that composes this component
70
+ * @see {@link useArtifactContent} — headless content-fetching hook
71
+ */
72
+ export function ArtifactContentRenderer({
73
+ content,
74
+ fileName,
75
+ contentType,
76
+ isTruncated = false,
77
+ className,
78
+ }: ArtifactContentRendererProps) {
79
+ const mode = getArtifactRenderMode(fileName, contentType);
80
+
81
+ return (
82
+ <div className={cn(className)}>
83
+ {mode === "markdown" ? (
84
+ <MarkdownView content={content} />
85
+ ) : mode === "yaml" ? (
86
+ <YamlView content={content} />
87
+ ) : mode === "json" ? (
88
+ <JsonView content={content} />
89
+ ) : (
90
+ <PlainTextView content={content} />
91
+ )}
92
+
93
+ {isTruncated && <TruncationWarning />}
94
+ </div>
95
+ );
96
+ }
97
+
98
+ // ---------------------------------------------------------------------------
99
+ // Markdown view with source/rendered toggle
100
+ // ---------------------------------------------------------------------------
101
+
102
+ type MarkdownTab = "rendered" | "source";
103
+
104
+ function MarkdownView({ content }: { readonly content: string }) {
105
+ const [tab, setTab] = useState<MarkdownTab>("rendered");
106
+
107
+ return (
108
+ <div>
109
+ <div className="flex items-center border-b border-border px-4 py-1.5">
110
+ <div
111
+ className="inline-flex rounded-md bg-muted p-0.5"
112
+ role="tablist"
113
+ aria-label="View mode"
114
+ >
115
+ <TabButton
116
+ active={tab === "rendered"}
117
+ onClick={() => setTab("rendered")}
118
+ label="Rendered"
119
+ />
120
+ <TabButton
121
+ active={tab === "source"}
122
+ onClick={() => setTab("source")}
123
+ label="Source"
124
+ />
125
+ </div>
126
+ </div>
127
+
128
+ {tab === "rendered" ? (
129
+ <div className="p-5">
130
+ <Markdown
131
+ remarkPlugins={REMARK_PLUGINS}
132
+ components={MARKDOWN_COMPONENTS}
133
+ >
134
+ {content}
135
+ </Markdown>
136
+ </div>
137
+ ) : (
138
+ <LineNumberedPre content={content} />
139
+ )}
140
+ </div>
141
+ );
142
+ }
143
+
144
+ function TabButton({
145
+ active,
146
+ onClick,
147
+ label,
148
+ }: {
149
+ readonly active: boolean;
150
+ readonly onClick: () => void;
151
+ readonly label: string;
152
+ }) {
153
+ return (
154
+ <button
155
+ type="button"
156
+ role="tab"
157
+ aria-selected={active}
158
+ onClick={onClick}
159
+ className={cn(
160
+ "rounded-sm px-2.5 py-1 text-xs font-medium transition-colors",
161
+ "focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring",
162
+ active
163
+ ? "bg-background text-foreground shadow-sm"
164
+ : "text-muted-foreground hover:text-foreground",
165
+ )}
166
+ >
167
+ {label}
168
+ </button>
169
+ );
170
+ }
171
+
172
+ // ---------------------------------------------------------------------------
173
+ // YAML view (CSS-only syntax highlighting, zero dependencies)
174
+ // ---------------------------------------------------------------------------
175
+
176
+ /**
177
+ * Applies lightweight CSS-only highlighting to YAML content.
178
+ *
179
+ * Processes content line-by-line, wrapping structural tokens in styled
180
+ * `<span>` elements using `--stgm-*` theme tokens:
181
+ *
182
+ * - Keys → `text-primary`
183
+ * - Comments → `text-muted-foreground italic`
184
+ * - Document separators (`---`) → `text-muted-foreground`
185
+ * - Boolean/null values → `font-medium`
186
+ * - Multi-line scalar indicators → `text-muted-foreground`
187
+ *
188
+ * Values and block scalar content render in the default `text-foreground`.
189
+ */
190
+ function highlightYaml(content: string): ReactNode {
191
+ return content.split("\n").map((line, i) => (
192
+ <span key={i}>
193
+ {i > 0 && "\n"}
194
+ {highlightYamlLine(line)}
195
+ </span>
196
+ ));
197
+ }
198
+
199
+ function highlightYamlLine(line: string): ReactNode {
200
+ if (!line.trim()) return line;
201
+
202
+ if (/^---\s*$/.test(line) || /^\.\.\.\s*$/.test(line)) {
203
+ return <span className="text-muted-foreground">{line}</span>;
204
+ }
205
+
206
+ const commentMatch = line.match(/^(\s*)(#.*)$/);
207
+ if (commentMatch) {
208
+ return (
209
+ <>
210
+ {commentMatch[1]}
211
+ <span className="text-muted-foreground italic">{commentMatch[2]}</span>
212
+ </>
213
+ );
214
+ }
215
+
216
+ const kvMatch = line.match(/^(\s*(?:-\s+)?)([\w][\w.-]*)(:(?:\s|$))(.*)/);
217
+ if (kvMatch) {
218
+ const [, indent, key, colon, value] = kvMatch;
219
+ return (
220
+ <>
221
+ {indent}
222
+ <span className="text-primary">{key}</span>
223
+ <span className="text-muted-foreground">{colon}</span>
224
+ {value ? highlightYamlValue(value) : null}
225
+ </>
226
+ );
227
+ }
228
+
229
+ return <>{line}</>;
230
+ }
231
+
232
+ function highlightYamlValue(value: string): ReactNode {
233
+ const trimmed = value.trim();
234
+
235
+ if (/^[|>][-+]?\s*$/.test(trimmed)) {
236
+ return <span className="text-muted-foreground">{value}</span>;
237
+ }
238
+
239
+ if (/^(true|false|null|~)$/.test(trimmed)) {
240
+ return <span className="font-medium">{value}</span>;
241
+ }
242
+
243
+ return <>{value}</>;
244
+ }
245
+
246
+ function YamlView({ content }: { readonly content: string }) {
247
+ return (
248
+ <pre className="overflow-x-auto p-4 font-mono text-xs leading-relaxed text-foreground">
249
+ <code>{highlightYaml(content)}</code>
250
+ </pre>
251
+ );
252
+ }
253
+
254
+ // ---------------------------------------------------------------------------
255
+ // JSON view (pretty-print + basic key coloring)
256
+ // ---------------------------------------------------------------------------
257
+
258
+ function highlightJson(content: string): ReactNode {
259
+ let formatted: string;
260
+ try {
261
+ formatted = JSON.stringify(JSON.parse(content), null, 2);
262
+ } catch {
263
+ formatted = content;
264
+ }
265
+
266
+ return formatted.split("\n").map((line, i) => {
267
+ const keyMatch = line.match(/^(\s*)"([^"]+)"(\s*:)(.*)/);
268
+ if (keyMatch) {
269
+ const [, indent, key, colon, rest] = keyMatch;
270
+ return (
271
+ <span key={i}>
272
+ {i > 0 && "\n"}
273
+ {indent}
274
+ <span className="text-primary">&quot;{key}&quot;</span>
275
+ <span className="text-muted-foreground">{colon}</span>
276
+ {highlightJsonValue(rest)}
277
+ </span>
278
+ );
279
+ }
280
+ return (
281
+ <span key={i}>
282
+ {i > 0 && "\n"}
283
+ {line}
284
+ </span>
285
+ );
286
+ });
287
+ }
288
+
289
+ function highlightJsonValue(value: string): ReactNode {
290
+ const trimmed = value.trim().replace(/,\s*$/, "");
291
+ const trailingComma = value.trim().endsWith(",") ? "," : "";
292
+
293
+ if (/^".*"$/.test(trimmed)) {
294
+ return (
295
+ <>
296
+ {" "}
297
+ <span className="text-success">{trimmed}</span>
298
+ {trailingComma}
299
+ </>
300
+ );
301
+ }
302
+
303
+ if (/^(true|false|null)$/.test(trimmed)) {
304
+ return (
305
+ <>
306
+ {" "}
307
+ <span className="font-medium">{trimmed}</span>
308
+ {trailingComma}
309
+ </>
310
+ );
311
+ }
312
+
313
+ if (/^-?\d/.test(trimmed)) {
314
+ return (
315
+ <>
316
+ {" "}
317
+ <span className="text-warning">{trimmed}</span>
318
+ {trailingComma}
319
+ </>
320
+ );
321
+ }
322
+
323
+ return <>{value}</>;
324
+ }
325
+
326
+ function JsonView({ content }: { readonly content: string }) {
327
+ return (
328
+ <pre className="overflow-x-auto p-4 font-mono text-xs leading-relaxed text-foreground">
329
+ <code>{highlightJson(content)}</code>
330
+ </pre>
331
+ );
332
+ }
333
+
334
+ // ---------------------------------------------------------------------------
335
+ // Plain text view (monospace + line numbers)
336
+ // ---------------------------------------------------------------------------
337
+
338
+ function PlainTextView({ content }: { readonly content: string }) {
339
+ return <LineNumberedPre content={content} />;
340
+ }
341
+
342
+ function LineNumberedPre({ content }: { readonly content: string }) {
343
+ const lines = content.split("\n");
344
+ const gutterWidth = String(lines.length).length;
345
+
346
+ return (
347
+ <pre className="overflow-x-auto font-mono text-xs leading-relaxed text-foreground">
348
+ <code>
349
+ {lines.map((line, i) => (
350
+ <span key={i} className="flex">
351
+ <span
352
+ className="sticky left-0 select-none bg-background pr-4 text-right text-muted-foreground"
353
+ style={{ minWidth: `${gutterWidth + 2}ch` }}
354
+ aria-hidden="true"
355
+ >
356
+ {i + 1}
357
+ </span>
358
+ <span className="flex-1 whitespace-pre pl-2">{line || "\n"}</span>
359
+ </span>
360
+ ))}
361
+ </code>
362
+ </pre>
363
+ );
364
+ }
365
+
366
+ // ---------------------------------------------------------------------------
367
+ // Shared
368
+ // ---------------------------------------------------------------------------
369
+
370
+ function TruncationWarning() {
371
+ return (
372
+ <div className="border-t border-border bg-warning/10 px-4 py-2 text-xs text-warning">
373
+ Content was truncated. Download the full file for complete content.
374
+ </div>
375
+ );
376
+ }