ubume 0.1.0

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 (182) hide show
  1. package/README.md +88 -0
  2. package/bin/codexa-local-harness-bridge.js +3 -0
  3. package/bin/codexa.js +28 -0
  4. package/bin/ubume-local-harness-bridge.js +325 -0
  5. package/bin/ubume.js +398 -0
  6. package/package.json +66 -0
  7. package/src/app.tsx +5759 -0
  8. package/src/commands/handler.ts +889 -0
  9. package/src/config/appVersion.ts +69 -0
  10. package/src/config/buildInfo.ts +3 -0
  11. package/src/config/launchArgs.ts +196 -0
  12. package/src/config/layeredConfig.ts +853 -0
  13. package/src/config/legacyEnv.ts +16 -0
  14. package/src/config/persistence.ts +377 -0
  15. package/src/config/runtimeConfig.ts +558 -0
  16. package/src/config/settings.ts +405 -0
  17. package/src/config/toml-serialize.ts +109 -0
  18. package/src/config/trustStore.ts +84 -0
  19. package/src/config/updateCheckCache.ts +85 -0
  20. package/src/core/README.md +55 -0
  21. package/src/core/agent/loop.ts +464 -0
  22. package/src/core/agent/protocol.ts +345 -0
  23. package/src/core/agent/tools.ts +423 -0
  24. package/src/core/auth/codexAuth.ts +359 -0
  25. package/src/core/codex/codexExecArgs.ts +166 -0
  26. package/src/core/codex/codexLaunch.ts +163 -0
  27. package/src/core/codex/codexPrompt.ts +429 -0
  28. package/src/core/debug/inputDebug.ts +51 -0
  29. package/src/core/debug/localStreamDebug.ts +50 -0
  30. package/src/core/debug/modelStateDebug.ts +35 -0
  31. package/src/core/executables/antigravityExecutable.ts +48 -0
  32. package/src/core/executables/claudeExecutable.ts +63 -0
  33. package/src/core/executables/codexExecutable.ts +160 -0
  34. package/src/core/executables/executableResolver.ts +164 -0
  35. package/src/core/executables/geminiExecutable.ts +78 -0
  36. package/src/core/models/codexCapabilities.ts +97 -0
  37. package/src/core/models/codexModelCapabilities.ts +624 -0
  38. package/src/core/models/codexModelsCacheSeed.ts +153 -0
  39. package/src/core/models/modelSpecs.ts +303 -0
  40. package/src/core/models/providerModelCache.ts +94 -0
  41. package/src/core/perf/profiler.ts +125 -0
  42. package/src/core/perf/renderDebug.ts +398 -0
  43. package/src/core/process/CommandRunner.ts +280 -0
  44. package/src/core/process/processValidation.ts +111 -0
  45. package/src/core/providerLauncher/launcher.ts +220 -0
  46. package/src/core/providerLauncher/registry.ts +354 -0
  47. package/src/core/providerLauncher/types.ts +95 -0
  48. package/src/core/providerLauncher/workspaceConfig.ts +487 -0
  49. package/src/core/providerRuntime/anthropic.ts +580 -0
  50. package/src/core/providerRuntime/antigravity.ts +500 -0
  51. package/src/core/providerRuntime/capabilityProfile.ts +383 -0
  52. package/src/core/providerRuntime/claudeCodeDiscovery.ts +724 -0
  53. package/src/core/providerRuntime/claudeCodeDiscoveryDebug.ts +55 -0
  54. package/src/core/providerRuntime/codexaCupy.ts +97 -0
  55. package/src/core/providerRuntime/codexaNative.ts +425 -0
  56. package/src/core/providerRuntime/contextMetadata.ts +397 -0
  57. package/src/core/providerRuntime/gemini.ts +789 -0
  58. package/src/core/providerRuntime/lmstudio.ts +118 -0
  59. package/src/core/providerRuntime/local.ts +770 -0
  60. package/src/core/providerRuntime/localHarness/runtime.ts +1090 -0
  61. package/src/core/providerRuntime/localOutputBudget.ts +17 -0
  62. package/src/core/providerRuntime/mistralVibe.ts +667 -0
  63. package/src/core/providerRuntime/models.ts +175 -0
  64. package/src/core/providerRuntime/reasoning.ts +20 -0
  65. package/src/core/providerRuntime/registry.ts +286 -0
  66. package/src/core/providerRuntime/types.ts +142 -0
  67. package/src/core/providerRuntime/unsloth.ts +216 -0
  68. package/src/core/providers/codexJsonStream.ts +305 -0
  69. package/src/core/providers/codexSubprocess.ts +378 -0
  70. package/src/core/providers/codexTranscript.ts +695 -0
  71. package/src/core/providers/openaiNative.ts +13 -0
  72. package/src/core/providers/registry.ts +21 -0
  73. package/src/core/providers/types.ts +91 -0
  74. package/src/core/shared/attachments.ts +101 -0
  75. package/src/core/shared/cleanupFastFail.ts +67 -0
  76. package/src/core/shared/clipboard.ts +24 -0
  77. package/src/core/shared/clipboardImage.ts +111 -0
  78. package/src/core/shared/githubDiagnostics.ts +222 -0
  79. package/src/core/shared/hollowResponseFormat.ts +39 -0
  80. package/src/core/terminal/clearFrameBoundary.ts +852 -0
  81. package/src/core/terminal/frameLock.ts +110 -0
  82. package/src/core/terminal/inkRenderReset.ts +123 -0
  83. package/src/core/terminal/startupClear.ts +20 -0
  84. package/src/core/terminal/terminalCapabilities.ts +100 -0
  85. package/src/core/terminal/terminalControl.ts +169 -0
  86. package/src/core/terminal/terminalSanitize.ts +147 -0
  87. package/src/core/terminal/terminalTitle.ts +400 -0
  88. package/src/core/version/channel.ts +27 -0
  89. package/src/core/version/packageManager.ts +119 -0
  90. package/src/core/version/updateCheck.ts +203 -0
  91. package/src/core/workspace/appData.ts +107 -0
  92. package/src/core/workspace/conversationStore.ts +335 -0
  93. package/src/core/workspace/launchContext.ts +259 -0
  94. package/src/core/workspace/planStorage.ts +135 -0
  95. package/src/core/workspace/projectInstructions.ts +54 -0
  96. package/src/core/workspace/scratchDir.ts +64 -0
  97. package/src/core/workspace/workspaceActivity.ts +384 -0
  98. package/src/core/workspace/workspaceGuard.ts +377 -0
  99. package/src/core/workspace/workspaceRoot.ts +47 -0
  100. package/src/exec.ts +73 -0
  101. package/src/headless/execArgs.ts +296 -0
  102. package/src/headless/execRunner.ts +304 -0
  103. package/src/index.tsx +270 -0
  104. package/src/legacyEnvBootstrap.ts +5 -0
  105. package/src/session/appSession.ts +771 -0
  106. package/src/session/chatLifecycle.ts +994 -0
  107. package/src/session/conversation.ts +107 -0
  108. package/src/session/liveRenderScheduler.ts +214 -0
  109. package/src/session/persistedResponse.ts +93 -0
  110. package/src/session/planFlow.ts +159 -0
  111. package/src/session/planTranscript.ts +19 -0
  112. package/src/session/promptRunSchedule.ts +26 -0
  113. package/src/session/types.ts +234 -0
  114. package/src/test/runtimeTestUtils.ts +14 -0
  115. package/src/types/react-dom.d.ts +3 -0
  116. package/src/ui/chrome/ActivityBars.tsx +68 -0
  117. package/src/ui/chrome/ActivityIndicator.tsx +58 -0
  118. package/src/ui/chrome/AnimatedStatusText.tsx +69 -0
  119. package/src/ui/chrome/AppShell.tsx +474 -0
  120. package/src/ui/chrome/BottomComposer.tsx +1135 -0
  121. package/src/ui/chrome/DashCard.tsx +82 -0
  122. package/src/ui/chrome/RunFooter.tsx +65 -0
  123. package/src/ui/chrome/RuntimeStatusBar.tsx +108 -0
  124. package/src/ui/chrome/Spinner.tsx +25 -0
  125. package/src/ui/chrome/TopHeader.tsx +439 -0
  126. package/src/ui/chrome/UpdateAvailableCard.tsx +42 -0
  127. package/src/ui/chrome/busyStatusAnimation.ts +11 -0
  128. package/src/ui/input/commandNormalize.ts +66 -0
  129. package/src/ui/input/focus.ts +73 -0
  130. package/src/ui/input/imageAttachments.ts +18 -0
  131. package/src/ui/input/inputBuffer.ts +203 -0
  132. package/src/ui/input/pastedContent.ts +75 -0
  133. package/src/ui/input/rawArrowKeys.ts +28 -0
  134. package/src/ui/input/slashCommands.ts +43 -0
  135. package/src/ui/input/useStdinRawModeLease.ts +23 -0
  136. package/src/ui/layout.ts +560 -0
  137. package/src/ui/panels/AttachmentImportPanel.tsx +131 -0
  138. package/src/ui/panels/AuthPanel.tsx +149 -0
  139. package/src/ui/panels/BackendPicker.tsx +28 -0
  140. package/src/ui/panels/ModePicker.tsx +31 -0
  141. package/src/ui/panels/ModelPicker.tsx +31 -0
  142. package/src/ui/panels/ModelPickerScreen.tsx +761 -0
  143. package/src/ui/panels/ModelReasoningPicker.tsx +458 -0
  144. package/src/ui/panels/Panel.tsx +51 -0
  145. package/src/ui/panels/PermissionsPanel.tsx +78 -0
  146. package/src/ui/panels/PlanActionPicker.tsx +187 -0
  147. package/src/ui/panels/ProviderPicker.tsx +753 -0
  148. package/src/ui/panels/ProviderSetupPrompt.tsx +52 -0
  149. package/src/ui/panels/ReasoningPicker.tsx +46 -0
  150. package/src/ui/panels/ResumePicker.tsx +90 -0
  151. package/src/ui/panels/SelectionPanel.tsx +138 -0
  152. package/src/ui/panels/SettingsPanel.tsx +156 -0
  153. package/src/ui/panels/TextEntryPanel.tsx +139 -0
  154. package/src/ui/panels/ThemePicker.tsx +32 -0
  155. package/src/ui/panels/ToolApprovalPanel.tsx +46 -0
  156. package/src/ui/panels/UpdatePromptPanel.tsx +236 -0
  157. package/src/ui/panels/responsivePickerViewport.ts +64 -0
  158. package/src/ui/render/Markdown.tsx +331 -0
  159. package/src/ui/render/diffRenderer.ts +116 -0
  160. package/src/ui/render/logoVariants.ts +113 -0
  161. package/src/ui/render/modeDisplay.ts +52 -0
  162. package/src/ui/render/outputPipeline.ts +64 -0
  163. package/src/ui/render/runtimeDisplay.ts +128 -0
  164. package/src/ui/render/terminalAnswerFormat.ts +128 -0
  165. package/src/ui/render/textLayout.ts +392 -0
  166. package/src/ui/theme.tsx +274 -0
  167. package/src/ui/themeFlow.ts +41 -0
  168. package/src/ui/timeline/ActionRequiredBlock.tsx +38 -0
  169. package/src/ui/timeline/AgentBlock.tsx +130 -0
  170. package/src/ui/timeline/StaticIntroItem.tsx +54 -0
  171. package/src/ui/timeline/ThinkingBlock.tsx +100 -0
  172. package/src/ui/timeline/Timeline.tsx +1410 -0
  173. package/src/ui/timeline/TranscriptShell.tsx +302 -0
  174. package/src/ui/timeline/TurnGroup.tsx +673 -0
  175. package/src/ui/timeline/layoutListWindow.ts +145 -0
  176. package/src/ui/timeline/liveViewportWindow.ts +68 -0
  177. package/src/ui/timeline/progressEntries.ts +156 -0
  178. package/src/ui/timeline/runActivityView.ts +37 -0
  179. package/src/ui/timeline/staticTranscriptCache.ts +174 -0
  180. package/src/ui/timeline/streamCoalesce.ts +53 -0
  181. package/src/ui/timeline/timelineMeasure.ts +3273 -0
  182. package/src/ui/useThrottledValue.ts +31 -0
@@ -0,0 +1,149 @@
1
+ import React from "react";
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 { clampVisualText, usePanelLayout } from "../layout.js";
8
+ import { useTheme } from "../theme.js";
9
+
10
+ interface AuthPanelProps {
11
+ focusId: string;
12
+ provider: BackendProvider;
13
+ authPreference: string;
14
+ authStatus: CodexAuthProbeResult;
15
+ authStatusBusy: boolean;
16
+ onSetPreference: (value: string) => void;
17
+ onRefreshAuthStatus: () => void;
18
+ onClose: () => void;
19
+ }
20
+
21
+ export function AuthPanel({
22
+ focusId,
23
+ provider,
24
+ authPreference,
25
+ authStatus,
26
+ authStatusBusy,
27
+ onSetPreference,
28
+ onRefreshAuthStatus,
29
+ onClose,
30
+ }: AuthPanelProps) {
31
+ const theme = useTheme();
32
+ const panelLayout = usePanelLayout();
33
+ const compact = panelLayout?.mode === "compact" || (panelLayout?.availableRows ?? 24) < 16;
34
+ const contentWidth = Math.max(1, (panelLayout?.availableCols ?? 80) - 4);
35
+ const { isFocused } = useFocus({ id: focusId, autoFocus: true });
36
+
37
+ useInput((input, key) => {
38
+ if (key.escape || input.toLowerCase() === "q") {
39
+ onClose();
40
+ return;
41
+ }
42
+
43
+ const numeric = Number.parseInt(input, 10);
44
+ if (!Number.isNaN(numeric) && numeric >= 1 && numeric <= AUTH_PREFERENCES.length) {
45
+ onSetPreference(AUTH_PREFERENCES[numeric - 1]!.id);
46
+ }
47
+
48
+ if (input.toLowerCase() === "r") {
49
+ onRefreshAuthStatus();
50
+ }
51
+ }, { isActive: isFocused });
52
+
53
+ const authStateLabel = getAuthStateLabel(authStatus.state);
54
+ const authStateColor =
55
+ authStatus.state === "authenticated"
56
+ ? theme.success
57
+ : authStatus.state === "unauthenticated"
58
+ ? theme.error
59
+ : theme.warning;
60
+ const checkedAtLabel = authStatus.checkedAt > 0
61
+ ? new Date(authStatus.checkedAt).toLocaleTimeString()
62
+ : "not checked yet";
63
+
64
+ if (compact) {
65
+ return (
66
+ <Box
67
+ borderStyle="round"
68
+ borderColor={theme.borderFocused}
69
+ flexDirection="column"
70
+ paddingX={1}
71
+ width="100%"
72
+ >
73
+ <Text color={theme.accent} bold>Auth and subscription guidance</Text>
74
+ <Text color={theme.textMuted} wrap="truncate">
75
+ {clampVisualText(`${provider.label} · ${provider.authLabel} · ${authStateLabel}`, contentWidth)}
76
+ </Text>
77
+ <Text color={theme.textDim} wrap="truncate">
78
+ {clampVisualText(`Probe: ${authStatus.rawSummary || "No probe output yet"}`, contentWidth)}
79
+ </Text>
80
+ {AUTH_PREFERENCES.map((item, index) => (
81
+ <Text key={item.id} color={item.id === authPreference ? theme.success : theme.text}>
82
+ {index + 1}. {item.label} {item.id === authPreference ? "✓" : ""}
83
+ </Text>
84
+ ))}
85
+ <Text color={theme.textDim}>1-{AUTH_PREFERENCES.length} change · R refresh · Esc close</Text>
86
+ {authStatusBusy && <Text color={theme.warning}>Checking auth status...</Text>}
87
+ {authStatus.recommendedAction && (
88
+ <Text color={theme.textDim} wrap="truncate">
89
+ {clampVisualText(`Next: ${authStatus.recommendedAction}`, contentWidth)}
90
+ </Text>
91
+ )}
92
+ </Box>
93
+ );
94
+ }
95
+
96
+ return (
97
+ <Box
98
+ borderStyle="round"
99
+ borderColor={theme.borderFocused}
100
+ flexDirection="column"
101
+ paddingX={2}
102
+ paddingY={1}
103
+ marginTop={1}
104
+ width="100%"
105
+ >
106
+ <Text color={theme.accent} bold>
107
+ Auth and subscription guidance
108
+ </Text>
109
+ <Text color={theme.textMuted}>Current backend: {provider.label}</Text>
110
+ <Text color={theme.textMuted}>Current preference: {formatAuthPreferenceLabel(authPreference)}</Text>
111
+ <Text color={theme.info}>Backend auth: {provider.authLabel}</Text>
112
+ <Text color={authStateColor}>Runtime auth state: {authStateLabel}</Text>
113
+ <Text color={theme.textDim}>Last checked: {checkedAtLabel}</Text>
114
+ <Text color={theme.textDim}>Probe summary: {authStatus.rawSummary || "No probe output yet"}</Text>
115
+ <Text color={theme.text}>
116
+ This UI securely bridges to the Ubume neural network. It does not collect or store your ChatGPT credentials.
117
+ </Text>
118
+ <Text color={theme.text}>{provider.statusMessage}</Text>
119
+ <Box flexDirection="column" marginTop={1}>
120
+ <Text color={theme.info}>Commands:</Text>
121
+ <Text color={theme.text}> /login guided ChatGPT sign-in steps</Text>
122
+ <Text color={theme.text}> /logout guided sign-out steps</Text>
123
+ <Text color={theme.text}> /auth status refresh Ubume authentication</Text>
124
+ </Box>
125
+ <Box flexDirection="column" marginTop={1}>
126
+ {AUTH_PREFERENCES.map((item, index) => (
127
+ <Text key={item.id} color={item.id === authPreference ? theme.success : theme.text}>
128
+ {index + 1}. {item.label} {item.id === authPreference ? "✓" : ""}
129
+ </Text>
130
+ ))}
131
+ </Box>
132
+ <Box marginTop={1}>
133
+ <Text color={theme.textDim}>
134
+ Press 1-{AUTH_PREFERENCES.length} to change preference, R to refresh status, Esc to close.
135
+ </Text>
136
+ </Box>
137
+ {authStatusBusy && (
138
+ <Box marginTop={1}>
139
+ <Text color={theme.warning}>Checking auth status...</Text>
140
+ </Box>
141
+ )}
142
+ {authStatus.recommendedAction && (
143
+ <Box marginTop={1}>
144
+ <Text color={theme.textDim}>Next step: {authStatus.recommendedAction}</Text>
145
+ </Box>
146
+ )}
147
+ </Box>
148
+ );
149
+ }
@@ -0,0 +1,28 @@
1
+ import React from "react";
2
+ import { AVAILABLE_BACKENDS } from "../../config/settings.js";
3
+ import { FOCUS_IDS } from "../input/focus.js";
4
+ import { SelectionPanel } from "./SelectionPanel.js";
5
+
6
+ interface BackendPickerProps {
7
+ currentBackend: string;
8
+ onSelect: (backend: string) => void;
9
+ onCancel: () => void;
10
+ }
11
+
12
+ export function BackendPicker({ currentBackend, onSelect, onCancel }: BackendPickerProps) {
13
+ const items = AVAILABLE_BACKENDS.map((backend) => ({
14
+ label: backend.id === currentBackend ? `${backend.label} ✓` : `${backend.label} ${backend.id}`,
15
+ value: backend.id,
16
+ }));
17
+
18
+ return (
19
+ <SelectionPanel
20
+ focusId={FOCUS_IDS.backendPicker}
21
+ title="Select backend"
22
+ subtitle="Ubume is connected and ready. Native OpenAI is reserved for a later implementation pass."
23
+ items={items}
24
+ onSelect={onSelect}
25
+ onCancel={onCancel}
26
+ />
27
+ );
28
+ }
@@ -0,0 +1,31 @@
1
+ import { AVAILABLE_MODES } from "../../config/settings.js";
2
+ import { FOCUS_IDS } from "../input/focus.js";
3
+ import { SelectionPanel } from "./SelectionPanel.js";
4
+
5
+ interface ModePickerProps {
6
+ currentMode: string;
7
+ planMode?: boolean;
8
+ onSelect: (mode: string) => void;
9
+ onCancel: () => void;
10
+ }
11
+
12
+ export function ModePicker({ currentMode, planMode = false, onSelect, onCancel }: ModePickerProps) {
13
+ const items = [
14
+ { label: planMode ? "Plan ✓" : "Plan", value: "plan" },
15
+ ...AVAILABLE_MODES.map((mode) => ({
16
+ label: mode.key === currentMode ? `${mode.label} ✓` : mode.label,
17
+ value: mode.key,
18
+ })),
19
+ ];
20
+
21
+ return (
22
+ <SelectionPanel
23
+ focusId={FOCUS_IDS.modePicker}
24
+ title="Select mode"
25
+ subtitle="Plan inspects without changing files; execution modes control implementation access."
26
+ items={items}
27
+ onSelect={onSelect}
28
+ onCancel={onCancel}
29
+ />
30
+ );
31
+ }
@@ -0,0 +1,31 @@
1
+ import { type CodexModelCapability } from "../../core/models/codexModelCapabilities.js";
2
+ import { FOCUS_IDS } from "../input/focus.js";
3
+ import { SelectionPanel } from "./SelectionPanel.js";
4
+
5
+ interface ModelPickerProps {
6
+ models: readonly CodexModelCapability[];
7
+ currentModel: string;
8
+ onSelect: (model: string) => void;
9
+ onCancel: () => void;
10
+ }
11
+
12
+ export function ModelPicker({ models, currentModel, onSelect, onCancel }: ModelPickerProps) {
13
+ const items = models.map((model) => {
14
+ const label = model.label === model.model ? model.model : `${model.label} (${model.model})`;
15
+ return {
16
+ label: model.model === currentModel || model.id === currentModel ? `${label} ✓` : label,
17
+ value: model.model,
18
+ };
19
+ });
20
+
21
+ return (
22
+ <SelectionPanel
23
+ focusId={FOCUS_IDS.modelPicker}
24
+ title="Select model"
25
+ subtitle="Use arrow keys and Enter. Esc closes the panel."
26
+ items={items}
27
+ onSelect={onSelect}
28
+ onCancel={onCancel}
29
+ />
30
+ );
31
+ }