chore(deps): update all non-major dependencies - #141
Conversation
69c2e5f to
a2c567a
Compare
dawsontoth
left a comment
There was a problem hiding this comment.
Blocked: npm ci fails — but the cause is a latent landmine on main, not these bumps
All three jobs (Format, Lint, Test) die at install, before anything is built or run:
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: @jest/create-cache-key-function@29.7.0 from lock file
... (~66 react-native / jest / metro entries)
Reproduced locally on a2c567a1 with npm 11.13.0 / Node 24.17.0 — npm ci exits 1.
What actually happened
This is the only PR in the current batch that bumps the harper devDep (5.1.26 → 5.2.1). That forces a re-resolve of harper's nested tree, and the regenerated lockfile drops 280 node_modules/harper/node_modules/** entries (adds 6). The chain is harper → alasql, which declares:
"optionalDependencies": { "react-native-fs": "^2.20.0" }and react-native-fs 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.
It is not caused by the dependency bumps
main's committed lock passes npm ci only because it still carries that subtree (1711 keys, react-native present). Regenerate it and main breaks identically:
| tree | keys | react-native in lock | npm ci |
|---|---|---|---|
| main, committed lock | 1711 | yes | ✓ exit 0 |
| main, lock regenerated with npm 11.13.0 | 1411 | no | ✗ exit 1 |
| main, lock regenerated with npm 10.9.8 | 1408 | no | ✗ exit 1 |
| this PR, committed lock | 1437 | no | ✗ exit 1 |
So any PR that regenerates this lockfile trips it; npm 10 and npm 11 both produce a lock their own npm ci rejects, and npm install on this branch does not repair it (byte-identical output). The other five open agent PRs install fine purely because they leave harper at 5.1.26 and inherit main's subtree verbatim.
The dependency intent here is clean, for the record: 34 top-level moves, 0 major crossings, 0 additions/removals outside harper's subtree, plus .nvmrc 24.18.1 → 24.19.0. The @ai-sdk/* set moves together.
Suggested fix (belongs on main, not this branch)
Same shape as the commitlint optional-peer problem this org hit before — the durable fix is to stop depending on npm materializing an optional transitive. Options, cheapest first:
- Neutralize alasql's optional dep with an
overridesentry so the subtree never enters the ideal tree, e.g."alasql": { "react-native-fs": "npm:empty-npm-package@1.0.0" }—harperonly needs alasql's SQL parsing, never its React Native file adapter. - Or declare the trio as direct
devDependencies(the fix used forargue-cli/conventional-commits-*), which keeps them in the lock under every npm version — heavier, since it pulls a full React Native tree into the repo's declared deps.
Once main installs reproducibly, rebasing this PR should clear all three jobs. Worth prioritizing: until then every agent Renovate PR that touches harper is blocked, and the failure looks like the bump's fault when it isn't.
a2c567a to
5723ac7
Compare
This PR contains the following updates:
3.0.104→3.0.1073.0.110(+2)3.0.103→3.0.1043.0.107(+2)3.0.90→3.0.913.0.94(+2)1.11.1→1.12.16.0.238→6.0.2466.0.250(+3)5.1.26→5.2.14.12.33→4.13.124.18.1→24.19.01.76.0→1.77.01.78.025.4.0→25.5.025.6.025.0.8→25.0.94.23.1→4.23.114.23.12Release Notes
vercel/ai (@ai-sdk/anthropic)
v3.0.107Compare Source
Patch Changes
ee2bf30]v3.0.105Compare Source
Patch Changes
0a295e3: Preserve Anthropic prompt-cache matches by replaying complete code-execution transcripts in their original wire shape.HarperFast/skills (@harperfast/skills)
v1.12.1Compare Source
Documentation
3749d0c(#70) (72d2e99)v1.12.0Compare Source
Features
harperfast/harper (harper)
v5.2.1Compare Source
Data integrity
Blob-column decode corruption on read-modify-write, fixed at the root cause (#2119). In 5.2.0, a REST
PATCHthat read a record and wrote it back unchanged — carrying along aBlobcolumn — could corrupt that blob on disk, producingError decoding record: Data read, but end of buffer not reachedon 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
uncaughtExceptionhandling 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, anddisableStdio()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.delete_transaction_logs_beforescoped 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.Security
bypass_authtrust gaps in MCP token handling and SQL AST checks; request bodies can no longer influence operations authorization.super_userare now rejected, preventing accidental lockout.Storage
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-jsupdated 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
-h/--helpflags with a width-responsive help screen./v1/*gateway, exposed as built-in Resources (Phase 4 of the models initiative — #1616).CONFIRM_DOWNGRADEnow resolves deterministically (and logs the refusal) when no TTY is available to answer the prompt, instead of hanging (#2059).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.0Compare 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
legacytoauto(#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. Setsql.engine: legacyto restore the previous behavior, ornewto disable fallback and surface unsupported shapes as errors.allowRead/write hooks per record; that is reverted to the pre-5.2 contract. Applications that want row-level narrowing should use the new explicitrowFilter(record, context)andeventFilter(event, context)predicates.@expiresAtnow takes precedence over the table-level expiration default (#1812). Tables that set both will see per-record expiration win.threads.countdefaults to 1 on macOS and Windows (#1605). Neither platform has workingSO_REUSEPORT, so additional HTTP workers could never share the server ports. An explicitthreads.countstill overrides.noDelay/keepAliveoptions were never actually applied to TCP or UDS listeners, and the keep-alive delay was 600 ms rather than the intended 10 minutes (#1859).storage.migrateOnStarton any 5.2 alpha or beta, migrated records were written without their version metadata — see "LMDB to RocksDB migration" below for the verification step.CONFIRM_DOWNGRADE=yes(#2046). Starting 5.2.0 against an existing store createssystem.hdb_secretand 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, setCONFIRM_DOWNGRADE=yesin the environment (or pass--CONFIRM_DOWNGRADE yes); take a backup first.SQL engine on the Resource API
sql.engine: autofalls 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 noWHEREis served from index order rather than a full ordered scan;UPDATE col = col ± Nis applied as an atomic addition; null-valued conditions are served only onindexNullsindexes; unindexedWHEREconjuncts are residualized rather than pushed;NOT INuses correct three-valued logic. DISTINCT aggregates andUPDATE SETon the primary key fall back to legacy.Security
databaseid; when a statement omitted the schema qualifier that field was empty, nothing was recorded in the affected-attribute map, andhasPermissionsiterating 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 recordsGROUP BY/HAVINGcolumns, reports derivedJOINsources that carry nojoin.table, and refusesUNION/EXCEPT/INTERSECT/PIVOT/UNPIVOToutright 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.Errorobjects 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 reachhdb.log.inspectForLog/deepSanitizeErrorsare now realm-safe, bounded in breadth and depth, and fail closed at the cap.cluster_userhandling is completed (#1913).http.securityHeadersconfig added, and the authentication middleware is now named in the chain (#1568).PACKAGE_ROOTis canonicalized so it matches realpath'dallowedPathchecks (#1905), andnpm pack --ignore-scriptsis gated oninstall_allow_scriptsalone (#1819).enableProxyProtocolheader 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_secretstore 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..envfiles are protected in the operations API (#1527) and can be written viaset_component_file, with an encryptedenc:v1contract and a dormant decrypt hook (#1528)..envfiles are warned about loudly rather than silently ignored (#1580).Access control
allowRead: unified row-level read access control (#1786, closing the second gap in #1422). Enforcement is consistent across reads, GraphQLcheckPermission, and subscription delivery. Prefix and multi-record scans keep the awaited entry check; per-record enforcement is sync-only.alter_role(#1634).allowReadis enforced on custommcpResourcesreads (#1839), which previously bypassed the check that equivalent REST reads applied.allowReadbinds to a proper resource instance (#1532).rowFilter/eventFilterpredicates (#1915) carry through filtered HNSW traversal, OR/range filtering, source-revalidated reads, subscription snapshots, replay, live events, and reload snapshots.hdb-sessioncookie (#1546).Managed RocksDB backups
create_backup,list_backups,verify_backup,delete_backup,purge_backups,restore_backup, and RocksDB support forget_backup— give incremental, checksum-verified backups understorage.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
defineTableplus a per-method request contract, with the six typed-resources exports wired into the component sandbox (#1825).urlPathfrom 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.@computedscalars surface on default reads, with a guard for cyclic@enumerableserialization (#1601).super.postcreate behavior, normalized before authorization (#1956).Responseobjects and astatusfield are honored for custom-resource HTTP status (#1501).Transactions and storage
The largest cluster of fixes in this release. Several were write-loss paths.
ERR_TRY_AGAINretries on the same transaction using a native in-place reset (#1823); the earlier fix retried on a fresh transaction (#1696).Table.clear()clears secondary-index DBIs as well as the primary store (#1906).localTimerather than its origin version (#1988).audit: falsetables thread the transaction intoremoveEntry(#1869).starts_withreturns complete results for astral-plane Unicode values (#1887).checkOverloaded()logs once when it first starts rejecting writes (#2007), so a shedding node is visible in the log.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.migrateOnStartsince #1307 was stored without its[8-byte version][flags word]metadata prefix:copyDbgraftsRecordEncoder's encode hook onto the migration target's plain msgpackr encoder, and the hook'sif (!this.useVersions)opt-out readuseVersionsoff that foreign encoder —undefined— so every migrated record took the non-versioned plain-encode path. Downstream, prefix-less records decode without the metadata wrapper, soPrimaryRocksDatabase.getEntryskipped thestructPrototyperepair and point reads returned prototype-less plain objects: relationship getters,toJSONandgetUpdatedTimewere 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 runmigrateOnStarton any 5.2 alpha or beta, runverifyMigratedDatabasebefore relying on versions; a no-op rewrite pass is required to restore versions on already-migrated records.Legacy
storage.compressionmetadata 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
PrimaryRocksDatabasebacks primary stores with aWeakLRUCachevalidated 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.HTTP, TLS and networking
tls.unixDomainSocketsenabled, the per-worker UDS mirror is a separatehttp.Serverthat never received the'upgrade'listeneronWebSocket()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 stopsenableProxyProtocol()'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.request.connectionInfo(#1985).ciphers/SECLEVELare honored from every configured source when building listeners (#1841).listenOnPorts()previously swallowed everyEADDRINUSE, so an unrelated process squatting a Harper port silently received Harper's traffic.Static serving and caching
urlPathwas configured, andurlPath: '/'matched only the exact path/.maxAge,immutable,cacheControl(#1748) — and Cache-Control/Vary hardening with shared-cache defaults (#1746).afterordering for the static plugin, with a warning whenfallthrough: falseblocks REST (#1574).target.loadedFromSourceis the sole cache-disposition signal (#1626).allowStaleWhileRevalidateis consulted for query-driven revalidation (#1581).finalizeResponse(#1709), which corrupted persisted headers.MCP and AI
mcpTools/mcpPromptsare 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).MCP-Protocol-Versionheader is accepted as the session's negotiated version (#1694).harper agentCLI (#1553): a command-line client for the built-in agent, withharper chatas an alias, automatic refresh of expired agent tokens, and the--onceapproval 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.embedno 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_logstreams over SSE as a live tail (#1693), with backpressure detection, bounded backlog reads, and resilient delta reads.logging.rotation.retentionis exposed (#1687).get_analyticsis driven off the bounded time window rather than the metric index (#1798).get_status(#1587).threads.preloadconfig preloads modules such as APM agents on worker threads (#1569).Deployment and components
deploy_componentregistryAuthis reshaped into a general-purpose credentials array (#1797).get_deployment_payloadanddelete_deployment_payloadoperations implemented (#1898), and peer-sidepayload_blobreads retry on a transient 503 stall (#1838).jsResourcecomponent flags a restart (#1820).deployLifecyclelistener leak (#1465).server.registerOperation()from components is reachable via the operations API (#1743).set_configurationsupportsreplicated: true(#1556).waitForDrainpoll fallback for drains that never emit (#1643).Replication (core side)
copyApplyreload marker (#1530).FileBackedBlob.stream()cancel/cleanup paths hardened (#1542).CLI
harper login --for-cito print CI credentials on stdout, gated on a remote target with userinfo stripped (#1876).add_user/alter_user(#1873).~/...install destinations are expanded to an absolute path immediately (#1803).Packaging and build
npm-shrinkwrap.jsonships in the published package (#1622), with devDependencies pruned before shrinkwrapping (#1781, #1783) and the react-native tree stripped (#1959).github:git spec (#1756).RUNheredoc redirect (#1619).@harperfast/code-guidelines(#1992).tsgois 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 vestigialresourceCacheplumbing (#1980).Full Changelog: HarperFast/harper@v5.1.15...v5.2.0
honojs/hono (hono)
v4.13.1Compare Source
v4.13.0Compare Source
Hono v4.13.0 is now available!
The highlight of this release is performance: a batch of low-level optimizations makes the core request/response path significantly faster — up to 1.25x on common routes in our benchmark. This release also adds first-class support for the HTTP QUERY method, defined in RFC 10008, a new Method Not Allowed middleware, and more.
Performance improvements
This release includes a series of small optimizations: skipping unnecessary
Headersallocations, replacing regex tests withindexOf, allocating internal state lazily, and more.Here is
benchmarks/fetchcomparing v4.12 and v4.13 (ROUNDS=5 ./compare.sh, Bun 1.4.0, Apple Silicon — each measurement runs in a fresh process, and the variant order is reversed every round to avoid warm-up bias):ping—GET /query—GET /id/1?name=bunjson—GET /userbody—POST /jsonThe individual changes:
for..in#5118indexOf#5121Headerscreation when there are no headers to merge #5122tryDecodeURIComponent#5158#validatedDatalazily #5175In addition, the RegExpRouter rewrite described below makes route registration plus the first match roughly 20% faster.
Thanks @kibertoad for the contributions!
First-class QUERY method support
The QUERY method — a safe, idempotent method that carries a request body — is now a first-class citizen in Hono. You can define QUERY handlers with
app.query():Thanks @shellhaki!
QUERY support across built-in middleware
The built-in middleware has been updated to handle QUERY requests properly:
Cache Middleware
The Cache Middleware now caches QUERY responses. Following RFC 10008 Section 2.7, the cache key incorporates a SHA-256 digest of the request content and its representation metadata, so different query bodies are cached separately:
Note: To support this, the internal cache key format has changed for all methods, including GET. Cached entries are now stored under an internal URL of the form
/.hono/cache?__hono_cache_key=.... If you purge cache entries by URL outside of the middleware (e.g. callingcaches.delete()with the original request URL), you will need to update that logic. Existing cache entries stored with the old format will simply be re-fetched.ETag Middleware
The ETag Middleware now handles conditional requests for QUERY, returning
304 Not ModifiedwhenIf-None-Matchmatches.CORS Middleware
The CORS Middleware now includes QUERY in the default
Access-Control-Allow-Methods, which is nowGET, HEAD, PUT, POST, DELETE, PATCH, QUERY. If you specifyallowMethodsexplicitly, nothing changes for you.Thanks @usualoma and @Cherry!
Method Not Allowed Middleware
The new Method Not Allowed Middleware returns a
405 Method Not Allowedresponse with a properAllowheader when the request path matches a registered route but the method does not:You can customize the response with the
onMethodNotAllowedoption:Thanks @usualoma!
RegExpRouter throws
UnsupportedPathErrorat registration timeThe RegExpRouter now detects unsupported path combinations when routes are registered, instead of at the first matching request. This means misconfigured routes fail fast at startup rather than at runtime. As a bonus, registration plus the first match is roughly 20% faster.
Thanks @usualoma!
Other improvements
hono/utils/headershas been synced with the IANA HTTP Field Name Registry, adding newly registered fields such asAccept-Query. Thanks @akahoshi1421!realmoption for theWWW-Authenticatechallenge on401responses, and challenge values are properly escaped. Thanks @arhxam!useRefandRefObjectare now aligned with React 19. Note that this is a type-level change —RefObject<T>is now{ current: T }, so type a nullable ref asRefObject<T | null>, and passuseRef(undefined)instead ofuseRef(). Thanks @ashunar0!Vary: Accept-Encodingon negotiated responses. Thanks @arhxam!All changes
fetchby @yusukebe in #5113indexOfby @yusukebe in #5121Configuration
📅 Schedule: (in timezone America/New_York)
🚦 Automerge: Enabled.
♻ Rebasing: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox.
👻 Immortal: This PR will be recreated if closed unmerged. Get config help if that's undesired.
This PR was generated by Mend Renovate. View the repository job log.