zelari-code 1.8.2 → 1.9.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +13 -0
- package/dist/cli/app.js +17 -34
- package/dist/cli/app.js.map +1 -1
- package/dist/cli/components/Sidebar.js +49 -31
- package/dist/cli/components/Sidebar.js.map +1 -1
- package/dist/cli/components/StartupBanner.js +28 -0
- package/dist/cli/components/StartupBanner.js.map +1 -0
- package/dist/cli/components/StatusBar.js +1 -7
- package/dist/cli/components/StatusBar.js.map +1 -1
- package/dist/cli/desktopConfig.js +281 -0
- package/dist/cli/desktopConfig.js.map +1 -0
- package/dist/cli/headless.js +62 -5
- package/dist/cli/headless.js.map +1 -1
- package/dist/cli/hooks/chatStats.js +7 -0
- package/dist/cli/hooks/chatStats.js.map +1 -1
- package/dist/cli/hooks/useChatTurn.js +14 -3
- package/dist/cli/hooks/useChatTurn.js.map +1 -1
- package/dist/cli/main.bundled.js +880 -229
- package/dist/cli/main.bundled.js.map +4 -4
- package/dist/cli/main.js +132 -5
- package/dist/cli/main.js.map +1 -1
- package/dist/cli/runHeadless.js +184 -44
- package/dist/cli/runHeadless.js.map +1 -1
- package/package.json +5 -2
package/README.md
CHANGED
|
@@ -68,6 +68,19 @@ npm install -g zelari-code
|
|
|
68
68
|
zelari-code
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
+
### Optional: Zelari Desktop (Tauri)
|
|
72
|
+
|
|
73
|
+
An installable GUI shell lives in `apps/desktop/`. It does **not** replace the CLI — it streams `zelari-code --headless` into a modern chat UI. GitHub Releases attach platform installers on each `v*` tag.
|
|
74
|
+
|
|
75
|
+
```bash
|
|
76
|
+
npm run build # CLI side-car
|
|
77
|
+
npm run desktop:install
|
|
78
|
+
npm run desktop:dev # Tauri dev window
|
|
79
|
+
# npm run desktop:build # MSI / NSIS / DMG / AppImage
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
See [apps/desktop/README.md](./apps/desktop/README.md). Requires Rust + Node ≥ 20.
|
|
83
|
+
|
|
71
84
|
**Prerequisites:**
|
|
72
85
|
- **Node.js ≥ 20** — required. Without it the agent cannot run `npm`/`tsc`/builds, so zelari-code refuses to boot.
|
|
73
86
|
- **Git** — recommended. Without it, `/diff`, `/undo` and the git sidebar are disabled. Install from <https://git-scm.com>.
|
package/dist/cli/app.js
CHANGED
|
@@ -2,14 +2,14 @@
|
|
|
2
2
|
// the v3-N monolithic app. Behavior is correct; a future pass will tighten the
|
|
3
3
|
// hook signatures and remove this annotation. The split is documented in
|
|
4
4
|
// `docs/plans/2026-07-01-app-split.md`.
|
|
5
|
-
import React, { useState, useMemo, useCallback, useEffect
|
|
5
|
+
import React, { useState, useMemo, useCallback, useEffect } from 'react';
|
|
6
6
|
import { Box, Static, useInput, useStdin } from 'ink';
|
|
7
7
|
import { InputBar } from './components/InputBar.js';
|
|
8
8
|
import { LiveRegion } from './components/LiveRegion.js';
|
|
9
9
|
import { StatusBar } from './components/StatusBar.js';
|
|
10
10
|
import { SelectList } from './components/SelectList.js';
|
|
11
11
|
import { Sidebar, sidebarVisibility } from './components/Sidebar.js';
|
|
12
|
-
import {
|
|
12
|
+
import { StartupBanner } from './components/StartupBanner.js';
|
|
13
13
|
import { discoverModelsInBackground, isModelsCacheStale } from './modelDiscovery.js';
|
|
14
14
|
import { renderMessage } from './components/ChatStream.js';
|
|
15
15
|
import { listCodingSkills } from '@zelari/core/skills';
|
|
@@ -64,7 +64,12 @@ export function App() {
|
|
|
64
64
|
const [input, setInput] = useState('');
|
|
65
65
|
const [busy, setBusy] = useState(false);
|
|
66
66
|
const [providerConfig, setProviderConfig] = useState(() => getProviderConfig());
|
|
67
|
-
const [sessionStats, setSessionStats] = useState({
|
|
67
|
+
const [sessionStats, setSessionStats] = useState({
|
|
68
|
+
totalTokens: 0,
|
|
69
|
+
totalCostUsd: 0,
|
|
70
|
+
cachedTokens: 0,
|
|
71
|
+
contextTokens: 0,
|
|
72
|
+
});
|
|
68
73
|
// v0.7.0: bump on /clear to remount <Static> (resets its internal "already
|
|
69
74
|
// printed" index so the ANSI-cleared scrollback stays in sync). Also bumped
|
|
70
75
|
// implicitly by a sessionId change (/new).
|
|
@@ -194,35 +199,16 @@ export function App() {
|
|
|
194
199
|
}
|
|
195
200
|
setPicker(null);
|
|
196
201
|
}, [picker]);
|
|
197
|
-
//
|
|
198
|
-
//
|
|
199
|
-
// Ink's dynamic region reflow, corrupts native scrollback on Windows.
|
|
200
|
-
const bannerColsRef = useRef(null);
|
|
201
|
-
if (bannerColsRef.current === null) {
|
|
202
|
-
bannerColsRef.current = size.columns > 0 ? size.columns : 80;
|
|
203
|
-
}
|
|
204
|
-
// The one-shot banner: printed once as the first Static item. v1.8.x:
|
|
205
|
-
// ASCII logo restored, right-aligned at the TOP of the scrollback (only
|
|
206
|
-
// place a multi-line mark can sit "top-right" under static-scrollback).
|
|
202
|
+
// One-shot brand header (ASCII logo via Ink columns — not space-padded text).
|
|
203
|
+
// Marker message content is unused; Static renders StartupBanner for this id.
|
|
207
204
|
const banner = useMemo(() => {
|
|
208
|
-
const cols = bannerColsRef.current ?? 80;
|
|
209
|
-
const content = formatBannerWithLogoRight({
|
|
210
|
-
leftLines: [
|
|
211
|
-
`zelari-code · ${activeProviderSpec.id}/${activeModel}`,
|
|
212
|
-
`cwd: ${cwd}`,
|
|
213
|
-
`/help · /plan · /build · /view-plan · shift+tab mode`,
|
|
214
|
-
],
|
|
215
|
-
version: VERSION,
|
|
216
|
-
columns: cols,
|
|
217
|
-
compact: cols < 72,
|
|
218
|
-
});
|
|
219
205
|
return {
|
|
220
206
|
id: 'banner-once',
|
|
221
207
|
role: 'system',
|
|
222
208
|
ts: 0,
|
|
223
|
-
content,
|
|
209
|
+
content: '',
|
|
224
210
|
};
|
|
225
|
-
}, [
|
|
211
|
+
}, []);
|
|
226
212
|
// Sidebar visibility with hysteresis — avoid flapping at the 96-col edge.
|
|
227
213
|
const [sidebarOpen, setSidebarOpen] = useState(false);
|
|
228
214
|
useEffect(() => {
|
|
@@ -241,16 +227,13 @@ export function App() {
|
|
|
241
227
|
const staticItems = session.sessionId
|
|
242
228
|
? [banner, ...session.messages]
|
|
243
229
|
: [];
|
|
244
|
-
// Cap dynamic-region height so Ink never clear-screens on resize.
|
|
245
|
-
// Live + input + status ≈ 14 lines max; leave the rest to native scrollback.
|
|
246
|
-
const dynamicMaxRows = Math.max(8, Math.min(18, size.rows - 2));
|
|
247
230
|
return (React.createElement(React.Fragment, null,
|
|
248
|
-
React.createElement(Static, { key: staticKey, items: staticItems }, (item) => renderMessage(item)),
|
|
249
|
-
React.createElement(Box, { flexDirection: "row"
|
|
250
|
-
React.createElement(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1
|
|
231
|
+
React.createElement(Static, { key: staticKey, items: staticItems }, (item) => item.id === 'banner-once' ? (React.createElement(StartupBanner, { key: item.id, version: VERSION, providerId: activeProviderSpec.id, model: activeModel, cwd: cwd, columns: size.columns || 80, rows: size.rows || 24 })) : (renderMessage(item))),
|
|
232
|
+
React.createElement(Box, { flexDirection: "row" },
|
|
233
|
+
React.createElement(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1 },
|
|
251
234
|
React.createElement(LiveRegion, { live: session.live, busy: busy, elapsedMs: timer.elapsedMs }),
|
|
252
|
-
picker ? (React.createElement(SelectList, { title: picker.title, items: picker.items, onSelect: onPickerSelect, onCancel: onPickerCancel, maxVisible: Math.max(
|
|
253
|
-
React.createElement(StatusBar, { model: activeModel, provider: activeProviderSpec.id, sessionId: session.sessionId ? session.sessionId.slice(0, 8) : '...', sessionActive: session.sessionActive, queueCount: chatTurn.queueCount, busy: busy, mode: mode, phase: phase, cwd: cwd, elapsedMs: timer.elapsedMs, lastMs: timer.lastMs, costUsd: sessionStats.totalCostUsd, cachedTokens: sessionStats.cachedTokens, contextUsed: sessionStats.
|
|
235
|
+
picker ? (React.createElement(SelectList, { title: picker.title, items: picker.items, onSelect: onPickerSelect, onCancel: onPickerCancel, maxVisible: Math.max(4, Math.min(10, size.rows - 10)) })) : (React.createElement(InputBar, { value: input, onChange: setInput, onSubmit: handleSubmit, disabled: busy })),
|
|
236
|
+
React.createElement(StatusBar, { model: activeModel, provider: activeProviderSpec.id, sessionId: session.sessionId ? session.sessionId.slice(0, 8) : '...', sessionActive: session.sessionActive, queueCount: chatTurn.queueCount, busy: busy, mode: mode, phase: phase, cwd: cwd, elapsedMs: timer.elapsedMs, lastMs: timer.lastMs, costUsd: sessionStats.totalCostUsd, cachedTokens: sessionStats.cachedTokens, contextUsed: sessionStats.contextTokens || 0, contextLimit: Number(process.env.ZELARI_CONTEXT_LIMIT) || 200_000 })),
|
|
254
237
|
sidebarOpen && (React.createElement(Sidebar, { version: VERSION, changes: gitChanges, rows: size.rows })))));
|
|
255
238
|
}
|
|
256
239
|
// Re-export so legacy imports keep working (Task v0.4.2 audit split).
|
package/dist/cli/app.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.tsx"],"names":[],"mappings":"AAAA,iFAAiF;AACjF,+EAA+E;AAC/E,yEAAyE;AACzE,wCAAwC;AACxC,OAAO,KAAK,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/cli/app.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1,37 +1,48 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
import { Box, Text } from 'ink';
|
|
3
|
+
import { BRAND_LOGO_COMPACT } from './brandArt.js';
|
|
4
|
+
/**
|
|
5
|
+
* Dense Braille emblem (v1.6.0). Shown when the terminal is tall enough
|
|
6
|
+
* AND when ZELARI_ASCII_LOGO is not set. Many Windows fonts render Braille
|
|
7
|
+
* as blank — ASCII compact is the reliable default on short panes.
|
|
8
|
+
*/
|
|
9
|
+
const EMBLEM_BRAILLE = `⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⣿⣷⣆⡀
|
|
10
|
+
⠀⠀⠀⠀⠀⠀⠀⢀⣶⣿⣿⣿⣿⣿⣿⣦⡀
|
|
11
|
+
⠀⠀⠀⠀⠀⠀⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣦
|
|
12
|
+
⠀⠀⠀⠀⢠⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣷⡄
|
|
13
|
+
⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⣿⠙⠻⣿⣿⣿⣿⣿⣿⠆
|
|
14
|
+
⠀⠀⠀⠀⣈⣿⣿⣿⣿⣿⣿⣿⠀⣷⣬⡛⢿⣿⣟⣁
|
|
15
|
+
⠀⢀⣴⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⡿⢿⡿⢃⣈⣻⣿⣿⣶
|
|
16
|
+
⠀⣼⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣠⣴⣆⠻⠎⢿⣿⣿⣿⣿⣧
|
|
17
|
+
⣰⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡇`;
|
|
3
18
|
/** Column width of the sidebar (border + padding included). */
|
|
4
19
|
export const SIDEBAR_WIDTH = 28;
|
|
5
20
|
/** Sidebar only renders on terminals at least this wide. */
|
|
6
21
|
export const SIDEBAR_MIN_COLUMNS = 96;
|
|
7
22
|
/**
|
|
8
|
-
* Hysteresis floor: once visible, stay visible until width drops below this
|
|
9
|
-
*
|
|
10
|
-
* (each toggle reflows the dynamic region and can trash Static scrollback).
|
|
23
|
+
* Hysteresis floor: once visible, stay visible until width drops below this
|
|
24
|
+
* (resize thrash protection, v1.8.1+).
|
|
11
25
|
*/
|
|
12
26
|
export const SIDEBAR_HIDE_COLUMNS = 88;
|
|
13
27
|
/** Min rows to show; hide below this. */
|
|
14
28
|
export const SIDEBAR_MIN_ROWS = 16;
|
|
15
29
|
export const SIDEBAR_HIDE_ROWS = 14;
|
|
30
|
+
/** Prefer Braille only on tall terminals (matches v1.6.0 density). */
|
|
31
|
+
const BRAILLE_MIN_ROWS = 28;
|
|
16
32
|
/** Max file rows before collapsing to "+N more". */
|
|
17
|
-
const MAX_FILES_SHORT =
|
|
18
|
-
const MAX_FILES_TALL =
|
|
19
|
-
/** Absolute cap: sidebar chrome + files must stay short vs terminal rows. */
|
|
20
|
-
const SIDEBAR_CHROME_LINES = 4;
|
|
33
|
+
const MAX_FILES_SHORT = 6;
|
|
34
|
+
const MAX_FILES_TALL = 10;
|
|
21
35
|
/**
|
|
22
36
|
* Pure helper: should the sidebar render at all? It lives in the dynamic
|
|
23
37
|
* region (Ink repaints it), so it must never make that region taller than
|
|
24
38
|
* the terminal — narrow or tiny panes skip it entirely.
|
|
25
|
-
*
|
|
26
|
-
* Prefer {@link sidebarVisibility} when you have the previous visibility
|
|
27
|
-
* (hysteresis). This boolean form is the strict "enter" threshold.
|
|
28
39
|
*/
|
|
29
40
|
export function shouldShowSidebar(columns, rows) {
|
|
30
41
|
return columns >= SIDEBAR_MIN_COLUMNS && rows >= SIDEBAR_MIN_ROWS;
|
|
31
42
|
}
|
|
32
43
|
/**
|
|
33
44
|
* Hysteresis visibility: once shown, requires a clearer "leave" signal
|
|
34
|
-
*
|
|
45
|
+
* before hiding — stops resize-edge flicker.
|
|
35
46
|
*/
|
|
36
47
|
export function sidebarVisibility(columns, rows, currentlyVisible) {
|
|
37
48
|
if (currentlyVisible) {
|
|
@@ -39,39 +50,46 @@ export function sidebarVisibility(columns, rows, currentlyVisible) {
|
|
|
39
50
|
}
|
|
40
51
|
return shouldShowSidebar(columns, rows);
|
|
41
52
|
}
|
|
42
|
-
/** How many file rows fit without blowing the dynamic-region budget. */
|
|
43
|
-
export function maxSidebarFiles(rows) {
|
|
44
|
-
// Reserve room for LiveRegion (~12) + input + status + chrome.
|
|
45
|
-
const budget = Math.max(2, rows - 14 - SIDEBAR_CHROME_LINES);
|
|
46
|
-
const cap = rows >= 28 ? MAX_FILES_TALL : MAX_FILES_SHORT;
|
|
47
|
-
return Math.min(cap, budget);
|
|
48
|
-
}
|
|
49
53
|
/** Truncate a repo-relative path to `max` chars keeping the tail (filename). */
|
|
50
54
|
export function truncatePath(p, max) {
|
|
51
55
|
if (p.length <= max)
|
|
52
56
|
return p;
|
|
53
57
|
return `…${p.slice(-(max - 1))}`;
|
|
54
58
|
}
|
|
59
|
+
function preferAsciiLogo() {
|
|
60
|
+
// Explicit override, or default to ASCII on Windows where Braille often
|
|
61
|
+
// renders as empty cells in default console fonts.
|
|
62
|
+
if (process.env.ZELARI_ASCII_LOGO === '1')
|
|
63
|
+
return true;
|
|
64
|
+
if (process.env.ZELARI_ASCII_LOGO === '0')
|
|
65
|
+
return false;
|
|
66
|
+
return process.platform === 'win32';
|
|
67
|
+
}
|
|
55
68
|
/**
|
|
56
|
-
* Sidebar — right-hand column of the dynamic region
|
|
69
|
+
* Sidebar — right-hand column of the dynamic region.
|
|
57
70
|
*
|
|
58
|
-
*
|
|
59
|
-
*
|
|
60
|
-
*
|
|
71
|
+
* Always shows a visible emblem (ASCII compact by default on Windows /
|
|
72
|
+
* short terminals; Braille on tall non-Windows when not forced to ASCII),
|
|
73
|
+
* the wordmark + version, and git working-tree changes.
|
|
61
74
|
*/
|
|
62
75
|
export function Sidebar({ version, changes, rows }) {
|
|
63
|
-
|
|
64
|
-
const
|
|
76
|
+
const useBraille = !preferAsciiLogo() && rows >= BRAILLE_MIN_ROWS;
|
|
77
|
+
const logoLines = useBraille
|
|
78
|
+
? EMBLEM_BRAILLE.split('\n')
|
|
79
|
+
: BRAND_LOGO_COMPACT.split('\n');
|
|
80
|
+
const maxFiles = rows >= BRAILLE_MIN_ROWS + 8 ? MAX_FILES_TALL : MAX_FILES_SHORT;
|
|
65
81
|
const visible = changes.files.slice(0, maxFiles);
|
|
66
82
|
const hidden = changes.files.length - visible.length;
|
|
67
|
-
// Width available for the path inside the box: total − border(2) − padding(2)
|
|
68
|
-
// − the " +NNN -NNN" tail (~11 chars).
|
|
69
83
|
const innerWidth = SIDEBAR_WIDTH - 4;
|
|
70
|
-
return (React.createElement(Box, { flexDirection: "column", width: SIDEBAR_WIDTH, borderStyle: "single", borderColor: "gray", paddingX: 1, flexShrink: 0,
|
|
71
|
-
|
|
72
|
-
|
|
84
|
+
return (React.createElement(Box, { flexDirection: "column", width: SIDEBAR_WIDTH, borderStyle: "single", borderColor: "gray", paddingX: 1, flexShrink: 0 },
|
|
85
|
+
React.createElement(Box, { flexDirection: "column", alignItems: "center" }, logoLines.map((line, i) => (React.createElement(Text, { key: i, color: "cyan" }, line)))),
|
|
86
|
+
React.createElement(Box, { justifyContent: "center" },
|
|
87
|
+
React.createElement(Text, { bold: true, color: "white" }, "ZELARI CODE")),
|
|
73
88
|
React.createElement(Box, { justifyContent: "center" },
|
|
74
|
-
React.createElement(Text, { dimColor: true },
|
|
89
|
+
React.createElement(Text, { dimColor: true },
|
|
90
|
+
"v",
|
|
91
|
+
version,
|
|
92
|
+
changes.branch ? ` · ${truncatePath(changes.branch, 12)}` : '')),
|
|
75
93
|
React.createElement(Text, { dimColor: true }, '─'.repeat(innerWidth)),
|
|
76
94
|
!changes.isRepo ? (React.createElement(Text, { dimColor: true, italic: true }, "not a git repo")) : changes.files.length === 0 ? (React.createElement(Text, { dimColor: true, italic: true }, "no changes")) : (React.createElement(React.Fragment, null,
|
|
77
95
|
React.createElement(Text, { dimColor: true },
|
|
@@ -84,7 +102,7 @@ export function Sidebar({ version, changes, rows }) {
|
|
|
84
102
|
hidden,
|
|
85
103
|
" more\u2026")))));
|
|
86
104
|
}
|
|
87
|
-
function FileRow({ file, pathWidth }) {
|
|
105
|
+
function FileRow({ file, pathWidth, }) {
|
|
88
106
|
const name = truncatePath(file.path, Math.max(6, pathWidth));
|
|
89
107
|
return (React.createElement(Box, null,
|
|
90
108
|
React.createElement(Text, { wrap: "truncate" },
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/cli/components/Sidebar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;
|
|
1
|
+
{"version":3,"file":"Sidebar.js","sourceRoot":"","sources":["../../../src/cli/components/Sidebar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* StartupBanner — one-shot brand header for the Static scrollback region.
|
|
3
|
+
*
|
|
4
|
+
* Uses Ink flex layout (two columns) instead of space-padding a single string.
|
|
5
|
+
* Space-padded banners collapse in many terminals / Ink Text and leave a
|
|
6
|
+
* mangled logo on the left (see Windows repro 2026-07-10).
|
|
7
|
+
*/
|
|
8
|
+
import React from 'react';
|
|
9
|
+
import { Box, Text } from 'ink';
|
|
10
|
+
import { BRAND_LOGO_ASCII, BRAND_LOGO_COMPACT } from './brandArt.js';
|
|
11
|
+
export function StartupBanner({ version, providerId, model, cwd, columns, rows, }) {
|
|
12
|
+
const compact = columns < 72 || rows < 20;
|
|
13
|
+
const logo = (compact ? BRAND_LOGO_COMPACT : BRAND_LOGO_ASCII).split('\n');
|
|
14
|
+
const leftLines = [
|
|
15
|
+
`zelari-code v${version} — ${providerId}/${model}`,
|
|
16
|
+
`cwd: ${cwd}`,
|
|
17
|
+
`/help · /plan · /build · /view-plan · shift+tab mode`,
|
|
18
|
+
];
|
|
19
|
+
return (React.createElement(Box, { flexDirection: "row", justifyContent: "space-between", marginBottom: 1, width: "100%" },
|
|
20
|
+
React.createElement(Box, { flexDirection: "column", flexGrow: 1, marginRight: 2 }, leftLines.map((line, i) => (React.createElement(Text, { key: i, color: i === 0 ? 'cyan' : undefined, dimColor: i > 0 }, line)))),
|
|
21
|
+
React.createElement(Box, { flexDirection: "column", flexShrink: 0, alignItems: "flex-end" },
|
|
22
|
+
logo.map((line, i) => (React.createElement(Text, { key: i, color: "cyan" }, line))),
|
|
23
|
+
React.createElement(Text, { bold: true, color: "white" }, "ZELARI CODE"),
|
|
24
|
+
React.createElement(Text, { dimColor: true },
|
|
25
|
+
"v",
|
|
26
|
+
version))));
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=StartupBanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"StartupBanner.js","sourceRoot":"","sources":["../../../src/cli/components/StartupBanner.tsx"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAWrE,MAAM,UAAU,aAAa,CAAC,EAC5B,OAAO,EACP,UAAU,EACV,KAAK,EACL,GAAG,EACH,OAAO,EACP,IAAI,GACe;IACnB,MAAM,OAAO,GAAG,OAAO,GAAG,EAAE,IAAI,IAAI,GAAG,EAAE,CAAC;IAC1C,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,kBAAkB,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAE3E,MAAM,SAAS,GAAG;QAChB,gBAAgB,OAAO,MAAM,UAAU,IAAI,KAAK,EAAE;QAClD,QAAQ,GAAG,EAAE;QACb,sDAAsD;KACvD,CAAC;IAEF,OAAO,CACL,oBAAC,GAAG,IAAC,aAAa,EAAC,KAAK,EAAC,cAAc,EAAC,eAAe,EAAC,YAAY,EAAE,CAAC,EAAE,KAAK,EAAC,MAAM;QACnF,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAE,CAAC,IACpD,SAAS,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CAC1B,oBAAC,IAAI,IAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,CAAC,GAAG,CAAC,IAC/D,IAAI,CACA,CACR,CAAC,CACE;QACN,oBAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAE,CAAC,EAAE,UAAU,EAAC,UAAU;YAC7D,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CAAC,CACrB,oBAAC,IAAI,IAAC,GAAG,EAAE,CAAC,EAAE,KAAK,EAAC,MAAM,IACvB,IAAI,CACA,CACR,CAAC;YACF,oBAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,kBAEjB;YACP,oBAAC,IAAI,IAAC,QAAQ;;gBAAG,OAAO,CAAQ,CAC5B,CACF,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -16,7 +16,7 @@ import { Spinner } from './Spinner.js';
|
|
|
16
16
|
* region as short as possible. A single status line + the input bar + the
|
|
17
17
|
* streaming tail is always well under a screen, so no full repaint.
|
|
18
18
|
*/
|
|
19
|
-
export function StatusBar({ model, provider, sessionId, sessionActive, queueCount = 0, busy = false, mode = 'agent', phase = 'build', cwd, elapsedMs = null, lastMs = null, costUsd = 0, cachedTokens = 0, contextUsed = 0, contextLimit = 0,
|
|
19
|
+
export function StatusBar({ model, provider, sessionId, sessionActive, queueCount = 0, busy = false, mode = 'agent', phase = 'build', cwd, elapsedMs = null, lastMs = null, costUsd = 0, cachedTokens = 0, contextUsed = 0, contextLimit = 0, }) {
|
|
20
20
|
const ctxLabel = contextLimit > 0
|
|
21
21
|
? `${formatTokens(contextUsed)}/${formatTokens(contextLimit)}`
|
|
22
22
|
: contextUsed > 0
|
|
@@ -64,12 +64,6 @@ export function StatusBar({ model, provider, sessionId, sessionActive, queueCoun
|
|
|
64
64
|
formatTokens(cachedTokens),
|
|
65
65
|
" cached)")) : null,
|
|
66
66
|
React.createElement(Text, { dimColor: true }, " \u00B7 "))) : null,
|
|
67
|
-
brandVersion ? (React.createElement(React.Fragment, null,
|
|
68
|
-
React.createElement(Text, { bold: true, color: "white" }, "ZELARI"),
|
|
69
|
-
React.createElement(Text, { dimColor: true },
|
|
70
|
-
" v",
|
|
71
|
-
brandVersion),
|
|
72
|
-
React.createElement(Text, { dimColor: true }, " \u00B7 "))) : null,
|
|
73
67
|
React.createElement(Text, { dimColor: true },
|
|
74
68
|
"session ",
|
|
75
69
|
sessionId)))));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/cli/components/StatusBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAChC,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;
|
|
1
|
+
{"version":3,"file":"StatusBar.js","sourceRoot":"","sources":["../../../src/cli/components/StatusBar.tsx"],"names":[],"mappings":"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"}
|