Files
codex/codex-cli/src/components/chat/terminal-chat-past-rollout.tsx
Michael Bolin 557f608f25 fix: add support for fileOpener in config.json (#911)
This PR introduces the following type:

```typescript
export type FileOpenerScheme = "vscode" | "cursor" | "windsurf";
```

and uses it as the new type for a `fileOpener` option in `config.json`.
If set, this will be used to linkify file annotations in the output
using the URI-based file opener supported in VS Code-based IDEs.

Currently, this does not pass:

Updated `codex-cli/tests/markdown.test.tsx` to verify the new behavior.
Note it required mocking `supports-hyperlinks` and temporarily modifying
`chalk.level` to yield the desired output.
2025-05-13 09:45:46 -07:00

69 lines
2.0 KiB
TypeScript

import type { TerminalChatSession } from "../../utils/session.js";
import type { ResponseItem } from "openai/resources/responses/responses";
import type { FileOpenerScheme } from "src/utils/config.js";
import TerminalChatResponseItem from "./terminal-chat-response-item";
import { Box, Text } from "ink";
import React from "react";
export default function TerminalChatPastRollout({
session,
items,
fileOpener,
}: {
session: TerminalChatSession;
items: Array<ResponseItem>;
fileOpener: FileOpenerScheme | undefined;
}): React.ReactElement {
const { version, id: sessionId, model } = session;
return (
<Box flexDirection="column">
<Box borderStyle="round" paddingX={1} width={64}>
<Text>
OpenAI <Text bold>Codex</Text>{" "}
<Text dimColor>
(research preview) <Text color="blueBright">v{version}</Text>
</Text>
</Text>
</Box>
<Box
borderStyle="round"
borderColor="gray"
paddingX={1}
width={64}
flexDirection="column"
>
<Text>
<Text color="magenta"></Text> localhost{" "}
<Text dimColor>· session:</Text>{" "}
<Text color="magentaBright" dimColor>
{sessionId}
</Text>
</Text>
<Text dimColor>
<Text color="blueBright"></Text> When / Who:{" "}
<Text bold>
{session.timestamp} <Text dimColor>/</Text> {session.user}
</Text>
</Text>
<Text dimColor>
<Text color="blueBright"></Text> model: <Text bold>{model}</Text>
</Text>
</Box>
<Box flexDirection="column" gap={1}>
{React.useMemo(
() =>
items.map((item, key) => (
<TerminalChatResponseItem
key={key}
item={item}
fileOpener={fileOpener}
/>
)),
[items, fileOpener],
)}
</Box>
</Box>
);
}