@elench/shell 0.1.25 → 0.1.27

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 (33) hide show
  1. package/dist/codex/thread-inspector.d.ts +11 -0
  2. package/dist/codex/thread-inspector.d.ts.map +1 -0
  3. package/dist/codex/thread-inspector.js +27 -0
  4. package/dist/codex/thread-inspector.js.map +1 -0
  5. package/dist/codex/thread-scroll-follow.d.ts +12 -0
  6. package/dist/codex/thread-scroll-follow.d.ts.map +1 -0
  7. package/dist/codex/thread-scroll-follow.js +86 -0
  8. package/dist/codex/thread-scroll-follow.js.map +1 -0
  9. package/dist/codex/thread-sidebar-preferences.d.ts +9 -0
  10. package/dist/codex/thread-sidebar-preferences.d.ts.map +1 -0
  11. package/dist/codex/thread-sidebar-preferences.js +65 -0
  12. package/dist/codex/thread-sidebar-preferences.js.map +1 -0
  13. package/dist/codex/thread-sidebar.d.ts +13 -0
  14. package/dist/codex/thread-sidebar.d.ts.map +1 -0
  15. package/dist/codex/thread-sidebar.js +145 -0
  16. package/dist/codex/thread-sidebar.js.map +1 -0
  17. package/dist/codex/thread-workspace.d.ts +21 -0
  18. package/dist/codex/thread-workspace.d.ts.map +1 -0
  19. package/dist/codex/thread-workspace.js +49 -0
  20. package/dist/codex/thread-workspace.js.map +1 -0
  21. package/dist/codex/transcript-react.d.ts +8 -113
  22. package/dist/codex/transcript-react.d.ts.map +1 -1
  23. package/dist/codex/transcript-react.js +5 -432
  24. package/dist/codex/transcript-react.js.map +1 -1
  25. package/dist/codex/transcript-renderers.d.ts +68 -0
  26. package/dist/codex/transcript-renderers.d.ts.map +1 -0
  27. package/dist/codex/transcript-renderers.js +190 -0
  28. package/dist/codex/transcript-renderers.js.map +1 -0
  29. package/dist/codex/turn-controls.d.ts +11 -0
  30. package/dist/codex/turn-controls.d.ts.map +1 -0
  31. package/dist/codex/turn-controls.js +144 -0
  32. package/dist/codex/turn-controls.js.map +1 -0
  33. package/package.json +1 -1
@@ -1,114 +1,9 @@
1
- import type { CodexServerRequest } from "./protocol.js";
2
- import type { FileUpdateChange } from "./protocol/generated/v2/FileUpdateChange.js";
3
- import type { Thread } from "./protocol/generated/v2/Thread.js";
4
- import type { ThreadItem } from "./protocol/generated/v2/ThreadItem.js";
5
- import type { ThreadListParams } from "./protocol/generated/v2/ThreadListParams.js";
6
- import type { TurnStartParams } from "./protocol/generated/v2/TurnStartParams.js";
7
- import type { UseCodexThreadSessionOptions } from "./react.js";
8
- import { type CodexTranscriptRenderSettings } from "./transcript.js";
9
- import type { CodexThreadSnapshot, CodexTurnPlan } from "./thread-store.js";
10
- export type CodexThreadWorkspaceProps = {
11
- className?: string;
12
- defaultMessage?: string;
13
- emptyDescription?: string;
14
- emptyTitle?: string;
15
- onThreadChange?: UseCodexThreadSessionOptions["onThreadChange"];
16
- placeholder?: string;
17
- settings?: Partial<CodexTranscriptRenderSettings>;
18
- session?: UseCodexThreadSessionOptions;
19
- showControls?: boolean;
20
- };
21
- export type CodexThreadSidebarProps = {
22
- activeThreadId?: string | null;
23
- archived?: boolean | null;
24
- cwd?: string | string[] | null;
25
- limit?: number;
26
- onOpenThread: (thread: Thread) => void;
27
- searchTerm?: string | null;
28
- sourceKinds?: ThreadListParams["sourceKinds"];
29
- };
30
- export type CodexTurnControlValue = Partial<Omit<TurnStartParams, "input" | "threadId">>;
31
- export type CodexTurnControlsProps = {
32
- onChange: (value: CodexTurnControlValue) => void;
33
- value: CodexTurnControlValue;
34
- };
35
- export declare function CodexThreadWorkspace({ className, defaultMessage, emptyDescription, emptyTitle, onThreadChange, placeholder, settings, session, }: CodexThreadWorkspaceProps): import("react/jsx-runtime").JSX.Element;
36
- export declare function CodexTurnControls({ onChange, value }: CodexTurnControlsProps): import("react/jsx-runtime").JSX.Element;
37
- export declare function CodexThreadComposer({ defaultMessage, disabled, onSubmit, placeholder, }: {
38
- defaultMessage?: string;
39
- disabled?: boolean;
40
- onSubmit: (message: string) => Promise<unknown>;
41
- placeholder?: string;
42
- }): import("react/jsx-runtime").JSX.Element;
43
- export declare function CodexThreadTranscript({ emptyDescription, emptyTitle, settings, snapshot, }: {
44
- emptyDescription?: string;
45
- emptyTitle?: string;
46
- settings?: Partial<CodexTranscriptRenderSettings>;
47
- snapshot: CodexThreadSnapshot | null;
48
- }): import("react/jsx-runtime").JSX.Element;
49
- export declare function CodexUserMessageBubble({ item, settings, }: {
50
- item: Extract<ThreadItem, {
51
- type: "userMessage";
52
- }>;
53
- settings?: CodexTranscriptRenderSettings;
54
- }): import("react/jsx-runtime").JSX.Element;
55
- export declare function CodexAssistantText({ settings, text, }: {
56
- settings?: CodexTranscriptRenderSettings;
57
- text: string;
58
- }): import("react/jsx-runtime").JSX.Element;
59
- export declare function CodexMarkdownText({ settings, text, }: {
60
- settings?: CodexTranscriptRenderSettings;
61
- text: string;
62
- }): import("react/jsx-runtime").JSX.Element;
63
- export declare function CodexHighlightedCode({ code, language, }: {
64
- code: string;
65
- language?: string;
66
- }): import("react/jsx-runtime").JSX.Element;
67
- export declare function CodexReasoningBlock({ item, settings, }: {
68
- item: Extract<ThreadItem, {
69
- type: "reasoning";
70
- }>;
71
- settings: CodexTranscriptRenderSettings;
72
- }): import("react/jsx-runtime").JSX.Element | null;
73
- export declare function CodexPlanText({ plan }: {
74
- plan: CodexTurnPlan;
75
- }): import("react/jsx-runtime").JSX.Element;
76
- export declare function CodexCommandBlock({ item, settings, }: {
77
- item: Extract<ThreadItem, {
78
- type: "commandExecution";
79
- }>;
80
- settings: CodexTranscriptRenderSettings;
81
- }): import("react/jsx-runtime").JSX.Element;
82
- export declare function CodexAnsiText({ enabled, text, }: {
83
- enabled?: boolean;
84
- text: string;
85
- }): import("react/jsx-runtime").JSX.Element;
86
- export declare function CodexFileChangeBlock({ item, settings, }: {
87
- item: Extract<ThreadItem, {
88
- type: "fileChange";
89
- }>;
90
- settings: CodexTranscriptRenderSettings;
91
- }): import("react/jsx-runtime").JSX.Element;
92
- export declare function CodexUnifiedDiff({ change, settings, }: {
93
- change: FileUpdateChange;
94
- settings?: CodexTranscriptRenderSettings;
95
- }): import("react/jsx-runtime").JSX.Element;
96
- export declare function CodexToolCallText({ item, settings, }: {
97
- item: Extract<ThreadItem, {
98
- type: "mcpToolCall" | "dynamicToolCall";
99
- }>;
100
- settings: CodexTranscriptRenderSettings;
101
- }): import("react/jsx-runtime").JSX.Element;
102
- export declare function CodexPendingRequestLine({ request, }: {
103
- request: CodexServerRequest;
104
- }): import("react/jsx-runtime").JSX.Element;
105
- export declare function CodexThreadInspector({ session, showControls, snapshot, }: {
106
- session?: UseCodexThreadSessionOptions;
107
- showControls?: boolean;
108
- snapshot: CodexThreadSnapshot | null;
109
- }): import("react/jsx-runtime").JSX.Element;
110
- export declare function CodexThreadSidebar({ activeThreadId, archived, cwd, limit, onOpenThread, searchTerm, sourceKinds, }: CodexThreadSidebarProps): import("react/jsx-runtime").JSX.Element;
111
- export declare function CodexThreadStats({ snapshot, }: {
112
- snapshot: CodexThreadSnapshot | null;
113
- }): import("react/jsx-runtime").JSX.Element;
1
+ export { CodexThreadComposer, CodexThreadWorkspace } from "./thread-workspace.js";
2
+ export { CodexThreadSidebar } from "./thread-sidebar.js";
3
+ export { CodexThreadInspector, CodexThreadStats } from "./thread-inspector.js";
4
+ export { CodexTurnControls } from "./turn-controls.js";
5
+ export { CodexAnsiText, CodexAssistantText, CodexCommandBlock, CodexFileChangeBlock, CodexHighlightedCode, CodexMarkdownText, CodexPendingRequestLine, CodexPlanText, CodexReasoningBlock, CodexThreadTranscript, CodexToolCallText, CodexUnifiedDiff, CodexUserMessageBubble, } from "./transcript-renderers.js";
6
+ export type { CodexThreadWorkspaceProps } from "./thread-workspace.js";
7
+ export type { CodexThreadSidebarProps } from "./thread-sidebar.js";
8
+ export type { CodexTurnControlValue, CodexTurnControlsProps, } from "./turn-controls.js";
114
9
  //# sourceMappingURL=transcript-react.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"transcript-react.d.ts","sourceRoot":"","sources":["../../src/codex/transcript-react.tsx"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"transcript-react.d.ts","sourceRoot":"","sources":["../../src/codex/transcript-react.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,mBAAmB,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC/E,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,oBAAoB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC5E,OAAO,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AACpD,OAAO,EACL,aAAa,EACb,kBAAkB,EAClB,iBAAiB,EACjB,oBAAoB,EACpB,oBAAoB,EACpB,iBAAiB,EACjB,uBAAuB,EACvB,aAAa,EACb,mBAAmB,EACnB,qBAAqB,EACrB,iBAAiB,EACjB,gBAAgB,EAChB,sBAAsB,GACvB,MAAM,wBAAwB,CAAC;AAChC,YAAY,EAAE,yBAAyB,EAAE,MAAM,oBAAoB,CAAC;AACpE,YAAY,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EACV,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,iBAAiB,CAAC"}
@@ -1,434 +1,7 @@
1
1
  "use client";
2
- import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-runtime";
3
- import Anser from "anser";
4
- import { BotIcon, CircleIcon, ClockIcon, GitBranchIcon, MessageSquareIcon, RefreshCcwIcon, SendIcon, TerminalIcon, } from "lucide-react";
5
- import { useCallback, useEffect, useMemo, useState, } from "react";
6
- import ReactMarkdown from "react-markdown";
7
- import remarkGfm from "remark-gfm";
8
- import { EmptyState } from "../components/system/async-state.js";
9
- import { StatusDot } from "../components/system/status.js";
10
- import { Button } from "../components/ui/button.js";
11
- import { SimpleSelect } from "../components/ui/select.js";
12
- import { Textarea } from "../components/ui/textarea.js";
13
- import { SidebarActionRow } from "../components/shell/primitives/sidebar-action-row.js";
14
- import { SidebarSection } from "../components/shell/primitives/sidebar-section.js";
15
- import { InspectorItem, InspectorItemHeader, InspectorItemValue, } from "../components/shell/primitives/inspector-panel.js";
16
- import { cn } from "../lib/utils.js";
17
- import { useCodexAppServer, useCodexThreadSession } from "./react.js";
18
- import { codexInputText, codexThreadDescription, codexThreadSourceKind, codexThreadTitle, countFileUpdateChanges, DEFAULT_CODEX_TRANSCRIPT_RENDER_SETTINGS, formatNumber, formatTokenUsageBreakdown, languageForPath, mergeCodexTranscriptSettings, parseCodexUnifiedDiff, summarizeCodexThread, toCodexTranscriptEntries, tokenUsagePercent, } from "./transcript.js";
19
- const codexTurnControlStores = new Map();
20
- function codexTurnControlKey(session) {
21
- if (session?.threadId)
22
- return `thread:${session.threadId}`;
23
- const cwd = session?.turn?.cwd ?? session?.startThread?.cwd ?? "";
24
- return `new:${cwd}`;
25
- }
26
- function codexTurnControlBaseSignature(session) {
27
- return JSON.stringify(session?.turn ?? {});
28
- }
29
- function mergeTurnControlBase(base, value) {
30
- const next = {
31
- ...base,
32
- ...value,
33
- };
34
- if ("cwd" in base) {
35
- next.cwd = base.cwd;
36
- }
37
- return next;
38
- }
39
- function ensureCodexTurnControlStore(key, base) {
40
- let store = codexTurnControlStores.get(key);
41
- if (!store) {
42
- store = {
43
- listeners: new Set(),
44
- value: { ...base },
45
- };
46
- codexTurnControlStores.set(key, store);
47
- return store;
48
- }
49
- store.value = mergeTurnControlBase(base, store.value);
50
- return store;
51
- }
52
- function setCodexTurnControlStoreValue(key, value) {
53
- const store = ensureCodexTurnControlStore(key, {});
54
- store.value = value;
55
- for (const listener of store.listeners) {
56
- listener(store.value);
57
- }
58
- }
59
- function useCodexTurnControlState(session) {
60
- const key = codexTurnControlKey(session);
61
- const baseSignature = codexTurnControlBaseSignature(session);
62
- const base = useMemo(() => JSON.parse(baseSignature), [baseSignature]);
63
- const [value, setValue] = useState(() => ensureCodexTurnControlStore(key, base).value);
64
- useEffect(() => {
65
- const store = ensureCodexTurnControlStore(key, base);
66
- setValue(store.value);
67
- store.listeners.add(setValue);
68
- return () => {
69
- store.listeners.delete(setValue);
70
- };
71
- }, [baseSignature, key]);
72
- const update = useCallback((nextValue) => {
73
- setCodexTurnControlStoreValue(key, mergeTurnControlBase(base, nextValue));
74
- }, [base, key]);
75
- return [value, update];
76
- }
77
- export function CodexThreadWorkspace({ className, defaultMessage = "", emptyDescription = "Send a message to start the Codex thread.", emptyTitle = "No Codex output yet", onThreadChange, placeholder = "Message Codex", settings, session, }) {
78
- const [turnControls] = useCodexTurnControlState(session);
79
- const resolvedSession = useMemo(() => ({
80
- ...session,
81
- onThreadChange,
82
- turn: {
83
- ...session?.turn,
84
- ...turnControls,
85
- },
86
- }), [onThreadChange, session, turnControls]);
87
- const { error, isPending, sendText, snapshot } = useCodexThreadSession(resolvedSession);
88
- return (_jsxs("div", { className: cn("flex h-full min-h-0 flex-col overflow-hidden", className), "data-codex-thread-workspace": true, children: [_jsx("div", { className: "min-w-0 min-h-0 flex-1 overflow-x-hidden overflow-y-auto px-6 py-5", "data-codex-thread-scroll": true, children: _jsx(CodexThreadTranscript, { emptyDescription: emptyDescription, emptyTitle: emptyTitle, settings: settings, snapshot: snapshot }) }), _jsxs("div", { className: "shrink-0 border-t border-border bg-bg-surface px-4 py-3", "data-codex-thread-composer": true, children: [error ? (_jsx("div", { className: "mb-3 rounded-md border border-destructive/30 bg-destructive/8 px-3 py-2 text-[12px] text-fg", children: error.message })) : null, _jsx(CodexThreadComposer, { defaultMessage: defaultMessage, disabled: isPending, onSubmit: sendText, placeholder: placeholder })] })] }));
89
- }
90
- const CODEX_REASONING_EFFORT_OPTIONS = [
91
- { label: "Configured default", value: "__default" },
92
- { label: "None", value: "none" },
93
- { label: "Minimal", value: "minimal" },
94
- { label: "Low", value: "low" },
95
- { label: "Medium", value: "medium" },
96
- { label: "High", value: "high" },
97
- { label: "XHigh", value: "xhigh" },
98
- ];
99
- const CODEX_APPROVAL_OPTIONS = [
100
- { label: "Configured default", value: "__default" },
101
- { label: "On request", value: "on-request" },
102
- { label: "On failure", value: "on-failure" },
103
- { label: "Untrusted", value: "untrusted" },
104
- { label: "Never", value: "never" },
105
- ];
106
- const CODEX_REASONING_SUMMARY_OPTIONS = [
107
- { label: "Configured default", value: "__default" },
108
- { label: "Auto", value: "auto" },
109
- { label: "Concise", value: "concise" },
110
- { label: "Detailed", value: "detailed" },
111
- { label: "None", value: "none" },
112
- ];
113
- function useCodexModelOptions() {
114
- const { client, initialized } = useCodexAppServer();
115
- const [models, setModels] = useState([]);
116
- useEffect(() => {
117
- if (!client || !initialized)
118
- return;
119
- let active = true;
120
- client
121
- .listModels({ limit: 80 })
122
- .then((response) => {
123
- if (!active)
124
- return;
125
- setModels(response.data.map((model) => ({
126
- label: model.displayName,
127
- value: model.id,
128
- })));
129
- })
130
- .catch(() => {
131
- if (active)
132
- setModels([]);
133
- });
134
- return () => {
135
- active = false;
136
- };
137
- }, [client, initialized]);
138
- return [{ label: "Configured default", value: "__default" }, ...models];
139
- }
140
- function useCodexTurnControlSetter(onChange, value) {
141
- const set = (key, nextValue) => {
142
- onChange({
143
- ...value,
144
- [key]: nextValue,
145
- });
146
- };
147
- return set;
148
- }
149
- export function CodexTurnControls({ onChange, value }) {
150
- const modelOptions = useCodexModelOptions();
151
- const set = useCodexTurnControlSetter(onChange, value);
152
- return (_jsxs("div", { className: "grid gap-2", children: [_jsx(ControlLabel, { label: "Model", children: _jsx(SimpleSelect, { onValueChange: (model) => set("model", model === "__default" ? null : model), options: modelOptions, value: value.model ?? "__default" }) }), _jsx(ControlLabel, { label: "Effort", children: _jsx(SimpleSelect, { onValueChange: (effort) => set("effort", effort === "__default" ? null : effort), options: CODEX_REASONING_EFFORT_OPTIONS, value: value.effort ?? "__default" }) }), _jsx(ControlLabel, { label: "Approval", children: _jsx(SimpleSelect, { onValueChange: (approvalPolicy) => set("approvalPolicy", approvalPolicy === "__default" ? null : approvalPolicy), options: CODEX_APPROVAL_OPTIONS, value: typeof value.approvalPolicy === "string"
153
- ? value.approvalPolicy
154
- : "__default" }) }), _jsx(ControlLabel, { label: "Reasoning summary", children: _jsx(SimpleSelect, { onValueChange: (summary) => set("summary", summary === "__default" ? null : summary), options: CODEX_REASONING_SUMMARY_OPTIONS, value: value.summary ?? "__default" }) })] }));
155
- }
156
- function ControlLabel({ children, label, }) {
157
- return (_jsxs("label", { className: "grid gap-1 text-[11px] font-medium text-fg-tertiary", children: [label, children] }));
158
- }
159
- export function CodexThreadComposer({ defaultMessage = "", disabled = false, onSubmit, placeholder = "Message Codex", }) {
160
- const [message, setMessage] = useState(defaultMessage);
161
- const submit = () => {
162
- const next = message.trim();
163
- if (!next)
164
- return;
165
- setMessage("");
166
- void onSubmit(next);
167
- };
168
- return (_jsxs("div", { className: "flex items-end gap-2", children: [_jsx(Textarea, { "aria-label": "Codex message", className: "min-h-20 resize-none", onChange: (event) => setMessage(event.target.value), onKeyDown: (event) => {
169
- if ((event.metaKey || event.ctrlKey) && event.key === "Enter") {
170
- event.preventDefault();
171
- submit();
172
- }
173
- }, placeholder: placeholder, value: message }), _jsxs(Button, { "aria-label": "Send Codex message", disabled: disabled || message.trim().length === 0, onClick: submit, children: [_jsx(SendIcon, {}), "Send"] })] }));
174
- }
175
- export function CodexThreadTranscript({ emptyDescription = "Send a message to start the Codex thread.", emptyTitle = "No Codex output yet", settings, snapshot, }) {
176
- const resolvedSettings = useMemo(() => mergeCodexTranscriptSettings(settings), [settings]);
177
- const entries = useMemo(() => toCodexTranscriptEntries(snapshot), [snapshot]);
178
- if (entries.length === 0) {
179
- return (_jsx(EmptyState, { className: "min-h-[24rem]", description: emptyDescription, title: emptyTitle }));
180
- }
181
- return (_jsx("div", { className: cn("mx-auto w-full max-w-[980px] min-w-0", resolvedSettings.density === "compact" ? "space-y-3" : "space-y-5"), children: entries.map((entry) => {
182
- switch (entry.type) {
183
- case "userMessage":
184
- return (_jsx(CodexUserMessageBubble, { item: entry.item, settings: resolvedSettings }, entry.id));
185
- case "assistantText":
186
- return (_jsx(CodexAssistantText, { settings: resolvedSettings, text: entry.item.text }, entry.id));
187
- case "reasoning":
188
- return (_jsx(CodexReasoningBlock, { item: entry.item, settings: resolvedSettings }, entry.id));
189
- case "turnPlan":
190
- return _jsx(CodexPlanText, { plan: entry.plan }, entry.id);
191
- case "planItem":
192
- return (_jsx(CodexAssistantText, { settings: resolvedSettings, text: entry.item.text }, entry.id));
193
- case "command":
194
- return (_jsx(CodexCommandBlock, { item: entry.item, settings: resolvedSettings }, entry.id));
195
- case "fileChange":
196
- return (_jsx(CodexFileChangeBlock, { item: entry.item, settings: resolvedSettings }, entry.id));
197
- case "toolCall":
198
- return (_jsx(CodexToolCallText, { item: entry.item, settings: resolvedSettings }, entry.id));
199
- case "webSearch":
200
- return (_jsx(CodexTranscriptLine, { icon: _jsx(GitBranchIcon, { className: "size-3.5" }), label: "web search", value: entry.item.query }, entry.id));
201
- case "pendingRequest":
202
- return (_jsx(CodexPendingRequestLine, { request: entry.request }, entry.id));
203
- default:
204
- return (_jsx(CodexAssistantText, { settings: resolvedSettings, text: JSON.stringify(entry.item, null, 2) }, entry.id));
205
- }
206
- }) }));
207
- }
208
- export function CodexUserMessageBubble({ item, settings = DEFAULT_CODEX_TRANSCRIPT_RENDER_SETTINGS, }) {
209
- return (_jsx("div", { className: "flex justify-end", children: _jsx("div", { className: "max-w-[760px] rounded-[10px] border border-primary/25 bg-primary/10 px-3.5 py-2.5 text-[13px] leading-6 text-fg", children: _jsx(CodexMarkdownText, { settings: settings, text: codexInputText(item) }) }) }));
210
- }
211
- export function CodexAssistantText({ settings = DEFAULT_CODEX_TRANSCRIPT_RENDER_SETTINGS, text, }) {
212
- return (_jsx("div", { className: "max-w-[900px] text-[13px] leading-6 text-fg", children: _jsx(CodexMarkdownText, { settings: settings, text: text }) }));
213
- }
214
- export function CodexMarkdownText({ settings = DEFAULT_CODEX_TRANSCRIPT_RENDER_SETTINGS, text, }) {
215
- if (settings.markdown === "raw") {
216
- return _jsx("pre", { className: "whitespace-pre-wrap font-sans", children: text });
217
- }
218
- return (_jsx(ReactMarkdown, { components: {
219
- code: MarkdownCode,
220
- p: ({ children }) => _jsx("p", { className: "mb-2 last:mb-0", children: children }),
221
- pre: ({ children }) => _jsx(_Fragment, { children: children }),
222
- }, remarkPlugins: [remarkGfm], children: text }));
223
- }
224
- function MarkdownCode(props) {
225
- const text = String(props.children ?? "").replace(/\n$/, "");
226
- const language = /language-([\w-]+)/.exec(props.className ?? "")?.[1] ?? "text";
227
- const inline = props.inline ?? (!props.className && !text.includes("\n"));
228
- if (inline) {
229
- return (_jsx("code", { className: "rounded bg-bg-elevated px-1 py-0.5 font-mono text-[0.92em]", children: text }));
230
- }
231
- return _jsx(CodexHighlightedCode, { code: text, language: language });
232
- }
233
- export function CodexHighlightedCode({ code, language = "text", }) {
234
- const [html, setHtml] = useState(null);
235
- useEffect(() => {
236
- let active = true;
237
- setHtml(null);
238
- import("shiki")
239
- .then(({ codeToHtml }) => codeToHtml(code || " ", {
240
- lang: language,
241
- theme: "github-dark-default",
242
- }))
243
- .then((nextHtml) => {
244
- if (active)
245
- setHtml(nextHtml);
246
- })
247
- .catch(() => {
248
- if (active)
249
- setHtml(null);
250
- });
251
- return () => {
252
- active = false;
253
- };
254
- }, [code, language]);
255
- if (!html) {
256
- return (_jsx("pre", { className: "my-2 overflow-x-auto rounded-md border border-border bg-bg-card p-3 font-mono text-[12px] leading-5 text-fg", children: code }));
257
- }
258
- return (_jsx("div", { className: "codex-shiki my-2 overflow-x-auto rounded-md border border-border bg-bg-card text-[12px] leading-5 [&_pre]:!m-0 [&_pre]:!bg-transparent [&_pre]:!p-3", dangerouslySetInnerHTML: { __html: html } }));
259
- }
260
- export function CodexReasoningBlock({ item, settings, }) {
261
- if (settings.reasoning === "hidden")
262
- return null;
263
- const content = settings.reasoning === "expanded"
264
- ? [...item.summary, ...item.content]
265
- : item.summary;
266
- const text = content.filter(Boolean).join("\n\n");
267
- if (!text)
268
- return null;
269
- return (_jsx(CodexTranscriptLine, { icon: _jsx(BotIcon, { className: "size-3.5" }), label: "reasoning", muted: true, value: text }));
270
- }
271
- export function CodexPlanText({ plan }) {
272
- return (_jsxs("div", { className: "text-[13px] leading-6 text-fg-secondary", children: [plan.explanation ? (_jsx("p", { className: "mb-1.5 whitespace-pre-wrap", children: plan.explanation })) : null, _jsx("div", { className: "space-y-1", children: plan.steps.map((step, index) => (_jsxs("div", { className: "flex items-start gap-2", children: [_jsx(StatusDot, { className: "mt-[7px]", status: step.status === "completed" ? "healthy" : "unknown" }), _jsx("span", { className: "whitespace-pre-wrap", children: step.step })] }, `${step.step}-${index}`))) })] }));
273
- }
274
- export function CodexCommandBlock({ item, settings, }) {
275
- const output = item.aggregatedOutput ?? "";
276
- const collapsed = settings.commandOutput === "collapsed" ||
277
- (settings.commandOutput === "auto" && output.split("\n").length > 80);
278
- return (_jsxs("div", { className: "min-w-0 space-y-1.5 text-[13px] leading-6", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-x-2 gap-y-1 text-[12px] text-fg-tertiary", children: [_jsx(TerminalIcon, { className: "size-3.5" }), _jsx("span", { className: "font-semibold text-fg-secondary", children: "command" }), _jsx("span", { children: item.status }), item.exitCode != null ? _jsxs("span", { children: ["exit ", item.exitCode] }) : null, item.durationMs != null ? _jsxs("span", { children: [item.durationMs, "ms"] }) : null] }), _jsx("pre", { className: "max-w-full whitespace-pre-wrap break-words font-mono text-[12px] leading-5 text-fg", children: item.command }), item.cwd ? (_jsx("div", { className: "font-mono text-[11px] text-fg-tertiary", children: item.cwd })) : null, output ? (collapsed ? (_jsxs("div", { className: "font-mono text-[12px] text-fg-tertiary", children: ["output collapsed (", formatNumber(output.split("\n").length), " lines)"] })) : (_jsx("pre", { className: "max-h-[32rem] max-w-full overflow-auto rounded-md border border-border bg-bg-card p-3 font-mono text-[12px] leading-5 text-fg", children: _jsx(CodexAnsiText, { enabled: settings.ansi, text: output }) }))) : null] }));
279
- }
280
- export function CodexAnsiText({ enabled = true, text, }) {
281
- if (!enabled)
282
- return _jsx(_Fragment, { children: Anser.ansiToText(text) });
283
- const html = Anser.ansiToHtml(Anser.escapeForHtml(text));
284
- return _jsx("span", { dangerouslySetInnerHTML: { __html: html } });
285
- }
286
- export function CodexFileChangeBlock({ item, settings, }) {
287
- const totals = countFileUpdateChanges(item.changes);
288
- return (_jsxs("div", { className: "space-y-3", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 text-[12px] text-fg-tertiary", children: [_jsx(GitBranchIcon, { className: "size-3.5" }), _jsx("span", { className: "font-semibold text-fg-secondary", children: "edited files" }), _jsxs("span", { className: "text-status-ok", children: ["+", totals.additions] }), _jsxs("span", { className: "text-status-err", children: ["-", totals.deletions] }), _jsx("span", { children: item.status })] }), item.changes.map((change, index) => (_jsx(CodexUnifiedDiff, { change: change, settings: settings }, `${change.path}-${index}`)))] }));
289
- }
290
- export function CodexUnifiedDiff({ change, settings = DEFAULT_CODEX_TRANSCRIPT_RENDER_SETTINGS, }) {
291
- const files = parseCodexUnifiedDiff(change);
292
- const collapsed = settings.diffs === "collapsed" ||
293
- (settings.diffs === "auto" &&
294
- files.some((file) => file.hunks.some((hunk) => hunk.changes.length > 160)));
295
- return (_jsx("div", { className: "space-y-2", children: files.map((file) => (_jsx(CodexDiffFile, { collapsed: collapsed, file: file, settings: settings }, `${file.oldPath}:${file.newPath}`))) }));
296
- }
297
- function CodexDiffFile({ collapsed, file, settings, }) {
298
- const language = languageForPath(file.displayPath);
299
- return (_jsxs("div", { className: "space-y-1.5", children: [_jsxs("div", { className: "flex flex-wrap items-center gap-2 font-mono text-[12px] text-fg-secondary", children: [_jsx("span", { children: file.displayPath }), _jsxs("span", { className: "text-status-ok", children: ["+", file.totals.additions] }), _jsxs("span", { className: "text-status-err", children: ["-", file.totals.deletions] })] }), collapsed ? (_jsxs("div", { className: "font-mono text-[12px] text-fg-tertiary", children: ["diff collapsed (", formatNumber(totalDiffLines(file)), " lines)"] })) : (_jsx("div", { className: "overflow-hidden rounded-md border border-border bg-bg-card font-mono text-[12px] leading-5", children: file.hunks.map((hunk, hunkIndex) => (_jsxs("div", { children: [_jsx("div", { className: "border-b border-border/70 bg-bg-elevated px-3 py-1 text-fg-tertiary", children: hunk.content }), hunk.changes.map((change, index) => (_jsxs("div", { className: cn("grid grid-cols-[4.5rem_4.5rem_1.5rem_minmax(0,1fr)] gap-2 px-3 py-0.5", change.type === "insert" && "bg-status-ok/10", change.type === "delete" && "bg-status-err/10"), children: [_jsx("span", { className: "text-right text-fg-tertiary", children: "oldLineNumber" in change ? change.oldLineNumber : "" }), _jsx("span", { className: "text-right text-fg-tertiary", children: "newLineNumber" in change ? change.newLineNumber : "" }), _jsx("span", { className: cn("text-fg-tertiary", change.type === "insert" && "text-status-ok", change.type === "delete" && "text-status-err"), children: change.type === "insert"
300
- ? "+"
301
- : change.type === "delete"
302
- ? "-"
303
- : " " }), _jsx("span", { className: "min-w-0 whitespace-pre-wrap break-words text-fg", children: _jsx(CodexHighlightedFragment, { code: change.content.replace(/^[+\- ]/, ""), enabled: settings.syntaxHighlighting, language: language }) })] }, `${change.content}-${index}`)))] }, `${hunk.content}-${hunkIndex}`))) }))] }));
304
- }
305
- function CodexHighlightedFragment({ code, enabled, language, }) {
306
- const [html, setHtml] = useState(null);
307
- useEffect(() => {
308
- if (!enabled || language === "text" || code.trim().length === 0) {
309
- setHtml(null);
310
- return;
311
- }
312
- let active = true;
313
- import("shiki")
314
- .then(({ codeToHtml }) => codeToHtml(code, { lang: language, theme: "github-dark-default" }))
315
- .then((nextHtml) => {
316
- if (!active)
317
- return;
318
- const match = /<code[^>]*>([\s\S]*?)<\/code>/.exec(nextHtml);
319
- setHtml(match?.[1] ?? null);
320
- })
321
- .catch(() => {
322
- if (active)
323
- setHtml(null);
324
- });
325
- return () => {
326
- active = false;
327
- };
328
- }, [code, enabled, language]);
329
- if (!html)
330
- return _jsx(_Fragment, { children: code });
331
- return _jsx("span", { dangerouslySetInnerHTML: { __html: html } });
332
- }
333
- export function CodexToolCallText({ item, settings, }) {
334
- const title = item.type === "mcpToolCall"
335
- ? `${item.server}.${item.tool}`
336
- : [item.namespace, item.tool].filter(Boolean).join(".");
337
- const detail = settings.toolDetails === "full"
338
- ? JSON.stringify(item, null, 2)
339
- : item.type === "mcpToolCall" && item.error
340
- ? item.error.message
341
- : "";
342
- return (_jsx(CodexTranscriptLine, { icon: _jsx(CircleIcon, { className: "size-3.5" }), label: item.type === "mcpToolCall" ? "mcp" : "tool", muted: true, value: [title, detail].filter(Boolean).join("\n") }));
343
- }
344
- export function CodexPendingRequestLine({ request, }) {
345
- return (_jsx(CodexTranscriptLine, { icon: _jsx(ClockIcon, { className: "size-3.5" }), label: "pending request", value: `${request.method}\nrequest ${String(request.id)}` }));
346
- }
347
- function CodexTranscriptLine({ icon, label, muted = false, value, }) {
348
- return (_jsxs("div", { className: cn("space-y-1 text-[13px] leading-6", muted && "text-fg-secondary"), children: [_jsxs("div", { className: "flex items-center gap-2 text-[12px] font-semibold text-fg-tertiary", children: [icon, label] }), _jsx("pre", { className: "whitespace-pre-wrap font-sans", children: value })] }));
349
- }
350
- export function CodexThreadInspector({ session, showControls = false, snapshot, }) {
351
- const summary = useMemo(() => summarizeCodexThread(snapshot), [snapshot]);
352
- const thread = summary.thread;
353
- const usagePercent = tokenUsagePercent(summary.tokenUsage);
354
- const [turnControls, setTurnControls] = useCodexTurnControlState(session);
355
- const lastTurn = summary.lastTurnDurationMs == null
356
- ? "none"
357
- : `${summary.lastTurnDurationMs}ms`;
358
- return (_jsxs("div", { className: "space-y-2", children: [_jsx(CodexInspectorValueItem, { label: "Thread", mono: true, value: thread?.id ?? "none" }), _jsx(CodexInspectorValueItem, { label: "Status", value: thread?.status.type ?? "none" }), _jsx(CodexInspectorValueItem, { label: "Source", value: thread ? codexThreadSourceKind(thread) : "none" }), _jsx(CodexInspectorValueItem, { label: "Cwd", mono: true, value: thread?.cwd ?? "none" }), showControls ? (_jsx(CodexTurnControlInspectorItems, { onChange: setTurnControls, value: turnControls })) : null, _jsx(CodexInspectorValueItem, { label: "Turns", mono: true, value: formatNumber(summary.turnCount) }), _jsx(CodexInspectorValueItem, { label: "Items", mono: true, value: formatNumber(summary.itemCount) }), _jsx(CodexInspectorValueItem, { label: "Commands", mono: true, value: formatNumber(summary.commandCount) }), _jsx(CodexInspectorValueItem, { label: "File changes", mono: true, value: formatNumber(summary.fileChangeCount) }), _jsx(CodexInspectorValueItem, { label: "Last turn", mono: true, value: lastTurn }), _jsx(CodexInspectorValueItem, { label: "Tokens", mono: true, value: formatTokenUsageBreakdown(summary.tokenUsage?.tokenUsage.total) }), _jsx(CodexInspectorValueItem, { label: "Context", mono: true, value: usagePercent == null ? "unknown" : `${usagePercent}%` }), _jsx(CodexInspectorValueItem, { label: "Pending", mono: true, value: String(summary.pendingRequestCount) })] }));
359
- }
360
- function CodexTurnControlInspectorItems({ onChange, value, }) {
361
- const modelOptions = useCodexModelOptions();
362
- const set = useCodexTurnControlSetter(onChange, value);
363
- return (_jsxs(_Fragment, { children: [_jsx(CodexTurnControlInspectorItem, { label: "Model", children: _jsx(SimpleSelect, { className: "text-[12px]", onValueChange: (model) => set("model", model === "__default" ? null : model), options: modelOptions, value: value.model ?? "__default" }) }), _jsx(CodexTurnControlInspectorItem, { label: "Effort", children: _jsx(SimpleSelect, { className: "text-[12px]", onValueChange: (effort) => set("effort", effort === "__default" ? null : effort), options: CODEX_REASONING_EFFORT_OPTIONS, value: value.effort ?? "__default" }) }), _jsx(CodexTurnControlInspectorItem, { label: "Approval", children: _jsx(SimpleSelect, { className: "text-[12px]", onValueChange: (approvalPolicy) => set("approvalPolicy", approvalPolicy === "__default" ? null : approvalPolicy), options: CODEX_APPROVAL_OPTIONS, value: typeof value.approvalPolicy === "string"
364
- ? value.approvalPolicy
365
- : "__default" }) }), _jsx(CodexTurnControlInspectorItem, { label: "Reasoning summary", children: _jsx(SimpleSelect, { className: "text-[12px]", onValueChange: (summary) => set("summary", summary === "__default" ? null : summary), options: CODEX_REASONING_SUMMARY_OPTIONS, value: value.summary ?? "__default" }) })] }));
366
- }
367
- function CodexTurnControlInspectorItem({ children, label, }) {
368
- return (_jsx(InspectorItem, { children: _jsxs("label", { className: "block", children: [_jsx(InspectorItemHeader, { className: "mb-2", title: label }), children] }) }));
369
- }
370
- function CodexInspectorValueItem({ label, mono = false, value, }) {
371
- return (_jsxs(InspectorItem, { children: [_jsx(InspectorItemHeader, { title: label }), _jsx(InspectorItemValue, { className: "block whitespace-normal text-left break-words", mono: mono, children: value })] }));
372
- }
373
- export function CodexThreadSidebar({ activeThreadId, archived = false, cwd, limit = 40, onOpenThread, searchTerm, sourceKinds, }) {
374
- const { client, error: serverError, initialized, status, } = useCodexAppServer();
375
- const [threads, setThreads] = useState([]);
376
- const [error, setError] = useState(null);
377
- const [loading, setLoading] = useState(false);
378
- const refresh = useCallback(async () => {
379
- if (!client || !initialized)
380
- return;
381
- setLoading(true);
382
- setError(null);
383
- try {
384
- const response = await client.listThreads({
385
- archived,
386
- cwd,
387
- limit,
388
- searchTerm,
389
- sortDirection: "desc",
390
- sortKey: "updated_at",
391
- sourceKinds,
392
- });
393
- setThreads(response.data);
394
- }
395
- catch (nextError) {
396
- setError(nextError instanceof Error ? nextError : new Error(String(nextError)));
397
- }
398
- finally {
399
- setLoading(false);
400
- }
401
- }, [archived, client, cwd, initialized, limit, searchTerm, sourceKinds]);
402
- useEffect(() => {
403
- void refresh();
404
- }, [refresh]);
405
- useEffect(() => {
406
- if (!client)
407
- return;
408
- return client.onNotification((notification) => {
409
- if (notification.method === "thread/started" ||
410
- notification.method === "thread/status/changed" ||
411
- notification.method === "thread/name/updated" ||
412
- notification.method === "thread/archived" ||
413
- notification.method === "thread/unarchived" ||
414
- notification.method === "thread/closed" ||
415
- notification.method === "turn/completed") {
416
- void refresh();
417
- }
418
- });
419
- }, [client, refresh]);
420
- return (_jsxs(SidebarSection, { children: [_jsx("div", { className: "mb-1 flex justify-end px-2", children: _jsx("button", { "aria-label": "Refresh Codex threads", className: "rounded-md p-1 text-fg-tertiary hover:bg-bg-hover hover:text-fg", onClick: () => void refresh(), type: "button", children: _jsx(RefreshCcwIcon, { className: cn("size-3.5", loading && "animate-spin") }) }) }), serverError || error ? (_jsx("div", { className: "px-2 py-2 text-[11px] text-status-err", children: (serverError ?? error)?.message })) : null, !serverError && !error && (!client || !initialized) ? (_jsx("div", { className: "px-2 py-2 text-[11px] text-fg-tertiary", children: status === "connecting"
421
- ? "Connecting to Codex..."
422
- : "Codex is not connected." })) : null, client && initialized && threads.length === 0 && !loading ? (_jsx("div", { className: "px-2 py-2 text-[11px] text-fg-tertiary", children: "No Codex threads found." })) : null, threads.map((thread) => (_jsx(SidebarActionRow, { active: activeThreadId === thread.id, "aria-selected": activeThreadId === thread.id, description: codexThreadDescription(thread), icon: thread.status.type === "active" ? (_jsx(ClockIcon, { className: "size-4" })) : (_jsx(MessageSquareIcon, { className: "size-4" })), onClick: () => onOpenThread(thread), role: "tab", title: codexThreadTitle(thread) }, thread.id)))] }));
423
- }
424
- export function CodexThreadStats({ snapshot, }) {
425
- const summary = summarizeCodexThread(snapshot);
426
- return (_jsxs("div", { className: "grid gap-3 md:grid-cols-4", children: [_jsx(CodexStat, { label: "Turns", value: summary.turnCount }), _jsx(CodexStat, { label: "Commands", value: summary.commandCount }), _jsx(CodexStat, { label: "Changes", value: summary.fileChangeCount }), _jsx(CodexStat, { label: "Pending", value: summary.pendingRequestCount })] }));
427
- }
428
- function CodexStat({ label, value }) {
429
- return (_jsxs("div", { className: "rounded-[10px] border border-border bg-bg-card px-4 py-[14px]", children: [_jsx("p", { className: "mb-1.5 text-[11px] font-medium tracking-[0.06em] text-fg-tertiary uppercase", children: label }), _jsx("p", { className: "font-mono text-[22px] leading-[1.2] font-semibold text-fg", children: value })] }));
430
- }
431
- function totalDiffLines(file) {
432
- return file.hunks.reduce((count, hunk) => count + hunk.changes.length, 0);
433
- }
2
+ export { CodexThreadComposer, CodexThreadWorkspace } from "./thread-workspace.js";
3
+ export { CodexThreadSidebar } from "./thread-sidebar.js";
4
+ export { CodexThreadInspector, CodexThreadStats } from "./thread-inspector.js";
5
+ export { CodexTurnControls } from "./turn-controls.js";
6
+ export { CodexAnsiText, CodexAssistantText, CodexCommandBlock, CodexFileChangeBlock, CodexHighlightedCode, CodexMarkdownText, CodexPendingRequestLine, CodexPlanText, CodexReasoningBlock, CodexThreadTranscript, CodexToolCallText, CodexUnifiedDiff, CodexUserMessageBubble, } from "./transcript-renderers.js";
434
7
  //# sourceMappingURL=transcript-react.js.map