Enhance dataset versioning and align Zarr resolution with STAC - #9
Enhance dataset versioning and align Zarr resolution with STAC#9eloramirez1356 wants to merge 5 commits into
Conversation
|
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: defaults Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (5)
🚧 Files skipped from review as they are similar to previous changes (3)
📝 WalkthroughWalkthroughThe client discovers dataset version services from STAC metadata, exposes version listing and exact-version APIs, propagates release metadata, and resolves Zarr groups for direct and concatenated dataset loads. ChangesDataset version discovery
Estimated code review effort: 4 (Complex) | ~45 minutes Possibly related PRs
Suggested reviewers: Sequence Diagram(s)sequenceDiagram
participant DClimateClient
participant STACResolution
participant VersionAPI
DClimateClient->>STACResolution: resolve dataset metadata
STACResolution-->>DClimateClient: return version API URL and release metadata
DClimateClient->>VersionAPI: request filtered versions
VersionAPI-->>DClimateClient: return DatasetVersionListing
🚥 Pre-merge checks | ✅ 4 | ❌ 1❌ Failed checks (1 warning)
✅ Passed checks (4 passed)
✨ Finishing Touches 💡 1📝 Generate docstrings 💡
🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/client.ts`:
- Around line 206-208: Update the openedZarrGroup initialization near
explicitZarrGroup to validate dataset.attrs?._ipfs_zarr_group is a runtime
string before passing it to normalizeZarrGroup; otherwise treat it as absent and
preserve the explicitZarrGroup precedence.
- Line 165: Update the request flow around listVersionsFromUrl to validate
resolved.versionsApi against the configured trusted HTTPS origins before
fetching, reject non-HTTPS or untrusted destinations, and enforce the same
validation for every redirect rather than only the initial URL.
In `@src/versions/version-client.ts`:
- Around line 15-17: Update the version API fetch flow around fetchImpl to
require HTTPS for the initial URL and every redirect target, rejecting non-HTTPS
URLs by default. Permit HTTP only when the explicit local-development opt-in is
enabled, and validate each redirect before following it.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: cd17c9ea-5aaf-4435-a691-1af79873a297
📒 Files selected for processing (16)
README.mdsrc/client.tssrc/errors.tssrc/index.tssrc/ipfs/open-dataset.tssrc/stac/index.tssrc/stac/stac-catalog.tssrc/stac/stac-server.tssrc/types.tssrc/versions/index.tssrc/versions/types.tssrc/versions/version-client.tstests/fetch-dataset-cid.test.tstests/open-dataset.test.tstests/stac-version-discovery.test.tstests/version-client.test.ts
| `Version history is not available for ${collection}/${dataset}/${resolved.variant}.` | ||
| ); | ||
| } | ||
| return listVersionsFromUrl(resolved.versionsApi, filters); |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- relevant files ---'
git ls-files | rg '(^|/)(client\.ts|version-client\.ts|utils\.ts|stac-(catalog|server)\.ts|types\.ts)$'
printf '%s\n' '--- client version path ---'
rg -n -A35 -B15 'listDatasetVersions|versionsApi|getStacReleaseMetadata|listVersionsFromUrl' src/client.ts src/stac src/versions
printf '%s\n' '--- request implementation and redirect options ---'
rg -n -A35 -B15 'function requestJson|const requestJson|requestJson|redirect|FetchImplementation|fetchImpl' src
printf '%s\n' '--- URL policy, trusted origins, and version endpoint configuration ---'
rg -n -i -A8 -B8 'allowlist|allow-list|trusted.?origin|trusted.?host|versions.?api|versionsApi|https?://|gatewayUrl|serverUrl' src testsRepository: dClimate/dclimate-client-js
Length of output: 50384
🏁 Script executed:
#!/bin/bash
set -eu
printf '%s\n' '--- resolveDatasetDetails and catalog acquisition ---'
sed -n '80,145p' src/client.ts
sed -n '1,90p' src/client.ts
rg -n -A25 -B10 'getStacCatalog|loadStacCatalog|resolveDatasetDetails|stacServerUrl|DEFAULT_STAC_SERVER_URL' src/client.ts src/stac
printf '%s\n' '--- package runtime targets and documented usage ---'
cat package.json
rg -n -i -A8 -B8 'node|browser|deno|runtime|server|client-side|stacServerUrl|listDatasetVersions' README.md docs src tests 2>/dev/null | head -300Repository: dClimate/dclimate-client-js
Length of output: 50385
🏁 Script executed:
#!/bin/bash
set -eu
python3 - <<'PY'
from pathlib import Path
client = Path("src/client.ts").read_text()
versions = Path("src/versions/version-client.ts").read_text()
catalog = Path("src/stac/stac-catalog.ts").read_text()
package_json = Path("package.json").read_text()
checks = {
"client forwards resolved versionsApi": "listVersionsFromUrl(resolved.versionsApi, filters)" in client,
"metadata reads dclimate versions property": '"dclimate:versions_api"' in catalog,
"URL is constructed from supplied value": "const url = new URL(versionsUrl)" in versions,
"URL reaches fetch through requestJson": "requestJson<DatasetVersionListing>(url.toString(), fetchImpl)" in versions,
"request uses fetch implementation": "const response = await fetchImpl(url, {" in versions,
"no redirect option in request helper": "redirect:" not in versions,
"node build exists": '"main": "./dist/node/index.js"' in package_json,
"browser build exists": '"module": "./dist/browser/index.js"' in package_json,
}
for name, passed in checks.items():
print(f"{'PASS' if passed else 'FAIL'}: {name}")
if not all(checks.values()):
raise SystemExit(1)
PYRepository: dClimate/dclimate-client-js
Length of output: 479
SSRF (CWE-918): Server-Side Request Forgery (SSRF)
Exploitability: Moderate
Reachability path
● Entry
src/stac/stac-server.ts:49
ResolvedCidFromServer
│
▼
● Hop
src/stac/stac-catalog.ts:345
response
│
▼
● Hop
tests/stac-version-discovery.test.ts
│
▼
● Sink
src/client.ts
Restrict versionsApi requests to trusted HTTPS origins.
resolved.versionsApi comes from dclimate:versions_api and reaches the Node fetch implementation without destination validation. An untrusted STAC item can make a Node caller request an internal address. Enforce configured HTTPS origins and apply the same policy after redirects.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/client.ts` at line 165, Update the request flow around
listVersionsFromUrl to validate resolved.versionsApi against the configured
trusted HTTPS origins before fetching, reject non-HTTPS or untrusted
destinations, and enforce the same validation for every redirect rather than
only the initial URL.
| const openedZarrGroup = | ||
| explicitZarrGroup ?? | ||
| normalizeZarrGroup(dataset.attrs?._ipfs_zarr_group as string | undefined); |
There was a problem hiding this comment.
🩺 Stability & Availability | 🟡 Minor | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- client.ts context ---'
sed -n '170,225p' src/client.ts
printf '%s\n' '--- normalizeZarrGroup definitions and usages ---'
rg -n -C 5 'normalizeZarrGroup|_ipfs_zarr_group|explicitZarrGroup|openedZarrGroup' .
printf '%s\n' '--- candidate files ---'
git ls-files | rg '(^|/)(client|zarr|dataset|test|spec)|package.json|tsconfig'Repository: dClimate/dclimate-client-js
Length of output: 12908
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- client.ts definitions and direct-CID flow ---'
sed -n '1,65p' src/client.ts
sed -n '225,325p' src/client.ts
printf '%s\n' '--- dataset and metadata types ---'
rg -n -C 4 'interface DatasetMetadata|type DatasetMetadata|interface.*Dataset|attrs' src tests/helpers tests/fetch-dataset-cid.test.ts tests/metadata.test.ts
printf '%s\n' '--- direct-CID client tests ---'
rg -n -C 8 'loadDataset|direct_cid|zarrGroup|_ipfs_zarr_group' tests src/client.ts
printf '%s\n' '--- runtime probe for normalizeZarrGroup inputs ---'
node - <<'JS'
function normalizeZarrGroup(group) {
const normalized = group?.replace(/^\/+/, '').replace(/\/+$/, '');
return normalized || undefined;
}
for (const value of [undefined, '0', '/0/', '', 0, false, {}, []]) {
try {
console.log(JSON.stringify(value), '=>', JSON.stringify(normalizeZarrGroup(value)));
} catch (error) {
console.log(JSON.stringify(value), '=> throws', error.name + ': ' + error.message);
}
}
JSRepository: dClimate/dclimate-client-js
Length of output: 50383
🏁 Script executed:
#!/bin/bash
set -e
printf '%s\n' '--- focused runtime verifier ---'
node - <<'JS'
function normalizeZarrGroup(group) {
const normalized = group?.replace(/^\/+/, '').replace(/\/+$/, '');
return normalized || undefined;
}
function current(attrs, explicitZarrGroup) {
return explicitZarrGroup ?? normalizeZarrGroup(attrs?._ipfs_zarr_group);
}
function guarded(attrs, explicitZarrGroup) {
const discoveredZarrGroup = attrs?._ipfs_zarr_group;
return explicitZarrGroup ??
(typeof discoveredZarrGroup === 'string'
? normalizeZarrGroup(discoveredZarrGroup)
: undefined);
}
for (const value of [undefined, ' /0/ ', '/0/', 0, false, {}, [], null]) {
const attrs = { _ipfs_zarr_group: value };
let currentResult;
try {
currentResult = JSON.stringify(current(attrs, undefined));
} catch (error) {
currentResult = `throws ${error.name}: ${error.message}`;
}
let guardedResult;
try {
guardedResult = JSON.stringify(guarded(attrs, undefined));
} catch (error) {
guardedResult = `throws ${error.name}: ${error.message}`;
}
console.log(`${JSON.stringify(value)} | current: ${currentResult} | guarded: ${guardedResult}`);
}
console.log('explicit-group short-circuit:', current({ _ipfs_zarr_group: 0 }, 'explicit'));
JS
printf '%s\n' '--- package/type context ---'
sed -n '25,45p' src/types.ts
sed -n '125,145p' src/types.ts
sed -n '1,125p' src/ipfs/open-dataset.ts
printf '%s\n' '--- existing client test mocks ---'
rg -n -C 5 'vi\.mock|openDatasetFromCid|DClimateClient' tests --glob '*client*' --glob '*fetch*' --glob '*root*'Repository: dClimate/dclimate-client-js
Length of output: 25539
Guard _ipfs_zarr_group before normalization. If the attribute is not a string, skip normalization. The type assertion does not change the runtime value, and normalizeZarrGroup throws when .replace is called on a number, boolean, object, or array after the dataset opens.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/client.ts` around lines 206 - 208, Update the openedZarrGroup
initialization near explicitZarrGroup to validate
dataset.attrs?._ipfs_zarr_group is a runtime string before passing it to
normalizeZarrGroup; otherwise treat it as absent and preserve the
explicitZarrGroup precedence.
| const response = await fetchImpl(url, { | ||
| headers: { Accept: "application/json" }, | ||
| }); |
There was a problem hiding this comment.
🔒 Security & Privacy | 🟠 Major | ⚡ Quick win
🧩 Analysis chain
🏁 Script executed:
#!/bin/bash
set -euo pipefail
# Inspect all STAC-to-version-API URL flows and test fixtures.
ast-grep outline src/versions/version-client.ts --items all
rg -n -C 5 'dclimate:versions_api|versionsApi|citationApi|listVersionsFromUrl|fetchImpl' src tests README.md
# Identify whether the repository intentionally supports remote HTTP endpoints
# or redirects for version and citation services.
rg -n -C 3 'https?://|redirect' tests src README.mdRepository: dClimate/dclimate-client-js
Length of output: 43070
Security Misconfiguration (CWE-345)
Reachability: External · Exploitability: Moderate
Reachability path
● Entry
src/client.ts:147
listDatasetVersions
│
▼
● Sink
src/versions/version-client.ts
Require HTTPS for STAC-discovered version APIs.
Reject non-HTTPS URLs and validate redirect targets before following them. Allow HTTP only through an explicit local-development opt-in.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/versions/version-client.ts` around lines 15 - 17, Update the version API
fetch flow around fetchImpl to require HTTPS for the initial URL and every
redirect target, rejecting non-HTTPS URLs by default. Permit HTTP only when the
explicit local-development opt-in is enabled, and validate each redirect before
following it.
| : {}), | ||
| ...(resolved.citationApi ? { citationApi: resolved.citationApi } : {}), | ||
| ...(resolved.streamId ? { streamId: resolved.streamId } : {}), | ||
| ...(resolved.commitId ? { commitId: resolved.commitId } : {}), |
There was a problem hiding this comment.
LOW
When STAC omits a group and openDatasetFromCid falls back to group 0, this value remains undefined, so the returned metadata omits the group actually opened. After opening, fall back to dataset.attrs._ipfs_zarr_group, as the direct-CID branch already does.
| fetchImpl: FetchImplementation = fetch | ||
| ): Promise<DatasetVersion> { | ||
| const url = new URL(versionsUrl); | ||
| url.pathname = `${url.pathname.replace(/\/$/, "")}/${encodeURIComponent(commitId)}`; |
There was a problem hiding this comment.
LOW
Reject an empty commitId before constructing the URL. An empty value produces the listing URL with a trailing slash, which can return DatasetVersionListing while this helper silently casts it to DatasetVersion.
| `Version history is not available for ${collection}/${dataset}/${resolved.variant}.` | ||
| ); | ||
| } | ||
| return listVersionsFromUrl(resolved.versionsApi, filters); |
There was a problem hiding this comment.
MEDIUM
Validate STAC-advertised service URLs before fetching. versionsApi comes directly from catalog metadata, so a custom or compromised STAC source can point Node callers at loopback, private-network, or cloud-metadata endpoints; automatic redirects can bypass validation of only the initial URL. Enforce a trusted HTTPS-origin policy for the initial request and every redirect, including the exact-version path.
| const metadataVariant = resolved.variant || ""; | ||
| const metadataOrganization = | ||
| resolved.organizationId ?? resolvedOrganization; | ||
| const zarrGroup = explicitZarrGroup ?? normalizeZarrGroup(resolved.zarrGroup); |
There was a problem hiding this comment.
LOW
Record the group selected by the opener fallback. When STAC provides no group and openDatasetFromCid retries group "0", this precomputed value remains undefined, so the returned metadata omits the group actually opened. After opening, fall back to the string-valued dataset.attrs._ipfs_zarr_group, as the direct-CID branch does.
| fetchImpl: FetchImplementation = fetch | ||
| ): Promise<DatasetVersion> { | ||
| const url = new URL(versionsUrl); | ||
| url.pathname = `${url.pathname.replace(/\/$/, "")}/${encodeURIComponent(commitId)}`; |
There was a problem hiding this comment.
LOW
Reject an empty commitId before constructing the URL. An empty value produces the versions-list URL with a trailing slash; services with non-strict routing can return DatasetVersionListing, which is then silently cast to DatasetVersion. Validate that the identifier is non-empty before appending it.
There was a problem hiding this comment.
Actionable comments posted: 2
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@src/stac/stac-catalog.ts`:
- Around line 222-239: Update getStacZarrResolutions to accept item properties
and include a Zarr resolution descriptor from those properties when
dclimate:spatial_resolution and dclimate:zarr_group are present, while
preserving asset discovery and deduplication. In src/stac/stac-catalog.ts lines
745-750 and src/stac/stac-server.ts lines 227-232, pass selectedItem.properties
into the updated function.
In `@src/types.ts`:
- Line 37: Remove the inactive options.resolution field from the relevant type,
or wire it into DClimateClient.loadDataset’s resolution selection and validation
so it behaves consistently with request.resolution. Do not leave an exposed
option that is ignored.
🪄 Autofix
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: defaults
Review profile: CHILL
Plan: Pro
Run ID: 6cf010b8-5a1f-4b7f-b910-8956b687d90d
📒 Files selected for processing (14)
README.mdsrc/client.tssrc/errors.tssrc/index.tssrc/ipfs/open-dataset.tssrc/stac/index.tssrc/stac/stac-catalog.tssrc/stac/stac-server.tssrc/types.tstests/fetch-dataset-cid.test.tstests/geotemporal-dataset.test.tstests/open-dataset.test.tstests/review-fixes/concat-items-resolved-id.test.tstests/stac-version-discovery.test.ts
🚧 Files skipped from review as they are similar to previous changes (2)
- src/stac/index.ts
- src/index.ts
| export function getStacZarrResolutions( | ||
| assets: Record<string, StacAsset> | ||
| ): StacZarrResolution[] { | ||
| const choices = Object.entries(assets).flatMap(([assetKey, asset]) => { | ||
| if (assetKey === "data") return []; | ||
| const resolution = getStringProperty(asset, "dclimate:spatial_resolution"); | ||
| const group = getStringProperty(asset, "dclimate:zarr_group"); | ||
| return resolution && group ? [{ assetKey, resolution, group }] : []; | ||
| }); | ||
| return choices.filter( | ||
| (choice, index) => | ||
| choices.findIndex( | ||
| (candidate) => | ||
| candidate.resolution === choice.resolution && | ||
| candidate.group === choice.group | ||
| ) === index | ||
| ); | ||
| } |
There was a problem hiding this comment.
🎯 Functional Correctness | 🟠 Major | ⚡ Quick win
Read item-level Zarr metadata during resolution discovery.
getStacZarrResolutions reads only asset fields. Both resolvers discard selectedItem.properties. A STAC item that advertises its Zarr group or spatial resolution in item properties therefore exposes no selectable resolution.
src/stac/stac-catalog.ts#L222-L239: Accept item properties and create the applicable Zarr resolution descriptor from them.src/stac/stac-catalog.ts#L745-L750: PassselectedItem.propertiesinto resolution discovery.src/stac/stac-server.ts#L227-L232: PassselectedItem.propertiesinto resolution discovery.
📍 Affects 2 files
src/stac/stac-catalog.ts#L222-L239(this comment)src/stac/stac-catalog.ts#L745-L750src/stac/stac-server.ts#L227-L232
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
In `@src/stac/stac-catalog.ts` around lines 222 - 239, Update
getStacZarrResolutions to accept item properties and include a Zarr resolution
descriptor from those properties when dclimate:spatial_resolution and
dclimate:zarr_group are present, while preserving asset discovery and
deduplication. In src/stac/stac-catalog.ts lines 745-750 and
src/stac/stac-server.ts lines 227-232, pass selectedItem.properties into the
updated function.
| ); | ||
| } | ||
| return listVersionsFromUrl(resolved.versionsApi, filters); | ||
| } |
There was a problem hiding this comment.
MEDIUM
versionsApi comes directly from remotely supplied STAC metadata and is fetched without an endpoint policy; getDatasetVersion does the same. In Node, a malicious catalog can target loopback/private services and return their JSON or error body to the caller. Reject non-HTTP(S) and private destinations, or require an explicit allowlist/validation callback before following advertised URLs.
| const zarrResolutions = getStacZarrResolutions(selectedItem.assets); | ||
| const selectedAsset = | ||
| selectedItem.assets.data ?? | ||
| (zarrResolutions[0] |
There was a problem hiding this comment.
MEDIUM
The CID is fixed from assets.data or the first resolution asset before the requested resolution is selected. If resolution assets have different hrefs, selecting another resolution still opens the first CID with the selected group, producing wrong data or an open failure. Derive the CID from the selected assetKey, or validate that all resolution assets share one href.
| returnJaxrayDataset?: boolean; | ||
| autoConcatenate?: boolean; | ||
| zarrGroup?: string; | ||
| resolution?: string; |
There was a problem hiding this comment.
MEDIUM
LoadDatasetOptions.resolution is exposed publicly but never read; selection only consults request.resolution. Consequently { options: { resolution: "2km" } } type-checks but is ignored and a multiresolution dataset still throws. Remove this field or incorporate it into selection and conflict validation.
|
@codex review this pr and concretely the last commit |
|
To use Codex here, create a Codex account and connect to github. |
| `Version history is not available for ${collection}/${dataset}/${resolved.variant}.` | ||
| ); | ||
| } | ||
| return listVersionsFromUrl(resolved.versionsApi, filters); |
There was a problem hiding this comment.
MEDIUM
Validate STAC-discovered service URLs. versionsApi is remotely supplied metadata and reaches Node's fetch unchanged, allowing a malicious catalog to target loopback/private services; redirects are followed automatically. Apply a configurable trusted-origin/destination policy to this and the exact-version path, including redirect targets.
There was a problem hiding this comment.
Not addressing this in the current patch. dClimate generates and controls the supported STAC catalogs and their advertised service URLs, which are treated as trusted first-party configuration. Arbitrary third-party catalogs are outside the current trust model. If external catalogs are supported later, we will define a dedicated URL and redirect security policy. This does not block the multiresolution change.
| export function getStacZarrResolutions( | ||
| assets: Record<string, StacAsset> | ||
| ): StacZarrResolution[] { | ||
| const choices = Object.entries(assets).flatMap(([assetKey, asset]) => { |
There was a problem hiding this comment.
MEDIUM
Include item-level Zarr metadata. Resolution discovery only inspects assets, so items placing dclimate:zarr_group and dclimate:spatial_resolution in properties expose no choices: request.resolution is rejected and grouped roots cannot be selected. Merge a property-derived choice and pass item properties from both resolvers.
There was a problem hiding this comment.
Not applicable to the current STAC contract. Selectable resolutions are represented exclusively by named assets containing dclimate:spatial_resolution and dclimate:zarr_group. assets.data is only a temporary compatibility alias and must not become selectable. Item-level resolution/group metadata is unsupported, so no fallback will be added.
| fetchImpl: FetchImplementation = fetch | ||
| ): Promise<DatasetVersion> { | ||
| const url = new URL(versionsUrl); | ||
| url.pathname = `${url.pathname.replace(/\/$/, "")}/${encodeURIComponent(commitId)}`; |
There was a problem hiding this comment.
LOW
Reject an empty commitId. An empty identifier produces the listing URL with a trailing slash; services using non-strict routing can return DatasetVersionListing, which is then exposed as DatasetVersion. Validate the identifier before constructing the path.
There was a problem hiding this comment.
Valid but unrelated to the multiresolution feature. Empty or whitespace-only commit IDs should be rejected in a separate version-lookup follow-up. This is low priority and does not block the current merge.
This pull request adds robust support for dataset version history and related metadata to the dClimate client. It introduces new methods to resolve and expose dataset version information, provenance, and citation APIs, as well as improved handling of Zarr group resolution and metadata propagation. The changes also enhance the STAC integration, allowing the client to dynamically discover and utilize versioned dataset services.
Dataset version history and metadata support:
listDatasetVersionsmethod toDClimateClient, which resolves dataset details and fetches version history from the advertiseddclimate:versions_apiURL in STAC metadata. This allows clients to retrieve version listings, with optional filters, without hard-coding dataset routing. [1] [2]versionsApi,provenanceApi,citationApi,streamId,commitId,versionLabel,isCitable, andretentionClass, making these available to client applications. [1] [2] [3] [4] [5]STAC and Zarr group improvements:
zarrGroup) from both assets and properties, and improved logic for resolving dataset details from STAC. [1] [2] [3] [4] [5]API and error handling enhancements:
listVersionsFromUrl,getExactVersionFromUrl,getCitationFromUrl) from the package entry point for use in advanced applications. [1] [2]These changes make the client more flexible, future-proof, and capable of supporting advanced dataset versioning and provenance workflows.
Summary by CodeRabbit