@team-agent/installer 0.5.107 → 0.5.109

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.
@@ -0,0 +1,250 @@
1
+ Available models
2
+
3
+ auto - Auto (default)
4
+ gpt-5.3-codex-low - Codex 5.3 Low
5
+ gpt-5.3-codex-low-fast - Codex 5.3 Low Fast
6
+ gpt-5.3-codex - Codex 5.3
7
+ gpt-5.3-codex-fast - Codex 5.3 Fast
8
+ gpt-5.3-codex-high - Codex 5.3 High
9
+ gpt-5.3-codex-high-fast - Codex 5.3 High Fast
10
+ gpt-5.3-codex-xhigh - Codex 5.3 Extra High
11
+ gpt-5.3-codex-xhigh-fast - Codex 5.3 Extra High Fast
12
+ gpt-5.2 - GPT-5.2
13
+ composer-2.5 - Composer 2.5
14
+ claude-opus-5-thinking-high - Claude Opus 5 1M Thinking
15
+ claude-opus-5-thinking-high-fast - Claude Opus 5 1M Thinking Fast
16
+ gpt-5.6-sol-high - GPT-5.6 Sol 1M High
17
+ gpt-5.6-sol-high-fast - GPT-5.6 Sol 1M High Fast
18
+ gpt-5.6-sol-xhigh - GPT-5.6 Sol 1M Extra High
19
+ gpt-5.6-sol-xhigh-fast - GPT-5.6 Sol 1M Extra High Fast
20
+ claude-fable-5-thinking-high - Claude Fable 5 1M Thinking (NO ZDR)
21
+ claude-fable-5-thinking-xhigh - Claude Fable 5 1M Extra High Thinking (NO ZDR)
22
+ cursor-grok-4.5-high - Grok 4.5
23
+ cursor-grok-4.5-high-fast - Grok 4.5 Fast
24
+ gemini-3.7-flash-high - Gemini 3.7 Flash
25
+ claude-sonnet-5-thinking-high - Claude Sonnet 5 1M Thinking
26
+ claude-sonnet-5-thinking-xhigh - Claude Sonnet 5 1M Extra High Thinking
27
+ gpt-5.6-luna-high - GPT-5.6 Luna 1M High
28
+ grok-4.7-low - Grok 4.7 Low
29
+ grok-4.7-low-fast - Grok 4.7 Low Fast​​
30
+ grok-4.7-medium - Grok 4.7 Medium
31
+ grok-4.7-medium-fast - Grok 4.7 Medium Fast​​
32
+ grok-4.7-high - Grok 4.7 High
33
+ grok-4.7-high-fast - Grok 4.7 High Fast​​
34
+ grok-4.7-xhigh - Grok 4.7 Extra High
35
+ grok-4.7-xhigh-fast - Grok 4.7 Extra High Fast​​
36
+ cursor-grok-4.6-low - Grok 4.6 Low
37
+ cursor-grok-4.6-low-fast - Grok 4.6 Low Fast
38
+ cursor-grok-4.6-medium - Grok 4.6 Medium
39
+ cursor-grok-4.6-medium-fast - Grok 4.6 Medium Fast
40
+ cursor-grok-4.6-high - Grok 4.6
41
+ cursor-grok-4.6-high-fast - Grok 4.6 Fast
42
+ cursor-grok-4.6-xhigh - Grok 4.6 Extra High
43
+ cursor-grok-4.6-xhigh-fast - Grok 4.6 Extra High Fast
44
+ composer-2.5-fast - Composer 2.5 Fast
45
+ claude-opus-5-5-low - Claude Opus 5.5 1M Low
46
+ claude-opus-5-5-low-fast - Claude Opus 5.5 1M Low Fast
47
+ claude-opus-5-5-medium - Claude Opus 5.5 1M
48
+ claude-opus-5-5-medium-fast - Claude Opus 5.5 1M Fast
49
+ claude-opus-5-5-high - Claude Opus 5.5 1M High
50
+ claude-opus-5-5-high-fast - Claude Opus 5.5 1M High Fast
51
+ claude-opus-5-5-xhigh - Claude Opus 5.5 1M Extra High
52
+ claude-opus-5-5-xhigh-fast - Claude Opus 5.5 1M Extra High Fast
53
+ claude-opus-5-5-max - Claude Opus 5.5 1M Max
54
+ claude-opus-5-5-max-fast - Claude Opus 5.5 1M Max Fast
55
+ claude-opus-5-low - Claude Opus 5 1M Low
56
+ claude-opus-5-low-fast - Claude Opus 5 1M Low Fast
57
+ claude-opus-5-medium - Claude Opus 5 1M Medium
58
+ claude-opus-5-medium-fast - Claude Opus 5 1M Medium Fast
59
+ claude-opus-5-high - Claude Opus 5 1M
60
+ claude-opus-5-high-fast - Claude Opus 5 1M Fast
61
+ claude-opus-5-thinking-low - Claude Opus 5 1M Low Thinking
62
+ claude-opus-5-thinking-low-fast - Claude Opus 5 1M Low Thinking Fast
63
+ claude-opus-5-thinking-medium - Claude Opus 5 1M Medium Thinking
64
+ claude-opus-5-thinking-medium-fast - Claude Opus 5 1M Medium Thinking Fast
65
+ claude-opus-5-thinking-xhigh - Claude Opus 5 1M Extra High Thinking
66
+ claude-opus-5-thinking-xhigh-fast - Claude Opus 5 1M Extra High Thinking Fast
67
+ claude-opus-5-thinking-max - Claude Opus 5 1M Max Thinking
68
+ claude-opus-5-thinking-max-fast - Claude Opus 5 1M Max Thinking Fast
69
+ claude-opus-4-8-low - Claude Opus 4.8 1M Low
70
+ claude-opus-4-8-low-fast - Claude Opus 4.8 1M Low Fast
71
+ claude-opus-4-8-medium - Claude Opus 4.8 1M Medium
72
+ claude-opus-4-8-medium-fast - Claude Opus 4.8 1M Medium Fast
73
+ claude-opus-4-8-high - Claude Opus 4.8 1M
74
+ claude-opus-4-8-high-fast - Claude Opus 4.8 1M Fast
75
+ claude-opus-4-8-xhigh - Claude Opus 4.8 1M Extra High
76
+ claude-opus-4-8-xhigh-fast - Claude Opus 4.8 1M Extra High Fast
77
+ claude-opus-4-8-max - Claude Opus 4.8 1M Max
78
+ claude-opus-4-8-max-fast - Claude Opus 4.8 1M Max Fast
79
+ claude-opus-4-8-thinking-low - Claude Opus 4.8 1M Low Thinking
80
+ claude-opus-4-8-thinking-low-fast - Claude Opus 4.8 1M Low Thinking Fast
81
+ claude-opus-4-8-thinking-medium - Claude Opus 4.8 1M Medium Thinking
82
+ claude-opus-4-8-thinking-medium-fast - Claude Opus 4.8 1M Medium Thinking Fast
83
+ claude-opus-4-8-thinking-high - Claude Opus 4.8 1M Thinking
84
+ claude-opus-4-8-thinking-high-fast - Claude Opus 4.8 1M Thinking Fast
85
+ claude-opus-4-8-thinking-xhigh - Claude Opus 4.8 1M Extra High Thinking
86
+ claude-opus-4-8-thinking-xhigh-fast - Claude Opus 4.8 1M Extra High Thinking Fast
87
+ claude-opus-4-8-thinking-max - Claude Opus 4.8 1M Max Thinking
88
+ claude-opus-4-8-thinking-max-fast - Claude Opus 4.8 1M Max Thinking Fast
89
+ gpt-5.6-sol-none - GPT-5.6 Sol 1M None
90
+ gpt-5.6-sol-none-fast - GPT-5.6 Sol 1M None Fast
91
+ gpt-5.6-sol-low - GPT-5.6 Sol 1M Low
92
+ gpt-5.6-sol-low-fast - GPT-5.6 Sol 1M Low Fast
93
+ gpt-5.6-sol-medium - GPT-5.6 Sol 1M
94
+ gpt-5.6-sol-medium-fast - GPT-5.6 Sol 1M Fast
95
+ gpt-5.6-sol-max - GPT-5.6 Sol 1M Max
96
+ gpt-5.6-sol-max-fast - GPT-5.6 Sol 1M Max Fast
97
+ gpt-5.5-none - GPT-5.5 1M None
98
+ gpt-5.5-none-fast - GPT-5.5 None Fast
99
+ gpt-5.5-low - GPT-5.5 1M Low
100
+ gpt-5.5-low-fast - GPT-5.5 Low Fast
101
+ gpt-5.5-medium - GPT-5.5 1M
102
+ gpt-5.5-medium-fast - GPT-5.5 Fast
103
+ gpt-5.5-high - GPT-5.5 1M High
104
+ gpt-5.5-high-fast - GPT-5.5 High Fast
105
+ gpt-5.5-extra-high - GPT-5.5 1M Extra High
106
+ gpt-5.5-extra-high-fast - GPT-5.5 Extra High Fast
107
+ claude-fable-5-1-low - Claude Fable 5.1 1M Low (NO ZDR)
108
+ claude-fable-5-1-medium - Claude Fable 5.1 1M Medium (NO ZDR)
109
+ claude-fable-5-1-high - Claude Fable 5.1 1M (NO ZDR)
110
+ claude-fable-5-1-xhigh - Claude Fable 5.1 1M Extra High (NO ZDR)
111
+ claude-fable-5-1-max - Claude Fable 5.1 1M Max (NO ZDR)
112
+ claude-fable-5-1-thinking-low - Claude Fable 5.1 1M Low Thinking (NO ZDR)
113
+ claude-fable-5-1-thinking-medium - Claude Fable 5.1 1M Medium Thinking (NO ZDR)
114
+ claude-fable-5-1-thinking-high - Claude Fable 5.1 1M Thinking (NO ZDR)
115
+ claude-fable-5-1-thinking-xhigh - Claude Fable 5.1 1M Extra High Thinking (NO ZDR)
116
+ claude-fable-5-1-thinking-max - Claude Fable 5.1 1M Max Thinking (NO ZDR)
117
+ claude-fable-5-low - Claude Fable 5 1M Low (NO ZDR)
118
+ claude-fable-5-medium - Claude Fable 5 1M Medium (NO ZDR)
119
+ claude-fable-5-high - Claude Fable 5 1M (NO ZDR)
120
+ claude-fable-5-xhigh - Claude Fable 5 1M Extra High (NO ZDR)
121
+ claude-fable-5-max - Claude Fable 5 1M Max (NO ZDR)
122
+ claude-fable-5-thinking-low - Claude Fable 5 1M Low Thinking (NO ZDR)
123
+ claude-fable-5-thinking-medium - Claude Fable 5 1M Medium Thinking (NO ZDR)
124
+ claude-fable-5-thinking-max - Claude Fable 5 1M Max Thinking (NO ZDR)
125
+ cursor-grok-4.5-low - Grok 4.5 Low
126
+ cursor-grok-4.5-low-fast - Grok 4.5 Low Fast
127
+ cursor-grok-4.5-medium - Grok 4.5 Medium
128
+ cursor-grok-4.5-medium-fast - Grok 4.5 Medium Fast
129
+ gemini-3.8-flash-low - Gemini 3.8 Flash Low
130
+ gemini-3.8-flash-medium - Gemini 3.8 Flash Medium
131
+ gemini-3.8-flash-high - Gemini 3.8 Flash High
132
+ gemini-3.7-flash-low - Gemini 3.7 Flash Low
133
+ gemini-3.7-flash-medium - Gemini 3.7 Flash Medium
134
+ muse-spark-1.3-minimal - Muse Spark 1.3 1M Minimal
135
+ muse-spark-1.3-low - Muse Spark 1.3 1M Low
136
+ muse-spark-1.3-medium - Muse Spark 1.3 1M Medium
137
+ muse-spark-1.3-high - Muse Spark 1.3 1M
138
+ muse-spark-1.3-xhigh - Muse Spark 1.3 1M Extra High
139
+ muse-spark-1.3-max - Muse Spark 1.3 1M Max
140
+ gpt-5.6-terra-none - GPT-5.6 Terra 1M None
141
+ gpt-5.6-terra-none-fast - GPT-5.6 Terra 1M None Fast
142
+ gpt-5.6-terra-low - GPT-5.6 Terra 1M Low
143
+ gpt-5.6-terra-low-fast - GPT-5.6 Terra 1M Low Fast
144
+ gpt-5.6-terra-medium - GPT-5.6 Terra 1M
145
+ gpt-5.6-terra-medium-fast - GPT-5.6 Terra 1M Fast
146
+ gpt-5.6-terra-high - GPT-5.6 Terra 1M High
147
+ gpt-5.6-terra-high-fast - GPT-5.6 Terra 1M High Fast
148
+ gpt-5.6-terra-xhigh - GPT-5.6 Terra 1M Extra High
149
+ gpt-5.6-terra-xhigh-fast - GPT-5.6 Terra 1M Extra High Fast
150
+ gpt-5.6-terra-max - GPT-5.6 Terra 1M Max
151
+ gpt-5.6-terra-max-fast - GPT-5.6 Terra 1M Max Fast
152
+ claude-sonnet-5-5-low - Claude Sonnet 5.5 Low
153
+ claude-sonnet-5-5-medium - Claude Sonnet 5.5 Medium
154
+ claude-sonnet-5-5-high - Claude Sonnet 5.5 High
155
+ claude-sonnet-5-5-xhigh - Claude Sonnet 5.5 Extra High
156
+ claude-sonnet-5-5-max - Claude Sonnet 5.5 Max
157
+ claude-sonnet-5-low - Claude Sonnet 5 1M Low
158
+ claude-sonnet-5-medium - Claude Sonnet 5 1M Medium
159
+ claude-sonnet-5-high - Claude Sonnet 5 1M
160
+ claude-sonnet-5-xhigh - Claude Sonnet 5 1M Extra High
161
+ claude-sonnet-5-max - Claude Sonnet 5 1M Max
162
+ claude-sonnet-5-thinking-low - Claude Sonnet 5 1M Low Thinking
163
+ claude-sonnet-5-thinking-medium - Claude Sonnet 5 1M Medium Thinking
164
+ claude-sonnet-5-thinking-max - Claude Sonnet 5 1M Max Thinking
165
+ claude-4.6-sonnet-medium - Claude Sonnet 4.6 1M
166
+ claude-4.6-sonnet-medium-thinking - Claude Sonnet 4.6 1M Thinking
167
+ claude-opus-4-7-low - Claude Opus 4.7 1M Low
168
+ claude-opus-4-7-low-fast - Claude Opus 4.7 1M Low Fast
169
+ claude-opus-4-7-medium - Claude Opus 4.7 1M Medium
170
+ claude-opus-4-7-medium-fast - Claude Opus 4.7 1M Medium Fast
171
+ claude-opus-4-7-high - Claude Opus 4.7 1M High
172
+ claude-opus-4-7-high-fast - Claude Opus 4.7 1M High Fast
173
+ claude-opus-4-7-xhigh - Claude Opus 4.7 1M
174
+ claude-opus-4-7-xhigh-fast - Claude Opus 4.7 1M Fast
175
+ claude-opus-4-7-max - Claude Opus 4.7 1M Max
176
+ claude-opus-4-7-max-fast - Claude Opus 4.7 1M Max Fast
177
+ claude-opus-4-7-thinking-low - Claude Opus 4.7 1M Low Thinking
178
+ claude-opus-4-7-thinking-low-fast - Claude Opus 4.7 1M Low Thinking Fast
179
+ claude-opus-4-7-thinking-medium - Claude Opus 4.7 1M Medium Thinking
180
+ claude-opus-4-7-thinking-medium-fast - Claude Opus 4.7 1M Medium Thinking Fast
181
+ claude-opus-4-7-thinking-high - Claude Opus 4.7 1M High Thinking
182
+ claude-opus-4-7-thinking-high-fast - Claude Opus 4.7 1M High Thinking Fast
183
+ claude-opus-4-7-thinking-xhigh - Claude Opus 4.7 1M Thinking
184
+ claude-opus-4-7-thinking-xhigh-fast - Claude Opus 4.7 1M Thinking Fast
185
+ claude-opus-4-7-thinking-max - Claude Opus 4.7 1M Max Thinking
186
+ claude-opus-4-7-thinking-max-fast - Claude Opus 4.7 1M Max Thinking Fast
187
+ gpt-5.4-low - GPT-5.4 1M Low
188
+ gpt-5.4-medium - GPT-5.4 1M
189
+ gpt-5.4-medium-fast - GPT-5.4 Fast
190
+ gpt-5.4-high - GPT-5.4 1M High
191
+ gpt-5.4-high-fast - GPT-5.4 High Fast
192
+ gpt-5.4-xhigh - GPT-5.4 1M Extra High
193
+ gpt-5.4-xhigh-fast - GPT-5.4 Extra High Fast
194
+ claude-4.6-opus-high - Claude Opus 4.6 1M
195
+ claude-4.6-opus-max - Claude Opus 4.6 1M Max
196
+ claude-4.6-opus-high-thinking - Claude Opus 4.6 1M Thinking
197
+ claude-4.6-opus-max-thinking - Claude Opus 4.6 1M Max Thinking
198
+ claude-4.5-opus-high - Claude Opus 4.5
199
+ claude-4.5-opus-high-thinking - Claude Opus 4.5 Thinking
200
+ gpt-5.2-low - GPT-5.2 Low
201
+ gpt-5.2-low-fast - GPT-5.2 Low Fast
202
+ gpt-5.2-fast - GPT-5.2 Fast
203
+ gpt-5.2-high - GPT-5.2 High
204
+ gpt-5.2-high-fast - GPT-5.2 High Fast
205
+ gpt-5.2-xhigh - GPT-5.2 Extra High
206
+ gpt-5.2-xhigh-fast - GPT-5.2 Extra High Fast
207
+ gpt-5.6-luna-none - GPT-5.6 Luna 1M None
208
+ gpt-5.6-luna-none-fast - GPT-5.6 Luna 1M None Fast
209
+ gpt-5.6-luna-low - GPT-5.6 Luna 1M Low (current)
210
+ gpt-5.6-luna-low-fast - GPT-5.6 Luna 1M Low Fast
211
+ gpt-5.6-luna-medium - GPT-5.6 Luna 1M
212
+ gpt-5.6-luna-medium-fast - GPT-5.6 Luna 1M Fast
213
+ gpt-5.6-luna-high-fast - GPT-5.6 Luna 1M High Fast
214
+ gpt-5.6-luna-xhigh - GPT-5.6 Luna 1M Extra High
215
+ gpt-5.6-luna-xhigh-fast - GPT-5.6 Luna 1M Extra High Fast
216
+ gpt-5.6-luna-max - GPT-5.6 Luna 1M Max
217
+ gpt-5.6-luna-max-fast - GPT-5.6 Luna 1M Max Fast
218
+ gemini-3.6-flash-minimal - Gemini 3.6 Flash Minimal
219
+ gemini-3.6-flash-low - Gemini 3.6 Flash Low
220
+ gemini-3.6-flash-medium - Gemini 3.6 Flash Medium
221
+ gemini-3.6-flash-high - Gemini 3.6 Flash
222
+ gemini-3.1-pro - Gemini 3.1 Pro
223
+ gpt-5.4-mini-none - GPT-5.4 Mini None
224
+ gpt-5.4-mini-low - GPT-5.4 Mini Low
225
+ gpt-5.4-mini-medium - GPT-5.4 Mini
226
+ gpt-5.4-mini-high - GPT-5.4 Mini High
227
+ gpt-5.4-mini-xhigh - GPT-5.4 Mini Extra High
228
+ gpt-5.4-nano-none - GPT-5.4 Nano None
229
+ gpt-5.4-nano-low - GPT-5.4 Nano Low
230
+ gpt-5.4-nano-medium - GPT-5.4 Nano
231
+ gpt-5.4-nano-high - GPT-5.4 Nano High
232
+ gpt-5.4-nano-xhigh - GPT-5.4 Nano Extra High
233
+ claude-4.5-sonnet - Claude Sonnet 4.5
234
+ claude-4.5-sonnet-thinking - Claude Sonnet 4.5 Thinking
235
+ gpt-5.1-low - GPT-5.1 Low
236
+ gpt-5.1 - GPT-5.1
237
+ gpt-5.1-high - GPT-5.1 High
238
+ gemini-3-flash - Gemini 3 Flash
239
+ gemini-3.5-flash - Gemini 3.5 Flash
240
+ claude-4-sonnet - Claude Sonnet 4
241
+ claude-4-sonnet-thinking - Claude Sonnet 4 Thinking
242
+ gpt-5-mini - GPT-5 Mini
243
+ kimi-k3-low - Kimi K3 Low
244
+ kimi-k3-high - Kimi K3 High
245
+ kimi-k3-max - Kimi K3
246
+ kimi-k2.7-code - Kimi K2.7 Code
247
+ glm-5.2-high - GLM 5.2
248
+ glm-5.2-max - GLM 5.2 Max
249
+
250
+ Tip: use --model <id> (or /model <id> in interactive mode) to switch. Parameterized models also accept quoted overrides, e.g. --model 'claude-opus-4-8[context=1m,effort=high,fast=false]'.
@@ -0,0 +1,9 @@
1
+ You are logged in with grok.com.
2
+
3
+ Default model: grok-4.6
4
+
5
+ Available models:
6
+ - grok-4.7
7
+ - grok-4.7-build-fast
8
+ - grok-4.5
9
+ * grok-4.6 (default)
@@ -0,0 +1,7 @@
1
+ You are not authenticated.
2
+
3
+ Default model: grok-4.7
4
+
5
+ Available models:
6
+ * grok-4.7 (default)
7
+ - grok-4.6
@@ -173,11 +173,14 @@ impl RealCommandRunner {
173
173
  let stdout_thread = std::thread::spawn(move || read_pipe(stdout));
174
174
  let stderr_thread = std::thread::spawn(move || read_pipe(stderr));
175
175
  let deadline = Instant::now() + COMMAND_TIMEOUT;
176
+ // Observe short-lived commands promptly; retain the old cadence for long ones.
177
+ let mut poll_interval = Duration::from_millis(1);
176
178
  let status = loop {
177
179
  if let Some(status) = child.try_wait()? {
178
180
  break status;
179
181
  }
180
- if Instant::now() >= deadline {
182
+ let now = Instant::now();
183
+ if now >= deadline {
181
184
  child.kill()?;
182
185
  child.wait()?;
183
186
  let _ = join_pipe_reader(stdout_thread)?;
@@ -187,7 +190,8 @@ impl RealCommandRunner {
187
190
  format!("{program} exceeded 5s timeout"),
188
191
  ));
189
192
  }
190
- std::thread::sleep(Duration::from_millis(25));
193
+ std::thread::sleep(poll_interval.min(deadline.saturating_duration_since(now)));
194
+ poll_interval = (poll_interval * 2).min(Duration::from_millis(25));
191
195
  };
192
196
  let stdout = join_pipe_reader(stdout_thread)?;
193
197
  let stderr = join_pipe_reader(stderr_thread)?;
@@ -4315,3 +4319,96 @@ fn non_empty(raw: &str) -> Option<&str> {
4315
4319
  // tmux is a Unix concept), the test module stays Unix-only.
4316
4320
  #[cfg(all(test, unix))]
4317
4321
  mod tests;
4322
+
4323
+ #[cfg(all(test, unix))]
4324
+ mod command_runner_regressions {
4325
+ use super::{CommandRunner, RealCommandRunner, COMMAND_TIMEOUT};
4326
+ use std::io::ErrorKind;
4327
+ use std::time::{Duration, Instant, SystemTime, UNIX_EPOCH};
4328
+
4329
+ fn shell(command: &str) -> Vec<String> {
4330
+ vec!["/bin/sh".into(), "-c".into(), command.into()]
4331
+ }
4332
+
4333
+ #[test]
4334
+ fn nonzero_exit_preserves_both_outputs_and_lossy_utf8() {
4335
+ let output = RealCommandRunner
4336
+ .run(&shell("printf 'stdout\\377'; printf 'stderr\\376' >&2; exit 17"))
4337
+ .unwrap();
4338
+ assert!(!output.success);
4339
+ assert_eq!(output.code, Some(17));
4340
+ assert_eq!(output.stdout, "stdout\u{fffd}");
4341
+ assert_eq!(output.stderr, "stderr\u{fffd}");
4342
+ }
4343
+
4344
+ #[test]
4345
+ fn stdin_is_delivered_and_closed_before_waiting_for_exit() {
4346
+ let input = "first line\nsecond λ line\n".repeat(32);
4347
+ let output = RealCommandRunner
4348
+ .run_with_stdin(&["/bin/cat".into()], &input)
4349
+ .unwrap();
4350
+ assert!(output.success);
4351
+ assert_eq!(output.code, Some(0));
4352
+ assert_eq!(output.stdout, input);
4353
+ assert_eq!(output.stderr, "");
4354
+ }
4355
+
4356
+ #[test]
4357
+ fn signal_exit_retains_absent_exit_code() {
4358
+ let output = RealCommandRunner.run(&shell("kill -TERM $$")).unwrap();
4359
+ assert!(!output.success);
4360
+ assert_eq!(output.code, None);
4361
+ }
4362
+
4363
+ #[test]
4364
+ fn drains_stdout_and_stderr_beyond_pipe_capacity() {
4365
+ let output = RealCommandRunner
4366
+ .run(&shell(
4367
+ "i=0; while [ \"$i\" -lt 20000 ]; do printf 'out\\n'; printf 'err\\n' >&2; i=$((i+1)); done",
4368
+ ))
4369
+ .unwrap();
4370
+ assert!(output.success);
4371
+ assert_eq!(output.code, Some(0));
4372
+ assert_eq!(output.stdout, "out\n".repeat(20000));
4373
+ assert_eq!(output.stderr, "err\n".repeat(20000));
4374
+ }
4375
+
4376
+ #[test]
4377
+ fn timeout_keeps_five_second_budget_and_reaps_the_owned_child() {
4378
+ let nonce = SystemTime::now()
4379
+ .duration_since(UNIX_EPOCH)
4380
+ .unwrap()
4381
+ .as_nanos();
4382
+ let pid_path = std::env::temp_dir().join(format!(
4383
+ "team-agent-runner-timeout-{}-{nonce}.pid",
4384
+ std::process::id()
4385
+ ));
4386
+ let file = std::fs::OpenOptions::new()
4387
+ .write(true)
4388
+ .create_new(true)
4389
+ .open(&pid_path)
4390
+ .unwrap();
4391
+ drop(file);
4392
+ // exec keeps one owned PID and closes both pipes when the runner kills it.
4393
+ let mut argv = shell("printf '%s' \"$$\" > \"$1\"; exec /bin/sleep 30");
4394
+ argv.extend([
4395
+ "runner-timeout-test".into(),
4396
+ pid_path.to_string_lossy().into_owned(),
4397
+ ]);
4398
+ let started = Instant::now();
4399
+ let error = RealCommandRunner.run(&argv).unwrap_err();
4400
+ let elapsed = started.elapsed();
4401
+ let pid: i32 = std::fs::read_to_string(&pid_path).unwrap().parse().unwrap();
4402
+ std::fs::remove_file(pid_path).unwrap();
4403
+ assert_eq!(error.kind(), ErrorKind::TimedOut);
4404
+ assert!(elapsed >= COMMAND_TIMEOUT);
4405
+ assert!(elapsed < COMMAND_TIMEOUT + Duration::from_secs(2));
4406
+ assert!(pid > 1);
4407
+ // SAFETY: signal 0 only probes the exact child PID recorded by this fixture.
4408
+ assert_eq!(unsafe { libc::kill(pid, 0) }, -1);
4409
+ assert_eq!(
4410
+ std::io::Error::last_os_error().raw_os_error(),
4411
+ Some(libc::ESRCH)
4412
+ );
4413
+ }
4414
+ }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@team-agent/installer",
3
- "version": "0.5.107",
3
+ "version": "0.5.109",
4
4
  "description": "npx installer for Team Agent",
5
5
  "keywords": [
6
6
  "codex",
@@ -20,9 +20,9 @@
20
20
  "team-agent-installer": "npm/install.mjs"
21
21
  },
22
22
  "optionalDependencies": {
23
- "@team-agent/cli-darwin-arm64": "0.5.107",
24
- "@team-agent/cli-darwin-x64": "0.5.107",
25
- "@team-agent/cli-linux-x64": "0.5.107"
23
+ "@team-agent/cli-darwin-arm64": "0.5.109",
24
+ "@team-agent/cli-darwin-x64": "0.5.109",
25
+ "@team-agent/cli-linux-x64": "0.5.109"
26
26
  },
27
27
  "scripts": {
28
28
  "postinstall": "node npm/bincheck.mjs",