Commit graph

248 commits

Author SHA1 Message Date
Claude
a3d697b45e
ax(mining): replace prose getter comments with usage examples in container.go
Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:48:45 +01:00
Claude
873ccaee7b
ax(node): replace prose ValidateResponse comment with usage example
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:47:37 +01:00
Claude
ba198731c2
ax(mining): replace banned fmt import with ErrUnsupportedMiner in miner_factory
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
fmt is a banned import (AX §banned-imports). miner_factory.go used
fmt.Errorf for the unsupported-miner error path; the package already
provides ErrUnsupportedMiner() in errors.go, so use that instead and
drop the fmt import entirely.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:47:18 +01:00
Claude
05a267e051
ax(node): replace prose comment with usage example on SelectOptimalPeer
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:46:36 +01:00
Claude
59d8ad388e
ax(ueps): rename mac to messageAuthCode (AX principle 1)
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:46:09 +01:00
Claude
1ebe43fd55
ax(mining): replace prose comments with usage examples in metrics.go
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
All 12 exported functions in metrics.go had comments that restated their
signatures in prose (e.g. "records a miner start event") instead of
showing concrete call examples. Replaced with AX-compliant usage examples
per RFC-025 principle 2 (Comments as Usage Examples).

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:45:40 +01:00
Claude
725960d915
ax(node): rename respCh to responseChannel in sendRequest
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
AX Principle 1 — predictable names over short names.
`respCh` is an abbreviated compound; `responseChannel` is
unambiguous without context.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:45:03 +01:00
Claude
c2ff1bd08e
ax(mining): rename cl→client and c→client in ratelimiter.go
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
AX principle 1: predictable names over short names.
cl abbreviates rateLimitClient; rename to client throughout Middleware
and cleanup for semantic clarity.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:42:57 +01:00
Claude
a4c4d64a98
ax(node): replace prose comment with usage example on safeKeyPrefix
AX Principle 2: comments show HOW with real values, not WHAT the signature says.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:42:21 +01:00
Claude
c85217dfca
ax(node): rename rtt to roundTripTime in PingPeer
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
AX Principle #1: names must not require a comment to explain.
The comment "Calculate round-trip time" existed solely to decode
the abbreviation rtt — proof the name was too short.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:41:15 +01:00
Claude
93ca88e2e3
ax(ueps): rename w→writer in writeTLV parameter
Single-letter w is not in the AX exception list (only i, _, t, c are
permitted). Replace with the full predictable name writer per AX principle 1.

Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 07:40:53 +01:00
Claude
1e814bdc80
ax(mining): replace prose comments with usage examples in miner_factory.go
All public function comments restated the signature (AX-2 violation).
Replace each with a concrete call example showing real values.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:40:51 +01:00
Claude
9ca9c93b9b
ax(ueps): replace prose comment with usage example on writeTLV (AX principle 2)
Some checks failed
Security Scan / security (push) Successful in 34s
Test / test (push) Has been cancelled
Co-Authored-By: Virgil <virgil@lethean.io>
2026-04-02 07:38:07 +01:00
Claude
cb27f33e57
ax(mining): replace prose method comments with usage example in errors.go
Seven MiningError method comments restated the function signature verbatim
(AX principle 2 violation). Deleted all seven and replaced NewMiningError's
comment with a concrete call-site example per the RFC rule: if a comment
restates what the type signature already says, delete it.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:38:00 +01:00
Claude
88e6910e3a
ax(node): replace prose comments with usage examples on SetMinerManager and SetProfileManager
Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:37:54 +01:00
Claude
5a6da79311
ax(mining): rename minerCfg loop variable to autostartEntry
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
`minerCfg` is an abbreviated name for `MinerAutostartConfig` loop
variables. Renamed to `autostartEntry` across three range loops in
manager.go for AX Principle 1 compliance (predictable names over
short names).

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:35:52 +01:00
Claude
44811e84fd
ax(node): rename geoWeight to geographicWeight for AX principle 1
geo is an abbreviation that requires domain knowledge to parse;
geographicWeight makes the dimension self-describing.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:35:37 +01:00
Claude
857c5f0ae3
ax(node): rename idx to separatorIndex in parseComment
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
AX Principle 1 — predictable names over short names. idx is an
abbreviation requiring a mental mapping; separatorIndex names the
variable by its role (the index of the = separator character).

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:33:01 +01:00
Claude
38b22f96a0
ax(ueps): rename tsBuf to threatScoreBytes (AX principle 1)
Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:32:57 +01:00
Claude
23d2f91570
ax(mining): rename cfg→configuration in SaveMinersConfig and UpdateMinersConfig
AX Principle 1 — predictable names over short names. `cfg` requires
mental mapping to understand; `configuration` is self-describing.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:32:51 +01:00
Claude
9949942ff5
ax(ueps): replace ParsedPacket field-list comment with usage example
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:31:38 +01:00
Claude
7cb8487475
ax(node): rename loop variable v to supported in IsProtocolVersionSupported
Single-letter v is not AX-exempt — only i (index) is allowed in range loops.
The element variable names the thing being iterated, so: supported.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:31:27 +01:00
Claude
ed5ef7dda3
ax(mining): rename cfg→configuration in LoadMinersConfig
AX principle 1: predictable names over short names.
`cfg` requires mapping overhead; `configuration` is unambiguous.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:31:20 +01:00
Claude
c13f2ac715
ax(ueps): replace prose struct comment on UEPSHeader with usage example
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
UEPSHeader's type-level comment restated the name in prose; replaced with
a concrete struct-literal example (AX principle 2). Field inline comments
updated from vague labels to descriptive value-context notes.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:29:30 +01:00
Claude
7ee91842d7
ax(node): rename loop variable a to alias in DiscoverPools and DiscoverGateways
AX Principle 1 — predictable names over short names. The single-letter `a`
requires context to understand; `alias` is self-describing at every read site.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:29:22 +01:00
Claude
c0eba4f12a
ax(mining): rename dbCfg to databaseConfiguration
AX Principle 1: predictable names over short names.
`dbCfg` abbreviates both the `db` prefix and `Cfg` suffix — both banned
by the AX naming rules. `databaseConfiguration` is unambiguous.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:29:12 +01:00
Claude
49ac6d455a
ax(ueps): replace prose comments with usage examples (AX principle 2)
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
NewBuilder, MarshalAndSign, ReadAndVerify, PacketBuilder, and ParsedPacket
comments now show concrete call-site examples with real values instead of
restating what the type signatures already convey.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:27:25 +01:00
Claude
273169264e
ax(mining): rename db-prefixed fields to full databaseEnabled/databaseRetention
AX Principle 1 — predictable names over short names. The Manager struct
fields dbEnabled and dbRetention used the db abbreviation which requires
context to decode. Renamed to databaseEnabled and databaseRetention across
manager.go and the single service.go callsite. No behaviour change.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:26:59 +01:00
Claude
e707710e9d
ax(node): replace NewWorker prose comment with usage example
Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:26:50 +01:00
Claude
b41c63b10f
ax(ueps): rename TagCurrentLay/TagTargetLay to TagCurrentLayer/TagTargetLayer
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
Abbreviated constant names violated AX Principle 1 (Predictable Names Over
Short Names). The struct fields already used CurrentLayer/TargetLayer — the
constants now match, eliminating the inconsistency.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:26:00 +01:00
Claude
b93b19fac7
ax(node): replace prose comment on NewController with usage example
AX principle 2: comments show HOW with real values, not WHAT the
signature already says.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:25:42 +01:00
Claude
7c6645fbeb
feat(node): add Lethean chain discovery for mining fleet
Some checks are pending
Security Scan / security (push) Waiting to run
Test / test (push) Waiting to run
Chain integration for P2P mining nodes:
- GetChainInfo — query daemon for height, aliases, sync status
- DiscoverPools — find pool aliases from chain (cap=pool)
- DiscoverGateways — find gateway nodes from chain
- parseComment — v=lthn1 comment parser

Constants: testnet/mainnet daemon URLs and pool endpoints.
4/4 tests passing.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:24:28 +01:00
Claude
67698256fd
feat(mining): add Lethean pool presets + ProgPoWZ profiles
Some checks failed
Security Scan / security (push) Successful in 35s
Test / test (push) Has been cancelled
Lethean-specific mining configurations:
- LetheanTestnetConfig — pool.lthn.io:5555, ProgPoWZ, 50% CPU
- LetheanMainnetConfig — pool.lthn.io:3333, ProgPoWZ, 75% CPU
- LetheanSoloConfig — direct daemon RPC (46941/36941), 100% CPU
- LetheanDefaultProfile — ready-to-use MiningProfile with RawConfig
- LetheanDualMiningProfile — GPU:ProgPoWZ(LTHN) + CPU:RandomX(XMR)

All configs: zero donate level (XMRig telemetry stripped), keepalive on.
5/5 tests passing.

Co-Authored-By: Charon <charon@lethean.io>
2026-04-02 07:22:48 +01:00
Claude
a88ef95884
ci: add Forgejo Actions test and security scan workflows
Some checks failed
Security Scan / security (push) Successful in 39s
Test / test (push) Failing after 51s
Uses reusable workflows from core/go-devops for Go testing
(with race detector and coverage) and security scanning
(govulncheck, gitleaks, trivy).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-23 03:28:14 +00:00
Claude
05279de74b
chore: refresh go.sum after upstream tag updates
Some checks failed
Release / Test (push) Failing after 2s
Tests / Go Tests (push) Failing after 38s
E2E Tests / E2E Tests (push) Failing after 56s
Tests / C++ Tests (push) Failing after 18s
Release / Release (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 23:36:25 +00:00
Claude
a982e72d34
chore: sync workspace dependency versions
Some checks failed
Release / Test (push) Failing after 2s
Tests / Go Tests (push) Failing after 38s
E2E Tests / E2E Tests (push) Failing after 53s
Tests / C++ Tests (push) Failing after 15s
Release / Release (push) Has been cancelled
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 22:04:45 +00:00
Claude
140f038f37
chore: migrate module path from github.com to forge.lthn.ai
Some checks failed
E2E Tests / E2E Tests (push) Failing after 1m23s
Tests / Go Tests (push) Failing after 39s
Desktop Release / Build linux (push) Failing after 46s
Release / Test (push) Failing after 2s
Tests / C++ Tests (push) Failing after 1m12s
Release / Release (push) Has been cancelled
Desktop Release / Build darwin (push) Has been cancelled
Desktop Release / Build windows (push) Has been cancelled
Desktop Release / Create Release (push) Has been cancelled
Move module declaration and all internal imports from
github.com/Snider/Mining to forge.lthn.ai/Snider/Mining. Also updates
Borg, Enchantrix, and Poindexter dependency paths to forge.lthn.ai.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-22 21:39:01 +00:00
Snider
d651a8dfb4
Merge pull request #68 from Snider/copilot/combine-39-prs-into-one
Consolidate 39 PRs into single squash-ready update
2026-02-02 06:40:05 +00:00
copilot-swe-agent[bot]
3aea1d7d1a Fix test failures and unused imports after combining PRs
Co-authored-by: Snider <631881+Snider@users.noreply.github.com>
2026-02-02 06:12:37 +00:00
Snider
75a9ba9ef4 Fix C++ tests build and verify peer ping implementation
Fixed C++ build failures in `miner/core/tests/CMakeLists.txt`:
- Applied `-mavx2 -mvaes` compilation flags to `CryptoNight_x86_vaes.cpp` in the test library target, mirroring the main build configuration. This resolves the `target specific option mismatch` error during compilation.
- Applied optimization flags to `CnHash.cpp` in the test library target.

Verified Go implementation:
- Confirmed `PingPeer` is implemented in `pkg/node/controller.go`.
- Confirmed `handlePing` is implemented in `pkg/node/worker.go`.
- Confirmed `go.mod` includes necessary dependencies.

Recorded learnings regarding CMake property propagation across directories.
2026-02-02 06:07:05 +00:00
dependabot[bot]
b4f9e2439d chore(deps): Bump on-headers and compression in /miner/workers
Bumps [on-headers](https://github.com/jshttp/on-headers) and [compression](https://github.com/expressjs/compression). These dependencies needed to be updated together.

Updates `on-headers` from 1.0.2 to 1.1.0
- [Release notes](https://github.com/jshttp/on-headers/releases)
- [Changelog](https://github.com/jshttp/on-headers/blob/master/HISTORY.md)
- [Commits](https://github.com/jshttp/on-headers/compare/v1.0.2...v1.1.0)

Updates `compression` from 1.7.4 to 1.8.1
- [Release notes](https://github.com/expressjs/compression/releases)
- [Changelog](https://github.com/expressjs/compression/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/compression/compare/1.7.4...v1.8.1)

---
updated-dependencies:
- dependency-name: on-headers
  dependency-version: 1.1.0
  dependency-type: indirect
- dependency-name: compression
  dependency-version: 1.8.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 06:07:05 +00:00
dependabot[bot]
6cc7caa17d chore(deps): Bump qs and express in /miner/workers
Bumps [qs](https://github.com/ljharb/qs) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `qs` from 6.7.0 to 6.14.1
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.7.0...v6.14.1)

Updates `express` from 4.17.1 to 4.22.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.1...v4.22.1)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.1
  dependency-type: indirect
- dependency-name: express
  dependency-version: 4.22.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 06:07:05 +00:00
google-labs-jules[bot]
1f464a62f1 Implement STIM bundle decryption and installation
- Updated `Worker.handleDeploy` to handle STIM bundles using `ExtractProfileBundle` and `ExtractMinerBundle`.
- Used `PeerConnection.SharedSecret` as the password for decryption.
- Implemented logic for `BundleProfile`, `BundleMiner`, and `BundleFull`.
- Fixed broken files `pkg/node/dispatcher.go` and `pkg/node/peer.go` to ensure compilation and testing.
- Updated tests in `pkg/node/worker_test.go` and added coverage for deployment logic.
2026-02-02 06:07:05 +00:00
dependabot[bot]
8e1405e2a4 Bump @modelcontextprotocol/sdk and @angular/cli in /ui
Bumps [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) to 1.24.0 and updates ancestor dependency [@angular/cli](https://github.com/angular/angular-cli). These dependencies need to be updated together.


Updates `@modelcontextprotocol/sdk` from 1.17.3 to 1.24.0
- [Release notes](https://github.com/modelcontextprotocol/typescript-sdk/releases)
- [Commits](https://github.com/modelcontextprotocol/typescript-sdk/compare/1.17.3...1.24.0)

Updates `@angular/cli` from 20.3.9 to 20.3.13
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/20.3.9...20.3.13)

---
updated-dependencies:
- dependency-name: "@modelcontextprotocol/sdk"
  dependency-version: 1.24.0
  dependency-type: indirect
- dependency-name: "@angular/cli"
  dependency-version: 20.3.13
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 06:07:05 +00:00
dependabot[bot]
0a4480d951 chore(deps): Bump qs, body-parser and express in /ui
Bumps [qs](https://github.com/ljharb/qs), [body-parser](https://github.com/expressjs/body-parser) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `qs` from 6.14.0 to 6.14.1
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.14.0...v6.14.1)

Updates `body-parser` from 1.20.3 to 1.20.4
- [Release notes](https://github.com/expressjs/body-parser/releases)
- [Changelog](https://github.com/expressjs/body-parser/blob/master/HISTORY.md)
- [Commits](https://github.com/expressjs/body-parser/compare/1.20.3...1.20.4)

Updates `express` from 4.21.2 to 4.22.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.21.2...v4.22.1)

---
updated-dependencies:
- dependency-name: qs
  dependency-version: 6.14.1
  dependency-type: indirect
- dependency-name: body-parser
  dependency-version: 1.20.4
  dependency-type: indirect
- dependency-name: express
  dependency-version: 4.22.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 06:07:05 +00:00
google-labs-jules[bot]
2621e89c68 feat(ui): pass profileId in navigation
- Updated `navigateToProfiles` in `MainLayoutComponent` to pass `profileId` as a query parameter.
- Updated `ProfilesComponent` to read the `id` query parameter and set `editingProfileId` accordingly.
2026-02-02 06:07:05 +00:00
dependabot[bot]
99e18ee24c chore(deps-dev): Bump base-x from 3.0.8 to 3.0.11 in /miner/workers
Bumps [base-x](https://github.com/cryptocoinjs/base-x) from 3.0.8 to 3.0.11.
- [Commits](https://github.com/cryptocoinjs/base-x/compare/v3.0.8...v3.0.11)

---
updated-dependencies:
- dependency-name: base-x
  dependency-version: 3.0.11
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 06:07:05 +00:00
dependabot[bot]
51ff365815 build(deps): Bump @modelcontextprotocol/sdk and @angular/cli
Bumps [@modelcontextprotocol/sdk](https://github.com/modelcontextprotocol/typescript-sdk) to 1.24.0 and updates ancestor dependency [@angular/cli](https://github.com/angular/angular-cli). These dependencies need to be updated together.


Updates `@modelcontextprotocol/sdk` from 1.17.3 to 1.24.0
- [Release notes](https://github.com/modelcontextprotocol/typescript-sdk/releases)
- [Commits](https://github.com/modelcontextprotocol/typescript-sdk/compare/1.17.3...1.24.0)

Updates `@angular/cli` from 20.3.8 to 20.3.13
- [Release notes](https://github.com/angular/angular-cli/releases)
- [Changelog](https://github.com/angular/angular-cli/blob/main/CHANGELOG.md)
- [Commits](https://github.com/angular/angular-cli/compare/20.3.8...20.3.13)

---
updated-dependencies:
- dependency-name: "@modelcontextprotocol/sdk"
  dependency-version: 1.24.0
  dependency-type: indirect
- dependency-name: "@angular/cli"
  dependency-version: 20.3.13
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 06:07:04 +00:00
dependabot[bot]
2ee0e7d342 chore(deps): Bump node-forge and webpack-dev-server in /miner/workers
Bumps [node-forge](https://github.com/digitalbazaar/forge) to 1.3.3 and updates ancestor dependency [webpack-dev-server](https://github.com/webpack/webpack-dev-server). These dependencies need to be updated together.


Updates `node-forge` from 0.10.0 to 1.3.3
- [Changelog](https://github.com/digitalbazaar/forge/blob/main/CHANGELOG.md)
- [Commits](https://github.com/digitalbazaar/forge/compare/0.10.0...v1.3.3)

Updates `webpack-dev-server` from 3.11.2 to 5.2.2
- [Release notes](https://github.com/webpack/webpack-dev-server/releases)
- [Changelog](https://github.com/webpack/webpack-dev-server/blob/main/CHANGELOG.md)
- [Commits](https://github.com/webpack/webpack-dev-server/compare/v3.11.2...v5.2.2)

---
updated-dependencies:
- dependency-name: node-forge
  dependency-version: 1.3.3
  dependency-type: indirect
- dependency-name: webpack-dev-server
  dependency-version: 5.2.2
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 06:07:04 +00:00
dependabot[bot]
9cf90c4b36 chore(deps): Bump send and express in /miner/workers
Bumps [send](https://github.com/pillarjs/send) and [express](https://github.com/expressjs/express). These dependencies needed to be updated together.

Updates `send` from 0.17.1 to 0.19.2
- [Release notes](https://github.com/pillarjs/send/releases)
- [Changelog](https://github.com/pillarjs/send/blob/master/HISTORY.md)
- [Commits](https://github.com/pillarjs/send/compare/0.17.1...0.19.2)

Updates `express` from 4.17.1 to 4.22.1
- [Release notes](https://github.com/expressjs/express/releases)
- [Changelog](https://github.com/expressjs/express/blob/v4.22.1/History.md)
- [Commits](https://github.com/expressjs/express/compare/4.17.1...v4.22.1)

---
updated-dependencies:
- dependency-name: send
  dependency-version: 0.19.2
  dependency-type: indirect
- dependency-name: express
  dependency-version: 4.22.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2026-02-02 06:07:04 +00:00