Commit graph

624 commits

Author SHA1 Message Date
Mike
e300d4cbd5 perf: memoize MemberBadge, CurrentTaskIndicator, MemberPresenceDot, ReplyQuoteBlock, GlobalTaskList
Prevent unnecessary re-renders on these frequently-rendered components
that appear in MemberCard rows, activity feeds, and the sidebar task list.
2026-05-02 21:28:17 +05:00
Mike
8b30930c04 perf: memoize KanbanBoard, KanbanGridLayout, MemberCard, TaskRow, SidebarTaskItem
Wrap five hot-path components in React.memo to prevent unnecessary
re-renders when parent state changes don't affect their props.
2026-05-02 21:20:25 +05:00
Mike
2bda324e1a perf(renderer): stable callbacks and lazy-load large dialogs
Move toggleSidebarSessionSelection into SessionItem's own store
subscription, eliminating the inline arrow function prop that was
breaking its memo on every sidebar render.

Lazy-load LaunchTeamDialog (2918L) and CreateTeamDialog (2208L) in all
four host components (TeamDetailView, TeamListView, SchedulesView,
ScheduleSection). These dialogs are never needed at initial mount — they
only open on user action. Deferring their parse/compile saves ~175KB of
JS from the initial render path.
2026-05-02 21:10:24 +05:00
Mike
f764af17d8 perf(renderer): wrap heavy view components in React.memo
TeamDetailView (3166L), TeamListView (1180L), DateGroupedSessions (1117L),
and MarkdownViewer (1198L) were re-rendering on every parent render cycle.
Wrapping them in memo() prevents cascading re-renders when their props and
store subscriptions have not changed, targeting VSCode-level UI responsiveness.
2026-05-02 20:29:19 +05:00
777genius
e96f97d83d fix: stabilize team launch runtime status 2026-05-02 11:50:07 +03:00
777genius
46df757f49 fix(ci): resolve frontend validation failures 2026-05-02 00:12:02 +03:00
777genius
01b8161f41 fix(team): preserve explicit launch defaults 2026-05-01 23:43:36 +03:00
777genius
90aa2942f9 feat(task-logs): show codex native trace fallback 2026-05-01 22:43:11 +03:00
Zelen
ca21ab206e
fix(team): render agent error messages
* fix(team): render agent error messages

* test(team): cover agent error activity rendering

* fix(ci): clear ui lint gate

* test(team): reset config cache in relay suites

* test(team): harden mixed lane matrix waits

* test(team): harden ci-sensitive team assertions

---------

Co-authored-by: iliya <iliyazelenkog@gmail.com>
Co-authored-by: 777genius <quantjumppro@gmail.com>
2026-05-01 21:25:03 +03:00
777genius
8f1ee5603c fix(team): polish task log rendering 2026-05-01 20:27:08 +03:00
777genius
3240ea6406 fix: harden teammate runtime lifecycle handling 2026-05-01 12:23:10 +03:00
777genius
0ace2a6255 fix(team): harden opencode runtime status and effort UI 2026-04-30 23:11:22 +03:00
777genius
9fb9e5f66a chore: snapshot dev work sync state 2026-04-30 23:11:18 +03:00
777genius
7d08205a23 fix(ci): clean member work sync validation 2026-04-30 00:05:58 +03:00
777genius
ab459fbae0 feat(member-work-sync): show status in member details 2026-04-29 22:43:18 +03:00
iliya
ff333a95e8 chore: fix ui lint blockers 2026-04-29 15:39:10 +03:00
777genius
93532f3ff5 feat: expose agent teams control via MCP 2026-04-29 10:55:07 +03:00
777genius
756fd7f537 feat(team): refine team list status display 2026-04-28 23:15:32 +03:00
Илия
ec3740d9c8
Merge pull request #90 from 777genius/fix/provisioning-live-output-trace
feat(team): surface provisioning trace in live output
2026-04-28 17:49:18 +03:00
777genius
7bb24934a5 feat(team): enable task stall monitoring by default 2026-04-28 17:42:19 +03:00
777genius
28d0ab20c0 feat(team): support controlled opencode teammate relaunch 2026-04-28 17:42:19 +03:00
777genius
075976fd23 feat(team): surface provisioning trace in live output 2026-04-28 17:25:10 +03:00
Илия
2c2f84a00e
feat(team): make tmux optional for desktop teammates Merge pull request #89 from 777genius/feat/tmux-optional-process-backend
Merge pull request #89 from 777genius/feat/tmux-optional-process-backend
2026-04-28 16:42:43 +03:00
iliya
31ae128778 feat(team): make tmux optional for desktop teammates 2026-04-28 16:13:45 +03:00
Илия
a8d53ca5cb
fix(ci): restore dev validation 2026-04-28 16:08:05 +03:00
777genius
82f73e58c2 fix: improve team runtime recovery and launch settings 2026-04-28 12:08:01 +03:00
777genius
8f7712ed74 fix(team): improve opencode task log rendering 2026-04-27 23:50:23 +03:00
777genius
376480b84f feat(team): improve stall monitor signals 2026-04-27 20:01:05 +03:00
777genius
212cd37d3f feat(team): improve runtime lane presence state 2026-04-27 17:40:13 +03:00
777genius
9fe9f81046 feat(team): add worktree readiness checks 2026-04-27 13:46:11 +03:00
777genius
11d5851953 perf(team): defer task log stream work until opened 2026-04-27 12:20:16 +03:00
777genius
068e473d2d fix(team): clear delivered runtime message warnings 2026-04-27 11:15:57 +03:00
777genius
b67168a9e8 fix: show opencode teammate replies in messages 2026-04-26 21:35:48 +03:00
777genius
610bfc561d feat(opencode): persist teammate worktree context 2026-04-26 12:31:15 +03:00
777genius
49982a1db8 feat: improve opencode model verification ux 2026-04-26 10:21:18 +03:00
777genius
238900f3cf feat(runtime-provider-management): expand opencode setup UI 2026-04-25 23:36:28 +03:00
777genius
427f48dd71 merge: integrate runtime compatibility notices 2026-04-25 20:28:36 +03:00
777genius
523d450bc8 feat(app): improve runtime provider and tmux flows 2026-04-25 17:28:56 +03:00
iliya
75f9e6bcec feat: add teammate runtime compatibility notices and test coverage 2026-04-25 17:19:30 +03:00
777genius
19b6937446 feat(opencode): harden delivery and provider UI 2026-04-25 14:30:10 +03:00
777genius
2f37be4bd0 fix(opencode): harden runtime projection delivery 2026-04-25 00:41:27 +03:00
777genius
4d1a6149b0 Merge branch 'dev' into feat/opencode-semantic-messaging-seam
# Conflicts:
#	agent-teams-controller/src/internal/crossTeam.js
#	mcp-server/src/tools/messageTools.ts
#	mcp-server/src/tools/taskTools.ts
#	src/main/services/team/opencode/bridge/OpenCodeReadinessBridge.ts
#	src/main/services/team/opencode/e2e/OpenCodeProductionE2EEvidence.ts
#	test/main/services/team/OpenCodeProductionE2EEvidence.test.ts
#	test/main/services/team/OpenCodeProductionGate.live.test.ts
#	test/main/services/team/OpenCodeReadinessBridge.test.ts
2026-04-24 22:48:59 +03:00
777genius
64c9ddc78c feat(opencode): add semantic messaging seam 2026-04-24 22:41:16 +03:00
777genius
3fe9a24e41 feat(team): harden launch liveness and recovery 2026-04-24 22:34:08 +03:00
777genius
1f557712f1 fix: handle opencode project evidence prepare 2026-04-24 20:53:22 +03:00
777genius
ebb7b5289d fix: harden team runtime liveness 2026-04-24 20:52:26 +03:00
777genius
d517f2b320 feat(team): harden member runtime liveness 2026-04-24 16:18:12 +03:00
777genius
1c07e0fdb6 feat(team): expand opencode review and release support 2026-04-24 12:05:54 +03:00
777genius
bc2e1e43d8 feat: refine team provisioning and task log UX 2026-04-24 00:40:11 +03:00
777genius
55b369de96 fix(ci): stabilize team runtime lane validation 2026-04-23 22:17:20 +03:00
777genius
501074e8c3 fix(team): stabilize opencode launch and task logs 2026-04-23 21:08:28 +03:00
777genius
9ebc4368d0 fix: stabilize opencode team launch recovery 2026-04-23 18:27:03 +03:00
777genius
f036cf0386 fix(team): prefer persisted join state over missing live entries 2026-04-23 03:01:34 +03:00
777genius
e8ebe68576 fix(team): keep member launch labels consistent 2026-04-23 02:22:20 +03:00
777genius
0821b182e2 fix(team): keep member detail launch labels honest 2026-04-23 02:14:32 +03:00
777genius
53d45c5e30 fix(team): keep launch loader for runtime-pending members 2026-04-23 01:56:38 +03:00
777genius
76fca31fb1 fix(team): make launch summary copy honest 2026-04-23 01:40:51 +03:00
777genius
8cd3f04c20 fix(team): align permission-blocked launch state 2026-04-23 01:05:54 +03:00
777genius
2b96adda33 fix(team): avoid stale launch join mismatches 2026-04-23 00:51:34 +03:00
777genius
d3baf501f6 fix(team): keep launch join state aligned with pending roster 2026-04-23 00:47:37 +03:00
777genius
9005deb05c fix(team): prefer live launch truth over stale summary 2026-04-23 00:30:01 +03:00
777genius
2db49d694c fix(team): harden team launch and create flows 2026-04-23 00:21:26 +03:00
777genius
5ab14682a2 feat(team): support mixed runtime lanes and improve preflight UX 2026-04-22 20:10:20 +03:00
777genius
185789cc0a fix(opencode): tighten readiness and create-team preflight 2026-04-22 02:14:23 +03:00
777genius
94b97c4930 fix(team): preserve worktree isolation in edit snapshots 2026-04-21 22:47:19 +03:00
777genius
708e1c3bf2 merge(team): integrate teammate worktree isolation ui 2026-04-21 22:35:32 +03:00
777genius
339fb072e5 feat(team): add teammate worktree isolation controls 2026-04-21 22:35:18 +03:00
777genius
796c529439 feat(runtime): add provider fast mode support 2026-04-21 22:22:47 +03:00
777genius
28b64ec467 fix(opencode): scope model preflight by provider 2026-04-21 21:22:40 +03:00
777genius
5e31bd1c06 feat(opencode): add team runtime integration 2026-04-21 20:28:22 +03:00
777genius
7b486b7fea feat(task-change-ledger): merge review hardening 2026-04-21 17:22:01 +03:00
777genius
c69b7e4212 feat(task-change-ledger): harden review flow 2026-04-21 17:21:29 +03:00
777genius
1db7e501a0 feat(teams): introduce fast mode configuration for Anthropic provider and enhance related UI components 2026-04-21 16:44:18 +03:00
777genius
331166216e feat(team-runtime): snapshot catalog-backed picker baseline 2026-04-21 15:29:23 +03:00
777genius
7a337b6268 feat(codex): add app-server model catalog 2026-04-21 12:45:34 +03:00
777genius
99102565f3 feat(ledger): integrate task change ledger functionality into file content resolution and review application processes 2026-04-21 12:25:42 +03:00
777genius
98a9c25cfe fix(validate): normalize provider backend ids 2026-04-20 22:07:02 +03:00
777genius
5683973c04 feat(codex): add app-server account management and polish native UX 2026-04-20 20:18:21 +03:00
777genius
8093201b78 Merge remote-tracking branch 'origin/dev' into spike/codex-native-runtime-plan
# Conflicts:
#	docs/research/codex-native-runtime-integration-decision.md
2026-04-20 19:42:49 +03:00
Илия
6929ab2a34
Merge pull request #75 from sardorb3k/perf/virtualization-threshold-tests
perf(team): enable virtualization past threshold + tests
2026-04-20 09:00:07 +03:00
777genius
63bc5ed866 fix(team): stabilize activity timeline virtualization 2026-04-20 08:59:38 +03:00
Mike
05f68ced44 perf(team): enable virtualization past threshold + tests
Final step of the virtualization plan. Turns the virtualized render
path on in production behind a row-count threshold, and adds regression
tests covering every gate.

- `VIRTUALIZATION_ROW_THRESHOLD = 60`. Short lists stay on the direct
  render path (no wrapper, no position: absolute, no measurement
  churn). Above the threshold the virtualizer takes over. Threshold is
  sized so conversations under ~one session of activity don't pay the
  virtualization cost; it activates once scrolling through a longer
  history.
- `shouldVirtualize` now requires `renderRows.length >= threshold` in
  addition to the existing opt-in and scroll-ref checks.
- `MessagesPanel` opts into virtualization for every layout it wires
  (inline / sidebar / bottom-sheet). The internal threshold then
  decides when to actually enable it, so callers don't need per-layout
  heuristics.
- Tests: adds a new `ActivityTimeline virtualization threshold` block
  covering (a) below-threshold list stays on the direct path,
  (b) no viewport → direct path regardless of count, (c) above
  threshold + viewport with `virtualizationEnabled` flips to the
  virtualized render path (simulated by clicking "show all" past
  pagination).

With this in, #70#74 combine to deliver:
- correct IntersectionObserver roots in scroll containers
- atomic render rows with stable keys
- windowed rendering with DOM-measured scrollMargin and measureElement
- auto-on when the cost of direct rendering actually shows up
2026-04-20 00:56:28 +05:00
Mike
b9c2dd5480 perf(team): measureElement + suppress remount animation on virtualized rows
Fifth step of the virtualization plan. Two small, coupled changes that
make the virtualized path stable without a merged-ref helper.

- Attach `rowVirtualizer.measureElement` to the existing virtualizer
  wrapper div. Because the wrapper carries no padding or margin, its
  bounding box matches the inner row, so the observer ref (which stays
  on the inner AnimatedHeightReveal node) and the measure ref (on the
  outer wrapper) address the same effective height. No merged ref
  callback is needed.
- Suppress mount-based entry animation inside the virtualized path.
  The virtualizer mounts and unmounts rows as the user scrolls them in
  and out; without this, the "new item" fade would replay every time
  an older row re-entered the viewport. `renderTimelineRow` now takes
  an optional `suppressEntryAnimation` flag and forwards `isNew=false`
  to both `LeadThoughtsGroupRow` and `MemoizedMessageRowWithObserver`
  when set. The direct render path is unchanged.

Still dormant in this release — `viewport.virtualizationEnabled` stays
false at every call site. PR #6 adds the threshold gate, tests, and
opt-in wiring.
2026-04-20 00:49:48 +05:00
Mike
7c4247bc73 perf(team): virtualizer skeleton + measured scrollMargin (gated)
Fourth step of the virtualization plan. Adds `useVirtualizer` wiring
with a DOM-measured `scrollMargin`, gated behind
`viewport.virtualizationEnabled`. Dormant in this release — no caller
flips the flag yet — so behavior is unchanged.

- Imports `useVirtualizer` from `@tanstack/react-virtual`. Fixed
  per-kind estimates (`ROW_SIZE_ESTIMATES`) drive `estimateSize`. Keys
  come from `row.key`, so row identity matches the renderRows model.
- `shouldVirtualize` requires all of: contract says enabled, a scroll
  element ref is present, and there is at least one row. Otherwise the
  render falls back to the direct `renderRows.map(...)` path from PR
  #72.
- Measures `scrollMargin` via `ResizeObserver` on both the scroll
  element and the timeline root, plus `scroll` and `resize` listeners,
  all rAF-batched. Avoids hand-summed heights that drift when
  composer/status/padding change.
- Virtualized path renders an absolute-positioned list inside a sized
  container (`height = getTotalSize()`). `translateY` subtracts
  `scrollMargin` so rows align to the timeline's own origin rather
  than the scroll container's top.

This PR intentionally does *not* enable `measureElement` (PR #5) or
flip `virtualizationEnabled` for any layout (PR #6) — both rely on
this wiring landing first.
2026-04-20 00:48:23 +05:00
Mike
a43fedcaab refactor(team): flatten ActivityTimeline render into atomic rows
Third step of the virtualization plan. Pure refactor — no UI change, no
virtualization yet. Prepares the timeline for row-level windowing.

- Introduces `TimelineRow`, a discriminated union of `session-separator`,
  `lead-thought-group` (pinned and non-pinned), `compaction-divider`,
  and `message-row`. Each row maps 1:1 to a single visual element.
- Adds a `renderRows` useMemo that walks `timelineItems` once and emits
  atomic rows, hoisting session separators out of the Fragment bundle
  that used to pair them with their owning item. This is the shape a
  windowing layer needs: each row measurable and addressable
  independently.
- Extracts a `renderTimelineRow(row)` helper that switches on `row.kind`
  and returns the same JSX the previous inline render produced. Logic
  per kind is identical — keys, memoization, collapse props, pinned
  thought "live" semantics — so there is no visual diff.
- The render body collapses from two blocks (pinned + `.slice().map()`)
  into a single `renderRows.map(renderTimelineRow)` call.

Follow-ups will virtualize `renderRows` with measured row heights and
tighten observer/animation wiring; pagination, collapse state, zebra
striping, and `groupTimelineItems` are untouched.
2026-04-20 00:47:02 +05:00
777genius
5d014b375b fix(runtime): tighten codex native-only phase 4 truth 2026-04-19 22:29:26 +03:00
777genius
1f7dd2100f refactor(runtime): remove legacy codex lanes 2026-04-19 22:22:13 +03:00
Mike
d4f518e8c5 refactor(team): viewport contract + observer root for ActivityTimeline
Second step of the virtualization plan. No virtualization yet. This PR
makes IntersectionObserver-based visibility tracking correct inside
scroll containers (sidebar, bottom-sheet), which is a prerequisite for
virtualizing the timeline.

- Introduces `TimelineViewport` — a grouped contract passed as a single
  `viewport` prop on `ActivityTimeline`. Holds `scrollElementRef`,
  `observerRoot`, `scrollMargin`, and `virtualizationEnabled`.
- `MessageRowWithObserver` and `LeadThoughtsGroupRow` now create their
  `IntersectionObserver` with `root = observerRoot?.current ?? null`
  instead of defaulting to the document viewport. Unread marking now
  fires when rows enter their real scroll parent.
- `MessagesPanel` resolves the active scroll owner from `position`
  (inline from parent ref, sidebar from `sidebarScrollRef`, bottom-sheet
  from `bottomSheetScrollRef`) and passes it into ActivityTimeline.
- Tests: stubs `IntersectionObserver` to capture `options.root` and
  asserts null when no viewport is passed, and the provided element when
  `viewport.observerRoot` is set.

`scrollMargin` and `virtualizationEnabled` are included in the contract
but not consumed yet — they land in follow-up PRs (#4/#5).
2026-04-20 00:17:04 +05:00
777genius
4cab3052eb Merge branch 'dev' of https://github.com/777genius/claude_agent_teams_ui into dev 2026-04-19 22:05:40 +03:00
777genius
41f0b0d1d1 feat(team): enhance TeamMessageFeedService caching and logging
- Introduced caching mechanism with expiration for message feeds to improve performance.
- Added logging for cache expiration events to aid in debugging.
- Updated MessagesPanel to reopen search bar when participant filters are active.
- Added test cases for handling tmux server errors and message panel behavior with filters.
2026-04-19 22:04:44 +03:00
777genius
83748673af fix(team): dedupe project path options 2026-04-19 21:49:40 +03:00
Mike
49e029163b refactor(team): wire scroll owners for MessagesPanel layouts
First step toward virtualizing ActivityTimeline. Makes the real scroll
container observable per layout, without changing behavior.

- `TeamDetailView` forwards `contentRef` to `MessagesPanel` as
  `inlineScrollContainerRef`. `MessagesPanel` accepts it as an optional
  prop (unused in this release) so a follow-up can wire the inline
  viewport to virtualization consumers.
- `MessagesPanel` creates `bottomSheetScrollRef` and passes it to
  `Sheet.Content scrollRef`. react-modal-sheet merges it with its
  internal scroll ref, so the element stays the same DOM node; this
  only exposes it to us.
- Sidebar already owns `sidebarScrollRef`; no change there.

Behavior is unchanged — this only exposes refs for the follow-up that
will thread a viewport contract into ActivityTimeline.
2026-04-19 23:41:33 +05:00
777genius
e90bdc5b7f feat(runtime): switch codex default to native with hidden fallback 2026-04-19 21:21:29 +03:00
777genius
52677b55d0 feat(team): enhance team messaging functionality and UI
- Integrated pending replies state management for team members.
- Updated TeamDetailView to initialize pending replies from state.
- Added logic to refresh team messages and member activity on tab focus.
- Improved UI components by increasing dialog content width for better layout.
- Enhanced member draft rows with avatar support for better visual representation.
- Implemented reconciliation logic for pending replies based on message history.
- Updated tests to cover new functionality and ensure reliability.
2026-04-19 20:57:13 +03:00
777genius
b5dfa14868 feat(runtime): enable codex-native limited internal unlock 2026-04-19 20:49:29 +03:00
777genius
30fce3c64d feat(runtime): surface codex-native internal rollout states 2026-04-19 19:41:36 +03:00
777genius
cd52660f88 feat: switch team member avatars to local assets 2026-04-19 17:33:44 +03:00
777genius
481965f1b4 feat(team): add relaunch flow and stabilize edit member colors 2026-04-19 16:46:56 +03:00
777genius
1e2241aead chore: checkpoint workspace before relaunch flow 2026-04-19 16:08:38 +03:00
777genius
fbf299f276 fix(team): update package manager and enhance member color handling
- Bumped pnpm version to 10.33.0 in package.json.
- Added existing members to EditTeamDialog for better context.
- Improved buildMemberDraftColorMap to reserve colors for existing members and predict colors for new drafts.
- Added tests to ensure color assignment logic works correctly for existing and new members.
2026-04-19 11:56:53 +03:00