Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
341 commits
Select commit Hold shift + click to select a range
db00db5
style: fix symphony-registry.json formatting for CI
reachraza Mar 5, 2026
89f78ad
forgot to bump version!
pedramamini Mar 3, 2026
7991045
Add 'bills-bot' entry to symphony-registry.json (#388)
BillChirico Mar 4, 2026
e074d58
fix: auto-focus input field when toggling AI/Shell mode via Cmd+J
kianhub Mar 3, 2026
dbc69f1
refactor: extract focus delay into named constant
kianhub Mar 3, 2026
2143955
test: add setActiveFocus and inputRef mocks to toggleMode tests
kianhub Mar 3, 2026
1d5b3cd
test: assert auto-focus behavior in toggleMode tests
kianhub Mar 3, 2026
d236466
[Symphony] Start contribution for #160
pedramamini Mar 1, 2026
244d039
MAESTRO: Phase 9 — Keyboard shortcuts for terminal tabs
pedramamini Mar 1, 2026
168c346
fix: update test mocks and fix conditional hooks for bookmark/tab fea…
pedramamini Mar 2, 2026
362e64a
[Symphony] Start contribution for #160
pedramamini Mar 1, 2026
851b2a7
MAESTRO: Fix four terminal tab integration bugs
pedramamini Mar 5, 2026
bd96aba
fix: terminal tab rename keyboard shortcut and defensive cwd fallback
pedramamini Mar 5, 2026
c884825
fix: add missing HamburgerMenuContent component extracted from Sessio…
pedramamini Mar 5, 2026
05a4bfb
fix: resolve duplicate entries in file tree by using tree-structured …
pedramamini Mar 5, 2026
38a741c
feat: add --read-only flag to maestro-cli send command
pedramamini Mar 5, 2026
0ef4db6
MAESTRO: Add task.pending event type to Cue automation system
pedramamini Mar 5, 2026
05f3cf8
fix: allow session name pill to shrink so date doesn't collide with t…
pedramamini Mar 5, 2026
6642d01
fix: resolve 7 terminal tab integration issues (#160)
pedramamini Mar 5, 2026
a9d37cb
MAESTRO: Update CLAUDE.md Cue description to include all trigger types
pedramamini Mar 5, 2026
8eaed7e
feat: add unread agents filter toggle with Cmd+Shift+U shortcut
pedramamini Mar 5, 2026
9625315
Replace hardcoded tool detail extractors with generic summarizeToolInput
pedramamini Mar 5, 2026
7a3e642
fix: handle expected IPC errors gracefully to prevent unhandled rejec…
pedramamini Mar 4, 2026
4d11927
Merge remote-tracking branch 'origin/deep-links' into 0.16.0-RC
pedramamini Mar 6, 2026
1469a16
Merge remote-tracking branch 'origin/directors-notes-stream' into 0.1…
pedramamini Mar 6, 2026
7206526
Merge remote-tracking branch 'origin/encore-features' into 0.16.0-RC
pedramamini Mar 6, 2026
d7b6bf6
merge: resolve conflicts merging maestro-cue-spinout into 0.16.0-RC
pedramamini Mar 6, 2026
c3e928a
Merge remote-tracking branch 'origin/run-all-wizard-docs' into 0.16.0-RC
pedramamini Mar 6, 2026
f6541a7
fix: resolve type errors from branch merges
pedramamini Mar 6, 2026
930b649
merge: resolve conflicts merging little-thing into 0.16.0-RC
pedramamini Mar 6, 2026
15b59a2
feat: add Copy Deep Link option to tab overlay menu
pedramamini Mar 6, 2026
ce5cf67
fix: use textMain for session names to prevent visual dimming
pedramamini Mar 6, 2026
6cf514e
Merge remote-tracking branch 'origin/little-thing' into 0.16.0-RC
pedramamini Mar 6, 2026
82e1a80
fix: resolve tsconfig.main.json build errors from branch merges
pedramamini Mar 6, 2026
9060bb8
Merge remote-tracking branch 'origin/deep-links' into 0.16.0-RC
pedramamini Mar 6, 2026
6679395
Merge branch '0.16.0-RC' of https://github.com/RunMaestro/Maestro int…
pedramamini Mar 6, 2026
47eedca
fix: reset inputMode when switching from terminal to AI/file tabs
pedramamini Mar 6, 2026
3b0bba2
fix: pass app entry point in dev-mode protocol registration
pedramamini Mar 6, 2026
8d2b003
fix: count only agents with entries in lookback window for Director's…
pedramamini Mar 6, 2026
28b93de
Gate CUE history filter on maestroCue encore feature and fix crowded …
pedramamini Mar 6, 2026
8cc9a6c
fix: terminal tabs now connect to SSH remote host when session SSH is…
pedramamini Mar 6, 2026
926f978
fix: preserve draft input when replaying a previous message
pedramamini Mar 6, 2026
8910615
refactor: move Usage & Stats settings from General tab to Encore Feat…
pedramamini Mar 6, 2026
7409805
fix: match unread agent indicator dot position to tab unread pattern
pedramamini Mar 6, 2026
b3c5c8d
Merge remote-tracking branch 'origin/deep-links' into 0.16.0-RC
pedramamini Mar 6, 2026
25d26fc
merge: resolve conflict merging encore-features into 0.16.0-RC
pedramamini Mar 6, 2026
7e1025c
merge: resolve conflict merging maestro-cue-spinout into 0.16.0-RC
pedramamini Mar 6, 2026
56108c9
Add CUE entry type to History Panel help modal when maestroCue is ena…
pedramamini Mar 6, 2026
6efd53e
Merge remote-tracking branch 'origin/little-thing' into 0.16.0-RC
pedramamini Mar 6, 2026
5092e46
docs: move Usage Dashboard and Maestro Symphony under Encore Features…
pedramamini Mar 6, 2026
bca4bed
feat: show View history link on files tab during batch run
pedramamini Mar 6, 2026
03ae596
Add comprehensive Maestro Cue user documentation (4 pages)
pedramamini Mar 6, 2026
4810a99
Merge remote-tracking branch 'origin/encore-features' into 0.16.0-RC
pedramamini Mar 6, 2026
027b81e
merge: resolve conflicts merging maestro-cue-spinout docs into 0.16.0-RC
pedramamini Mar 6, 2026
a53b851
Merge remote-tracking branch 'origin/little-thing' into 0.16.0-RC
pedramamini Mar 6, 2026
4d0e212
fix: remove hardcoded max-width on header session name
pedramamini Mar 6, 2026
debe883
refactor: reorder Encore Features, remove BETA from Usage Dashboard
pedramamini Mar 6, 2026
391f9c0
merge: resolve conflicts merging encore-features into 0.16.0-RC (reor…
pedramamini Mar 6, 2026
45cc4b0
Merge remote-tracking branch 'origin/little-thing' into 0.16.0-RC
pedramamini Mar 6, 2026
c1cf4dc
Add Cue YAML editor, context menu integration, and fix help modal z-i…
pedramamini Mar 6, 2026
c2a366c
Add tests for cueYamlEditor modal and Configure Maestro Cue command p…
pedramamini Mar 6, 2026
cbc98a3
merge: resolve conflict merging maestro-cue-spinout into 0.16.0-RC (C…
pedramamini Mar 6, 2026
ee06bef
feat: show terminal tabs in tab switcher modal; fix xterm repaint on …
pedramamini Mar 6, 2026
fd20866
Move Configure Maestro Cue below Configure Worktrees in context menu
pedramamini Mar 6, 2026
0b7e4aa
Center history filter pills when CUE type adds a third row
pedramamini Mar 6, 2026
5c4a954
Add conversational AI Assist chat to CueYamlEditor with agent spawn a…
pedramamini Mar 6, 2026
ce90391
Merge remote-tracking branch 'origin/maestro-cue-spinout' into 0.16.0-RC
pedramamini Mar 6, 2026
6fb6a43
version bump
pedramamini Mar 6, 2026
6bf9839
ignore Cue files
pedramamini Mar 6, 2026
d5c606e
Add Cue Examples cookbook page and document triggeredBy filter field
pedramamini Mar 6, 2026
564d85f
fix: skip directory collision warning when agents are on different hosts
pedramamini Mar 6, 2026
52d9a37
Merge remote-tracking branch 'origin/maestro-cue-spinout' into 0.16.0-RC
pedramamini Mar 6, 2026
8174d7e
Merge remote-tracking branch 'origin/little-thing' into 0.16.0-RC
pedramamini Mar 6, 2026
fc466b8
Rename Cancel to Exit in CueYamlEditor and pass cueShortcutKeys to Cu…
pedramamini Mar 6, 2026
1a10463
Merge remote-tracking branch 'origin/maestro-cue-spinout' into 0.16.0-RC
pedramamini Mar 6, 2026
c469ec6
fix: close AI tab falls back to correct neighbor using unifiedTabOrder
pedramamini Mar 6, 2026
e47cb59
fix: check sessionSshRemoteConfig as primary SSH remote ID source
pedramamini Mar 6, 2026
16322c8
fix: use dark text colors for context warning sash in light mode
pedramamini Mar 6, 2026
d507d10
fix: dropdown clipping on hamburger menu and live overlay, rename Rem…
pedramamini Mar 6, 2026
96190ec
fix: always show .maestro folder in file tree regardless of ignore pa…
pedramamini Mar 6, 2026
993957e
Add missing Cue template variables for file changeType and agent comp…
pedramamini Mar 6, 2026
f5534af
Merge remote-tracking branch 'origin/maestro-cue-spinout' into 0.16.0-RC
pedramamini Mar 6, 2026
4f4d6f4
Merge remote-tracking branch 'origin/little-thing' into 0.16.0-RC
pedramamini Mar 6, 2026
924cbb7
fix: update CueHelpModal -> CueHelpContent import after rename in mae…
pedramamini Mar 6, 2026
c8154d8
Add Cue Graph visualizer tab, standardize modal sizes, and inline hel…
pedramamini Mar 6, 2026
31478e6
merge: integrate PR #519 (OpenCode multi-step fix, onConfigBlur signa…
pedramamini Mar 6, 2026
73dd645
fix: preserve terminal content when returning from AI mode via isVisi…
pedramamini Mar 6, 2026
3c38127
Use theme accent instead of hardcoded Cue teal for toggles, borders, …
pedramamini Mar 6, 2026
a337827
fix: closeTerminalTab falls back to correct neighbor using unifiedTab…
pedramamini Mar 6, 2026
cd135ab
merge: resolve conflicts merging maestro-cue-spinout into 0.16.0-RC (…
pedramamini Mar 6, 2026
142b52f
fix: persist terminal tab content across session switches
pedramamini Mar 6, 2026
fceeb5a
fix: defer WebGL addon load until terminal container is visible
pedramamini Mar 7, 2026
10c5d20
MAESTRO: Add pipeline types and React Flow canvas foundation for Cue …
pedramamini Mar 7, 2026
3a73db0
Merge remote-tracking branch 'origin/maestro-cue-spinout' into 0.16.0-RC
pedramamini Mar 7, 2026
85af511
fix: terminal tabs on SSH agents now connect to the remote host
pedramamini Mar 7, 2026
747a93c
MAESTRO: Add custom node types and pipeline edge for Cue visual editor
pedramamini Mar 7, 2026
c8af227
MAESTRO: Add trigger and agent drawers with drag-and-drop for Cue pip…
pedramamini Mar 7, 2026
c77aba7
MAESTRO: Add pipeline lifecycle management with selector dropdown, co…
pedramamini Mar 7, 2026
215981e
MAESTRO: Add node and edge configuration panels for Cue pipeline editor
pedramamini Mar 7, 2026
ab4174d
MAESTRO: Add pipeline-to-YAML conversion utility for Cue visual editor
pedramamini Mar 7, 2026
b444a8f
MAESTRO: Add YAML-to-pipeline reverse conversion for Cue visual editor
pedramamini Mar 7, 2026
4489eef
MAESTRO: Integrate YAML conversion into pipeline editor with save/loa…
pedramamini Mar 7, 2026
89156dc
fix: use visibility:hidden instead of display:none for terminal keep-…
pedramamini Mar 7, 2026
4ab5a75
MAESTRO: Add pipeline layout persistence via IPC for Cue visual editor
pedramamini Mar 7, 2026
8b69794
fix: SSH terminal tabs now actually connect to remote host
pedramamini Mar 7, 2026
f1784ed
MAESTRO: Update CueModal to use Pipeline Editor as default tab and re…
pedramamini Mar 7, 2026
e2752bd
MAESTRO: Add pipeline-aware status indicators to CueModal Dashboard tab
pedramamini Mar 7, 2026
f42fb0f
remove obsolete terminalWidth setting; update log buffer description
pedramamini Mar 7, 2026
e1f53fe
MAESTRO: Add polish features to Cue visual pipeline editor
pedramamini Mar 7, 2026
bfac684
test: add PtySpawner tests covering SSH terminal and shell terminal p…
pedramamini Mar 7, 2026
cecb0cb
fix: improve light theme contrast for syntax highlighting and colors
pedramamini Mar 7, 2026
f6e66b4
fix: always mount terminal sessions regardless of file preview / AI view
pedramamini Mar 7, 2026
68a62da
Merge remote-tracking branch 'origin/main' into 0.16.0-RC
pedramamini Mar 7, 2026
734d773
fix: include busy agents in unread agents filter
pedramamini Mar 7, 2026
cb00fc4
MAESTRO: Fix empty pipeline graph and add drawer improvements
pedramamini Mar 7, 2026
a6e5b08
Merge remote-tracking branch 'origin/maestro-cue-spinout' into 0.16.0-RC
pedramamini Mar 7, 2026
ecc2339
merge: resolve conflicts merging little-thing into 0.16.0-RC (keep re…
pedramamini Mar 7, 2026
894c665
MAESTRO: Add layout algorithms and node dragging to Cue graph view
pedramamini Mar 7, 2026
60a9853
test: add XTerminal and terminalTabHelpers coverage
pedramamini Mar 7, 2026
73e81eb
fix: remove scroll-to-bottom arrow indicator from terminal output view
pedramamini Mar 7, 2026
0445fec
MAESTRO: Fix pipeline editor UI issues and add legend/auto-config
pedramamini Mar 7, 2026
fc3e99c
Merge remote-tracking branch 'origin/maestro-cue-spinout' into 0.16.0-RC
pedramamini Mar 7, 2026
44be9a7
fix: suppress empty groups and New Group button in unread agents filter
pedramamini Mar 7, 2026
8e26571
MAESTRO: Add drag handles and gear icons to pipeline editor nodes
pedramamini Mar 7, 2026
9d87702
Merge remote-tracking branch 'origin/little-thing' into 0.16.0-RC
pedramamini Mar 7, 2026
c6734e5
feat: add empty state for unread agents filter with centered Bot icon
pedramamini Mar 7, 2026
c73693c
merge: integrate origin/0.16.0-RC into terminal-upgrade, resolve conf…
pedramamini Mar 7, 2026
e6cdae9
Merge pull request #528 from RunMaestro/terminal-upgrade
pedramamini Mar 7, 2026
36f41f0
fix: terminal visual polish and keyboard handler cleanup
pedramamini Mar 7, 2026
9750639
fix: resolve lint warnings, stale tests, and two cue bugs
pedramamini Mar 7, 2026
79db6a4
Merge remote-tracking branch 'origin/maestro-cue-spinout' into 0.16.0-RC
pedramamini Mar 7, 2026
0a0d27d
Merge remote-tracking branch 'origin/little-thing' into 0.16.0-RC
pedramamini Mar 7, 2026
379a936
fix: terminal tab bugs, cue hotkey, and XTerminal WebGL load order
pedramamini Mar 7, 2026
a7211fa
## CHANGES
pedramamini Mar 7, 2026
2c033f5
fix: group agents by user-defined groups in Cue Pipeline Editor drawer
pedramamini Mar 7, 2026
bd45839
## CHANGES
pedramamini Mar 7, 2026
2f9dba0
fix: file tree auto-refresh timer destroyed on right panel tab switch
pedramamini Mar 7, 2026
5a7b49f
feat: split agent prompt into input/output, add pipeline color picker…
pedramamini Mar 7, 2026
6f53b50
refactor: consolidate Maestro project files under .maestro/ directory
pedramamini Mar 7, 2026
5d580ce
test: update tests for .maestro/ directory migration
pedramamini Mar 7, 2026
bb213a6
fix: resolve test failures from .maestro/ migration
pedramamini Mar 7, 2026
92bf551
feat: add Edit YAML button to Cue dashboard and show sessions when en…
pedramamini Mar 7, 2026
c4b5367
feat: add output_prompt support to Cue pipeline agents
pedramamini Mar 7, 2026
c66951c
feat: replace pattern preset replace-all with copy-to-clipboard preview
pedramamini Mar 7, 2026
5fb805c
## CHANGES
pedramamini Mar 8, 2026
5e19983
## CHANGES
pedramamini Mar 8, 2026
d5c0122
## CHANGES
pedramamini Mar 8, 2026
4fa375d
## CHANGES
pedramamini Mar 8, 2026
d1d06a1
feat: add image support to group chat (display, persistence, agent fo…
pedramamini Mar 8, 2026
64e2419
test: add tests for Cue modal escape-from-help and unsaved changes co…
pedramamini Mar 8, 2026
4bca30c
chore: remove beta badge from Storage Location setting
pedramamini Mar 8, 2026
87ed425
fix: restore "All Pipelines" selection on Pipeline Editor load
pedramamini Mar 8, 2026
abc838f
feat: append active theme to runmaestro.ai URLs
pedramamini Mar 8, 2026
ab91c55
feat: add theme-hint script for Mintlify docs
pedramamini Mar 8, 2026
c08fb5a
fix: elevate branding header z-index so menu renders above sidebar co…
pedramamini Mar 8, 2026
6777895
## CHANGES
pedramamini Mar 8, 2026
7ee7057
fix: resolve pipeline-dashboard mismatch by adding agent_id binding a…
pedramamini Mar 8, 2026
0bb3e6c
feat: rename time.interval to time.heartbeat and add time.scheduled t…
pedramamini Mar 8, 2026
630a8c4
feat: add Alt+J shortcut to jump to closest terminal tab
pedramamini Mar 8, 2026
351beef
fix: hide unread agents filter button when left sidebar is collapsed
pedramamini Mar 8, 2026
e75dcec
## CHANGES
pedramamini Mar 8, 2026
4b3fb22
fix: auto-close terminal tab when shell process exits
pedramamini Mar 8, 2026
fa56d01
fix: close terminal tab immediately on shell exit instead of 300ms delay
pedramamini Mar 8, 2026
6d316a8
feat: respect unread filter when cycling agents with Cmd+[/]
pedramamini Mar 8, 2026
2f3960e
## CHANGES
pedramamini Mar 8, 2026
a58db03
fix: improve tab naming reliability, Cue pipeline targeting, and UI p…
pedramamini Mar 8, 2026
76156bf
fix: always show indicator dot on unread agents filter icon
pedramamini Mar 8, 2026
9d434d7
fix: always show .maestro directory in file tree even when dotfiles a…
pedramamini Mar 8, 2026
06d5618
feat: add per-trigger prompts, custom trigger labels, and manual Run …
pedramamini Mar 8, 2026
ca5ffc5
feat: staged splash screen with orchestra warm-up theme
pedramamini Mar 8, 2026
3a82b5a
feat: add expand/collapse toggle to Cue pipeline config drawer
pedramamini Mar 9, 2026
ba032d6
fix: stop auto-creating terminal tabs for new sessions
pedramamini Mar 9, 2026
e8478d7
fix: keep active worktree session visible under unread-only filter
pedramamini Mar 9, 2026
96c4d51
MAESTRO: feat: add account multiplexing shared types and interfaces
openasocket Feb 15, 2026
989144a
MAESTRO: feat: add account registry store and CRUD service
openasocket Feb 15, 2026
305189d
MAESTRO: feat: add account usage tracking to stats database (v4 migra…
openasocket Feb 15, 2026
d915cd2
MAESTRO: feat: add account multiplexing IPC handlers and preload bridge
openasocket Feb 15, 2026
bb17ce2
MAESTRO: feat: add account directory setup service and login orchestr…
openasocket Feb 15, 2026
f9771af
MAESTRO: feat: add account management UI to Settings panel
openasocket Feb 15, 2026
de3dfce
MAESTRO: feat: add Account Usage Dashboard UI with lint and test fixes
openasocket Feb 15, 2026
7d9e665
MAESTRO: feat: add throttle detection and account switch trigger
openasocket Feb 15, 2026
d9fff55
MAESTRO: feat: add account switching execution with process restart a…
openasocket Feb 15, 2026
bff63f7
MAESTRO: feat: add account switch confirmation modal and manual accou…
openasocket Feb 15, 2026
137a496
MAESTRO: feat: integrate account multiplexing into all agent spawn paths
openasocket Feb 15, 2026
869b8b6
MAESTRO: feat: add session/assignment persistence and restart recover…
openasocket Feb 15, 2026
782398a
MAESTRO: feat: add account multiplexing support to CLI batch runner
openasocket Feb 15, 2026
97e88e4
MAESTRO: feat: add account propagation to session merge/transfer oper…
openasocket Feb 15, 2026
3555f28
MAESTRO: feat: add account display to ProcessMonitor, SymphonyModal, …
openasocket Feb 15, 2026
1e841b9
MAESTRO: test: add comprehensive test suite for AccountRecoveryPoller
openasocket Feb 15, 2026
54b8d8b
MAESTRO: feat: add capacity-aware account selection to AccountRegistry
openasocket Feb 15, 2026
410127c
MAESTRO: feat: wire statsDB into selectNextAccount callers for capaci…
openasocket Feb 15, 2026
5cee878
MAESTRO: feat: add all-accounts-exhausted handling, recovery IPC, and…
openasocket Feb 15, 2026
19d933a
MAESTRO: feat: rename "Accounts" to "Virtuosos" across all UX surface…
openasocket Feb 15, 2026
a44cb8e
MAESTRO: feat: add inline usage metrics to Virtuosos panel, AccountSe…
openasocket Feb 16, 2026
1eb793e
MAESTRO: feat: add usage analytics with P90 predictions, historical t…
openasocket Feb 16, 2026
9e26bbb
MAESTRO: feat: wire AccountSwitcher into main process and IPC handlers
openasocket Feb 16, 2026
b17c54a
MAESTRO: feat: add auth recovery service, tests, and dedup getWindowB…
openasocket Feb 16, 2026
db40fd1
MAESTRO: refactor: code quality hardening for Virtuoso feature
openasocket Feb 16, 2026
8f3046a
MAESTRO: feat: add tabbed Configuration/Usage views to VirtuososModal
openasocket Feb 16, 2026
b0ab289
MAESTRO: feat: surface per-token-type breakdown in Virtuosos usage UI
openasocket Feb 16, 2026
ccb9675
MAESTRO: feat: add Trends & Analytics section with sparklines and rat…
openasocket Feb 16, 2026
83519af
MAESTRO: fix: remove unused React import from AccountRateMetrics comp…
openasocket Feb 16, 2026
f37b2d3
MAESTRO: feat: add predictions, sparklines, and trend indicators to A…
openasocket Feb 16, 2026
c31aa0f
MAESTRO: fix: resolve session ID mismatch in account usage/error list…
openasocket Feb 16, 2026
b73401a
MAESTRO: feat: add time range toggles (24h/7d/30d/monthly) to Account…
openasocket Feb 16, 2026
b23a41d
MAESTRO: fix: replace dynamic Tailwind classes with inline styles in …
openasocket Feb 16, 2026
4de5680
feat: gate Virtuosos behind Encore Features toggle
openasocket Feb 19, 2026
a60f26f
MAESTRO: add session provenance fields and ProviderSwitchConfig type
openasocket Feb 19, 2026
f1d9605
MAESTRO: add useProviderSwitch hook and extend createMergedSession fo…
openasocket Feb 19, 2026
ac1cdbe
MAESTRO: add SwitchProviderModal component and PROVIDER_SWITCH priority
openasocket Feb 19, 2026
beb5057
MAESTRO: add Switch Provider UI entry points to context menu and Edit…
openasocket Feb 19, 2026
954cd4d
MAESTRO: wire SwitchProviderModal state, hooks, and callbacks in App.tsx
openasocket Feb 19, 2026
1b2bc85
MAESTRO: add archive visual treatment for provider-switched sessions
openasocket Feb 19, 2026
1590f73
MAESTRO: add Providers tab to VirtuososModal with status grid, failov…
openasocket Feb 19, 2026
e5385ed
MAESTRO: add automated provider failover with ProviderErrorTracker, I…
openasocket Feb 19, 2026
d5551c3
MAESTRO: add Provider Health Dashboard with live error monitoring and…
openasocket Feb 19, 2026
4ed9348
MAESTRO: add merge-back mode for provider switching with provenance c…
openasocket Feb 19, 2026
e54f59d
MAESTRO: add time range selector and usage totals bar to Provider Hea…
openasocket Feb 19, 2026
a4710ca
MAESTRO: add Provider Detail View with navigation, summary stats, and…
openasocket Feb 19, 2026
a5bc6e2
MAESTRO: complete useProviderDetail hook with errorsByType, config th…
openasocket Feb 19, 2026
dbfffa8
MAESTRO: add Provider Detail Charts with 6 visualization panels
openasocket Feb 20, 2026
55666cd
MAESTRO: add comparison benchmarks, clickable sessions, and migration…
openasocket Feb 20, 2026
97a9627
MAESTRO: fix provider detail charts, add per-agent hourly stats, and …
openasocket Feb 20, 2026
2a11704
MAESTRO: fix unarchive conflict detection and modal accessibility
openasocket Feb 20, 2026
66606a1
MAESTRO: multi-provider account support in Virtuosos
openasocket Feb 20, 2026
7fabb46
MAESTRO: regenerate package-lock.json after rebase onto main
openasocket Mar 1, 2026
8f1e8a9
MAESTRO: fix ThrottleEvent field mismatch between backend and frontend
openasocket Mar 1, 2026
c714562
MAESTRO: fix SwitchProviderModal keyboard navigation by adding tabInd…
openasocket Mar 1, 2026
1dc6ce1
MAESTRO: replace console.error and empty .catch with Sentry reporting…
openasocket Mar 1, 2026
a023731
MAESTRO: remove unused archiveSource from ProviderSwitchRequest inter…
openasocket Mar 1, 2026
d39b644
MAESTRO: report agent availability check failures to Sentry and fail …
openasocket Mar 1, 2026
4b6465a
MAESTRO: fix account badge tooltip to fall back to accountId when acc…
openasocket Mar 9, 2026
1d71010
MAESTRO: add Virtuosos to hamburger menu, command palette, settings, …
openasocket Mar 9, 2026
d1de8ee
fix: pass readOnly mode to JSON line agents in CLI batch spawner
chr1syy Mar 12, 2026
85664cb
fix: enforce read-only mode for JSON line agents and pass customModel…
chr1syy Mar 12, 2026
6dfb763
fix: correct read-only mode test assertion and prevent Gemini CLI hang
chr1syy Mar 12, 2026
6512d72
Fix AutoRun CLI-IPC: document path resolution and add agent flag to A…
chr1syy Mar 17, 2026
44f4576
fix: add return after process.exit in resolveAgentId catch, add missi…
pedramamini Mar 17, 2026
d6b746f
Merge pull request #563 from chr1syy/fix/json-line-agent-readonly-mode
pedramamini Mar 17, 2026
1a14447
Fix: Forward customModel to synopsis spawnAgent call in batch processor
pedramamini Mar 17, 2026
a787abb
Chore: Fix prettier formatting in agent-spawner.ts
pedramamini Mar 17, 2026
413acaa
Merge pull request #581 from RunMaestro/fix/batch-synopsis-custom-model
pedramamini Mar 17, 2026
7e44202
feat: auto-follow active document in Auto Run sidebar (#347) (#518)
kianhub Mar 17, 2026
fc77fa1
Merge remote-tracking branch 'runmaestro/0.16.0-RC' into feat/virtuosos
openasocket Mar 18, 2026
0dd8dda
MAESTRO: Merge rc into feat/virtuosos — resolve SessionItem + Session…
openasocket Mar 19, 2026
525ee06
MAESTRO: Fix prettier formatting on Virtuosos files post-merge
openasocket Mar 19, 2026
774ad63
MAESTRO: Fix remaining prettier formatting in provider hooks
openasocket Mar 19, 2026
96dad29
MAESTRO: Fix test failures from RC merge — stats DB version and dupli…
openasocket Mar 19, 2026
4464a89
MAESTRO: Add teamOrchestration flag to EncoreFeatureFlags
openasocket Mar 19, 2026
e170e6a
MAESTRO: Add TeamOrchestrationSettings interface and settings store s…
openasocket Mar 19, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .ai-audit/audit.db
Binary file not shown.
Binary file added .ai-audit/audit.db-shm
Binary file not shown.
Empty file added .ai-audit/audit.db-wal
Empty file.
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ node_modules/
coverage/
*.min.js
.gitignore
.prettierignore
249 changes: 249 additions & 0 deletions src/__tests__/cli/services/account-reader.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,249 @@
/**
* @file account-reader.test.ts
* @description Tests for the CLI account reader service
*
* Tests reading account data from the electron-store JSON file,
* filesystem discovery fallback, and account lookup helpers.
*/

import { describe, it, expect, vi, beforeEach } from 'vitest';
import * as fs from 'fs';
import * as os from 'os';
import type { AccountProfile } from '../../../shared/account-types';

// Mock the fs module
vi.mock('fs', () => ({
readFileSync: vi.fn(),
promises: {
readdir: vi.fn(),
readFile: vi.fn(),
stat: vi.fn(),
},
}));

// Mock the os module
vi.mock('os', () => ({
platform: vi.fn(),
homedir: vi.fn(),
}));

import {
readAccountsFromStore,
getDefaultAccount,
getAccountByIdOrName,
} from '../../../cli/services/account-reader';

// Helper to build a mock AccountProfile
function mockProfile(overrides: Partial<AccountProfile> = {}): AccountProfile {
return {
id: 'acc-1',
name: 'personal',
email: 'user@example.com',
configDir: '/home/testuser/.claude-personal',
agentType: 'claude-code',
status: 'active',
authMethod: 'oauth',
addedAt: 1000,
lastUsedAt: 2000,
lastThrottledAt: 0,
tokenLimitPerWindow: 0,
tokenWindowMs: 18000000,
isDefault: true,
autoSwitchEnabled: false,
...overrides,
};
}

describe('account-reader', () => {
beforeEach(() => {
vi.resetAllMocks();
vi.mocked(os.platform).mockReturnValue('linux');
vi.mocked(os.homedir).mockReturnValue('/home/testuser');
});

describe('readAccountsFromStore', () => {
it('reads accounts from the store JSON file', async () => {
const profile1 = mockProfile({ id: 'acc-1', name: 'personal', isDefault: true });
const profile2 = mockProfile({
id: 'acc-2',
name: 'work',
email: 'work@corp.com',
configDir: '/home/testuser/.claude-work',
isDefault: false,
});

const storeData = {
accounts: {
'acc-1': profile1,
'acc-2': profile2,
},
assignments: {},
switchConfig: {},
rotationOrder: [],
rotationIndex: 0,
};

vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(storeData));

const accounts = await readAccountsFromStore();

expect(accounts).toHaveLength(2);
expect(accounts.find((a) => a.id === 'acc-1')).toMatchObject({
id: 'acc-1',
name: 'personal',
email: 'user@example.com',
isDefault: true,
status: 'active',
});
expect(accounts.find((a) => a.id === 'acc-2')).toMatchObject({
id: 'acc-2',
name: 'work',
email: 'work@corp.com',
isDefault: false,
});
});

it('returns empty array when store has no accounts', async () => {
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({ accounts: {}, assignments: {} }));

const accounts = await readAccountsFromStore();
expect(accounts).toHaveLength(0);
});

it('falls back to filesystem discovery when store file missing', async () => {
vi.mocked(fs.readFileSync).mockImplementation(() => {
throw new Error('ENOENT');
});

vi.mocked(fs.promises.readdir).mockResolvedValue([
{ name: '.claude-personal', isDirectory: () => true } as unknown as fs.Dirent,
{ name: '.bashrc', isDirectory: () => false } as unknown as fs.Dirent,
{ name: 'Documents', isDirectory: () => true } as unknown as fs.Dirent,
]);

vi.mocked(fs.promises.readFile).mockRejectedValue(new Error('ENOENT'));

const accounts = await readAccountsFromStore();
expect(accounts).toHaveLength(1);
expect(accounts[0]).toMatchObject({
id: 'personal',
name: 'personal',
configDir: '/home/testuser/.claude-personal',
status: 'active',
});
});

it('reads email from .claude.json during filesystem discovery', async () => {
vi.mocked(fs.readFileSync).mockImplementation(() => {
throw new Error('ENOENT');
});

vi.mocked(fs.promises.readdir).mockResolvedValue([
{ name: '.claude-work', isDirectory: () => true } as unknown as fs.Dirent,
]);

vi.mocked(fs.promises.readFile).mockResolvedValue(
JSON.stringify({ email: 'dev@company.com' })
);

const accounts = await readAccountsFromStore();
expect(accounts[0].email).toBe('dev@company.com');
});

it('handles macOS store path', async () => {
vi.mocked(os.platform).mockReturnValue('darwin');

const storeData = {
accounts: { 'acc-1': mockProfile() },
assignments: {},
};
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(storeData));

const accounts = await readAccountsFromStore();
expect(accounts).toHaveLength(1);

// Should try macOS path first
expect(fs.readFileSync).toHaveBeenCalledWith(
'/home/testuser/Library/Application Support/Maestro/maestro-accounts.json',
'utf-8'
);
});
});

describe('getDefaultAccount', () => {
it('returns the default active account', async () => {
const storeData = {
accounts: {
'acc-1': mockProfile({ id: 'acc-1', isDefault: false }),
'acc-2': mockProfile({ id: 'acc-2', isDefault: true }),
},
};
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(storeData));

const account = await getDefaultAccount();
expect(account?.id).toBe('acc-2');
});

it('returns first active account when no default set', async () => {
const storeData = {
accounts: {
'acc-1': mockProfile({ id: 'acc-1', isDefault: false }),
},
};
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(storeData));

const account = await getDefaultAccount();
expect(account?.id).toBe('acc-1');
});

it('skips throttled accounts when looking for default', async () => {
const storeData = {
accounts: {
'acc-1': mockProfile({ id: 'acc-1', isDefault: true, status: 'throttled' }),
'acc-2': mockProfile({ id: 'acc-2', isDefault: false, status: 'active' }),
},
};
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(storeData));

const account = await getDefaultAccount();
expect(account?.id).toBe('acc-2');
});

it('returns null when no accounts exist', async () => {
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify({ accounts: {} }));

const account = await getDefaultAccount();
expect(account).toBeNull();
});
});

describe('getAccountByIdOrName', () => {
const storeData = {
accounts: {
'acc-1': mockProfile({ id: 'acc-1', name: 'personal' }),
'acc-2': mockProfile({ id: 'acc-2', name: 'work' }),
},
};

it('finds by ID', async () => {
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(storeData));

const account = await getAccountByIdOrName('acc-2');
expect(account?.name).toBe('work');
});

it('finds by name', async () => {
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(storeData));

const account = await getAccountByIdOrName('personal');
expect(account?.id).toBe('acc-1');
});

it('returns null when not found', async () => {
vi.mocked(fs.readFileSync).mockReturnValue(JSON.stringify(storeData));

const account = await getAccountByIdOrName('nonexistent');
expect(account).toBeNull();
});
});
});
Loading