Skip to content

chore(deps): update all non-major dependencies - #37

Merged
dawsontoth merged 3 commits into
mainfrom
renovate/all-minor-patch
Aug 13, 2026
Merged

chore(deps): update all non-major dependencies#37
dawsontoth merged 3 commits into
mainfrom
renovate/all-minor-patch

Conversation

@renovate

@renovate renovate Bot commented Aug 10, 2026

Copy link
Copy Markdown
Contributor

ℹ️ Note

This PR body was truncated due to platform limits.

This PR contains the following updates:

Package Change Age Confidence Type Update
conventional-commits-parser (source) 7.1.17.1.2 age confidence devDependencies patch
harper (source) 5.1.265.2.1 age confidence devDependencies minor
node (source) 24.18.124.19.0 age confidence minor
semantic-release 25.0.825.0.9 age confidence devDependencies patch
vite (source) 8.2.08.2.1 age confidence devDependencies patch

Release Notes

conventional-changelog/conventional-changelog (conventional-commits-parser)

v7.1.2

Compare Source

Bug Fixes
harperfast/harper (harper)

v5.2.1

Compare Source

Data integrity

Blob-column decode corruption on read-modify-write, fixed at the root cause (#​2119). In 5.2.0, a REST PATCH that read a record and wrote it back unchanged — carrying along a Blob column — could corrupt that blob on disk, producing Error decoding record: Data read, but end of buffer not reached on the next read. The inline-blob decode path kept a second reference to the payload (storageBuffer) that pointed directly into the store's reusable read buffer instead of a stable copy; re-encoding a cached/fetched blob could serialize whatever bytes a later, unrelated read had since recycled into that buffer. 5.2.0's new primary-store record cache made this reachable for the first time — the underlying pattern was latent since October 2025 but only 5.1.x's uncached read path avoided it. The fix drops the unstable reference entirely and always re-encodes from the already-copied, stable buffer, with no added read-path cost. Deterministic repro and fix are covered by a new 3-case test matrix (recordCacheStableBuffer.test.js). This supersedes the narrower #​2103 mitigation (which forced fresh allocations on every primary read to mask the symptom).

Reliability

  • Transaction context lifecycle — a cluster of fixes ensures a transaction's context back-reference is released only on genuine completion (not on a timeout-poisoned or still-pending transaction), a terminal commit failure still releases it, and a replay forced by open iterators now abandons the retained handle's write intents (with a one-time warning) instead of silently reapplying them.
  • Broken-pipe crash on log writeuncaughtException handling for EPIPE could re-enter itself in a self-feeding loop when stdout/stderr closed under load. Broken-pipe writes are now caught at the source on both sync and async paths, and disableStdio() no longer tears down the log-file tee.
  • dropTable() safety — now drains in-flight cache-write commits and re-checks live drop state immediately before dropping column families, closing a window for a concurrent write to land mid-drop, and fails closed (instead of proceeding) if the drain times out.
  • Table-scoped transaction-log purgedelete_transaction_logs_before scoped to a single table was purging the entire database's log on RocksDB; it's now rejected outright on RocksDB rather than silently over-purging.
  • Open-transaction idle limit — reads no longer extend the limit while a transaction has uncommitted writes pending; writes correctly re-arm it.

Security

  • Closed bypass_auth trust gaps in MCP token handling and SQL AST checks; request bodies can no longer influence operations authorization.
  • User/role changes that would remove the last active super_user are now rejected, preventing accidental lockout.

Storage

  • RocksDB compression codec selection — deployments can now choose a compression codec via storage.compression, applied consistently per column family; upgraded databases correctly retain their existing column families' codec instead of silently adopting a new default. Includes a compression benchmark.
  • rocksdb-js updated 2.6.1 → 2.7.1 across several bumps.

Deploy & redeploy

Hardened native-addon and app redeploy handling: transactional redeploy preparation, serialized watcher replacement, preserved entry events across deploy scans, and closed several deploy-owner reclaim races so exiting workers no longer strand deploy state.

CLI & platform

  • Added -h/--help flags with a width-responsive help screen.
  • New OpenAI-compatible /v1/* gateway, exposed as built-in Resources (Phase 4 of the models initiative — #​1616).
  • CONFIRM_DOWNGRADE now resolves deterministically (and logs the refusal) when no TTY is available to answer the prompt, instead of hanging (#​2059).
  • Bun module resolution now falls back correctly for bare-specifier packages and resolves ESM exports.
  • UDS mirror cleanup is now ownership-aware instead of path-based, closing several stale-file cleanup gaps.

Also in this release

Docker shrinkwrap/pin-canary hardening, storage-quota path/metric fixes, outstanding-write-commit tracking for stuck-commit diagnostics, and routine CI/test/dependency maintenance (Node 26 canary hardening, RocksDB conflict-retry test fix, misc chore(deps) bumps).

Full Changelog: HarperFast/harper@v5.2.0...v5.2.1

v5.2.0

Compare Source

Harper 5.2.0 is the first stable release of the 5.2 line. These notes cover everything on the 5.2 line since it branched from 5.1 — roughly 210 merged PRs across two months — not just the changes since the last beta. Fixes that were also cherry-picked onto the 5.1 patch train (5.1.16 through 5.1.26) are included here as well, since they are part of 5.2.0.

Headline work: a new SQL engine built on the Resource API is now the default, secrets get a first-class store and end-to-end custody, row-level read authorization is unified, RocksDB databases gain managed backup/restore, and a large cluster of transaction and storage correctness fixes closes several write-loss paths.

Upgrade notes

  • The SQL engine default changed from legacy to auto (#​1285). Queries are now planned by the new Resource-API engine, with automatic fallback to the legacy AlaSQL path for shapes it does not support. Set sql.engine: legacy to restore the previous behavior, or new to disable fallback and surface unsupported shapes as errors.
  • Operation-scoped authorization is evaluated once per operation again (#​1915, #​1842). 5.2 alphas briefly evaluated allowRead/write hooks per record; that is reverted to the pre-5.2 contract. Applications that want row-level narrowing should use the new explicit rowFilter(record, context) and eventFilter(event, context) predicates.
  • @expiresAt now takes precedence over the table-level expiration default (#​1812). Tables that set both will see per-record expiration win.
  • threads.count defaults to 1 on macOS and Windows (#​1605). Neither platform has working SO_REUSEPORT, so additional HTTP workers could never share the server ports. An explicit threads.count still overrides.
  • TCP keep-alive delay is now 10 minutes. Socket noDelay/keepAlive options were never actually applied to TCP or UDS listeners, and the keep-alive delay was 600 ms rather than the intended 10 minutes (#​1859).
  • Safe mode disables worker preload modules (#​1848).
  • uWebSockets.js is opt-in for npm consumers (#​1919). It remains bundled in the official Docker images.
  • If you ran storage.migrateOnStart on any 5.2 alpha or beta, migrated records were written without their version metadata — see "LMDB to RocksDB migration" below for the verification step.
  • First boot applies a data migration; rolling back to 5.1.x requires CONFIRM_DOWNGRADE=yes (#​2046). Starting 5.2.0 against an existing store creates system.hdb_secret and records the data version as 5.2.0. The migration is additive and 5.1.x can still run the store, but a 5.1.x binary asks for confirmation before starting against data marked newer — and with no interactive terminal (systemd, containers, CI) that prompt currently blocks with nothing in the log. To downgrade, set CONFIRM_DOWNGRADE=yes in the environment (or pass --CONFIRM_DOWNGRADE yes); take a backup first.

SQL engine on the Resource API

  • A new SQL engine, built on the Resource API, is now the default (#​1285). It plans against Harper's own indexes and resources instead of the legacy AlaSQL path, and sql.engine: auto falls back to legacy automatically for query shapes it does not support. Notable behaviors: a two-sided primary-key range is fused into a single bounded seek; ORDER BY <primary key> with no WHERE is served from index order rather than a full ordered scan; UPDATE col = col ± N is applied as an atomic addition; null-valued conditions are served only on indexNulls indexes; unindexed WHERE conjuncts are residualized rather than pushed; NOT IN uses correct three-valued logic. DISTINCT aggregates and UPDATE SET on the primary key fall back to legacy.
  • Sorting on the primary key is served from primary-store order instead of a separate sort pass (#​1844).
  • Query planning no longer mutates the caller's conditions (#​1911), so a reused condition object is not corrupted by planning.
  • Schema-unqualified SQL is authorized against the table the engine actually resolves (#​1961) — see Security below.
  • An A/B benchmark comparing the new engine against legacy is now in the repo (#​1845).

Security

  • Schema-unqualified SQL bypassed table permission checks (#​1961). The authorization layer derived the affected schema/table set from the AST's databaseid; when a statement omitted the schema qualifier that field was empty, nothing was recorded in the affected-attribute map, and hasPermissions iterating an empty map authorized by vacuous truth — while the engine's binder resolved the same bare name to a concrete database and executed against it. Authorization now runs against the table the engine resolves, per table reference rather than once per statement. The same series records GROUP BY/HAVING columns, reports derived JOIN sources that carry no join.table, and refuses UNION/EXCEPT/INTERSECT/PIVOT/UNPIVOT outright rather than letting them pass unchecked.
  • allow* hooks now fail closed when they throw or reject (#​1489). A hook that threw was previously treated as a pass.
  • ReDoS in config validation (#​1784). A crafted directory path could pin the CLI at 100% CPU; the path allow-list regex is replaced with a control-character denylist that also rejects C1 controls and Unicode line separators.
  • Raw Error objects are no longer logged from REST (#​1737), and logger arguments are auto-wrapped with a diagnostic property allowlist (#​1749) — both closed paths where secrets could reach hdb.log.
  • Structured-logging sanitization gaps closed (#​1994). Sanitization could invoke a live object's Proxy traps or getters, leak function/opaque-builtin properties, or throw inside its own fallback. inspectForLog/deepSanitizeErrors are now realm-safe, bounded in breadth and depth, and fail closed at the cap.
  • MCP verb-tool listings no longer leak to unauthorized sessions (#​1943).
  • Reserved role-permission names are rejected as database names, and cluster_user handling is completed (#​1913).
  • http.securityHeaders config added, and the authentication middleware is now named in the chain (#​1568).
  • PACKAGE_ROOT is canonicalized so it matches realpath'd allowedPath checks (#​1905), and npm pack --ignore-scripts is gated on install_allow_scripts alone (#​1819).
  • enableProxyProtocol header buffering has a stall-timeout guard (#​1947), so a peer that opens a connection and never completes the PROXY header cannot hold it open.

Secrets management

  • hdb_secret store with grant-scoped secret operations (#​1554). Secrets are stored in a dedicated table with a pure envelope codec, serialized row mutations, validator caps, and grant-set semantics; secret operations are kept off the MCP default-allow surface.
  • Component .env files are protected in the operations API (#​1527) and can be written via set_component_file, with an encrypted enc:v1 contract and a dormant decrypt hook (#​1528).
  • Two-tier component secret delivery with env declarations (#​1582), plus worker-spawn data providers and deferred env-secret decrypt replay so secrets reach worker threads correctly (#​1559).
  • Live secret-change subscriptions and a live scoped accessor (#​1787), with subscription teardown reference-counted by identity.
  • Config-shaping env vars arriving via component .env files are warned about loudly rather than silently ignored (#​1580).
  • SSH deploy keys are decrypted to a transient file only for the git operation (#​1795).
  • Registered operations can declare permissions for scoped delegation (#​1599).

Access control

  • Record-scoped allowRead: unified row-level read access control (#​1786, closing the second gap in #​1422). Enforcement is consistent across reads, GraphQL checkPermission, and subscription delivery. Prefix and multi-record scans keep the awaited entry check; per-record enforcement is sync-only.
  • Live subscriptions are continuously re-authorized and revoked on permission loss or token expiry (#​1535), with coverage extended to WebSocket, MQTT, and alter_role (#​1634).
  • Row-level allowRead is enforced on custom mcpResources reads (#​1839), which previously bypassed the check that equivalent REST reads applied.
  • Related-table allowRead binds to a proper resource instance (#​1532).
  • Explicit rowFilter/eventFilter predicates (#​1915) carry through filtered HNSW traversal, OR/range filtering, source-revalidated reads, subscription snapshots, replay, live events, and reload snapshots.
  • Audit records attribute registered-operation writes to the authenticated user (#​1592).
  • Token login in core — a validated JWT can be exchanged for an httpOnly hdb-session cookie (#​1546).

Managed RocksDB backups

  • RocksDB databases now have first-class server-managed backup and restore (#​1831). New operations — create_backup, list_backups, verify_backup, delete_backup, purge_backups, restore_backup, and RocksDB support for get_backup — give incremental, checksum-verified backups under storage.backupPath, one subdirectory per database, including file-backed blobs and the transaction log. Everything is also runnable from the CLI, including offline against a stopped server. Restores serialize against a per-database lock/marker and verify the database is fully closed process-wide before purging and rewriting, so a crash mid-restore recovers cleanly instead of corrupting data.

Typed resources and the application model

  • Typed, discoverable resources (RFC 0001) (#​1767): code-first defineTable plus a per-method request contract, with the six typed-resources exports wired into the component sandbox (#​1825).
  • Applications can be routed by host and urlPath from the root config (#​1964). Multiple applications can share a server while routing to distinct hosts or path prefixes. Mounts are enforced only at the routing boundary, fail closed on a wrong-typed config, and REST route registration is keyed on the resolved route rather than its raw parts.
  • Built-in scheduler component (#​1828, #​1875): config-declared cron and interval jobs that run once per cluster, with leader election, failover, and catch-up that backfills the most recent missed occurrence.
  • Relationship edge cases fixed (#​2006). Relationship property access always resolves synchronously; empty array-of-FK relationships return a fresh array instead of a shared one and skip an unneeded read-transaction acquisition; single-record sets normalize correctly and tolerate scalar stored ids; composite (array) related ids resolve on both sides.
  • @computed scalars surface on default reads, with a guard for cyclic @enumerable serialization (#​1601).
  • Bare collection POST restores the v4 super.post create behavior, normalized before authorization (#​1956).
  • Thrown Response objects and a status field are honored for custom-resource HTTP status (#​1501).
  • Non-object record roots are rejected and the scan freeze is guarded (#​1313).

Transactions and storage

The largest cluster of fixes in this release. Several were write-loss paths.

  • Repeat writes to the same key within one transaction now layer correctly (#​1970). A second write applied against the pre-transaction value rather than the earlier write in the same transaction, so the intermediate update was lost.
  • Writes staged while a read iterator defers the commit are no longer dropped (#​1860).
  • Over-time write transactions are aborted instead of force-committed (#​1411), and both engines poison the transaction.
  • ERR_TRY_AGAIN retries on the same transaction using a native in-place reset (#​1823); the earlier fix retried on a fresh transaction (#​1696).
  • Commit-retry exhaustion rejects the awaited request chain rather than resolving as if it had succeeded (#​1861).
  • An ambient transaction is joined only if it is genuinely still open (#​1720).
  • TTL eviction and delete no longer orphan secondary-index entries (#​1896), which could otherwise satisfy later index reads for records that no longer exist.
  • Table.clear() clears secondary-index DBIs as well as the primary store (#​1906).
  • The interrupted-drop retry is bounded to one actionable error and scoped to a per-drop generation, keyed by physical store rather than database alias (#​1957). A genuinely failed store drop is no longer reported as complete.
  • Audit cleanup has a real completion signal and a sane backoff, and a cleanup pass no longer escapes as an unhandled rejection (#​1963).
  • LMDB audit entries store the real prior version — the primary entry's own localTime rather than its origin version (#​1988).
  • Table deletes on audit: false tables thread the transaction into removeEntry (#​1869).
  • starts_with returns complete results for astral-plane Unicode values (#​1887).
  • Null hash values on delete are rejected, as are primary-key changes on populated tables (#​1837). Combined with the Resource-API delete guard, a null or undefined id can no longer wipe a table.
  • checkOverloaded() logs once when it first starts rejecting writes (#​2007), so a shedding node is visible in the log.
  • Clearer open-transaction timeout message (#​1967); honest Promise<number | void> type for the commit-latency recorder (#​1853, #​1899).

LMDB to RocksDB migration

  • Migrated records lost their version and record prototype (#​2014). Every record written by storage.migrateOnStart since #​1307 was stored without its [8-byte version][flags word] metadata prefix: copyDb grafts RecordEncoder's encode hook onto the migration target's plain msgpackr encoder, and the hook's if (!this.useVersions) opt-out read useVersions off that foreign encoder — undefined — so every migrated record took the non-versioned plain-encode path. Downstream, prefix-less records decode without the metadata wrapper, so PrimaryRocksDatabase.getEntry skipped the structPrototype repair and point reads returned prototype-less plain objects: relationship getters, toJSON and getUpdatedTime were all unreachable. Record versions were silently dropped, which also affects cache admission, ifVersion/CAS, and replication version comparison.

    The fix writes the prefix correctly, adds a read-side repair for already-migrated databases, stages the migration and renames it into place only after verification, and exports verifyMigratedDatabase(databasePath) so an existing installation can be checked. Verification sweeps every generation and exempts genuinely version-less records by key rather than by sniffing bytes. If you have run migrateOnStart on any 5.2 alpha or beta, run verifyMigratedDatabase before relying on versions; a no-op rewrite pass is required to restore versions on already-migrated records.

  • Legacy storage.compression metadata is tolerated when opening RocksDB databases (#​2037), mapping to a valid rocksdb-js compression option instead of erroring on open.

  • New built-in components are activated on in-place-upgraded configs (#​1814), and WAF is activated on upgraded instances (#​1910).

Performance

  • Record caching for primary RocksDB stores (#​410 and follow-ups): PrimaryRocksDatabase backs primary stores with a WeakLRUCache validated against the Verification Table, so a cache hit does not require a store read. Caching is opt-in per primary store, and the coordinated-retry loop is capped with options preserved across retries.
  • Predicate-aware HNSW traversal (#​1768): filtered vector search that participates in user functions and RBAC, rather than filtering after the fact.
  • HNSW survivors severed from the entry point by deletes are reconnected (#​1713), which previously left parts of the graph unreachable.
  • HTTP/2 support via a cleartext h2 UDS mirror (#​1707), dispatched by ALPN at the symphony L4 layer.
  • uWebSockets.js HTTP/WebSocket backend (#​1096), default-off, with a guard that refuses the uWS backend on pointer-compression Node builds unless rebuilt for that ABI (#​1765).
  • Write-transaction commit latency (#​1688) and write/read transaction queue depth (#​1689) are recorded in analytics.

HTTP, TLS and networking

  • WebSocket upgrades were silently dropped on per-worker UDS mirror listeners (#​2015). With tls.unixDomainSockets enabled, the per-worker UDS mirror is a separate http.Server that never received the 'upgrade' listener onWebSocket() attaches to the port-keyed server, so Node destroyed every WebSocket handshake on it with a zero-byte close — no response, no log. The same fix stops enableProxyProtocol()'s data interception from outliving the PROXY header decision, where it was forwarding post-upgrade frames to a freed HTTP parser the pool can reissue to another connection.
  • PROXY protocol v2 decodes forwarded mTLS client certificates on UDS mirrors (#​1858), and those TLS facts are exposed as request.connectionInfo (#​1985).
  • MQTT's raw-socket listener has its own TLS usage type (#​1999, #​2003) so it no longer shares certificate selection with the HTTP listeners, and the MQTT secure-port UDS metadata no longer publishes an empty certificate list — which made a fronting SNI proxy serve the node certificate on 8883 (#​2010).
  • TLS ciphers/SECLEVEL are honored from every configured source when building listeners (#​1841).
  • Periodic re-read safety net for the TLS certificate watcher (#​1394), including reload on change events that omit stats and a 1-second floor on the watch interval.
  • External port conflicts are surfaced on all platforms (#​1605); listenOnPorts() previously swallowed every EADDRINUSE, so an unrelated process squatting a Harper port silently received Harper's traffic.
  • The MQTT port is shared across workers except on macOS (#​1603), and the MQTT last-will persistence race is closed (#​1697).
  • The operations API fails soft on a domain socket bind failure and warns on path-length overflow instead of failing to start (#​1907).
  • SSE fixes: a finite generator streamed to completion no longer hangs or raises an uncaughtException (#​1632); a generator that throws mid-stream is handled (#​1789); writes are guarded against undefined event data (#​1863).
  • A POST without a trailing slash returns a clean 404 instead of crashing (#​1807), and URL attribute-suffix routing resolves correctly for programmatic static-properties Resources (#​1933).

Static serving and caching

  • Root-mounted static serving fixed (#​1584, #​1769): the static plugin served nothing when urlPath was configured, and urlPath: '/' matched only the exact path /.
  • Configurable cache headers for the static pluginmaxAge, immutable, cacheControl (#​1748) — and Cache-Control/Vary hardening with shared-cache defaults (#​1746).
  • after ordering for the static plugin, with a warning when fallthrough: false blocks REST (#​1574).
  • target.loadedFromSource is the sole cache-disposition signal (#​1626).
  • allowStaleWhileRevalidate is consulted for query-driven revalidation (#​1581).
  • Live cache records are no longer mutated in finalizeResponse (#​1709), which corrupted persisted headers.

MCP and AI

  • Per-client rate limiting and a durable operator quota hook for public MCP tools (#​1633), registered as a function rather than a config-referenced Resource (#​1821).
  • Component-author static mcpTools/mcpPrompts are registered at runtime (#​1526), parameterized custom resources surface as MCP tools (#​1602), and operations-profile tools are computed lazily so late-registered operations appear (#​1579).
  • A missing MCP-Protocol-Version header is accepted as the session's negotiated version (#​1694).
  • harper agent CLI (#​1553): a command-line client for the built-in agent, with harper chat as an alias, automatic refresh of expired agent tokens, and the --once approval hang fixed. The built-in agent itself is now runnable end to end (#​1549) and drains operations tools from the lazy provider (#​1847).
  • @embed/models.embed no longer forwards the logical model name as the provider wire model id (#​1596).
  • openaiStream() — an OpenAI-compatible SSE formatter (#​1106).

Logging, analytics and observability

  • read_log streams over SSE as a live tail (#​1693), with backpressure detection, bounded backlog reads, and resilient delta reads.
  • Rotated log file descriptors are closed immediately, and logging.rotation.retention is exposed (#​1687).
  • get_analytics is driven off the bounded time window rather than the metric index (#​1798).
  • Middleware chain order is observable via a debug log and get_status (#​1587).
  • threads.preload config preloads modules such as APM agents on worker threads (#​1569).

Deployment and components

  • Concurrent component installs no longer corrupt dependencies (#​1991). Lock reclamation is race-free, liveness checks are bounded, unconfirmed liveness can no longer renew the lock-wait deadline forever, and timed-out component preparation is handled explicitly.
  • Deploy no longer silently truncates the tarball on a dangling symlink (#​1718).
  • deploy_component registryAuth is reshaped into a general-purpose credentials array (#​1797).
  • get_deployment_payload and delete_deployment_payload operations implemented (#​1898), and peer-side payload_blob reads retry on a transient 503 stall (#​1838).
  • A deployed-but-not-restarted component returns an actionable, super_user-gated 404 (#​1806) instead of a bare Not Found, and redeploying an active jsResource component flags a restart (#​1820).
  • Deploy-validation Scopes are closed to stop a deployLifecycle listener leak (#​1465).
  • server.registerOperation() from components is reachable via the operations API (#​1743).
  • set_configuration supports replicated: true (#​1556).
  • Graceful drain hook for in-flight work before worker shutdown (#​1621), with a waitForDrain poll fallback for drains that never emit (#​1643).

Replication (core side)

  • The resume-cursor write no longer freezes the apply worker (#​1888).
  • Live subscribers recover copy-applied rows via a copyApply reload marker (#​1530).
  • An in-flight replication receive returns 503 rather than 404 (#​1563), and compressed blobs are inflated on read instead of re-deflated (#​1393).
  • Apply commits are never gated on wire-carried save flags; local writes are gated on blob durability (#​1641).
  • FileBackedBlob.stream() cancel/cleanup paths hardened (#​1542).
  • Directional controlled-flow replication route fields are validated (#​1529).
  • CRDT hardening (#​1615): unified add fold, fixed counter time-travel reconstruction, null-prototype op registry, and a hardened apply path.

CLI

  • Token environment variables for CI/CD authentication, and harper login --for-ci to print CI credentials on stdout, gated on a remote target with userinfo stripped (#​1876).
  • CLI failure paths exit non-zero, including operation timeouts (#​1801).
  • Auth credentials are resolved as atomic pairs ahead of payload fields, separating transport auth from the operation payload for add_user/alter_user (#​1873).
  • A friendly "Harper is not running" message on local connect failure (#​1808), and ~/... install destinations are expanded to an absolute path immediately (#​1803).

Packaging and build

  • npm-shrinkwrap.json ships in the published package (#​1622), with devDependencies pruned before shrinkwrapping (#​1781, #​1783) and the react-native tree stripped (#​1959).
  • uWebSockets.js resolves via a tarball URL rather than a github: git spec (#​1756).
  • A Docker smoke test builds and boots the image in CI (#​1620), and the entrypoint is no longer written empty via a RUN heredoc redirect (#​1619).
  • Migration to @harperfast/code-guidelines (#​1992).
  • tsgo is available as an opt-in fast type-checker (#​1738).

Also in this release

Broad QA regression-anchor promotions across concurrency and data integrity, static serving, deploy, shutdown drain, secrets, subscription paths, read consistency, secondary-index integrity, cross-version upgrade read visibility, and transaction commit behavior (#​1517, #​1418, #​1791, #​1802, #​1833, #​1886, #​1884, #​1870, #​1900, #​1345, #​1861); a packaged-application E2E workflow (#​1908); a downstream Next.js adapter integration gate on harper PRs (#​1385); CI shard rebalancing and single-Node integration runs on PR pushes (#​1883); rocksdb-js updated to 2.5.0 (#​1892); assorted dependency updates, deflaking, lint migration to plain node:assert (#​1558), and removal of vestigial resourceCache plumbing (#​1980).

Full Changelog: HarperFast/harper@v5.1.15...v5.2.0

nodejs/node (node)

v24.19.0: 2026-08-03, Version 24.19.0 'Krypton' (LTS), @​aduh95

Compare Source

Notable Changes
  • [d08872b530] - (SEMVER-MINOR) buffer: implement blob.textStream() (Matthew Aitken) #​64036
  • [35222948be] - (SEMVER-MINOR) deps: update OpenSSL build config to support compression (Tim Perry) #​62217
  • [d6ab039f24] - (SEMVER-MINOR) doc: update blockList stability status to release candidate (alphaleadership) #​63050
  • [1da05fb79d] - doc: mark stream.compose stable (Matteo Collina) #​62562
  • [3c1636dabf] - (SEMVER-MINOR) esm: add --experimental-import-text flag (Efe) #​62300
  • [e323e877be] - (SEMVER-MINOR) fs: support caller-supplied readFile() buffers (Matteo Collina) #​63634
  • [c1248c9544] - (SEMVER-MINOR) http: add httpValidation option to configure header value validation (RajeshKumar11) #​61597
  • [a534b65815] - (SEMVER-MINOR) net: support TCP_KEEPINTVL and TCP_KEEPCNT in setKeepAlive (Guy Bedford) #​63825
  • [a23cdec683] - (SEMVER-MINOR) perf_hooks: sample delay per event loop iteration (Pablo Erhard) #​62935
  • [7428b57a37] - (SEMVER-MINOR) src: allow empty --experimental-config-file (Marco Ippolito) #​61610
  • [e57597173c] - (SEMVER-MINOR) stream: expose ReadableStreamTee (Matteo Collina) #​64195
  • [5396235993] - (SEMVER-MINOR) tls: report negotiated TLS groups (Filip Skokan) #​64119
  • [5e901b5cd9] - (SEMVER-MINOR) tls: add certificateCompression option (Tim Perry) #​62217
Commits

Note

PR body was truncated to here.


Configuration

📅 Schedule: (in timezone America/New_York)

  • Branch creation
    • "before 9am on Monday"
  • Automerge
    • At any time (no schedule defined)

🚦 Automerge: Enabled.

Rebasing: Whenever PR is behind base branch, or you tick the rebase/retry checkbox.

👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.


  • If you want to rebase/retry this PR, check this box

This PR was generated by Mend Renovate. View the repository job log.

@renovate
renovate Bot force-pushed the renovate/all-minor-patch branch from 6617cd8 to 5c977b4 Compare August 10, 2026 21:07

@dawsontoth dawsontoth left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Blocked: npm ci fails — same latent landmine I just hit on agent#141, not these bumps

All four failing jobs (Verify and Integration, Node 24 and 26) die at install before anything runs:

npm error `npm ci` can only install packages when your package.json and package-lock.json ... are in sync.
npm error Missing: react-native-fs@2.20.0 from lock file
npm error Missing: react-native@0.84.1 from lock file
npm error Missing: react@19.2.8 from lock file
... (~66 react-native / jest / metro entries, all under node_modules/harper/node_modules/**)

Cause

harperalasql, which declares "optionalDependencies": { "react-native-fs": "^2.20.0" }; that in turn has an optional peer on react-native. npm's resolver omits those from the lockfile, but npm ci's validator computes an ideal tree that includes them and then rejects the lock for not having them.

This PR is the only one that bumps harper (5.1.26 → 5.2.1), which forces a re-resolve of harper's nested tree and drops the whole subtree: 1469 → 1195 keys.

Not caused by the bumps — main breaks identically when regenerated

tree keys react-native in lock npm ci
main, committed lock 1469 yes ✓ exit 0
main, lock regenerated 1191 no ✗ exit 1
this PR 1195 no ✗ exit 1

I confirmed the same thing on agent#141 (npm 10.9.8 and npm 11.13.0 both produce a lock their own npm ci rejects, and npm install doesn't repair it). Any lockfile regeneration in a repo with harper as a dependency trips this.

The dependency intent here is clean and small, for the record: 0 major crossings, 4 top-level moves — harper 5.1.26 → 5.2.1, vite 8.2.0 → 8.2.1, semantic-release 25.0.8 → 25.0.9, conventional-commits-parser 7.1.1 → 7.1.2 — plus .nvmrc 24.18.1 → 24.19.0.

Fix belongs on main

Cheapest option is an overrides entry neutralizing alasql's optional dep so it never enters the ideal tree:

"overrides": { "alasql": { "react-native-fs": "npm:empty-npm-package@1.0.0" } }

(harper uses alasql for SQL parsing, never its React Native file adapter.) The heavier alternative is declaring the packages as direct devDependencies, the same shape as the argue-cli / conventional-commits-* fix.

vite-specific caution: a full npm install here re-dedupes the nested harper/node_modules/harper/... native-binary trees into a ~12k-line diff. Do this surgically and check the diff size before committing. Validate with both npx -p npm@10.9.8 npm ci and npx -p npm@11.16.0 npm ci from a clean tree.

Once main installs reproducibly, a rebase should clear all four jobs. I've filed this separately since it blocks agent and vite today and will hit any other repo with harper on the next bump.

@renovate
renovate Bot force-pushed the renovate/all-minor-patch branch from 5c977b4 to 16064a1 Compare August 12, 2026 14:20
dawsontoth and others added 2 commits August 13, 2026 13:55
Renovate updates lockfiles with `npm install --package-lock-only`. That
path prunes the optional `react-native-fs` subtree declared by
`harper > alasql`, while `npm ci`'s validator still computes an ideal tree
containing it, so every CI job died at the install step:

    npm error code EUSAGE
    npm error Missing: react-native-fs@2.20.0 from lock file
    npm error Missing: react-native@0.84.1 from lock file

Regenerating the same branch with a full `npm install` records the subtree
and `npm ci` accepts it. The result is a strict superset of the previous
lockfile: 270 entries added, 0 removed, 0 version changes, and the 1195
pre-existing entries are byte-identical and in the same order. The large
textual diff is a git alignment artifact, not churn.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
`skipInstalls` defaults to true, which is what makes Renovate use
`npm install --package-lock-only` and drop the optional react-native
subtree, producing a lockfile its own `npm ci` rejects. Renovate documents
this switch for exactly this case: "only used in cases where bugs in npm
result in incorrect lock files being updated."

Without this, the next dependency PR that re-resolves harper regenerates
the same broken lockfile.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@dawsontoth

Copy link
Copy Markdown
Contributor

Took this over — same root cause and fix as agent#141

Pushed two commits. The four red jobs were all dying at npm ci, before a single test ran — and the cause was never which versions this PR picks, but how the lockfile was generated.

What was actually wrong

Renovate updates lockfiles with npm install --package-lock-only. That path prunes the optional react-native-fs subtree declared by harper > alasql, while npm ci's validator still computes an ideal tree containing it — so it rejects the lockfile Renovate just wrote:

npm error code EUSAGE
npm error Missing: react-native-fs@2.20.0 from lock file
npm error Missing: react-native@0.84.1 from lock file

Same branch, same npm (11.16.0), only the generation method differs:

lockfile generated by entries RN subtree npm ci
npm install --package-lock-only (Renovate) 1195 absent EUSAGE
npm install (full reify) 1465 present

58928ed — regenerate the lockfile with a full install

Please don't be alarmed by the 18,817-line diff. It is not churn. The new lockfile is a strict superset of the previous one:

  • 270 entries added, 0 removed, 0 version changes
  • all 270 are dev/optional, all in the react-native cone
  • the 1195 pre-existing entries are byte-identical and in the same order

Verified mechanically — deleting exactly the 270 new keys from the new lockfile reproduces Renovate's previous lockfile exactly, order-sensitive:

const stripped = {...B, packages: Object.fromEntries(
  Object.entries(B.packages).filter(([k]) => k in A.packages))};
JSON.stringify(stripped) === JSON.stringify(A)   // true

So git's diff is aligning re-emitted blocks badly; every deleted line reappears verbatim. package.json is untouched and no dependency was added or changed. (Worth noting main already installs this same cone, just nested under node_modules/harper/node_modules/ — this hoists it. Same packages, different placement.)

892f79a"skipInstalls": false in renovate.json

Otherwise this returns on the next PR that re-resolves harper. Renovate documents the switch for precisely this failure mode:

By default, Renovate will use the most efficient approach to updating package files and lock files, which in most cases skips the need to perform a full module install by the bot. If this is set to false, then a full install of modules will be done. This is currently applicable to npm only, and only used in cases where bugs in npm result in incorrect lock files being updated.

Verification

Clean tree, Node 24.18.0 / npm 11.16.0:

npm ci                 ✓ added 1278 packages
npm run format:check   ✓ All matched files use Prettier code style
npm run test:coverage  ✓ 1/1 passing

I could not run npm run test:integration locally — it needs the 127.0.0.0/8 loopback pool, which macOS doesn't provide by default (EADDRNOTAVAIL 127.0.0.4), exactly as the workflow comment notes it's a Linux freebie. So the integration matrix is unverified by me and CI is the real oracle for those four jobs. What I can say is that they previously failed at the install step and never executed; if any of them now fail on their merits, that's a separate finding and I'll dig in.

Notes

  • This corrects my earlier diagnosis here. I'd called it "bumping harper produces a broken lockfile" and floated an overrides entry with a third-party stub. Both wrong: this PR doesn't change harper in package.json at all (only the lock-resolved version moved, 5.1.26 → 5.2.1), and no stub dependency is needed.
  • test-fixture/package-lock.json is deliberately untouched — the fixture doesn't depend on harper, so it has no RN subtree to lose.
  • Since I pushed to the branch, Renovate will stop rebasing it. 🤖

@renovate

renovate Bot commented Aug 13, 2026

Copy link
Copy Markdown
Contributor Author

Edited/Blocked Notification

Renovate will not automatically rebase this PR, because it does not recognize the last commit author and assumes somebody else may have edited the PR.

You can manually request rebase by checking the rebase/retry box above.

⚠️ Warning: custom changes will be lost.

@dawsontoth dawsontoth left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Approving — the npm ci blocker I filed is fixed on this branch and every check is green: commitlint, Verify on Node 22/24/26, and Integration on Node 22/24/26.

Clearing my earlier CHANGES_REQUESTED. The fix is the regenerated lockfile in 58928ed (strict superset: 270 entries added, 0 removed, 0 version changes) plus skipInstalls: false in 892f79a so it doesn't recur. Full rationale and the superset proof are in the comment above.

Notably the three Integration jobs — which I flagged as unverifiable on macOS — all pass on CI. They had previously been failing at the install step without executing, so this confirms there was no second problem hiding behind the lockfile failure. 🤖

@dawsontoth
dawsontoth merged commit c5b68bb into main Aug 13, 2026
7 checks passed
@dawsontoth
dawsontoth deleted the renovate/all-minor-patch branch August 13, 2026 18:00
@github-actions

Copy link
Copy Markdown

🎉 This PR is included in version 1.1.7 🎉

The release is available on:

Your semantic-release bot 📦🚀

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

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant