@golba98/codexa 1.0.1 → 1.0.3
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/README.md +391 -94
- package/package.json +14 -8
- package/src/app.tsx +196 -63
- package/src/commands/handler.ts +9 -4
- package/src/config/buildInfo.ts +3 -0
- package/src/config/launchArgs.ts +10 -0
- package/src/config/layeredConfig.ts +0 -0
- package/src/config/persistence.ts +51 -0
- package/src/config/runtimeConfig.ts +4 -0
- package/src/config/settings.ts +6 -13
- package/src/config/toml-serialize.ts +0 -0
- package/src/config/trustStore.ts +0 -0
- package/src/config/updateCheckCache.ts +63 -0
- package/src/core/attachments.ts +0 -0
- package/src/core/auth/codexAuth.ts +0 -0
- package/src/core/channel.ts +23 -0
- package/src/core/cleanupFastFail.ts +0 -0
- package/src/core/clipboard.ts +0 -0
- package/src/core/codex.ts +0 -0
- package/src/core/codexExecArgs.ts +0 -0
- package/src/core/codexLaunch.ts +0 -0
- package/src/core/codexPrompt.ts +0 -0
- package/src/core/executables/claudeExecutable.ts +0 -0
- package/src/core/executables/codexExecutable.ts +1 -0
- package/src/core/executables/executableResolver.ts +61 -43
- package/src/core/executables/geminiExecutable.ts +0 -0
- package/src/core/githubDiagnostics.ts +0 -0
- package/src/core/hollowResponseFormat.ts +0 -0
- package/src/core/inputDebug.ts +0 -0
- package/src/core/launchContext.ts +33 -33
- package/src/core/models/codexCapabilities.ts +0 -0
- package/src/core/models/codexModelCapabilities.ts +0 -0
- package/src/core/models/modelSpecs.ts +0 -0
- package/src/core/perf/profiler.ts +0 -0
- package/src/core/perf/renderDebug.ts +0 -0
- package/src/core/planStorage.ts +0 -0
- package/src/core/process/CommandRunner.ts +0 -0
- package/src/core/process/processValidation.ts +9 -5
- package/src/core/projectInstructions.ts +0 -0
- package/src/core/providerLauncher/launcher.ts +59 -42
- package/src/core/providerLauncher/registry.ts +0 -0
- package/src/core/providerLauncher/types.ts +0 -0
- package/src/core/providerLauncher/workspaceConfig.ts +0 -0
- package/src/core/providerRuntime/anthropic.ts +0 -0
- package/src/core/providerRuntime/capabilityProfile.ts +0 -0
- package/src/core/providerRuntime/claudeCodeDiscovery.ts +0 -0
- package/src/core/providerRuntime/contextMetadata.ts +0 -0
- package/src/core/providerRuntime/gemini.ts +0 -0
- package/src/core/providerRuntime/lmstudio.ts +0 -0
- package/src/core/providerRuntime/local.ts +0 -0
- package/src/core/providerRuntime/models.ts +0 -0
- package/src/core/providerRuntime/reasoning.ts +0 -0
- package/src/core/providerRuntime/registry.ts +0 -0
- package/src/core/providerRuntime/types.ts +0 -0
- package/src/core/providers/codexJsonStream.ts +0 -0
- package/src/core/providers/codexSubprocess.ts +0 -0
- package/src/core/providers/codexTranscript.ts +0 -0
- package/src/core/providers/openaiNative.ts +0 -0
- package/src/core/providers/registry.ts +0 -0
- package/src/core/providers/types.ts +0 -0
- package/src/core/terminal/startupClear.ts +20 -0
- package/src/core/terminal/terminalCapabilities.ts +0 -0
- package/src/core/terminal/terminalControl.ts +0 -0
- package/src/core/terminal/terminalSanitize.ts +0 -0
- package/src/core/terminal/terminalSelection.ts +0 -0
- package/src/core/terminal/terminalTitle.ts +0 -0
- package/src/core/updateCheck.ts +188 -0
- package/src/core/workspaceActivity.ts +0 -0
- package/src/core/workspaceGuard.ts +0 -0
- package/src/core/workspaceRoot.ts +0 -0
- package/src/exec.ts +0 -0
- package/src/headless/execArgs.ts +1 -0
- package/src/headless/execRunner.ts +0 -0
- package/src/index.tsx +13 -9
- package/src/session/appSession.ts +0 -0
- package/src/session/chatLifecycle.ts +0 -0
- package/src/session/liveRenderScheduler.ts +0 -0
- package/src/session/planFlow.ts +0 -0
- package/src/session/planTranscript.ts +0 -0
- package/src/session/promptRunSchedule.ts +0 -0
- package/src/session/types.ts +2 -1
- package/src/test/runtimeTestUtils.ts +0 -0
- package/src/types/react-dom.d.ts +0 -0
- package/src/ui/ActionRequiredBlock.tsx +5 -5
- package/src/ui/ActivityBars.tsx +3 -3
- package/src/ui/ActivityIndicator.tsx +6 -6
- package/src/ui/AgentBlock.tsx +6 -6
- package/src/ui/AnimatedStatusText.tsx +1 -1
- package/src/ui/AppShell.tsx +13 -5
- package/src/ui/AttachmentImportPanel.tsx +8 -8
- package/src/ui/AuthPanel.tsx +20 -20
- package/src/ui/BackendPicker.tsx +0 -0
- package/src/ui/BottomComposer.tsx +117 -78
- package/src/ui/DashCard.tsx +3 -3
- package/src/ui/Markdown.tsx +17 -17
- package/src/ui/ModePicker.tsx +0 -0
- package/src/ui/ModelPicker.tsx +0 -0
- package/src/ui/ModelPickerScreen.tsx +10 -10
- package/src/ui/ModelReasoningPicker.tsx +14 -14
- package/src/ui/Panel.tsx +3 -3
- package/src/ui/PermissionsPanel.tsx +0 -0
- package/src/ui/PlanActionPicker.tsx +6 -6
- package/src/ui/PlanReviewPanel.tsx +8 -8
- package/src/ui/ProviderPicker.tsx +18 -18
- package/src/ui/ReasoningPicker.tsx +0 -0
- package/src/ui/RunFooter.tsx +3 -3
- package/src/ui/SelectionPanel.tsx +4 -4
- package/src/ui/SettingsPanel.tsx +8 -8
- package/src/ui/Spinner.tsx +1 -1
- package/src/ui/StaticIntroItem.tsx +0 -0
- package/src/ui/StaticTranscriptItem.tsx +0 -0
- package/src/ui/TextEntryPanel.tsx +10 -10
- package/src/ui/ThemePicker.tsx +0 -0
- package/src/ui/ThinkingBlock.tsx +8 -8
- package/src/ui/Timeline.tsx +21 -17
- package/src/ui/TopHeader.tsx +421 -257
- package/src/ui/TurnGroup.tsx +31 -31
- package/src/ui/UpdateAvailableCard.tsx +41 -0
- package/src/ui/UpdatePromptPanel.tsx +203 -0
- package/src/ui/busyStatusAnimation.ts +0 -0
- package/src/ui/commandNormalize.ts +0 -0
- package/src/ui/diffRenderer.ts +0 -0
- package/src/ui/focus.ts +3 -0
- package/src/ui/inputBuffer.ts +0 -0
- package/src/ui/layout.ts +1 -1
- package/src/ui/logoVariants.ts +107 -0
- package/src/ui/modeDisplay.ts +12 -12
- package/src/ui/outputPipeline.ts +0 -0
- package/src/ui/progressEntries.ts +0 -0
- package/src/ui/runActivityView.ts +0 -0
- package/src/ui/runtimeDisplay.ts +100 -0
- package/src/ui/slashCommands.ts +0 -0
- package/src/ui/terminalAnswerFormat.ts +0 -0
- package/src/ui/textLayout.ts +0 -0
- package/src/ui/theme.tsx +274 -395
- package/src/ui/themeFlow.ts +0 -0
- package/src/ui/timelineMeasure.ts +29 -19
- package/src/ui/useThrottledValue.ts +0 -0
- package/scripts/audit-codexa-capabilities.mjs +0 -466
- package/scripts/smoke-terminal-bench.mjs +0 -35
- package/src/appRenderStability.test.ts +0 -131
- package/src/commands/handler.test.ts +0 -643
- package/src/config/launchArgs.test.ts +0 -158
- package/src/config/layeredConfig.test.ts +0 -143
- package/src/config/persistence.test.ts +0 -110
- package/src/config/runtimeConfig.test.ts +0 -218
- package/src/config/settings.test.ts +0 -155
- package/src/config/trustStore.test.ts +0 -29
- package/src/core/attachments.test.ts +0 -155
- package/src/core/auth/codexAuth.test.ts +0 -68
- package/src/core/cleanupFastFail.test.ts +0 -76
- package/src/core/codexExecArgs.test.ts +0 -195
- package/src/core/codexLaunch.test.ts +0 -205
- package/src/core/codexPrompt.test.ts +0 -252
- package/src/core/executables/codexExecutable.test.ts +0 -212
- package/src/core/executables/executableResolver.test.ts +0 -129
- package/src/core/executables/geminiExecutable.test.ts +0 -116
- package/src/core/executables/pathSanityScan.test.ts +0 -47
- package/src/core/githubDiagnostics.test.ts +0 -92
- package/src/core/hollowResponseFormat.test.ts +0 -58
- package/src/core/launchContext.test.ts +0 -157
- package/src/core/models/codexCapabilities.test.ts +0 -45
- package/src/core/models/codexModelCapabilities.test.ts +0 -246
- package/src/core/models/modelSpecs.test.ts +0 -283
- package/src/core/perf/renderDebug.test.ts +0 -230
- package/src/core/planStorage.test.ts +0 -143
- package/src/core/process/CommandRunner.test.ts +0 -105
- package/src/core/projectInstructions.test.ts +0 -50
- package/src/core/providerLauncher/launcher.test.ts +0 -238
- package/src/core/providerLauncher/registry.test.ts +0 -324
- package/src/core/providerLauncher/workspaceConfig.test.ts +0 -638
- package/src/core/providerRuntime/anthropic.test.ts +0 -1120
- package/src/core/providerRuntime/capabilityProfile.test.ts +0 -311
- package/src/core/providerRuntime/contextMetadata.test.ts +0 -468
- package/src/core/providerRuntime/gemini.test.ts +0 -437
- package/src/core/providerRuntime/lmstudio.test.ts +0 -168
- package/src/core/providerRuntime/local.test.ts +0 -787
- package/src/core/providerRuntime/registry.test.ts +0 -233
- package/src/core/providers/codexJsonStream.test.ts +0 -148
- package/src/core/providers/codexSubprocess.test.ts +0 -68
- package/src/core/providers/codexTranscript.test.ts +0 -284
- package/src/core/terminal/terminalCapabilities.test.ts +0 -93
- package/src/core/terminal/terminalControl.test.ts +0 -75
- package/src/core/terminal/terminalSanitize.test.ts +0 -22
- package/src/core/terminal/terminalSelection.test.ts +0 -42
- package/src/core/terminal/terminalTitle.test.ts +0 -328
- package/src/core/workspaceActivity.test.ts +0 -163
- package/src/core/workspaceGuard.test.ts +0 -151
- package/src/core/workspaceRoot.test.ts +0 -23
- package/src/exec.test.ts +0 -13
- package/src/headless/execArgs.test.ts +0 -147
- package/src/headless/execRunner.test.ts +0 -434
- package/src/index.test.tsx +0 -618
- package/src/session/appSession.test.ts +0 -897
- package/src/session/chatLifecycle.test.ts +0 -64
- package/src/session/liveRenderScheduler.test.ts +0 -201
- package/src/session/planFlow.test.ts +0 -103
- package/src/session/planTranscript.test.ts +0 -65
- package/src/session/promptRunSchedule.test.ts +0 -36
- package/src/ui/ActivityIndicator.test.tsx +0 -58
- package/src/ui/AgentBlock.test.ts +0 -6
- package/src/ui/AnimatedStatusText.test.ts +0 -16
- package/src/ui/AppShell.test.tsx +0 -1739
- package/src/ui/AttachmentImportPanel.test.tsx +0 -204
- package/src/ui/BottomComposer.test.ts +0 -674
- package/src/ui/CodexLogo.tsx +0 -55
- package/src/ui/Markdown.test.ts +0 -157
- package/src/ui/ModelPickerProviderScope.test.tsx +0 -411
- package/src/ui/ModelPickerScreen.test.tsx +0 -99
- package/src/ui/ModelPickerState.test.tsx +0 -151
- package/src/ui/ModelReasoningPicker.test.tsx +0 -447
- package/src/ui/PlanReviewPanel.test.tsx +0 -267
- package/src/ui/PromptCardBorder.test.tsx +0 -161
- package/src/ui/ProviderPicker.test.tsx +0 -289
- package/src/ui/ProviderShortcut.test.tsx +0 -143
- package/src/ui/SettingsPanel.test.tsx +0 -233
- package/src/ui/Timeline.test.ts +0 -2067
- package/src/ui/TimelineNavigation.test.tsx +0 -201
- package/src/ui/TopHeader.test.tsx +0 -239
- package/src/ui/TurnGroup.test.tsx +0 -365
- package/src/ui/busyStatusAnimation.test.ts +0 -30
- package/src/ui/commandNormalize.test.ts +0 -142
- package/src/ui/diffRenderer.test.ts +0 -102
- package/src/ui/focusFlow.test.tsx +0 -1098
- package/src/ui/inputBuffer.test.ts +0 -151
- package/src/ui/layout.test.ts +0 -145
- package/src/ui/modeDisplay.test.ts +0 -42
- package/src/ui/runActivityView.test.ts +0 -89
- package/src/ui/runLifecycleView.test.tsx +0 -237
- package/src/ui/statusRenderIsolation.test.tsx +0 -654
- package/src/ui/terminalAnswerFormat.test.ts +0 -19
- package/src/ui/textLayout.test.ts +0 -18
- package/src/ui/themeFlow.test.ts +0 -53
- package/src/ui/timelineMeasureCache.test.ts +0 -986
|
@@ -1,204 +0,0 @@
|
|
|
1
|
-
import assert from "node:assert/strict";
|
|
2
|
-
import test from "node:test";
|
|
3
|
-
import React from "react";
|
|
4
|
-
import { PassThrough } from "node:stream";
|
|
5
|
-
import { Box, Text, render } from "ink";
|
|
6
|
-
import { AttachmentImportPanel, type PendingImportFile } from "./AttachmentImportPanel.js";
|
|
7
|
-
import { ThemeProvider } from "./theme.js";
|
|
8
|
-
|
|
9
|
-
class TestInput extends PassThrough {
|
|
10
|
-
readonly isTTY = true;
|
|
11
|
-
|
|
12
|
-
setRawMode(): this {
|
|
13
|
-
return this;
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
override resume(): this {
|
|
17
|
-
return this;
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
override pause(): this {
|
|
21
|
-
return this;
|
|
22
|
-
}
|
|
23
|
-
|
|
24
|
-
ref(): this {
|
|
25
|
-
return this;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
unref(): this {
|
|
29
|
-
return this;
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
class TestOutput extends PassThrough {
|
|
34
|
-
readonly isTTY = true;
|
|
35
|
-
columns = 120;
|
|
36
|
-
rows = 40;
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
function stripAnsi(value: string): string {
|
|
40
|
-
return value.replace(/\[[0-?]*[ -/]*[@-~]/g, "");
|
|
41
|
-
}
|
|
42
|
-
|
|
43
|
-
function sleep(ms = 50): Promise<void> {
|
|
44
|
-
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
function createInkHarness(node: React.ReactElement) {
|
|
48
|
-
const stdin = new TestInput();
|
|
49
|
-
const stdout = new TestOutput();
|
|
50
|
-
let output = "";
|
|
51
|
-
|
|
52
|
-
stdout.on("data", (chunk) => {
|
|
53
|
-
output += chunk.toString();
|
|
54
|
-
});
|
|
55
|
-
|
|
56
|
-
const instance = render(node, {
|
|
57
|
-
stdin: stdin as unknown as NodeJS.ReadStream,
|
|
58
|
-
stdout: stdout as unknown as NodeJS.WriteStream,
|
|
59
|
-
stderr: stdout as unknown as NodeJS.WriteStream,
|
|
60
|
-
debug: true,
|
|
61
|
-
exitOnCtrlC: false,
|
|
62
|
-
patchConsole: false,
|
|
63
|
-
});
|
|
64
|
-
|
|
65
|
-
return {
|
|
66
|
-
stdin,
|
|
67
|
-
instance,
|
|
68
|
-
getOutput(): string {
|
|
69
|
-
return stripAnsi(output);
|
|
70
|
-
},
|
|
71
|
-
async cleanup() {
|
|
72
|
-
instance.cleanup();
|
|
73
|
-
await sleep(20);
|
|
74
|
-
},
|
|
75
|
-
};
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
const TEST_FILE: PendingImportFile = {
|
|
79
|
-
srcPath: "C:\\Users\\jorda\\OneDrive\\Screenshots\\Screenshot 2026-05-18.png",
|
|
80
|
-
rawPath: "C:\\Users\\jorda\\OneDrive\\Screenshots\\Screenshot 2026-05-18.png",
|
|
81
|
-
destFilename: "Screenshot 2026-05-18.png",
|
|
82
|
-
isImage: true,
|
|
83
|
-
};
|
|
84
|
-
|
|
85
|
-
const ATTACHMENTS_DIR = "C:\\Development\\1-JavaScript\\13-Custom-CLI-Normal\\.codexa\\attachments";
|
|
86
|
-
const WORKSPACE_ROOT = "C:\\Development\\1-JavaScript\\13-Custom-CLI-Normal";
|
|
87
|
-
|
|
88
|
-
interface HarnessState {
|
|
89
|
-
confirmed: number;
|
|
90
|
-
cancelled: number;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
function AttachmentImportPanelHarness({
|
|
94
|
-
files = [TEST_FILE],
|
|
95
|
-
modelSupportsVision = null,
|
|
96
|
-
}: {
|
|
97
|
-
files?: PendingImportFile[];
|
|
98
|
-
modelSupportsVision?: boolean | null;
|
|
99
|
-
}) {
|
|
100
|
-
const [state, setState] = React.useState<HarnessState>({ confirmed: 0, cancelled: 0 });
|
|
101
|
-
|
|
102
|
-
return (
|
|
103
|
-
<ThemeProvider theme="purple">
|
|
104
|
-
<Box flexDirection="column">
|
|
105
|
-
<AttachmentImportPanel
|
|
106
|
-
focusId="import-confirmation"
|
|
107
|
-
files={files}
|
|
108
|
-
attachmentsDir={ATTACHMENTS_DIR}
|
|
109
|
-
workspaceRoot={WORKSPACE_ROOT}
|
|
110
|
-
modelSupportsVision={modelSupportsVision}
|
|
111
|
-
onConfirm={() => setState((s) => ({ ...s, confirmed: s.confirmed + 1 }))}
|
|
112
|
-
onCancel={() => setState((s) => ({ ...s, cancelled: s.cancelled + 1 }))}
|
|
113
|
-
/>
|
|
114
|
-
<Text>{`confirmed:${state.confirmed}`}</Text>
|
|
115
|
-
<Text>{`cancelled:${state.cancelled}`}</Text>
|
|
116
|
-
</Box>
|
|
117
|
-
</ThemeProvider>
|
|
118
|
-
);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
test("AttachmentImportPanel renders filename and destination path", async () => {
|
|
122
|
-
const harness = createInkHarness(<AttachmentImportPanelHarness />);
|
|
123
|
-
try {
|
|
124
|
-
await sleep();
|
|
125
|
-
const output = harness.getOutput();
|
|
126
|
-
assert.match(output, /Screenshot 2026-05-18\.png/);
|
|
127
|
-
assert.match(output, /\.codexa\/attachments/);
|
|
128
|
-
} finally {
|
|
129
|
-
await harness.cleanup();
|
|
130
|
-
}
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
test("AttachmentImportPanel Enter key calls onConfirm", async () => {
|
|
134
|
-
const harness = createInkHarness(<AttachmentImportPanelHarness />);
|
|
135
|
-
try {
|
|
136
|
-
await sleep();
|
|
137
|
-
harness.stdin.write("\r");
|
|
138
|
-
await sleep(80);
|
|
139
|
-
const output = harness.getOutput();
|
|
140
|
-
assert.match(output, /confirmed:1/);
|
|
141
|
-
assert.match(output, /cancelled:0/);
|
|
142
|
-
} finally {
|
|
143
|
-
await harness.cleanup();
|
|
144
|
-
}
|
|
145
|
-
});
|
|
146
|
-
|
|
147
|
-
test("AttachmentImportPanel Esc key calls onCancel", async () => {
|
|
148
|
-
const harness = createInkHarness(<AttachmentImportPanelHarness />);
|
|
149
|
-
try {
|
|
150
|
-
await sleep();
|
|
151
|
-
harness.stdin.write("");
|
|
152
|
-
await sleep(80);
|
|
153
|
-
const output = harness.getOutput();
|
|
154
|
-
assert.match(output, /confirmed:0/);
|
|
155
|
-
assert.match(output, /cancelled:1/);
|
|
156
|
-
} finally {
|
|
157
|
-
await harness.cleanup();
|
|
158
|
-
}
|
|
159
|
-
});
|
|
160
|
-
|
|
161
|
-
test("AttachmentImportPanel shows vision warning when modelSupportsVision is false and file is image", async () => {
|
|
162
|
-
const harness = createInkHarness(
|
|
163
|
-
<AttachmentImportPanelHarness modelSupportsVision={false} />,
|
|
164
|
-
);
|
|
165
|
-
try {
|
|
166
|
-
await sleep();
|
|
167
|
-
const output = harness.getOutput();
|
|
168
|
-
assert.match(output, /active model may not support images/i);
|
|
169
|
-
} finally {
|
|
170
|
-
await harness.cleanup();
|
|
171
|
-
}
|
|
172
|
-
});
|
|
173
|
-
|
|
174
|
-
test("AttachmentImportPanel does NOT show vision warning when modelSupportsVision is null", async () => {
|
|
175
|
-
const harness = createInkHarness(
|
|
176
|
-
<AttachmentImportPanelHarness modelSupportsVision={null} />,
|
|
177
|
-
);
|
|
178
|
-
try {
|
|
179
|
-
await sleep();
|
|
180
|
-
const output = harness.getOutput();
|
|
181
|
-
assert.doesNotMatch(output, /active model may not support images/i);
|
|
182
|
-
} finally {
|
|
183
|
-
await harness.cleanup();
|
|
184
|
-
}
|
|
185
|
-
});
|
|
186
|
-
|
|
187
|
-
test("AttachmentImportPanel does NOT show vision warning for non-image file even when modelSupportsVision is false", async () => {
|
|
188
|
-
const textFile: PendingImportFile = {
|
|
189
|
-
srcPath: "C:\\Users\\jorda\\Documents\\notes.txt",
|
|
190
|
-
rawPath: "C:\\Users\\jorda\\Documents\\notes.txt",
|
|
191
|
-
destFilename: "notes.txt",
|
|
192
|
-
isImage: false,
|
|
193
|
-
};
|
|
194
|
-
const harness = createInkHarness(
|
|
195
|
-
<AttachmentImportPanelHarness files={[textFile]} modelSupportsVision={false} />,
|
|
196
|
-
);
|
|
197
|
-
try {
|
|
198
|
-
await sleep();
|
|
199
|
-
const output = harness.getOutput();
|
|
200
|
-
assert.doesNotMatch(output, /active model may not support images/i);
|
|
201
|
-
} finally {
|
|
202
|
-
await harness.cleanup();
|
|
203
|
-
}
|
|
204
|
-
});
|