@xelauvas/xela-cli 0.1.5 → 0.2.1
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/package.json +1 -1
- package/src/bridge/trustedDevice.ts +1 -1
- package/src/cli/update.ts +2 -2
- package/src/commands/thinkback/thinkback.tsx +4 -4
- package/src/components/AutoModeOptInDialog.tsx +1 -1
- package/src/components/DesktopHandoff.tsx +7 -7
- package/src/components/DesktopUpsell/DesktopUpsellStartup.tsx +3 -3
- package/src/components/Feedback.tsx +2 -2
- package/src/components/HelpV2/General.tsx +1 -1
- package/src/components/HelpV2/HelpV2.tsx +1 -1
- package/src/components/IdeOnboardingDialog.tsx +3 -3
- package/src/components/LogoV2/Clawd.tsx +27 -26
- package/src/components/LogoV2/CondensedLogo.tsx +1 -1
- package/src/components/LogoV2/GuestPassesUpsell.tsx +1 -1
- package/src/components/LogoV2/LogoV2.tsx +2 -2
- package/src/components/LogoV2/WelcomeV2.tsx +3 -3
- package/src/components/LogoV2/feedConfigs.tsx +3 -3
- package/src/components/Onboarding.tsx +3 -3
- package/src/components/PromptInput/PromptInput.tsx +1 -1
- package/src/components/ResumeTask.tsx +2 -2
- package/src/components/TeleportError.tsx +1 -1
- package/src/components/mcp/ElicitationDialog.tsx +2 -2
- package/src/components/mcp/MCPRemoteServerMenu.tsx +4 -4
- package/src/components/mcp/MCPSettings.tsx +1 -1
- package/src/constants/github-app.ts +10 -10
- package/src/constants/product.ts +1 -1
- package/src/constants/prompts.ts +5 -5
- package/src/constants/system.ts +2 -2
- package/src/main.tsx +1 -1
- package/src/screens/REPL.tsx +3 -3
- package/src/services/mcp/auth.ts +1 -1
- package/src/services/mcp/client.ts +6 -6
- package/src/services/notifier.ts +1 -1
- package/src/services/tips/tipRegistry.ts +5 -5
- package/src/tools/WebFetchTool/utils.ts +1 -1
- package/src/utils/git.ts +1 -1
- package/src/utils/theme.ts +28 -28
package/package.json
CHANGED
|
@@ -147,7 +147,7 @@ export async function enrollTrustedDevice(): Promise<void> {
|
|
|
147
147
|
device_id?: string
|
|
148
148
|
}>(
|
|
149
149
|
`${baseUrl}/api/auth/trusted_devices`,
|
|
150
|
-
{ display_name: `
|
|
150
|
+
{ display_name: `Xela on ${hostname()} · ${process.platform}` },
|
|
151
151
|
{
|
|
152
152
|
headers: {
|
|
153
153
|
Authorization: `Bearer ${accessToken}`,
|
package/src/cli/update.ts
CHANGED
|
@@ -238,7 +238,7 @@ export async function update() {
|
|
|
238
238
|
|
|
239
239
|
if (result.latestVersion === MACRO.VERSION) {
|
|
240
240
|
writeToStdout(
|
|
241
|
-
chalk.green(`
|
|
241
|
+
chalk.green(`Xela is up to date (${MACRO.VERSION})`) + '\n',
|
|
242
242
|
)
|
|
243
243
|
} else {
|
|
244
244
|
writeToStdout(
|
|
@@ -308,7 +308,7 @@ export async function update() {
|
|
|
308
308
|
// Check if versions match exactly, including any build metadata (like SHA)
|
|
309
309
|
if (latestVersion === MACRO.VERSION) {
|
|
310
310
|
writeToStdout(
|
|
311
|
-
chalk.green(`
|
|
311
|
+
chalk.green(`Xela is up to date (${MACRO.VERSION})`) + '\n',
|
|
312
312
|
)
|
|
313
313
|
await gracefulShutdown(0)
|
|
314
314
|
}
|
|
@@ -372,7 +372,7 @@ function ThinkbackMenu(t0) {
|
|
|
372
372
|
}
|
|
373
373
|
let t7;
|
|
374
374
|
if ($[16] !== handleCancel || $[17] !== t6) {
|
|
375
|
-
t7 = <Dialog title="Think Back on 2025 with
|
|
375
|
+
t7 = <Dialog title="Think Back on 2025 with Xela" subtitle="Generate your 2025 Xela Think Back (takes a few minutes to run)" onCancel={handleCancel} color="claude">{t6}</Dialog>;
|
|
376
376
|
$[16] = handleCancel;
|
|
377
377
|
$[17] = t6;
|
|
378
378
|
$[18] = t7;
|
|
@@ -381,9 +381,9 @@ function ThinkbackMenu(t0) {
|
|
|
381
381
|
}
|
|
382
382
|
return t7;
|
|
383
383
|
}
|
|
384
|
-
const EDIT_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=edit to modify my existing
|
|
385
|
-
const FIX_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=fix to fix validation or rendering errors in my existing
|
|
386
|
-
const REGENERATE_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=regenerate to create a completely new
|
|
384
|
+
const EDIT_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=edit to modify my existing Xela year in review animation. Ask me what I want to change. When the animation is ready, tell the user to run /think-back again to play it.';
|
|
385
|
+
const FIX_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=fix to fix validation or rendering errors in my existing Xela year in review animation. Run the validator, identify errors, and fix them. When the animation is ready, tell the user to run /think-back again to play it.';
|
|
386
|
+
const REGENERATE_PROMPT = 'Use the Skill tool to invoke the "thinkback" skill with mode=regenerate to create a completely new Xela year in review animation from scratch. Delete the existing animation and start fresh. When the animation is ready, tell the user to run /think-back again to play it.';
|
|
387
387
|
function ThinkbackFlow(t0) {
|
|
388
388
|
const $ = _c(27);
|
|
389
389
|
const {
|
|
@@ -7,7 +7,7 @@ import { Select } from './CustomSelect/index.js';
|
|
|
7
7
|
import { Dialog } from './design-system/Dialog.js';
|
|
8
8
|
|
|
9
9
|
// NOTE: This copy is legally reviewed — do not modify without Legal team approval.
|
|
10
|
-
export const AUTO_MODE_DESCRIPTION = "Auto mode lets
|
|
10
|
+
export const AUTO_MODE_DESCRIPTION = "Auto mode lets Xela handle permission prompts automatically — Xela checks each tool call for risky actions and prompt injection before executing. Actions Xela identifies as safe are executed, while actions Xela identifies as risky are blocked and Xela may try a different approach. Ideal for long-running tasks. Sessions are slightly more expensive. Xela can make mistakes that allow harmful commands to run, it's recommended to only use in isolated environments. Shift+Tab to change mode.";
|
|
11
11
|
type Props = {
|
|
12
12
|
onAccept(): void;
|
|
13
13
|
onDecline(): void;
|
|
@@ -72,12 +72,12 @@ export function DesktopHandoff(t0) {
|
|
|
72
72
|
setState("checking");
|
|
73
73
|
const installStatus = await getDesktopInstallStatus();
|
|
74
74
|
if (installStatus.status === "not-installed") {
|
|
75
|
-
setDownloadMessage("
|
|
75
|
+
setDownloadMessage("Xela Desktop is not installed.");
|
|
76
76
|
setState("prompt-download");
|
|
77
77
|
return;
|
|
78
78
|
}
|
|
79
79
|
if (installStatus.status === "version-too-old") {
|
|
80
|
-
setDownloadMessage(`
|
|
80
|
+
setDownloadMessage(`Xela Desktop needs to be updated (found v${installStatus.version}, need v1.1.2396+).`);
|
|
81
81
|
setState("prompt-download");
|
|
82
82
|
return;
|
|
83
83
|
}
|
|
@@ -86,7 +86,7 @@ export function DesktopHandoff(t0) {
|
|
|
86
86
|
setState("opening");
|
|
87
87
|
const result = await openCurrentSessionInDesktop();
|
|
88
88
|
if (!result.success) {
|
|
89
|
-
setError(result.error ?? "Failed to open
|
|
89
|
+
setError(result.error ?? "Failed to open Xela Desktop");
|
|
90
90
|
setState("error");
|
|
91
91
|
return;
|
|
92
92
|
}
|
|
@@ -162,10 +162,10 @@ export function DesktopHandoff(t0) {
|
|
|
162
162
|
let t4;
|
|
163
163
|
if ($[17] === Symbol.for("react.memo_cache_sentinel")) {
|
|
164
164
|
t4 = {
|
|
165
|
-
checking: "Checking for
|
|
165
|
+
checking: "Checking for Xela Desktop\u2026",
|
|
166
166
|
flushing: "Saving session\u2026",
|
|
167
|
-
opening: "Opening
|
|
168
|
-
success: "Opening in
|
|
167
|
+
opening: "Opening Xela Desktop\u2026",
|
|
168
|
+
success: "Opening in Xela Desktop\u2026"
|
|
169
169
|
};
|
|
170
170
|
$[17] = t4;
|
|
171
171
|
} else {
|
|
@@ -184,7 +184,7 @@ export function DesktopHandoff(t0) {
|
|
|
184
184
|
return t6;
|
|
185
185
|
}
|
|
186
186
|
async function _temp2(onDone_0) {
|
|
187
|
-
onDone_0("Session transferred to
|
|
187
|
+
onDone_0("Session transferred to Xela Desktop", {
|
|
188
188
|
display: "system"
|
|
189
189
|
});
|
|
190
190
|
await gracefulShutdown(0, "other");
|
|
@@ -90,7 +90,7 @@ export function DesktopUpsellStartup(t0) {
|
|
|
90
90
|
let t3;
|
|
91
91
|
if ($[5] === Symbol.for("react.memo_cache_sentinel")) {
|
|
92
92
|
t3 = {
|
|
93
|
-
label: "Open in
|
|
93
|
+
label: "Open in Xela Desktop",
|
|
94
94
|
value: "try" as const
|
|
95
95
|
};
|
|
96
96
|
$[5] = t3;
|
|
@@ -120,7 +120,7 @@ export function DesktopUpsellStartup(t0) {
|
|
|
120
120
|
const options = t5;
|
|
121
121
|
let t6;
|
|
122
122
|
if ($[8] === Symbol.for("react.memo_cache_sentinel")) {
|
|
123
|
-
t6 = <Box marginBottom={1}><Text>Same
|
|
123
|
+
t6 = <Box marginBottom={1}><Text>Same Xela with visual diffs, live app preview, parallel sessions, and more.</Text></Box>;
|
|
124
124
|
$[8] = t6;
|
|
125
125
|
} else {
|
|
126
126
|
t6 = $[8];
|
|
@@ -135,7 +135,7 @@ export function DesktopUpsellStartup(t0) {
|
|
|
135
135
|
}
|
|
136
136
|
let t8;
|
|
137
137
|
if ($[11] !== handleSelect || $[12] !== t7) {
|
|
138
|
-
t8 = <PermissionDialog title="Try
|
|
138
|
+
t8 = <PermissionDialog title="Try Xela Desktop"><Box flexDirection="column" paddingX={2} paddingY={1}>{t6}<Select options={options} onChange={handleSelect} onCancel={t7} /></Box></PermissionDialog>;
|
|
139
139
|
$[11] = handleSelect;
|
|
140
140
|
$[12] = t7;
|
|
141
141
|
$[13] = t8;
|
|
@@ -361,7 +361,7 @@ export function Feedback({
|
|
|
361
361
|
<Box marginTop={1}>
|
|
362
362
|
<Text wrap="wrap" dimColor>
|
|
363
363
|
We will use your feedback to debug related issues or to improve{' '}
|
|
364
|
-
|
|
364
|
+
Xela's functionality (eg. to reduce the risk of bugs
|
|
365
365
|
occurring in the future).
|
|
366
366
|
</Text>
|
|
367
367
|
</Box>
|
|
@@ -447,7 +447,7 @@ export function createGitHubIssueUrl(feedbackId: string, title: string, descript
|
|
|
447
447
|
async function generateTitle(description: string, abortSignal: AbortSignal): Promise<string> {
|
|
448
448
|
try {
|
|
449
449
|
const response = await queryHaiku({
|
|
450
|
-
systemPrompt: asSystemPrompt(['Generate a concise, technical issue title (max 80 chars) for a public GitHub issue based on this bug report for
|
|
450
|
+
systemPrompt: asSystemPrompt(['Generate a concise, technical issue title (max 80 chars) for a public GitHub issue based on this bug report for Xela.', 'Xela is an AI coding assistant CLI that supports multiple model providers.', 'The title should:', '- Include the type of issue [Bug] or [Feature Request] as the first thing in the title', '- Be concise, specific and descriptive of the actual problem', '- Use technical terminology appropriate for a software issue', '- For error messages, extract the key error (e.g., "Missing Tool Result Block" rather than the full message)', '- Be direct and clear for developers to understand the problem', '- If you cannot determine a clear issue, use "Bug Report: [brief description]"', '- Any LLM API errors are from the Anthropic API, not from any other model provider', 'Your response will be directly used as the title of the Github issue, and as such should not contain any other commentary or explaination', 'Examples of good titles include: "[Bug] Auto-Compact triggers to soon", "[Bug] Anthropic API Error: Missing Tool Result Block", "[Bug] Error: Invalid Model Name for Opus"']),
|
|
451
451
|
userPrompt: description,
|
|
452
452
|
signal: abortSignal,
|
|
453
453
|
options: {
|
|
@@ -6,7 +6,7 @@ export function General() {
|
|
|
6
6
|
const $ = _c(2);
|
|
7
7
|
let t0;
|
|
8
8
|
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
9
|
-
t0 = <Box><Text>
|
|
9
|
+
t0 = <Box><Text>Xela understands your codebase, makes edits with your permission, and executes commands — right from your terminal.</Text></Box>;
|
|
10
10
|
$[0] = t0;
|
|
11
11
|
} else {
|
|
12
12
|
t0 = $[0];
|
|
@@ -138,7 +138,7 @@ export function HelpV2(t0) {
|
|
|
138
138
|
const t5 = insideModal ? undefined : maxHeight;
|
|
139
139
|
let t6;
|
|
140
140
|
if ($[31] !== tabs) {
|
|
141
|
-
t6 = <Tabs title={false ? "/help" : `
|
|
141
|
+
t6 = <Tabs title={false ? "/help" : `Xela v${MACRO.VERSION}`} color="professionalBlue" defaultTab="general">{tabs}</Tabs>;
|
|
142
142
|
$[31] = tabs;
|
|
143
143
|
$[32] = t6;
|
|
144
144
|
} else {
|
|
@@ -70,7 +70,7 @@ export function IdeOnboardingDialog(t0) {
|
|
|
70
70
|
}
|
|
71
71
|
let t6;
|
|
72
72
|
if ($[8] !== ideName) {
|
|
73
|
-
t6 = <>{t5}<Text>Welcome to
|
|
73
|
+
t6 = <>{t5}<Text>Welcome to Xela for {ideName}</Text></>;
|
|
74
74
|
$[8] = ideName;
|
|
75
75
|
$[9] = t6;
|
|
76
76
|
} else {
|
|
@@ -86,7 +86,7 @@ export function IdeOnboardingDialog(t0) {
|
|
|
86
86
|
}
|
|
87
87
|
let t9;
|
|
88
88
|
if ($[11] === Symbol.for("react.memo_cache_sentinel")) {
|
|
89
|
-
t9 = <Text>•
|
|
89
|
+
t9 = <Text>• Xela has context of {t8}{" "}and <Text color="suggestion">⧉ selected lines</Text></Text>;
|
|
90
90
|
$[11] = t9;
|
|
91
91
|
} else {
|
|
92
92
|
t9 = $[11];
|
|
@@ -100,7 +100,7 @@ export function IdeOnboardingDialog(t0) {
|
|
|
100
100
|
}
|
|
101
101
|
let t11;
|
|
102
102
|
if ($[13] === Symbol.for("react.memo_cache_sentinel")) {
|
|
103
|
-
t11 = <Text>• Review
|
|
103
|
+
t11 = <Text>• Review Xela's changes{" "}{t10}{" "}<Text color="diffRemovedWord">-22</Text> in the comfort of your IDE</Text>;
|
|
104
104
|
$[13] = t11;
|
|
105
105
|
} else {
|
|
106
106
|
t11 = $[13];
|
|
@@ -31,44 +31,45 @@ type Segments = {
|
|
|
31
31
|
/** row 2 right (no bg): body curve + arm */
|
|
32
32
|
r2R: string;
|
|
33
33
|
};
|
|
34
|
+
// Xela "X" mascot — all poses show the same X logo
|
|
34
35
|
const POSES: Record<ClawdPose, Segments> = {
|
|
35
36
|
default: {
|
|
36
|
-
r1L: '
|
|
37
|
-
r1E: '
|
|
38
|
-
r1R: '
|
|
39
|
-
r2L: '
|
|
40
|
-
r2R: '
|
|
37
|
+
r1L: '╲ ',
|
|
38
|
+
r1E: ' ╳ ',
|
|
39
|
+
r1R: ' ╱',
|
|
40
|
+
r2L: '╱ ',
|
|
41
|
+
r2R: ' ╲'
|
|
41
42
|
},
|
|
42
43
|
'look-left': {
|
|
43
|
-
r1L: '
|
|
44
|
-
r1E: '
|
|
45
|
-
r1R: '
|
|
46
|
-
r2L: '
|
|
47
|
-
r2R: '
|
|
44
|
+
r1L: '╲ ',
|
|
45
|
+
r1E: ' ╳ ',
|
|
46
|
+
r1R: ' ╱',
|
|
47
|
+
r2L: '╱ ',
|
|
48
|
+
r2R: ' ╲'
|
|
48
49
|
},
|
|
49
50
|
'look-right': {
|
|
50
|
-
r1L: '
|
|
51
|
-
r1E: '
|
|
52
|
-
r1R: '
|
|
53
|
-
r2L: '
|
|
54
|
-
r2R: '
|
|
51
|
+
r1L: '╲ ',
|
|
52
|
+
r1E: ' ╳ ',
|
|
53
|
+
r1R: ' ╱',
|
|
54
|
+
r2L: '╱ ',
|
|
55
|
+
r2R: ' ╲'
|
|
55
56
|
},
|
|
56
57
|
'arms-up': {
|
|
57
|
-
r1L: '
|
|
58
|
-
r1E: '
|
|
59
|
-
r1R: '
|
|
60
|
-
r2L: '
|
|
61
|
-
r2R: '
|
|
58
|
+
r1L: '╲ ',
|
|
59
|
+
r1E: ' ╳ ',
|
|
60
|
+
r1R: ' ╱',
|
|
61
|
+
r2L: '╱ ',
|
|
62
|
+
r2R: ' ╲'
|
|
62
63
|
}
|
|
63
64
|
};
|
|
64
65
|
|
|
65
66
|
// Apple Terminal uses a bg-fill trick (see below), so only eye poses make
|
|
66
67
|
// sense. Arm poses fall back to default.
|
|
67
68
|
const APPLE_EYES: Record<ClawdPose, string> = {
|
|
68
|
-
default: '
|
|
69
|
-
'look-left': '
|
|
70
|
-
'look-right': '
|
|
71
|
-
'arms-up': '
|
|
69
|
+
default: ' ╲ ╳ ╱ ',
|
|
70
|
+
'look-left': ' ╲ ╳ ╱ ',
|
|
71
|
+
'look-right': ' ╲ ╳ ╱ ',
|
|
72
|
+
'arms-up': ' ╲ ╳ ╱ '
|
|
72
73
|
};
|
|
73
74
|
export function Clawd(t0) {
|
|
74
75
|
const $ = _c(26);
|
|
@@ -140,7 +141,7 @@ export function Clawd(t0) {
|
|
|
140
141
|
}
|
|
141
142
|
let t8;
|
|
142
143
|
if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
|
|
143
|
-
t8 = <Text color="clawd_body"
|
|
144
|
+
t8 = <Text color="clawd_body"> ╳ </Text>;
|
|
144
145
|
$[16] = t8;
|
|
145
146
|
} else {
|
|
146
147
|
t8 = $[16];
|
|
@@ -164,7 +165,7 @@ export function Clawd(t0) {
|
|
|
164
165
|
}
|
|
165
166
|
let t11;
|
|
166
167
|
if ($[22] === Symbol.for("react.memo_cache_sentinel")) {
|
|
167
|
-
t11 = <Text color="clawd_body">{" "}
|
|
168
|
+
t11 = <Text color="clawd_body">{" "}XELA{" "}</Text>;
|
|
168
169
|
$[22] = t11;
|
|
169
170
|
} else {
|
|
170
171
|
t11 = $[22];
|
|
@@ -60,7 +60,7 @@ export function GuestPassesUpsell() {
|
|
|
60
60
|
let t0;
|
|
61
61
|
if ($[0] === Symbol.for("react.memo_cache_sentinel")) {
|
|
62
62
|
const reward = getCachedReferrerReward();
|
|
63
|
-
t0 = <Text dimColor={true}><Text color="claude">[✻]</Text> <Text color="claude">[✻]</Text>{" "}<Text color="claude">[✻]</Text> ·{" "}{reward ? `Share
|
|
63
|
+
t0 = <Text dimColor={true}><Text color="claude">[✻]</Text> <Text color="claude">[✻]</Text>{" "}<Text color="claude">[✻]</Text> ·{" "}{reward ? `Share Xela and earn ${formatCreditAmount(reward)} of extra usage · /passes` : "3 guest passes at /passes"}</Text>;
|
|
64
64
|
$[0] = t0;
|
|
65
65
|
} else {
|
|
66
66
|
t0 = $[0];
|
|
@@ -248,8 +248,8 @@ export function LogoV2() {
|
|
|
248
248
|
}
|
|
249
249
|
const layoutMode = getLayoutMode(columns);
|
|
250
250
|
const userTheme = resolveThemeSetting(getGlobalConfig().theme);
|
|
251
|
-
const borderTitle = ` ${color("claude", userTheme)("
|
|
252
|
-
const compactBorderTitle = color("claude", userTheme)("
|
|
251
|
+
const borderTitle = ` ${color("claude", userTheme)("Xela")} ${color("inactive", userTheme)(`v${version}`)} `;
|
|
252
|
+
const compactBorderTitle = color("claude", userTheme)(" Xela ");
|
|
253
253
|
if (layoutMode === "compact") {
|
|
254
254
|
let welcomeMessage = formatWelcomeMessage(username);
|
|
255
255
|
if (stringWidth(welcomeMessage) > columns - 4) {
|
|
@@ -9,7 +9,7 @@ export function WelcomeV2() {
|
|
|
9
9
|
if (env.terminal === "Apple_Terminal") {
|
|
10
10
|
let t0;
|
|
11
11
|
if ($[0] !== theme) {
|
|
12
|
-
t0 = <AppleTerminalWelcomeV2 theme={theme} welcomeMessage="Welcome to
|
|
12
|
+
t0 = <AppleTerminalWelcomeV2 theme={theme} welcomeMessage="Welcome to Xela" />;
|
|
13
13
|
$[0] = theme;
|
|
14
14
|
$[1] = t0;
|
|
15
15
|
} else {
|
|
@@ -28,7 +28,7 @@ export function WelcomeV2() {
|
|
|
28
28
|
let t7;
|
|
29
29
|
let t8;
|
|
30
30
|
if ($[2] === Symbol.for("react.memo_cache_sentinel")) {
|
|
31
|
-
t0 = <Text><Text color="claude">{"Welcome to
|
|
31
|
+
t0 = <Text><Text color="claude">{"Welcome to Xela"} </Text><Text dimColor={true}>v{MACRO.VERSION} </Text></Text>;
|
|
32
32
|
t1 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text>;
|
|
33
33
|
t2 = <Text>{" "}</Text>;
|
|
34
34
|
t3 = <Text>{" "}</Text>;
|
|
@@ -113,7 +113,7 @@ export function WelcomeV2() {
|
|
|
113
113
|
let t5;
|
|
114
114
|
let t6;
|
|
115
115
|
if ($[18] === Symbol.for("react.memo_cache_sentinel")) {
|
|
116
|
-
t0 = <Text><Text color="claude">{"Welcome to
|
|
116
|
+
t0 = <Text><Text color="claude">{"Welcome to Xela"} </Text><Text dimColor={true}>v{MACRO.VERSION} </Text></Text>;
|
|
117
117
|
t1 = <Text>{"\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026\u2026"}</Text>;
|
|
118
118
|
t2 = <Text>{" "}</Text>;
|
|
119
119
|
t3 = <Text>{" * \u2588\u2588\u2588\u2588\u2588\u2593\u2593\u2591 "}</Text>;
|
|
@@ -39,7 +39,7 @@ export function createWhatsNewFeed(releaseNotes: string[]): FeedConfig {
|
|
|
39
39
|
text: note
|
|
40
40
|
};
|
|
41
41
|
});
|
|
42
|
-
const emptyMessage = "external" === 'ant' ? 'Unable to fetch latest
|
|
42
|
+
const emptyMessage = "external" === 'ant' ? 'Unable to fetch latest commits' : 'Check the Xela changelog for updates';
|
|
43
43
|
return {
|
|
44
44
|
title: "external" === 'ant' ? "What's new [ANT-ONLY: Latest CC commits]" : "What's new",
|
|
45
45
|
lines,
|
|
@@ -60,7 +60,7 @@ export function createProjectOnboardingFeed(steps: Step[]): FeedConfig {
|
|
|
60
60
|
text: `${checkmark}${text}`
|
|
61
61
|
};
|
|
62
62
|
});
|
|
63
|
-
const warningText = getCwd() === homedir() ? 'Note: You have launched
|
|
63
|
+
const warningText = getCwd() === homedir() ? 'Note: You have launched xela in your home directory. For the best experience, launch it in a project directory instead.' : undefined;
|
|
64
64
|
if (warningText) {
|
|
65
65
|
lines.push({
|
|
66
66
|
text: warningText
|
|
@@ -73,7 +73,7 @@ export function createProjectOnboardingFeed(steps: Step[]): FeedConfig {
|
|
|
73
73
|
}
|
|
74
74
|
export function createGuestPassesFeed(): FeedConfig {
|
|
75
75
|
const reward = getCachedReferrerReward();
|
|
76
|
-
const subtitle = reward ? `Share
|
|
76
|
+
const subtitle = reward ? `Share Xela and earn ${formatCreditAmount(reward)} of extra usage` : 'Share Xela with friends';
|
|
77
77
|
return {
|
|
78
78
|
title: '3 guest passes',
|
|
79
79
|
lines: [],
|
|
@@ -71,9 +71,9 @@ export function Onboarding({
|
|
|
71
71
|
*/}
|
|
72
72
|
<OrderedList>
|
|
73
73
|
<OrderedList.Item>
|
|
74
|
-
<Text>
|
|
74
|
+
<Text>Xela can make mistakes</Text>
|
|
75
75
|
<Text dimColor wrap="wrap">
|
|
76
|
-
You should always review
|
|
76
|
+
You should always review Xela's responses, especially when
|
|
77
77
|
<Newline />
|
|
78
78
|
running code.
|
|
79
79
|
<Newline />
|
|
@@ -146,7 +146,7 @@ export function Onboarding({
|
|
|
146
146
|
steps.push({
|
|
147
147
|
id: 'terminal-setup',
|
|
148
148
|
component: <Box flexDirection="column" gap={1} paddingLeft={1}>
|
|
149
|
-
<Text bold>Use
|
|
149
|
+
<Text bold>Use Xela's terminal setup?</Text>
|
|
150
150
|
<Box flexDirection="column" width={70} gap={1}>
|
|
151
151
|
<Text>
|
|
152
152
|
For the optimal coding experience, enable the recommended settings
|
|
@@ -761,7 +761,7 @@ function PromptInput({
|
|
|
761
761
|
if (feature('ULTRAPLAN') && ultraplanTriggers.length) {
|
|
762
762
|
addNotification({
|
|
763
763
|
key: 'ultraplan-active',
|
|
764
|
-
text: 'This prompt will launch an ultraplan session in
|
|
764
|
+
text: 'This prompt will launch an ultraplan session in Xela on the web',
|
|
765
765
|
priority: 'immediate',
|
|
766
766
|
timeoutMs: 5000
|
|
767
767
|
});
|
|
@@ -257,11 +257,11 @@ function renderErrorSpecificGuidance(errorType: LoadErrorType): React.ReactNode
|
|
|
257
257
|
</Box>;
|
|
258
258
|
case 'api':
|
|
259
259
|
return <Box marginY={1} flexDirection="column">
|
|
260
|
-
<Text dimColor>Sorry,
|
|
260
|
+
<Text dimColor>Sorry, Xela encountered an error</Text>
|
|
261
261
|
</Box>;
|
|
262
262
|
case 'other':
|
|
263
263
|
return <Box marginY={1} flexDirection="row">
|
|
264
|
-
<Text dimColor>Sorry,
|
|
264
|
+
<Text dimColor>Sorry, Xela encountered an error</Text>
|
|
265
265
|
</Box>;
|
|
266
266
|
}
|
|
267
267
|
}
|
|
@@ -145,7 +145,7 @@ export function TeleportError(t0) {
|
|
|
145
145
|
}
|
|
146
146
|
let t9;
|
|
147
147
|
if ($[16] === Symbol.for("react.memo_cache_sentinel")) {
|
|
148
|
-
t9 = <Box flexDirection="column"><Text dimColor={true}>Teleport requires a Claude.ai account.</Text><Text dimColor={true}>Your
|
|
148
|
+
t9 = <Box flexDirection="column"><Text dimColor={true}>Teleport requires a Claude.ai account.</Text><Text dimColor={true}>Your subscription will be used by Xela.</Text></Box>;
|
|
149
149
|
$[16] = t9;
|
|
150
150
|
} else {
|
|
151
151
|
t9 = $[16];
|
|
@@ -254,7 +254,7 @@ function ElicitationFormDialog({
|
|
|
254
254
|
// Text fields are always in edit mode when focused — no Enter-to-edit step.
|
|
255
255
|
const isEditingTextField = currentFieldIsText && !focusedButton;
|
|
256
256
|
useRegisterOverlay('elicitation');
|
|
257
|
-
useNotifyAfterTimeout('
|
|
257
|
+
useNotifyAfterTimeout('Xela needs your input', 'elicitation_dialog');
|
|
258
258
|
|
|
259
259
|
// Sync textInputValue when the focused field changes
|
|
260
260
|
const syncTextInput = useCallback((fieldIndex: number | undefined) => {
|
|
@@ -1004,7 +1004,7 @@ function ElicitationURLDialog({
|
|
|
1004
1004
|
const phaseRef = useRef<'prompt' | 'waiting'>('prompt');
|
|
1005
1005
|
const [focusedButton, setFocusedButton] = useState<'accept' | 'decline' | 'open' | 'action' | 'cancel'>('accept');
|
|
1006
1006
|
const showCancel = waitingState?.showCancel ?? false;
|
|
1007
|
-
useNotifyAfterTimeout('
|
|
1007
|
+
useNotifyAfterTimeout('Xela needs your input', 'elicitation_url_dialog');
|
|
1008
1008
|
useRegisterOverlay('elicitation-url');
|
|
1009
1009
|
|
|
1010
1010
|
// Keep refs in sync for use in abort handler (avoids re-registering listener)
|
|
@@ -102,9 +102,9 @@ export function MCPRemoteServerMenu({
|
|
|
102
102
|
if (success) {
|
|
103
103
|
onComplete?.(`Authentication successful. Connected to ${server.name}.`);
|
|
104
104
|
} else if (result.client.type === 'needs-auth') {
|
|
105
|
-
onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart
|
|
105
|
+
onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart Xela.');
|
|
106
106
|
} else {
|
|
107
|
-
onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart
|
|
107
|
+
onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart Xela for the changes to take effect.');
|
|
108
108
|
}
|
|
109
109
|
} catch (err) {
|
|
110
110
|
logEvent('tengu_claudeai_mcp_auth_completed', {
|
|
@@ -281,11 +281,11 @@ export function MCPRemoteServerMenu({
|
|
|
281
281
|
const message = isEffectivelyAuthenticated ? `Authentication successful. Reconnected to ${server.name}.` : `Authentication successful. Connected to ${server.name}.`;
|
|
282
282
|
onComplete?.(message);
|
|
283
283
|
} else if (result_0.client.type === 'needs-auth') {
|
|
284
|
-
onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart
|
|
284
|
+
onComplete?.('Authentication successful, but server still requires authentication. You may need to manually restart Xela.');
|
|
285
285
|
} else {
|
|
286
286
|
// result.client.type === 'failed'
|
|
287
287
|
logMCPDebug(server.name, `Reconnection failed after authentication`);
|
|
288
|
-
onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart
|
|
288
|
+
onComplete?.('Authentication successful, but server reconnection failed. You may need to manually restart Xela for the changes to take effect.');
|
|
289
289
|
}
|
|
290
290
|
}
|
|
291
291
|
} catch (err_1) {
|
|
@@ -207,7 +207,7 @@ export function MCPSettings(t0) {
|
|
|
207
207
|
t9 = $[25];
|
|
208
208
|
}
|
|
209
209
|
const serverTools_0 = t9;
|
|
210
|
-
const defaultTab = viewState.server.transport === "claudeai-proxy" ? "claude.ai" : "
|
|
210
|
+
const defaultTab = viewState.server.transport === "claudeai-proxy" ? "claude.ai" : "Xela";
|
|
211
211
|
if (viewState.server.transport === "stdio") {
|
|
212
212
|
let t10;
|
|
213
213
|
if ($[26] !== viewState.server) {
|
|
@@ -1,9 +1,9 @@
|
|
|
1
|
-
export const PR_TITLE = 'Add
|
|
1
|
+
export const PR_TITLE = 'Add Xela GitHub Workflow'
|
|
2
2
|
|
|
3
3
|
export const GITHUB_ACTION_SETUP_DOCS_URL =
|
|
4
4
|
'https://github.com/anthropics/claude-code-action/blob/main/docs/setup.md'
|
|
5
5
|
|
|
6
|
-
export const WORKFLOW_CONTENT = `name:
|
|
6
|
+
export const WORKFLOW_CONTENT = `name: Xela
|
|
7
7
|
|
|
8
8
|
on:
|
|
9
9
|
issue_comment:
|
|
@@ -35,7 +35,7 @@ jobs:
|
|
|
35
35
|
with:
|
|
36
36
|
fetch-depth: 1
|
|
37
37
|
|
|
38
|
-
- name: Run
|
|
38
|
+
- name: Run Xela
|
|
39
39
|
id: claude
|
|
40
40
|
uses: anthropics/claude-code-action@v1
|
|
41
41
|
with:
|
|
@@ -55,13 +55,13 @@ jobs:
|
|
|
55
55
|
|
|
56
56
|
`
|
|
57
57
|
|
|
58
|
-
export const PR_BODY = `##
|
|
58
|
+
export const PR_BODY = `## Installing Xela GitHub App
|
|
59
59
|
|
|
60
|
-
This PR adds a GitHub Actions workflow that enables
|
|
60
|
+
This PR adds a GitHub Actions workflow that enables Xela integration in our repository.
|
|
61
61
|
|
|
62
|
-
### What is
|
|
62
|
+
### What is Xela?
|
|
63
63
|
|
|
64
|
-
[
|
|
64
|
+
[Xela](https://github.com/xelauvas/codeclau) is an AI coding assistant that can help with:
|
|
65
65
|
- Bug fixes and improvements
|
|
66
66
|
- Documentation updates
|
|
67
67
|
- Implementing new features
|
|
@@ -93,11 +93,11 @@ Once the workflow is triggered, Claude will analyze the comment and surrounding
|
|
|
93
93
|
allowed_tools: Bash(npm install),Bash(npm run build),Bash(npm run lint),Bash(npm run test)
|
|
94
94
|
\`\`\`
|
|
95
95
|
|
|
96
|
-
There's more information in the [
|
|
96
|
+
There's more information in the [Xela repo](https://github.com/xelauvas/codeclau).
|
|
97
97
|
|
|
98
98
|
After merging this PR, let's try mentioning @claude in a comment on any PR to get started!`
|
|
99
99
|
|
|
100
|
-
export const CODE_REVIEW_PLUGIN_WORKFLOW_CONTENT = `name:
|
|
100
|
+
export const CODE_REVIEW_PLUGIN_WORKFLOW_CONTENT = `name: Xela Code Review
|
|
101
101
|
|
|
102
102
|
on:
|
|
103
103
|
pull_request:
|
|
@@ -130,7 +130,7 @@ jobs:
|
|
|
130
130
|
with:
|
|
131
131
|
fetch-depth: 1
|
|
132
132
|
|
|
133
|
-
- name: Run
|
|
133
|
+
- name: Run Xela Review
|
|
134
134
|
id: claude-review
|
|
135
135
|
uses: anthropics/claude-code-action@v1
|
|
136
136
|
with:
|
package/src/constants/product.ts
CHANGED
package/src/constants/prompts.ts
CHANGED
|
@@ -214,7 +214,7 @@ function getSimpleDoingTasksSection(): string {
|
|
|
214
214
|
]
|
|
215
215
|
|
|
216
216
|
const userHelpSubitems = [
|
|
217
|
-
`/help: Get help with using
|
|
217
|
+
`/help: Get help with using Xela`,
|
|
218
218
|
`To give feedback, users should ${MACRO.ISSUES_EXPLAINER}`,
|
|
219
219
|
]
|
|
220
220
|
|
|
@@ -449,7 +449,7 @@ export async function getSystemPrompt(
|
|
|
449
449
|
): Promise<string[]> {
|
|
450
450
|
if (isEnvTruthy(process.env.CLAUDE_CODE_SIMPLE)) {
|
|
451
451
|
return [
|
|
452
|
-
`You are
|
|
452
|
+
`You are Xela, an AI coding assistant.\n\nCWD: ${getCwd()}\nDate: ${getSessionStartDate()}`,
|
|
453
453
|
]
|
|
454
454
|
}
|
|
455
455
|
|
|
@@ -696,10 +696,10 @@ export async function computeSimpleEnvInfo(
|
|
|
696
696
|
: `The most recent Claude model family is Claude 4.5/4.6. Model IDs — Opus 4.6: '${CLAUDE_4_5_OR_4_6_MODEL_IDS.opus}', Sonnet 4.6: '${CLAUDE_4_5_OR_4_6_MODEL_IDS.sonnet}', Haiku 4.5: '${CLAUDE_4_5_OR_4_6_MODEL_IDS.haiku}'. When building AI applications, default to the latest and most capable Claude models.`,
|
|
697
697
|
process.env.USER_TYPE === 'ant' && isUndercover()
|
|
698
698
|
? null
|
|
699
|
-
: `
|
|
699
|
+
: `Xela is available as a CLI tool. Install: npm install -g @xelauvas/xela-cli`,
|
|
700
700
|
process.env.USER_TYPE === 'ant' && isUndercover()
|
|
701
701
|
? null
|
|
702
|
-
: `Fast mode for
|
|
702
|
+
: `Fast mode for Xela uses the same ${FRONTIER_MODEL_NAME} model with faster output. It does NOT switch to a different model. It can be toggled with /fast.`,
|
|
703
703
|
].filter(item => item !== null)
|
|
704
704
|
|
|
705
705
|
return [
|
|
@@ -755,7 +755,7 @@ export function getUnameSR(): string {
|
|
|
755
755
|
return `${osType()} ${osRelease()}`
|
|
756
756
|
}
|
|
757
757
|
|
|
758
|
-
export const DEFAULT_AGENT_PROMPT = `You are an agent for
|
|
758
|
+
export const DEFAULT_AGENT_PROMPT = `You are an agent for Xela, an AI coding assistant. Given the user's message, you should use the tools available to complete the task. Complete the task fully—don't gold-plate, but don't leave it half-done. When you complete the task, respond with a concise report covering what was done and any key findings — the caller will relay this to the user, so it only needs the essentials.`
|
|
759
759
|
|
|
760
760
|
export async function enhanceSystemPromptWithEnvDetails(
|
|
761
761
|
existingSystemPrompt: string[],
|
package/src/constants/system.ts
CHANGED
|
@@ -7,8 +7,8 @@ import { isEnvDefinedFalsy } from '../utils/envUtils.js'
|
|
|
7
7
|
import { getAPIProvider } from '../utils/model/providers.js'
|
|
8
8
|
import { getWorkload } from '../utils/workloadContext.js'
|
|
9
9
|
|
|
10
|
-
const DEFAULT_PREFIX = `You are
|
|
11
|
-
const AGENT_SDK_CLAUDE_CODE_PRESET_PREFIX = `You are
|
|
10
|
+
const DEFAULT_PREFIX = `You are Xela, an AI coding assistant powered by any model.`
|
|
11
|
+
const AGENT_SDK_CLAUDE_CODE_PRESET_PREFIX = `You are Xela, an AI coding assistant, running within the Claude Agent SDK.`
|
|
12
12
|
const AGENT_SDK_PREFIX = `You are a Claude agent, built on Anthropic's Claude Agent SDK.`
|
|
13
13
|
|
|
14
14
|
const CLI_SYSPROMPT_PREFIX_VALUES = [
|
package/src/main.tsx
CHANGED
|
@@ -965,7 +965,7 @@ async function run(): Promise<CommanderCommand> {
|
|
|
965
965
|
}
|
|
966
966
|
profileCheckpoint('preAction_after_settings_sync');
|
|
967
967
|
});
|
|
968
|
-
program.name('
|
|
968
|
+
program.name('xela').description(`Xela - AI coding assistant. Starts an interactive session by default, use -p/--print for non-interactive output`).argument('[prompt]', 'Your prompt', String)
|
|
969
969
|
// Subcommands inherit helpOption via commander's copyInheritedSettings —
|
|
970
970
|
// setting it once here covers mcp, plugin, auth, and all other subcommands.
|
|
971
971
|
.helpOption('-h, --help', 'Display help for command').option('-d, --debug [filter]', 'Enable debug mode with optional category filtering (e.g., "api,hooks" or "!1p,!file")', (_value: string | true) => {
|
package/src/screens/REPL.tsx
CHANGED
|
@@ -1132,7 +1132,7 @@ export function REPL({
|
|
|
1132
1132
|
// session from mid-conversation context.
|
|
1133
1133
|
const haikuTitleAttemptedRef = useRef((initialMessages?.length ?? 0) > 0);
|
|
1134
1134
|
const agentTitle = mainThreadAgentDefinition?.agentType;
|
|
1135
|
-
const terminalTitle = sessionTitle ?? agentTitle ?? haikuTitle ?? '
|
|
1135
|
+
const terminalTitle = sessionTitle ?? agentTitle ?? haikuTitle ?? 'Xela';
|
|
1136
1136
|
const isWaitingForApproval = toolUseConfirmQueue.length > 0 || promptQueue.length > 0 || pendingWorkerRequest || pendingSandboxRequest;
|
|
1137
1137
|
// Local-jsx commands (like /plugin, /config) show user-facing dialogs that
|
|
1138
1138
|
// wait for input. Require jsx != null — if the flag is stuck true but jsx
|
|
@@ -3932,7 +3932,7 @@ export function REPL({
|
|
|
3932
3932
|
// Use ref to get current dialog state, avoiding stale closure
|
|
3933
3933
|
focusedInputDialogRef.current === undefined && idleTimeSinceResponse >= getGlobalConfig().messageIdleNotifThresholdMs) {
|
|
3934
3934
|
void sendNotification({
|
|
3935
|
-
message: '
|
|
3935
|
+
message: 'Xela is waiting for your input',
|
|
3936
3936
|
notificationType: 'idle_prompt'
|
|
3937
3937
|
}, terminal);
|
|
3938
3938
|
}
|
|
@@ -4123,7 +4123,7 @@ export function REPL({
|
|
|
4123
4123
|
useEffect(() => {
|
|
4124
4124
|
const handleSuspend = () => {
|
|
4125
4125
|
// Print suspension instructions
|
|
4126
|
-
process.stdout.write(`\
|
|
4126
|
+
process.stdout.write(`\nXela has been suspended. Run \`fg\` to bring Xela back.\nNote: ctrl + z now suspends Xela, ctrl + _ undoes input.\n`);
|
|
4127
4127
|
};
|
|
4128
4128
|
const handleResume = () => {
|
|
4129
4129
|
// Force complete component tree replacement instead of terminal clear
|
package/src/services/mcp/auth.ts
CHANGED
|
@@ -1416,7 +1416,7 @@ export class ClaudeAuthProvider implements OAuthClientProvider {
|
|
|
1416
1416
|
|
|
1417
1417
|
get clientMetadata(): OAuthClientMetadata {
|
|
1418
1418
|
const metadata: OAuthClientMetadata = {
|
|
1419
|
-
client_name: `
|
|
1419
|
+
client_name: `Xela (${this.serverName})`,
|
|
1420
1420
|
redirect_uris: [this.redirectUri],
|
|
1421
1421
|
grant_types: ['authorization_code', 'refresh_token'],
|
|
1422
1422
|
response_types: ['code'],
|
|
@@ -984,10 +984,10 @@ export const connectToServer = memoize(
|
|
|
984
984
|
|
|
985
985
|
const client = new Client(
|
|
986
986
|
{
|
|
987
|
-
name: '
|
|
988
|
-
title: '
|
|
987
|
+
name: 'xela',
|
|
988
|
+
title: 'Xela',
|
|
989
989
|
version: MACRO.VERSION ?? 'unknown',
|
|
990
|
-
description: "
|
|
990
|
+
description: "AI coding assistant powered by any model",
|
|
991
991
|
websiteUrl: PRODUCT_URL,
|
|
992
992
|
},
|
|
993
993
|
{
|
|
@@ -3279,10 +3279,10 @@ export async function setupSdkMcpClients(
|
|
|
3279
3279
|
|
|
3280
3280
|
const client = new Client(
|
|
3281
3281
|
{
|
|
3282
|
-
name: '
|
|
3283
|
-
title: '
|
|
3282
|
+
name: 'xela',
|
|
3283
|
+
title: 'Xela',
|
|
3284
3284
|
version: MACRO.VERSION ?? 'unknown',
|
|
3285
|
-
description: "
|
|
3285
|
+
description: "AI coding assistant powered by any model",
|
|
3286
3286
|
websiteUrl: PRODUCT_URL,
|
|
3287
3287
|
},
|
|
3288
3288
|
{
|
package/src/services/notifier.ts
CHANGED
|
@@ -355,7 +355,7 @@ const externalTips: Tip[] = [
|
|
|
355
355
|
{
|
|
356
356
|
id: 'paste-images-mac',
|
|
357
357
|
content: async () =>
|
|
358
|
-
'Paste images into
|
|
358
|
+
'Paste images into Xela using control+v (not cmd+v!)',
|
|
359
359
|
cooldownSessions: 10,
|
|
360
360
|
isRelevant: async () => getPlatform() === 'macos',
|
|
361
361
|
},
|
|
@@ -437,7 +437,7 @@ const externalTips: Tip[] = [
|
|
|
437
437
|
{
|
|
438
438
|
id: 'desktop-app',
|
|
439
439
|
content: async () =>
|
|
440
|
-
'Run
|
|
440
|
+
'Run Xela locally or remotely',
|
|
441
441
|
cooldownSessions: 15,
|
|
442
442
|
isRelevant: async () => getPlatform() !== 'linux',
|
|
443
443
|
},
|
|
@@ -445,7 +445,7 @@ const externalTips: Tip[] = [
|
|
|
445
445
|
id: 'desktop-shortcut',
|
|
446
446
|
content: async ctx => {
|
|
447
447
|
const blue = color('suggestion', ctx.theme)
|
|
448
|
-
return `Continue your session in
|
|
448
|
+
return `Continue your session in Xela Desktop with ${blue('/desktop')}`
|
|
449
449
|
},
|
|
450
450
|
cooldownSessions: 15,
|
|
451
451
|
isRelevant: async () => {
|
|
@@ -466,7 +466,7 @@ const externalTips: Tip[] = [
|
|
|
466
466
|
{
|
|
467
467
|
id: 'mobile-app',
|
|
468
468
|
content: async () =>
|
|
469
|
-
'/mobile to use
|
|
469
|
+
'/mobile to use Xela from the app on your phone',
|
|
470
470
|
cooldownSessions: 15,
|
|
471
471
|
isRelevant: async () => true,
|
|
472
472
|
},
|
|
@@ -593,7 +593,7 @@ const externalTips: Tip[] = [
|
|
|
593
593
|
const claude = color('claude', ctx.theme)
|
|
594
594
|
const reward = getCachedReferrerReward()
|
|
595
595
|
return reward
|
|
596
|
-
? `Share
|
|
596
|
+
? `Share Xela and earn ${claude(formatCreditAmount(reward))} of extra usage · ${claude('/passes')}`
|
|
597
597
|
: `You have free guest passes to share · ${claude('/passes')}`
|
|
598
598
|
},
|
|
599
599
|
cooldownSessions: 3,
|
|
@@ -20,7 +20,7 @@ import { makeSecondaryModelPrompt } from './prompt.js'
|
|
|
20
20
|
// Custom error classes for domain blocking
|
|
21
21
|
class DomainBlockedError extends Error {
|
|
22
22
|
constructor(domain: string) {
|
|
23
|
-
super(`
|
|
23
|
+
super(`Xela is unable to fetch from ${domain}`)
|
|
24
24
|
this.name = 'DomainBlockedError'
|
|
25
25
|
}
|
|
26
26
|
}
|
package/src/utils/git.ts
CHANGED
|
@@ -429,7 +429,7 @@ export const getWorktreeCount = async (): Promise<number> => {
|
|
|
429
429
|
export const stashToCleanState = async (message?: string): Promise<boolean> => {
|
|
430
430
|
try {
|
|
431
431
|
const stashMessage =
|
|
432
|
-
message || `
|
|
432
|
+
message || `Xela auto-stash - ${new Date().toISOString()}`
|
|
433
433
|
|
|
434
434
|
// First, check if we have untracked files
|
|
435
435
|
const { untracked } = await getFileStatus()
|
package/src/utils/theme.ts
CHANGED
|
@@ -115,10 +115,10 @@ export type ThemeSetting = (typeof THEME_SETTINGS)[number]
|
|
|
115
115
|
const lightTheme: Theme = {
|
|
116
116
|
autoAccept: 'rgb(135,0,255)', // Electric violet
|
|
117
117
|
bashBorder: 'rgb(255,0,135)', // Vibrant pink
|
|
118
|
-
claude: 'rgb(
|
|
119
|
-
claudeShimmer: 'rgb(
|
|
120
|
-
claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(
|
|
121
|
-
claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(
|
|
118
|
+
claude: 'rgb(0,200,180)', // Xela teal
|
|
119
|
+
claudeShimmer: 'rgb(50,230,210)', // Lighter teal for shimmer effect
|
|
120
|
+
claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(0,180,200)', // Cyan-teal for system spinner
|
|
121
|
+
claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(50,210,230)', // Lighter cyan-teal for spinner shimmer
|
|
122
122
|
permission: 'rgb(87,105,247)', // Medium blue
|
|
123
123
|
permissionShimmer: 'rgb(137,155,255)', // Lighter blue for shimmer effect
|
|
124
124
|
planMode: 'rgb(0,102,102)', // Muted teal
|
|
@@ -158,7 +158,7 @@ const lightTheme: Theme = {
|
|
|
158
158
|
// Chrome colors
|
|
159
159
|
chromeYellow: 'rgb(251,188,4)', // Chrome yellow
|
|
160
160
|
// TUI V2 colors
|
|
161
|
-
clawd_body: 'rgb(
|
|
161
|
+
clawd_body: 'rgb(0,200,180)',
|
|
162
162
|
clawd_background: 'rgb(0,0,0)',
|
|
163
163
|
userMessageBackground: 'rgb(240, 240, 240)', // Slightly darker grey for optimal contrast
|
|
164
164
|
userMessageBackgroundHover: 'rgb(252, 252, 252)', // ≥250 to quantize distinct from base at 256-color level
|
|
@@ -173,7 +173,7 @@ const lightTheme: Theme = {
|
|
|
173
173
|
fastModeShimmer: 'rgb(255,150,50)', // Lighter orange for shimmer
|
|
174
174
|
// Brief/assistant mode
|
|
175
175
|
briefLabelYou: 'rgb(37,99,235)', // Blue
|
|
176
|
-
briefLabelClaude: 'rgb(
|
|
176
|
+
briefLabelClaude: 'rgb(0,200,180)', // Xela teal
|
|
177
177
|
rainbow_red: 'rgb(235,95,87)',
|
|
178
178
|
rainbow_orange: 'rgb(245,139,87)',
|
|
179
179
|
rainbow_yellow: 'rgb(250,195,95)',
|
|
@@ -197,8 +197,8 @@ const lightTheme: Theme = {
|
|
|
197
197
|
const lightAnsiTheme: Theme = {
|
|
198
198
|
autoAccept: 'ansi:magenta',
|
|
199
199
|
bashBorder: 'ansi:magenta',
|
|
200
|
-
claude: 'ansi:
|
|
201
|
-
claudeShimmer: 'ansi:
|
|
200
|
+
claude: 'ansi:cyanBright',
|
|
201
|
+
claudeShimmer: 'ansi:cyan',
|
|
202
202
|
claudeBlue_FOR_SYSTEM_SPINNER: 'ansi:blue',
|
|
203
203
|
claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'ansi:blueBright',
|
|
204
204
|
permission: 'ansi:blue',
|
|
@@ -240,7 +240,7 @@ const lightAnsiTheme: Theme = {
|
|
|
240
240
|
// Chrome colors
|
|
241
241
|
chromeYellow: 'ansi:yellow', // Chrome yellow
|
|
242
242
|
// TUI V2 colors
|
|
243
|
-
clawd_body: 'ansi:
|
|
243
|
+
clawd_body: 'ansi:cyanBright',
|
|
244
244
|
clawd_background: 'ansi:black',
|
|
245
245
|
userMessageBackground: 'ansi:white',
|
|
246
246
|
userMessageBackgroundHover: 'ansi:whiteBright',
|
|
@@ -254,7 +254,7 @@ const lightAnsiTheme: Theme = {
|
|
|
254
254
|
fastMode: 'ansi:red',
|
|
255
255
|
fastModeShimmer: 'ansi:redBright',
|
|
256
256
|
briefLabelYou: 'ansi:blue',
|
|
257
|
-
briefLabelClaude: 'ansi:
|
|
257
|
+
briefLabelClaude: 'ansi:cyanBright',
|
|
258
258
|
rainbow_red: 'ansi:red',
|
|
259
259
|
rainbow_orange: 'ansi:redBright',
|
|
260
260
|
rainbow_yellow: 'ansi:yellow',
|
|
@@ -278,8 +278,8 @@ const lightAnsiTheme: Theme = {
|
|
|
278
278
|
const darkAnsiTheme: Theme = {
|
|
279
279
|
autoAccept: 'ansi:magentaBright',
|
|
280
280
|
bashBorder: 'ansi:magentaBright',
|
|
281
|
-
claude: 'ansi:
|
|
282
|
-
claudeShimmer: 'ansi:
|
|
281
|
+
claude: 'ansi:cyanBright',
|
|
282
|
+
claudeShimmer: 'ansi:cyan',
|
|
283
283
|
claudeBlue_FOR_SYSTEM_SPINNER: 'ansi:blueBright',
|
|
284
284
|
claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'ansi:blueBright',
|
|
285
285
|
permission: 'ansi:blueBright',
|
|
@@ -321,7 +321,7 @@ const darkAnsiTheme: Theme = {
|
|
|
321
321
|
// Chrome colors
|
|
322
322
|
chromeYellow: 'ansi:yellowBright', // Chrome yellow
|
|
323
323
|
// TUI V2 colors
|
|
324
|
-
clawd_body: 'ansi:
|
|
324
|
+
clawd_body: 'ansi:cyanBright',
|
|
325
325
|
clawd_background: 'ansi:black',
|
|
326
326
|
userMessageBackground: 'ansi:blackBright',
|
|
327
327
|
userMessageBackgroundHover: 'ansi:white',
|
|
@@ -335,7 +335,7 @@ const darkAnsiTheme: Theme = {
|
|
|
335
335
|
fastMode: 'ansi:redBright',
|
|
336
336
|
fastModeShimmer: 'ansi:redBright',
|
|
337
337
|
briefLabelYou: 'ansi:blueBright',
|
|
338
|
-
briefLabelClaude: 'ansi:
|
|
338
|
+
briefLabelClaude: 'ansi:cyanBright',
|
|
339
339
|
rainbow_red: 'ansi:red',
|
|
340
340
|
rainbow_orange: 'ansi:redBright',
|
|
341
341
|
rainbow_yellow: 'ansi:yellow',
|
|
@@ -359,8 +359,8 @@ const darkAnsiTheme: Theme = {
|
|
|
359
359
|
const lightDaltonizedTheme: Theme = {
|
|
360
360
|
autoAccept: 'rgb(135,0,255)', // Electric violet
|
|
361
361
|
bashBorder: 'rgb(0,102,204)', // Blue instead of pink
|
|
362
|
-
claude: 'rgb(
|
|
363
|
-
claudeShimmer: 'rgb(
|
|
362
|
+
claude: 'rgb(0,200,180)', // Xela teal
|
|
363
|
+
claudeShimmer: 'rgb(50,230,210)', // Lighter teal for shimmer effect
|
|
364
364
|
claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(51,102,255)', // Bright blue for system spinner
|
|
365
365
|
claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(101,152,255)', // Lighter bright blue for system spinner shimmer
|
|
366
366
|
permission: 'rgb(51,102,255)', // Bright blue
|
|
@@ -402,7 +402,7 @@ const lightDaltonizedTheme: Theme = {
|
|
|
402
402
|
// Chrome colors
|
|
403
403
|
chromeYellow: 'rgb(251,188,4)', // Chrome yellow
|
|
404
404
|
// TUI V2 colors
|
|
405
|
-
clawd_body: 'rgb(
|
|
405
|
+
clawd_body: 'rgb(0,200,180)',
|
|
406
406
|
clawd_background: 'rgb(0,0,0)',
|
|
407
407
|
userMessageBackground: 'rgb(220, 220, 220)', // Slightly darker grey for optimal contrast
|
|
408
408
|
userMessageBackgroundHover: 'rgb(232, 232, 232)', // ≥230 to quantize distinct from base at 256-color level
|
|
@@ -416,7 +416,7 @@ const lightDaltonizedTheme: Theme = {
|
|
|
416
416
|
fastMode: 'rgb(255,106,0)', // Electric orange (color-blind safe)
|
|
417
417
|
fastModeShimmer: 'rgb(255,150,50)', // Lighter orange for shimmer
|
|
418
418
|
briefLabelYou: 'rgb(37,99,235)', // Blue
|
|
419
|
-
briefLabelClaude: 'rgb(
|
|
419
|
+
briefLabelClaude: 'rgb(0,200,180)', // Xela teal
|
|
420
420
|
rainbow_red: 'rgb(235,95,87)',
|
|
421
421
|
rainbow_orange: 'rgb(245,139,87)',
|
|
422
422
|
rainbow_yellow: 'rgb(250,195,95)',
|
|
@@ -440,10 +440,10 @@ const lightDaltonizedTheme: Theme = {
|
|
|
440
440
|
const darkTheme: Theme = {
|
|
441
441
|
autoAccept: 'rgb(175,135,255)', // Electric violet
|
|
442
442
|
bashBorder: 'rgb(253,93,177)', // Bright pink
|
|
443
|
-
claude: 'rgb(
|
|
444
|
-
claudeShimmer: 'rgb(
|
|
445
|
-
claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(
|
|
446
|
-
claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(
|
|
443
|
+
claude: 'rgb(0,220,200)', // Xela teal (brighter for dark bg)
|
|
444
|
+
claudeShimmer: 'rgb(50,250,230)', // Lighter teal for shimmer
|
|
445
|
+
claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(0,200,220)', // Cyan-teal for spinner
|
|
446
|
+
claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(50,230,250)', // Lighter cyan-teal for spinner shimmer
|
|
447
447
|
permission: 'rgb(177,185,249)', // Light blue-purple
|
|
448
448
|
permissionShimmer: 'rgb(207,215,255)', // Lighter blue-purple for shimmer
|
|
449
449
|
planMode: 'rgb(72,150,140)', // Muted sage green
|
|
@@ -483,7 +483,7 @@ const darkTheme: Theme = {
|
|
|
483
483
|
// Chrome colors
|
|
484
484
|
chromeYellow: 'rgb(251,188,4)', // Chrome yellow
|
|
485
485
|
// TUI V2 colors
|
|
486
|
-
clawd_body: 'rgb(
|
|
486
|
+
clawd_body: 'rgb(0,200,180)',
|
|
487
487
|
clawd_background: 'rgb(0,0,0)',
|
|
488
488
|
userMessageBackground: 'rgb(55, 55, 55)', // Lighter grey for better visual contrast
|
|
489
489
|
userMessageBackgroundHover: 'rgb(70, 70, 70)',
|
|
@@ -497,7 +497,7 @@ const darkTheme: Theme = {
|
|
|
497
497
|
fastMode: 'rgb(255,120,20)', // Electric orange for dark bg
|
|
498
498
|
fastModeShimmer: 'rgb(255,165,70)', // Lighter orange for shimmer
|
|
499
499
|
briefLabelYou: 'rgb(122,180,232)', // Light blue
|
|
500
|
-
briefLabelClaude: 'rgb(
|
|
500
|
+
briefLabelClaude: 'rgb(0,220,200)', // Xela teal
|
|
501
501
|
rainbow_red: 'rgb(235,95,87)',
|
|
502
502
|
rainbow_orange: 'rgb(245,139,87)',
|
|
503
503
|
rainbow_yellow: 'rgb(250,195,95)',
|
|
@@ -521,8 +521,8 @@ const darkTheme: Theme = {
|
|
|
521
521
|
const darkDaltonizedTheme: Theme = {
|
|
522
522
|
autoAccept: 'rgb(175,135,255)', // Electric violet
|
|
523
523
|
bashBorder: 'rgb(51,153,255)', // Bright blue
|
|
524
|
-
claude: 'rgb(
|
|
525
|
-
claudeShimmer: 'rgb(
|
|
524
|
+
claude: 'rgb(0,200,180)', // Xela teal
|
|
525
|
+
claudeShimmer: 'rgb(50,230,210)', // Lighter teal for shimmer effect
|
|
526
526
|
claudeBlue_FOR_SYSTEM_SPINNER: 'rgb(153,204,255)', // Light blue for system spinner
|
|
527
527
|
claudeBlueShimmer_FOR_SYSTEM_SPINNER: 'rgb(183,224,255)', // Lighter blue for system spinner shimmer
|
|
528
528
|
permission: 'rgb(153,204,255)', // Light blue
|
|
@@ -564,7 +564,7 @@ const darkDaltonizedTheme: Theme = {
|
|
|
564
564
|
// Chrome colors
|
|
565
565
|
chromeYellow: 'rgb(251,188,4)', // Chrome yellow
|
|
566
566
|
// TUI V2 colors
|
|
567
|
-
clawd_body: 'rgb(
|
|
567
|
+
clawd_body: 'rgb(0,200,180)',
|
|
568
568
|
clawd_background: 'rgb(0,0,0)',
|
|
569
569
|
userMessageBackground: 'rgb(55, 55, 55)', // Lighter grey for better visual contrast
|
|
570
570
|
userMessageBackgroundHover: 'rgb(70, 70, 70)',
|
|
@@ -578,7 +578,7 @@ const darkDaltonizedTheme: Theme = {
|
|
|
578
578
|
fastMode: 'rgb(255,120,20)', // Electric orange for dark bg (color-blind safe)
|
|
579
579
|
fastModeShimmer: 'rgb(255,165,70)', // Lighter orange for shimmer
|
|
580
580
|
briefLabelYou: 'rgb(122,180,232)', // Light blue
|
|
581
|
-
briefLabelClaude: 'rgb(
|
|
581
|
+
briefLabelClaude: 'rgb(0,200,180)', // Xela teal
|
|
582
582
|
rainbow_red: 'rgb(235,95,87)',
|
|
583
583
|
rainbow_orange: 'rgb(245,139,87)',
|
|
584
584
|
rainbow_yellow: 'rgb(250,195,95)',
|