Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
443 commits
Select commit Hold shift + click to select a range
699fe55
fix(#854): apply rewind membership in the pager so a suffix cut keeps…
acoliver Oct 11, 2026
29457bc
fix(#854): atomic streamed history replacement via replace transactio…
acoliver Oct 11, 2026
7973e9b
Merge review fixes F10 F11 F16 (#854)
acoliver Oct 11, 2026
1645036
Merge review fixes F6 F7 (#854)
acoliver Oct 11, 2026
9cb9aa4
Merge review fixes F8 F12 F13 (#854)
acoliver Oct 11, 2026
b4830de
fix(#854): production pager applies replace transactions (review F6)
acoliver Oct 11, 2026
6487652
fix(#854): replace transactions for remaining rewind-then-rows writer…
acoliver Oct 11, 2026
1143bb2
fix(#854): type the crash-boundary writer test (review F6)
acoliver Oct 11, 2026
596b849
test(#854): converge the retained-growth baseline before per-checkpoi…
acoliver Oct 11, 2026
7b29057
Merge review fix F13 proof convergence (#854)
acoliver Oct 11, 2026
da082b9
fix(#854): scalar history length follows replace-transaction membersh…
acoliver Oct 11, 2026
6c52626
test(#854): Responses projection adaptation failure releases prepared…
acoliver Oct 11, 2026
f83b4e7
fix(#854): bounded exact streaming estimation for official and legacy…
acoliver Oct 11, 2026
d6a9dc9
fix(#854): carry the open tail tool group instead of re-reading it pe…
acoliver Oct 11, 2026
a1cb262
fix(#854): reproject a tool group cut by a rewind from its surviving …
acoliver Oct 11, 2026
ae6da46
Merge residual review fixes (a) (#854)
acoliver Oct 11, 2026
04b876c
Merge residual review fixes (b) (#854)
acoliver Oct 11, 2026
92f6727
Merge residual review fixes (c) (#854)
acoliver Oct 11, 2026
bb7972e
Merge remote-tracking branch 'origin/main' into issue854
acoliver Oct 11, 2026
33a227d
fix(#854): emit hook_call telemetry for snapshot BeforeModel/AfterMod…
acoliver Oct 11, 2026
d3ad5dc
test(#854): fix E2E dumpcontext plugin test and read chunked request …
acoliver Oct 11, 2026
f47dc6d
test(#854): pass hook script data as argv operands and stop echoing e…
acoliver Oct 11, 2026
b0bbf6b
test(#854): Linux Bun EISDIR errors carry no path; assert the code only
acoliver Oct 11, 2026
7215ba4
test(#854): built-output tests probe via env/argv and run from the sc…
acoliver Oct 11, 2026
c95c8ab
style(#854): prettier historySpanWindow
acoliver Oct 11, 2026
f5f87d1
test(#854): tests use the runner temp root, not gitignored package tm…
acoliver Oct 11, 2026
f153f92
test(#854): pin the vercel lease request model and assert detached ro…
acoliver Oct 11, 2026
e9a38d7
Merge CI fixes: test temp roots, CodeQL, dist-dependent tests, Linux …
acoliver Oct 11, 2026
0a01980
fix(#854): default the scrollback pager off until it can render live …
acoliver Oct 11, 2026
58c6567
Merge: default the scrollback pager off until it can render live turn…
acoliver Oct 11, 2026
2bbfe6a
test(#854): spy on waitForCommitSequence, the call the journal store …
acoliver Oct 11, 2026
608a141
fix(#854): split the agents test shard into three CI partitions
acoliver Oct 11, 2026
38f2978
test(#854): keep history test helpers under __tests__/support so the …
acoliver Oct 11, 2026
ea6c2a0
test(#854): run the Node ACP startup probe from the scripts shard, wh…
acoliver Oct 11, 2026
49ca7fd
test(#854): dumpcontext runtime-plugin test uses an in-test plugin in…
acoliver Oct 11, 2026
60276ba
test(#854): settle the source large-row heap sample over three GC rounds
acoliver Oct 11, 2026
0cc75aa
Merge agents shard fixes: commit-sequence spy, three agents partition…
acoliver Oct 11, 2026
1dc0a7f
fix(#854): journal density passes as one density_mutation record, not…
acoliver Oct 11, 2026
1352355
fix(#854): each turn sends the system prompt it resolved
acoliver Oct 11, 2026
260189a
test(#854): oversized-run oracle avoids the tiktoken wasm trap; EISDI…
acoliver Oct 11, 2026
74f10fa
test(#854): interactive subagent harness supplies the live runtime co…
acoliver Oct 11, 2026
6e58817
test(#854): released-caller client array cases assert the store owns …
acoliver Oct 11, 2026
bf401a3
test(#854): abort-during-pending test holds a finalizer instead of pa…
acoliver Oct 11, 2026
2a78454
test(#854): keep collecting while an observed reader is still reachab…
acoliver Oct 11, 2026
f45cdf8
test(#854): client pending-prefix ownership test runs with a live wri…
acoliver Oct 11, 2026
030119a
fix(#854): dump plugin stub throws without a generator or lint directive
acoliver Oct 11, 2026
0e6ea95
ci(#854): split the scripts test shard into three CI partitions
acoliver Oct 11, 2026
8948043
test(#854): warm the full-size preflight path before the baseline; re…
acoliver Oct 11, 2026
e0f7dd2
Merge CI fixes: agents shards a1/a3 (#854)
acoliver Oct 11, 2026
0582687
Merge CI fixes: agents shard a2 and core (#854)
acoliver Oct 11, 2026
4419dc0
test(#854): journalCursor oversized-entry release polls bounded GC cy…
acoliver Oct 11, 2026
0b61475
fix(#854): source-no-projection test uses a transport stub instead of…
acoliver Oct 11, 2026
70feac3
test(#854): split the client array parity cases across three files so…
acoliver Oct 11, 2026
95c8204
test(#854): pending-window body test runs with a live writer and spli…
acoliver Oct 11, 2026
cb07cb4
test(#854): port semantic-purge production body test to the source tu…
acoliver Oct 11, 2026
e2237dc
test(#854): census probe sweeps and settles before reading
acoliver Oct 11, 2026
a04d04c
test(#854): keep Gemini body capture out of agents test support so th…
acoliver Oct 11, 2026
98cedde
test(#854): keep collecting at each row sample until only the current…
acoliver Oct 11, 2026
c0b22cf
ci(#854): balance scripts test partitions by recorded duration and ru…
acoliver Oct 11, 2026
d3f8c14
test(#854): split semantic purge body cases per provider and gate ret…
acoliver Oct 11, 2026
c8371e8
test(#854): satisfy lint in the semantic purge case registrar
acoliver Oct 11, 2026
3e4fd0e
fix(#854): stop the Responses body path amplifying memory per input item
acoliver Oct 11, 2026
f979be6
test(#854): settle heap gates with gcAndSweep and gate the median of …
acoliver Oct 11, 2026
46475c9
test(#854): projection ownership heap gate settles with gcAndSweep an…
acoliver Oct 11, 2026
e002d25
Merge heap-gate method fixes: shared settled-heap helper (#854)
acoliver Oct 11, 2026
3c8f909
test(#854): token usage and source measurements settle with the share…
acoliver Oct 11, 2026
cd4af44
test(#854): progressive retry and serializer probe settle with settle…
acoliver Oct 11, 2026
8395b0c
test(#854): WeakRef collection gates poll with collectedWithin instea…
acoliver Oct 11, 2026
050c7c4
test(#854): move the serializer probe under __tests__ so its test-uti…
acoliver Oct 11, 2026
5e37a64
test(#854): R3 warm-up converges on window medians and runs past the …
acoliver Oct 11, 2026
62c6cee
test(#854): in-flight scaling gate counts live rows, segments and rea…
acoliver Oct 11, 2026
cce62ac
test(#854): R3 proof gates accumulation on the late measured window s…
acoliver Oct 11, 2026
f035f19
test(#854): split the R3 retained-growth proof into per-worker files …
acoliver Oct 12, 2026
0e25682
Merge origin/main (#3842 owner/port refactor) into issue854 (#854) [W…
acoliver Oct 12, 2026
7556a46
fix(#854): merge follow-up: no Array.fromAsync; restore streamed hist…
acoliver Oct 12, 2026
8d4bd25
test(#854): merge follow-up: media-history harness lives in test support
acoliver Oct 12, 2026
bab1937
wip(#854): merge follow-up: port test fixtures to owner/port API (par…
acoliver Oct 12, 2026
48d20a1
wip(#854): merge follow-up: fixture port round 2; fix hook disposal a…
acoliver Oct 12, 2026
e490223
wip(#854): merge follow-up: fixture port complete; origin fan-out fou…
acoliver Oct 12, 2026
020e662
fix(#854): best-effort log flush no longer waits behind withheld stri…
acoliver Oct 12, 2026
aa8fe6a
wip(#854): per-origin recorder fan-out: hidden primary, filtered mirr…
acoliver Oct 12, 2026
49da3c4
fix(#854): profile adoption stages a differing candidate as an open r…
acoliver Oct 12, 2026
9cdc235
fix(#854): deliver small publications to history mirrors directly, in…
acoliver Oct 12, 2026
4d2051c
fix(#854): merge follow-up: lint clean after #3842 merge (split overs…
acoliver Oct 12, 2026
7385ae8
fix(#854): merge follow-up: port stale cli/core/providers fixtures; r…
acoliver Oct 12, 2026
22d05fa
fix(#854): port providers fixtures to the #3842 owner, retry and tele…
acoliver Oct 12, 2026
2d90a65
fix(#854): align zed-acp resume fixtures with #3842 session lifecycle
acoliver Oct 12, 2026
a1b94c4
fix(#854): merge follow-up: keep empty new sessions unmaterialized, a…
acoliver Oct 12, 2026
3331b21
fix(#854): alias runtime owner fixture installer to satisfy hooks lint
acoliver Oct 12, 2026
054aebe
fix(#854): merge follow-up: thread the compressing owner's history or…
acoliver Oct 12, 2026
1948f0e
fix(#854): port scripts body-oracle fixtures to the explicit invocati…
acoliver Oct 12, 2026
4fd536e
test(#854): port checkpoint/reinitialize body oracles to owner APIs; …
acoliver Oct 12, 2026
5ac32c2
fix(#854): report the underlying recording startup failure instead of…
acoliver Oct 12, 2026
41ef3af
fix(#854): restart an adopted recording on its original file after re…
acoliver Oct 12, 2026
bea4249
test(#854): port recording identity and facade chat channel fixtures …
acoliver Oct 12, 2026
a818458
fix(#854): port compression fixtures to the prepared-invocation and e…
acoliver Oct 12, 2026
d9d0e6d
style(#854): satisfy lint and prettier for recording startup changes
acoliver Oct 12, 2026
a9307fa
fix(#854): keep the recorded history service across profile chat rest…
acoliver Oct 12, 2026
49ddf9f
fix(#854): keep the agent system instruction on load-balancer member …
acoliver Oct 12, 2026
a75965a
fix(#854): hydrate recorded media from the archive while resuming a s…
acoliver Oct 12, 2026
2e3bab9
test(#854): bind the character-count tokenizer through the client tok…
acoliver Oct 12, 2026
4ba9036
test(#854): port runtime context, memory probe and finalizer join fix…
acoliver Oct 12, 2026
461db0a
test(#854): reset the process scratch root with the bootstrap scenari…
acoliver Oct 12, 2026
9efa458
test(#854): write context-limit through the named-parameter owner and…
acoliver Oct 12, 2026
4f168b0
test(#854): build retained-array and deferred-source clients through …
acoliver Oct 12, 2026
a0ba9b6
fix(#854): keep setClientTools a no-op when neither a tool selection …
acoliver Oct 12, 2026
c4d9428
fix(#854): source preflight fixtures pass the tokenizer factory; aban…
acoliver Oct 12, 2026
23a1d14
test(#854): source processor fixture supplies the live runtime-policy…
acoliver Oct 12, 2026
b018e08
test(#854): conversation logging mode sets logPrompts, which owner-po…
acoliver Oct 12, 2026
a27d0e2
test(#854): retained-growth workload keeps the history on its default…
acoliver Oct 12, 2026
44bb979
test(#854): move transform-value fixtures under __tests__/support so …
acoliver Oct 12, 2026
51a3080
fix(#854): restore runtime-boundary ratchet for agents and cli after …
acoliver Oct 12, 2026
099c142
fix(#854): keep the subagent launch failure path to one bundle-typed …
acoliver Oct 12, 2026
c9300f8
test(#854): model-profile chat double supports clearHistoryForDisposal
acoliver Oct 12, 2026
ba45fdb
test(#854): agent carry probe observes client-replacement admission t…
acoliver Oct 12, 2026
22cb88e
test(#854): history report client double accepts overrides so replace…
acoliver Oct 12, 2026
debc576
test(#854): lifecycle chat doubles support clearHistoryForDisposal
acoliver Oct 12, 2026
38ce5a3
test(#854): retained-array owners fixture types the detached client b…
acoliver Oct 12, 2026
455c9eb
test(#854): carried acknowledgement failure is observed through the s…
acoliver Oct 12, 2026
eaf86cf
test(#854): drive the Node ACP startup probe through the built CLI entry
acoliver Oct 12, 2026
83a47e0
Merge remote-tracking branch 'origin/main' into lint854
acoliver Oct 12, 2026
7d12f52
style: apply prettier formatting to drifted files
acoliver Oct 12, 2026
38172f6
fix(google-gemini): forward fetch.preconnect without static member as…
acoliver Oct 12, 2026
1cb2034
test(#854): carry failure and source transaction tests follow the sin…
acoliver Oct 12, 2026
3463b76
test(#854): port dumpcontext runtime-plugin e2e to owner/port runtime…
acoliver Oct 12, 2026
f48a1b1
test(#854): await log flush in logToolCall tests now that eager logs …
acoliver Oct 12, 2026
02034dd
fix(providers): keep Bun ambient globals out of the production type p…
acoliver Oct 12, 2026
ed22802
fix(#854): use current copyright year in chatSessionProviderResolution
acoliver Oct 12, 2026
aab7e4f
fix(#854): abandoned unacknowledged exports release the root join wit…
acoliver Oct 12, 2026
64a83c7
test(#854): wait for owner B's child display before reading it
acoliver Oct 13, 2026
5694835
refactor(#854): move runner partition selection into bun-test-partition
acoliver Oct 13, 2026
68e8f0b
fix(#854): give each o200k counter its own pre-tokenizer regex so con…
acoliver Oct 13, 2026
f8f00f5
fix(#854): keep replace transactions from being interleaved by other …
acoliver Oct 13, 2026
45068c3
fix(#854): do not record chronology again for rows a resume leaves un…
acoliver Oct 13, 2026
700578a
fix(#854): restore the previous recording when a resume fails after p…
acoliver Oct 13, 2026
45edcea
fix(#854): bound the fan-out pump by record sequence, not by the comm…
acoliver Oct 13, 2026
2de3304
fix(#854): translate rewinds and inserts into each origin mirror and …
acoliver Oct 13, 2026
6fc29dd
fix(#854): fan-out pump folds only appended records into a disk-backe…
acoliver Oct 13, 2026
d82c3a6
fix(#854): resumed transcript is prepended to the history instead of …
acoliver Oct 13, 2026
bff4614
fix(#854): await journal disposal and raise recorder and scratch clea…
acoliver Oct 13, 2026
f81d25d
fix(#854): run every prior-history release step when disposing the re…
acoliver Oct 13, 2026
8743269
fix(#854): a failing BeforeModel hook is logged and the request goes …
acoliver Oct 13, 2026
f2ab6fe
fix(#854): request body logging is skipped for exporters that cannot …
acoliver Oct 13, 2026
b6acc08
fix(#854): /restore rolls project files back when the history commit …
acoliver Oct 13, 2026
f8ba63a
fix(#854): conversation logging never fails a completed turn and aban…
acoliver Oct 13, 2026
29d7d3c
test(#854): A1 golden wire-body corpus for the provider send paths
acoliver Oct 13, 2026
08be40c
test(#854): A2 peak-during-send probe with array and fill traps
acoliver Oct 14, 2026
798fe12
fix(#854): A3 Content-Length on the Responses disk text route (closes…
acoliver Oct 14, 2026
874a845
fix(#854): B1 random-access readAt on provider request rows and provi…
acoliver Oct 14, 2026
e98d679
fix(#854): B2 KeyedRowIndex; ToolPairIndex becomes a user of it
acoliver Oct 14, 2026
c33df94
fix(#854): B3 WireBodySpool and withSpooledJsonHttpBody
acoliver Oct 14, 2026
7cc709b
fix(#854): B4 jsonValueChunks sync chunk API and EnvelopeWriter
acoliver Oct 14, 2026
b1cfb0c
fix(#854): B5a extract prompt segment writers
acoliver Oct 14, 2026
cec4ff5
fix(#854): B5b anthropic-messages protocol and system key in the sour…
acoliver Oct 14, 2026
c25f528
fix(#854): C1 openai provider Responses route onto the disk text route
acoliver Oct 14, 2026
253a7d5
fix(#854): C2 Responses calls without request rows go through the dis…
acoliver Oct 14, 2026
6106d45
fix(#854): C3 delete the lazy and array Responses machinery
acoliver Oct 14, 2026
416a98e
test(#854): sendPeak measures retained growth across repeated sends, …
acoliver Oct 14, 2026
6ac33a4
fix(#854): D1 streaming tool-id mapper over a pluggable store
acoliver Oct 14, 2026
81e526f
fix(#854): D2 chat body builder over the streaming id mapper; the dum…
acoliver Oct 14, 2026
5f7e7aa
fix(#854): D3a OpenAI chat sends a spooled body built one row at a time
acoliver Oct 14, 2026
6a187a0
fix(#854): D3b chat estimate from estimator-form segment files
acoliver Oct 14, 2026
327f7f1
fix(#854): D3c+D4 chat dumps stream from the spool and continuation s…
acoliver Oct 14, 2026
f13c080
test(#854): sendPeak retained gate uses a Theil-Sen trend over repeat…
acoliver Oct 14, 2026
00b7178
fix(#854): D5 Kimi file pre-pass reads rows one at a time; uploads go…
acoliver Oct 14, 2026
847950c
fix(#854): E1 indexed Anthropic message table with prev links and use…
acoliver Oct 14, 2026
905be01
fix(#854): E2 build Anthropic wire blocks into the indexed message ta…
acoliver Oct 14, 2026
a33c66f
fix(#854): E3 post-table passes and cache controls run on the message…
acoliver Oct 14, 2026
e166759
fix(#854): E4 Anthropic sends a spooled body emitted from the indexed…
acoliver Oct 14, 2026
0b47b4e
fix(#854): E5 Anthropic projection, estimate and dumps from segment f…
acoliver Oct 14, 2026
f49d462
fix(#854): E6 image-dimension recovery rebuilds the spool under a bud…
acoliver Oct 14, 2026
58149a1
fix(#854): F1 remove the remaining history-array seams; only Vercel a…
acoliver Oct 14, 2026
9db6293
fix(#854): sweep dead scratch roots once when a process creates its f…
acoliver Oct 14, 2026
cbcb654
fix(#854): move bun:test kits out of production src and guard against…
acoliver Oct 14, 2026
ba2947e
fix(#854): last-resort tool-response truncation decides all replaceme…
acoliver Oct 14, 2026
9e8ff2d
fix(#854): captureRace parity fixture waits for the in-flight pending…
acoliver Oct 14, 2026
fa08a81
fix(#854): history statistics, context range and last content read in…
acoliver Oct 14, 2026
cb46f09
fix(#854): attaching a purged journal reads each purge record once in…
acoliver Oct 14, 2026
c8247bc
perf(#854): prompt-key writer fills a 64 KiB buffer instead of one wr…
acoliver Oct 14, 2026
9552ebe
perf(#854): detached journal gathers appends into bounded tail buffer…
acoliver Oct 14, 2026
0811634
perf(#854): provider normalization checks the scratch directory per r…
acoliver Oct 14, 2026
d1b0567
perf(#854): provider normalization index probes read one slot window …
acoliver Oct 14, 2026
e7f58fa
test(#854): count buffered I/O through call-through spies so the new …
acoliver Oct 14, 2026
4185448
perf(#854): provider normalization keeps each stage's rows in an appe…
acoliver Oct 14, 2026
c4b62cd
perf(#854): provider normalization answers lookups of never-stored fl…
acoliver Oct 14, 2026
5a78cd5
perf(#854): provider normalization builds its counter schema once ins…
acoliver Oct 14, 2026
a671205
perf(#854): chunked o200k counting takes runs of small pieces as one …
acoliver Oct 14, 2026
0d1051f
perf(#854): tool output limiting skips tokenizing output whose byte c…
acoliver Oct 14, 2026
34ac769
fix(#854): import dumpSDKRequestContext as a type where only its type…
acoliver Oct 14, 2026
1761dca
fix(#854): resume closes a replacement the previous process left open
acoliver Oct 14, 2026
d690f2f
fix(#854): disk-route model hooks stop when project trust is withdrawn
acoliver Oct 14, 2026
838ab2e
fix(#854): clear and tail-removal rollback restore each row under its…
acoliver Oct 14, 2026
605ff99
fix(#854): cloned and forked journals close a replacement left open i…
acoliver Oct 14, 2026
ce0686c
fix(#854): every rollback restores rows under the origin each had bef…
acoliver Oct 14, 2026
590213d
style(#854): apply repo formatter
acoliver Oct 15, 2026
941fd1a
test(#854): responses write tests follow the owner-spool and buffered…
acoliver Oct 15, 2026
212de1e
fix(#854): a call aborted before it starts releases its prepared Open…
acoliver Oct 15, 2026
230f556
test(#854): dump bounds use ten preregistered pairs so one GC outlier…
acoliver Oct 15, 2026
8931971
test(#854): hard-limit tool body test gives the far response a real t…
acoliver Oct 15, 2026
f99b756
test(#854): hard-limit and fallback body fixtures weigh the far respo…
acoliver Oct 15, 2026
7061b52
perf(#854): a streamed request reserves each stored media item once i…
acoliver Oct 15, 2026
838c9e0
fix(#854): keep provider projection constants immutable and the provi…
acoliver Oct 15, 2026
36a114c
test(#854): structural audit mutation control follows the async Histo…
acoliver Oct 15, 2026
5dd2e24
test(#854): compression characterization estimators read the sealed R…
acoliver Oct 15, 2026
29c6b87
test(#854): BeforeModel body observer settles before facts are read, …
acoliver Oct 15, 2026
b5843bc
test(#854): adopted recording restart expects no chronology_bind for …
acoliver Oct 15, 2026
04c3ed4
fix(#854): a detached capture reads row origins from the pin it folds…
acoliver Oct 15, 2026
9a52af9
fix(#854): a stage row log returns its append buffer once its rows ar…
acoliver Oct 15, 2026
4baeb91
test(#854): characterization stateful tests expose their assertions t…
acoliver Oct 15, 2026
a0ba9c5
perf(#854): a detached mutation takes row origins from the fold it al…
acoliver Oct 15, 2026
674e522
fix(#854): a history mutation resolves only after every fan-out mirro…
acoliver Oct 15, 2026
b97cb7b
test(#854): fan-out retention gate ignores a stale stack slot and has…
acoliver Oct 15, 2026
3353ad8
fix(#854): resolver scratch dirs are removed with plain unlink and rm…
acoliver Oct 15, 2026
c5d349e
test(#854): GC retention checks settle through a few collections and …
acoliver Oct 15, 2026
bf901f8
chore(#854): drop the generated design PDF from the tree
acoliver Oct 15, 2026
7af93f0
chore(#854): restore NOTICES.txt line endings
acoliver Oct 15, 2026
5640228
ci(#854): run shell tests on the first scripts partition whatever the…
acoliver Oct 15, 2026
20efc09
chore(#854): keep agents test helpers out of the published package
acoliver Oct 15, 2026
dfec9d6
fix(#854): cancelling a request-log receipt keeps the exporter stall …
acoliver Oct 15, 2026
3b808d1
chore(#854): delete the unused turn request artifact path and its tests
acoliver Oct 15, 2026
6843637
chore(#854): delete unused fireBeforeModelHook and its decision helper
acoliver Oct 15, 2026
29033c2
chore(#854): delete the never-assigned AgentClient._previousHistory a…
acoliver Oct 15, 2026
d37841a
chore(#854): move test-only oracles (boundary recovery, array admissi…
acoliver Oct 15, 2026
819e5f6
chore(#854): delete the TopDownTruncationStrategy array compress and …
acoliver Oct 15, 2026
15ecce1
chore(#854): delete the OneShot array compress; tests use the disk path
acoliver Oct 15, 2026
7c69162
chore(#854): delete the MiddleOut array compress; tests use the disk …
acoliver Oct 15, 2026
acc8d37
chore(#854): delete the HighDensity array compress; tests use the dis…
acoliver Oct 15, 2026
a2658da
test(#854): compression memory exclusion test reads disk summary rows…
acoliver Oct 15, 2026
c9b6d69
test(#854): partition guard regex without backtracking
acoliver Oct 15, 2026
c6deb4b
fix(#854): check IDE mode before touching history and read only the l…
acoliver Oct 15, 2026
36df2bd
fix(#854): resume transcript window honors historyMaxItems and histor…
acoliver Oct 15, 2026
2d40c90
fix(#854): /chat clear and /chat debug count history from the stats, …
acoliver Oct 15, 2026
c1a440c
fix(#854): restoreTurns returns the remaining history as a journal st…
acoliver Oct 15, 2026
4604613
fix(#854): owner /chat restore and checkpoint resume replay up to the…
acoliver Oct 15, 2026
884327a
test(#854): IDE fixture tail reader avoids Array.prototype.at, which …
acoliver Oct 15, 2026
0fa7ba5
perf(#854): resume skips the media store lock for rows without media
acoliver Oct 15, 2026
c1e0da2
fix(#854): api_request carries the request size on every send
acoliver Oct 15, 2026
45c3317
fix(#854): hook blocks, aborts and context overflow are not api_error
acoliver Oct 15, 2026
ec7bbe5
chore(#854): delete the unreachable bounded request-artifact telemetr…
acoliver Oct 15, 2026
6e7912f
test(#854): bounded memory while staging a request artifact
acoliver Oct 15, 2026
7ee03ac
docs(#854): journal-as-database design
acoliver Oct 16, 2026
24e2c7e
test(#854): phase 0 frozen wire corpus (5,000 seeds per provider form…
acoliver Oct 16, 2026
2645717
test(#854): phase 0 Anthropic length-model harness checked against th…
acoliver Oct 16, 2026
970b5ed
test(#854): phase 0 OpenAI chat length model (plain, Kimi, Mistral) c…
acoliver Oct 16, 2026
781deab
test(#854): phase 0 Responses length model checked against the frozen…
acoliver Oct 16, 2026
7521e34
feat(#854): phase 1a journal file format codecs and old-journal refusal
acoliver Oct 16, 2026
d3c7264
fix(#854): phase 1a format: u32 header length, slot kinds, empty-labe…
acoliver Oct 16, 2026
fab7d65
feat(#854): phase 1b journal writer, full flush, trailer search, corr…
acoliver Oct 16, 2026
60c06a3
feat(#854): phase 2a row tree, summary composition, bulk build, path …
acoliver Oct 16, 2026
9b369e0
feat(#854): phase 2b id trie, node cache, bulk build, id facts (ns 0-6)
acoliver Oct 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
5 changes: 3 additions & 2 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -267,14 +267,14 @@
- name: 'Install shellcheck' # Actionlint uses shellcheck
run: |-
mkdir -p "${RUNNER_TEMP}/shellcheck"
curl -sSLo "${RUNNER_TEMP}/.shellcheck.txz" "https://github.com/koalaman/shellcheck/releases/download/v${SHELLCHECK_VERSION}/shellcheck-v${SHELLCHECK_VERSION}.linux.x86_64.tar.xz"

Check warning on line 270 in .github/workflows/ci.yml

View workflow job for this annotation

GitHub Actions / Lint (YAML)

270:121 [line-length] line too long (189 > 120 characters)
tar -xf "${RUNNER_TEMP}/.shellcheck.txz" -C "${RUNNER_TEMP}/shellcheck" --strip-components=1
echo "${RUNNER_TEMP}/shellcheck" >> "${GITHUB_PATH}"

- name: 'Install actionlint'
run: |-
mkdir -p "${RUNNER_TEMP}/actionlint"
curl -sSLo "${RUNNER_TEMP}/.actionlint.tgz" "https://github.com/rhysd/actionlint/releases/download/v${ACTIONLINT_VERSION}/actionlint_${ACTIONLINT_VERSION}_linux_amd64.tar.gz"

Check warning on line 277 in .github/workflows/ci.yml

View workflow job for this annotation

GitHub Actions / Lint (YAML)

277:121 [line-length] line too long (184 > 120 characters)
tar -xzf "${RUNNER_TEMP}/.actionlint.tgz" -C "${RUNNER_TEMP}/actionlint"
echo "${RUNNER_TEMP}/actionlint" >> "${GITHUB_PATH}"

Expand All @@ -284,7 +284,7 @@
run: |-
actionlint \
-color \
-format "{{range \$err := .}}::error file={{\$err.Filepath}},line={{\$err.Line}},col={{\$err.Column}}::{{\$err.Filepath}}@{{\$err.Line}} {{\$err.Message}}%0A\`\`\`%0A{{replace \$err.Snippet \"\\\\n\" \"%0A\"}}%0A\`\`\`\\n{{end}}" \

Check warning on line 287 in .github/workflows/ci.yml

View workflow job for this annotation

GitHub Actions / Lint (YAML)

287:121 [line-length] line too long (243 > 120 characters)
-ignore 'SC2002:' \
-ignore 'SC2016:info' \
-ignore 'SC2129:' \
Expand Down Expand Up @@ -524,7 +524,7 @@
uses: 'actions/cache@55cc8345863c7cc4c66a329aec7e433d2d1c52a9' # ratchet:actions/cache@v6
with:
path: 'node_modules/.cache/eslint'
key: ${{ runner.os }}-eslint-${{ hashFiles('packages/*/src/**', 'packages/*/package.json', 'packages/*/tsconfig.json', 'scripts/**', 'evals/**', 'integration-tests/**', 'eslint.config.js', 'eslint-rules/**', 'package.json', 'package-lock.json', 'bun.lock', 'tsconfig.json', 'tsconfig.scripts.json', '*.js', 'test-setup/**', '.github/workflows/**', '.github/scripts/**') }}

Check warning on line 527 in .github/workflows/ci.yml

View workflow job for this annotation

GitHub Actions / Lint (YAML)

527:121 [line-length] line too long (382 > 120 characters)

- name: 'Run linter'
run: |
Expand All @@ -539,7 +539,7 @@
if [[ -n "$lint_full_run_reason" ]]; then
echo "::notice::Lint running full: $lint_full_run_reason"
fi
if [[ "$selector_result" == "success" && "$lint_full_run" != "true" && -n "$lint_targets" && "$lint_targets" != "null" ]]; then

Check warning on line 542 in .github/workflows/ci.yml

View workflow job for this annotation

GitHub Actions / Lint (YAML)

542:121 [line-length] line too long (137 > 120 characters)
# Scoped run: the runner derives --cache args centrally from the
# LLXPRT_LINT_CACHE env (it also reads the target list from env),
# so no cache flags are passed on the CLI.
Expand Down Expand Up @@ -587,7 +587,7 @@
- name: 'Install shellcheck'
run: |-
mkdir -p "${RUNNER_TEMP}/shellcheck"
curl -sSLo "${RUNNER_TEMP}/.shellcheck.txz" "https://github.com/koalaman/shellcheck/releases/download/v${SHELLCHECK_VERSION}/shellcheck-v${SHELLCHECK_VERSION}.linux.x86_64.tar.xz"

Check warning on line 590 in .github/workflows/ci.yml

View workflow job for this annotation

GitHub Actions / Lint (YAML)

590:121 [line-length] line too long (189 > 120 characters)
tar -xf "${RUNNER_TEMP}/.shellcheck.txz" -C "${RUNNER_TEMP}/shellcheck" --strip-components=1
echo "${RUNNER_TEMP}/shellcheck" >> "${GITHUB_PATH}"

Expand Down Expand Up @@ -1042,7 +1042,7 @@
# An empty list means the API call failed, not that the PR changed
# nothing: fail open and run the gate (mirrors doc_change_filter).
if [[ ! -s "${files_json}" ]] || grep -Eq \
'^(scripts/|packages/[^/]+/run-bun-tests\.ts$|packages/[^/]+/bun-preload\.ts$|packages/auth/src/__tests__/|packages/cli/bin/|packages/(cli|core)/test/.*run-bun-tests|packages/agents/test-bun/|\.github/workflows/(ci|nightly)\.yml$|bun\.lock$|package(-lock)?\.json$|tsconfig[^/]*)' \

Check warning on line 1045 in .github/workflows/ci.yml

View workflow job for this annotation

GitHub Actions / Lint (YAML)

1045:121 [line-length] line too long (293 > 120 characters)
"${files_json}"; then
echo "affected=true" >>"${GITHUB_OUTPUT}"
else
Expand Down Expand Up @@ -1283,8 +1283,9 @@

- name: 'Run shell-script behavioral tests (#2606)'
# Shell-script tests are not workspace-scoped; run them once on the
# scripts shard to avoid duplicating across every leg.
if: matrix.shard == 'scripts'
# scripts shard (its first partition leg) to avoid duplicating them
# across every leg.
if: matrix.shard == 'scripts' && startsWith(matrix.partition, '1of')
env:
CI: true
run: npm run test:shell
Expand Down
6 changes: 4 additions & 2 deletions docs/agent-api.md
Original file line number Diff line number Diff line change
Expand Up @@ -281,8 +281,10 @@ inject rules of its own.

### History, stats, and compression

`getHistory`, `setHistory`, `addHistory`, `restoreHistory`, and `resetChat`
manage conversation history. `compress(opts?)` runs context compression.
`streamHistory(signal?)` reads conversation history through a scoped async
iterator. `Agent.getHistory()` has been removed. Exhaust the iterator or call
`return()` when stopping early. `setHistory`, `addHistory`, `restoreHistory`,
and `resetChat` mutate history. `compress(opts?)` runs context compression.
`getStats()` returns `SessionStats` and `onStats(cb)` subscribes to updates.
`listProviders()` and `listTools()` are instance-scoped discovery helpers.

Expand Down
15 changes: 15 additions & 0 deletions docs/cli/configuration.md
Original file line number Diff line number Diff line change
Expand Up @@ -454,6 +454,21 @@ In addition to a project settings file, a project's `.llxprt` directory can cont
- **Default:** `1048576`
- **Requires restart:** No

- **`ui.scrollbackPagerEnabled`** (boolean):
- **Description:** Serve transcript history from the bounded scrollback pager over the session journal (alternate screen buffer). Read once at startup; a live toggle applies on restart.
- **Default:** `false`
- **Requires restart:** Yes

- **`ui.scrollbackMarginViewports`** (number):
- **Description:** Scrollback pager residency margin, in viewports beyond the visible window, kept before off-screen rows are evicted. Read once at startup.
- **Default:** `2`
- **Requires restart:** Yes

- **`ui.scrollbackByteFloorKiB`** (number):
- **Description:** Scrollback pager residency byte floor in KiB: off-screen eviction stops once resident rows shrink to this size. Read once at startup.
- **Default:** `256`
- **Requires restart:** Yes

- **`ui.memoryImportFormat`** (string):
- **Description:** Format for importing memory files (tree or flat).
- **Default:** `"tree"`
Expand Down
246 changes: 246 additions & 0 deletions docs/migration/history-raw-stream.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,246 @@
# Raw history API migration

`HistoryService.getRawHistory(): readonly IContent[]` has been removed. This
breaks external code that calls the method, overrides it, or derives a type from
its return value. There is no eager replacement or compatibility method.

Use `streamRawHistory(signal?: AbortSignal)` to process rows as they arrive:

```typescript
for await (const row of history.streamRawHistory(signal)) {
await processRow(row);
}
```

The cursor captures journal membership on its first `next()` call. Later
appends do not become part of that traversal. Rows are borrowed read-only inputs.
Pending caller-owned rows can retain their object identity; durable rows are
journal values. Keeping a row or a copy after delivery makes it the consumer's
retained owner. A consumer that manually drives an iterator must call `return()`
in cleanup when it stops early. Cancellation is checked when iteration resumes.

Use `IContent` for the row type rather than a return type derived from the removed
method. Read-only diagnostics should fold the cursor to scalar results. Full
history mutations need an addressed candidate or the scoped `transformRows`
source and sink, rather than an array read followed by replacement.

Continuous high-density optimization now invokes `optimizeRows` over a pinned
disk snapshot through `HistoryService.optimizeDensityRows`. Its row, path,
call-ID, inclusion and recency decisions live on disk. The existing
`HighDensityStrategy.optimize` and `applyDensityResult` array contracts remain
available for explicit array callers. They are separate from this production
route and still carry their collection ownership.

Repository tests that need whole-fixture assertions use the explicitly eager
`test-utils/collect-raw-history` helper. It collects a cursor into a test-owned
array and is not a production migration pattern. Avoid replacing the removed
method with `getAll`, an array-backed iterator, or another full-history wrapper.

## Public agent and client readers

`Agent` and `AgentClientContract` require `streamHistory(signal?)`. External
implementations must provide the method. `Agent.getHistory()` has been removed;
use the scoped stream instead. `AgentClientContract.getHistory()` and
`getHistory(false, signal?)` now return the same cold raw-row stream. Exhaust the
stream or call `return()` to close its reader. Implementations of the client
contract must return an async generator, not a promise of an array.
`ChatSession.getHistory()`, `getHistory(false, signal?)`, and the corresponding
`ConversationManager` and `AgentChatContract` methods now return cold raw-row
streams too. This is an internal return-type change: callers must consume rows
asynchronously. `getHistory(true, signal?)` remains a separate curated stream.
Direct chat reads do not wait for the chat to become idle. Pending rows keep
their caller identity and ownership costs until their writers settle.

CLI `/chat debug` counts the default client stream. API session clear captures
that stream into a disk candidate, keeps the first complete human-led turn, and
resets from a disk prefix. Its rollback snapshot reserves reference media until
replacement or rollback ownership settles, then releases those reservations.
No full transcript array is passed to reset or rollback. CLI chat clear/restore
also capture a scoped disk candidate, determine the same human-turn boundaries,
validate the retained prefix, and persist the rewind before publishing from disk.
Reference media remain reserved until publication or rollback settles. Restore
updates UI items incrementally after publication, including thinking blocks and
the display emoji filter. It no longer returns a full `load_history` payload.
Initialized array updates and deferred startup no longer retain a second chat
history array. Streamed replacements and rollback estimate tokens for the active
runtime model. Explicit array input APIs still have their own ownership costs.

An active client waits for its selected chat to become idle before opening that
chat's raw journal cursor. Membership is pinned when the underlying reader opens,
not when `streamHistory` is called. Cancellation is checked before and after the
idle wait; it does not interrupt an idle promise already in flight. An inactive
client snapshots its retained deferred history to disk on first traversal, or
opens the stored journal when no deferred history exists. Replacing deferred
history does not change an open snapshot. The snapshot holds serialized row
values rather than original caller identities. The existing deferred input array
and its media admission remain owned by the client until its normal lifecycle
releases them.

Exhaustion, early return, source failure and resumed cancellation close the
reader. Abort alone cannot unwind a consumer paused between `next` calls. Raw
rows and metadata are not curated. ACP live replay and configuration's
post-authentication history-count report use this method directly, without a
full-history result array. ACP tool-pair tracking still has its existing pending
ID Map, so this change does not certify bounded whole-replay metadata.

The agent facade's carried startup consumes `AgentClient.streamHistory()` with
`setHistoryFromSource()` before calling `startChat()` without an extra-history
array. Detached admission completes its durable acknowledgement before startup.
Admission failure leaves the carried journal available; startup failure keeps
it available for retry. Existing explicit array input APIs still retain their
caller-owned inputs until their lifecycle releases them. Repository value tests
use the explicitly eager, test-only `collectAgentHistory` recipient; production
readers must not use it.

## Asynchronous history merge

`HistoryService.merge(other)` now returns `Promise<void>`. Await it to observe
publication or a rejected transaction:

```typescript
await history.merge(other);
```

The target mutation FIFO captures its previous membership, then captures the
source membership in a scoped disk snapshot. Capture happens when the queued
mutation executes, after any compression lock is released. A source mutation
after capture cannot change the candidate. Self-merge appends the pinned rows
once; repeated merges still append duplicates, matching the former `addAll`
behavior. Zero-block source rows are skipped. Existing timestamps and chronology
markers survive, while unmarked accepted source rows receive new markers.

A rejected publication compensates admitted journal operations and restores
chronology and token accounting before queued target mutations run. Pending
source and target rows retain their caller identities. Those pending owners can
grow with unsettled work. Durable candidate rows are serialized to disk, and
durable publication advances one row at a time. The existing synchronous
`addAll(readonly IContent[])` contract remains an explicitly array-owned API.

`SessionPersistenceService.saveRows` consumes an asynchronous row source into a
temporary session file and renames it after successful traversal. Each row uses
the existing media admission and reservation lifecycle; queue accounting charges
encoded writes under the configured byte limit. Traversal failure leaves the
previous target intact. The media probe supplies its single accepted journal row
to this method and counts settled history with a scalar. Neither operation reads
`getAll`.

## Public `transformAll` callback

`HistoryService.transformAll` now takes the same scoped asynchronous source and
sink callback as `transformRows`. Its callback returns `Promise<void>`, not a
history array. The method still returns `Promise<void>` and accepts a model name
and batch options, including cancellation:

```typescript
await history.transformAll(async (source, sink) => {
let index = 0;
for await (const { row } of source.streamRows()) {
sink.appendRetained(index++, row);
}
});
```

The source is repeatable and ordered. Omitting rows removes them; sink append
order determines output order. Use `appendDetached` for changed row values or
insertions. It serializes a sanitized value immediately without stamping the
caller object. `appendRetained(index, row)` verifies unchanged speaker and blocks;
metadata changes are allowed. It keeps pending caller identities and serializes
durable values. Empty raw rows can be retained, while newly appended rows must
pass the existing batch validation.

`appendBorrowed` and `appendIdentity` both retain the exact caller row strongly
until the transaction ends. Its original chronology marker is also held strongly
for rollback, including marker displacement followed by GC. These operations
accept whole histories and large rows, but their ownership grows with what the
caller chooses to pin. They cannot certify bounded retained memory. No input or
row size limit was introduced.

Source and sink handles expire when the callback completes. Exhaustion, early
return and resumed cancellation release active reader rows. Candidate values
and rollback snapshots are disk-backed; publication and compensation preserve
membership, chronology, tokens and media participant rollback before queued
mutations run. Pending writer identities remain separate from bounded durable
history ownership. There is no array-callback compatibility route.

## Array batch publication and backpressure

`addBatch(readonly IContent[], modelName?, options?)` still returns
`Promise<void>`. It snapshots the input array, validates the whole batch,
estimates appended tokens, and emits one ordered `contentBatchAdded` event.
The event exposes detached values rather than caller row or chronology marker
identity. The previous history is captured and traversed through disk rows
instead of being materialized into a combined array.

Batch backpressure is explicit: pass `{ streamPublication: true }` to wait for
journal acknowledgements between admissions. An opted-in caller must not hold
the writer paused while awaiting the batch. Turn history commits,
`ConversationManager.recordHistory`, and extra-history loading use this option.
The default remains non-backpressured so publication and error compensation
can finish before a caller releases its writer. Synchronous `add` and `addAll`
contracts have not changed.

Submitting an array still introduces context-sized input ownership. Streaming
the event does not bound borrowed inputs or synchronous pending publication
queues. Use the scoped detached row-transform API for value-based publication
that does not require a complete caller array or exact caller marker identity.

## Scoped synchronous batch event

`contentBatchAdded` now supplies `HistoryBatchValues`, exported with
`HistoryBatchCursor` from Core. Its `length` is the complete appended suffix or
replacement cardinality. Read values synchronously during the listener:

```typescript
history.on('contentBatchAdded', (batch) => {
batch.withRows((cursor) => {
for (let item = cursor.next(); !item.done; item = cursor.next()) {
consume(item.value);
}
});
});
```

Only one cursor may be active on a batch at a time. Each listener can traverse
independently. Rows are read through disk without an array cache. Early
`cursor.return()`, callback failure, and dispatch completion release reader
ownership. Both handles expire at the end of their synchronous scope and drop
their source references. An asynchronous reader callback is unsupported.

The event name, native ordered synchronous dispatch, unsubscribe behavior,
reentrant mutation FIFO, token updates, and observer-failure compensation remain
unchanged. There is no array indexing, array iterator, shared row identity or
cross-listener mutation, and no readable retained handle after dispatch.
Consumers outside this checkout must migrate. A consumer that saves every
returned row creates its own unbounded collection. Complete large rows are
still accepted; the controlled fixture's 8 MiB cap is not a row-size limit.

## Deferred disk-source admission

`AgentClient.storeHistoryForLaterUse` also accepts a cold
`AsyncIterable<IContent>` and optional cancellation, decode-counter and
ownership instrumentation. This overload requires an inactive chat. CLI
`--continue` startup calls it through `restoreResumeBoot` and
`admitResumeHistorySource`, using `ResumeCursorBoot.streamRows()` rather than an
array materialization. The source is traversed in order, admitted for local
media one row at a time, and serialized with `appendDetached`.

Streamed admission prepares a separate disk journal. Previous membership is
copied through a scoped disk merge to preserve chronology reconciliation. The
client publishes the new service only after source traversal, token accounting
and the final durable acknowledgement finish. Source, tokenizer, write or
cancellation failures leave the previous client service visible. Scoped media
reservations are indexed on disk until the chat has adopted ownership; a failed
startup retains them for retry, and client disposal releases them.

This overload returns `Promise<void>`. Returned rows are obtained through
`streamHistory`, whose scoped snapshot contains detached journal values after
admission completes. Caller object and marker identity are not preserved by
this overload. An open snapshot survives a later replacement and must be
exhausted or returned by its consumer. There is no aggregate row-size rejection;
a valid single row larger than 8 MiB is accepted.

The eager array overload, `setHistory`, `resumeChat` and `restoreHistory` retain
their existing array contracts and ownership costs. Authentication rebuilds and
explicit array mutations have not been certified as bounded. The new
`HistoryBatchOptions.awaitDurableCommit` is opt-in: it awaits the final write in
a stream publication, while existing callers retain their previous defaults.
40 changes: 35 additions & 5 deletions docs/telemetry.md
Original file line number Diff line number Diff line change
Expand Up @@ -168,11 +168,14 @@ event and metric names use the `llxprt_code.*` prefix (the service name is
- `llxprt_code.tool_call`: each tool call (function, args, duration, success)
- `llxprt_code.hook_call`: hook execution (event name, input, output, duration)
- `llxprt_code.api_request`: provider API request. Includes `request_chars`
(character count of the request body) and token counts. The body itself is
omitted by default; it is included only when `telemetry.logApiBodies` is
enabled (and `telemetry.logPrompts` is `true`), truncated to
`telemetry.logApiBodyMaxChars` (default 4000).
- `llxprt_code.api_error`: provider API error
(the size of the request, see below). The body itself is omitted by default;
it is included only when `telemetry.logApiBodies` is enabled (and
`telemetry.logPrompts` is `true`), exported as `llxprt_code.api_request_chunk`
records and a closing `llxprt_code.api_request_complete` record.
- `llxprt_code.api_error`: provider API error, recorded when a request that
was handed to the provider fails. A request stopped before that point (a
BeforeModel hook block, an abort, a compression failure or a context
overflow) made no API call and is not recorded as one.
- `llxprt_code.api_response`: provider API response (token counts, latency,
`response_chars`). The response body is included only when
`telemetry.logApiBodies` is enabled and `telemetry.logPrompts` is `true`,
Expand All @@ -193,6 +196,33 @@ event and metric names use the `llxprt_code.*` prefix (the service name is
- `llxprt_code.extension_enable`: extension enabled
- `llxprt_code.extension_disable`: extension disabled

#### `request_chars`

`request_chars` on `llxprt_code.api_request` is set on every send, whether or
not API body logging is enabled. The two cases count different things:

- **Body logging off (the default):** the UTF-8 byte length of the JSON request
body the provider sent, which is its `Content-Length`. It covers the whole
wire body (messages, system prompt, tools and parameters). The provider
reports it once the body is complete and before it is transmitted, so no
second pass over the conversation is made to count it, and the event is
recorded at that point. The value is the same as a character count for ASCII
text and larger for other text.
- **Body logging on (`telemetry.logApiBodies` and `telemetry.logPrompts`):** the
number of characters (UTF-16 code units) in the exported request artifact,
which is the redacted, media-sanitized conversation JSON. The event is
recorded before the request is built.

The agent loop also records a body-less `llxprt_code.api_request` when it hands
the prepared request to the provider, which opens the API request span. It is
recorded before any body exists, so its `request_chars` is `0`; the size is on
the provider's `llxprt_code.api_request` for the same `prompt_id`.

The provider's value is `0` when the provider fails before it builds a request body (for
example, when credentials cannot be resolved). Earlier releases counted the
UTF-16 length of the JSON-serialized conversation rows only, excluding the
system prompt and tools.

### Metrics

- `llxprt_code.session.count` (counter): incremented once per startup
Expand Down
Loading
Loading