Commit f5c7f2c
committed
fix(bash): avoid O(n²) memory growth for large command output
Previously, output was accumulated via `output += chunk.toString()` which
creates a new string for every chunk, causing O(n²) memory usage. For
commands producing megabytes of output, this caused catastrophic memory
consumption.
Add StreamingOutput class that:
- Accumulates output in memory up to 50KB threshold
- Spills to a temp file when threshold exceeded
- Tracks bytes incrementally to avoid scanning
Fixes memory exhaustion on commands like `find /` or large builds.
Assisted-by: OpenCode (Claude Sonnet 4)1 parent f96d269 commit f5c7f2c
4 files changed
Lines changed: 319 additions & 48 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
29 | 29 | | |
30 | 30 | | |
31 | 31 | | |
32 | | - | |
| 32 | + | |
33 | 33 | | |
34 | 34 | | |
35 | 35 | | |
| |||
44 | 44 | | |
45 | 45 | | |
46 | 46 | | |
47 | | - | |
| 47 | + | |
| 48 | + | |
48 | 49 | | |
49 | 50 | | |
50 | 51 | | |
| |||
1475 | 1476 | | |
1476 | 1477 | | |
1477 | 1478 | | |
| 1479 | + | |
| 1480 | + | |
1478 | 1481 | | |
1479 | 1482 | | |
1480 | 1483 | | |
1481 | | - | |
1482 | 1484 | | |
1483 | 1485 | | |
1484 | 1486 | | |
1485 | 1487 | | |
| 1488 | + | |
1486 | 1489 | | |
1487 | 1490 | | |
1488 | | - | |
1489 | | - | |
1490 | | - | |
1491 | | - | |
| 1491 | + | |
| 1492 | + | |
1492 | 1493 | | |
1493 | 1494 | | |
1494 | | - | |
| 1495 | + | |
1495 | 1496 | | |
1496 | 1497 | | |
1497 | 1498 | | |
1498 | 1499 | | |
1499 | | - | |
| 1500 | + | |
1500 | 1501 | | |
1501 | | - | |
1502 | | - | |
1503 | | - | |
1504 | | - | |
1505 | | - | |
1506 | | - | |
1507 | | - | |
1508 | | - | |
1509 | | - | |
1510 | | - | |
| 1502 | + | |
| 1503 | + | |
1511 | 1504 | | |
1512 | 1505 | | |
1513 | 1506 | | |
| |||
1526 | 1519 | | |
1527 | 1520 | | |
1528 | 1521 | | |
1529 | | - | |
1530 | | - | |
1531 | | - | |
| 1522 | + | |
| 1523 | + | |
1532 | 1524 | | |
| 1525 | + | |
| 1526 | + | |
| 1527 | + | |
| 1528 | + | |
| 1529 | + | |
| 1530 | + | |
| 1531 | + | |
| 1532 | + | |
| 1533 | + | |
| 1534 | + | |
| 1535 | + | |
| 1536 | + | |
| 1537 | + | |
| 1538 | + | |
| 1539 | + | |
| 1540 | + | |
| 1541 | + | |
1533 | 1542 | | |
1534 | 1543 | | |
1535 | 1544 | | |
1536 | 1545 | | |
| 1546 | + | |
| 1547 | + | |
1537 | 1548 | | |
1538 | | - | |
| 1549 | + | |
1539 | 1550 | | |
| 1551 | + | |
1540 | 1552 | | |
1541 | 1553 | | |
| 1554 | + | |
1542 | 1555 | | |
1543 | | - | |
1544 | | - | |
1545 | | - | |
1546 | | - | |
1547 | | - | |
1548 | | - | |
1549 | | - | |
1550 | | - | |
1551 | | - | |
| 1556 | + | |
| 1557 | + | |
| 1558 | + | |
| 1559 | + | |
| 1560 | + | |
| 1561 | + | |
| 1562 | + | |
| 1563 | + | |
| 1564 | + | |
| 1565 | + | |
| 1566 | + | |
| 1567 | + | |
| 1568 | + | |
| 1569 | + | |
| 1570 | + | |
| 1571 | + | |
| 1572 | + | |
| 1573 | + | |
| 1574 | + | |
| 1575 | + | |
| 1576 | + | |
| 1577 | + | |
| 1578 | + | |
| 1579 | + | |
| 1580 | + | |
| 1581 | + | |
| 1582 | + | |
| 1583 | + | |
| 1584 | + | |
| 1585 | + | |
1552 | 1586 | | |
1553 | | - | |
1554 | | - | |
1555 | | - | |
| 1587 | + | |
1556 | 1588 | | |
1557 | 1589 | | |
1558 | 1590 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
9 | 9 | | |
10 | 10 | | |
11 | 11 | | |
12 | | - | |
13 | 12 | | |
14 | 13 | | |
15 | 14 | | |
16 | 15 | | |
17 | 16 | | |
18 | | - | |
| 17 | + | |
19 | 18 | | |
20 | 19 | | |
21 | 20 | | |
22 | 21 | | |
23 | 22 | | |
24 | 23 | | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
25 | 32 | | |
26 | 33 | | |
27 | 34 | | |
| |||
80 | 87 | | |
81 | 88 | | |
82 | 89 | | |
| 90 | + | |
83 | 91 | | |
84 | 92 | | |
85 | 93 | | |
| |||
154 | 162 | | |
155 | 163 | | |
156 | 164 | | |
| 165 | + | |
| 166 | + | |
157 | 167 | | |
158 | 168 | | |
159 | 169 | | |
| |||
164 | 174 | | |
165 | 175 | | |
166 | 176 | | |
167 | | - | |
168 | | - | |
169 | 177 | | |
170 | 178 | | |
171 | 179 | | |
| |||
175 | 183 | | |
176 | 184 | | |
177 | 185 | | |
178 | | - | |
| 186 | + | |
| 187 | + | |
| 188 | + | |
179 | 189 | | |
180 | 190 | | |
181 | | - | |
182 | | - | |
| 191 | + | |
183 | 192 | | |
184 | 193 | | |
185 | 194 | | |
| |||
228 | 237 | | |
229 | 238 | | |
230 | 239 | | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
231 | 246 | | |
232 | 247 | | |
233 | | - | |
| 248 | + | |
234 | 249 | | |
| 250 | + | |
235 | 251 | | |
236 | 252 | | |
237 | 253 | | |
238 | | - | |
239 | 254 | | |
240 | 255 | | |
241 | 256 | | |
242 | | - | |
243 | 257 | | |
244 | | - | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
245 | 274 | | |
246 | 275 | | |
| 276 | + | |
247 | 277 | | |
248 | 278 | | |
249 | 279 | | |
250 | 280 | | |
251 | 281 | | |
252 | 282 | | |
253 | | - | |
| 283 | + | |
254 | 284 | | |
255 | 285 | | |
256 | 286 | | |
| |||
0 commit comments