Repository navigation
fix: list large artifact datasets and explain the listing cap - #749
devin-ai-integration[bot] wants to merge 18 commits into
Conversation
Raise the artifact listing cap from 2,000 to 10,000 nodes, list each folder's siblings before descending so a capped tree never drops whole folders, derive the SSE fingerprint from the same traversal, and state the cap and on-disk location in the truncation notice. Fixes OR-585 Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".
|
[Medium impact] The PR appears safe to merge; no new blocking issue was found. SummaryRaises the artifact listing cap to 10,000 and keeps sibling folders visible when a listing reaches it.
No new actionable issues were found. The previous threads were unnumbered, so none require numbered finding entries.
|
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@greptileai review |
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@greptileai review |
1 similar comment
|
@greptileai review |
…fact-listing-cap Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> # Conflicts: # ui/dist/assets/PdfPreview-Bh6puvd-.js # ui/dist/assets/PdfPreview-Cr9nWodS.js # ui/dist/assets/PdfPreview-Dn2XGhUv.js # ui/dist/assets/index-BwOfMXM0.js # ui/dist/assets/index-DHbi4ZWi.js # ui/dist/assets/index-DNEZ9j_w.js # ui/dist/index.html
|
@greptileai review |
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@greptileai review |
…fact-listing-cap Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> # Conflicts: # ui/dist/assets/PdfPreview-9b5qPNPi.js # ui/dist/assets/PdfPreview-Bh6puvd-.js # ui/dist/assets/PdfPreview-DHY1H0AM.js # ui/dist/assets/index-CQIDX7GA.js # ui/dist/assets/index-DNEZ9j_w.js # ui/dist/assets/index-DjlqofzY.js # ui/dist/index.html
|
@greptileai review |
Folders the capped listing didn't finish are marked partial; opening one lists it on its own (?dir=) with a fresh cap, so every file stays reachable through directory navigation. Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@greptileai review |
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@greptileai review |
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@greptileai review |
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@greptileai review |
…fact-listing-cap Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> # Conflicts: # ui/dist/assets/PdfPreview-CfnQeP9Q.js # ui/dist/assets/PdfPreview-CsvPNokB.js # ui/dist/assets/PdfPreview-DHY1H0AM.js # ui/dist/assets/index-B1Sbkrve.js # ui/dist/assets/index-BsYgd7Kt.js # ui/dist/assets/index-CQIDX7GA.js # ui/dist/index.html
|
@greptileai review |
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@greptileai review |
…fact-listing-cap Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> # Conflicts: # ui/dist/assets/PdfPreview-CKyJoJPc.js # ui/dist/assets/PdfPreview-CsvPNokB.js # ui/dist/assets/PdfPreview-YHPVr7ta.js # ui/dist/assets/index-BsYgd7Kt.js # ui/dist/assets/index-CV-jxtEm.js # ui/dist/assets/index-Cqdzdm_Q.js # ui/dist/index.html
|
@greptileai review |
…fact-listing-cap Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> # Conflicts: # ui/dist/assets/PdfPreview-Arq-xDe9.js # ui/dist/assets/PdfPreview-CKyJoJPc.js # ui/dist/assets/PdfPreview-DyW6mz8f.js # ui/dist/assets/index-BRHnE0ar.js # ui/dist/assets/index-BfOmY9IZ.js # ui/dist/assets/index-Cqdzdm_Q.js # ui/dist/index.html
|
@greptileai review |
…fact-listing-cap Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> # Conflicts: # ui/dist/assets/PdfPreview-Arq-xDe9.js # ui/dist/assets/PdfPreview-BESv4u66.js # ui/dist/assets/PdfPreview-DMaQ28uR.js # ui/dist/assets/index-BWXSOt3p.js # ui/dist/assets/index-BfOmY9IZ.js # ui/dist/assets/index-CHTdcS2r.js # ui/dist/index.html
|
@greptileai review |
Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
|
@greptileai review |
|
@greptileai review — bb1671d keeps each opened folder's |
…fact-listing-cap Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> # Conflicts: # ui/dist/assets/PdfPreview-B3N1d7je.js # ui/dist/assets/PdfPreview-BESv4u66.js # ui/dist/assets/PdfPreview-BvWccRfV.js # ui/dist/assets/index-CGSgsrbT.js # ui/dist/assets/index-CHTdcS2r.js # ui/dist/assets/index-DFE76ylj.js # ui/dist/index.html
|
@greptileai review |
…fact-listing-cap Co-Authored-By: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> # Conflicts: # ui/dist/assets/PdfPreview-1jfQSPzX.js # ui/dist/assets/PdfPreview-BvWccRfV.js # ui/dist/assets/PdfPreview-Drs1tUZu.js # ui/dist/assets/index-CE2Gq4kH.js # ui/dist/assets/index-CujjRTy1.js # ui/dist/assets/index-DFE76ylj.js # ui/dist/index.html
|
@greptileai review |
Fixes OR-585.
Summary
The Artifacts pane listing (
local::files::collect_tree) stopped at a globalMAX_ENTRIES = 2000nodes. That count is depth-first and followsread_dirorder, so an extracted dataset with 6,750 images in 15 class folders showed only 5 folders, never showed the other 10, and only said "Listing truncated — the folder has more artifacts."MAX_ENTRIESgoes from 2,000 to 10,000, so a dataset of this size now lists in full.collect_treelists all siblings in a folder before descending into any of them. If the cap is hit, every folder it reached still appears (the class folders stay visible and some just list fewer files), and the result is still sorted. Before, an earlyreturnskipped the sort.collect_treerecurses with each directory's originalentry.path(), stops descending once an entry has been omitted, and only setstruncatedwhen a listable (non-ignored) entry is actually dropped.limit.fingerprint(the 2Hz SSE change detector) now hashes thecollect_treeoutput instead of running its own separate depth-first walk (hash_dir, removed). It now covers exactly the nodes that are listed, plus thetruncated/partialflags.partial.GET /api/projects/{id}/files?dir=<path>(checked withresolve_contained) lists one folder on its own with a fresh 10,000 budget. In the UI, a partial folder stays collapsed rather than looking empty. Opening it fetches that listing and grafts it into the tree. Opened partial folders are outside the SSE fingerprint, so they poll every 2s while visible. A failed load shows an error or closes the folder, and reopening it retries.ArtifactsListinggainslimit. The truncation notice now gives the cap and the on-disk folder: "Showing the first 10,000 artifacts. The rest are still on disk in {dir}." All 9 locales are updated andui/distis rebuilt.?dir=listing is also capped (more than 10,000 entries directly inside it) gets its own notice naming that folder's on-disk path.Test plan
capped_listing_keeps_every_sibling_folderunit test (covers sibling preservation,partial, and the fresh budget for a sub-listing) andlisting_exactly_at_cap_is_not_truncated, plus the existinglocal::filestestscargo fmt --check,cargo clippy --all-targets -- -D warnings,pnpm build(i18n lint, typecheck), UI node testsmain(Linux, dev slot, a real Claude Code chat creates 15 × 450 PNGs): only 5 of 15 class folders are shown, with the truncation notice3d2dd843(after mergingorigin/main), same flow with real Claude Code chats:class_15lists throughimg_0449.png, and there's no truncation notice.class_06was partial with zero children and showed collapsed. Clicking it loaded all of its files (807, throughimg_0806.png), and the preview works.class_06open, Claude added a new PNG, and it appeared about 1.2s later with no reload.<artifacts dir>/wide_10050.limitfallback for older hosts, and a listing at exactly the cap (that case is covered by a unit test)Bug reproduction on
mainPost-fix functionality on this branch
Link to Devin session: https://app.devin.ai/sessions/8dd441464c614938afa8bc3b73b32c9b
Open in Devin Desktop: https://app.devin.ai/desktop/session/8dd441464c614938afa8bc3b73b32c9b?variant=devin