Merge branch 'release-26.05' into staging-next-26.05

This commit is contained in:
Michael Daniels
2026-08-03 21:10:20 -04:00
36 changed files with 949 additions and 177 deletions

View File

@@ -35,12 +35,14 @@ in
type = lib.types.str;
default = "127.0.0.1";
description = "The IP to host on. Use 0.0.0.0 to expose on all network adapters.";
example = "0.0.0.0";
};
port = lib.mkOption {
type = lib.types.port;
default = 5000;
description = "The port to host on.";
example = 8080;
};
disable_auth = lib.mkOption {
@@ -58,10 +60,34 @@ in
description = "Disable fetching external content in response to requests, such as images from URLs.";
};
send_tracebacks = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Send tracebacks over the API.
NOTE: Only enable this for debug purposes.
'';
};
api_servers = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ "OAI" ];
description = "Select API servers to enable. Possible values: OAI, Kobold.";
example = [
"OAI"
"Kobold"
];
};
sse_ping_interval = lib.mkOption {
type = lib.types.ints.unsigned;
default = 15;
description = ''
Seconds between SSE keep-alive pings on streaming responses.
Pings are SSE comments, ignored by compliant clients, and prevent
connections from dropping during long prefills. Set to 0 to disable.
'';
example = 0;
};
};
@@ -72,6 +98,12 @@ in
description = "Enable prompt logging.";
};
log_generation_params = lib.mkOption {
type = lib.types.bool;
default = false;
description = "Enable generation parameter logging.";
};
log_requests = lib.mkOption {
type = lib.types.bool;
default = false;
@@ -141,6 +173,15 @@ in
'';
};
use_dummy_models = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Sends dummy model names when the models endpoint is queried.
Enable this if the client is looking for specific OAI models.
'';
};
model_name = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
@@ -151,6 +192,20 @@ in
example = "Qwen3_5-9B";
};
use_as_default = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ ];
description = ''
Names of args to use as a fallback for API load requests.
For example, if you always want cache_mode to be Q4 instead of only on the
initial model load, add "cache_mode" to this list.
'';
example = [
"max_seq_len"
"cache_mode"
];
};
max_seq_len = lib.mkOption {
type = lib.types.nullOr lib.types.int;
default = null;
@@ -158,6 +213,22 @@ in
Max sequence length (default: min(max_position_embeddings, cache_size)).
Set to -1 to fetch from the model's config.json.
'';
example = 32768;
};
cache_size = lib.mkOption {
type = lib.types.nullOr (
lib.types.addCheck lib.types.ints.positive (n: lib.mod n 256 == 0)
// {
description = "positive integer, multiple of 256";
}
);
default = null;
description = ''
Size of the key/value cache to allocate, in tokens (default: 4096).
Must be a multiple of 256.
'';
example = 32768;
};
cache_mode = lib.mkOption {
@@ -168,6 +239,7 @@ in
Specify the pair k_bits,v_bits where k_bits and v_bits are integers from 2-8 (e.g. '8,8').
The legacy values 'FP16', 'Q8', 'Q6', 'Q4' are also accepted.
'';
example = "8,8";
};
tensor_parallel = lib.mkOption {
@@ -185,6 +257,111 @@ in
description = "Automatically allocate resources to GPUs. Not parsed for single GPU users.";
};
autosplit_reserve = lib.mkOption {
type = lib.types.listOf lib.types.number;
default = [ 96 ];
description = ''
Reserve VRAM used for autosplit loading, as a list of MB per GPU
(default: 96 MB on GPU 0).
'';
example = [
96
96
];
};
gpu_split = lib.mkOption {
type = lib.types.listOf lib.types.number;
default = [ ];
description = ''
List of VRAM sizes to split between GPUs, in GB.
Used with tensor parallelism.
'';
example = [
16
24
];
};
cpu_moe_offload_layers = lib.mkOption {
type = lib.types.ints.unsigned;
default = 0;
description = ''
Number of mixture-of-expert layers to offload to CPU inference.
Only affects MoE models. Set a large value such as 999 to offload all layers.
'';
example = 999;
};
rope_scale = lib.mkOption {
type = lib.types.nullOr lib.types.number;
default = 1.0;
description = ''
Rope scale, same as compress_pos_emb.
Use if the model was trained on long context with rope.
Set to null to pull the value from the model.
NOTE: If a model has YaRN rope scaling, it will automatically be enabled by
ExLlama and the rope_scale and rope_alpha settings won't apply.
'';
example = 4.0;
};
rope_alpha = lib.mkOption {
type = lib.types.nullOr (lib.types.either lib.types.number (lib.types.enum [ "auto" ]));
default = null;
description = ''
Rope alpha, same as alpha_value. Set to "auto" to auto-calculate.
Leaving this null will either pull from the model or auto-calculate.
'';
example = "auto";
};
chunk_size = lib.mkOption {
type = lib.types.ints.positive;
default = 2048;
description = ''
Chunk size for prompt ingestion.
A lower value reduces VRAM usage but decreases ingestion speed.
NOTE: Effects vary depending on the model. An ideal value is between 512 and 4096.
'';
example = 512;
};
output_chunking = lib.mkOption {
type = lib.types.bool;
default = true;
description = ''
Use output chunking. Instead of allocating cache space for the entire completion
at once, allocate in chunks as needed. Used by EXL3 models only.
'';
};
max_batch_size = lib.mkOption {
type = lib.types.nullOr lib.types.ints.positive;
default = null;
description = ''
Set the maximum number of generation jobs that can run concurrently.
The default maximum batch size for transformer architectures is 32. Recurrent
models with linear or sliding attention use more VRAM to support larger batches,
so the default value is reduced to 4. If you do not require concurrency at all,
you can reduce it further to minimize VRAM overhead.
'';
example = 1;
};
prompt_template = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = ''
Set the prompt template for this model.
If null, attempts to look for the model's chat template.
If a model contains multiple templates in its tokenizer_config.json,
set this to the name of the template you want to use.
NOTE: Only works with chat completion message lists!
'';
};
dummy_model_names = lib.mkOption {
type = lib.types.listOf lib.types.str;
default = [ "gpt-3.5-turbo" ];
@@ -192,6 +369,10 @@ in
A list of fake model names that are sent via the /v1/models endpoint.
Also used as bypasses for strict mode if inline_model_loading is true.
'';
example = [
"gpt-3.5-turbo"
"gpt-4"
];
};
vision = lib.mkOption {
@@ -200,6 +381,34 @@ in
description = "Enables vision support if the model supports it.";
};
template_vars_default = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = { };
description = ''
Default chat template variables. Merged into the template variables of every
chat completion request; values sent by the client (template_vars /
chat_template_kwargs, or the top-level reasoning_effort field) take precedence.
Use for model-specific reasoning knobs.
'';
example = {
enable_thinking = true;
};
};
template_vars_force = lib.mkOption {
type = lib.types.attrsOf lib.types.anything;
default = { };
description = ''
Forced chat template variables. Like template_vars_default, but these override
any values sent by the client.
Replaces the deprecated force_enable_thinking option, which is still accepted
as an alias for { enable_thinking = true; }.
'';
example = {
reasoning_effort = "high";
};
};
reasoning = lib.mkOption {
type = lib.types.bool;
default = false;
@@ -220,7 +429,243 @@ in
default = "</think>";
description = "The end token for reasoning content.";
};
start_in_reasoning = lib.mkOption {
type = lib.types.enum [
"auto"
"always"
"never"
];
default = "auto";
description = ''
Whether generation starts inside a reasoning block.
"auto" guesses by scanning the end of the templated prompt for an unclosed
reasoning start token.
'';
example = "always";
};
tool_calls_in_reasoning = lib.mkOption {
type = lib.types.bool;
default = true;
description = ''
Parse tool calls that occur inside reasoning content.
If false, tool call tags inside a reasoning block are treated as plain
reasoning text.
'';
};
tool_format = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = ''
Tool format, e.g. "qwen3_coder". See upstream docs for supported formats.
If null, tool calls from the model will not be parsed by the server.
'';
example = "qwen3_coder";
};
harmony = lib.mkOption {
type = lib.types.nullOr lib.types.bool;
default = null;
description = ''
Parse responses in the Harmony message format (gpt-oss models).
Auto-detected from the model's special tokens when null; set to true or false
to override. Setting tool_format to "harmony" is equivalent to setting this to
true. When active, supersedes the reasoning and tool format settings.
'';
};
};
draft_model = {
draft_mode = lib.mkOption {
type = lib.types.enum [
"model"
"disabled"
"mtp"
"ngram"
];
default = "model";
description = ''
Drafting mode for exllamav3.
In "model" mode, drafting is disabled if no draft_model_name is provided.
'';
example = "ngram";
};
draft_model_dir = lib.mkOption {
type = lib.types.str;
default = "models";
description = "Directory to look for draft models. Relative to the state directory.";
example = "drafts";
};
draft_model_name = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = ''
An initial draft model to load.
Ensure the model is in the draft model directory.
'';
example = "Qwen3-0.6B-exl3";
};
draft_rope_scale = lib.mkOption {
type = lib.types.nullOr lib.types.number;
default = 1.0;
description = ''
Rope scale for draft models, same as compress_pos_emb.
Use if the draft model was trained on long context with rope.
'';
example = 4.0;
};
draft_rope_alpha = lib.mkOption {
type = lib.types.nullOr lib.types.number;
default = null;
description = ''
Rope alpha for draft models, same as alpha_value.
Leaving this null will either pull from the model or auto-calculate.
'';
example = 2.0;
};
draft_cache_mode = lib.mkOption {
type = lib.types.enum [
"FP16"
"Q8"
"Q6"
"Q4"
];
default = "FP16";
description = ''
Cache mode for draft models to save VRAM.
Unlike the model's cache_mode, this does not accept a k_bits,v_bits pair.
'';
example = "Q8";
};
draft_gpu_split = lib.mkOption {
type = lib.types.listOf lib.types.number;
default = [ ];
description = ''
List of VRAM sizes to split between GPUs, in GB.
If this is empty, the draft model is autosplit.
'';
example = [
2
2
];
};
draft_num_tokens = lib.mkOption {
type = lib.types.nullOr lib.types.ints.positive;
default = null;
description = ''
Number of tokens to draft per iteration (default: draft model default).
Recurrent (linear or sliding attention) models use more VRAM for longer drafts.
This overhead multiplies with the max batch size, so for models with long drafts
(e.g. DFlash with 15 tokens by default) shorter drafts may be preferable.
'';
example = 4;
};
dynamic_draft = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Adjust number of draft tokens dynamically based on observed acceptance rates.
Ceiling is given by draft_num_tokens.
'';
};
ngram_match_min = lib.mkOption {
type = lib.types.ints.positive;
default = 2;
description = ''
Minimum match length for exllamav3 n-gram drafting.
Only used when draft_mode is "ngram".
'';
example = 3;
};
};
sampling = {
override_preset = lib.mkOption {
type = lib.types.nullOr lib.types.str;
default = null;
description = ''
Select a sampler override preset, found in the sampler-overrides folder.
This overrides default fallbacks for sampler values that are passed to the API.
NOTE: "safe_defaults" is noob friendly and provides fallbacks for frontends that
don't send sampling parameters. Leave this null for any advanced usage.
'';
example = "safe_defaults";
};
};
lora = {
lora_dir = lib.mkOption {
type = lib.types.str;
default = "loras";
description = "Directory to look for LoRAs. Relative to the state directory.";
};
loras = lib.mkOption {
type = lib.types.listOf (
lib.types.submodule {
options = {
name = lib.mkOption {
type = lib.types.str;
description = "Name of the LoRA directory inside lora_dir.";
};
scaling = lib.mkOption {
type = lib.types.number;
default = 1.0;
description = "Scaling factor for this LoRA.";
};
};
}
);
default = [ ];
description = "List of LoRAs to load and associated scaling factors.";
example = [
{
name = "lora1";
scaling = 1.0;
}
];
};
};
memory = {
sysmem_recurrent_cache = lib.mkOption {
type = lib.types.ints.unsigned;
default = 4096;
description = "Max size of recurrent cache in system memory, in MB.";
example = 8192;
};
sysmem_kv_cache = lib.mkOption {
type = lib.types.ints.unsigned;
default = 0;
description = "Size of system memory second-tier key/value cache, in MB.";
example = 4096;
};
cuda_malloc_async = lib.mkOption {
type = lib.types.bool;
default = true;
description = ''
Use the cudaMallocAsync backend in Torch.
Enabling this is generally preferable, but it may cause issues with certain
workloads. Try disabling it if you experience intermittent OoM errors. If false,
Torch will use the allocator defined by the system environment.
'';
};
};
};
};
};
@@ -236,6 +681,14 @@ in
services.tabbyapi.package = pkgs.pkgsCuda.tabbyapi;
'';
}
{
assertion = !(cfg.settings.model ? force_enable_thinking);
message = ''
services.tabbyapi.settings.model.force_enable_thinking is deprecated upstream.
Use template_vars_force instead:
services.tabbyapi.settings.model.template_vars_force.enable_thinking = true;
'';
}
];
networking.firewall.allowedTCPPorts = lib.mkIf cfg.openFirewall [
cfg.settings.network.port

View File

@@ -6,6 +6,7 @@
desktopName,
self,
autoPatchelfHook,
addDriverRunpath,
fetchurl,
makeDesktopItem,
lib,
@@ -258,7 +259,8 @@ stdenv.mkDerivation (finalAttrs: {
''} \
${lib.strings.optionalString enableAutoscroll "--add-flags \"--enable-blink-features=MiddleClickAutoscroll\""} \
--prefix XDG_DATA_DIRS : "${gtk3}/share/gsettings-schemas/${gtk3.name}/" \
--prefix LD_LIBRARY_PATH : ${finalAttrs.libPath}:$out/opt/${binaryName} \
--prefix LD_LIBRARY_PATH : ${finalAttrs.libPath}:$out/opt/${binaryName}:${addDriverRunpath.driverLink}/lib \
--suffix VK_ADD_DRIVER_FILES : "${addDriverRunpath.driverLink}/share/vulkan/icd.d" \
${lib.strings.optionalString disableUpdates "--run ${lib.getExe disableBreakingUpdates}"} \
--run "${finalAttrs.stageModules} $out/opt/${binaryName}/modules" \
--add-flags ${lib.escapeShellArg commandLineArgs}

View File

@@ -105,11 +105,11 @@ assert lib.all (p: p.enabled -> !(builtins.elem null p.buildInputs)) plugins;
stdenv.mkDerivation rec {
pname = "weechat";
version = "4.9.4";
version = "4.10.0";
src = fetchurl {
url = "https://weechat.org/files/src/weechat-${version}.tar.xz";
hash = "sha256-P8UDWfOjsljJ8DFIsC87nFkZRTXRtGXEgfuFp2wu0AU=";
hash = "sha256-w6fnxqVAHd6aRtAmT6RKowMsqYqoZBDEVNPeXGlQXFQ=";
};
# Why is this needed? https://github.com/weechat/weechat/issues/2031

View File

@@ -5,13 +5,12 @@
lib,
gnugrep,
gnused,
curl,
curl-impersonate,
catt,
syncplay,
openssl,
ffmpeg,
fzf,
aria2,
yt-dlp,
mpv,
vlc,
iina,
@@ -28,28 +27,30 @@ in
stdenvNoCC.mkDerivation (finalAttrs: {
pname = "ani-cli";
version = "4.14";
version = "5.0";
src = fetchFromGitHub {
owner = "pystardust";
repo = "ani-cli";
tag = "v${finalAttrs.version}";
hash = "sha256-OyCKDN89sBz59+3JncMDyNOq8UMqqjara+A0Owo3oko=";
hash = "sha256-rRQESi0Skoyf1jy/dRRK6ooKRPQhkak107kk5ulwZYI=";
};
nativeBuildInputs = [ makeWrapper ];
runtimeInputs = [
openssl
gnugrep
gnused
curl
curl-impersonate
fzf
ffmpeg
aria2
yt-dlp
]
++ lib.optional chromecastSupport catt
++ lib.optional syncSupport syncplay;
strictDeps = true;
__structuredAttrs = true;
installPhase = ''
runHook preInstall

View File

@@ -70,6 +70,8 @@ buildNpmPackage {
npmInstallFlags = [ "--only-production" ];
installPhase = ''
runHook preInstall
mkdir -p $out/opt/client
cp -r index.js server package* node_modules $out/opt/
cp -r ${client}/lib/node_modules/audiobookshelf-client/dist $out/opt/client/dist
@@ -79,6 +81,8 @@ buildNpmPackage {
echo " exec ${nodejs_22}/bin/node $out/opt/index.js" >> $out/bin/audiobookshelf
chmod +x $out/bin/audiobookshelf
runHook postInstall
'';
passthru = {

View File

@@ -29,11 +29,11 @@
stdenv.mkDerivation (finalAttrs: {
pname = "bind";
version = "9.20.23";
version = "9.20.26";
src = fetchurl {
url = "https://downloads.isc.org/isc/bind9/${finalAttrs.version}/bind-${finalAttrs.version}.tar.xz";
hash = "sha256-XUR1rtP55QDvVUsrFNlyvbg9M94hSps76SkY6kaQg3E=";
hash = "sha256-VSSN7w+HDExGs95yl46pcmFRMVFmYxiKRWTcodIL81A=";
};
outputs = [
@@ -109,31 +109,17 @@ stdenv.mkDerivation (finalAttrs: {
enableParallelBuilding = true;
strictDeps = true;
__structuredAttrs = true;
doCheck = false;
# TODO: investigate failures; see this and linked discussions:
# https://github.com/NixOS/nixpkgs/pull/192962
/*
doCheck = with stdenv.hostPlatform; !isStatic && !(isAarch64 && isLinux)
# https://gitlab.isc.org/isc-projects/bind9/-/issues/4269
&& !is32bit;
*/
doCheck = with stdenv.hostPlatform; !isStatic && isLinux && !isLoongArch64;
checkTarget = "unit";
checkInputs = [
cmocka
]
++ lib.optionals (!stdenv.hostPlatform.isMusl) [
tzdata
];
preCheck =
lib.optionalString stdenv.hostPlatform.isMusl ''
# musl doesn't respect TZDIR, skip timezone-related tests
sed -i '/^ISC_TEST_ENTRY(isc_time_formatISO8601L/d' tests/isc/time_test.c
''
+ lib.optionalString stdenv.hostPlatform.isDarwin ''
# Test timeouts on Darwin
sed -i '/^ISC_TEST_ENTRY(tcpdns_recv_one/d' tests/isc/netmgr_test.c
'';
preCheck = ''
# skip timezone-related tests, they are flaky inside the nix sandbox
sed -i '/^ISC_TEST_ENTRY(isc_time_formatISO8601L/d' tests/isc/time_test.c
'';
postFixup = ''
remove-references-to -t "$out" "$dnsutils/bin/delv"
@@ -166,7 +152,7 @@ stdenv.mkDerivation (finalAttrs: {
changelog = "https://downloads.isc.org/isc/bind9/cur/${lib.versions.majorMinor finalAttrs.version}/doc/arm/html/notes.html#notes-for-bind-${
lib.replaceStrings [ "." ] [ "-" ] finalAttrs.version
}";
maintainers = [ ];
maintainers = with lib.maintainers; [ bartoostveen ];
platforms = lib.platforms.unix;
outputsToInstall = [

View File

@@ -19,16 +19,16 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "gelly";
version = "1.9.4";
version = "1.9.5";
src = fetchFromGitHub {
owner = "Fingel";
repo = "gelly";
tag = "v${finalAttrs.version}";
hash = "sha256-GYMLV4hffaIbqUp1b5ERo2QQqiKRlHe9oXfq+wNH/hM=";
hash = "sha256-k6LgXEK5xoVrjiXCkYnFgC7Hs7oz+v3Kz47CELPqN9Q=";
};
cargoHash = "sha256-CsmcXlkOec/KJ59Ng7MyGsfjWQ80YyV6MztRFULmvDA=";
cargoHash = "sha256-RbOs5CEj3KRe6F1RJSGx97wBoQKSynx+iza929ipfjA=";
nativeBuildInputs = [
pkg-config

View File

@@ -9,7 +9,7 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "jocalsend";
version = "1.618033988";
version = "1.6180339887";
__structuredAttrs = true;
@@ -18,10 +18,10 @@ rustPlatform.buildRustPackage (finalAttrs: {
owner = "nebkor";
repo = "joecalsend";
tag = finalAttrs.version;
hash = "sha256-nzsvVC1e8ENh0bpQwiogGew823NNmSNXN+VZZHfVFIY=";
hash = "sha256-sOgFOAJXX5mugjMfTICNrJHc/DRD5zdZsg/K4cbRjlQ=";
};
cargoHash = "sha256-5V/a6rj08Ucu6S+SBukYQktWLVnnbXeoGan1oYTozHc=";
cargoHash = "sha256-UEzyy6SQ3ntJHeXivd6e8Xvr4aTdpfYrFMWqLjoBrJc=";
nativeBuildInputs = [
pkg-config

View File

@@ -0,0 +1,250 @@
From d25c12c343b53ea90025c11808700ad6267f4e59 Mon Sep 17 00:00:00 2001
From: timedout <git@nexy7574.co.uk>
Date: Wed, 29 Jul 2026 16:38:05 +0100
Subject: [PATCH] fix(backport): SEC10
Reviewed-By: Ginger <ginger@gingershaped.computer>
Co-Authored-By: Erwan Leboucher <erwanleboucher@gmail.com>
(cherry picked from commit 71016a0d7f79289f3bf8d7816c1fec3c85c43153)
---
src/api/client/sync/v5.rs | 133 +++++++++++++++++++++++++++++++-------
1 file changed, 111 insertions(+), 22 deletions(-)
diff --git a/src/api/client/sync/v5.rs b/src/api/client/sync/v5.rs
index 183f3aaac..03a4c1972 100644
--- a/src/api/client/sync/v5.rs
+++ b/src/api/client/sync/v5.rs
@@ -1,6 +1,6 @@
use std::{
cmp::{self, Ordering},
- collections::{BTreeMap, BTreeSet, HashMap, HashSet, VecDeque},
+ collections::{BTreeMap, BTreeSet, HashMap, HashSet},
ops::Deref,
time::Duration,
};
@@ -28,6 +28,7 @@
use ruma::{
DeviceId, OwnedEventId, OwnedRoomId, RoomId, UInt, UserId,
api::client::sync::sync_events::{self, DeviceLists, UnreadNotificationsCount},
+ assign,
directory::RoomTypeFilter,
events::{
AnyRawAccountDataEvent, AnySyncEphemeralRoomEvent, AnySyncStateEvent, StateEventType,
@@ -139,6 +140,13 @@ pub(crate) async fn sync_events_v5_route(
let (all_joined_rooms, all_invited_rooms, all_knocked_rooms) =
join3(all_joined_rooms, all_invited_rooms, all_knocked_rooms).await;
+ let allowed_rooms: BTreeSet<OwnedRoomId> = all_joined_rooms
+ .iter()
+ .chain(all_invited_rooms.iter())
+ .chain(all_knocked_rooms.iter())
+ .cloned()
+ .collect();
+
let all_joined_rooms = all_joined_rooms.iter().map(AsRef::as_ref);
let all_invited_rooms = all_invited_rooms.iter().map(AsRef::as_ref);
let all_knocked_rooms = all_knocked_rooms.iter().map(AsRef::as_ref);
@@ -192,13 +200,14 @@ pub(crate) async fn sync_events_v5_route(
)
.await;
- fetch_subscriptions(services, sync_info, &known_rooms, &mut todo_rooms).await;
+ fetch_subscriptions(services, sync_info, &known_rooms, &allowed_rooms, &mut todo_rooms).await;
response.rooms = process_rooms(
services,
sender_user,
next_batch,
all_invited_rooms.clone(),
+ all_knocked_rooms.clone(),
&todo_rooms,
&mut response,
&body,
@@ -208,6 +217,7 @@ pub(crate) async fn sync_events_v5_route(
if response.rooms.iter().all(|(id, r)| {
r.timeline.is_empty()
&& r.required_state.is_empty()
+ && r.invite_state.is_none()
&& !response.extensions.receipts.rooms.contains_key(id)
}) && response
.extensions
@@ -238,10 +248,17 @@ async fn fetch_subscriptions(
services: &Services,
(sender_user, sender_device, globalsince, body): SyncInfo<'_>,
known_rooms: &KnownRooms,
+ allowed_rooms: &BTreeSet<OwnedRoomId>,
todo_rooms: &mut TodoRooms,
) {
let mut known_subscription_rooms = BTreeSet::new();
for (room_id, room) in &body.room_subscriptions {
+ // Silently ignore subscriptions to rooms the user is not a member of
+ // (joined or invited).
+ if !allowed_rooms.contains(room_id) {
+ continue;
+ }
+
let not_exists = services.rooms.metadata.exists(room_id).eq(&false);
let is_disabled = services.rooms.metadata.is_disabled(room_id);
@@ -399,11 +416,13 @@ async fn handle_lists<'a, Rooms, AllRooms>(
BTreeMap::default()
}
+#[allow(clippy::too_many_arguments)]
async fn process_rooms<'a, Rooms>(
services: &Services,
sender_user: &UserId,
next_batch: u64,
all_invited_rooms: Rooms,
+ all_knocked_rooms: Rooms,
todo_rooms: &TodoRooms,
response: &mut sync_events::v5::Response,
body: &sync_events::v5::Request,
@@ -416,38 +435,99 @@ async fn process_rooms<'a, Rooms>(
let roomsincecount = PduCount::Normal(*roomsince);
let mut timestamp: Option<_> = None;
- let mut invite_state = None;
let (timeline_pdus, limited);
let new_room_id: &RoomId = (*room_id).as_ref();
if all_invited_rooms.clone().any(is_equal_to!(new_room_id)) {
+ let Ok(invite_count) = services
+ .rooms
+ .state_cache
+ .get_invite_count(room_id, sender_user)
+ .await
+ else {
+ continue;
+ };
+
+ if *roomsince >= invite_count {
+ continue;
+ }
+
// TODO: figure out a timestamp we can use for remote invites
- invite_state = services
+ let invite_state = services
.rooms
.state_cache
.invite_state(sender_user, room_id)
.await
.ok();
- (timeline_pdus, limited) = (VecDeque::new(), true);
- } else {
- TimelinePdus { pdus: timeline_pdus, limited } = match load_timeline(
- services,
- sender_user,
- room_id,
- Some(roomsincecount),
- Some(PduCount::from(next_batch)),
- *timeline_limit,
- )
- .await
- {
- | Ok(value) => value,
- | Err(err) => {
- warn!("Encountered missing timeline in {}, error {}", room_id, err);
- continue;
- },
+ rooms.insert(room_id.clone(), sync_events::v5::response::Room {
+ initial: Some(roomsince == &0),
+ invite_state,
+ limited: true,
+ ..Default::default()
+ });
+ continue;
+ }
+
+ if all_knocked_rooms.clone().any(is_equal_to!(new_room_id)) {
+ let Ok(knock_count) = services
+ .rooms
+ .state_cache
+ .get_knock_count(room_id, sender_user)
+ .await
+ else {
+ continue;
};
+
+ if *roomsince >= knock_count {
+ continue;
+ }
+
+ let Ok(knock_state) = services
+ .rooms
+ .state_cache
+ .knock_state(sender_user, room_id)
+ .await
+ else {
+ continue;
+ };
+
+ rooms.insert(
+ room_id.clone(),
+ assign!(sync_events::v5::response::Room::new(), {
+ initial: Some(roomsince == &0),
+ invite_state: Some(knock_state),
+ limited: true,
+ }),
+ );
+ continue;
+ }
+
+ if !services
+ .rooms
+ .state_cache
+ .is_joined(sender_user, room_id)
+ .await
+ {
+ continue;
}
+ TimelinePdus { pdus: timeline_pdus, limited } = match load_timeline(
+ services,
+ sender_user,
+ room_id,
+ Some(roomsincecount),
+ Some(PduCount::from(next_batch)),
+ *timeline_limit,
+ )
+ .await
+ {
+ | Ok(value) => value,
+ | Err(err) => {
+ warn!("Encountered missing timeline in {}, error {}", room_id, err);
+ continue;
+ },
+ };
+
if body.extensions.account_data.enabled == Some(true) {
response.extensions.account_data.rooms.insert(
room_id.to_owned(),
@@ -627,7 +707,7 @@ async fn process_rooms<'a, Rooms>(
},
initial: Some(roomsince == &0),
is_dm: None,
- invite_state,
+ invite_state: None,
unread_notifications: UnreadNotificationsCount {
highlight_count: Some(
services
@@ -753,6 +833,15 @@ async fn collect_typing_events(
let mut typing_response = sync_events::v5::response::Typing::default();
for (room_id, (_, _, roomsince)) in todo_rooms {
+ if !services
+ .rooms
+ .state_cache
+ .is_joined(sender_user, room_id)
+ .await
+ {
+ continue;
+ }
+
if services.rooms.typing.last_typing_update(room_id).await? <= *roomsince {
continue;
}
--
2.55.0

View File

@@ -50,6 +50,10 @@ rustPlatform.buildRustPackage (finalAttrs: {
cargoHash = "sha256-uvMiFURXxkLbbbwq4pG5hevsLZHQ1wVfTNvzQRTQWxE=";
patches = [
./0001-fix-backport-SEC10.patch
];
nativeBuildInputs = [
pkg-config
rustPlatform.bindgenHook

View File

@@ -1,6 +1,6 @@
{
lib,
stdenv,
callPackage,
rustPlatform,
fetchFromGitHub,
pkg-config,
@@ -8,54 +8,26 @@
sqlite,
testers,
moonfire-nvr,
nodejs,
pnpm_9,
fetchPnpmDeps,
pnpmConfigHook,
nix-update,
writeShellApplication,
}:
let
rustPlatform.buildRustPackage (finalAttrs: {
pname = "moonfire-nvr";
version = "0.7.20";
version = "0.7.31";
src = fetchFromGitHub {
owner = "scottlamb";
repo = "moonfire-nvr";
tag = "v${version}";
hash = "sha256-0EaGqZUmYGxLHcJAhlbG2wZMDiVv8U1bcTQqMx0aTo0=";
tag = "v${finalAttrs.version}";
hash = "sha256-QgsaiWcXeU4y7z9mcqUAl4mQ/M4p38yRjOB/4MKlpVA=";
};
ui = stdenv.mkDerivation (finalAttrs: {
inherit version src;
pname = "${pname}-ui";
sourceRoot = "${src.name}/ui";
nativeBuildInputs = [
nodejs
pnpmConfigHook
pnpm_9
];
pnpmDeps = fetchPnpmDeps {
inherit (finalAttrs) pname version src;
pnpm = pnpm_9;
sourceRoot = "${finalAttrs.src.name}/ui";
fetcherVersion = 3;
hash = "sha256-1bkuou8jfWqdev4ZlpqvC4BRrFj//LK6ImVvSeMUEuM=";
};
installPhase = ''
runHook preInstall
cp -r public $out
sourceRoot = "${finalAttrs.src.name}/server";
runHook postInstall
'';
});
in
rustPlatform.buildRustPackage {
inherit pname version src;
cargoHash = "sha256-TDFe5pD+8eSwvw0h9GLM+JfODlSBU1CO8fw4FVjy8xk=";
sourceRoot = "${src.name}/server";
cargoHash = "sha256-+L4XofUFvhJDPGv4fAGYXFNpuNd01k/P63LH2tXXHE0=";
env.VERSION = "v${version}";
env.VERSION = "v${finalAttrs.version}";
nativeBuildInputs = [
pkg-config
@@ -68,26 +40,40 @@ rustPlatform.buildRustPackage {
postInstall = ''
mkdir -p $out/lib
ln -s ${ui} $out/lib/ui
ln -s ${moonfire-nvr.ui} $out/lib/ui
'';
doCheck = false;
passthru = {
inherit ui;
ui = callPackage ./ui.nix { };
tests.version = testers.testVersion {
package = moonfire-nvr;
command = "moonfire-nvr --version";
version = "Version: v${version}";
version = "Version: v${finalAttrs.version}";
};
updateScript = lib.getExe (writeShellApplication {
name = "update-moonfire-nvr";
runtimeInputs = [
nix-update
];
text = ''
set -euo pipefail
nix-update moonfire-nvr
nix-update moonfire-nvr.ui --version=skip
'';
});
};
meta = {
description = "Moonfire NVR, a security camera network video recorder";
homepage = "https://github.com/scottlamb/moonfire-nvr";
changelog = "https://github.com/scottlamb/moonfire-nvr/releases/tag/v${version}";
changelog = "https://github.com/scottlamb/moonfire-nvr/releases/tag/${finalAttrs.src.tag}";
license = lib.licenses.gpl3Only;
maintainers = [ ];
mainProgram = "moonfire-nvr";
};
}
})

View File

@@ -0,0 +1,41 @@
{
stdenv,
moonfire-nvr,
nodejs,
pnpmConfigHook,
pnpm_10,
fetchPnpmDeps,
}:
stdenv.mkDerivation (finalAttrs: {
pname = "moonfire-nvr-ui";
inherit (moonfire-nvr) version src;
sourceRoot = "${finalAttrs.src.name}/ui";
nativeBuildInputs = [
nodejs
pnpmConfigHook
pnpm_10
];
pnpmDeps = fetchPnpmDeps {
inherit (finalAttrs) pname version src;
pnpm = pnpm_10;
sourceRoot = "${finalAttrs.src.name}/ui";
fetcherVersion = 4;
hash = "sha256-U/SHOVlx0kj1hfl09KcPg3CQZX9HZE5SghVEThWL1RA=";
};
installPhase = ''
runHook preInstall
cp -r public $out
runHook postInstall
'';
meta = moonfire-nvr.meta // {
description = "Moonfire UI";
};
})

View File

@@ -1,38 +1,37 @@
{
lib,
fetchFromGitHub,
curl,
xclip,
wl-clipboard,
stdenv,
buildLua,
unstableGitUpdater,
fetchFromGitHub,
gitUpdater,
stdenv,
curl,
wl-clipboard,
xclip,
}:
buildLua {
buildLua (finalAttrs: {
pname = "videoclip";
version = "0.2-unstable-2026-05-31";
version = "26.7.30.0";
src = fetchFromGitHub {
owner = "Ajatt-Tools";
repo = "videoclip";
rev = "d9a3e0966b238b824b86767956eb44a11ac367c6";
hash = "sha256-NZaflGehxoIf9eY3/p9WrKXXQj3x6GDZ6iMLeu5BhPc=";
tag = "v${finalAttrs.version}";
hash = "sha256-4ptnF3/L3U0CDucYcd8/O5EN1mUtnor+iXLRXbiC7os=";
};
patchPhase = ''
substituteInPlace platform.lua \
--replace \'curl\' \'${lib.getExe curl}\' \
postPatch = ''
substituteInPlace videoclip/platform.lua \
--replace-fail "'curl'" "'${lib.getExe curl}'"
''
+ lib.optionalString stdenv.hostPlatform.isLinux ''
--replace xclip ${lib.getExe xclip} \
--replace wl-copy ${lib.getExe' wl-clipboard "wl-copy"}
substituteInPlace videoclip/platform.lua \
--replace-fail '"wl-copy' '"${lib.getExe' wl-clipboard "wl-copy"}' \
--replace-fail '"xclip' '"${lib.getExe xclip}'
'';
scriptPath = ".";
passthru.scriptName = "videoclip";
passthru.updateScript = unstableGitUpdater {
tagPrefix = "v";
};
scriptPath = "videoclip";
passthru.updateScript = gitUpdater { rev-prefix = "v"; };
meta = {
description = "Easily create videoclips with mpv";
@@ -41,4 +40,4 @@ buildLua {
platforms = lib.platforms.all;
maintainers = with lib.maintainers; [ BatteredBunny ];
};
}
})

View File

@@ -31,11 +31,11 @@ let
in
stdenv.mkDerivation rec {
pname = "nano";
version = "9.1";
version = "9.2";
src = fetchurl {
url = "mirror://gnu/nano/nano-${version}.tar.xz";
hash = "sha256-X0d2QnTLdTI0nOCqIOwQ8ejoUabp+j62aBLEPRltsEI=";
hash = "sha256-Bey5kke3guils6Je1BAd0DSwI2kC90SbyXlbcXZC9+k=";
};
nativeBuildInputs = [ texinfo ] ++ lib.optional enableNls gettext;

View File

@@ -13,13 +13,13 @@
buildGoModule (finalAttrs: {
pname = "opengist";
version = "1.14.0";
version = "1.15.0";
src = fetchFromGitHub {
owner = "thomiceli";
repo = "opengist";
tag = "v${finalAttrs.version}";
hash = "sha256-glKhgETje+TRmwnSWJ+fVla0hsyljZLnRKcM4xi+zQ8=";
hash = "sha256-yE9HvRFEQzv3Fhhbs9hXeLc4vudCMi+NMA2T8YUlREw=";
};
frontend = buildNpmPackage {
@@ -36,10 +36,10 @@ buildGoModule (finalAttrs: {
cp -R public $out
'';
npmDepsHash = "sha256-Zz6qoqTV/O73OrBL7ry1VXK9nF6Eb6QeqcefLpyMN1c=";
npmDepsHash = "sha256-hAG0vGjG+ejumjoslYs/UnYBImZDNsTQUDtssT0X/HI=";
};
vendorHash = "sha256-J4JMOCj7S8N0kX7VBZmrAiPuXjWur+MIkS8pMVmkLbs=";
vendorHash = "sha256-YU1OdYM9GzUGHypgIhWvJCvYEzlKsaKGN0NZRBfT8FY=";
tags = [ "fs_embed" ];

View File

@@ -0,0 +1,16 @@
The vendored copy of Google's cpp-btree relies on <cstdint> being pulled in
transitively. libstdc++ 15 no longer does so, which makes uint8_t/uint16_t
undeclared, and the resulting fallback to int trips the kNodeValues
COMPILE_ASSERT with a "1 << 32" shift.
diff --git a/include/btree.h b/include/btree.h
--- a/include/btree.h
+++ b/include/btree.h
@@ -104,6 +104,7 @@
#include <stddef.h>
#include <string.h>
#include <sys/types.h>
+#include <cstdint>
#include <algorithm>
#include <functional>
#include <iostream>

View File

@@ -151,7 +151,7 @@ index 87d2a20e..505e069a 100644
cd mariadb-client-library && tar -zxf mariadb-connector-c-3.3.8-src.tar.gz
cd mariadb-client-library/mariadb_client && patch -p0 < ../plugin_auth_CMakeLists.txt.patch
- cd mariadb-client-library/mariadb_client && cmake . -Wno-dev -DCMAKE_BUILD_TYPE=RelWithDebInfo -DOPENSSL_ROOT_DIR=$(SSL_IDIR) -DOPENSSL_LIBRARIES=$(SSL_LDIR) -DICONV_LIBRARIES=$(brew --prefix libiconv)/lib -DICONV_INCLUDE=$(brew --prefix libiconv)/include .
+ cd mariadb-client-library/mariadb_client && cmake . -Wno-dev -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DOPENSSL_ROOT_DIR=$(SSL_IDIR) -DOPENSSL_LIBRARIES=$(SSL_LDIR) -DICONV_LIBRARIES=$(brew --prefix libiconv)/lib -DICONV_INCLUDE=$(brew --prefix libiconv)/include .
+ cd mariadb-client-library/mariadb_client && cmake . -Wno-dev -DCMAKE_POLICY_VERSION_MINIMUM=3.5 -DCMAKE_C_FLAGS=-std=gnu17 -DCMAKE_BUILD_TYPE=RelWithDebInfo -DOPENSSL_ROOT_DIR=$(SSL_IDIR) -DOPENSSL_LIBRARIES=$(SSL_LDIR) -DICONV_LIBRARIES=$(brew --prefix libiconv)/lib -DICONV_INCLUDE=$(brew --prefix libiconv)/include .
ifeq ($(PROXYDEBUG),1)
cd mariadb-client-library/mariadb_client && patch -p0 < ../ma_context.h.patch
else ifeq ($(USEVALGRIND),1)

View File

@@ -49,6 +49,7 @@ stdenv.mkDerivation (finalAttrs: {
patches = [
./makefiles.patch
./dont-phone-home.patch
./btree-cstdint.patch
];
nativeBuildInputs = [

View File

@@ -13,15 +13,15 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "rust-analyzer-unwrapped";
version = "2026-04-27";
version = "2026-06-01";
cargoHash = "sha256-QXEJhBzKof1UONW2FwQUeO6UAo1Xfm2nPpOo1uNiRM8=";
cargoHash = "sha256-5njpo8AKVOSgCFwuqTL9sVODyjgsEfg5kHI3qM0DK9k=";
src = fetchFromGitHub {
owner = "rust-lang";
repo = "rust-analyzer";
rev = finalAttrs.version;
hash = "sha256-f8YJfwAOsLFpIoqZuX3yF69UvMLrkx7iVzMH1pJU7cM=";
hash = "sha256-yJIyzYb6LhvbVMmj2EH62Mt0JHU3pQefr+oPEgaoaI8=";
};
cargoBuildFlags = [

View File

@@ -10,16 +10,16 @@
buildGoModule (finalAttrs: {
pname = "sing-box";
version = "1.13.15";
version = "1.13.16";
src = fetchFromGitHub {
owner = "SagerNet";
repo = "sing-box";
tag = "v${finalAttrs.version}";
hash = "sha256-YkbF5+smzP+AQ161xvTBO01ZIB3PonHVM0l5DVRSnFs=";
hash = "sha256-GAIU0SRvxU92E40zCkMsiSPuIEIUZM5vORN2u2XIhqs=";
};
vendorHash = "sha256-HIMKtolVXbmyV1vmXXAt3O/2NTp4HwzhUWChs8I4+cs=";
vendorHash = "sha256-ZUEpYfgb/iflImVCdLIgUzfp4QY9ho1gYkIAJV1tXrg=";
tags = [
"with_gvisor"

View File

@@ -7,14 +7,14 @@
}:
python3Packages.buildPythonApplication {
pname = "tabbyapi";
version = "0-unstable-2026-07-18";
version = "0-unstable-2026-07-31";
pyproject = true;
src = fetchFromGitHub {
owner = "theroyallab";
repo = "tabbyAPI";
rev = "0158fb48d76546a6475d1d63f6cd5b90932d1d11";
hash = "sha256-Bkpx3MyZg7Np5zXAsq8mgxdAFsHUZhy2NZ93XSLbJgk=";
rev = "29680f496b57e3ed1a496c580677d2d67ac729b8";
hash = "sha256-eB8Q4iVlNCrgHHWutuhxzD+bQfC5Yx3z2rSCCSFsrL4=";
};
build-system = with python3Packages; [

View File

@@ -9,16 +9,16 @@
buildNpmPackage (finalAttrs: {
pname = "uptime-kuma";
version = "2.4.0";
version = "2.5.0";
src = fetchFromGitHub {
owner = "louislam";
repo = "uptime-kuma";
tag = finalAttrs.version;
hash = "sha256-iqkf9/UAQOnSA+nncK/fmjbqZpIQeUmigI/78m5qKrM=";
hash = "sha256-C9XBPhCQNU5y2C9svsieiC0FTMdW9sJQI2OeiCjqte8=";
};
npmDepsHash = "sha256-chvykBfnARLto+Il9gumm6UTRSTPPBjg5pj4yGFiOcg=";
npmDepsHash = "sha256-qe8qK0bWYFyzClrMNAXdxuqrBIn14Xf3oN40ch1cqnY=";
patches = [
# Fixes the permissions of the database being not set correctly

View File

@@ -1,15 +1,15 @@
diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml
index 92c50e4e..67a306eb 100644
index ddf8750c..655c9a7d 100644
--- a/pnpm-lock.yaml
+++ b/pnpm-lock.yaml
@@ -162,8 +162,8 @@ importers:
specifier: ^22.13.4
version: 22.13.13
@@ -160,8 +160,8 @@ importers:
specifier: ^26.0.1
version: 26.0.1
'@types/react':
- specifier: 18.3.1
- version: 18.3.1
+ specifier: 19.0.12
+ version: 19.0.12
+ specifier: 19.1.0
+ version: 19.1.0
'@types/react-dom':
specifier: 18.3.1
version: 18.3.1

View File

@@ -6,7 +6,7 @@
lib,
nix-update,
nodejs,
pnpm_10,
pnpm_11,
fetchPnpmDeps,
pnpmConfigHook,
stdenv,
@@ -18,24 +18,24 @@
buildWebExtension ? false,
}:
let
pnpm = pnpm_10;
pnpm = pnpm_11;
in
stdenv.mkDerivation (finalAttrs: {
pname = "vencord";
version = "1.14.15";
version = "1.15.0";
src = fetchFromGitHub {
owner = "Vendicated";
repo = "Vencord";
tag = "v${finalAttrs.version}";
hash = "sha256-jQeLZa1rpKDkzWSpAqOa8snGRKLpv9xf9cwJ6hUwMzA=";
hash = "sha256-z3EY/nc9pHPjuMteY8ubYM3sqgjASznEG6B1U4mNCU4=";
};
patches = [ ./fix-deps.patch ];
postPatch = ''
substituteInPlace packages/vencord-types/package.json \
--replace-fail '"@types/react": "18.3.1"' '"@types/react": "19.0.12"'
--replace-fail '"@types/react": "18.3.1"' '"@types/react": "19.1.0"'
'';
pnpmDeps = fetchPnpmDeps {
@@ -47,7 +47,7 @@ stdenv.mkDerivation (finalAttrs: {
;
inherit pnpm;
fetcherVersion = 4;
hash = "sha256-pm5f6bGm07pzNCqpDHRyKFnuX2ZTE5w9BtJu5xXPHiI=";
hash = "sha256-JmTSfUVHsMG0TcOwXkZWinRxpONZagtwKzESd8Q4LlQ=";
};
nativeBuildInputs = [

View File

@@ -10,17 +10,17 @@
rustPlatform.buildRustPackage (finalAttrs: {
pname = "zsh-patina";
version = "1.7.0";
version = "1.9.0";
__structuredAttrs = true;
src = fetchFromGitHub {
owner = "michel-kraemer";
repo = "zsh-patina";
tag = finalAttrs.version;
hash = "sha256-sPlIT3UHtq+5+bpfrSPPfVXTdmqjEq+6k9tPShhG7h0=";
hash = "sha256-WVlv+bYFTQ3RG3m2NnG13kMoslXzcPr8CpFWwAOcNBA=";
};
cargoHash = "sha256-j2MwEwQhSCUCwANAxr0aZjJ9iS0cGzRRttfK8LONEpg=";
cargoHash = "sha256-A946sab9GDBdoNAWH7AN10lEhHNnHnCnNzQgnEcQ8QI=";
nativeBuildInputs = [ installShellFiles ];
postInstall = ''

View File

@@ -27,10 +27,18 @@ let
"20.1.8".officialRelease.sha256 = "sha256-ysyB/EYxi2qE9fD5x/F2zI4vjn8UDoo1Z9ukiIrjFGw=";
"21.1.8".officialRelease.sha256 = "sha256-pgd8g9Yfvp7abjCCKSmIn1smAROjqtfZaJkaUkBSKW0=";
"22.1.8".officialRelease.sha256 = "sha256-SF7wFuh4kXZTytpdgX7vUZItKtRobnVICm+ixze4iG0=";
"23.0.0-git".gitRelease = {
rev = "7d24dfa5f29e1794e452aadaa27f994f15568763";
rev-version = "23.0.0-unstable-2026-07-12";
sha256 = "sha256-mHiwOqEvqXyG6OoiVLRrhzb2MK7FqjQm9ez329ngbYw=";
"23.1.0-rc1" = {
gitRelease = {
rev = "acdf320b78fcf075ddcf660b51cf18d5c0af755b";
rev-version = "23.1.0-rc1";
sha256 = "sha256-kSfy7IRgF/2HX5Fr3OS5LTXx7xm/iUx7tWb27e4wO+s=";
};
name = "23";
};
"24.0.0-git".gitRelease = {
rev = "43a704b657423a0eead02e64911b413c4afca73f";
rev-version = "24.0.0-unstable-2026-07-26";
sha256 = "sha256-wXhYrz3g5F7iwVqgIVryfRtkQ+3lKIKRDd9D8X18dEE=";
};
}
// llvmVersions;

View File

@@ -27,14 +27,14 @@ let
in
buildPythonPackage.override { inherit (torch) stdenv; } (finalAttrs: {
pname = "exllamav3";
version = "1.2.1";
version = "1.3.0";
pyproject = true;
src = fetchFromGitHub {
owner = "turboderp-org";
repo = "exllamav3";
tag = "v${finalAttrs.version}";
hash = "sha256-ErsCtCM/T1YuCQAwrKhc860ETLgiS5Qu4nrQSuEzsPk=";
hash = "sha256-pWdh5fiGZEkdSLXvI5DAEdj6XmBFquzew57L1YIsEg8=";
};
pythonRelaxDeps = [

View File

@@ -10,19 +10,19 @@
buildPythonPackage rec {
pname = "general-sam";
version = "1.0.3";
version = "1.0.5";
pyproject = true;
src = fetchFromGitHub {
owner = "ModelTC";
repo = "general-sam-py";
rev = "v${version}";
hash = "sha256-++6Z9Ocee4QFN1u0nK/g9uGdmB1UYnfHhhJj74zboCE=";
hash = "sha256-/hfq14oFNPhPrhjlIDCyjMfdCuhMdKZ5DBc/nlEQKno=";
};
cargoDeps = rustPlatform.fetchCargoVendor {
inherit pname version src;
hash = "sha256-8HHIM1Abz5KxnVphFFNJp6L3D6iPeoB7qVmxy11CUZs=";
hash = "sha256-8uUCe/isN1qos8cBml16NOzUYHfr94G/GzllQt/5vWg=";
};
build-system = [

View File

@@ -31,7 +31,7 @@
buildPythonPackage (finalAttrs: {
pname = "gradio-client";
version = "2.5.0";
version = "2.6.0";
pyproject = true;
# no tests on pypi
@@ -134,6 +134,7 @@ buildPythonPackage (finalAttrs: {
disabledTests = [ ];
pythonImportsCheck = null;
dontCheckRuntimeDeps = true;
dontCheckPythonMetadata = true; # broken due to changed pname
});
inherit (gradio) updateScript;

View File

@@ -49,6 +49,7 @@
typer,
typing-extensions,
uvicorn,
urllib3,
# oauth
authlib,
@@ -81,7 +82,7 @@ let
in
buildPythonPackage (finalAttrs: {
pname = "gradio";
version = "6.20.0"; # please always backport gradio changes
version = "6.22.0"; # please always backport gradio changes
pyproject = true;
__structuredAttrs = true;
@@ -89,7 +90,7 @@ buildPythonPackage (finalAttrs: {
owner = "gradio-app";
repo = "gradio";
tag = "gradio@${finalAttrs.version}";
hash = "sha256-q5OoMguG/f0A3c6X+zotafc3kRRuebxMBPUIlrlcNFI=";
hash = "sha256-9FcGnZ/yktKM8sTGpgTv3QLIe2IoGbSw10rLWgj1zSU=";
};
patches = [
@@ -106,7 +107,7 @@ buildPythonPackage (finalAttrs: {
inherit (finalAttrs) version src;
inherit pnpm;
fetcherVersion = 4;
hash = "sha256-xCxr/jnp9emeB6THGt4cumvApw6fSZQwG2NGOcvR0yQ=";
hash = "sha256-TX4sLAfka/j002OsUKqxqi5B6Fb+DXSGdeL+w6V9XuM=";
};
env = {
@@ -157,6 +158,7 @@ buildPythonPackage (finalAttrs: {
typer
typing-extensions
uvicorn
urllib3
]
++ lib.optionals (pythonAtLeast "3.13") [
audioop-lts
@@ -196,6 +198,10 @@ buildPythonPackage (finalAttrs: {
++ finalAttrs.passthru.optional-dependencies.oauth
++ pydantic.optional-dependencies.email;
pythonRelaxDeps = [
"tomlkit" # pre-emptive upper bound
];
preBuild = ''
pnpm build
pnpm package
@@ -440,6 +446,7 @@ buildPythonPackage (finalAttrs: {
'';
pythonImportsCheck = null;
dontCheckRuntimeDeps = true;
dontCheckPythonMetadata = true; # broken due to changed pname
});
# We can't use gitUpdater, because we need to update the pnpm hash.

View File

@@ -28,6 +28,10 @@
# gradio
gradio,
requests,
# oauth
authlib,
fastapi,
itsdangerous,
# mcp
mcp,
@@ -37,14 +41,14 @@
buildPythonPackage (finalAttrs: {
pname = "huggingface-hub";
version = "1.10.2";
version = "1.16.0";
pyproject = true;
src = fetchFromGitHub {
owner = "huggingface";
repo = "huggingface_hub";
tag = "v${finalAttrs.version}";
hash = "sha256-Q9N0QnxV8oJcxUsJzv4wX8Z6FkNdEfUH5BEVoZolsRY=";
hash = "sha256-GuTsoz7ow3A/PJyU3L/xLp56r3RVx5O1YH3nr3T4u7U=";
};
build-system = [ setuptools ];
@@ -65,11 +69,6 @@ buildPythonPackage (finalAttrs: {
all = [
];
torch = [
torch
safetensors
]
++ safetensors.optional-dependencies.torch;
fastai = [
toml
fastai
@@ -85,6 +84,17 @@ buildPythonPackage (finalAttrs: {
mcp = [
mcp
];
oauth = [
authlib
fastapi
httpx
itsdangerous
];
torch = [
torch
safetensors
]
++ safetensors.optional-dependencies.torch;
};
nativeCheckInputs = [

View File

@@ -23,8 +23,8 @@ let
[ ];
in
buildNodejs {
version = "26.5.1";
sha256 = "df7770a9a99346f8b73ba6d31ad89bd6f868b51c7387c3627dcb44ca065f4948";
version = "26.6.0";
sha256 = "ecb6eec812505c9292529087a2436ec6c891ffe0e3a897833416e5d7436d659f";
patches =
(lib.optional (!(stdenv.hostPlatform.emulatorAvailable buildPackages)) (fetchpatch2 {
url = "https://raw.githubusercontent.com/buildroot/buildroot/2f0c31bffdb59fb224387e35134a6d5e09a81d57/package/nodejs/nodejs-src/0003-include-obj-name-in-shared-intermediate.patch";

View File

@@ -1,7 +1,7 @@
{
"testing": {
"version": "7.2-rc5",
"hash": "sha256:05vi7q57qj4nybk3m38araknj6yxaaqjdd0cnw07c07qrjcd2lm7",
"version": "7.2-rc6",
"hash": "sha256:03q060s94c8p55p29npm62f7rcp9pc0hacq60w4spgwp26j8w2sm",
"lts": false
},
"6.1": {
@@ -20,23 +20,23 @@
"lts": true
},
"6.6": {
"version": "6.6.147",
"hash": "sha256:1fsavd2armiwrnz0w556dmm54z76zwy2as0qbbaq6s04xsvjjqz7",
"version": "6.6.148",
"hash": "sha256:0ppp203swylf9ixrgdsbw3gq6xdrxwxdrkqi6x4irsv0ax5rjx5n",
"lts": true
},
"6.12": {
"version": "6.12.100",
"hash": "sha256:147fvkpsa9n5gv207xyb6if0vmahmvpvrb2bfy32wj866i9p7yb7",
"version": "6.12.101",
"hash": "sha256:0xlaq8gz9v7ya2w38r2hps58rp7xqf6bp7bw3cazfj9zjc8ws88d",
"lts": true
},
"6.18": {
"version": "6.18.41",
"hash": "sha256:1skk2aimvhhymsvs15p83v2mwnlwbmghh82x79isia6lz3q75z0p",
"version": "6.18.42",
"hash": "sha256:1rv3xn5hw8w5y8wdgy2zx78n22n1qhihrd22dbjnfi5lixgfza1m",
"lts": true
},
"7.1": {
"version": "7.1.5",
"hash": "sha256:1rs162gcf6hsafrrmp3y8k9myn20s3s62xdp4zf39pxw7imik812",
"version": "7.1.6",
"hash": "sha256:1hamv3kp3iz2mlyv72sv1rcnfwjqhfvnzza89fwn4iljilcdfpcr",
"lts": false
}
}

View File

@@ -15,14 +15,14 @@ let
variants = {
# ./update-xanmod.sh lts
lts = {
version = "6.18.41";
hash = "sha256-nGDN+qkTNaUVgV+aFOvEtwkDaK7uqpjvXgENpkviDFg=";
version = "6.18.42";
hash = "sha256-yDtXLGdFM4rg8mtxUJbUvCvjs2dvFiSGuCV7seKlWqM=";
isLTS = true;
};
# ./update-xanmod.sh main
main = {
version = "7.1.5";
hash = "sha256-zELqn/UieXjOBkTNTLi2OCkK4+rpD/IfJEDb7GTTJfk=";
version = "7.1.6";
hash = "sha256-H+dNmTMCWfJm792HR6lz1wVUD70pyZpn5HlTUXwsnLI=";
};
};

View File

@@ -18,7 +18,7 @@ in
buildLinux (
args
// rec {
version = "7.1.4";
version = "7.1.5";
pname = "linux-zen";
modDirVersion = lib.versions.pad 3 "${version}-${suffix}";
isZen = true;
@@ -27,7 +27,7 @@ buildLinux (
owner = "zen-kernel";
repo = "zen-kernel";
rev = "v${version}-${suffix}";
sha256 = "1k27xhzd390krk60kay6cabl0jlpb26m6cwvdh3r8izbwgx1r0ig";
sha256 = "11d3c2hx2py6fy6qj0dqk2w392m144wjrfg5ldfh93x9mp4ffhjd";
};
# This is based on the following source:

View File

@@ -4179,6 +4179,8 @@ with pkgs;
bolt_22 = llvmPackages_22.bolt;
flang_22 = llvmPackages_22.flang;
llvmPackages_23 = llvmPackagesSet."23";
mkLLVMPackages = llvmPackagesSet.mkPackage;
})
llvmPackages_18
@@ -4213,6 +4215,7 @@ with pkgs;
llvm_22
bolt_22
flang_22
llvmPackages_23
mkLLVMPackages
;