Skip to content

chore(deps): update Rust and Bun dependencies#620

Open
staging-devin-ai-integration[bot] wants to merge 22 commits into
mainfrom
devin/1782404078-dep-updates
Open

chore(deps): update Rust and Bun dependencies#620
staging-devin-ai-integration[bot] wants to merge 22 commits into
mainfrom
devin/1782404078-dep-updates

Conversation

@staging-devin-ai-integration

@staging-devin-ai-integration staging-devin-ai-integration Bot commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Refresh dependencies across the Cargo workspace and the three Bun projects (ui/, docs/, e2e/). All semver-compatible bumps land in one commit; each breaking/major bump is isolated into its own commit so any regression is attributable.
  • Most of the plan's expected frontend "majors" (eslint group, vite/vitest, react, @moq/*, lucide-react, uuid, @commitlint, knip, typescript) turned out to be in-range and were handled by the safe bun update pass.
  • A few majors required code migration (MoQ stack, symphonia, babel 8, astro/starlight); two are skipped and tracked in Deferred dependency majors: shiguredo_nvcodec 2026.2 and audioadapter-buffers 4 #621.
  • Heads-up for reviewers: opendal 0.57 transitively pulled reqsign-core 3.0.1, which added a non-optional rsa 0.9.10 (RUSTSEC-2023-0071, Marvin Attack). A follow-up commit pins the reqsign family back to 3.0.0 so rsa leaves the tree — AWS SigV4 uses HMAC, not RSA, so signing is unaffected.

Backend majors (one commit each)

Crate(s) From → To Migration notes
serde-saphyr 0.0.26 → 0.0.28 none
criterion 0.5.1 → 0.8.2 dev/bench only (latest is 0.8.2, not 0.6)
opentelemetry + http/otlp/sdk + tracing-opentelemetry 0.31→0.32 / →0.33 none
tower-http 0.6 → 0.7 none
jemalloc_pprof / tikv-jemallocator 0.8→0.9 / 0.6→0.7 none
opendal 0.56 → 0.57 pin reqsign-core/reqsign-aws-v4/reqsign-file-read-tokio to 3.0.0 to keep vulnerable rsa 0.9.10 out of the tree (see Summary)
rquickjs 0.11 → 0.12 none
rubato 2.0 → 3.0 none
symphonia 0.5.5 → 0.6.0 new probe/TrackType/CodecParameters API in flac/mp3/wav/ogg readers
wasmtime / wasmtime-wasi 44 → 46 none
moq-lite / moq-native / hang 0.16/0.14/0.16 → 0.17/0.17.4/0.19.2 hang AudioConfig/VideoConfig now #[non_exhaustive]; moq-native TLS moved to tls::Server; moq-net GroupProducer::abort now drops cached frames (test updated)

Skipped (tracked in #621):

  • audioadapter-buffers 3 → 4 — rubato 3.0 pins audioadapter-buffers ^3; bumping to 4 would split the dep across incompatible versions. Deferred until rubato moves to 4.
  • shiguredo_nvcodec 2026.1 → 2026.2 — the date-based version satisfies the "2026.1" caret range so the safe pass initially pulled it, but 2026.2.0 reworked the Encoder/Decoder API (generic handler params, Option-based frame retrieval) and breaks the nvcodec-feature GPU code (only compiled on GPU CI runners). Pinned to =2026.1.0 with a comment; migration deferred since it needs NVENC/NVDEC hardware to compile/validate.

Frontend majors (one commit each)

Package Project From → To Migration notes
react-doctor ui 0.5.1 → 0.5.8 exact-pinned dev tool
@types/node ui + e2e 25 → 26 type-only
@babel/core + @babel/preset-typescript ui 7 → 8 babel 8 dropped preset-typescript isTSX/allExtensions; added explicit @babel/plugin-syntax-jsx enabled only for .tsx in the vitest react-compiler transform
js-yaml ui 4 → 5 v5 defaults to CORE_SCHEMA (YAML 1.2), aligning the editor's client-side parse with the backend's serde_saphyr (YAML 1.2); ships its own types so @types/js-yaml was dropped
astro + @astrojs/starlight docs 6→7 / 0.38→0.41 starlight 0.39 removed label on an autogenerated sidebar group — wrapped in an explicit group with items
sharp docs 0.34 → 0.35 none

Excluded per the plan: plugins/, tests/, examples/ (outside the workspace) and native-lib versions tied to sherpa-onnx.

Review & Validation

All verification commands pass on this branch:

  • just lint-skit (fmt + clippy -D warnings + cargo deny check licenses)
  • cargo deny check advisories (no rsa/RUSTSEC-2023-0071 after the reqsign pin)
  • just test-skit
  • just lint-ui / just test-ui (1358 tests) / just build-ui
  • docs/: bun run build
  • e2e/: bun run typecheck

Notes

  • The GPU-only nvcodec feature isn't compiled by the local verification commands or non-GPU CI; the first push surfaced a GPU build break from the accidental shiguredo_nvcodec 2026.2.0 bump, now held at 2026.1 (see Skipped / Deferred dependency majors: shiguredo_nvcodec 2026.2 and audioadapter-buffers 4 #621).
  • cargo deny check licenses stays green; no new license exceptions were needed. The now-stale RUSTSEC-2025-0134 (rustls-pemfile) advisory ignore was dropped since the moq 0.17 upgrade removed that transitive dep.
  • The docs build still emits a non-fatal markdown.remarkPlugins deprecation warning from astro 7; left as-is to keep the bump minimal (no functional impact).

Link to Devin session: https://staging.itsdev.in/sessions/ce9c2319c3ea421283b5bfebe765b95a
Requested by: @streamer45


Devin Review

Status Commit
🟢 Reviewed 0689339
Open in Devin Review (Staging)

Refresh Cargo.lock and the ui/docs/e2e bun lockfiles with all in-range
(patch/minor) updates via cargo update and bun update.

The @xyflow/react minor bump tightened the onNodeDragStop event type from
React.MouseEvent to the DOM MouseEvent | TouchEvent; adjust FlowCanvas and
MonitorView handler signatures to match.

The moq stack (moq-lite, moq-native, hang) is held at its locked versions:
their 0.16.0->0.16.1/0.16.3 and 0.14.0->0.14.4 'patch' releases split out a
separate moq-net crate, producing a Track type mismatch. The major moq
upgrade is handled in a dedicated commit.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
Breaking 0.0.x release; the from_str / to_string / Error surface used in
crates/api, engine, nodes, and apps/skit is unchanged.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
Dev/bench-only dependency (crates/engine benches). The criterion_group!/
criterion_main!/Criterion/Throughput API used by the benches is unchanged.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
…try 0.33

Bumps opentelemetry, opentelemetry_sdk, opentelemetry-otlp, opentelemetry-http
(0.31 -> 0.32) and tracing-opentelemetry (0.32 -> 0.33) together since they must
share a compatible API version. The exporter/provider builder surface used in
apps/skit telemetry is unchanged.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
The CorsLayer / TraceLayer / SetResponseHeaderLayer surface used by apps/skit's
HTTP server is unchanged. A transitive 0.6.x copy remains (pulled by reqwest via
moq-native/opendal); they coexist without conflict.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
… jemalloc_pprof 0.9)

tikv-jemallocator 0.6 -> 0.7 and jemalloc_pprof 0.8 -> 0.9 are bumped together
because jemalloc_pprof 0.9 requires tikv-jemalloc-ctl 0.7 (shared tikv-jemalloc-sys).
The Jemalloc global allocator and PROF_CTL/dump_pprof API used under the
'profiling' feature is unchanged.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
Object-store (S3) node only. The Operator::from_iter / services::S3 / Writer API
used by object_store_write is unchanged.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
Script node (QuickJS) only. The Ctx/Value/Object/Array/Function/Func/Opt API
used by core/script.rs is unchanged.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
Audio resampler node only. The Async::new_poly / Resampler::process /
take_data API is unchanged. audioadapter-buffers is intentionally kept at 3.0
because rubato 3.0 still depends on audioadapter-buffers 3.x; see skip note.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
symphonia 0.6 is a major API rewrite. Migrated the mp3/flac decoders, the wav and ogg container demuxers, and their tests:

- probe: get_probe().format(..) -> get_probe().probe(..); default_track(TrackType::Audio)
- codec params: match on CodecParameters::Audio variant
- decoder: get_codecs().make() -> make_audio_decoder(); DecoderOptions -> AudioDecoderOptions
- audio buffer: SampleBuffer removed; use GenericAudioBufferRef::copy_to_vec_interleaved
- next_packet() now returns Result<Option<Packet>>; Ok(None) signals EOF
- Packet::track_id()/ts()/dur() methods are now pts/dur fields (Timestamp/Duration)

Signed-off-by: streamkit-devin <devin@streamkit.dev>
No source changes required; the component-model + async APIs used in plugin-wasm are unchanged across 44->46. All plugin-wasm tests pass.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
…g 0.19.2)

moq-lite 0.17 re-exports moq-net; hang 0.19 marks catalog AudioConfig/VideoConfig
#[non_exhaustive], so construct them via ::new() + field assignment. moq-native
moved TLS server config to the tls module (ServerTlsConfig -> tls::Server).
GroupProducer::abort now drops cached frames, so a consumer surfaces the abort
error instead of the buffered frame; updated the propagation test accordingly.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
Signed-off-by: streamkit-devin <devin@streamkit.dev>
Signed-off-by: streamkit-devin <devin@streamkit.dev>
Babel 8 removed preset-typescript's isTSX/allExtensions options. Add an explicit
@babel/plugin-syntax-jsx (8.x) and enable it only for .tsx files in the vitest
React-Compiler transform, preserving .ts type-assertion parsing.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
js-yaml 5 ships its own type definitions, so drop the now-redundant
@types/js-yaml dev dependency. The load/dump named exports used by the UI
are unchanged.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
Starlight 0.39 removed support for a 'label' on an autogenerated sidebar group;
wrap the reference autogenerate config in an explicit group with an items array.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
Signed-off-by: streamkit-devin <devin@streamkit.dev>
Align e2e's @types/node major with ui.

Signed-off-by: streamkit-devin <devin@streamkit.dev>
- symphonia 0.6: rewrite codec-params matches as let...else (flac/mp3/wav)
- moq/hang: drop needless ..Default::default() on fully-specified Catalog structs
- moq-native 0.17: Box::pin the now-larger connect()/discover_tracks() futures
  to satisfy clippy::large_futures

Signed-off-by: streamkit-devin <devin@streamkit.dev>
@streamer45 streamer45 self-assigned this Jun 25, 2026
@streamer45 streamer45 self-requested a review June 25, 2026 17:33
@staging-devin-ai-integration

Copy link
Copy Markdown
Contributor Author

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment, CI, and merge conflict monitoring

@codecov

codecov Bot commented Jun 25, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 88.16568% with 20 lines in your changes missing coverage. Please review.
✅ Project coverage is 84.95%. Comparing base (7c399b9) to head (0689339).

Files with missing lines Patch % Lines
crates/nodes/src/audio/codecs/flac.rs 75.86% 7 Missing ⚠️
crates/nodes/src/containers/wav.rs 77.41% 7 Missing ⚠️
crates/nodes/src/audio/codecs/mp3.rs 89.47% 4 Missing ⚠️
crates/nodes/src/transport/moq/pull.rs 90.47% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##             main     #620      +/-   ##
==========================================
- Coverage   85.00%   84.95%   -0.05%     
==========================================
  Files         248      248              
  Lines       74752    74569     -183     
  Branches     2381     2437      +56     
==========================================
- Hits        63541    63352     -189     
- Misses      11206    11211       +5     
- Partials        5        6       +1     
Flag Coverage Δ
backend 84.98% <88.16%> (-0.03%) ⬇️
ui 84.70% <ø> (-0.26%) ⬇️

Flags with carried forward coverage won't be shown. Click here to find out more.

Components Coverage Δ
core 85.64% <ø> (ø)
engine 83.68% <ø> (ø)
api 91.14% <ø> (ø)
nodes 84.56% <88.16%> (-0.06%) ⬇️
server 84.78% <ø> (ø)
plugin-native 84.79% <ø> (ø)
plugin-wasm 95.41% <ø> (ø)
ui-services 86.27% <ø> (ø)
ui-components 70.18% <ø> (-1.78%) ⬇️
Files with missing lines Coverage Δ
apps/skit/src/server/moq.rs 54.13% <ø> (ø)
crates/nodes/src/containers/ogg.rs 90.02% <100.00%> (-0.03%) ⬇️
crates/nodes/src/transport/moq/catalog_consumer.rs 100.00% <100.00%> (ø)
crates/nodes/src/transport/moq/peer/mod.rs 80.73% <100.00%> (-0.21%) ⬇️
crates/nodes/src/transport/moq/push.rs 87.82% <100.00%> (-0.27%) ⬇️
ui/src/components/FlowCanvas.tsx 100.00% <ø> (ø)
crates/nodes/src/transport/moq/pull.rs 71.75% <90.47%> (-0.75%) ⬇️
crates/nodes/src/audio/codecs/mp3.rs 89.52% <89.47%> (-0.20%) ⬇️
crates/nodes/src/audio/codecs/flac.rs 84.53% <75.86%> (-0.39%) ⬇️
crates/nodes/src/containers/wav.rs 82.43% <77.41%> (-0.34%) ⬇️

... and 7 files with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@staging-devin-ai-integration staging-devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 5 potential issues.

Open in Devin Review (Staging)
Debug

Playground

Comment on lines +662 to +666
let pts = packet.pts.get();
let metadata = if pts > 0 {
// Opus uses 48kHz timebase
let timestamp_us = (packet.ts() * 1_000_000) / 48000;
let duration_us = (packet.dur() * 1_000_000) / 48000;
let timestamp_us = (pts.unsigned_abs() * 1_000_000) / 48000;
let duration_us = (packet.dur.get() * 1_000_000) / 48000;

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 OGG demuxer uses unsigned_abs() for pts but not for dur — verify type consistency

The OGG demuxer's timestamp extraction changed from packet.ts() (which returned u64 in symphonia 0.5) to packet.pts.get() (symphonia 0.6). The code calls pts.unsigned_abs() at crates/nodes/src/containers/ogg.rs:665, implying pts is a signed integer type. However, packet.dur.get() at line 666 is used directly in arithmetic without unsigned_abs(). If dur.get() also returns a signed type, the expression (packet.dur.get() * 1_000_000) / 48000 produces a signed result that must fit into Option<u64>. The compiler would catch a type mismatch, but the reviewer should verify that dur.get() returns u64 (not i64) in symphonia 0.6, or that there's an implicit conversion. If dur can be negative (which would be semantically odd for a duration), the arithmetic could silently produce a wrong value via wrapping.

Open in Devin Review (Staging)

Was this helpful? React with 👍 or 👎 to provide feedback.

Debug

Playground

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Verified against symphonia 0.6 source: Packet.pts is Timestamp(i64) and Packet.dur is Duration(u64). So dur.get() already returns u64 (no unsigned_abs() needed and no wrapping risk), while pts.get() returns i64, hence the unsigned_abs() — guarded by the pts > 0 check above it. Types are consistent; no change needed.


// Connect to the MoQ server and fetch the catalog
let tracks = match self.discover_tracks().await {
let tracks = match Box::pin(self.discover_tracks()).await {

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Box::pin wrapping added for MoQ connect futures — indicates increased future size

Several MoQ connection calls gained Box::pin() wrapping: Box::pin(self.discover_tracks()) at crates/nodes/src/transport/moq/pull.rs:504, Box::pin(client.clone().with_consume(origin).connect(url)) at line 762 and 938, and similarly in push.rs:192. This is typically needed when async futures exceed the stack frame size limit. The Box::pin is correct but worth noting: the moq-native 0.17 upgrade apparently increased the size of connection futures significantly. This is a runtime allocation on every connect/reconnect, which is fine for connection setup but worth being aware of for latency-sensitive paths.

Open in Devin Review (Staging)

Was this helpful? React with 👍 or 👎 to provide feedback.

Debug

Playground

Comment on lines +2476 to 2479
// hasn't drained surfaces the abort error instead of the buffered frame.
let err = MoqPullNode::read_next_raw_moq(&mut consumer, &mut group, &mut is_first).await;
assert!(err.is_err(), "an aborted group should surface as an error");
assert!(group.is_none(), "the errored group is cleared");

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Aborted-group test behavior changed — moq-lite 0.17 drops buffered frames on abort

The test test_read_next_raw_moq_propagates_group_error at crates/nodes/src/transport/moq/pull.rs:2476-2479 was updated: the old test expected to successfully read frame b"a" before encountering the abort error, but the new test expects the abort error immediately without reading any frames. The added comment explains: 'Aborting a group drops its cached frames (moq-net), so a consumer that hasn't drained surfaces the abort error instead of the buffered frame.' This is a behavioral change in moq-lite 0.17 — previously buffered frames survived an abort; now they don't. The pull node's read_next_raw_moq handles this correctly (it clears the group on error and lets the caller decide), but downstream code that relied on reading partial group data before an abort would now see fewer frames. This seems intentional and the test correctly documents the new behavior.

Open in Devin Review (Staging)

Was this helpful? React with 👍 or 👎 to provide feedback.

Debug

Playground

Comment on lines 302 to 305
rotation: None,
flip: None,
},
..Default::default()
};

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Catalog struct construction drops ..Default::default() — relies on hang 0.19 having no extra fields

In crates/nodes/src/transport/moq/push.rs:297-305 and crates/nodes/src/transport/moq/peer/mod.rs:2283-2281, the hang::catalog::Catalog construction removed ..Default::default(). This means the struct literal now exhaustively lists all fields (audio and video). If a future hang version adds new fields to Catalog, this code would fail to compile — which is actually desirable (forces explicit handling of new fields). However, the test at pull.rs:1926 still uses ..Default::default() for Catalog, suggesting the struct does still support it. The production code's removal is a deliberate choice to be explicit rather than silently defaulting new fields.

(Refers to lines 297-305)

Open in Devin Review (Staging)

Was this helpful? React with 👍 or 👎 to provide feedback.

Debug

Playground

Comment thread ui/vitest.config.ts
Comment on lines 43 to +47
configFile: false,
presets: [
[babelPresetTypescript, { isTSX: file.endsWith('.tsx'), allExtensions: true }],
compilerPreset,
],
presets: [babelPresetTypescript, compilerPreset],
// Babel 8's preset-typescript dropped the isTSX option; enable JSX parsing
// only for .tsx so .ts type-assertion syntax (`<T>x`) still parses.
plugins: file.endsWith('.tsx') ? [babelSyntaxJsx] : [],

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Babel 8 migration removes isTSX preset option — JSX parsing now via explicit plugin

The vitest config at ui/vitest.config.ts:43-47 changed from passing { isTSX: true, allExtensions: true } to @babel/preset-typescript to instead adding @babel/plugin-syntax-jsx conditionally for .tsx files. This matches the Babel 8 breaking change where preset-typescript dropped the isTSX option. The new approach is correct: .tsx files get JSX syntax support via the plugin, while .ts files don't (preserving type assertion syntax <T>x). The allExtensions: true option was also dropped — in Babel 8, preset-typescript handles all extensions by default. The @babel/plugin-syntax-jsx dependency was correctly added to ui/package.json devDependencies.

Open in Devin Review (Staging)

Was this helpful? React with 👍 or 👎 to provide feedback.

Debug

Playground

reqsign-core 3.0.1 added a non-optional rsa 0.9.10 dependency, affected by
RUSTSEC-2023-0071 (Marvin Attack timing sidechannel, no fix available), which
opendal 0.57 pulled transitively. Pin the reqsign family (core/aws-v4/
file-read-tokio) to 3.0.0 (matching main) so opendal 0.57 no longer pulls rsa;
AWS SigV4 signing uses HMAC, not RSA, so functionality is unaffected.

Also drop the now-stale RUSTSEC-2025-0134 (rustls-pemfile) advisory ignore,
which the moq 0.17 upgrade in this PR already resolved.

Signed-off-by: streamkit-devin <devin@streamkit.dev>

@staging-devin-ai-integration staging-devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 2 new potential issues.

Open in Devin Review (Staging)
Debug

Playground

Comment on lines +238 to 242
Ok(Some(packet)) => packet,
Ok(None) => {
tracing::debug!("Reached end of FLAC stream after {} frames", frame_count);
break;
},

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Symphonia EOF detection changed from error-matching to Option-based

The symphonia 0.5→0.6 migration changes end-of-stream detection from matching Err(Error::IoError(e)) if e.kind() == UnexpectedEof to Ok(None). This is applied consistently across all four decoder/demuxer files (flac.rs, mp3.rs, wav.rs, ogg.rs). The new pattern is cleaner and less fragile — the old pattern could miss EOF if symphonia changed its internal error wrapping. The migration is complete and consistent across all sites.

Open in Devin Review (Staging)

Was this helpful? React with 👍 or 👎 to provide feedback.

Debug

Playground

Comment on lines +255 to +257
let mut interleaved: Vec<f32> = Vec::new();
audio_buf.copy_to_vec_interleaved(&mut interleaved);
rechunk_buffer.extend(interleaved.iter().copied());

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: Per-iteration Vec allocation replaces reused SampleBuffer

The old symphonia 0.5 code lazily initialized a SampleBuffer<f32> once and reused it across all decoded packets via copy_interleaved_ref. The new code creates a fresh Vec<f32> on every iteration (let mut interleaved: Vec<f32> = Vec::new()) and calls audio_buf.copy_to_vec_interleaved(&mut interleaved). This is the idiomatic symphonia 0.6 API. The per-iteration allocation is unlikely to be a performance concern since the decoded samples are immediately moved into the rechunk_buffer anyway, and the allocator will typically reuse the same memory. This pattern is applied consistently across flac.rs, mp3.rs, and wav.rs.

Open in Devin Review (Staging)

Was this helpful? React with 👍 or 👎 to provide feedback.

Debug

Playground

The semver-compatible update pass pulled shiguredo_nvcodec 2026.1.0 -> 2026.2.0
(the date-based version satisfies the "2026.1" caret range). 2026.2.0 reworked
the Encoder/Decoder API (generic handler params, Option-based frame retrieval),
breaking the nvcodec-feature GPU code which only compiles on GPU CI runners.
Pin to =2026.1.0 (matching main) and document; migration to 2026.2.0 deferred.

Signed-off-by: streamkit-devin <devin@streamkit.dev>

@staging-devin-ai-integration staging-devin-ai-integration Bot left a comment

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Devin Review found 2 new potential issues.

Open in Devin Review (Staging)
Debug

Playground

Comment thread ui/package.json
"js-yaml": "^4.1.1",
"jotai": "^2.20.1",
"jotai-family": "^1.0.2",
"js-yaml": "^5.1.0",

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🚩 js-yaml major version bump (4.x → 5.x) may have breaking API changes

The UI's js-yaml dependency was bumped from ^4.1.1 to ^5.1.0. js-yaml 5.x is a major version that may have breaking changes in its API (schema handling, type coercion behavior, etc.). The UI imports js-yaml for YAML parsing in the pipeline editor. If the 5.x API changed how certain YAML values are parsed (e.g., handling of null, boolean strings like yes/no, or numeric formats), it could subtly affect pipeline YAML round-tripping in the editor without causing obvious errors.

Open in Devin Review (Staging)

Was this helpful? React with 👍 or 👎 to provide feedback.

Debug

Playground

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Checked this — low risk, and arguably an alignment improvement.

The behavioral change in js-yaml 5 is the default schema: v4 defaulted to the YAML 1.1 schema, v5 defaults to CORE_SCHEMA (YAML 1.2). The backend parses pipeline YAML with serde_saphyr (saphyr is a YAML 1.2 implementation — see crates/api/src/yaml/mod.rs), so moving the UI to 1.2 makes the editor's client-side parse more consistent with the server, which is the source of truth for execution.

The 1.1→1.2 differences that could bite (bare yes/no/on/off parsed as booleans, 0NNN octal, sexagesimals) only matter for literals StreamKit pipelines don't use — params use true/false. All 1358 UI tests pass, including the YAML round-trip/parse tests in pipelineGraph.test.ts and yamlAutocompletion.test.ts (the latter explicitly cross-checks parser behavior). Leaving the bump as-is.

Comment thread crates/nodes/Cargo.toml
Comment on lines +112 to +114
# Pinned to 2026.1: 2026.2.0 reworked the Encoder/Decoder API (generic handler
# params, Option-based frame retrieval) and needs a non-trivial GPU-code migration.
shiguredo_nvcodec = { version = "=2026.1.0", optional = true }

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

📝 Info: shiguredo_nvcodec pinned to exact version with migration comment

The shiguredo_nvcodec dependency was changed from version = "2026.1" (semver-compatible range) to version = "=2026.1.0" (exact pin) with a comment explaining that 2026.2.0 reworked the API and needs a non-trivial migration. This is a deliberate decision to avoid accidentally pulling in the breaking 2026.2.0 release via cargo update. The pin should be tracked as tech debt to be resolved when the GPU codec migration is done.

Open in Devin Review (Staging)

Was this helpful? React with 👍 or 👎 to provide feedback.

Debug

Playground

Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Agreed — tracked as tech debt in #621 (covers the shiguredo_nvcodec 2026.2 GPU-code migration plus the related audioadapter-buffers 4 deferral). The exact pin keeps cargo update from silently re-pulling 2026.2.0 and breaking the GPU build until that migration is done on NVENC/NVDEC hardware.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants