Commit Graph

36831 Commits

Author SHA1 Message Date
Peter Steinberger
ca2e508f87 perf(test): isolate doctor migration plugin discovery 2026-07-06 04:31:06 -04:00
Masato Hoshino
e7ca90e3af fix(hooks): flag hook event names that no core trigger emits (#99456)
* fix(hooks): flag hook event names that no trigger site emits

* docs(hooks): clarify bare family subscriptions in unknown-event note

* fix(hooks): word unknown-event diagnostics around core-emitted keys

* fix(hooks): apply unknown-event advisory to legacy config handlers too
2026-07-06 01:30:13 -07:00
cxbAsDev
d6c880ae92 fix(link-understanding): honor global or largest model timeout for link fetches (#100660) (#100731) 2026-07-06 09:26:39 +01:00
Vincent Koc
e27202a5c2 test(channels): satisfy bundled source guard lint 2026-07-06 01:26:03 -07:00
Masato Hoshino
9b0c3abbca improve(status): group disabled plugins by reason in /status plugins (#99598) 2026-07-06 01:22:42 -07:00
NianJiu
1a07bd760c fix sessions_send Telegram topic guard (#99845)
Co-authored-by: NianJiuZst <180004567+NianJiuZst@users.noreply.github.com>
2026-07-06 01:22:26 -07:00
Masato Hoshino
ef1c83274d improve(health): surface dead-lettered delivery queue entries (#99842)
* improve(health): surface dead-lettered delivery queue entries

Deliveries that exhaust retries are moved to the failed status in the
SQLite delivery queue for diagnostics, but no health surface ever read
them back: openclaw health stayed all-green while messages sat
dead-lettered, visible only in gateway logs. Add a per-queue failed
count accessor and report dead-lettered entries in the health snapshot
(JSON field plus a warning line), following the existing plugin and
context-engine health section pattern. Observer-only: no retry, purge,
or behavior change.

* test(health): cover snapshot and CLI dead-letter reporting

Add getHealthSnapshot coverage against an isolated state dir, an
openclaw health text-output test for the warning line, exact
oldest-failure timestamp assertions via fake timers, and a debug log
when the delivery-queue health read fails.

* fix(health): recompute dead-letter counts for cached gateway responses

The gateway health handler can serve a cached snapshot for up to a
refresh interval, so a delivery dead-lettered after the cache was
filled stayed hidden from openclaw health. Recompute the delivery
queue summary in mergeCachedHealthRuntimeState alongside the existing
context-engine and model-pricing live merges, and cover the cached
handler path with a regression test.
2026-07-06 01:22:16 -07:00
chenyangjun-xy
a152a45284 fix(usage-bar): bound template file cache to prevent unbounded watche… (#98990)
* fix(usage-bar): bound template file cache to prevent unbounded watcher growth

Add MAX_CACHED_TEMPLATE_FILES=64 limit; evict the oldest entry (closing
its fs.watch watcher) before allocating a watcher for a new key when
the cache is full.

Eviction runs before watcher allocation so we never create a watcher
only to close it immediately. Eviction triggers only when inserting a
new key (!fileCache.has(path)) — retries for an existing key must
not evict other entries.

Fixes #98960

Co-Authored-By: Claude <noreply@anthropic.com>

* refactor(test): replace mutable dir variable with cleanup-stack pattern in template.test.ts

Co-Authored-By: Claude <noreply@anthropic.com>

* chore(test): add curly braces for eslint curly rule

Co-Authored-By: Claude <noreply@anthropic.com>

* test(usage-bar): register watcher proof cleanup

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 01:21:32 -07:00
chenxiaoyu209
5e64c61368 fix(google): resolve thought_signature gate for Gemini latest aliases (#100605) 2026-07-06 09:12:35 +01:00
Andy Ye
e24d4426fe Run memory flush before preflight compaction (#84792)
* Run memory flush before preflight compaction

* test: align current-main provider and cron checks

* fix(reply): align memory flush ordering on current main

* fix(reply): preserve memory flush cycle invariant

* fix(reply): recover exhausted memory flushes

* fix(reply): preserve preflight failure handling

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 09:11:22 +01:00
SunnyShu
89104d74ba fix(agents): include sender in duplicate-user-message dedup key (#98336)
* fix(agents): include senderId in duplicate-user-message dedup key (#98336)

* refactor(agents): harden sender-aware compaction dedup

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 09:08:32 +01:00
cxbAsDev
6ae4bbafb0 fix(transcripts): handle read stream errors gracefully in TranscriptsStore (#100524)
* fix(transcripts): handle read stream errors gracefully in TranscriptsStore

* proof(transcripts): add real behavior proof script for store stream error catch

* fix(transcripts): reject with Error in stream error handler

* proof(transcripts): replace wrapper with real EISDIR stream error proof

* fix(transcripts): reject non-ENOENT stream errors after stream close
2026-07-06 01:07:32 -07:00
Peter Steinberger
34c26a8047 fix(channels): resolve source-only bundled entries (#100737)
Co-authored-by: Peter Steinberger <steipete@openai.com>
2026-07-06 09:05:47 +01:00
Peter Steinberger
eae4000c38 fix(control-ui): preserve assistant download filenames (#100728)
* fix(gateway): preserve assistant media filenames

Co-authored-by: Rovy <xiaxia@rovy.dev>

* test(ui): verify assistant media download filename

---------

Co-authored-by: Rovy <xiaxia@rovy.dev>
2026-07-06 09:04:22 +01:00
Vincent Koc
535ab05dcd test(release): reach Claude ACP transcript fallback 2026-07-06 01:00:32 -07:00
Super-Cabbage
5acabfd897 fix(commands): guard shortenText against non-positive maxLen (#99917)
* fix(commands): guard shortenText against non-positive maxLen

* fix(commands): guard shortenText against non-positive maxLen

---------

Co-authored-by: openclaw-clownfish[bot] <280122609+openclaw-clownfish[bot]@users.noreply.github.com>
2026-07-06 01:00:08 -07:00
Yzx
3d837cce23 fix: surface delayed sessions_send delivery failures (#99907) 2026-07-06 00:58:32 -07:00
cxbAsDev
c9a0783922 fix(secrets): suppress unhandled stdout/stderr stream errors in exec resolver (#100521)
* fix(secrets): suppress unhandled stdout/stderr stream errors in exec resolver

* proof(secrets): add real behavior proof script for exec resolver stream error catch

* proof(secrets): replace wrapper with real exec resolver stream error proof

* style: apply oxfmt to changed files
2026-07-06 00:52:22 -07:00
ZOOWH
5c7c2961fb fix(tui): preserve balanced parentheses in markdown link URL extraction (#100661) (#100697)
The markdown link regex character class [^)\s>]+ stopped at the first
closing paren, truncating URLs like wikipedia.org/wiki/URL_(disambiguation)
at the opening (. Replace with a balanced-parens pattern that supports
one level of parenthetical groups inside the URL path.

Add trimUnbalancedTrailingParens for bare URLs in prose where a trailing
) belongs to surrounding punctuation rather than the URL itself.
2026-07-06 00:47:38 -07:00
Leonidas Lux
be48a430bf fix(tools-manager): replace spawnSync extraction with safe extractArchive API (#98988)
* fix(tools-manager): replace spawnSync extraction with safe extractArchive API

Replace the synchronous spawnSync-based archive extraction (unzip/tar)
with the safe extractArchive from @openclaw/fs-safe, which enforces:

- maxArchiveBytes: 100 MB (prevents oversized compressed input)
- maxExtractedBytes: 500 MB (prevents decompression bomb OOM)
- maxEntries: 1000 (prevents zip bomb from exhausting inodes)
- timeoutMs: 60,000 (prevents hung extraction)
- Path traversal and symlink/hardlink protection (built-in)

Removes 5 functions (formatSpawnFailure, runExtractionCommand,
extractTarGzArchive, getWindowsTarCommand, extractZipArchive) and their
associated imports, replacing them with a single async wrapper around
the existing @openclaw/fs-safe infrastructure (re-exported from
src/infra/archive.ts).

Net: -83 lines, + security boundaries across all platforms.

* fix(tools-manager): add download-stream byte cap and regression tests

Add a maxBytes parameter to downloadFile that checks Content-Length
before reading the body and enforces a streaming byte cap during
transfer, so oversized archives are rejected before hitting disk.

Extract MAX_ARCHIVE_BYTES as a module-level constant shared between
downloadFile and extractArchiveSafe, ensuring both gates use the same
100 MB limit.

Add two regression tests:
- rejects downloads with Content-Length exceeding the archive byte cap
- accepts downloads with Content-Length under the archive byte cap

Ref. https://github.com/openclaw/openclaw/pull/98988

* fix(tools-manager): replace PassThrough with Transform stream limiter

- Replace PassThrough data listener with Transform that rejects overflow
  chunks *before* they are forwarded to the file pipeline, preventing the
  offending chunk from landing on disk.
- Add completion guard and cleanup of partial downloads on failure so
  downloadTool does not leave a partial archive on disk.
- Add real behavior proof: test output and live fd/rg download and
  extraction through the safe extractArchive code path.

🦞 diamond lobster: L2 evidence (real function calls + real objects)

Ref. https://github.com/openclaw/openclaw/pull/98988

* fix(tools-manager): replace PassThrough with Transform stream limiter

Uses a Transform to reject overflow chunks *before* they are forwarded
to the file pipeline (a PassThrough data listener acts *after* emission
and cannot prevent the offending chunk from landing on disk).

Wraps the pipeline in a completion-guarded block so that partial
downloads are removed when the transfer fails mid-way.

Ref. https://github.com/openclaw/openclaw/pull/98988

* fix(agents): harden helper archive downloads

* fix(agents): preserve archive extraction cause

---------

Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 00:43:03 -07:00
ZOOWH
b8b946e43d fix(infra): include update timeout in managed-service handoff parent exit wait (#99695)
* fix(infra): include update timeout in managed-service handoff parent exit wait

The handoff parent exit grace was hard-coded to 60s regardless of
the overall update timeout. When the gateway is draining active
tasks, 60s is often not enough, causing
managed-service-handoff-parent-timeout.

Use the existing timeoutMs parameter as a floor for the parent
exit wait so callers can extend it for long-running drains.

Refs #99666

* fix(infra): add shutdown reserve to managed-service handoff parent exit wait

* fix(infra): align update handoff with restart drain

Co-authored-by: 徐闻涵0668001344 <xu.wenhan1@xydigit.com>

* fix(infra): arm restart with managed handoff

* fix(infra): use live restart drain for auto-update

* fix(infra): force process exit for managed updates

* fix(infra): normalize managed handoff restart delay

* test(infra): cover handoff drain argument

* fix(gateway): upgrade accepted restarts for managed updates

* fix(gateway): bound managed update restart upgrades

* test(gateway): stabilize managed update handoff proof

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 08:40:14 +01:00
Peter Steinberger
f6f3423ce9 refactor(infra): canonicalize session usage timestamps (#100687)
Co-authored-by: sheyanmin <44184140+sheyanmin@users.noreply.github.com>
2026-07-06 08:39:46 +01:00
Peter Steinberger
c1cbc15e60 fix(agents): preserve completed post-tool replies (#100655)
* fix(agents): prefer current attempt terminal state

Co-authored-by: weiqinl <liu.weiqin@xydigit.com>

* test(agents): model current attempt terminal state

---------

Co-authored-by: weiqinl <liu.weiqin@xydigit.com>
2026-07-06 08:38:30 +01:00
Wynne668
8380667bd0 fix(agents): keep bounded exec output UTF-16 safe (#98721)
* fix(agents): keep background exec exit notifications UTF-16 safe at the snippet cut

Background exec exit notifications truncate the command's tail output with a
raw String.slice, which can split a UTF-16 surrogate pair when an emoji lands
at the cut. Use the existing truncateUtf16Safe helper so the message delivered
to the channel never ends with a dangling surrogate half.

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(agents): protect exec notify tail boundaries

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(agents): protect node exec follow-up tails

Co-authored-by: Cursor <cursoragent@cursor.com>

* test(agents): type node exec follow-up assertions

Co-authored-by: Cursor <cursoragent@cursor.com>

* fix(agents): keep bounded exec output Unicode-safe

* docs(changelog): note exec output Unicode safety

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 08:36:40 +01:00
Hiroshi Tanaka
a118b32de8 fix(talk): resolve configured transcription providers (#97170)
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 08:32:58 +01:00
Peter Steinberger
62d5961b5d fix(ci): restore gateway architecture and lint gates (#100703)
* fix(ci): restore gateway architecture and lint gates

* fix(state): refresh gateway boot Kysely type
2026-07-06 08:19:04 +01:00
Peter Steinberger
92ceaa2ba5 perf(test): avoid provider runtime in auth doctor unit test 2026-07-06 03:07:12 -04:00
cxbAsDev
e66f43e276 fix(hooks): suppress unhandled stdout/stderr stream errors in gmail watcher (#100519)
* fix(hooks): suppress unhandled stdout/stderr stream errors in gmail watcher

* proof(gmail-watcher): add real behavior proof script for stream error catch

* proof(gmail-watcher): replace wrapper with real stream error proof

* style: apply oxfmt to changed files
2026-07-06 06:58:07 +00:00
Peter Steinberger
1e2e7fb936 feat(skills): suggest saving detected reusable workflows by default (#95477) (#100692)
Adds the middle tier between capture-off and autonomous capture: when
autonomy is disabled, detected durable-instruction signals record a
one-shot pendingSkillSuggestion on the session entry (signal-hash
fingerprint prevents transcript-history replay), and the next
non-heartbeat turn atomically consumes it and injects one bounded
user-role line offering to save the skill. The agent offers, the user
decides; skill_workshop approval flow unchanged; no new config.
2026-07-06 07:54:51 +01:00
Peter Steinberger
037ad2bdfb feat(telegram): offer BotFather web app flow in setup help and docs (#100540) 2026-07-06 07:48:55 +01:00
Ayaan Zaidi
a18708c5c1 feat(gateway): add persisted crash-loop breaker and fatal-config exit contract
Gateways that crash-loop under systemd/launchd previously flapped forever
with no persisted state and no supervisor signal. The gateway now records
every boot outcome in the shared state DB (gateway_boot_lifecycle); three
unclean boots within five minutes trip a breaker that boots the gateway in
safe mode: full control plane available, channel/provider auto-start
suppressed at the channel-manager seam (startup, config hot-reload,
secrets.reload) with manual channels.start override, one stability bundle
per trip. The breaker re-evaluates each boot and logs recovery when the
window drains. Slow shutdowns record forced_stop and never count as
crashes; /readyz stays ready and reports suppressed channels; the health
monitor treats suppressed accounts as expected-stopped. Fatal invalid-config
errors now exit 78 (EX_CONFIG) on both the startup and unhandled-rejection
paths, engaging the systemd unit's pre-existing RestartPreventExitStatus=78
so supervisors stop relaunching until the config is fixed.
2026-07-06 06:45:55 +00:00
haruai
ead92d7078 fix: stop reconnecting on protocol mismatch (#98414)
* fix: stop reconnecting on protocol mismatch

* fix(ui): stop protocol mismatch reconnects

* test(ui): assert protocol mismatch recovery copy

* test(ui): count gateway reconnect attempts

* test(gateway): keep detail-less reconnect case typed

* test(gateway): keep pairing retry fixture typed

---------

Co-authored-by: haruaiclone-droid <281899875+haruaiclone-droid@users.noreply.github.com>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 07:43:33 +01:00
mushuiyu886
806397f0d9 Treat already-compacted CLI compaction as no-op (#99136) 2026-07-06 06:34:05 +00:00
wm0018
4029f1c07e fix(message): thread --limit through to CLI formatter and surface provider pagination hints (#99089) 2026-07-06 06:32:59 +00:00
Peter Steinberger
20e6983bed fix(gateway): avoid default provider auth startup prewarm (#100667)
* fix(gateway): avoid default provider auth startup prewarm

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>

* docs(changelog): credit provider auth startup fix

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 07:32:13 +01:00
Vincent Koc
6801d34d9c test(release): allow tool-only live turn without transcript 2026-07-05 23:30:43 -07:00
Vincent Koc
c8ddcd116c fix(cli): align root command descriptions (#100670)
Co-authored-by: AmirF194 <amirfathi@fastinfer.org>
2026-07-05 23:29:40 -07:00
SunnyShu
d6dad9d9d5 fix(agents): detect bundled and legacy providers in model-not-found hint (#100120)
* [AI] fix(agents): detect legacy openai-codex provider in model-not-found hint

In buildMissingProviderModelRegistrationHint, add an early-return check
for the legacy openai-codex alias (via normalizeProviderId). Instead
of suggesting a models.providers[] config entry that the config
validator rejects without baseUrl, the hint now points operators to
run openclaw doctor --fix for migration or check provider auth.

Fixes #100066

Co-Authored-By: Claude <noreply@anthropic.com>

* fix(agents): cover legacy Codex provider config hint

---------

Co-authored-by: Claude <noreply@anthropic.com>
Co-authored-by: Vincent Koc <25068+vincentkoc@users.noreply.github.com>
2026-07-06 06:21:49 +00:00
Peter Steinberger
133ca4b469 feat(skills): diagnose skill_workshop hidden by tool policy (#100654)
* feat(skills): diagnose skill_workshop hidden by tool policy (#87570)

Workshop can be enabled and auto-capturing while tools.profile hides the
skill_workshop tool; every inspection surface looked healthy. plugins
inspect and openclaw doctor now name the excluding policy layer (global/
agent/provider profile, allowlist, denylist) and the exact alsoAllow
grant to add, via a shared resolveSkillWorkshopToolPolicyAvailability
helper that /learn's guard now reuses instead of composing policy
itself. Diagnosis only; no policy behavior change.

* ci: retrigger
2026-07-06 07:21:08 +01:00
Sebastien Tardif
0d6a1dcb53 fix(install): trap SIGINT so Ctrl+C exits cleanly during upgrade doctor (#76386)
* style: restore exec approval e2e formatting

* fix(install): trap SIGINT so Ctrl+C exits cleanly during upgrade doctor

Three changes to fix the install script's Ctrl+C handling:

1. Add INT/TERM signal traps that clean up temp files and exit with
   the correct signal exit codes (130 for SIGINT, 143 for SIGTERM).

2. Preserve signal exit codes (>128) through run_quiet_step so the
   doctor path can distinguish user cancellation from normal errors.
   Non-signal failures still return 1, preserving existing caller
   semantics for all other installer steps.

3. Fix guardCancel in onboard-helpers.ts: exit(0) changed to exit(1)
   so Clack prompt cancellation (Escape/Ctrl+C) is treated as failure,
   not success. This prevents the installer from continuing with plugin
   updates after the user explicitly cancelled.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

* fix(install): abort dashboard launch on doctor cancellation

When a user cancels the interactive upgrade-doctor prompt (Clack
cancellation exits 1, SIGINT exits 130), clear should_open_dashboard
so the installer does not launch a dead dashboard after an incomplete
upgrade.

Also propagate non-zero exit from run_doctor() so the non-interactive
upgrade path correctly skips dashboard launch on failure.

* fix: guard every run_doctor caller and add focused tests

The existing-config path called run_doctor without checking its return
value, so a failed or cancelled doctor would still launch the dashboard.
Now both run_doctor call sites guard the return value with if-then.

Adds focused tests verifying: every run_doctor caller is guarded,
dashboard flag is cleared on doctor failure, signal exit codes
propagate through run_quiet_step, and SIGINT (exit 130) triggers
abort_install_int.

* retrigger proof check

* fix: exit 130 on Clack cancellation so installer treats it as SIGINT

guardCancel now exits with 130 (SIGINT convention) instead of 1. When
the user presses Ctrl+C at an interactive doctor prompt, the installer
sees doctor_exit=130 and calls abort_install_int, aborting cleanly
instead of continuing after exit 1.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

* fix: narrow exit 130 to doctor-prompter path only

Revert guardCancel to exit 0 by default (matching main) and pass
exit code 130 only from doctor-prompter where the installer needs
to distinguish user cancellation from normal failures.

This preserves the existing cancellation behavior for configure,
wizard, gateway, and daemon prompts while keeping the SIGINT
convention for the installer's doctor subprocess.

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>

---------

Signed-off-by: Sebastien Tardif <sebtardif@ncf.ca>
Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:19:44 +00:00
Peter Steinberger
62d957634c fix(agents): cap effective compaction reserve (#100621)
* fix(agents): cap effective compaction reserve

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>

* docs(changelog): link small-context compaction fix

---------

Co-authored-by: Vincent Koc <vincentkoc@ieee.org>
2026-07-06 06:49:44 +01:00
qingminlong
ae4a1e236f fix(pdf): reject fractional page selections (#99399)
* fix(pdf): reject fractional page selections

* chore: refresh pdf fractional page checks

* chore: refresh failed checkout checks

* test(pdf): prove fractional pages fail at tool boundary

* test(pdf): cover mixed fractional page ranges

* fix(pdf): validate page selections before loading

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:46:32 +01:00
cxbAsDev
924f93eee0 fix(update-check): wrap malformed npm view JSON parse in try/catch (#100338)
* fix(update-check): wrap malformed npm view JSON parse in try/catch

* proof(update-check): use real fake-npm executable in proof script

* test(update-check): focus malformed JSON coverage

---------

Co-authored-by: Peter Steinberger <steipete@gmail.com>
2026-07-06 06:43:11 +01:00
Wynne668
7e81f15961 fix: keep heredoc exec bodies out of command summaries (#99379) 2026-07-06 05:41:29 +00:00
Peter Steinberger
dd972b8bf7 fix: replies fail when memory flush is exhausted (#100618)
* fix(reply): recover from memory flush exhaustion

Co-authored-by: 忻役 <xinyi@mininglamp.com>

Co-authored-by: Jerry-Xin <jerryxin0@gmail.com>

* test(reply): remove unused memory flush result

---------

Co-authored-by: Jerry-Xin <jerryxin0@gmail.com>
2026-07-06 06:41:16 +01:00
krissding
e183d665ee fix(infra): add NaN guard for unparseable timestamp in session-cost-usage (#99420)
new Date(parsed.timestamp).getTime() can return NaN for unparseable
strings. Without a guard, NaN silently propagates into downstream
usage/cost calculations and corrupts billing data.

Add Number.isNaN(timestamp) check, falling back to 0 (same default
as the path when no timestamp key is present).

Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-07-06 05:41:07 +00:00
ooiuuii
f7f1be276a Harden macOS SQLite WAL checkpoints (#99067) 2026-07-06 05:40:58 +00:00
Masato Hoshino
09b5cdc17f improve(doctor): warn when cron jobs keep failing consecutive runs (#99606)
* improve(doctor): warn when cron jobs keep failing consecutive runs

* improve(doctor): message restart-interrupted runs in the chronic cron failure advisory
2026-07-06 05:40:55 +00:00
pick-cat
7c9c2ef0c3 fix(infra): enforce maxBytes in body-less HTTP error snippet path (#99340)
* fix(infra): enforce maxBytes in body-less HTTP error snippet path

* chore: rebase to trigger CI after boundaries check fix

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.7 <noreply@anthropic.com>
2026-07-06 05:40:52 +00:00
cxbAsDev
5dbad1102f fix(sessions): log warning when parseJsonlEntries skips malformed JSONL lines (#98669)
* fix(sessions): log warning when parseJsonlEntries skips malformed lines

* fix(sessions): also warn in buildSessionInfo for malformed JSONL lines

* fix(sessions): warn in parseSessionEntries for malformed JSONL lines

* test(sessions): add warning regression tests for parseSessionEntries

* test(sessions): add parseJsonlEntries warning regression test

Add test verifying parseJsonlEntries logs warning for malformed JSONL
lines via loadEntriesFromFile, covering the second of three instrumented
session JSONL readers.

Co-Authored-By: Claude <noreply@anthropic.com>

* test(sessions): update parseSessionEntries warning expectations after rebase

* style(sessions): remove unnecessary type assertion in test

* test(sessions): add buildSessionInfo warning regression tests via SessionManager.list

---------

Co-authored-by: Claude <noreply@anthropic.com>
2026-07-06 05:40:21 +00:00