@golba98/codexa 1.0.4 → 1.0.5

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 (73) hide show
  1. package/package.json +1 -1
  2. package/src/app.tsx +128 -47
  3. package/src/commands/handler.ts +5 -16
  4. package/src/config/buildInfo.ts +2 -2
  5. package/src/core/models/codexModelCapabilities.ts +57 -4
  6. package/src/core/models/codexModelsCacheSeed.ts +153 -0
  7. package/src/core/models/providerModelCache.ts +106 -0
  8. package/src/core/process/CommandRunner.ts +12 -1
  9. package/src/core/providerLauncher/registry.ts +37 -7
  10. package/src/core/providerLauncher/types.ts +2 -1
  11. package/src/core/providerRuntime/anthropic.ts +3 -5
  12. package/src/core/providerRuntime/antigravity.ts +246 -90
  13. package/src/core/providerRuntime/claudeCodeDiscovery.ts +724 -692
  14. package/src/core/providerRuntime/mistralVibe.ts +663 -0
  15. package/src/core/providerRuntime/models.ts +18 -4
  16. package/src/core/providerRuntime/reasoning.ts +9 -6
  17. package/src/core/providerRuntime/registry.ts +94 -49
  18. package/src/core/providerRuntime/types.ts +1 -0
  19. package/src/index.tsx +23 -9
  20. package/src/test/runtimeTestUtils.ts +90 -0
  21. package/src/ui/{ActivityBars.tsx → chrome/ActivityBars.tsx} +1 -1
  22. package/src/ui/{ActivityIndicator.tsx → chrome/ActivityIndicator.tsx} +3 -3
  23. package/src/ui/{AnimatedStatusText.tsx → chrome/AnimatedStatusText.tsx} +3 -3
  24. package/src/ui/{AppShell.tsx → chrome/AppShell.tsx} +11 -11
  25. package/src/ui/{BottomComposer.tsx → chrome/BottomComposer.tsx} +15 -15
  26. package/src/ui/{DashCard.tsx → chrome/DashCard.tsx} +2 -2
  27. package/src/ui/{RunFooter.tsx → chrome/RunFooter.tsx} +3 -3
  28. package/src/ui/{RuntimeStatusBar.tsx → chrome/RuntimeStatusBar.tsx} +3 -3
  29. package/src/ui/{Spinner.tsx → chrome/Spinner.tsx} +1 -1
  30. package/src/ui/{TopHeader.tsx → chrome/TopHeader.tsx} +12 -12
  31. package/src/ui/{UpdateAvailableCard.tsx → chrome/UpdateAvailableCard.tsx} +3 -3
  32. package/src/ui/{commandNormalize.ts → input/commandNormalize.ts} +1 -1
  33. package/src/ui/{focus.ts → input/focus.ts} +1 -1
  34. package/src/ui/{inputBuffer.ts → input/inputBuffer.ts} +3 -3
  35. package/src/ui/{AttachmentImportPanel.tsx → panels/AttachmentImportPanel.tsx} +1 -1
  36. package/src/ui/{AuthPanel.tsx → panels/AuthPanel.tsx} +5 -5
  37. package/src/ui/{BackendPicker.tsx → panels/BackendPicker.tsx} +2 -2
  38. package/src/ui/{ModePicker.tsx → panels/ModePicker.tsx} +2 -2
  39. package/src/ui/{ModelPicker.tsx → panels/ModelPicker.tsx} +2 -2
  40. package/src/ui/{ModelPickerScreen.tsx → panels/ModelPickerScreen.tsx} +11 -9
  41. package/src/ui/{ModelReasoningPicker.tsx → panels/ModelReasoningPicker.tsx} +5 -5
  42. package/src/ui/{Panel.tsx → panels/Panel.tsx} +1 -1
  43. package/src/ui/{PermissionsPanel.tsx → panels/PermissionsPanel.tsx} +3 -3
  44. package/src/ui/{PlanActionPicker.tsx → panels/PlanActionPicker.tsx} +2 -2
  45. package/src/ui/{PlanReviewPanel.tsx → panels/PlanReviewPanel.tsx} +5 -5
  46. package/src/ui/{ProviderPicker.tsx → panels/ProviderPicker.tsx} +9 -7
  47. package/src/ui/{ReasoningPicker.tsx → panels/ReasoningPicker.tsx} +3 -3
  48. package/src/ui/{SelectionPanel.tsx → panels/SelectionPanel.tsx} +1 -1
  49. package/src/ui/{SettingsPanel.tsx → panels/SettingsPanel.tsx} +3 -3
  50. package/src/ui/{TextEntryPanel.tsx → panels/TextEntryPanel.tsx} +3 -3
  51. package/src/ui/{ThemePicker.tsx → panels/ThemePicker.tsx} +2 -2
  52. package/src/ui/{UpdatePromptPanel.tsx → panels/UpdatePromptPanel.tsx} +2 -2
  53. package/src/ui/{Markdown.tsx → render/Markdown.tsx} +2 -2
  54. package/src/ui/{diffRenderer.ts → render/diffRenderer.ts} +1 -1
  55. package/src/ui/{modeDisplay.ts → render/modeDisplay.ts} +2 -2
  56. package/src/ui/{outputPipeline.ts → render/outputPipeline.ts} +2 -2
  57. package/src/ui/{runtimeDisplay.ts → render/runtimeDisplay.ts} +9 -8
  58. package/src/ui/{ActionRequiredBlock.tsx → timeline/ActionRequiredBlock.tsx} +3 -3
  59. package/src/ui/{AgentBlock.tsx → timeline/AgentBlock.tsx} +10 -10
  60. package/src/ui/{StaticIntroItem.tsx → timeline/StaticIntroItem.tsx} +2 -2
  61. package/src/ui/{ThinkingBlock.tsx → timeline/ThinkingBlock.tsx} +4 -4
  62. package/src/ui/{Timeline.tsx → timeline/Timeline.tsx} +8 -8
  63. package/src/ui/{TranscriptShell.tsx → timeline/TranscriptShell.tsx} +6 -6
  64. package/src/ui/{TurnGroup.tsx → timeline/TurnGroup.tsx} +15 -15
  65. package/src/ui/{progressEntries.ts → timeline/progressEntries.ts} +3 -3
  66. package/src/ui/{runActivityView.ts → timeline/runActivityView.ts} +1 -1
  67. package/src/ui/{timelineMeasure.ts → timeline/timelineMeasure.ts} +14 -14
  68. /package/src/ui/{busyStatusAnimation.ts → chrome/busyStatusAnimation.ts} +0 -0
  69. /package/src/ui/{slashCommands.ts → input/slashCommands.ts} +0 -0
  70. /package/src/ui/{logoVariants.ts → render/logoVariants.ts} +0 -0
  71. /package/src/ui/{terminalAnswerFormat.ts → render/terminalAnswerFormat.ts} +0 -0
  72. /package/src/ui/{textLayout.ts → render/textLayout.ts} +0 -0
  73. /package/src/ui/{layoutListWindow.ts → timeline/layoutListWindow.ts} +0 -0
@@ -1,6 +1,6 @@
1
- import type { WrappedTextRow } from "./textLayout.js";
2
- import { getTextWidth, normalizeLineBreaks, wrapTextRows } from "./textLayout.js";
3
- import { sanitizeTerminalInput } from "../core/terminal/terminalSanitize.js";
1
+ import type { WrappedTextRow } from "../render/textLayout.js";
2
+ import { getTextWidth, normalizeLineBreaks, wrapTextRows } from "../render/textLayout.js";
3
+ import { sanitizeTerminalInput } from "../../core/terminal/terminalSanitize.js";
4
4
 
5
5
  export type WrappedInputRow = WrappedTextRow;
6
6
 
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useFocus, useInput } from "ink";
3
3
  import path from "node:path";
4
- import { useTheme } from "./theme.js";
4
+ import { useTheme } from "../theme.js";
5
5
 
6
6
  export interface PendingImportFile {
7
7
  srcPath: string;
@@ -1,10 +1,10 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useFocus, useInput } from "ink";
3
- import { AUTH_PREFERENCES, formatAuthPreferenceLabel } from "../config/settings.js";
4
- import type { CodexAuthProbeResult } from "../core/auth/codexAuth.js";
5
- import { getAuthStateLabel } from "../core/auth/codexAuth.js";
6
- import type { BackendProvider } from "../core/providers/types.js";
7
- import { useTheme } from "./theme.js";
3
+ import { AUTH_PREFERENCES, formatAuthPreferenceLabel } from "../../config/settings.js";
4
+ import type { CodexAuthProbeResult } from "../../core/auth/codexAuth.js";
5
+ import { getAuthStateLabel } from "../../core/auth/codexAuth.js";
6
+ import type { BackendProvider } from "../../core/providers/types.js";
7
+ import { useTheme } from "../theme.js";
8
8
 
9
9
  interface AuthPanelProps {
10
10
  focusId: string;
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
- import { AVAILABLE_BACKENDS } from "../config/settings.js";
3
- import { FOCUS_IDS } from "./focus.js";
2
+ import { AVAILABLE_BACKENDS } from "../../config/settings.js";
3
+ import { FOCUS_IDS } from "../input/focus.js";
4
4
  import { SelectionPanel } from "./SelectionPanel.js";
5
5
 
6
6
  interface BackendPickerProps {
@@ -1,5 +1,5 @@
1
- import { AVAILABLE_MODES } from "../config/settings.js";
2
- import { FOCUS_IDS } from "./focus.js";
1
+ import { AVAILABLE_MODES } from "../../config/settings.js";
2
+ import { FOCUS_IDS } from "../input/focus.js";
3
3
  import { SelectionPanel } from "./SelectionPanel.js";
4
4
 
5
5
  interface ModePickerProps {
@@ -1,5 +1,5 @@
1
- import { type CodexModelCapability } from "../core/models/codexModelCapabilities.js";
2
- import { FOCUS_IDS } from "./focus.js";
1
+ import { type CodexModelCapability } from "../../core/models/codexModelCapabilities.js";
2
+ import { FOCUS_IDS } from "../input/focus.js";
3
3
  import { SelectionPanel } from "./SelectionPanel.js";
4
4
 
5
5
  interface ModelPickerProps {
@@ -4,10 +4,10 @@ import {
4
4
  type CodexModelCapability,
5
5
  type ReasoningEffortCapability,
6
6
  normalizeReasoningForModelCapabilities,
7
- } from "../core/models/codexModelCapabilities.js";
8
- import { formatReasoningLabel } from "../config/settings.js";
9
- import { traceInputDebug } from "../core/debug/inputDebug.js";
10
- import { FOCUS_IDS } from "./focus.js";
7
+ } from "../../core/models/codexModelCapabilities.js";
8
+ import { formatReasoningLabel } from "../../config/settings.js";
9
+ import { traceInputDebug } from "../../core/debug/inputDebug.js";
10
+ import { FOCUS_IDS } from "../input/focus.js";
11
11
  import {
12
12
  clampVisualText,
13
13
  getShellWidth,
@@ -19,10 +19,10 @@ import {
19
19
  type ActivePanelLayout,
20
20
  type PanelLayout,
21
21
  usePanelLayout,
22
- } from "./layout.js";
23
- import { calculateListWindow } from "./layoutListWindow.js";
24
- import { useTheme } from "./theme.js";
25
- import type { GeminiModelSelection } from "../core/providerRuntime/types.js";
22
+ } from "../layout.js";
23
+ import { calculateListWindow } from "../timeline/layoutListWindow.js";
24
+ import { useTheme } from "../theme.js";
25
+ import type { GeminiModelSelection } from "../../core/providerRuntime/types.js";
26
26
 
27
27
  // ─── Types & helpers ─────────────────────────────────────────────────────────
28
28
 
@@ -498,7 +498,9 @@ export function ModelPickerScreen({
498
498
  >
499
499
  {models.length === 0 ? (
500
500
  <Text color={theme.textMuted}>
501
- {isLoading ? "Discovering models from the Codex runtime..." : (emptyMessage ?? "No models available.")}
501
+ {isLoading
502
+ ? `Discovering models from ${activeProviderLabel === "OpenAI" ? "the Codex runtime" : activeProviderLabel}...`
503
+ : (emptyMessage ?? "No models available.")}
502
504
  </Text>
503
505
  ) : (
504
506
  visibleModels.map((model, index) => {
@@ -4,11 +4,11 @@ import {
4
4
  type CodexModelCapability,
5
5
  type ReasoningEffortCapability,
6
6
  normalizeReasoningForModelCapabilities,
7
- } from "../core/models/codexModelCapabilities.js";
8
- import { formatReasoningLabel } from "../config/settings.js";
9
- import { traceInputDebug } from "../core/debug/inputDebug.js";
10
- import { FOCUS_IDS } from "./focus.js";
11
- import { useTheme } from "./theme.js";
7
+ } from "../../core/models/codexModelCapabilities.js";
8
+ import { formatReasoningLabel } from "../../config/settings.js";
9
+ import { traceInputDebug } from "../../core/debug/inputDebug.js";
10
+ import { FOCUS_IDS } from "../input/focus.js";
11
+ import { useTheme } from "../theme.js";
12
12
 
13
13
  // ─── Types & helpers ─────────────────────────────────────────────────────────
14
14
 
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
2
  import { Box, Text } from "ink";
3
- import { useTheme } from "./theme.js";
3
+ import { useTheme } from "../theme.js";
4
4
 
5
5
  interface PanelProps {
6
6
  cols: number;
@@ -1,10 +1,10 @@
1
- import type { ResolvedRuntimeConfig, RuntimeConfig } from "../config/runtimeConfig.js";
1
+ import type { ResolvedRuntimeConfig, RuntimeConfig } from "../../config/runtimeConfig.js";
2
2
  import {
3
3
  formatApprovalPolicyLabel,
4
4
  formatNetworkAccessLabel,
5
5
  formatSandboxModeLabel,
6
- } from "../config/runtimeConfig.js";
7
- import { FOCUS_IDS } from "./focus.js";
6
+ } from "../../config/runtimeConfig.js";
7
+ import { FOCUS_IDS } from "../input/focus.js";
8
8
  import { SelectionPanel } from "./SelectionPanel.js";
9
9
 
10
10
  export type PermissionsPanelAction =
@@ -1,7 +1,7 @@
1
1
  import React, { useEffect, useRef, useState } from "react";
2
2
  import { Box, Text, useFocus, useInput, useStdin } from "ink";
3
- import { FOCUS_IDS } from "./focus.js";
4
- import { useTheme } from "./theme.js";
3
+ import { FOCUS_IDS } from "../input/focus.js";
4
+ import { useTheme } from "../theme.js";
5
5
 
6
6
  export type PlanActionValue = "implement" | "revise" | "cancel";
7
7
 
@@ -1,10 +1,10 @@
1
1
  import { useMemo } from "react";
2
2
  import { Box, Text } from "ink";
3
- import { normalizePlanReviewMarkdown } from "../core/workspace/planStorage.js";
4
- import { getUsableShellWidth } from "./layout.js";
5
- import { parseMarkdown } from "./Markdown.js";
6
- import { getTextWidth } from "./textLayout.js";
7
- import { useTheme } from "./theme.js";
3
+ import { normalizePlanReviewMarkdown } from "../../core/workspace/planStorage.js";
4
+ import { getUsableShellWidth } from "../layout.js";
5
+ import { parseMarkdown } from "../render/Markdown.js";
6
+ import { getTextWidth } from "../render/textLayout.js";
7
+ import { useTheme } from "../theme.js";
8
8
 
9
9
  // ─── Types ────────────────────────────────────────────────────────────────────
10
10
 
@@ -1,8 +1,8 @@
1
1
  import React, { useMemo, useState } from "react";
2
2
  import { Box, Text, useFocus, useInput } from "ink";
3
- import type { ProviderConfig, ProviderId, ProviderPickerAction } from "../core/providerLauncher/types.js";
4
- import { traceInputDebug } from "../core/debug/inputDebug.js";
5
- import { FOCUS_IDS } from "./focus.js";
3
+ import type { ProviderConfig, ProviderId, ProviderPickerAction } from "../../core/providerLauncher/types.js";
4
+ import { traceInputDebug } from "../../core/debug/inputDebug.js";
5
+ import { FOCUS_IDS } from "../input/focus.js";
6
6
  import {
7
7
  clampVisualText,
8
8
  getShellWidth,
@@ -14,9 +14,9 @@ import {
14
14
  type ActivePanelLayout,
15
15
  type PanelLayout,
16
16
  usePanelLayout,
17
- } from "./layout.js";
18
- import { calculateListWindow } from "./layoutListWindow.js";
19
- import { useTheme } from "./theme.js";
17
+ } from "../layout.js";
18
+ import { calculateListWindow } from "../timeline/layoutListWindow.js";
19
+ import { useTheme } from "../theme.js";
20
20
 
21
21
  // ─── Types & helpers ─────────────────────────────────────────────────────────
22
22
 
@@ -247,7 +247,9 @@ export function ProviderPicker({
247
247
  return;
248
248
  }
249
249
  if (key.return && selectedProvider) {
250
- onAction(selectedProvider.id, actions[actionIndex]?.value ?? "cancel");
250
+ const action = actions[actionIndex];
251
+ if (action?.disabledReason) return;
252
+ onAction(selectedProvider.id, action?.value ?? "cancel");
251
253
  }
252
254
  }, { isActive: isFocused });
253
255
 
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
- import { type ReasoningEffortCapability } from "../core/models/codexModelCapabilities.js";
3
- import { formatReasoningLabel } from "../config/settings.js";
4
- import { FOCUS_IDS } from "./focus.js";
2
+ import { type ReasoningEffortCapability } from "../../core/models/codexModelCapabilities.js";
3
+ import { formatReasoningLabel } from "../../config/settings.js";
4
+ import { FOCUS_IDS } from "../input/focus.js";
5
5
  import { SelectionPanel } from "./SelectionPanel.js";
6
6
 
7
7
  interface ReasoningPickerProps {
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { Box, Text, useFocus, useInput } from "ink";
3
3
  import SelectInput from "ink-select-input";
4
- import { useTheme } from "./theme.js";
4
+ import { useTheme } from "../theme.js";
5
5
 
6
6
  interface SelectionPanelProps {
7
7
  focusId: string;
@@ -1,8 +1,8 @@
1
1
  import React, { useMemo, useState } from "react";
2
2
  import { Box, Text, useFocus, useInput } from "ink";
3
- import type { SettingDefinition } from "../config/settings.js";
4
- import type { FocusTargetId } from "./focus.js";
5
- import { useTheme } from "./theme.js";
3
+ import type { SettingDefinition } from "../../config/settings.js";
4
+ import type { FocusTargetId } from "../input/focus.js";
5
+ import { useTheme } from "../theme.js";
6
6
 
7
7
  export interface SettingsPanelProps<TKey extends string> {
8
8
  focusId: FocusTargetId;
@@ -1,8 +1,8 @@
1
1
  import React, { useMemo, useState } from "react";
2
2
  import { Box, Text, useFocus, useInput } from "ink";
3
- import type { FocusTargetId } from "./focus.js";
4
- import { useTheme } from "./theme.js";
5
- import { stripMouseEscapes } from "./inputBuffer.js";
3
+ import type { FocusTargetId } from "../input/focus.js";
4
+ import { useTheme } from "../theme.js";
5
+ import { stripMouseEscapes } from "../input/inputBuffer.js";
6
6
 
7
7
  interface TextEntryPanelProps {
8
8
  focusId: FocusTargetId;
@@ -1,6 +1,6 @@
1
1
  import React from "react";
2
- import { AVAILABLE_THEMES, formatThemeLabel } from "../config/settings.js";
3
- import { FOCUS_IDS } from "./focus.js";
2
+ import { AVAILABLE_THEMES, formatThemeLabel } from "../../config/settings.js";
3
+ import { FOCUS_IDS } from "../input/focus.js";
4
4
  import { SelectionPanel } from "./SelectionPanel.js";
5
5
 
6
6
  interface ThemePickerProps {
@@ -1,8 +1,8 @@
1
1
  import React, { useEffect, useRef, useState } from "react";
2
2
  import { Box, Text, useFocus, useInput } from "ink";
3
3
  import { spawn } from "child_process";
4
- import { useTheme } from "./theme.js";
5
- import { CODEXA_NPM_PACKAGE, CODEXA_UPDATE_COMMAND, formatVersionLabel } from "../core/version/updateCheck.js";
4
+ import { useTheme } from "../theme.js";
5
+ import { CODEXA_NPM_PACKAGE, CODEXA_UPDATE_COMMAND, formatVersionLabel } from "../../core/version/updateCheck.js";
6
6
 
7
7
  type Phase = "menu" | "running" | "done" | "error";
8
8
 
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { Box, Text } from "ink";
3
- import { useTheme } from "./theme.js";
4
- import { Panel } from "./Panel.js";
3
+ import { useTheme } from "../theme.js";
4
+ import { Panel } from "../panels/Panel.js";
5
5
  import { maybeRenderDiff, type DiffRenderLineType } from "./diffRenderer.js";
6
6
  import { formatLocalPathForTerminal, formatTerminalAnswerInline } from "./terminalAnswerFormat.js";
7
7
 
@@ -1,4 +1,4 @@
1
- import { sanitizeTerminalOutput } from "../core/terminal/terminalSanitize.js";
1
+ import { sanitizeTerminalOutput } from "../../core/terminal/terminalSanitize.js";
2
2
 
3
3
  export type DiffRenderLineType = "file" | "hunk" | "add" | "remove" | "context" | "meta";
4
4
 
@@ -1,5 +1,5 @@
1
- import { formatModeLabel } from "../config/settings.js";
2
- import type { Theme } from "./theme.js";
1
+ import { formatModeLabel } from "../../config/settings.js";
2
+ import type { Theme } from "../theme.js";
3
3
 
4
4
  export interface ModeDisplaySpec {
5
5
  label: string;
@@ -1,5 +1,5 @@
1
- import { isNoiseLine } from "../core/providers/codexTranscript.js";
2
- import { sanitizeTerminalOutput } from "../core/terminal/terminalSanitize.js";
1
+ import { isNoiseLine } from "../../core/providers/codexTranscript.js";
2
+ import { sanitizeTerminalOutput } from "../../core/terminal/terminalSanitize.js";
3
3
  import { parseMarkdown, type Segment } from "./Markdown.js";
4
4
 
5
5
  /**
@@ -1,11 +1,11 @@
1
- import { formatModeLabel, formatReasoningLabel } from "../config/settings.js";
2
- import type { RuntimeSummary } from "../config/runtimeConfig.js";
3
- import type { CodexModelCapability } from "../core/models/codexModelCapabilities.js";
4
- import type { ModelSpec } from "../core/models/modelSpecs.js";
5
- import type { ModelContextMetadata } from "../core/providerRuntime/contextMetadata.js";
6
- import { contextMetadataToModelSpec, formatContextCompact } from "../core/providerRuntime/contextMetadata.js";
7
- import type { ActiveProviderRoute } from "../core/providerRuntime/types.js";
8
- import { getAntigravityModelLabel } from "../core/providerRuntime/antigravity.js";
1
+ import { formatModeLabel, formatReasoningLabel } from "../../config/settings.js";
2
+ import type { RuntimeSummary } from "../../config/runtimeConfig.js";
3
+ import type { CodexModelCapability } from "../../core/models/codexModelCapabilities.js";
4
+ import type { ModelSpec } from "../../core/models/modelSpecs.js";
5
+ import type { ModelContextMetadata } from "../../core/providerRuntime/contextMetadata.js";
6
+ import { contextMetadataToModelSpec, formatContextCompact } from "../../core/providerRuntime/contextMetadata.js";
7
+ import type { ActiveProviderRoute } from "../../core/providerRuntime/types.js";
8
+ import { getAntigravityModelLabel } from "../../core/providerRuntime/antigravity.js";
9
9
 
10
10
  export interface ActiveRuntimeDisplayInput {
11
11
  route: ActiveProviderRoute;
@@ -29,6 +29,7 @@ const PROVIDER_DISPLAY: Record<string, string> = {
29
29
  openai: "OpenAI Codex CLI",
30
30
  anthropic: "Claude Code CLI",
31
31
  google: "Gemini CLI",
32
+ mistral: "Mistral Vibe CLI",
32
33
  local: "Local",
33
34
  antigravity: "Antigravity CLI",
34
35
  };
@@ -1,8 +1,8 @@
1
1
  import React from "react";
2
2
  import { Box, Text } from "ink";
3
- import { getUsableShellWidth } from "./layout.js";
4
- import { wrapPlainText } from "./textLayout.js";
5
- import { useTheme } from "./theme.js";
3
+ import { getUsableShellWidth } from "../layout.js";
4
+ import { wrapPlainText } from "../render/textLayout.js";
5
+ import { useTheme } from "../theme.js";
6
6
 
7
7
  interface ActionRequiredBlockProps {
8
8
  cols: number;
@@ -1,21 +1,21 @@
1
1
  import React, { memo, useDeferredValue, useMemo } from "react";
2
2
  import { Box, Text } from "ink";
3
- import type { AssistantEvent, RunEvent } from "../session/types.js";
4
- import { getAssistantContent } from "../session/types.js";
5
- import { MemoizedRenderMessage } from "./Markdown.js";
6
- import { getUsableShellWidth } from "./layout.js";
7
- import { useTheme } from "./theme.js";
8
- import { wrapPlainText } from "./textLayout.js";
9
- import { RUN_OUTPUT_TRUNCATION_NOTICE } from "../session/chatLifecycle.js";
10
- import { sanitizeTerminalOutput } from "../core/terminal/terminalSanitize.js";
3
+ import type { AssistantEvent, RunEvent } from "../../session/types.js";
4
+ import { getAssistantContent } from "../../session/types.js";
5
+ import { MemoizedRenderMessage } from "../render/Markdown.js";
6
+ import { getUsableShellWidth } from "../layout.js";
7
+ import { useTheme } from "../theme.js";
8
+ import { wrapPlainText } from "../render/textLayout.js";
9
+ import { RUN_OUTPUT_TRUNCATION_NOTICE } from "../../session/chatLifecycle.js";
10
+ import { sanitizeTerminalOutput } from "../../core/terminal/terminalSanitize.js";
11
11
  import {
12
12
  sanitizeOutput,
13
13
  sanitizeStreamChunk,
14
14
  normalizeOutput,
15
15
  classifyOutput,
16
16
  formatForBox,
17
- } from "./outputPipeline.js";
18
- import { DashCard } from "./DashCard.js";
17
+ } from "../render/outputPipeline.js";
18
+ import { DashCard } from "../chrome/DashCard.js";
19
19
 
20
20
 
21
21
  function formatDuration(ms: number): string {
@@ -1,7 +1,7 @@
1
1
  import React from "react";
2
2
  import { Box } from "ink";
3
- import type { CodexAuthState } from "../core/auth/codexAuth.js";
4
- import { getShellWidth, type Layout, type StartupHeaderMode } from "./layout.js";
3
+ import type { CodexAuthState } from "../../core/auth/codexAuth.js";
4
+ import { getShellWidth, type Layout, type StartupHeaderMode } from "../layout.js";
5
5
  import { buildIntroRenderItem, TimelineRowView } from "./Timeline.js";
6
6
  import type { TimelineRow } from "./timelineMeasure.js";
7
7
  import { buildTimelineSnapshot } from "./timelineMeasure.js";
@@ -1,9 +1,9 @@
1
1
  import React from "react";
2
2
  import { Box, Text } from "ink";
3
- import type { RunEvent } from "../session/types.js";
4
- import { clampVisualText, getUsableShellWidth } from "./layout.js";
5
- import { useTheme } from "./theme.js";
6
- import { DashCard } from "./DashCard.js";
3
+ import type { RunEvent } from "../../session/types.js";
4
+ import { clampVisualText, getUsableShellWidth } from "../layout.js";
5
+ import { useTheme } from "../theme.js";
6
+ import { DashCard } from "../chrome/DashCard.js";
7
7
  import {
8
8
  formatProgressBlockBodyLines,
9
9
  getProgressUpdateCount,
@@ -10,17 +10,17 @@ import {
10
10
  type TimelineEvent,
11
11
  type UIState,
12
12
  type UserPromptEvent,
13
- } from "../session/types.js";
14
- import { APP_VERSION } from "../config/settings.js";
15
- import { formatCodexaVersionLabel } from "../core/version/channel.js";
16
- import type { CodexAuthState } from "../core/auth/codexAuth.js";
17
- import { getAuthStateLabel } from "../core/auth/codexAuth.js";
18
- import * as renderDebug from "../core/perf/renderDebug.js";
19
- import { getShellWidth, type Layout, type StartupHeaderMode } from "./layout.js";
13
+ } from "../../session/types.js";
14
+ import { APP_VERSION } from "../../config/settings.js";
15
+ import { formatCodexaVersionLabel } from "../../core/version/channel.js";
16
+ import type { CodexAuthState } from "../../core/auth/codexAuth.js";
17
+ import { getAuthStateLabel } from "../../core/auth/codexAuth.js";
18
+ import * as renderDebug from "../../core/perf/renderDebug.js";
19
+ import { getShellWidth, type Layout, type StartupHeaderMode } from "../layout.js";
20
20
  import type { TimelineRow, TimelineSnapshot, TimelineTone } from "./timelineMeasure.js";
21
21
  import { buildStableTimelineSnapshot, buildTimelineSnapshot } from "./timelineMeasure.js";
22
22
  import { resolveTurnRunPhase, type TurnOpacity, type TurnRunPhase } from "./TurnGroup.js";
23
- import { useTheme } from "./theme.js";
23
+ import { useTheme } from "../theme.js";
24
24
 
25
25
  // ─── Types & constants ────────────────────────────────────────────────────────
26
26
 
@@ -1,9 +1,9 @@
1
1
  import React, { memo, useEffect, useMemo, useRef } from "react";
2
2
  import { Box, Static } from "ink";
3
- import type { RuntimeSummary } from "../config/runtimeConfig.js";
4
- import type { CodexAuthState } from "../core/auth/codexAuth.js";
5
- import * as renderDebug from "../core/perf/renderDebug.js";
6
- import type { TimelineEvent, UIState } from "../session/types.js";
3
+ import type { RuntimeSummary } from "../../config/runtimeConfig.js";
4
+ import type { CodexAuthState } from "../../core/auth/codexAuth.js";
5
+ import * as renderDebug from "../../core/perf/renderDebug.js";
6
+ import type { TimelineEvent, UIState } from "../../session/types.js";
7
7
  import {
8
8
  buildActiveRenderItems,
9
9
  buildIntroRenderItem,
@@ -12,13 +12,13 @@ import {
12
12
  TimelineRowView,
13
13
  type TimelineItem,
14
14
  } from "./Timeline.js";
15
- import { getShellHeight, getShellWidth, resolveStartupHeaderMode, type TerminalViewport } from "./layout.js";
15
+ import { getShellHeight, getShellWidth, resolveStartupHeaderMode, type TerminalViewport } from "../layout.js";
16
16
  import {
17
17
  buildNativeTranscriptParts,
18
18
  type NativeTranscriptRowItem,
19
19
  type TimelineRow,
20
20
  } from "./timelineMeasure.js";
21
- import { LOGO_COMPACT, LOGO_COMPACT_MIN_COLS, LOGO_LARGE, LOGO_MEDIUM, selectLogoVariant } from "./logoVariants.js";
21
+ import { LOGO_COMPACT, LOGO_COMPACT_MIN_COLS, LOGO_LARGE, LOGO_MEDIUM, selectLogoVariant } from "../render/logoVariants.js";
22
22
 
23
23
  type TranscriptStaticItem = NativeTranscriptRowItem & { type: "rows" };
24
24
  type StaticRenderItem = TranscriptStaticItem;
@@ -9,30 +9,30 @@ import type {
9
9
  RunToolActivity,
10
10
  UIState,
11
11
  UserPromptEvent,
12
- } from "../session/types.js";
13
- import { getAssistantContent, getResponseSegmentText, getRunPlanText } from "../session/types.js";
14
- import { formatTerminalAnswerInline } from "./terminalAnswerFormat.js";
12
+ } from "../../session/types.js";
13
+ import { getAssistantContent, getResponseSegmentText, getRunPlanText } from "../../session/types.js";
14
+ import { formatTerminalAnswerInline } from "../render/terminalAnswerFormat.js";
15
15
  import { ActionRequiredBlock } from "./ActionRequiredBlock.js";
16
- import { DashCard } from "./DashCard.js";
17
- import { useTheme } from "./theme.js";
18
- import { sanitizeTerminalOutput } from "../core/terminal/terminalSanitize.js";
19
- import { wrapPlainText, wrapCommandText } from "./textLayout.js";
16
+ import { DashCard } from "../chrome/DashCard.js";
17
+ import { useTheme } from "../theme.js";
18
+ import { sanitizeTerminalOutput } from "../../core/terminal/terminalSanitize.js";
19
+ import { wrapPlainText, wrapCommandText } from "../render/textLayout.js";
20
20
  import { selectVisibleRunActivity } from "./runActivityView.js";
21
- import type { RunFileActivity } from "../core/workspace/workspaceActivity.js";
22
- import { RUN_OUTPUT_TRUNCATION_NOTICE } from "../session/chatLifecycle.js";
21
+ import type { RunFileActivity } from "../../core/workspace/workspaceActivity.js";
22
+ import { RUN_OUTPUT_TRUNCATION_NOTICE } from "../../session/chatLifecycle.js";
23
23
  import { formatProgressBlockBodyLines } from "./progressEntries.js";
24
- import { getUsableShellWidth, transcriptContentIndent } from "./layout.js";
25
- import { MemoizedRenderMessage } from "./Markdown.js";
24
+ import { getUsableShellWidth, transcriptContentIndent } from "../layout.js";
25
+ import { MemoizedRenderMessage } from "../render/Markdown.js";
26
26
  import {
27
27
  sanitizeOutput,
28
28
  sanitizeStreamChunk,
29
29
  normalizeOutput,
30
30
  classifyOutput,
31
31
  formatForBox,
32
- } from "./outputPipeline.js";
33
- import { normalizeCommand, getFriendlyActionLabel } from "./commandNormalize.js";
34
- import * as renderDebug from "../core/perf/renderDebug.js";
35
- import { normalizePlanReviewMarkdown } from "../core/workspace/planStorage.js";
32
+ } from "../render/outputPipeline.js";
33
+ import { normalizeCommand, getFriendlyActionLabel } from "../input/commandNormalize.js";
34
+ import * as renderDebug from "../../core/perf/renderDebug.js";
35
+ import { normalizePlanReviewMarkdown } from "../../core/workspace/planStorage.js";
36
36
 
37
37
  export type TurnOpacity = "active" | "recent" | "dim";
38
38
 
@@ -1,6 +1,6 @@
1
- import type { RunProgressBlock, RunProgressEntry, RunProgressSource } from "../session/types.js";
2
- import { sanitizeTerminalOutput } from "../core/terminal/terminalSanitize.js";
3
- import { wrapPlainText } from "./textLayout.js";
1
+ import type { RunProgressBlock, RunProgressEntry, RunProgressSource } from "../../session/types.js";
2
+ import { sanitizeTerminalOutput } from "../../core/terminal/terminalSanitize.js";
3
+ import { wrapPlainText } from "../render/textLayout.js";
4
4
 
5
5
  // ─── Types ───────────────────────────────────────────────────────────────────
6
6
 
@@ -1,4 +1,4 @@
1
- import type { RunEvent } from "../session/types.js";
1
+ import type { RunEvent } from "../../session/types.js";
2
2
 
3
3
  const MAX_VISIBLE_ACTIVE_ACTIVITY = 6;
4
4
  const MAX_VISIBLE_SUMMARY_ACTIVITY = 4;
@@ -4,17 +4,17 @@ import type {
4
4
  RunProgressBlock,
5
5
  RunResponseSegment,
6
6
  RunToolActivity,
7
- } from "../session/types.js";
8
- import * as renderDebug from "../core/perf/renderDebug.js";
9
- import { getAssistantContent, getResponseSegmentText, getRunPlanText } from "../session/types.js";
10
- import { normalizeCommand, getFriendlyActionLabel } from "./commandNormalize.js";
11
- import { formatTerminalAnswerInline } from "./terminalAnswerFormat.js";
12
- import { RUN_OUTPUT_TRUNCATION_NOTICE } from "../session/chatLifecycle.js";
13
- import { sanitizeTerminalLines, sanitizeTerminalOutput } from "../core/terminal/terminalSanitize.js";
14
- import { clampVisualText, transcriptContentIndent } from "./layout.js";
15
- import type { Segment } from "./Markdown.js";
16
- import { classifyOutput, formatForBox, normalizeOutput, sanitizeOutput, sanitizeStreamChunk } from "./outputPipeline.js";
17
- import { maybeRenderDiff, type DiffRenderLineType } from "./diffRenderer.js";
7
+ } from "../../session/types.js";
8
+ import * as renderDebug from "../../core/perf/renderDebug.js";
9
+ import { getAssistantContent, getResponseSegmentText, getRunPlanText } from "../../session/types.js";
10
+ import { normalizeCommand, getFriendlyActionLabel } from "../input/commandNormalize.js";
11
+ import { formatTerminalAnswerInline } from "../render/terminalAnswerFormat.js";
12
+ import { RUN_OUTPUT_TRUNCATION_NOTICE } from "../../session/chatLifecycle.js";
13
+ import { sanitizeTerminalLines, sanitizeTerminalOutput } from "../../core/terminal/terminalSanitize.js";
14
+ import { clampVisualText, transcriptContentIndent } from "../layout.js";
15
+ import type { Segment } from "../render/Markdown.js";
16
+ import { classifyOutput, formatForBox, normalizeOutput, sanitizeOutput, sanitizeStreamChunk } from "../render/outputPipeline.js";
17
+ import { maybeRenderDiff, type DiffRenderLineType } from "../render/diffRenderer.js";
18
18
  import {
19
19
  formatProgressBlockBodyLines,
20
20
  getProgressUpdateCount,
@@ -22,10 +22,10 @@ import {
22
22
  type VisibleProgressBlock,
23
23
  } from "./progressEntries.js";
24
24
  import { selectVisibleRunActivity } from "./runActivityView.js";
25
- import { getTextUnits, getTextWidth, wrapPlainText, wrapCommandText, splitTextAtColumn } from "./textLayout.js";
25
+ import { getTextUnits, getTextWidth, wrapPlainText, wrapCommandText, splitTextAtColumn } from "../render/textLayout.js";
26
26
  import type { RenderTimelineItem } from "./Timeline.js";
27
- import { normalizePlanReviewMarkdown } from "../core/workspace/planStorage.js";
28
- import { LOGO_COMPACT, LOGO_COMPACT_MIN_COLS, LOGO_LARGE_MIN_COLS, selectLogoVariant } from "./logoVariants.js";
27
+ import { normalizePlanReviewMarkdown } from "../../core/workspace/planStorage.js";
28
+ import { LOGO_COMPACT, LOGO_COMPACT_MIN_COLS, LOGO_LARGE_MIN_COLS, selectLogoVariant } from "../render/logoVariants.js";
29
29
 
30
30
  // ─── Exported types ───────────────────────────────────────────────────────────
31
31
 
File without changes