Commit graph

847 commits

Author SHA1 Message Date
777genius
91ccd75ddf fix(team-runtime): ignore stale launch advisories 2026-05-31 22:21:01 +03:00
777genius
67a2c9ebac fix(runtime): reduce provider timeout warning noise 2026-05-31 20:19:00 +03:00
777genius
71e5174082 test(i18n): cover expanded app locale set 2026-05-31 19:32:06 +03:00
777genius
705dea70f0 fix(team): remove mismatched task projection caches 2026-05-31 19:19:53 +03:00
777genius
9366c77046 fix(team): prune stale empty task projection caches 2026-05-31 19:10:18 +03:00
777genius
9ad258272d fix(team): clean corrupt task projection caches 2026-05-31 19:05:33 +03:00
777genius
e6d2a0baee fix(team): avoid oversized task projection cache loops 2026-05-31 19:01:02 +03:00
777genius
fcf9264193 fix(team): reject deleted task projection cache records 2026-05-31 18:51:20 +03:00
777genius
961691f477 fix(team): preserve cached task nested fields 2026-05-31 18:30:14 +03:00
777genius
aa068efc68 fix(team): preserve task projection cache shape 2026-05-31 17:49:32 +03:00
777genius
f5f22e50fb perf(team): persist task projection cache 2026-05-31 16:54:24 +03:00
777genius
9ffdb6468b perf(main): extend launch summary cache window 2026-05-31 12:57:31 +03:00
777genius
9c29b0f8f1 perf(main): refresh message feed cache in background 2026-05-31 12:44:39 +03:00
777genius
c85b0d94ce perf(main): cache task activity file reads 2026-05-31 11:11:01 +03:00
777genius
2866b10bbc perf(main): cache no-op task activity sync 2026-05-31 10:59:45 +03:00
777genius
dc3001f713 perf(main): reuse team task snapshots for UI reads 2026-05-31 10:22:11 +03:00
777genius
cb60fca258 perf(main): reuse runtime process rows across refreshes 2026-05-31 10:02:43 +03:00
777genius
4457c6f61b perf(main): cache team inbox reads 2026-05-31 09:44:12 +03:00
777genius
9924e447c8 fix(team): treat stale observe refresh marker as recoverable 2026-05-31 09:31:26 +03:00
777genius
8df2a8797b Merge remote-tracking branch 'origin/perf/team-page-lag-optimization' into HEAD
# Conflicts:
#	src/main/services/team/TeamProvisioningService.ts
#	src/renderer/components/sidebar/GlobalTaskList.tsx
#	src/renderer/components/sidebar/SidebarTaskItem.tsx
2026-05-31 09:15:26 +03:00
777genius
228ebd6454 perf(main): cache runtime command arg matches 2026-05-31 07:47:16 +03:00
iliya
a7a732e226 fix(team): guard runtime process row cache invalidation 2026-05-31 01:39:39 +03:00
iliya
867d5368e1 test(team): align lead session cache tests 2026-05-31 00:29:10 +03:00
iliya
76299a4e44 fix(team): align runtime telemetry tests with process rows 2026-05-31 00:14:16 +03:00
777genius
e90886316f perf(main): cache runtime resource telemetry 2026-05-30 23:59:56 +03:00
777genius
4b5a49e6e8 perf(main): share lead session tail reads 2026-05-30 23:19:15 +03:00
777genius
f4f42e2ca4 perf(main): avoid full team scans for global tasks 2026-05-30 23:14:42 +03:00
777genius
c2ab7a7ff4 perf(main): skip unchanged task resume locks 2026-05-30 22:47:52 +03:00
777genius
1f46a14a79 perf(main): trim runtime process liveness scans 2026-05-30 22:14:52 +03:00
777genius
4575255c28 perf(main): skip redundant task interval resume scans 2026-05-30 22:07:24 +03:00
777genius
e7d7b3014e perf(main): reduce runtime launch metadata work 2026-05-30 21:52:36 +03:00
777genius
d59865f300 perf(team): reduce runtime telemetry polling 2026-05-30 20:03:45 +03:00
777genius
b13ee56359 perf(team): cap global task projections earlier 2026-05-30 18:57:45 +03:00
777genius
304d0a5ef1 perf(team): avoid redundant task cache clone 2026-05-30 18:48:43 +03:00
777genius
a7606032fc fix(runtime): preserve provider status during refresh failures 2026-05-30 18:44:31 +03:00
777genius
a06423a574 fix(team): preserve live overlay in worker message pages 2026-05-30 18:44:12 +03:00
777genius
180bdb7575 perf(team): cache transcript affinity verdicts 2026-05-30 18:39:16 +03:00
777genius
9ed1988346 fix: refresh watch scope on provider fallback 2026-05-30 17:34:05 +03:00
777genius
06036460e9 fix: keep watch scope safe on provider errors 2026-05-30 17:11:31 +03:00
777genius
3b7b5dfd75 fix: preserve file lock acquire errors 2026-05-30 17:08:29 +03:00
777genius
a18009cc0f fix: keep created teams in watch scope 2026-05-30 16:51:47 +03:00
777genius
d43cd3a0db test: sort team config reader imports 2026-05-30 16:06:01 +03:00
777genius
8cb44cd793 perf: replace readline with a chunked line generator in team JSONL readers
readline.createInterface runs an expensive Unicode line-break regex + extra
stream/string-decoder machinery per chunk. The main transcript parser (parseJsonlStream)
already uses a buffer + manual newline split; these per-team readers still used readline.

Add readJsonlLines(): an async generator that yields a JSONL file's lines via a chunked
utf8 stream read + a plain '\n' split (drop-in for 'for await (const line of rl)'), so the
consumers' loop bodies are unchanged. Stream is utf8-decoded before splitting, so multi-byte
chars across chunk boundaries are safe; trailing CR (CRLF) is stripped; empty lines and a
final newline-less line are yielded, matching readline; breaking out of the loop destroys
the stream via the generator's finally.

Adopt it in MemberStatsComputer, TaskBoundaryParser, and FileContentResolver (file-history
scan). Behavior-identical (their existing tests pass: 18 + 6 + 12) plus 6 new tests for the
generator (CRLF, empty lines, no-trailing-newline, early break, multi-byte chunk boundary).

Note: session-browser readline paths (jsonl metadata extractor, metadataExtraction,
SessionContentFilter) are off the launch path and left as-is for now.
2026-05-30 15:58:09 +03:00
777genius
92f1000a4f test: cover transcript head metadata cache 2026-05-30 15:51:59 +03:00
777genius
127d31ba88 perf: cache unchanged team task reads 2026-05-30 15:51:15 +03:00
777genius
28a55416ca test: isolate runtime usage stubs from process table 2026-05-30 15:46:27 +03:00
777genius
61e2678a5d perf: cache team transcript head metadata 2026-05-30 15:26:09 +03:00
777genius
0a750a9fa8 perf: share a frozen team-summary snapshot instead of cloning on every listTeams
listTeams() deep-cloned ALL team summaries via structuredClone on every call -- even
cache hits and concurrent in-flight awaiters. A heap allocation sample of a launch
put this (listTeams -> cloneTeamSummaries -> structuredClone) as the single largest
memory allocator, driving heap churn + GC pressure during launch (this stand has ~158
teams, and listTeams is called constantly: startup, notification init, task projection,
IPC polls, provisioning).

Build ONE deep-frozen, independent snapshot per uncached load and hand the same
reference to the cache entry, in-flight awaiters, and every later reader. The single
cloneTeamSummaries keeps it independent of any cached config the loader returns;
freezing lets all readers share it safely. Audited every listTeams consumer -- all
iterate / map / filter / serialize, none mutate -- and the freeze turns any stray
future mutation into a loud error rather than silent cross-caller corruption.

TeamConfigReader 26/26 (added a frozen + same-reference regression test), and the
listTeams consumers (TeamDataService 116, CrossTeamService 26) all pass under frozen
summaries.
2026-05-30 15:25:26 +03:00
777genius
58dfac8377 fix: preserve runtime rss fallback when process table misses roots 2026-05-30 15:16:03 +03:00
777genius
f0797e2c12 perf: replace readline with a bounded chunked read in the affinity head scan
fileBelongsToTeam streamed the head window via createReadStream + readline. readline's
line iterator runs an expensive Unicode line-break regex and stream/string-decoder
machinery per chunk, which showed up as a top main-thread cost during launch (the line-
split regex alone was ~5.7% in the warm launch profile).

Replace it with a bounded chunked fs.read + a plain '\n' split. JSONL is strictly
newline-delimited and each line is trim()'d (so a trailing CR from CRLF is dropped),
so a '\n' split is cheaper and more correct (it will not split on a bare CR or a
Unicode line/paragraph separator inside a JSON string value, which readline would). A
StringDecoder preserves multi-byte UTF-8 sequences that straddle a chunk boundary.

Byte-identical semantics to the old loop: inspect up to TEAM_AFFINITY_SCAN_LINES
non-empty lines, first match wins via early break, and a final line is honored even
without a trailing newline. Reads in 64KB chunks so a team decided in its first lines
is not penalized by a huge file. Adds tests for CRLF endings + no-trailing-newline,
a multi-byte char straddling the 64KB boundary, and the 40-line window bound (21 pass).
2026-05-30 14:54:58 +03:00