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,69 @@
1
+ import { readFileSync } from "fs";
2
+ import { dirname, join } from "path";
3
+ import { fileURLToPath } from "url";
4
+ import { APP_VERSION as BUILD_INFO_VERSION } from "./buildInfo.js";
5
+
6
+ // Leaf module: must not import settings.ts or anything under src/core/version
7
+ // (settings.ts re-exports APP_VERSION from here, so that would be a cycle).
8
+
9
+ export const UBUME_PACKAGE_NAME = "ubume";
10
+ export const LEGACY_CODEXA_PACKAGE_NAME = "@golba98/codexa";
11
+ const SEMVER_RE = /^\d+\.\d+\.\d+(-[\w.]+)?$/;
12
+
13
+ function readPackageVersion(packageJsonPath: string, allowedNames?: readonly string[]): string | null {
14
+ try {
15
+ const parsed = JSON.parse(readFileSync(packageJsonPath, "utf8")) as {
16
+ name?: unknown;
17
+ version?: unknown;
18
+ };
19
+ if (allowedNames && typeof parsed.name === "string" && !allowedNames.includes(parsed.name)) {
20
+ return null;
21
+ }
22
+ if (typeof parsed.version !== "string") return null;
23
+ const version = parsed.version.trim();
24
+ return SEMVER_RE.test(version) ? version : null;
25
+ } catch {
26
+ return null;
27
+ }
28
+ }
29
+
30
+ /**
31
+ * Resolves the version of the running Ubume install:
32
+ * 1. `UBUME_PACKAGE_ROOT` / `CODEXA_PACKAGE_ROOT` (set by bin/ubume.js) → that package.json's version
33
+ * 2. Walk up from this module for a package.json named "ubume" (or legacy "@golba98/codexa")
34
+ * 3. The committed buildInfo.ts APP_VERSION as the last resort
35
+ *
36
+ * `startDir` overrides the walk-up starting directory (test seam).
37
+ */
38
+ export function resolveAppVersion(
39
+ env: NodeJS.ProcessEnv = process.env,
40
+ startDir?: string,
41
+ ): string {
42
+ const packageRoot = env.UBUME_PACKAGE_ROOT?.trim() || env.CODEXA_PACKAGE_ROOT?.trim();
43
+ if (packageRoot) {
44
+ const version = readPackageVersion(join(packageRoot, "package.json"));
45
+ if (version) return version;
46
+ }
47
+
48
+ let dir = startDir ?? dirname(fileURLToPath(import.meta.url));
49
+ const allowedNames = [UBUME_PACKAGE_NAME, LEGACY_CODEXA_PACKAGE_NAME] as const;
50
+ for (;;) {
51
+ const version = readPackageVersion(join(dir, "package.json"), allowedNames);
52
+ if (version) return version;
53
+ const parent = dirname(dir);
54
+ if (parent === dir) break;
55
+ dir = parent;
56
+ }
57
+
58
+ return BUILD_INFO_VERSION;
59
+ }
60
+
61
+ let cachedVersion: string | null = null;
62
+
63
+ /** Cached form of resolveAppVersion() — the installed version cannot change mid-process. */
64
+ export function getAppVersion(): string {
65
+ if (cachedVersion === null) {
66
+ cachedVersion = resolveAppVersion();
67
+ }
68
+ return cachedVersion;
69
+ }
@@ -0,0 +1,3 @@
1
+ // Generated by scripts/gen-build-info.mjs — do not edit manually.
2
+ export const BUILD_COMMIT = "cf100a7e97313dce7d66fab2424dc3ff55695db7" as const;
3
+ export const APP_VERSION = "0.1.0" as const;
@@ -0,0 +1,196 @@
1
+ const FLAG_HELP = "--help";
2
+ const FLAG_HELP_SHORT = "-h";
3
+ const FLAG_VERSION = "--version";
4
+ const FLAG_VERSION_SHORT = "-v";
5
+ const FLAG_PROFILE = "--profile";
6
+ const FLAG_CONFIG = "--config";
7
+ const FLAG_CONFIG_SHORT = "-c";
8
+ const FLAG_MODEL = "--model";
9
+ const FLAG_MODEL_SHORT = "-m";
10
+ const FLAG_NO_CLEAR = "--no-clear";
11
+
12
+ export interface LaunchArgs {
13
+ help: boolean;
14
+ version: boolean;
15
+ initialPrompt: string | null;
16
+ profile: string | null;
17
+ configOverrides: string[];
18
+ passthroughArgs: string[];
19
+ /** Explicitly set when --model / -m was passed on the command line. Null when no model flag was given. */
20
+ modelOverride: string | null;
21
+ /** True when --no-clear was passed. Suppresses the startup terminal clear. */
22
+ noClear: boolean;
23
+ }
24
+
25
+ export type LaunchArgsParseResult =
26
+ | { ok: true; value: LaunchArgs }
27
+ | { ok: false; error: string };
28
+
29
+ function normalizeProfileValue(value: string | undefined): string | null {
30
+ const trimmed = value?.trim();
31
+ return trimmed ? trimmed : null;
32
+ }
33
+
34
+ function parseConfigFlagValue(raw: string | undefined): string | null {
35
+ const trimmed = raw?.trim();
36
+ if (!trimmed) {
37
+ return null;
38
+ }
39
+
40
+ // Require non-empty key and non-empty value on both sides of "="
41
+ const separatorIndex = trimmed.indexOf("=");
42
+ if (separatorIndex <= 0 || separatorIndex === trimmed.length - 1) {
43
+ return null;
44
+ }
45
+
46
+ return trimmed;
47
+ }
48
+
49
+ function quoteTomlString(value: string): string {
50
+ return JSON.stringify(value);
51
+ }
52
+
53
+ export function parseLaunchArgs(argv: readonly string[]): LaunchArgsParseResult {
54
+ const passthroughArgs: string[] = [];
55
+ const configOverrides: string[] = [];
56
+ const promptArgs: string[] = [];
57
+ let help = false;
58
+ let version = false;
59
+ let noClear = false;
60
+ let profile: string | null = null;
61
+ let modelOverride: string | null = null;
62
+
63
+ for (let index = 0; index < argv.length; index += 1) {
64
+ const arg = argv[index];
65
+ if (!arg) {
66
+ continue;
67
+ }
68
+
69
+ if (arg === "--") {
70
+ promptArgs.push(...argv.slice(index + 1));
71
+ break;
72
+ }
73
+
74
+ if (arg === FLAG_HELP || arg === FLAG_HELP_SHORT) {
75
+ help = true;
76
+ continue;
77
+ }
78
+
79
+ if (arg === FLAG_VERSION || arg === FLAG_VERSION_SHORT) {
80
+ version = true;
81
+ continue;
82
+ }
83
+
84
+ if (arg === FLAG_NO_CLEAR) {
85
+ noClear = true;
86
+ continue;
87
+ }
88
+
89
+ // --profile <value> and --profile=<value> both supported.
90
+ if (arg === FLAG_PROFILE) {
91
+ const value = normalizeProfileValue(argv[index + 1]);
92
+ if (!value) {
93
+ return { ok: false, error: `Missing value for ${FLAG_PROFILE}.` };
94
+ }
95
+ profile = value;
96
+ passthroughArgs.push(arg, value);
97
+ index += 1;
98
+ continue;
99
+ }
100
+
101
+ if (arg.startsWith(`${FLAG_PROFILE}=`)) {
102
+ const value = normalizeProfileValue(arg.slice(`${FLAG_PROFILE}=`.length));
103
+ if (!value) {
104
+ return { ok: false, error: `Missing value for ${FLAG_PROFILE}.` };
105
+ }
106
+ profile = value;
107
+ passthroughArgs.push(`${FLAG_PROFILE}=${value}`);
108
+ continue;
109
+ }
110
+
111
+ // --config / -c accept key=value pairs; both space-separated and inline = forms supported.
112
+ if (arg === FLAG_CONFIG_SHORT || arg === FLAG_CONFIG) {
113
+ const value = parseConfigFlagValue(argv[index + 1]);
114
+ if (!value) {
115
+ return { ok: false, error: `Missing key=value payload for ${arg}.` };
116
+ }
117
+ configOverrides.push(value);
118
+ passthroughArgs.push(arg, value);
119
+ index += 1;
120
+ continue;
121
+ }
122
+
123
+ if (arg.startsWith(`${FLAG_CONFIG}=`)) {
124
+ const value = parseConfigFlagValue(arg.slice(`${FLAG_CONFIG}=`.length));
125
+ if (!value) {
126
+ return { ok: false, error: `Missing key=value payload for ${FLAG_CONFIG}.` };
127
+ }
128
+ configOverrides.push(value);
129
+ passthroughArgs.push(`${FLAG_CONFIG}=${value}`);
130
+ continue;
131
+ }
132
+
133
+ if (arg.startsWith(`${FLAG_CONFIG_SHORT}=`)) {
134
+ const value = parseConfigFlagValue(arg.slice(`${FLAG_CONFIG_SHORT}=`.length));
135
+ if (!value) {
136
+ return { ok: false, error: `Missing key=value payload for ${FLAG_CONFIG_SHORT}.` };
137
+ }
138
+ configOverrides.push(value);
139
+ passthroughArgs.push(`${FLAG_CONFIG_SHORT}=${value}`);
140
+ continue;
141
+ }
142
+
143
+ // --model / -m set the model via a config override, quoted for TOML.
144
+ // Also captured in modelOverride so callers can distinguish "was --model given?"
145
+ // from "what does layered config resolve to?" (which always has a default value).
146
+ if (arg === FLAG_MODEL || arg === FLAG_MODEL_SHORT) {
147
+ const value = normalizeProfileValue(argv[index + 1]);
148
+ if (!value) {
149
+ return { ok: false, error: `Missing value for ${arg}.` };
150
+ }
151
+ configOverrides.push(`model=${quoteTomlString(value)}`);
152
+ passthroughArgs.push(arg, value);
153
+ modelOverride = value;
154
+ index += 1;
155
+ continue;
156
+ }
157
+
158
+ if (arg.startsWith(`${FLAG_MODEL}=`)) {
159
+ const value = normalizeProfileValue(arg.slice(`${FLAG_MODEL}=`.length));
160
+ if (!value) {
161
+ return { ok: false, error: `Missing value for ${FLAG_MODEL}.` };
162
+ }
163
+ configOverrides.push(`model=${quoteTomlString(value)}`);
164
+ passthroughArgs.push(`${FLAG_MODEL}=${value}`);
165
+ modelOverride = value;
166
+ continue;
167
+ }
168
+
169
+ if (!arg.startsWith("-")) {
170
+ promptArgs.push(arg, ...argv.slice(index + 1));
171
+ break;
172
+ }
173
+
174
+ passthroughArgs.push(arg);
175
+ }
176
+
177
+ const initialPrompt = promptArgs
178
+ .map((part) => part.trim())
179
+ .filter(Boolean)
180
+ .join(" ")
181
+ .trim() || null;
182
+
183
+ return {
184
+ ok: true,
185
+ value: {
186
+ help,
187
+ version,
188
+ initialPrompt,
189
+ profile,
190
+ configOverrides,
191
+ passthroughArgs,
192
+ modelOverride,
193
+ noClear,
194
+ },
195
+ };
196
+ }