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.
Files changed (110) hide show
  1. package/dist/App.d.ts.map +1 -1
  2. package/dist/App.js +115 -9
  3. package/dist/App.js.map +1 -1
  4. package/dist/agent/commands/config.d.ts.map +1 -1
  5. package/dist/agent/commands/config.js +68 -2
  6. package/dist/agent/commands/config.js.map +1 -1
  7. package/dist/agent/commands/index.d.ts.map +1 -1
  8. package/dist/agent/commands/index.js +2 -1
  9. package/dist/agent/commands/index.js.map +1 -1
  10. package/dist/agent/commands/update.d.ts +3 -0
  11. package/dist/agent/commands/update.d.ts.map +1 -0
  12. package/dist/agent/commands/update.js +33 -0
  13. package/dist/agent/commands/update.js.map +1 -0
  14. package/dist/cli.js +46 -31
  15. package/dist/cli.js.map +1 -1
  16. package/dist/components/ActivityLine.d.ts +11 -0
  17. package/dist/components/ActivityLine.d.ts.map +1 -0
  18. package/dist/components/ActivityLine.js +9 -0
  19. package/dist/components/ActivityLine.js.map +1 -0
  20. package/dist/components/FullScreen.d.ts +1 -0
  21. package/dist/components/FullScreen.d.ts.map +1 -1
  22. package/dist/components/FullScreen.js +2 -2
  23. package/dist/components/FullScreen.js.map +1 -1
  24. package/dist/components/MessageList.d.ts +2 -1
  25. package/dist/components/MessageList.d.ts.map +1 -1
  26. package/dist/components/MessageList.js +41 -2
  27. package/dist/components/MessageList.js.map +1 -1
  28. package/dist/components/SingleMessage.d.ts +9 -0
  29. package/dist/components/SingleMessage.d.ts.map +1 -0
  30. package/dist/components/SingleMessage.js +27 -0
  31. package/dist/components/SingleMessage.js.map +1 -0
  32. package/dist/components/StatusBar.d.ts +1 -0
  33. package/dist/components/StatusBar.d.ts.map +1 -1
  34. package/dist/components/StatusBar.js +2 -1
  35. package/dist/components/StatusBar.js.map +1 -1
  36. package/dist/components/index.d.ts +2 -0
  37. package/dist/components/index.d.ts.map +1 -1
  38. package/dist/components/index.js +2 -0
  39. package/dist/components/index.js.map +1 -1
  40. package/dist/config/types.d.ts +1 -0
  41. package/dist/config/types.d.ts.map +1 -1
  42. package/dist/config.d.ts.map +1 -1
  43. package/dist/config.js +8 -0
  44. package/dist/config.js.map +1 -1
  45. package/dist/ui/views/activity_line.d.ts +11 -0
  46. package/dist/ui/views/activity_line.d.ts.map +1 -0
  47. package/dist/ui/views/activity_line.js +20 -0
  48. package/dist/ui/views/activity_line.js.map +1 -0
  49. package/dist/ui/views/app.d.ts +5 -2
  50. package/dist/ui/views/app.d.ts.map +1 -1
  51. package/dist/ui/views/app.js +17 -14
  52. package/dist/ui/views/app.js.map +1 -1
  53. package/dist/ui/views/header.d.ts.map +1 -1
  54. package/dist/ui/views/header.js +3 -4
  55. package/dist/ui/views/header.js.map +1 -1
  56. package/dist/ui/views/input_area.d.ts.map +1 -1
  57. package/dist/ui/views/input_area.js +25 -12
  58. package/dist/ui/views/input_area.js.map +1 -1
  59. package/dist/ui/views/message_list.d.ts +3 -2
  60. package/dist/ui/views/message_list.d.ts.map +1 -1
  61. package/dist/ui/views/message_list.js +33 -19
  62. package/dist/ui/views/message_list.js.map +1 -1
  63. package/dist/ui/views/status_bar.d.ts +2 -1
  64. package/dist/ui/views/status_bar.d.ts.map +1 -1
  65. package/dist/ui/views/status_bar.js +4 -2
  66. package/dist/ui/views/status_bar.js.map +1 -1
  67. package/dist/utils/spinner_frames.d.ts +2 -0
  68. package/dist/utils/spinner_frames.d.ts.map +1 -0
  69. package/dist/utils/spinner_frames.js +2 -0
  70. package/dist/utils/spinner_frames.js.map +1 -0
  71. package/dist/utils/spinner_verbs.d.ts +4 -0
  72. package/dist/utils/spinner_verbs.d.ts.map +1 -0
  73. package/dist/utils/spinner_verbs.js +22 -0
  74. package/dist/utils/spinner_verbs.js.map +1 -0
  75. package/dist/utils/tool_trace.d.ts.map +1 -1
  76. package/dist/utils/tool_trace.js +12 -2
  77. package/dist/utils/tool_trace.js.map +1 -1
  78. package/dist/utils/update.d.ts +9 -0
  79. package/dist/utils/update.d.ts.map +1 -0
  80. package/dist/utils/update.js +37 -0
  81. package/dist/utils/update.js.map +1 -0
  82. package/dist/utils/version.d.ts +2 -0
  83. package/dist/utils/version.d.ts.map +1 -0
  84. package/dist/utils/version.js +16 -0
  85. package/dist/utils/version.js.map +1 -0
  86. package/package.json +1 -1
  87. package/src/App.tsx +156 -20
  88. package/src/agent/commands/config.ts +76 -2
  89. package/src/agent/commands/index.ts +2 -0
  90. package/src/agent/commands/update.ts +32 -0
  91. package/src/cli.tsx +50 -30
  92. package/src/components/ActivityLine.tsx +23 -0
  93. package/src/components/FullScreen.tsx +4 -3
  94. package/src/components/MessageList.tsx +52 -6
  95. package/src/components/SingleMessage.tsx +59 -0
  96. package/src/components/StatusBar.tsx +3 -0
  97. package/src/components/index.tsx +3 -1
  98. package/src/config/types.ts +1 -0
  99. package/src/config.ts +8 -0
  100. package/src/ui/views/activity_line.ts +33 -0
  101. package/src/ui/views/app.ts +23 -14
  102. package/src/ui/views/header.ts +3 -4
  103. package/src/ui/views/input_area.ts +28 -17
  104. package/src/ui/views/message_list.ts +36 -20
  105. package/src/ui/views/status_bar.ts +5 -1
  106. package/src/utils/spinner_frames.ts +1 -0
  107. package/src/utils/spinner_verbs.ts +23 -0
  108. package/src/utils/tool_trace.ts +12 -2
  109. package/src/utils/update.ts +44 -0
  110. 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,2 @@
1
+ export declare function getVersion(): string;
2
+ //# sourceMappingURL=version.d.ts.map
@@ -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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "zerg-ztc",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "Zerg Terminal Client - CLI agent for continual AI systems",
5
5
  "type": "module",
6
6
  "bin": {
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
- const inputHeight = 5; // 1 input line + 4 suggestion lines
131
- const headerHeight = 1;
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="0.1.0" debug={debug} />
607
-
608
- <MessageList
609
- messages={messages}
610
- height={contentHeight}
611
- debug={debug}
612
- expandToolOutputs={expandToolOutputs}
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={mirrorEnabled ? setInputSnapshot : undefined}
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="0.1.0"
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
+ };