zerg-ztc 0.1.4 → 0.1.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/App.d.ts.map +1 -1
- package/dist/App.js +115 -9
- package/dist/App.js.map +1 -1
- package/dist/agent/commands/config.d.ts.map +1 -1
- package/dist/agent/commands/config.js +68 -2
- package/dist/agent/commands/config.js.map +1 -1
- package/dist/agent/commands/index.d.ts.map +1 -1
- package/dist/agent/commands/index.js +2 -1
- package/dist/agent/commands/index.js.map +1 -1
- package/dist/agent/commands/update.d.ts +3 -0
- package/dist/agent/commands/update.d.ts.map +1 -0
- package/dist/agent/commands/update.js +33 -0
- package/dist/agent/commands/update.js.map +1 -0
- package/dist/cli.js +46 -31
- package/dist/cli.js.map +1 -1
- package/dist/components/ActivityLine.d.ts +11 -0
- package/dist/components/ActivityLine.d.ts.map +1 -0
- package/dist/components/ActivityLine.js +9 -0
- package/dist/components/ActivityLine.js.map +1 -0
- package/dist/components/FullScreen.d.ts +1 -0
- package/dist/components/FullScreen.d.ts.map +1 -1
- package/dist/components/FullScreen.js +2 -2
- package/dist/components/FullScreen.js.map +1 -1
- package/dist/components/MessageList.d.ts +2 -1
- package/dist/components/MessageList.d.ts.map +1 -1
- package/dist/components/MessageList.js +41 -2
- package/dist/components/MessageList.js.map +1 -1
- package/dist/components/SingleMessage.d.ts +9 -0
- package/dist/components/SingleMessage.d.ts.map +1 -0
- package/dist/components/SingleMessage.js +27 -0
- package/dist/components/SingleMessage.js.map +1 -0
- package/dist/components/StatusBar.d.ts +1 -0
- package/dist/components/StatusBar.d.ts.map +1 -1
- package/dist/components/StatusBar.js +2 -1
- package/dist/components/StatusBar.js.map +1 -1
- package/dist/components/index.d.ts +2 -0
- package/dist/components/index.d.ts.map +1 -1
- package/dist/components/index.js +2 -0
- package/dist/components/index.js.map +1 -1
- package/dist/config/types.d.ts +1 -0
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +8 -0
- package/dist/config.js.map +1 -1
- package/dist/ui/views/activity_line.d.ts +11 -0
- package/dist/ui/views/activity_line.d.ts.map +1 -0
- package/dist/ui/views/activity_line.js +20 -0
- package/dist/ui/views/activity_line.js.map +1 -0
- package/dist/ui/views/app.d.ts +5 -2
- package/dist/ui/views/app.d.ts.map +1 -1
- package/dist/ui/views/app.js +17 -14
- package/dist/ui/views/app.js.map +1 -1
- package/dist/ui/views/header.d.ts.map +1 -1
- package/dist/ui/views/header.js +3 -4
- package/dist/ui/views/header.js.map +1 -1
- package/dist/ui/views/input_area.d.ts.map +1 -1
- package/dist/ui/views/input_area.js +25 -12
- package/dist/ui/views/input_area.js.map +1 -1
- package/dist/ui/views/message_list.d.ts +3 -2
- package/dist/ui/views/message_list.d.ts.map +1 -1
- package/dist/ui/views/message_list.js +33 -19
- package/dist/ui/views/message_list.js.map +1 -1
- package/dist/ui/views/status_bar.d.ts +2 -1
- package/dist/ui/views/status_bar.d.ts.map +1 -1
- package/dist/ui/views/status_bar.js +4 -2
- package/dist/ui/views/status_bar.js.map +1 -1
- package/dist/utils/spinner_frames.d.ts +2 -0
- package/dist/utils/spinner_frames.d.ts.map +1 -0
- package/dist/utils/spinner_frames.js +2 -0
- package/dist/utils/spinner_frames.js.map +1 -0
- package/dist/utils/spinner_verbs.d.ts +4 -0
- package/dist/utils/spinner_verbs.d.ts.map +1 -0
- package/dist/utils/spinner_verbs.js +22 -0
- package/dist/utils/spinner_verbs.js.map +1 -0
- package/dist/utils/tool_trace.d.ts.map +1 -1
- package/dist/utils/tool_trace.js +12 -2
- package/dist/utils/tool_trace.js.map +1 -1
- package/dist/utils/update.d.ts +9 -0
- package/dist/utils/update.d.ts.map +1 -0
- package/dist/utils/update.js +37 -0
- package/dist/utils/update.js.map +1 -0
- package/dist/utils/version.d.ts +2 -0
- package/dist/utils/version.d.ts.map +1 -0
- package/dist/utils/version.js +16 -0
- package/dist/utils/version.js.map +1 -0
- package/package.json +1 -1
- package/src/App.tsx +156 -20
- package/src/agent/commands/config.ts +76 -2
- package/src/agent/commands/index.ts +2 -0
- package/src/agent/commands/update.ts +32 -0
- package/src/cli.tsx +50 -30
- package/src/components/ActivityLine.tsx +23 -0
- package/src/components/FullScreen.tsx +4 -3
- package/src/components/MessageList.tsx +52 -6
- package/src/components/SingleMessage.tsx +59 -0
- package/src/components/StatusBar.tsx +3 -0
- package/src/components/index.tsx +3 -1
- package/src/config/types.ts +1 -0
- package/src/config.ts +8 -0
- package/src/ui/views/activity_line.ts +33 -0
- package/src/ui/views/app.ts +23 -14
- package/src/ui/views/header.ts +3 -4
- package/src/ui/views/input_area.ts +28 -17
- package/src/ui/views/message_list.ts +36 -20
- package/src/ui/views/status_bar.ts +5 -1
- package/src/utils/spinner_frames.ts +1 -0
- package/src/utils/spinner_verbs.ts +23 -0
- package/src/utils/tool_trace.ts +12 -2
- package/src/utils/update.ts +44 -0
- package/src/utils/version.ts +15 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool_trace.js","sourceRoot":"","sources":["../../src/utils/tool_trace.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"tool_trace.js","sourceRoot":"","sources":["../../src/utils/tool_trace.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface UpdateCheck {
|
|
2
|
+
current: string;
|
|
3
|
+
latest: string;
|
|
4
|
+
hasUpdate: boolean;
|
|
5
|
+
}
|
|
6
|
+
export declare function compareVersions(a: string, b: string): number;
|
|
7
|
+
export declare function fetchLatestVersion(): Promise<string>;
|
|
8
|
+
export declare function checkForUpdate(current: string): Promise<UpdateCheck>;
|
|
9
|
+
//# sourceMappingURL=update.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.d.ts","sourceRoot":"","sources":["../../src/utils/update.ts"],"names":[],"mappings":"AAEA,MAAM,WAAW,WAAW;IAC1B,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,OAAO,CAAC;CACpB;AAMD,wBAAgB,eAAe,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,MAAM,CAW5D;AAED,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,MAAM,CAAC,CAS1D;AAED,wBAAsB,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAO1E"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
const PACKAGE_NAME = 'zerg-ztc';
|
|
2
|
+
function parseVersion(value) {
|
|
3
|
+
return value.split('.').map(part => Number(part.replace(/[^0-9]/g, '')) || 0);
|
|
4
|
+
}
|
|
5
|
+
export function compareVersions(a, b) {
|
|
6
|
+
const pa = parseVersion(a);
|
|
7
|
+
const pb = parseVersion(b);
|
|
8
|
+
const len = Math.max(pa.length, pb.length);
|
|
9
|
+
for (let i = 0; i < len; i += 1) {
|
|
10
|
+
const av = pa[i] ?? 0;
|
|
11
|
+
const bv = pb[i] ?? 0;
|
|
12
|
+
if (av > bv)
|
|
13
|
+
return 1;
|
|
14
|
+
if (av < bv)
|
|
15
|
+
return -1;
|
|
16
|
+
}
|
|
17
|
+
return 0;
|
|
18
|
+
}
|
|
19
|
+
export async function fetchLatestVersion() {
|
|
20
|
+
const res = await fetch(`https://registry.npmjs.org/${PACKAGE_NAME}/latest`, {
|
|
21
|
+
headers: { 'Accept': 'application/json' }
|
|
22
|
+
});
|
|
23
|
+
if (!res.ok) {
|
|
24
|
+
throw new Error(`Version check failed (${res.status})`);
|
|
25
|
+
}
|
|
26
|
+
const data = await res.json();
|
|
27
|
+
return data.version || '0.0.0';
|
|
28
|
+
}
|
|
29
|
+
export async function checkForUpdate(current) {
|
|
30
|
+
const latest = await fetchLatestVersion();
|
|
31
|
+
return {
|
|
32
|
+
current,
|
|
33
|
+
latest,
|
|
34
|
+
hasUpdate: compareVersions(latest, current) > 0
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=update.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/utils/update.ts"],"names":[],"mappings":"AAAA,MAAM,YAAY,GAAG,UAAU,CAAC;AAQhC,SAAS,YAAY,CAAC,KAAa;IACjC,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC;AAChF,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,CAAS,EAAE,CAAS;IAClD,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;IAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC3C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;QAChC,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,MAAM,EAAE,GAAG,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACtB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC;QACtB,IAAI,EAAE,GAAG,EAAE;YAAE,OAAO,CAAC,CAAC,CAAC;IACzB,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB;IACtC,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,8BAA8B,YAAY,SAAS,EAAE;QAC3E,OAAO,EAAE,EAAE,QAAQ,EAAE,kBAAkB,EAAE;KAC1C,CAAC,CAAC;IACH,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC;IAC1D,CAAC;IACD,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAA0B,CAAC;IACtD,OAAO,IAAI,CAAC,OAAO,IAAI,OAAO,CAAC;AACjC,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAe;IAClD,MAAM,MAAM,GAAG,MAAM,kBAAkB,EAAE,CAAC;IAC1C,OAAO;QACL,OAAO;QACP,MAAM;QACN,SAAS,EAAE,eAAe,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC;KAChD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAIA,wBAAgB,UAAU,IAAI,MAAM,CAUnC"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
import { readFileSync } from 'fs';
|
|
2
|
+
import { dirname, resolve } from 'path';
|
|
3
|
+
import { fileURLToPath } from 'url';
|
|
4
|
+
export function getVersion() {
|
|
5
|
+
try {
|
|
6
|
+
const here = dirname(fileURLToPath(import.meta.url));
|
|
7
|
+
const pkgPath = resolve(here, '../../package.json');
|
|
8
|
+
const raw = readFileSync(pkgPath, 'utf-8');
|
|
9
|
+
const parsed = JSON.parse(raw);
|
|
10
|
+
return parsed.version || '0.0.0';
|
|
11
|
+
}
|
|
12
|
+
catch {
|
|
13
|
+
return '0.0.0';
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//# sourceMappingURL=version.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"version.js","sourceRoot":"","sources":["../../src/utils/version.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACxC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAEpC,MAAM,UAAU,UAAU;IACxB,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;QACrD,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,oBAAoB,CAAC,CAAC;QACpD,MAAM,GAAG,GAAG,YAAY,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAyB,CAAC;QACvD,OAAO,MAAM,CAAC,OAAO,IAAI,OAAO,CAAC;IACnC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,OAAO,CAAC;IACjB,CAAC;AACH,CAAC"}
|
package/package.json
CHANGED
package/src/App.tsx
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
import React, { useState, useCallback, useMemo, useRef } from 'react';
|
|
2
|
-
import { Box, useApp, useInput } from 'ink';
|
|
3
|
-
import { Header, MessageList, InputArea, StatusBar, FullScreen, useScreenSize } from './components/index.js';
|
|
2
|
+
import { Box, useApp, useInput, Static } from 'ink';
|
|
3
|
+
import { Header, MessageList, SingleMessage, InputArea, StatusBar, FullScreen, ActivityLine, useScreenSize } from './components/index.js';
|
|
4
4
|
import { buildAppView } from './ui/views/app.js';
|
|
5
5
|
import { useMirror } from './web/mirror_hook.js';
|
|
6
6
|
import { Agent } from './agent/index.js';
|
|
7
7
|
import { commands, type CommandContext } from './agent/commands/index.js';
|
|
8
8
|
import { Message, AgentState, InputMode } from './types.js';
|
|
9
9
|
import { InputState } from './ui/core/input_state.js';
|
|
10
|
+
import { estimateInputLines } from './ui/views/input_area.js';
|
|
10
11
|
import { configStore } from './config.js';
|
|
11
12
|
import { createInputBus } from './ui/core/input.js';
|
|
12
13
|
import { loadEmulationProfiles, getEmulationProfile } from './emulation/catalog.js';
|
|
@@ -20,6 +21,10 @@ import { autoActivateSkills, buildSkillPrompt } from './skills/index.js';
|
|
|
20
21
|
import { getSkillRegistry } from './skills/registry.js';
|
|
21
22
|
import { Skill } from './skills/types.js';
|
|
22
23
|
import { createAgentFromConfig } from './agent/factory.js';
|
|
24
|
+
import { checkForUpdate } from './utils/update.js';
|
|
25
|
+
import { getVersion } from './utils/version.js';
|
|
26
|
+
import { DEFAULT_SPINNER_VERBS } from './utils/spinner_verbs.js';
|
|
27
|
+
import { SPINNER_FRAMES } from './utils/spinner_frames.js';
|
|
23
28
|
|
|
24
29
|
// --- Utilities ---
|
|
25
30
|
|
|
@@ -78,6 +83,7 @@ export const App: React.FC = () => {
|
|
|
78
83
|
const queueRef = useRef<string[]>([]);
|
|
79
84
|
const activeRunIdRef = useRef<string | null>(null);
|
|
80
85
|
const runCounterRef = useRef(0);
|
|
86
|
+
const lastRunDurationRef = useRef<number | null>(null);
|
|
81
87
|
|
|
82
88
|
React.useEffect(() => {
|
|
83
89
|
let active = true;
|
|
@@ -106,6 +112,8 @@ export const App: React.FC = () => {
|
|
|
106
112
|
const [retryAvailable, setRetryAvailable] = useState(false);
|
|
107
113
|
const [toast, setToast] = useState<string | null>(null);
|
|
108
114
|
const toastTimerRef = useRef<NodeJS.Timeout | null>(null);
|
|
115
|
+
const [spinnerLabel, setSpinnerLabel] = useState<string | null>(null);
|
|
116
|
+
const [spinnerFrame, setSpinnerFrame] = useState<string | null>(null);
|
|
109
117
|
const streamingMessageId = React.useRef<string | null>(null);
|
|
110
118
|
const streamedResponse = React.useRef(false);
|
|
111
119
|
const toolStartTimes = React.useRef<Map<string, number[]>>(new Map());
|
|
@@ -117,6 +125,8 @@ export const App: React.FC = () => {
|
|
|
117
125
|
);
|
|
118
126
|
const contextLength = agentState.contextTokens ?? fallbackContextLength;
|
|
119
127
|
const contextEstimated = agentState.contextTokens ? agentState.tokensEstimated : true;
|
|
128
|
+
const spinnerVerbs = configStore.get().spinnerVerbs || DEFAULT_SPINNER_VERBS;
|
|
129
|
+
const spinnerVerbsKey = spinnerVerbs.join('|');
|
|
120
130
|
|
|
121
131
|
React.useEffect(() => {
|
|
122
132
|
renderCount.current += 1;
|
|
@@ -126,15 +136,69 @@ export const App: React.FC = () => {
|
|
|
126
136
|
messagesRef.current = messages;
|
|
127
137
|
}, [messages]);
|
|
128
138
|
const [debug, setDebug] = useState(false);
|
|
139
|
+
const scrollback = process.env.ZTC_SCROLLBACK === '1' || process.env.ZTC_ALT_SCREEN !== '1';
|
|
129
140
|
|
|
130
|
-
|
|
131
|
-
|
|
141
|
+
React.useEffect(() => {
|
|
142
|
+
if (agentState.status !== 'thinking' && agentState.status !== 'streaming') {
|
|
143
|
+
setSpinnerLabel(null);
|
|
144
|
+
setSpinnerFrame(null);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
if (spinnerVerbs.length === 0) {
|
|
148
|
+
setSpinnerLabel(null);
|
|
149
|
+
setSpinnerFrame(null);
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
const verb = spinnerVerbs[Math.floor(Math.random() * spinnerVerbs.length)];
|
|
153
|
+
setSpinnerLabel(verb);
|
|
154
|
+
}, [agentState.status, spinnerVerbsKey]);
|
|
155
|
+
|
|
156
|
+
React.useEffect(() => {
|
|
157
|
+
if (agentState.status !== 'thinking' && agentState.status !== 'streaming') {
|
|
158
|
+
setSpinnerFrame(null);
|
|
159
|
+
return;
|
|
160
|
+
}
|
|
161
|
+
// Animation is now safe in scrollback mode because we use Ink's Static component
|
|
162
|
+
// for completed messages - only the live section below Static re-renders
|
|
163
|
+
let index = 0;
|
|
164
|
+
setSpinnerFrame(SPINNER_FRAMES[index]);
|
|
165
|
+
const interval = setInterval(() => {
|
|
166
|
+
index = (index + 1) % SPINNER_FRAMES.length;
|
|
167
|
+
setSpinnerFrame(SPINNER_FRAMES[index]);
|
|
168
|
+
}, 120);
|
|
169
|
+
return () => {
|
|
170
|
+
clearInterval(interval);
|
|
171
|
+
};
|
|
172
|
+
}, [agentState.status]);
|
|
173
|
+
|
|
174
|
+
const headerHeight = scrollback ? 0 : 4; // border (2) + content (1) + margin (1)
|
|
132
175
|
const statusHeight = 1;
|
|
176
|
+
const suggestionLines = 4;
|
|
177
|
+
|
|
178
|
+
const estimateBadgePreviewLines = useCallback((state: InputState): number => {
|
|
179
|
+
const segment = state.segments[state.cursor.index];
|
|
180
|
+
if (!segment || segment.type === 'text') return 0;
|
|
181
|
+
if (segment.type === 'paste') {
|
|
182
|
+
const lines = segment.text.split('\n');
|
|
183
|
+
return Math.min(3, lines.length) + (lines.length > 3 ? 1 : 0);
|
|
184
|
+
}
|
|
185
|
+
if (segment.type === 'image') {
|
|
186
|
+
return 16;
|
|
187
|
+
}
|
|
188
|
+
return 1;
|
|
189
|
+
}, []);
|
|
190
|
+
|
|
191
|
+
const inputHeight = useMemo(() => {
|
|
192
|
+
const inputLineCount = estimateInputLines(inputSnapshot.segments, columns);
|
|
193
|
+
const previewLines = estimateBadgePreviewLines(inputSnapshot);
|
|
194
|
+
const maxInputLines = Math.max(1, rows - (headerHeight + statusHeight + suggestionLines + 5));
|
|
195
|
+
return Math.min(Math.max(1, inputLineCount + previewLines), maxInputLines) + suggestionLines;
|
|
196
|
+
}, [columns, estimateBadgePreviewLines, inputSnapshot, rows]);
|
|
133
197
|
|
|
134
198
|
// Calculate content height (total - header - input - status)
|
|
135
199
|
const contentHeight = useMemo(
|
|
136
|
-
() => Math.max(rows - (headerHeight + inputHeight + statusHeight), 5),
|
|
137
|
-
[rows]
|
|
200
|
+
() => scrollback ? undefined : Math.max(rows - (headerHeight + inputHeight + statusHeight), 5),
|
|
201
|
+
[rows, scrollback, inputHeight]
|
|
138
202
|
);
|
|
139
203
|
|
|
140
204
|
// Reload agent when config changes
|
|
@@ -180,6 +244,21 @@ export const App: React.FC = () => {
|
|
|
180
244
|
}]);
|
|
181
245
|
}, []);
|
|
182
246
|
|
|
247
|
+
React.useEffect(() => {
|
|
248
|
+
if (process.env.ZTC_DISABLE_UPDATE === '1') return;
|
|
249
|
+
if (process.env.ZTC_WEB_MIRROR === '1') return;
|
|
250
|
+
let active = true;
|
|
251
|
+
const current = getVersion();
|
|
252
|
+
checkForUpdate(current).then(info => {
|
|
253
|
+
if (!active || !info.hasUpdate) return;
|
|
254
|
+
addMessage({
|
|
255
|
+
role: 'system',
|
|
256
|
+
content: `Update available: v${info.latest} (current v${info.current}). Run /update to install.`
|
|
257
|
+
});
|
|
258
|
+
}).catch(() => {});
|
|
259
|
+
return () => { active = false; };
|
|
260
|
+
}, [addMessage]);
|
|
261
|
+
|
|
183
262
|
const clearMessages = useCallback(() => {
|
|
184
263
|
setMessages([]);
|
|
185
264
|
}, []);
|
|
@@ -261,6 +340,7 @@ export const App: React.FC = () => {
|
|
|
261
340
|
const runId = `${Date.now()}_${runCounterRef.current++}`;
|
|
262
341
|
activeRunIdRef.current = runId;
|
|
263
342
|
const isActive = () => activeRunIdRef.current === runId;
|
|
343
|
+
const runStartedAt = Date.now();
|
|
264
344
|
setAgentState({ status: 'thinking', startedAt: new Date() });
|
|
265
345
|
void runWithRetry(last.messages, last.agent, true, isActive).catch((err) => {
|
|
266
346
|
const message = (err as Error).message || 'Agent error';
|
|
@@ -417,6 +497,7 @@ export const App: React.FC = () => {
|
|
|
417
497
|
const runId = `${Date.now()}_${runCounterRef.current++}`;
|
|
418
498
|
activeRunIdRef.current = runId;
|
|
419
499
|
const isActive = () => activeRunIdRef.current === runId;
|
|
500
|
+
const runStartedAt = Date.now();
|
|
420
501
|
setAgentState({ status: 'thinking', startedAt: new Date() });
|
|
421
502
|
streamingMessageId.current = null;
|
|
422
503
|
streamedResponse.current = false;
|
|
@@ -480,7 +561,7 @@ export const App: React.FC = () => {
|
|
|
480
561
|
toolStartTimes.current.set(key, bucket);
|
|
481
562
|
const duration = started ? Date.now() - started : undefined;
|
|
482
563
|
const emulationId = configStore.getEmulationId();
|
|
483
|
-
if (getTraceStyle(emulationId) === 'claude_code') {
|
|
564
|
+
if (getTraceStyle(emulationId) === 'claude_code' || getTraceStyle(emulationId) === 'codex') {
|
|
484
565
|
const output = buildToolOutputMessage(event.tool, event.result, duration, emulationId);
|
|
485
566
|
addMessage({
|
|
486
567
|
role: 'tool',
|
|
@@ -553,6 +634,14 @@ export const App: React.FC = () => {
|
|
|
553
634
|
streamedResponse.current = false;
|
|
554
635
|
streamingMessageId.current = null;
|
|
555
636
|
activeRunIdRef.current = null;
|
|
637
|
+
lastRunDurationRef.current = Date.now() - runStartedAt;
|
|
638
|
+
if (getTraceStyle(configStore.getEmulationId()) === 'codex') {
|
|
639
|
+
const seconds = Math.max(0, Math.round((lastRunDurationRef.current || 0) / 1000));
|
|
640
|
+
addMessage({
|
|
641
|
+
role: 'tool',
|
|
642
|
+
content: `✻ Worked for ${seconds}s`
|
|
643
|
+
});
|
|
644
|
+
}
|
|
556
645
|
cleanup();
|
|
557
646
|
if (inputMode === 'queue' && queueRef.current.length > 0) {
|
|
558
647
|
const next = queueRef.current.shift();
|
|
@@ -577,6 +666,7 @@ export const App: React.FC = () => {
|
|
|
577
666
|
rows,
|
|
578
667
|
commands,
|
|
579
668
|
hasApiKey: configStore.hasApiKey(),
|
|
669
|
+
version: getVersion(),
|
|
580
670
|
contextLength,
|
|
581
671
|
contextEstimated,
|
|
582
672
|
provider,
|
|
@@ -584,10 +674,12 @@ export const App: React.FC = () => {
|
|
|
584
674
|
emulationId,
|
|
585
675
|
inputMode,
|
|
586
676
|
toast,
|
|
677
|
+
spinnerLabel,
|
|
678
|
+
spinnerFrame,
|
|
587
679
|
debug,
|
|
588
680
|
expandToolOutputs
|
|
589
681
|
});
|
|
590
|
-
}, [mirrorEnabled, messages, agentState, inputSnapshot, sessionId, rows, contextLength, contextEstimated, provider, model, emulationId, inputMode, toast, debug, expandToolOutputs]);
|
|
682
|
+
}, [mirrorEnabled, messages, agentState, inputSnapshot, sessionId, rows, contextLength, contextEstimated, provider, model, emulationId, inputMode, toast, spinnerLabel, spinnerFrame, debug, expandToolOutputs]);
|
|
591
683
|
|
|
592
684
|
const showToast = useCallback((message: string) => {
|
|
593
685
|
setToast(message);
|
|
@@ -601,22 +693,66 @@ export const App: React.FC = () => {
|
|
|
601
693
|
|
|
602
694
|
useMirror(layoutTree, inputBus);
|
|
603
695
|
|
|
696
|
+
// Compute messages for Static (completed) vs live (streaming)
|
|
697
|
+
// Static component handles deduplication by key - it only renders new items
|
|
698
|
+
const { staticMessages, streamingMessage } = useMemo(() => {
|
|
699
|
+
if (!scrollback) {
|
|
700
|
+
return { staticMessages: [], streamingMessage: null };
|
|
701
|
+
}
|
|
702
|
+
|
|
703
|
+
// Completed messages go to Static (rendered once, kept in scrollback)
|
|
704
|
+
const completed = messages.filter(m => !m.isStreaming);
|
|
705
|
+
// Streaming message stays in live section (can update)
|
|
706
|
+
const streaming = messages.find(m => m.isStreaming) || null;
|
|
707
|
+
|
|
708
|
+
return {
|
|
709
|
+
staticMessages: completed,
|
|
710
|
+
streamingMessage: streaming
|
|
711
|
+
};
|
|
712
|
+
}, [messages, scrollback]);
|
|
713
|
+
|
|
604
714
|
return (
|
|
605
|
-
<FullScreen debug={debug}>
|
|
606
|
-
<Header version=
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
715
|
+
<FullScreen debug={debug} scrollback={scrollback}>
|
|
716
|
+
{!scrollback && <Header version={getVersion()} debug={debug} />}
|
|
717
|
+
|
|
718
|
+
{scrollback ? (
|
|
719
|
+
<Box flexDirection="column">
|
|
720
|
+
{/* Static: each message rendered ONCE, stays in scrollback buffer */}
|
|
721
|
+
<Static items={staticMessages}>
|
|
722
|
+
{(msg: Message) => (
|
|
723
|
+
<Box key={msg.id} flexDirection="column">
|
|
724
|
+
<SingleMessage message={msg} expandToolOutputs={expandToolOutputs} />
|
|
725
|
+
</Box>
|
|
726
|
+
)}
|
|
727
|
+
</Static>
|
|
728
|
+
|
|
729
|
+
{/* Live section: streaming message can update */}
|
|
730
|
+
{streamingMessage && (
|
|
731
|
+
<SingleMessage message={streamingMessage} expandToolOutputs={expandToolOutputs} />
|
|
732
|
+
)}
|
|
733
|
+
</Box>
|
|
734
|
+
) : (
|
|
735
|
+
<MessageList
|
|
736
|
+
messages={messages}
|
|
737
|
+
height={contentHeight}
|
|
738
|
+
debug={debug}
|
|
739
|
+
expandToolOutputs={expandToolOutputs}
|
|
740
|
+
scrollback={scrollback}
|
|
741
|
+
/>
|
|
742
|
+
)}
|
|
743
|
+
|
|
744
|
+
<ActivityLine
|
|
745
|
+
state={agentState}
|
|
746
|
+
spinnerLabel={spinnerLabel}
|
|
747
|
+
spinnerFrame={spinnerFrame}
|
|
748
|
+
inputMode={inputMode}
|
|
613
749
|
/>
|
|
614
|
-
|
|
750
|
+
|
|
615
751
|
<InputArea
|
|
616
752
|
onSubmit={handleSubmit}
|
|
617
753
|
onCommand={handleCommand}
|
|
618
754
|
commands={commands}
|
|
619
|
-
onStateChange={
|
|
755
|
+
onStateChange={setInputSnapshot}
|
|
620
756
|
onToast={showToast}
|
|
621
757
|
cols={columns}
|
|
622
758
|
inputBus={inputBus}
|
|
@@ -630,11 +766,11 @@ export const App: React.FC = () => {
|
|
|
630
766
|
'Type a message or /help for commands...'
|
|
631
767
|
}
|
|
632
768
|
/>
|
|
633
|
-
|
|
769
|
+
|
|
634
770
|
<StatusBar
|
|
635
771
|
state={agentState}
|
|
636
772
|
sessionId={sessionId}
|
|
637
|
-
version=
|
|
773
|
+
version={getVersion()}
|
|
638
774
|
connectionStatus={configStore.hasApiKey() ? 'connected' : 'disconnected'}
|
|
639
775
|
contextLength={contextLength}
|
|
640
776
|
contextEstimated={contextEstimated}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { Command } from './types.js';
|
|
2
|
+
import { DEFAULT_SPINNER_VERBS, formatSpinnerVerbs, parseSpinnerVerbs } from '../../utils/spinner_verbs.js';
|
|
2
3
|
|
|
3
4
|
export const configCommand: Command = {
|
|
4
5
|
name: 'config',
|
|
5
6
|
description: 'Manage configuration',
|
|
6
|
-
usage: '<show|key|provider|endpoint|model> [value]',
|
|
7
|
+
usage: '<show|key|provider|endpoint|model|spinner> [value]',
|
|
7
8
|
handler: async (args, ctx) => {
|
|
8
9
|
const [subCmd, ...rest] = args;
|
|
9
10
|
const value = rest.join(' ');
|
|
@@ -24,6 +25,7 @@ export const configCommand: Command = {
|
|
|
24
25
|
` Max Tokens: ${config.maxTokens}`,
|
|
25
26
|
` Zerg Endpoint: ${config.zergEndpoint || '(not set)'}`,
|
|
26
27
|
` Emulation: ${ctx.config.getEmulationId() || '(none)'}`,
|
|
28
|
+
` Spinner verbs: ${formatSpinnerVerbs(config.spinnerVerbs || DEFAULT_SPINNER_VERBS)}`,
|
|
27
29
|
'',
|
|
28
30
|
`Config storage: ${ctx.config.locationLabel || '~/.ztc/config.json'}`
|
|
29
31
|
].join('\n')
|
|
@@ -120,10 +122,82 @@ export const configCommand: Command = {
|
|
|
120
122
|
});
|
|
121
123
|
break;
|
|
122
124
|
|
|
125
|
+
case 'spinner': {
|
|
126
|
+
const [action, ...restParts] = rest;
|
|
127
|
+
const actionValue = restParts.join(' ');
|
|
128
|
+
const current = ctx.config.get().spinnerVerbs || DEFAULT_SPINNER_VERBS;
|
|
129
|
+
|
|
130
|
+
if (!action || action === 'show') {
|
|
131
|
+
ctx.addMessage({
|
|
132
|
+
role: 'system',
|
|
133
|
+
content: `Spinner verbs:\n ${formatSpinnerVerbs(current)}\n\nUsage:\n /config spinner show\n /config spinner set <verb1, verb2, ...>\n /config spinner add <verb>\n /config spinner remove <verb>\n /config spinner reset\n /config spinner off`
|
|
134
|
+
});
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
if (action === 'reset') {
|
|
139
|
+
ctx.config.set('spinnerVerbs', DEFAULT_SPINNER_VERBS);
|
|
140
|
+
ctx.config.save();
|
|
141
|
+
ctx.addMessage({ role: 'system', content: '✓ Spinner verbs reset to defaults.' });
|
|
142
|
+
return;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
if (action === 'off') {
|
|
146
|
+
ctx.config.set('spinnerVerbs', []);
|
|
147
|
+
ctx.config.save();
|
|
148
|
+
ctx.addMessage({ role: 'system', content: '✓ Spinner verbs disabled.' });
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
if (action === 'set') {
|
|
153
|
+
const verbs = parseSpinnerVerbs(actionValue);
|
|
154
|
+
if (verbs.length === 0) {
|
|
155
|
+
ctx.addMessage({ role: 'system', content: 'Usage: /config spinner set <verb1, verb2, ...>' });
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
ctx.config.set('spinnerVerbs', verbs);
|
|
159
|
+
ctx.config.save();
|
|
160
|
+
ctx.addMessage({ role: 'system', content: `✓ Spinner verbs updated: ${formatSpinnerVerbs(verbs)}` });
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
if (action === 'add') {
|
|
165
|
+
const verbs = parseSpinnerVerbs(actionValue);
|
|
166
|
+
if (verbs.length === 0) {
|
|
167
|
+
ctx.addMessage({ role: 'system', content: 'Usage: /config spinner add <verb>' });
|
|
168
|
+
return;
|
|
169
|
+
}
|
|
170
|
+
const next = [...current, ...verbs];
|
|
171
|
+
ctx.config.set('spinnerVerbs', next);
|
|
172
|
+
ctx.config.save();
|
|
173
|
+
ctx.addMessage({ role: 'system', content: `✓ Added spinner verbs: ${formatSpinnerVerbs(verbs)}` });
|
|
174
|
+
return;
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
if (action === 'remove') {
|
|
178
|
+
const verbs = parseSpinnerVerbs(actionValue).map(v => v.toLowerCase());
|
|
179
|
+
if (verbs.length === 0) {
|
|
180
|
+
ctx.addMessage({ role: 'system', content: 'Usage: /config spinner remove <verb>' });
|
|
181
|
+
return;
|
|
182
|
+
}
|
|
183
|
+
const next = current.filter(v => !verbs.includes(v.toLowerCase()));
|
|
184
|
+
ctx.config.set('spinnerVerbs', next);
|
|
185
|
+
ctx.config.save();
|
|
186
|
+
ctx.addMessage({ role: 'system', content: `✓ Removed spinner verbs: ${formatSpinnerVerbs(verbs)}` });
|
|
187
|
+
return;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
ctx.addMessage({
|
|
191
|
+
role: 'system',
|
|
192
|
+
content: 'Usage: /config spinner <show|set|add|remove|reset|off> [value]'
|
|
193
|
+
});
|
|
194
|
+
break;
|
|
195
|
+
}
|
|
196
|
+
|
|
123
197
|
default:
|
|
124
198
|
ctx.addMessage({
|
|
125
199
|
role: 'system',
|
|
126
|
-
content: 'Usage: /config <show|key|provider|endpoint|model> [value]\n\nExamples:\n /config show Show current config\n /config key sk-ant-... Set API key (current provider)\n /config key openai sk-... Set API key for provider\n /config provider openai Set provider\n /config endpoint https://api.example.com/v1 Set OpenAI-compatible base URL\n /config model claude-opus-4-20250514 Set model'
|
|
200
|
+
content: 'Usage: /config <show|key|provider|endpoint|model|spinner> [value]\n\nExamples:\n /config show Show current config\n /config key sk-ant-... Set API key (current provider)\n /config key openai sk-... Set API key for provider\n /config provider openai Set provider\n /config endpoint https://api.example.com/v1 Set OpenAI-compatible base URL\n /config model claude-opus-4-20250514 Set model\n /config spinner set Reticulating splines, Organizing thoughts'
|
|
127
201
|
});
|
|
128
202
|
}
|
|
129
203
|
}
|
|
@@ -14,6 +14,7 @@ import { skillsCommand } from './skills.js';
|
|
|
14
14
|
import { retryCommand } from './retry.js';
|
|
15
15
|
import { inputModeCommand } from './input_mode.js';
|
|
16
16
|
import { keybindingsCommand } from './keybindings.js';
|
|
17
|
+
import { updateCommand } from './update.js';
|
|
17
18
|
import { Command } from './types.js';
|
|
18
19
|
|
|
19
20
|
const commandList: Command[] = [];
|
|
@@ -35,6 +36,7 @@ commandList.push(
|
|
|
35
36
|
permissionsCommand,
|
|
36
37
|
skillsCommand,
|
|
37
38
|
keybindingsCommand,
|
|
39
|
+
updateCommand,
|
|
38
40
|
inputModeCommand,
|
|
39
41
|
retryCommand,
|
|
40
42
|
exitCommand
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import { Command } from './types.js';
|
|
2
|
+
import { getVersion } from '../../utils/version.js';
|
|
3
|
+
import { checkForUpdate } from '../../utils/update.js';
|
|
4
|
+
|
|
5
|
+
export const updateCommand: Command = {
|
|
6
|
+
name: 'update',
|
|
7
|
+
description: 'Check for updates and install the latest version',
|
|
8
|
+
handler: async (_args, ctx) => {
|
|
9
|
+
try {
|
|
10
|
+
ctx.addMessage({ role: 'system', content: 'Checking for updates...' });
|
|
11
|
+
const current = getVersion();
|
|
12
|
+
const info = await checkForUpdate(current);
|
|
13
|
+
if (!info.hasUpdate) {
|
|
14
|
+
ctx.addMessage({ role: 'system', content: `ZTC is up to date (v${current}).` });
|
|
15
|
+
return;
|
|
16
|
+
}
|
|
17
|
+
ctx.addMessage({ role: 'system', content: `Updating to v${info.latest}...` });
|
|
18
|
+
const result = await ctx.shell.run('npm install -g zerg-ztc@latest');
|
|
19
|
+
if (result.exitCode === 0) {
|
|
20
|
+
ctx.addMessage({ role: 'system', content: `✓ Updated to v${info.latest}. Restart ZTC to use the new version.` });
|
|
21
|
+
} else {
|
|
22
|
+
ctx.addMessage({
|
|
23
|
+
role: 'system',
|
|
24
|
+
content: `Update failed (exit ${result.exitCode}).\n${result.stderr || result.stdout || ''}`.trim()
|
|
25
|
+
});
|
|
26
|
+
}
|
|
27
|
+
} catch (err) {
|
|
28
|
+
const message = err instanceof Error ? err.message : 'Update failed';
|
|
29
|
+
ctx.addMessage({ role: 'system', content: `Update failed: ${message}` });
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|