Commit 54c2e9c
committed
Give read_file a resumable cursor instead of same-path pagination
read-file-guard-plugin truncated large reads and told the model to
"use offset=N to continue" against the identical path. Each page was
a technically-legitimate but literally same-path read_file call, which
is exactly the shape a trace scan (CL-6961) found in 97% of "4+ reads
of one path" clusters: chunked pagination indistinguishable from
looping.
Every truncated read now mints a single-use tool-output:///{cursor}
handle pointing at the exact resumption point (source path/blob URI +
next offset) and rewrites the notice to hand back that path instead.
Following the cursor resolves through the same isToolOutputLike branch
already used for real tool-output spills, so no new call surface is
needed. Each hop therefore targets a distinct path, and the handle is
real and resolvable -- it does not promise retrievable bytes that
don't exist, it just remembers where to resume a fresh bounded read.
Rejected: raising MAX_RESULT_CHARS just moves the same boundary.
Rejected: spilling the full remainder into a tool-output blob (making
the existing "not retrievable" promise literally true by storing the
bytes) would defeat read-file-guard-plugin's whole reason for existing
-- streaming reads so a huge file is never buffered into memory to
avoid OOM. A cursor gets the same "keep re-reading" ergonomics without
ever materializing more than one bounded page at a time.1 parent 2369021 commit 54c2e9c
3 files changed
Lines changed: 181 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
200 | 200 | | |
201 | 201 | | |
202 | 202 | | |
203 | | - | |
| 203 | + | |
| 204 | + | |
204 | 205 | | |
205 | 206 | | |
206 | 207 | | |
| |||
277 | 278 | | |
278 | 279 | | |
279 | 280 | | |
| 281 | + | |
| 282 | + | |
| 283 | + | |
| 284 | + | |
| 285 | + | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
| 306 | + | |
| 307 | + | |
| 308 | + | |
| 309 | + | |
| 310 | + | |
| 311 | + | |
| 312 | + | |
| 313 | + | |
| 314 | + | |
| 315 | + | |
| 316 | + | |
| 317 | + | |
| 318 | + | |
| 319 | + | |
| 320 | + | |
| 321 | + | |
| 322 | + | |
| 323 | + | |
| 324 | + | |
| 325 | + | |
| 326 | + | |
| 327 | + | |
| 328 | + | |
| 329 | + | |
| 330 | + | |
| 331 | + | |
| 332 | + | |
| 333 | + | |
| 334 | + | |
| 335 | + | |
| 336 | + | |
| 337 | + | |
| 338 | + | |
| 339 | + | |
| 340 | + | |
| 341 | + | |
| 342 | + | |
| 343 | + | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
| 349 | + | |
| 350 | + | |
| 351 | + | |
| 352 | + | |
| 353 | + | |
| 354 | + | |
| 355 | + | |
280 | 356 | | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
1 | 2 | | |
2 | 3 | | |
3 | 4 | | |
4 | 5 | | |
5 | 6 | | |
6 | 7 | | |
7 | 8 | | |
8 | | - | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
9 | 14 | | |
10 | 15 | | |
11 | 16 | | |
| |||
41 | 46 | | |
42 | 47 | | |
43 | 48 | | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
44 | 88 | | |
45 | 89 | | |
46 | 90 | | |
| |||
297 | 341 | | |
298 | 342 | | |
299 | 343 | | |
| 344 | + | |
| 345 | + | |
| 346 | + | |
| 347 | + | |
| 348 | + | |
300 | 349 | | |
301 | 350 | | |
302 | 351 | | |
| |||
306 | 355 | | |
307 | 356 | | |
308 | 357 | | |
309 | | - | |
| 358 | + | |
310 | 359 | | |
311 | 360 | | |
312 | 361 | | |
313 | 362 | | |
314 | 363 | | |
315 | 364 | | |
| 365 | + | |
| 366 | + | |
| 367 | + | |
| 368 | + | |
| 369 | + | |
| 370 | + | |
| 371 | + | |
| 372 | + | |
| 373 | + | |
| 374 | + | |
| 375 | + | |
| 376 | + | |
| 377 | + | |
| 378 | + | |
| 379 | + | |
| 380 | + | |
| 381 | + | |
| 382 | + | |
| 383 | + | |
| 384 | + | |
| 385 | + | |
| 386 | + | |
| 387 | + | |
| 388 | + | |
| 389 | + | |
| 390 | + | |
| 391 | + | |
| 392 | + | |
| 393 | + | |
| 394 | + | |
| 395 | + | |
| 396 | + | |
| 397 | + | |
| 398 | + | |
| 399 | + | |
| 400 | + | |
| 401 | + | |
| 402 | + | |
| 403 | + | |
| 404 | + | |
| 405 | + | |
| 406 | + | |
| 407 | + | |
| 408 | + | |
| 409 | + | |
316 | 410 | | |
317 | 411 | | |
318 | 412 | | |
| |||
322 | 416 | | |
323 | 417 | | |
324 | 418 | | |
| 419 | + | |
325 | 420 | | |
326 | 421 | | |
327 | 422 | | |
328 | 423 | | |
329 | | - | |
| 424 | + | |
330 | 425 | | |
331 | 426 | | |
332 | 427 | | |
| |||
346 | 441 | | |
347 | 442 | | |
348 | 443 | | |
| 444 | + | |
349 | 445 | | |
350 | 446 | | |
351 | 447 | | |
352 | | - | |
| 448 | + | |
| 449 | + | |
| 450 | + | |
| 451 | + | |
353 | 452 | | |
354 | 453 | | |
355 | 454 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | | - | |
| 1 | + | |
2 | 2 | | |
3 | 3 | | |
4 | 4 | | |
| |||
0 commit comments