Added undefined checks to markdown elements. For example, in the `DatasetAsImage.vue` component, we had an unlimited fetch for `/api/datasets/%7Bdataset_id%7D/extra_files` because the `dataset_id` can potentially be undefined; if we have an problematic request for, say:
```
history_dataset_as_image(invocation_id=b7c1d0811979026c, output="Output Name")
```
where this can sometimes return arguments without a `history_dataset_id` key (e.g.: the output is a collection, not a dataset).
In order to keep all existing functionality, adds a new param `redirect` that
if set to `true` it will return a HTTP redirect 302 with the expected URI to
start the authentication process. This is useful to get users authenticated
directly without the need to go through clicking the button
Use configured tool_shed_url instead of deprecated web.url_for() which
returns a placeholder string in ASGI/FastAPI mode.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
These repositories allow access to the contents that are public without having to specify a token or set a publication name if we are going to use them just for read-only purposes.
Updated the hasCredentialsErrors computed property to include a check for toolHasRequiredServiceCredentials. This ensures that the validation correctly reflects whether all required service for a required credentials are provided by the user.
Adds an ApiError class that preserves HTTP status codes from API
responses. The keyedCache now distinguishes transient errors (429, 5xx)
from permanent ones (403, 404) -- transient errors get up to 3 retry
attempts while permanent errors stop immediately. Updated
fetchDatasetDetails to use rethrowSimpleWithStatus so the status code
propagates through to the cache layer.
When navigating to a dataset preview for a dataset you don't have
access to (or with an invalid ID), the useKeyedCache composable would
retry the failed fetch indefinitely. On error, nothing was written to
storedItems, so the next reactive evaluation of getItemById would see
undefined and trigger another fetch. Now getItemById skips re-fetching
when a loadError is already recorded for that ID. Also updated
DatasetView to show an error message instead of spinning forever.
Fixes#21863
The quick_load callback in __watch_directory is used both during the
initial directory scan (where _looks_like_a_tool is checked beforehand)
and as a callback for the ToolWatcher (where no such check occurs).
When the watcher detects a file system event for any .xml file in a
watched directory, it calls quick_load directly without verifying the
file is actually a tool. This causes files like macros.xml to be loaded
as tools and fail with "Missing tool 'id'" errors.
Add a _looks_like_a_tool guard inside quick_load itself so the check
is always applied regardless of the caller.
When a user's history is configured with private default permissions,
running a tool on a dataset imported from a public library would fail
with "Job attempted to create sharable output datasets in a storage
location with sharing disabled". This happened because output permissions
were derived solely from input datasets — public inputs produced outputs
with no DATASET_ACCESS restrictions, which conflicted with the private
object store.
The fix ensures that the history's default DATASET_ACCESS restrictions
are applied to tool outputs when the derived permissions from inputs lack
them. This respects the user's privacy intent (expressed via history
defaults) regardless of input origin.
Reproduces the bug where running a tool on a dataset imported from a
public library fails with "Job attempted to create sharable output
datasets in a storage location with sharing disabled" when the history
uses a private preferred object store. The output permissions are
incorrectly derived from the public input's access roles instead of
respecting the history's private store configuration.
https://claude.ai/code/session_011Fb9QHh1giP6etETQ3AbEE
In line with docs at
https://download.asperasoft.com/download/docs/ascp/3.5.2/html/dita/ascp_usage.html:
```
Enable resuming partially transferred files at the specified resume level (default: 0). Note that this must be specified for your first transfer; otherwise, it will not work for subsequent transfers. Resume levels:
0 - Always retransfer the entire file.
1 - Check file attributes and resume if the current and original attributes match.
2 - Check file attributes and do a sparse file checksum; resume if the current and original attributes/checksums match.
3 - Check file attributes and do a full file checksum; resume if the current and original attributes/checksums match.
Note that when a complete file exists at the destination (no .aspx), the source file size is compared with the destination file size. When a partial file and a valid .aspx file exist at the destination, the source file size is compared with the file size recorded inside the .aspx file.
```
Should fix https://github.com/galaxyproject/galaxy/issues/21854
sample_sheet collections should behave like list for mapping/matching
purposes: sample_sheet matches list, sample_sheet:paired matches
list:paired, sample_sheet:paired_or_unpaired matches
list:paired_or_unpaired, etc.
Add normalizeCollectionType functions (frontend TS and backend Python)
that convert sample_sheet to list for comparison in canMatch, canMapOver,
effectiveMapOver, has_subcollections_of_type, and can_match_type. The
actual collection_type string is preserved in results so sample_sheet
identity is maintained.
Enforce asymmetry: sample_sheet output can satisfy list input, but list
output cannot satisfy sample_sheet input. This is guarded at the terminal
level in InputCollectionTerminal.attachable() for both canMatch and
canMapOver paths.
Replaces full image array allocation with a generator-based streaming approach for exporting multi-dimensional OME-TIFF files. This minimizes memory consumption by writing planes one at a time.
Preserves all channels and z-planes at the first timepoint when exporting images, storing data in a ZCYX axis order for compatibility with downstream tools. Ensures multichannel information is retained, addressing limitations with sources that restrict original file access.