Commit graph

786 commits

Author SHA1 Message Date
777genius
489e3eb967 fix(extensions): scope mcp renderer state by project 2026-04-17 14:28:25 +03:00
777genius
81c59440bf fix(extensions): harden mcp diagnostics output 2026-04-17 14:21:17 +03:00
777genius
fd4fd135a1 fix(extensions): hide gemini runtime card 2026-04-17 13:53:39 +03:00
777genius
22209ba958 feat(extensions): support multimodel global mcp scope 2026-04-17 13:23:30 +03:00
777genius
e01858ac98 feat(extensions): add codex-only skills overlays 2026-04-17 13:09:30 +03:00
777genius
f7c1dc16c4 fix(sidebar): polish project group headers 2026-04-17 12:43:51 +03:00
777genius
2bb290bf8a fix(tasks): default global task grouping to project 2026-04-17 10:15:41 +03:00
777genius
b3427a64ab feat(extensions): surface provider-aware capabilities in UI 2026-04-17 10:08:33 +03:00
777genius
f92b77e3af chore(merge): sync dev into team snapshot split spike 2026-04-17 08:54:27 +03:00
777genius
1de59cb84f fix(extensions): validate skill import source paths locally 2026-04-16 23:18:02 +03:00
777genius
2cc7dc5178 fix(extensions): validate skill folder names before review 2026-04-16 23:15:09 +03:00
777genius
1d2e33f5d9 fix(extensions): preserve skill detail refresh context 2026-04-16 23:13:22 +03:00
777genius
2201b54f28 fix(extensions): reset stale skill review state on close 2026-04-16 23:11:13 +03:00
777genius
2142518461 fix(extensions): avoid premature skill import folder defaults 2026-04-16 23:09:15 +03:00
777genius
86bc4ce4e8 fix(extensions): sanitize suggested skill folder names 2026-04-16 23:08:00 +03:00
777genius
4578f11dd7 fix(extensions): unlock structured skill editing after reset 2026-04-16 23:06:05 +03:00
777genius
3e5ec7c173 fix(extensions): preserve skill project context in dialogs 2026-04-16 23:03:55 +03:00
777genius
c02a12b3f6 fix(extensions): keep skill import destination in sync 2026-04-16 23:01:33 +03:00
777genius
66cf1443b2 fix(extensions): scope mcp operation state by install scope 2026-04-16 22:57:22 +03:00
777genius
bb60bbb0ec fix(ci): restore workspace validation 2026-04-16 22:52:56 +03:00
777genius
94291f50f0 fix(extensions): require project context for local mcp scope 2026-04-16 22:51:05 +03:00
777genius
a3c5b7dca9 fix(extensions): honor local mcp scope precedence 2026-04-16 22:48:43 +03:00
777genius
7418643dc9 fix(extensions): make mcp scope actions scope-aware 2026-04-16 22:45:34 +03:00
777genius
0420428281 fix(extensions): support project-scoped mcp installs 2026-04-16 22:39:03 +03:00
777genius
3f03bc720a fix(extensions): dedupe MCP detail API key lookups 2026-04-16 22:32:47 +03:00
777genius
0d6276ea0b fix(extensions): honor installed MCP targets in manage actions 2026-04-16 22:31:56 +03:00
777genius
acabe52ae7 fix(extensions): stop MCP browse auto-retries after errors 2026-04-16 22:28:08 +03:00
777genius
0d19e5174f fix(extensions): use tab project context for plugin actions 2026-04-16 22:22:05 +03:00
777genius
57f546bab0 fix(extensions): scope plugin operation state by install scope 2026-04-16 22:16:38 +03:00
777genius
821e23e633 Merge branch 'dev' into spike/team-snapshot-split-plan 2026-04-16 22:11:16 +03:00
777genius
4502152427 fix(extensions): support local plugin scope actions 2026-04-16 22:09:52 +03:00
777genius
afad52f506 fix(extensions): prevent stale plugin catalog races 2026-04-16 22:01:59 +03:00
777genius
6e875e5a40 fix(extensions): harden plugin action states 2026-04-16 21:59:23 +03:00
777genius
847643828d fix(extensions): make plugin actions scope-aware 2026-04-16 21:56:12 +03:00
777genius
82a0e3e6bb Merge branch 'dev' into spike/team-snapshot-split-plan 2026-04-16 21:03:13 +03:00
777genius
ece2991f96 feat(team): enhance team provisioning with runtime model handling
- Added support for live runtime model metadata in team provisioning.
- Implemented functions to extract and manage CLI flag values for team members.
- Updated member specifications to include effective models based on provider defaults.
- Enhanced UI dialogs to check selected providers in parallel, improving responsiveness.
- Added tests for handling model unavailability during team bootstrap and launch processes.
2026-04-16 21:02:33 +03:00
777genius
6cf0c0d65e chore(merge): sync dev into team snapshot split spike 2026-04-16 19:44:01 +03:00
777genius
ac1c99ac1f feat(cliInstaller): add model verification for providers
- Introduced CLI_INSTALLER_VERIFY_PROVIDER_MODELS IPC channel for on-demand model verification.
- Implemented handler for verifying provider models in the CliInstallerService.
- Enhanced CLI installation status management with model verification state and availability.
- Updated related components to support model verification feedback in the UI.
2026-04-16 19:41:23 +03:00
777genius
1173a4942a refactor(team): split team detail snapshot from messages activity 2026-04-15 21:54:38 +03:00
777genius
2cfbfef3b3 fix(team): recover root member session logs 2026-04-15 17:39:11 +03:00
777genius
8398d29fc0 fix(team): recover root member session logs 2026-04-15 17:38:21 +03:00
777genius
03dda6b486 refactor(agent-graph): replace store usage with context hooks for team data retrieval
- Updated components in the agent-graph renderer to utilize context hooks instead of the store for accessing team data.
- Introduced `useGraphActivityContext` and `useGraphMemberPopoverContext` hooks to streamline data management.
- Refactored `GraphBlockingEdgePopover`, `GraphNodePopover`, and `GraphTaskCard` components for improved performance and readability.
- Enhanced imports in `MemberDetailDialog` for better organization.
2026-04-15 16:42:05 +03:00
777genius
aed08113e6 feat(agent-graph): integrate stable slot layout for improved node positioning and interaction
- Added stable slot layout support in various components, enhancing the layout and interaction of nodes.
- Updated TypeScript configuration to include new paths for the agent-graph package.
- Refactored layout logic in activity lanes and kanban to accommodate stable slot assignments.
- Enhanced GraphView and GraphControls to support sidebar visibility toggling and owner slot drop handling.
- Introduced new types for layout management in GraphDataPort and related files.
- Updated README to include stable slot layout documentation.
2026-04-15 16:18:11 +03:00
777genius
af1caf90e8 Merge branch 'worktree/tmux-hybrid-installer-plan' into dev
# Conflicts:
#	docs/FEATURE_ARCHITECTURE_STANDARD.md
#	eslint.config.js
#	src/preload/index.ts
#	src/renderer/api/httpClient.ts
#	src/renderer/components/dashboard/TmuxStatusBanner.tsx
#	tsconfig.node.json
2026-04-14 22:11:41 +03:00
777genius
e5d85ec873 Merge branch 'dev' of https://github.com/777genius/claude_agent_teams_ui into dev 2026-04-14 22:07:15 +03:00
777genius
90b637c6d8 refactor: update README and security documentation; enhance activity lane layout and kanban integration 2026-04-14 22:06:50 +03:00
777genius
68378c603c feat: prioritize recent projects by explicit opens 2026-04-14 20:58:54 +03:00
777genius
ef44542f1d feat(tmux): add hybrid installer flow 2026-04-14 20:07:57 +03:00
777genius
db7c4fe160 fix: restore team project highlight matching 2026-04-14 18:40:17 +03:00
777genius
8a7c1a764b chore: clean team list view warnings 2026-04-14 18:24:13 +03:00
777genius
f7fb938d34 fix: remove team project priority banner 2026-04-14 18:23:42 +03:00
777genius
6f8099ad32 fix: align team card accent border width 2026-04-14 18:19:58 +03:00
777genius
0bbeac8c84 fix: keep team project selection as sort priority 2026-04-14 18:18:52 +03:00
777genius
43f2426a9b fix: sync team project filters with app selection 2026-04-14 18:10:09 +03:00
777genius
487dcabff5 fix: harden recent project and sidebar selection state 2026-04-14 17:54:23 +03:00
777genius
9fe3343038 fix: hide empty member message pagination 2026-04-14 17:25:58 +03:00
777genius
36a79f2586 fix: keep selected project visible in session selector 2026-04-14 17:10:23 +03:00
777genius
0dfd2fc610 fix: sync session project selector state 2026-04-14 16:58:00 +03:00
777genius
f0f43be064 fix: stabilize codex recent project selection 2026-04-14 16:52:44 +03:00
Илия
8b53f63e97 fix(team): preserve provider model ids and codex slash suggestions 2026-04-14 16:40:50 +03:00
Diego Serrano
15b2b655ea feat(chat): show project and user skills as slash command suggestions 2026-04-14 16:38:12 +03:00
Diego Serrano
43ae8ae6bc fix(extensions): resolve project path from both projects and repositoryGroups 2026-04-14 16:38:12 +03:00
777genius
c8f9d9bbdd refactor: migrate agent graph to feature slice 2026-04-14 16:24:09 +03:00
777genius
e99691ad3d Merge branch 'feat/codex-recent-projects' into dev 2026-04-14 16:07:18 +03:00
777genius
fad89e71da feat: add dashboard recent projects feature slice 2026-04-14 16:07:04 +03:00
Илия
f819dd0c27
fix(team): preserve provider model ids and codex slash suggestions 2026-04-14 14:56:29 +03:00
Diego Serrano
5375eea19f
feat(chat): show project and user skills as slash command suggestions 2026-04-14 14:37:27 +03:00
Diego Serrano
7d98956dad
fix(extensions): resolve project path from both projects and repositoryGroups 2026-04-14 14:37:04 +03:00
Diego Serrano
bda2e160f7
fix(team): prevent double [1m] suffix on model string during re-launch 2026-04-14 14:35:59 +03:00
777genius
0615badd79 fix(task-logs): preserve activity detail chunks 2026-04-13 21:13:58 +03:00
777genius
a0c8db4771 feat(graph-controls): integrate tooltip support, refine button styles, and enhance task creation functionality 2026-04-13 20:51:45 +03:00
777genius
ce0eb75429 feat(session-search): add search functionality and provider filtering to DateGroupedSessions component; enhance task activity detail rendering logic 2026-04-13 20:00:18 +03:00
777genius
804e92419f feat(activity-detail): implement task activity detail retrieval and UI integration 2026-04-13 19:19:52 +03:00
777genius
5b1f369950 chore: merge origin/dev into dev 2026-04-13 18:43:00 +03:00
777genius
07682eca37 feat(graph-controls): add team page and task creation buttons, improve toolbar button styles 2026-04-13 18:36:44 +03:00
777genius
dd4ce7e9b1 fix(ci): merge dev and restore green checks 2026-04-13 17:14:22 +03:00
777genius
a0d87872e7 fix(ci): restore PR #44 checks 2026-04-13 17:00:49 +03:00
777genius
6fbf8518dc feat(member-details): enhance member detail dialog with activity filtering and initial tab state 2026-04-13 17:00:20 +03:00
777genius
5b328a0f8a improvement: alot small improvements and fixes 2026-04-13 16:20:57 +03:00
777genius
674c1d8b13 feat(ui): polish messages timeline and graph toolbar 2026-04-13 10:41:23 +03:00
777genius
92dd9318a5 feat(messages): merge bottom sheet panel mode 2026-04-12 22:20:55 +03:00
777genius
cc45549716 feat(messages): add bottom sheet panel mode 2026-04-12 22:17:18 +03:00
777genius
9ca8055695 chore(workspace): checkpoint remaining claude team changes 2026-04-12 22:15:57 +03:00
777genius
32cea2a927 feat(task-logs): add board task activity and task log stream 2026-04-12 22:13:43 +03:00
777genius
f74b7a3701 fix(agent-graph): keep graph state consistent across panes 2026-04-12 20:15:52 +03:00
777genius
02d516cb4e fix: harden provider-aware cli env handling 2026-04-12 13:18:49 +03:00
777genius
fb21b982c6 fix(ci): restore green workspace checks 2026-04-12 00:02:59 +03:00
777genius
4869bb35da feat(agent-teams): harden dev bootstrap and task tooling 2026-04-11 21:57:59 +03:00
777genius
01e9e8350e feat(frontend): improve runtime connection and team setup ux 2026-04-11 19:55:25 +03:00
777genius
96739c41fc perf(renderer): reduce costly blur transitions 2026-04-11 10:05:27 +03:00
777genius
f1a8a343d4 feat(chat): render task notifications as cards 2026-04-11 10:05:20 +03:00
777genius
fafaca4a38 feat(chat): add copy actions for code blocks 2026-04-11 09:07:16 +03:00
777genius
35970000b6 feat(multimodel): unify provider catalog and branding 2026-04-10 22:36:32 +03:00
777genius
53bcea337f merge(main): integrate origin/main into spike/free-code-compat 2026-04-10 17:25:51 +03:00
777genius
3e74b11b23 feat(team): refine launch and cli status flows 2026-04-10 16:45:00 +03:00
iliya
0dd4746700 fix(team-ui): clarify launch progress and retry states 2026-04-10 12:28:52 +03:00
iliya
a03c22aace feat(team-ui): freeze unstable provider and model options 2026-04-10 12:28:22 +03:00
iliya
21e9fb8c90 feat(team-ui): clarify launch and retry member states 2026-04-09 21:16:24 +03:00
iliya
32ec3a6123 fix(team-data): dedupe passive user reply summaries 2026-04-09 21:15:50 +03:00
iliya
affd9ac748 perf(renderer): split noisy team detail subscriptions 2026-04-09 19:00:22 +03:00
iliya
0656794026 perf(renderer): isolate team detail summary subscription 2026-04-09 18:39:40 +03:00
iliya
17bd573ce3 fix(team-runtime): harden refresh flows and reduce ui churn 2026-04-09 16:34:55 +03:00
iliya
78d4c2826b fix(team): align idle inbox semantics across app 2026-04-08 17:45:09 +03:00
iliya
bbb653d3d4 fix(team): clarify cross-provider model labels 2026-04-07 13:03:58 +03:00
iliya
dd6f50cad6 fix(team): block lead relaunches and clarify log counts 2026-04-07 12:59:42 +03:00
iliya
7f737f985b fix(team): surface provider retries in reply UI 2026-04-07 12:42:37 +03:00
iliya
8ebde439a8 fix(team): treat online teammates as ready state 2026-04-07 12:29:21 +03:00
iliya
340e4d8c8b fix(team): add create action to empty state 2026-04-07 12:21:18 +03:00
iliya
55c381d26b fix(team): use teammate wording in launch summaries 2026-04-07 11:15:35 +03:00
iliya
1a27ef1ade fix(team): treat online teammates as ready 2026-04-07 11:11:45 +03:00
iliya
7842b5a01f fix(team): clarify teammate first-contact wording 2026-04-07 10:59:39 +03:00
iliya
3b0fe0bcbf fix(team): stop counting inbox noise as check-ins 2026-04-07 10:48:59 +03:00
iliya
c20fc1a312 feat(team): clarify teammate check-ins and retry state 2026-04-07 10:28:00 +03:00
iliya
d2cd655c11 fix(team): harden provisioning and team UI state 2026-04-06 21:28:22 +03:00
iliya
cf8df6b306 feat(app): show tmux install guidance on dashboard 2026-04-06 15:02:11 +03:00
iliya
84e0bdb03e fix member messages empty pagination state 2026-04-05 22:13:45 +03:00
iliya
9296ce3988 refine member message pagination 2026-04-05 22:07:09 +03:00
iliya
dc0627c285 fix message pagination consumers 2026-04-05 21:54:52 +03:00
Artem Rootman
5efc3dd63f
fix: pagination correctness and message enrichment
P1: Poller no longer overwrites nextCursor/hasMore — those belong
to the "Load older" flow. Both poller and loadOlder now dedup
messages by messageId or timestamp+from fingerprint.

P1: Cursor is now compound (timestamp|messageId) with stable
tie-breaking sort. Messages sharing the same timestamp at page
boundaries are no longer lost.

P2: getMessagesPage now applies the same enrichment as getTeamData:
leadSessionId propagation and slash-command-result annotation.

P3: Added 3 tests for getMessagesPage covering pagination, cursor
stability with same-timestamp messages, and slash command annotation.
2026-04-05 18:18:03 +00:00
Artem Rootman
270eb547cb
merge: add paginated messages API into oom-issues branch 2026-04-05 18:07:21 +00:00
Artem Rootman
0c0e0240a3
feat: paginated messages API (team:getMessagesPage)
New cursor-based IPC endpoint for the messages timeline panel:
- team:getMessagesPage(teamName, { beforeTimestamp?, limit? })
  returns { messages, nextCursor, hasMore }
- Cursor is timestamp-based — stable under live message insertion
- Default page size 50, max 200

getTeamData no longer includes messages in its response, eliminating
the ~1MB messages payload from every team refresh. Messages are now
fetched independently by MessagesPanel.

MessagesPanel changes:
- Fetches initial page on mount via getMessagesPage API
- Auto-refreshes newest page every 5s when team is alive
- "Load older messages" button for pagination
- Falls back to prop messages if API fails (graceful degradation)
2026-04-05 17:37:26 +00:00
Artem Rootman
a92390dcc6
style: fix import order in ExtensionStoreView
Move useShallow and lucide-react imports above @renderer/* imports
to follow the project import order convention.
2026-04-05 17:36:03 +00:00
Artem Rootman
f07eb914ae
merge: resolve conflicts with main (ExtensionStoreView, InstallButton)
Merged new fields from main (fetchCliStatus, cliStatusLoading,
openDashboard, authMissing, disableReason) into our useShallow
selectors.
2026-04-05 17:19:41 +00:00
Artem Rootman
e81116b85e
fix: apply exact reviewer suggestions for MemberLogsTab
- Move endRefreshing() outside the !cancelled guard in finally block
  so it always runs even when the effect is torn down mid-refresh.
- Only call load() when isTabActive or on first load — prevents
  unnecessary fetches when a hidden tab's effect re-runs.
2026-04-05 17:01:36 +00:00
Artem Rootman
0e83d99e0a
fix: address PR review feedback (6 issues)
Critical:
- findLogsForTask: call worker directly instead of wrapping in
  wrapTeamHandler, so failures propagate to catch and trigger the
  main-thread fallback correctly.
- TeamDataWorkerClient: scope error/exit handlers to the specific
  worker instance to prevent a stale worker's exit event from
  rejecting pending requests on a replacement worker (race condition).

Major:
- TeamDataWorkerClient: validate teamName and taskId before forwarding
  to worker thread (input sanitization).
- team-data-worker: include status, since, and intervals length in
  cache key to prevent stale results after filter changes.
- team-data-worker: move logsInFlight.delete() into .finally() so
  rejected lookups don't poison the in-flight map permanently.
- MemberLogsTab: reset refreshCountRef and refreshing state in effect
  cleanup to prevent the refresh indicator from latching on permanently
  when the effect tears down mid-refresh (e.g. on tab switch).
2026-04-05 16:59:44 +00:00
Artem Rootman
da58917032
perf: offload heavy I/O to worker thread, reduce renderer re-renders
Main process — worker thread for team data:
- New team-data-worker thread handles getTeamData and findLogsForTask,
  isolating heavy file I/O (scanning 300+ subagent JSONL files) from
  Electron's main event loop. getTeamData dropped from ~2000ms on the
  main thread to ~110ms via the worker.
- Worker-side dedup and 10s result cache for findLogsForTask prevents
  redundant scans when the same task is queried multiple times.
- Discovery cache TTL raised from 5s to 30s — avoids re-scanning the
  entire project directory on every call.
- Message cap at 200 in TeamDataService to keep IPC payloads under 1MB
  (was sending 2200+ messages / ~3MB, stalling Chromium IPC serialization).
- IPC handlers fall back to main-thread execution if the worker is
  unavailable (graceful degradation).

Renderer — useShallow and memoization (55 files):
- Added useShallow to store selectors across 55 renderer files. Batched
  individual useStore() calls (e.g. 17 calls in ExtensionStoreView,
  10 in ConnectionSection) into single useShallow selectors, cutting
  unnecessary re-render checks on every store update.
- MemberLogsTab: three 5-second polling intervals now pause when the
  parent tab is hidden (display:none). Previously 5 hidden tabs × 3
  intervals = 15 polling timers firing continuously.
- KanbanColumn wrapped in React.memo to skip re-renders when props
  haven't changed.
- MemberList: memoized activeMembers/removedMembers/colorMap; replaced
  O(n×m) per-member task scan with a pre-computed reviewer map.
- Bounded timer Maps in store initialization to prevent unbounded growth
  of debounce/throttle tracking maps during long sessions.
2026-04-05 16:21:05 +00:00
iliya
30fb2501d3 Persist launch-state and duplicate no-op handling 2026-04-05 15:23:41 +03:00
iliya
2959a3d074 Refine launch status and Gemini staging flow 2026-04-05 12:08:13 +03:00
iliya
a591ccf297 Stabilize team provisioning and runtime diagnostics 2026-04-04 20:04:16 +03:00
iliya
074b614469 feat: improve team launch model and status UX 2026-04-02 15:15:32 +03:00
iliya
3ac46e2861 feat(teams): unify provider-aware create and launch flows 2026-04-02 10:23:14 +03:00
iliya
bae3609561 feat(multimodel): add free-code runtime and provider status UI 2026-04-02 10:22:11 +03:00
iliya
1b3bd8752b refactor: remove enrichMemberBranches method and streamline branch tracking
- Eliminated the enrichMemberBranches method from TeamDataService to simplify member branch enrichment logic.
- Updated TeamDetailView to utilize live branch tracking for both lead and member worktrees, enhancing the accuracy of displayed member branches.
- Adjusted various references to ensure membersWithLiveBranches is used consistently across the component.
2026-04-01 19:11:51 +03:00
iliya
21513bb6f8 Improve Extensions CLI preflight and plugin install diagnostics
Refs: https://github.com/777genius/claude_agent_teams_ui/issues/37
2026-04-01 16:49:07 +03:00
iliya
6621660376 feat(graph): add cross-team ghost nodes and task card improvements
- Cross-team messages now show ghost nodes (dashed hexagons) for external teams
- Ghost nodes have purple color, link icon, and connect to lead via message edge
- Particles flow between ghost node and lead with cross-team message labels
- Cross-team popover shows external team name
- Task click opens full KanbanTaskCard with glow effects and action buttons
- All kanban task actions wired through CustomEvent to TeamDetailView
2026-03-31 01:48:15 +03:00
iliya
16f069fae3 feat(graph): enhance task rendering and interaction features
- Updated task opacity logic to simplify conditions.
- Added comment count and unread count badges to task pills for better visibility.
- Improved layout for unassigned tasks, including a section header and overflow badge.
- Enhanced task interaction by restricting drag functionality to member and lead nodes only.
- Introduced new task action event listeners for better task management in the UI.
- Preserved known task change presence across refreshes to maintain state consistency.
2026-03-31 01:29:59 +03:00
iliya
53dd857e0f Merge branch 'dev' of https://github.com/777genius/claude_agent_teams_ui into dev 2026-03-30 18:59:42 +03:00
iliya
822bbac23c feat(agent-teams): integrate MCP tool catalog and enhance tool registration
- Added mcpToolCatalog to the agent-teams-controller, exporting new types and constants for MCP tool groups and names.
- Updated tools registration to utilize AGENT_TEAMS_MCP_TOOL_GROUPS for streamlined tool management.
- Enhanced tests to validate the new operational permissions and ensure correct tool registration behavior.
2026-03-30 17:58:17 +03:00
iliya
1f28ee5021 fix(ci): stabilize provisioning test and clear lint errors 2026-03-30 16:45:14 +03:00
iliya
d2487e41c9 fix(team): trim verbose MCP description from permission noise rows
Remove tool description from permission_request noise label - tool name
alone is clear enough. MCP tools have long technical descriptions that
flood the Messages panel.
2026-03-30 15:56:49 +03:00
iliya
e741b1f603 feat(team): default action mode 'delegate' instead of 'do' for teams 2026-03-30 15:40:54 +03:00
iliya
228572a1f8 fix(team): target correct team in Allow all and Settings panel
Allow all button and ToolApprovalSettingsPanel now use current
approval's teamName instead of selectedTeamName. Prevents applying
settings to wrong team when approval comes from a different team
than the one currently viewed.
2026-03-29 22:56:19 +03:00
iliya
46355d87df refactor(session): improve session label formatting and enhance session item display
- Replaced direct access to session.firstMessage with formatSessionLabel for consistent label formatting across components.
- Updated SessionItem, TeamSessionsSection, and KanbanFilterPopover to utilize the new formatting function.
- Enhanced display logic in SessionItem to differentiate between regular and team sessions, improving user experience.
- Added new icons for team sessions and adjusted metadata display for better clarity.
2026-03-29 01:16:04 +02:00
iliya
304a2a7f79 feat(graph): enhance GraphControls with settings toggle and improved zoom functionality
- Added a settings toggle to the GraphControls for better user interaction.
- Implemented event listeners to close settings when clicking outside or pressing Escape.
- Improved zoom controls to mark user interaction, preventing auto-fit adjustments during user actions.
- Refactored GraphOverlay to streamline rendering and position updates for selected nodes.
- Updated GraphView to utilize new layout effects for better performance and responsiveness.
2026-03-29 00:05:29 +02:00
iliya
26f7b9158f fix(graph): enhance particle rendering for task comments
- Added visual differentiation for 'task_comment' particles, adjusting size and glow effects.
- Updated drawing functions to handle new particle kind, ensuring proper rendering in the graph.
- Introduced a merge function for particles to prevent duplicates during state updates.
- Enhanced color constants for better visual representation of different particle types.
2026-03-28 22:55:01 +02:00
iliya
e431cfd02c fix(team): deduplicate permission_request processing across all entry paths
Root cause: handleTeammatePermissionRequest was called from 3 paths
(early inbox scan, Category 4 relay scan, stdout/native) but only
the early scan checked processedPermissionRequestIds, causing
duplicate ToolApprovalRequests and extra permission_responses.

Fix:
- Move processedPermissionRequestIds check INTO handleTeammatePermissionRequest
  so ALL callers are protected by the same dedup gate
- Remove duplicate Category 4 scan that re-processed inbox messages
  (early scan already covers all messages including read=true)
- Category 4 now only builds a filter Set to exclude permission_request
  from relay to lead
2026-03-28 20:32:42 +02:00
iliya
f286468dac fix(team): stable context % + show "% of context" + graph improvements
Context window fix:
- Derive initial contextWindow from model selection (haiku=200K, else=1M)
- Use limitContext flag from request
- Updated to exact value from modelUsage on result.success
- Formula: input_tokens + cache_creation + cache_read (all three needed)

TokenUsageDisplay:
- New contextWindowSize prop → shows "X% of context" (not "X% of input")

Graph improvements:
- Pending approval: pulsing amber ring on member nodes
- Working spinner: spinning arc when member has active task
- Current task indicator in popover (Loader2 + "working on" + task name)
- GraphNode: added currentTaskId, currentTaskSubject, pendingApproval, activeTool fields
- Adapter: passes pendingApprovalAgents + currentTaskId from store
2026-03-28 18:32:10 +02:00
iliya
11506c6ea8 fix(team): fix AskUserQuestion edge cases in ToolApprovalSheet
- Option keys now include question index prefix ("qi:label") to prevent
  cross-question collisions when multiple questions share option labels
- Single-select clears only options from the same question, not all
- answersMessage built as per-question JSON map instead of flat join
- Backend parses JSON answers and maps to correct questions
- Fallback label "Option N" for options with undefined label
2026-03-28 17:00:06 +02:00
iliya
75a36b5cd2 fix(team): deliver AskUserQuestion answers via updatedInput + fix Enter bypass
- Enter key now respects isAskQuestion selection requirement
- Selected option labels sent as message to respondToToolApproval
- control_response includes updatedInput with answers for AskUserQuestion
- useCallback/useEffect deps updated for selectedOptions and hasSelection
2026-03-28 16:54:22 +02:00
iliya
1e80f3db52 feat(team): interactive AskUserQuestion options in ToolApprovalSheet
- Options are clickable: single-select (radio) and multi-select (checkbox)
- Selected options highlighted with green border and filled indicator
- Submit button replaces Allow for AskUserQuestion - disabled until
  at least one option is selected
- Human-readable tool display names (AskUserQuestion -> Question, etc.)
- Selection resets when approval changes
2026-03-28 16:49:24 +02:00
iliya
daef2db07c fix(team): prevent hooks ordering crash in ToolInputPreview
Move useMemo/variable declarations BEFORE the AskUserQuestion early
return to ensure hooks are called in consistent order regardless of
which tool type is being displayed.
2026-03-28 16:44:26 +02:00
iliya
6b09b59d88 feat(team): render AskUserQuestion tool as readable UI in ToolApprovalSheet
Instead of showing raw JSON for AskUserQuestion, render each question
with header badge, question text, and options list showing labels and
descriptions. Supports multiSelect indicator (checkbox vs radio style).
Add MessageCircleQuestion icon for the tool.
2026-03-28 16:40:18 +02:00
iliya
70b5f1962f feat(team): add Skip button to pre-flight CLI check in launch/create dialogs
Users can now skip the CLI warmup check and launch immediately.
Sets prepareState to 'ready' so the Launch button unlocks.
2026-03-28 16:10:32 +02:00
iliya
d01bce2101 feat(team): show approval status icons on permission_request noise rows
- Add resolvedApprovals Map to store (request_id -> allowed/denied)
- Record result in respondToToolApproval and autoResolved events
- NoiseRow accepts optional icon prop
- Permission request rows show: check (approved), x (denied),
  clock (pending), or faded check (pre-existing/unknown)
2026-03-28 15:52:12 +02:00
iliya
9f2a7c950a fix(team): fix hooks ordering crash in ToolApprovalSheet
Move useMemo for sourceColor BEFORE the early return (if !current),
and restore teamSummary/teamColor/displayName variables that were
accidentally removed. Fixes 'Rendered fewer/more hooks' React crash.
2026-03-28 15:40:56 +02:00
iliya
ff8b844abe fix(team): show MemberBadge with avatar in ToolApprovalSheet header
Replace plain text teammate name with MemberBadge component showing
avatar + colored name badge, consistent with how members are displayed
in the Messages panel.
2026-03-28 15:24:07 +02:00
iliya
add9df2006 fix(graph): Profile opens member dialog (not message) + Add Task button
- Profile button dispatches 'graph:open-profile' → MemberDetailDialog
  (was incorrectly mapped to 'graph:send-message')
- Double-click on member → opens profile (was: send message)
- New "Add Task" button on member popover → CreateTaskDialog with owner pre-filled
- New events: graph:open-profile, graph:create-task
- TeamDetailView listens for both new events
2026-03-28 15:08:32 +02:00
iliya
cb17e2158f feat(graph): default to tab mode + fullscreen button in tab
- Graph button opens dedicated tab (was: overlay)
- Cmd+Shift+G opens tab (was: toggle overlay)
- Tab mode has Fullscreen button → opens overlay on top
- Tab actions (Message, Open) dispatch CustomEvents to TeamDetailView
  which opens corresponding dialogs (SendMessage, TaskDetail)
- Overlay still available via Fullscreen button or TeamGraphOverlay
2026-03-28 14:17:10 +02:00
iliya
8a9121fc3e fix(graph): toggle buttons visually distinct — active gets border + glow, inactive dimmed 2026-03-28 14:11:28 +02:00
iliya
98a1155635 feat(graph): wire popover actions to real dialogs (Message, Open task/member)
- TeamGraphOverlay accepts onSendMessage, onOpenTaskDetail, onOpenMemberProfile
- TeamDetailView passes dialog openers to overlay:
  - Message → opens SendMessageDialog with recipient pre-filled
  - Open (task) → opens TaskDetailDialog with task found by ID
  - Open (member) → opens SendMessageDialog for that member
  - Double-click → same as Open
- Removed console.log stubs
2026-03-28 12:56:43 +02:00
iliya
17e9be99dd fix(ui): change auto-approve banner from warning to info style 2026-03-28 12:23:28 +02:00
Илия
11bb49c53e
feat(graph): force-directed agent graph visualization with kanban-zone task layout
Force-directed graph visualization for agent teams.

Package: @claude-teams/agent-graph (isolated workspace package)
- Space theme: bloom, particles, hex grid, depth stars
- Members as hexagonal nodes with breathing glow
- Tasks as pill cards in kanban columns (todo/wip/done/review/approved) per owner
- Message particles along edges (real-time only)
- Deterministic layout, Figma-style pan, scroll/pinch zoom
- Clean Architecture: ports/adapters/strategies, ES #private classes

Integration: features/agent-graph/ (adapter + overlay + tab)
- Full-screen overlay (Cmd+Shift+G) + Pin as Tab
- Graph button in Team section header
- Frustum culling, zero per-frame allocations, adaptive fps
- Performance overlay via ?perf query param

Also: CI runs on all PR branches, features/CLAUDE.md architecture guide
2026-03-28 12:03:42 +02:00
iliya
dd42cf0069 fix(team): scan inbox for permission_request during provisioning
relayLeadInboxMessages only processes unread messages after
provisioningComplete, but CLI marks permission_request messages as
read after native delivery -- before our relay runs.

Move permission_request inbox scan BEFORE provisioningComplete check.
Scan ALL messages (including read=true), track processed IDs via
processedPermissionRequestIds Set on ProvisioningRun to prevent
re-emitting. Also look up both alive and provisioning runs so the
scan works during team bootstrap.
2026-03-27 23:35:52 +02:00
iliya
df6a23e3a2 Merge branch 'worktree-fix-permission-request-ui' into dev 2026-03-27 22:04:55 +02:00
iliya
d0b9c4f529 fix(team): settings panel opens below buttons instead of beside them
Split ToolApprovalSettingsPanel into ToolApprovalSettingsToggle (inline
button) and ToolApprovalSettingsContent (full-width expandable panel).
Toggle sits in the actions row, content renders below it inside the popup.
2026-03-27 22:04:44 +02:00
iliya
5c0eb1fa38 Merge branch 'worktree-fix-permission-request-ui' into dev 2026-03-27 20:16:14 +02:00
iliya
c0c20d07f8 fix(team): add backdrop overlay to ToolApprovalSheet and move Settings inline
- Add semi-transparent backdrop (bg-black/40) behind the approval popup
  to draw attention and dim surrounding UI
- Refactor ToolApprovalSettingsPanel to render toggle button inline
  (fragment-based) so it can sit in the actions row next to pending count
- Settings button now appears right-aligned at the same level as
  Allow/Deny buttons; expanded panel renders below
2026-03-27 20:16:03 +02:00
iliya
085147ffc0 Merge branch 'worktree-fix-permission-request-ui' into dev 2026-03-27 17:56:08 +02:00
iliya
924bcd8b99 fix(team): render teammate permission requests in ToolApprovalSheet instead of raw JSON
When auto-approve is disabled, teammate tool requests arrived as
permission_request JSON via SendMessage and rendered as "Raw JSON"
with no way to approve/deny (#29).

- Intercept permission_request in lead inbox relay, convert to
  ToolApprovalRequest and show in existing ToolApprovalSheet
- Respond via teammate inbox (permission_response) + control_response
  via stdin as fallback
- Show teammate name in approval header (e.g. "bob — Bash")
- Compact noise label in Messages panel for permission_request/response
- Proper file locking, race condition protection, idempotency checks
2026-03-27 17:55:59 +02:00
iliya
507bf798eb improvement(task-change): improve task change presence tracking and related IPC handlers
- Added support for tracking task change presence with new IPC channels: TEAM_GET_TASK_CHANGE_PRESENCE and TEAM_SET_CHANGE_PRESENCE_TRACKING.
- Introduced JsonTaskChangePresenceRepository and TeamLogSourceTracker to manage task change presence data.
- Enhanced ChangeExtractorService to utilize task change presence services for improved task change detection.
- Updated TeamDataService to integrate task change presence tracking and resolve task change presence states.
- Modified UI components to reflect task change presence status in Kanban and task detail views.

This feature aims to provide real-time insights into task changes, enhancing user experience and task management capabilities.
2026-03-27 17:52:39 +02:00
iliya
ecba775c76 Improve macOS title bar drag area 2026-03-27 17:21:18 +02:00
iliya
9f8287755c fix(updater): improve update dialog layout and strip downloads section
Widen dialog (max-w-lg → max-w-2xl), remove prose max-width constraint
that caused empty space on the right, and filter out the Downloads
heading with everything below it from release notes.
2026-03-26 13:13:50 +02:00
iliya
c7ee51884d Merge branch 'worktree-upstream-merge' into dev 2026-03-25 15:44:54 +02:00
iliya
58f3ccd4b4 feat(dashboard): add auth troubleshooting guide to CLI status banner
Add "Already logged in?" button next to Login that expands a
step-by-step troubleshooting panel: re-check status, terminal
commands, re-login instructions, and binary path display.
Also clarifies that browsing works without login.
2026-03-25 15:00:42 +02:00
iliya
141d0e22d9 feat(team): implement startTaskByUser functionality
- Added a new IPC handler for starting tasks triggered by users, ensuring that the task owner is always notified.
- Introduced `startTaskByUser` method in `TeamDataService` to handle task initiation and notifications.
- Updated relevant components and API interfaces to support the new functionality, including changes in the UI to call `startTaskByUser` instead of the previous `startTask`.
- Documented agent block usage for internal instructions in CLAUDE.md.

This enhancement improves user interaction with task management by providing a clear mechanism for user-initiated task starts.
2026-03-25 14:47:27 +02:00
iliya
22387ca0cb perf: add search debounce and increase global search timeout
- SearchBar: 300ms debounce with local input state, flush on Enter
- CommandPalette: global search debounce 200→400ms
- Show "500+" when search results are capped
- Fix: syncSearchMatchesWithRendered now updates searchMatchItemIds

Ported from upstream 5c7f921e (SearchBar/CommandPalette parts).
2026-03-25 14:38:07 +02:00
iliya
c21350713c perf: replace remark-based search with plain text indexOf
Manually ported from upstream 5c7f921e. Key changes:
- SessionSearcher: indexOf instead of remark AST, batch size 8→16
- conversationSlice: indexOf with MAX_SEARCH_MATCHES=500 cap
- Item-scoped store selectors (searchMatchItemIds Set) to skip re-renders
- Pre-filter in markdownTextSearch (skip parse if no raw match)
- SearchTextCache: 200→1000 entries
- ProjectScanner: 30s search project cache, batch 4→8
2026-03-25 14:32:37 +02:00
iliya
aeed5a0873 feat: add syntax highlighting for R, Ruby, PHP, and SQL
Cherry-picked from upstream 022c75da with conflict resolution.
Merged our codeClassName support with upstream per-line highlighting.
2026-03-25 14:05:53 +02:00
iliya
4946a65a7b feat: cherry-pick upstream CollapsibleOutputSection + TriggerMatcher regex cache
Cherry-picked from upstream:
- 516d0f6b: CollapsibleOutputSection with markdown preview toggle
- e51c1fd1: cache compiled regexes in TriggerMatcher (perf)
2026-03-25 13:58:38 +02:00
iliya
b8aa2d9f14 fix(auth): enrich PTY env and invalidate status cache after login
- Use buildEnrichedEnv() in PtyTerminalService so login terminal gets
  full PATH (Homebrew, nvm, etc.) and USER for Keychain lookup
- Add cliInstaller:invalidateStatus IPC to clear cached auth status
  after successful login, preventing stale "not logged in" responses
- Show "Verifying authentication..." spinner instead of flashing
  the "Not logged in" banner between modal close and status refresh

Ref #27
2026-03-25 13:36:12 +02:00
iliya
94fc564bf5 feat: UI improvements, bug fixes, and protocol noise filtering
- Fix incorrect error message when attaching files to team lead while team is offline
- Kanban columns: color only on headers, body with 30% alpha tint per user preference
- Worktree projects now correctly detected on Dashboard via path-based detection
- Filter raw protocol messages (idle_notification, teammate-message) from lead thoughts
- Consistent text styles in Attachments section (From original message / From comments)
- Secondary sort for teams by lastActivity timestamp with alphabetical fallback
- Remove colored background from team cards, keep only left border
- Dynamic member color in Add Members dialog based on next available palette color
- Stylized @-mentions in task comments with colored MemberBadge
- Refactor CLI env resolution to shared utility
2026-03-24 17:47:15 +02:00
iliya
7298cffaf5 Merge remote-tracking branch 'origin/worktree-react-19-migration' into dev 2026-03-24 17:12:52 +02:00
iliya
47dac2e8b5 feat: migrate to React 19
Upgrade React 18.3.1 → 19.2.4 with full type compatibility.

Changes:
- react, react-dom → ^19.0.0
- @types/react, @types/react-dom → ^19.0.0
- lucide-react → ^0.577.0 (React 19 type fixes)
- @tiptap/* → ^3.20.4 (React 19 support)
- useRef calls now require explicit initial value (undefined)
- RefObject types updated for React 19 (includes null)
- MutableRefObject → RefObject (deprecated in 19)
- act() import moved from react-dom/test-utils to react
- Scoped JSX namespace imports added where needed
2026-03-24 17:11:55 +02:00
iliya
1718f9cf7c refactor(README): reorganize roadmap items for clarity and update language switcher flag icon
- Rearranged roadmap items in README.md for better organization, moving planning mode and visual workflow editor to the top.
- Updated the flag icon for English in LanguageSwitcher.vue from the US to the GB flag.
- Enhanced user environment setup in CliInstallerService.ts by adding user information retrieval.
- Improved timestamp handling in MemberLogsTab.tsx to better reflect recent activity.
- Adjusted button class names in ProvisioningProgressBlock.tsx for consistency.
2026-03-24 16:52:12 +02:00
iliya
2e5d91f8f8 fix(settings): update About section description to reflect current features
Old text referenced waterfall charts; replaced with current capabilities:
agent teams, kanban board, code review, cross-team communication.
2026-03-24 12:38:58 +02:00
iliya
756643ebcd feat(chat): add syntax highlighting to command input in EditToolViewer and SkillReviewDialog
- Implemented syntax highlighting for command inputs in the EditToolViewer component, enhancing readability.
- Updated the renderInput function in renderHelpers to utilize the highlightLines utility for improved command display.
- Added syntaxHighlight prop to SkillReviewDialog for consistent styling across components.
2026-03-23 20:26:48 +02:00
iliya
c326f8f96e feat(readme): update project title with link and remove unused media files
- Updated the project title in README.md to include a hyperlink for easier access to the documentation.
- Removed unused media files (compact.mp4, context.png, demo.mp4, noti.mp4) from the public directory to clean up the project.
- Enhanced the preload and renderer components to include a new method for retrieving file paths, improving file handling capabilities.
2026-03-23 20:18:14 +02:00
iliya
eda6218e67 feat(landing): expand localization support and improve content handling
- Added support for additional languages: Chinese (zh), Spanish (es), Hindi (hi), Arabic (ar), and Portuguese (pt) in the LanguageSwitcher and i18n configuration.
- Updated content files for English and Russian to clarify the free usage of the app.
- Enhanced content management by importing new language files into the content structure.
- Adjusted locale handling to ensure proper recognition of supported languages in the application.
2026-03-23 18:53:43 +02:00
iliya
c8546a0777 feat(landing): enhance HeroDemoVideo component with loading progress indicator
- Added a loading progress indicator to the HeroDemoVideo component, displaying the buffered video progress.
- Updated event listeners to track video loading state and progress.
- Enhanced skeleton loading UI with a spinner and progress bar for better user feedback during video loading.
- Changed video preload attribute from "metadata" to "auto" for improved loading performance.
2026-03-23 18:05:34 +02:00
iliya
0bc8bf1fe9 feat(landing): enhance base URL handling and improve image paths
- Introduced baseURL configuration to dynamically set asset paths in the landing components.
- Updated AppLogo and HeroSection components to use baseURL for logo image sources.
- Refactored ScreenshotsSection to utilize a publicPath function for consistent image path handling.
- Improved LanguageSwitcher to synchronize the i18n locale with the store on mount.
- Enhanced TaskCommentInput to handle file uploads more robustly, including validation for empty files and improved error handling.
- Adjusted MessageComposer to conditionally support attachments based on team status.
2026-03-23 17:51:09 +02:00
iliya
5cf9751b41 feat(attachments): update TypeScript configuration and enhance attachment handling
- Upgraded TypeScript target and library to ES2023 for improved language features.
- Enhanced TeamProvisioningService to better handle plain text attachments with UTF-8 validation.
- Improved TaskCommentInput to differentiate between image and non-image file previews, including a new FileIcon for non-image files.
- Refactored attachment handling in useAttachments and useComposerDraft hooks to simplify file processing.
- Added validation for empty files in attachmentUtils to improve user feedback on unsupported uploads.
2026-03-23 17:33:39 +02:00
iliya
b20b69066e feat(attachments): expand file support and enhance attachment handling
- Added support for additional attachment types: PDF and plain text.
- Updated the TeamProvisioningService to handle new attachment types with appropriate content blocks.
- Enhanced AttachmentDisplay and AttachmentPreview components to differentiate between image and non-image files.
- Modified DropZoneOverlay and SendMessageDialog to reflect changes in file handling and messaging.
- Improved user experience by allowing file previews for non-image attachments and updating error messages accordingly.
- Refactored attachment validation logic to categorize unsupported files and handle them gracefully.
2026-03-23 17:24:48 +02:00
iliya
ad1741f05e fix(team): enhance team member resolution and provisioning instructions
- Added logic to merge "lead" alias into "team-lead" to prevent phantom member entries in the inbox.
- Updated provisioning instructions to emphasize the importance of using the exact name for the team lead in messages, avoiding abbreviations.
- Modified default role for 'tom' from 'reviewer' to 'researcher' with updated workflow description.
- Improved UI in MemberDraftRow to indicate workflow status with a visual cue when expanded.
2026-03-23 15:37:23 +02:00
iliya
7b13a4c398 refactor: update README and enhance team UI components
- Changed image format for agent comments screenshot in README.
- Improved table of contents in README for better navigation.
- Refactored imports in IPC config and discovery services for consistency.
- Added shimmer effect for waiting members in CSS.
- Enhanced dashboard view to display active teams with online indicators.
- Updated team provisioning components to support message severity.
- Improved task detail dialog layout for related tasks and dependencies.
- Adjusted team model selector default value and refined member status handling.
- Fixed minor styling issues in messages panel and tab bar.

These changes aim to improve user experience and maintainability across the application.
2026-03-23 12:58:38 +02:00
iliya
2eac440fe2 fix(team): disable teammate DM relay through lead, read user.json directly
Teammates are independent Claude Code processes that read their own inbox
files via fs.watch. Relaying DMs through the lead caused three bugs:
lead responding instead of the teammate, duplicate messages from relay
loops, and teammates not responding to user due to conflicting prompts.

- Disable relayMemberInboxMessages for teammate DMs (teams.ts, index.ts)
- Add SendMessage(to="user") filter in captureSendMessages as safety net
- Generate deterministic messageId for inbox entries lacking one (sha256)
- Wrap notification instructions in agent block, italic task subject
- Style system comments in task view with blue background, hide avatar
- Update CLAUDE.md, research docs, and code comments with architecture
2026-03-23 12:57:16 +02:00
iliya
e005671123 feat: add Sentry error tracking and update docs
- Integrate @sentry/electron and @sentry/react for crash reporting
- Add Sentry Vite plugin for source maps
- Add error tracking to main process, renderer, and IPC layer
- Exclude source maps from packaged builds
- Update README with new screenshots
- Add Sentry opt-out toggle in settings
- Update release workflow with Sentry config
2026-03-22 17:03:15 +02:00
iliya
00c9d62a99 feat(cli): add CliInstallWarningBanner to notify users when CLI is not installed
Introduce a new CliInstallWarningBanner component that displays a warning when the Claude Code CLI is not installed. This banner is only shown in Electron mode and is hidden on Dashboard pages. The banner includes a message prompting users to install the CLI and a button to navigate to the Dashboard.
2026-03-22 15:07:45 +02:00
iliya
40e9d7917c feat(team): persist create-team form state across tab navigation
Add IndexedDB-backed draft persistence for CreateTeamDialog so that
navigating away (e.g. to Dashboard to install CLI) and back preserves
all form fields: team name, members, paths, solo/launch flags, color.

- New createTeamDraftStorage service (IDB + in-memory fallback)
- New useCreateTeamDraft hook (debounced save, flush on unmount, race-safe)
- Gate useEffect for defaults/initialData on draftLoaded to prevent race
- Block submit button until draft is loaded
- Improve CLI-missing error in LaunchTeamDialog with Dashboard navigation
- Remove notification bell button from MessagesPanel
2026-03-22 15:02:07 +02:00
iliya
a9cdf20ca8 feat(updater): add auto-update UI with periodic checks and state guards
- Add green "Update app" / "Restart to update" button in header (TabBarActions)
- Enhance UpdateDialog: larger, dynamic buttons, scrollable release notes,
  version badge, "View on GitHub" link
- Add DashboardUpdateBanner: compact dismissible banner keyed by version
- Add periodic hourly update checks in UpdaterService with unref() timer
- Add dismissed version tracking in updateSlice (localStorage persistence)
- Add state transition guards in store listener: prevent periodic re-checks
  from resetting downloading/downloaded status back to available/checking
- Guard error events from overriding downloaded state (transient check failures)
2026-03-22 14:00:44 +02:00
iliya
60cf80f90a fix: resolve CLI binary dynamically for MCP diagnostics and extension installs
Use ClaudeBinaryResolver instead of null binary path in extension services
(McpHealthDiagnosticsService, PluginInstallService, McpInstallService).
Packaged Electron on macOS has minimal PATH — bare `claude` lookup fails
with ENOENT. Now all CLI calls resolve the binary via ClaudeBinaryResolver
which checks PATH, NVM, standard install dirs and login shell env.

- Add buildEnrichedEnv() helper for child process env (PATH, HOME, USERPROFILE)
- Add stale cache re-verification with 30s TTL in ClaudeBinaryResolver
- Guard execCli() against null binaryPath with explicit error
- Replace projectPath.startsWith('/') with path.isAbsolute() for Windows
- Extract CLI_NOT_FOUND_MARKER/MESSAGE constants for consistent error detection
- Show amber info banner instead of red error when CLI not installed
2026-03-22 13:10:11 +02:00