Repository navigation
v0.84.0-beta
Pre-release
Pre-release
Changelog
All notable changes to OpenAlice will be documented in this file.
[0.84.0-beta] - 2026-07-23
UTA
- Close the order state machine + PnL read-state fix (#325)
Build
- Add Turborepo for workspace build orchestration
- desktop: Dedupe Windows Git runtime
Config
- Default crypto to bybit demo, securities to alpaca paper with tickers
Desktop
- Add in-app update prompt
Merge
- Unified trading architecture + AGPL-3.0 relicense
Polish
- analysis: Date-only daily bars + simulate entry-slip note (dogfooding)
Refine
- analysis: Snapshot bars opt-in + rss window default cap (model-payload ergonomics)
- workspaces: Reframe self-schedule file as an issue declaration
- issues: Make the Issues board sidebar-less + full-width (Linear parity)
Rename
- ui: /trade → /trading-as-git for semantic clarity
Revert
- ui: Drop react-resizable-panels — caused initial-load layout flash
- ccxt: Drop canonical localSymbol; wire format is broker-native identity
⚙️ CI
- Add GitHub Actions workflow and fix time-sensitive test
- Add automatic release workflow on master merge
- Publish opentypebb to both GitHub Packages and npmjs
- Add workflow_dispatch + independent registry checks for publish
- desktop: Build + publish per-platform installers on release
- desktop: Drop macos-13 (Intel) from the build matrix
- release: Pass --tag to git-cliff so notes aren't headed "[Unreleased]"
- alice-invest: Add complete validation workflow
- alice-invest: Enable corepack in validation workflow
- release: Retire macOS release builds
⚡ Performance
- Decouple CCXT init from startup, allow plugins to start immediately
- ui: Bypass React during sidebar drag — update DOM width directly
- uta: Listing-driven sync — hanging stop/TP orders cost zero per pass
- entities: Cache the backlink scan + fix Tracked loading UX
🎨 UI
- Polish frontend design — chat input, sidebar, card system
- Round 2 polish — shared components, transitions, table hover
- Round 3 polish — toast system, send spinner, mobile fixes
- Description-aside layout for config pages (MarketData, News)
- Apply ConfigSection layout to Settings, Connectors, AI Provider
- Unified button classes, HeartbeatPage/ToolsPage layout polish
- TradingPage full redesign — cards, 2-step wizard, visual polish
- Pre-release design polish — branding, layout, micro-interactions
- Replace gradient accent with muted dark buttons
- Add OpenAI backend card + tone down button styling
- flow: Hide dead-side event nodes
- Compact activity rail in short windows
- Add stepped activity rail breakpoints
🐛 Bug Fixes
- Inject persona + brain state into Claude Code provider
- Extract assistant text when Claude Code result is empty
- Align SettingsPanel with actual backend config structure
- Use --disallowedTools instead of --allowedTools for evolution mode
- Restore --allowedTools and hot-reload evolutionMode
- ui: Batch quality fixes — XSS, toggle, SSE dedup, error feedback
- Default mcpPort to 3001 so MCP tools server always starts
- Inject MCP tool permissions via --allowedTools, gitignore .claude/
- Skip crypto trading tools when engine is null
- openbb: Remove commodity from provider config, fix provider option lists
- Pass ccxt options under
optionskey instead of spreading at top level - tools: Set correct providers for equity fundamental and news tools
- openbb: Split news providers and handle 204 No Content
- Make MCP Server always-on — Claude Code provider depends on it for tools
- test: Update engine.spec.ts to match new VercelAIProvider constructor
- Connectors config auto-init and migration defaults
- Derive validSections from sectionSchemas to prevent config API drift
- news-collector: Retry RSS fetch once on failure
- docs: Replace Mermaid & syntax for broader renderer compatibility
- SSE stability — auto-reconnect with exponential backoff
- Clarify searchContracts/getContractDetails tool descriptions
- Update stale equitySearch/cryptoSearch references in tool descriptions
- Soften marketSearchForResearch description to avoid mandatory pre-search
- Seed platforms.json + accounts.json to disk on legacy migration
- Sequential loadMarkets with per-type retries for CCXT
- Add init retry with exponential backoff for AlpacaAccount
- Enforce aliceId as required contract identifier for trading tools
- opentypebb: Point exports to src/ so tsx resolves without build
- Upgrade opentypebb hono 4.7.4 → 4.12.7 to resolve type mismatch
- Allow 'agent-sdk' in backend switch API validation
- ui: Persist streamed tool calls and show thinking dots during text generation
- ci: Let pnpm version come from package.json packageManager field
- streaming: Push intermediate text events from Claude Code and Agent SDK providers
- session: Persist intermediate text blocks during tool loops
- Restore opentypebb src exports for local dev, use publishConfig for dist
- session: Remove duplicate assistant text persistence
- ci: Write local .npmrc for npmjs publish to avoid GitHub Packages auth conflict
- ci: Override NPM_CONFIG_USERCONFIG for npmjs publish
- Add pnpm workspace so opentypebb deps are installed automatically
- ui: Preserve content block order in streaming (text before tools)
- ui: Unify history and streaming message rendering
- ci: Add ui to pnpm workspace for unified dependency install
- ci: Remove pnpm cache from publish job to avoid path error
- openbb: Mount widgets.json on embedded server + align hono version
- Improve Alpaca and CCXT startup error handling for missing/invalid API keys
- build: Fix opentypebb exports for production + add start script
- pipeline: Batch parallel tool results into single user message
- ui: Warn that Anthropic-compatible base URL must end with /v1
- pipeline: Remove double media extraction from text-kind providers
- Restore preview image in README
- Sanitize orphaned tool-calls in toModelMessages
- Correct message dispatch for TWS v201+ protocol
- Include spec files in tsc and fix all type errors
- Add optional chaining for legacy commits without contract/order
- Align frontend types with IBKR-renamed backend fields
- Upgrade deps to resolve 21 of 23 security vulnerabilities
- ci: Build @traderalice/ibkr before tests
- Nullable close price in crypto schema & IME composition guard (#65, #66)
- Order loss in Trading-as-Git — execution detection + precise sync
- Trading system precision — Decimal throughout, add reduceOnly
- AliceId uses market.symbol (unique) instead of market.id (ambiguous)
- Shared e2e setup + fetchClosedOrders without limit/since
- GetOrder uses fetchOpenOrder/fetchClosedOrder (singular)
- AlpacaBroker getOrder, UUID orderId, precision — add Alpaca e2e tests
- Remove duplicate logToolCall from providers — AgentCenter pipeline is the single source
- Rehydrate Decimal fields in TradingGit.restore(), add UTA Bybit e2e
- Trading tool descriptions + show staged ops in push panel
- Stop UTA recovery loop for permanent broker errors (missing API keys)
- Remove CcxtBroker read-only mode, require API keys for all accounts
- Verify broker connection before confirming account creation
- CancelOrder return type + parseOperationResult status mapping
- Backend switch drops stale model config + improve Agent SDK error logging
- Clear handshake timeout on success to prevent uncaught TypeError
- Default exchange=SMART and currency=USD for IBKR contracts
- IBKR getMarketClock timeout fallback + E2E singleFork for shared connections
- E2E tests use conId-based aliceId via searchContracts + getNativeKey
- Explicitly reference static members in broker registry
- Resolve pre-existing tsc errors in trading routes, specs, MockBroker
- Switch IBKR package build from tsup to tsc, restore mixin types
- Resolve remaining tsc errors — E2E null checks, tool return type
- ClosePosition with conId-only contract, quote timeout graceful skip
- Broker init idempotent, UTA E2E shared instance, closePosition SMART routing
- Cron listener routing snapshot fires to AI engine
- Snapshot reliability — no fake data, retry on failure, carry-forward in equity curve
- Recompute netLiquidation from fresh position data instead of cached broker totals
- Add null checks to snapshot builder tests for strict tsc
- IBKR socket error crashes process — match Python's graceful disconnect
- Service tests write snapshots to tmpdir instead of data/trading/
- IBKR account data — replace request-response with persistent subscription cache
- Enforce aliceId pipe format (accountId|nativeKey) across codebase
- TrailingAmount maps to trailStopPrice instead of auxPrice
- Query conditional/trigger orders via { stop: true } fallback (#90)
- Add .js extensions to ibkr ESM imports (#94)
- Heartbeat dedup test race condition on CI
- ModifyOrder null-check bugs in Alpaca/CCXT + extend field forwarding
- FMP provider schema fixes + add EquitySearch fetcher
- Restore lastInteraction on startup + readSession filter + ISO timestamps
- Telegram auth guard hot-reload chatIds + fix misleading comment
- Persona & heartbeat default file auto-copy + UI editing
- Remove stale createAgent re-export + fix spec type errors
- Resolve remaining tsc errors in bbProvider specs and MockBroker
- Add codex provider support to channels CRUD endpoints
- Improve codex provider error logging with request details
- Add store:false and array input for Codex subscription endpoint
- Use output_item.done for function call_id instead of arguments.done
- MiniMax preset uses agent-sdk backend, not vercel-ai-sdk
- Schema form initialization + remove Custom option from presets
- Require explicit model selection for OAuth presets
- Wait for connection test before closing create modal
- Remove slash from Codex preset name + encode profile slugs in URLs
- Codex ask() uses streaming — subscription endpoint rejects non-streaming
- Test and save are separate user actions
- Force API key mode with CLAUDE_CODE_SIMPLE=1 to disable OAuth fallback
- Agent-sdk ask() throws on error instead of returning error as text
- Initialize select fields with first option when no default is set
- Hyperliquid market loading + e2e support for wallet-based CCXT
- Hyperliquid market orders via placeOrder override
- CommodityClient used equity provider instead of commodity provider
- Clarify tool description — SMA/RSI return scalar, no [-1]
- Eliminate floating-point precision artifacts in trading monetary fields
- Align equity() API return type with Decimal string fields
- Use ReactNode instead of global JSX.Element in DiaryPage
- Avoid ENOENT race in cron engine save() on concurrent writes
- ui: Unstick chat scroll during streaming + Push panel precision
- market: Client-side timeframe zoom + provider badge on K-line
- opentypebb: FMP date range + error-log safety in amakeRequest
- market-search: Rank by match quality instead of asset-class order
- market: Unshrink financial statements + persist K-line view in URL
- market: Align panel field keys with opentypebb canonical schema
- opentypebb: Alias FMP equity quote yearHigh/yearLow/marketCap
- market-data: Hot-reload provider + credentials when config changes
- opentypebb: Align yfinance fundamentals fields to canonical schema
- market: Yfinance market cap alias + tolerate ratios 500
- opentypebb: Alias yfinance quote change / change_percent / last_timestamp
- market: Rename KlinePanel setInterval setter to avoid shadowing
- config: Auto-migrate legacy accounts.json instead of crashing
- test: Uta-lifecycle e2e — string vs number assertions
- brokers/longbridge: Live mark price + options/warrants multiplier
- ui/chat: Scope auto-scroll to container, not scrollIntoView
- trading: Rebuild spot avgCost from fill history with markPrice bootstrap
- trading: ReconcileBalance fields must be string, not Decimal
- ui/tabs: Hide tab-strip scrollbar, add wheel→horizontal scroll
- ui/chat-sidebar: Notifications row reads as button, not header
- ui/simulator: Mark-price input refreshes after Set/Tick actions
- mock: Unify position-map key — getNativeKey everywhere
- mock: 3 multi-asset bugs surfaced via simulator QA pass
- ui: Portfolio position pill mirrors canonical SecType
- mock: Allow externalTrade SELL to open short positions
- uta: Wallet bootstrap respects broker-reported avgCost
- market-data: Repair FRED end-to-end + add market-data e2e harness
- ui: MarketDataPage hints — drop unimplemented providers, refresh dead URLs
- eia: Repair credential prefix + sort syntax + value coercion
- version: Hit /releases (not /releases/latest) so prerelease tags surface
- ui/diary: Newest-first ordering — diary is a feed, not a chat
- broker/ccxt: Refuse partial market load on init
- trading: NetLiquidation aggregation correctly subtracts short marketValue
- ui/tabs: Crypto.randomUUID fallback for non-secure contexts
- tool/trading: Tolerate empty string in positiveNumeric
- cron: Prune orphan snapshot / heartbeat via migration 0004
- workspaces/codex: Translate streamable-http MCP entries to codex flags
- tabs: Bump persist version after retiring diary kind
- trading: Route aliceId through resolveNativeKey for read-side tools
- trading: Seal UNSET_DECIMAL sentinel at TradingGit wire boundary
- workspaces: Allow port 3002 origin for web terminal CORS
- build: Resolve UI dist caching footgun + electron pack readiness
- test: Sync workspace aliases to e2e + bbProvider configs
- electron: Upgrade to v38 + restore full turbo build
- workspaces: Templates resolution survives tsup bundling
- ui: Mobile secondary sidebar accessible via drill-down drawer
- workspaces: Override PWD env to match spawn cwd
- workspaces: PWD env override + observable resume failure
- workspaces/codex: Read MCP URL from spawn env, not backend env
- workspaces/claude: Drop fragile --continue, fresh-spawn when no id
- ui/sidebar: Trim ActivityBar, widen secondary, popover BETA hint
- ui/sidebar: Inline disclosure for BETA hint, avoid overflow clip
- ui/routing: Land on Inbox instead of Traditional Chat by default
- ui/routing: Redirect /chat URLs to /inbox
- ui/sidebar: Move Chat above Workspaces in top nav
- trading-proxy: Rewrap upstream Response so middleware can mutate headers
- trading-proxy: Use
*catch-all instead of/*(Hono routing) - docker: Restore broker SDK deps to root package.json
- uta: Make services/uta typecheck clean (closes ANG-65)
- ui: Activate matching sidebar on URL adoption
- workspaces: De-stale chat / finance-research / auto-quant templates
- ui: Retarget store.spec off the removed chat ViewSpec
- ui: Unwire deleted chat/channels demo MSW handlers from the barrel
- ui: Bump tab-store persist version (drop stale chat/notif tabs)
- core: Use AgentWorkResultProbe in agent-work spec gate
- demo: Wire Chat sidebar — add chat-template workspace + align templates to real names
- demo,ui: Correct /api/news handler shape + bump persist version v4→v5
- tests: Isolate session-store specs from shared on-disk file
- workspaces: Exclude Codex key files from workspace git
- equity: Ratios returns TTM + history, not just a TTM snapshot
- ui: Render the toolAccess dropdown on all create surfaces
- guardian: Resolve
.cmdshims on Windows dev spawn + CI smoke - guardian/smoke: Strip ANSI before matching; block on Windows cleanup
- guardian: Tree-kill children on Windows so UTA restart doesn't orphan
- guardian: Windows-safe basename in flag watcher (broker-config restart)
- codex: Use responses.create stream instead of responses.stream()
- workspace/codex: Don't quote
openalice-workspaceMCP key in -c override - entity-store: Serialize mutations + tolerate malformed lines (concurrent-write corruption)
- workspace: Headless live-smoke — pi prompt terminator + codex approval
- workspace: Codex headless reports via the alice-workspace CLI (CLI-mode)
- quant: Calc-v2 diagnostic polish from adversarial dogfooding
- workspace: Launch opencode/pi from the frontend on Windows
- ui: Restore preset enumeration — region dropdown + model combobox, shared
- ui: Endpoint URL is a read-only input box (unlocks on Custom), not tiny text
- ui: Credential edit round-trips the API key (was redacted → looked unsaved)
- ui: Loading a credential resets the model to the matched provider's default
- ai-config: Codex tab Test clamped to responses; workspace test authMode by baseUrl
- ai-config: Probe gives reasoning models room; clean message on empty reply
- bars: UTA Bar.timestamp arrives as a string over the wire — normalize
- trading: Asset class is venue-decided, not a secType guess (CCXT ≠ commodity)
- workspaces: Auto-trust project MCP servers in claude adapter spawns
- docker: Repair self-host image after the desktop package split
- ui: Terminal renderer escape hatch + unified WebGL degradation
- ports: Wildcard-aware port probe + bind MCP to loopback by default
- mcp: Lock MCP/CLI listener to loopback, never honor BIND_HOST
- market,tools: OECD house/share price fetchers — post-reshuffle dataflows
- market: FMP insider-trading aliases for the stable endpoint
- market: Normalize FMP etf-sectors weight to decimal — same units as the yfinance fallback (consumers must not see provider-dependent units)
- market: Per-board hub breaker, tripped only by transport failures
- uta: Collapse the FX currency client to SDK-only — the missed openbb-api consumer
- tool: SectorRotation goes hub-first like the UI route — agents and the UI must read the same board
- remote-access: Same-origin PTY WS upgrade + trusted-proxy-gated X-Forwarded-* trust
- ui: Template detail page — metadata header, 13px prose, list markers
- security: Mask credentials in POST/PUT /uta response echoes
- ui: Close the create-UTA wizard on save, not on first connect
- uta: Close the order state machine — auto-sync poller, fill data, PnL invariant
- uta: Cost basis consumes sync fills at execution price
- uta: Bybit open-orders listing sweeps spot+swap — unscoped call silently hides spot
- uta: Surface Alpaca error bodies — opaque 422s carried the real reason all along
- tool: Dogfood findings — search false-negative, stale approval channel, self-correcting errors
- uta,tool,cli: TPSL refusal gate + the trading-as-git ergonomics sweep
- uta: STP/STP LMT reach CCXT venues via base-type + triggerPrice
- uta,tool: Round-4 dogfood — getOrders crash, orderId truncation, spot reduceOnly, ambiguous portfolio rows
- uta,cli: Round-6 alpaca live findings — strict flags, stage-time order validation, bracket leg tracking
- ibkr: Round-7 IBKR paper acceptance — TPSL gate, open-orders wiring, conId quotes, account-cache deltas, secType decode
- uta,ibkr: AliceId-expansion numeric-default clobber + 10xxx error routing
- ibkr,ui: Community-issue sweep — currency-keyed account values (#295), mixed-book valuation (#314/ANG-101), dead-connection gate (#294), symbol-first display (#208)
- uta,ibkr: Option sign/unit correctness (S14) + multi-row sync boot-loop crash
- uta,alpaca: Single attached exit leg → oto, not bracket
- ui: Morph workspace AI-config Save button into Test until verified
- workspaces: Persist session title across reload
- workspaces: Unstick PTY on socket drop + dev terminal transport hardening
- workspaces: Every create path enables all adapters, not just template head
- ui: Revert Midnight to neutral charcoal-black (drop the navy tint)
- ui: Responsive shell + two-sidebar hierarchy pass
- ui,uta: Render boolean preset fields as toggles, submit real booleans
- uta,ccxt: Guard demoTrading/sandbox against exchanges without the endpoint
- workspaces: Retry credential probe with thinking enabled for mandatory-reasoning models
- desktop: Drop in-window menu bar on Win/Linux + surface real bootstrap errors
- ui: Mount only the tab's own session terminal — stop cross-tab WS kick war
- workspaces: Coalesce concurrent resumes of the same session (ANG-120 defense-in-depth)
- workspaces: Use real pi install command (@earendil-works/pi-coding-agent)
- ui: Don't flash the "runtime not installed" nudge during /agents load
- ui: Preload quick-chat credentials on mount to kill the picker waterfall
- workspaces: Ship Windows .cmd twins for the alice CLI shims (issue #364 P2)
- market-data: Surface real K-line fetch errors instead of masking as "no data"
- quant: Surface bars() fetch failures as kind:"data-source", not "type"
- ui: Guard sidebar resize() — don't throw "Layout not found" on fresh mount
- ui: Date labels follow the app locale, not the system locale
- market-data: Count-only broker bar requests collapsed to one in-progress bar
- market-data: Alpaca SIP→IEX fallback + honest per-broker bar capability
- migrations: 0010 — migrate legacy workspace declarations to per-issue markdown
- ui: Scope sub-account reads with a latest-wins guard
- guardian: Resolve dev bin shims to absolute .CMD paths on Windows
- uta,ui: Non-blocking reads during broker connect + connecting state
- ui: Ask Alice sidebar blank on cold start — dead skeleton behind template gate
- workspaces: Require explicit default agent runtime
- ui: Show agent picker label when no default runtime
- workspaces: Use agent-specific terminal input
- workspaces: Preserve terminal input bytes
- ui: Suppress duplicate mapped terminal keys
- ui: Replay terminal output on theme changes
- Keep onboarding responsive during runtime probes
- release: Honor prerelease metadata channels
- automation: Compact transient runtime events
- automation: Make run history scrollable
- cli: Simplify conversation addressing
- issues: Reject unresumable owners
- webpi: Compact tool results and polling
- webpi: Align user messages to the right
- chat: Separate selection from activation
- chat: Open workspaces in quick chat
- pi: Bundle managed search tools
- connectors: Normalize Markdown attachment encoding
- cli: Require explicit installer confirmation
- codex: Launch interactive sessions with full access
- issues: Explain interrupted runs and guide retries
- Harden remote workspace startup
- Wait for Guardian takeover readiness
- connector: Build smoke artifact deterministically
- alice-invest: Degrade inbound bridge during startup
- Serialize Windows session persistence
- Route brapi quotes and tolerate empty Binance margin
- Route selected vendor bars and Binance order observation
- Respect brapi chart ranges
- ci: Prefer direct pnpm shim on Windows
- market-data: Enrich brapi key metrics
- market: Correct candle tooltip encoding
- market-data: Report HG Brasil connection diagnostics
- ui: Show market provider test errors
- market-data: Surface HG Brasil authorization errors
- portfolio: Query Pluggy custody per item
- portfolio: Use configured MeuPluggy item IDs
- portfolio: Map Pluggy custody balances correctly
- ibkr: Canonicalize conId contracts before routing
- ibkr: Align text decoder framing
- ibkr: Close liveness and option-mark gaps
- docker: Copy pnpm patches before install
- pi: Preserve native global config
- market: Restore source-aware chart navigation
- ui: Make settings responsive and scrollable
- ui: Distinguish palette previews
- ui: Clarify model injection settings
- ui: Preserve chat session across file navigation
- ui: Preserve Ask Alice shell across drill-ins
- ci: Disable Electron sandbox in Linux smoke
- pluggy: Hide zero-balance custody positions
- ci: Disable sandbox in workspace smoke
- pluggy: Derive cost basis from transactions
- pluggy: Reject placeholder zero returns
- ci: Run workspace smoke under xvfb
- market: Query BCB series by date window
- ui: Reset stale forecast tab state
- beta: Include exchange cash in model portfolio
📚 Documentation
- Sync README with recent features
- Document Web UI dev workflow and dual-port architecture
- Sync README with OpenBB integration and provider default change
- Overhaul README to reflect recent architecture changes
- Delete stale scheduling.md, fix mcp-ask config section
- Add Key Concepts glossary and simplify Quick Start
- Delete stale scheduling_zh.md
- Remove dead live demo link, update header badges
- Add browser tool description prefix clarifying Chrome extension requirement
- Update README for unified trading architecture and AGPL-3.0
- Update README to reflect TypeScript-native OpenBB engine
- Update README for Engine removal, Agent SDK, and ConnectorCenter rename
- Add CI and license badges, remove redundant license section
- Add contributing guide (issues welcome, PRs not accepted)
- Add v1 roadmap to README
- Add OpenTypeBB tutorial for running financial data with OpenAlice
- Fix API key requirements in provider table
- Add README for @traderalice/ibkr package
- Add DESIGN.md with exploration history and decision rationale
- Add experimental software disclaimer to README
- Update README with UTA architecture and IBKR type system
- Add Trading domain README — UTA design philosophy
- Branch safety rules in CLAUDE.md — never delete dev, never --delete-branch
- Rename Agent SDK → Claude in frontend, update README + CLAUDE.md
- Update README + CLAUDE.md for IBKR, broker self-registration, AccountManager lifecycle
- Add IBKR broker README and annotate data source limitations
- Update README for pre-v1 — align structure, mark roadmap complete
- Add orderType param guide to placeOrder tool description
- Update README badges and project structure
- Rewrite README intro and restructure features
- Restructure Architecture section, reorder Key Concepts below it
- Clean up Quick Start, move project structure to docs/
- Redesign README hero with centered logo and tagline
- Log three open bugs in TODO.md
- ai-providers: Note why Kimi uses agent-sdk despite Moonshot pushing OpenAI-compat
- Event system guide + CLAUDE.md subsystem pointer
- claude.md: Rolling dev→master PR convention for multi-session work
- readme: Rework header badges, add community + getting help
- claude: Branch convention for invasive refactors
- claude: Drop worktree convention; point parallel work at cloud
- todo: Cost-basis bootstrap overwrites broker avgCost
- todo: Drop cost-basis bootstrap entry — fixed in ab51371
- todo: IBKR getNativeKey may collide on option-chain fanout
- todo: Track MCP-out-of-connectors refactor
- todo: Close MCP-out-of-connectors entry (done in 6188fd9)
- TODO: Flag profile + AI Provider model needs structural rethink
- claude.md: Cover cloud claude/* side-branch hotfix pattern
- readme: Add Workspace + Inbox to Key Concepts
- readme: Post-Workspace generation pass — Brain retired, two-layer Automation, Inbox + Workspace surfaced
- claude-md: Add README maintenance discipline
- readme: Drop "Roadmap to v1" section
- todo: Record vitest config consolidation followup
- todo: Retire mcp-ask connector
- readme: Rewrite Quick Start for the dev orchestrator + 5173 reality
- readme: Reflect UTA-split architecture — two-process model + carrier framing
- readme: Add Authentication section + Docker login hint
- claude.md: Rewrite Project Structure + Key Architecture
- claude.md: Rewrite Git Workflow + retire TODO.md to Linear
- claude.md: Point future-work surface at Linear (follow-up to d1d417f)
- claude.md: Rewrite Quick Start + Pre-commit Verification
- claude.md: Refuse external PRs before pull, not after
- claude.md: Reframe architecture around Workspace launcher + Trading-context injector
- claude.md: Note --filter='!@traderalice/desktop' for cloud sessions
- claude: Update CLAUDE.md for the legacy-chat excision
- readme: Align README with legacy-chat excision
- claude: Add demo-mode subsystem guide — check handlers when changing /api/* surfaces
- quant: Align v1/v2 + expose calculateQuant via CLI + sync skill
- ai: Update CLAUDE.md for the World-B deletion; drop orphaned agent-sdk-notes
- readme: Reflect the World-B deletion — native-CLI execution + credential vault
- Refresh adapter list (+ opencode/pi) and web-subchannels description
- Introduce the Data Hub in README — zero-key market data story
- workspace: Teach the three-CLI split in template instructions
- Data root → ~/.openalice + sealed accounts.json across docs
- UTA live-testing scenario catalog — institutionalize the dogfood loop
- skills: Point rss guidance at opencli when the feed archive is thin
- claude-md: Correct stale logging convention
- Contributor recognition — CONTRIBUTORS.md + README wall + CLAUDE.md convention
- contributors: Credit @2233admin for the Linear shell design pass
- contributors: Credit @lvysssss for the Windows workspace-launch fixes
- readme: Reframe Automation for the self-scheduling model
- contributors: Credit @walkonbothsides + warm up the framing
- skills: Document the issue board on the alice-workspace skill + fix stale self-scheduling verbs
- claude-md: External-PR policy — quarantine gate, reference-and-rewrite
- contributors: Credit @bakabaka0613 for the TWSE/TPEx vendor need
- readme: Add @bakabaka0613 to the Contributors wall
- contributors: Credit @JasonWang1124 for the earliest TWSE request
- contributors: Credit @bakabird (#384/#387/#390) and @rudyll (#340)
- contributors: Credit @2233admin for the Windows guardian tsx→.CMD fix (#378)
- tools: Correct global-macro board provider label (was "(OECD)")
- Add Codex agent instructions
- agents: Preserve PR commit history
- workspace: Define session provenance spine
- Pipeline serial dev CI feedback
- Clarify PR roles by delivery mode
- Preserve Claude installer reference
- Keep installer scripts local only
- Codify CLI installer contract
- Define native remote runtime architecture
- Add remote quickstart
- alice-invest: Define architecture and delivery plan
- alice-invest: Refine architecture and executable backlog
- alice-invest: Decouple market readiness and fix delivery graph
- alice-invest: Define fork governance workflow
- alice-invest: Record inbound session dispatch
- alice-invest: Decide structured router boundary
- alice-invest: Decide signal monitor architecture
- alice-invest: Add operational runbooks
- alice-invest: Record validation publication blocker
- alice-invest: Correct CI blocker status
- alice-invest: Record remaining external blockers
- alice-invest: Record zero pending backlog
- Credit jalilsedna for IBKR report
- alice-invest: Record successful validation workflow
🔧 Refactoring
- Split persona/heartbeat into default + user override
- Move Settings from slide drawer to dedicated page tab
- Unify AI provider default into Zod config system
- ui: Replace header tabs with sidebar navigation and widescreen layout
- Split analysis-kit into thinking-kit + analysis-tools
- Split Sandbox into KlineStore + NewsStore
- Merge analysis-kit + analysis-tools into archive-analysis
- Disconnect archive-analysis from runtime
- Remove lookback from indicator formula, use interval-based data window
- Extract unified indicator calculator to extension/analysis-kit
- openbb: Per-asset-class default provider instead of single global default
- ui: Extract shared form components and deduplicate config pages
- Absorb archive-analysis into news-collector, delete dead module
- Remove trading whitelist, replace with optional symbol-whitelist guard
- Consolidate AI provider config into single file and dedicated page
- Unify connector interface with structured delivery
- Introduce ConnectorCenter to centralize outbound notification logic
- Event-driven interaction tracking in ConnectorCenter
- Simplify heartbeat status to binary HEARTBEAT_OK / CHAT_YES
- Rename wallet* to trading*, make commit/push/sync source optional
- Provider tool injection + slim AccountCapabilities
- Remove adjustLeverage and leverage from OrderRequest
- IBKR-aligned OrderRequest + modifyOrder + dead code cleanup
- Split resolveContract into searchContracts + getContractDetails
- Unify equitySearch + cryptoSearch + currencySearch into marketSearchForResearch
- Merge platform into account flow in TradingPage
- Replace slide panel with centered modal dialogs
- Split CcxtAccount into smaller modules
- Split AlpacaAccount into smaller modules
- ai-provider: Align VercelAIProvider with ClaudeCodeProvider interface
- ui: Redesign DataSourcesPage with two distinct conceptual zones
- AgentCenter becomes orchestration center, providers slim down, Engine deleted
- persistence: Unify session persistence in AgentCenter
- Move model-factory to vercel-ai-sdk, rename engine.spec
- Merge ai-config.ts into config.ts
- Create src/server/ for port-exposed services
- Move skills to data/default/skills/
- Extract Connector types to connectors/types.ts
- Extract GenerateProvider types to ai-providers/types.ts
- Introduce ISessionStore interface and test doubles (MemorySessionStore, MockConnector)
- Extract connector classes from inline object literals
- ui: Redesign portfolio positions table for multi-asset UTA support
- streaming: POST /api/chat returns SSE stream instead of JSON
- ui: Extract useChat hook with pure reducer + test coverage (17 tests)
- ai-providers: Rename GenerateProvider → AIProvider + add MockAIProvider
- Move mock.ts files into mock/ directories
- Consolidate provider utils into ai-providers/utils.ts + add vitest config
- Rename ai-provider.ts → ai-provider-manager.ts
- Push history serialization down into providers, remove inputKind
- Split decoder into modular handler files with full protobuf support
- E2e tests share single TWS connection via setup.ts
- Use IBKR types as UTA source of truth
- Rename ITradingAccount → IBroker, AlpacaAccount → AlpacaBroker, CcxtAccount → CcxtBroker
- Introduce UnifiedTradingAccount (UTA) class
- Rename providers/ → brokers/ directory
- Move broker types and factory into brokers/ directory
- Inline dispatcher and state bridge into UTA, add comprehensive tests
- Remove getAccountGit indirection, fix legacy commit crash
- Unified Trading Account (UTA) + IBKR type system (#67)
- Replace stub MockBroker with in-memory exchange simulator
- Trading-as-Git async model — push=submitted, sync=filled
- Remove defaultMarketType from CcxtBroker
- GetOrders(orderIds) — explicit query targets, no more guessing
- Remove realizedPnL from Alpaca hot path, add UTA real-broker e2e
- IBroker — remove provider field, add generic meta
- Move aliceId from broker layer to UTA layer
- MCP server create-once + auto-restart on config change
- Remove Claude Code CLI provider, unify on Agent SDK
- UTA self-connects on construction, remove external init/markOffline
- Split DataSourcesPage into MarketDataPage + NewsPage
- UTA management — remove legacy migration, add real-time health monitoring
- Move data/default/ → default/
- Eliminate Platform layer — one config = one UTA
- Split uta-real-broker e2e into uta-alpaca + uta-bybit
- Use beforeEach skip for E2E preconditions
- Align Position with IBKR, move crypto types to CCXT
- Separate health recovery from data service pipeline
- Remove hardcoded credential assumptions, add IBKR to UI
- Move contract identity resolution from UTA to IBroker
- Move account lifecycle from main.ts to AccountManager
- Broker self-registration with configSchema + configFields + fromConfig
- Exchange override system for CCXT order routing
- Align placeOrder/modifyOrder AI tool params with IBKR Order fields
- Summarize getOrders output + add groupBy contract clustering
- Extract shared MCP export layer with number coercion
- Type all market-data clients with openTypeBB standard models
- Test-provider uses SDK instead of HTTP + add bbEngine to ctx
- Reorganize MarketData config page + add commodity
- Replace ToolLoopAgent with direct generateText calls
- Replace flat AI config with profile-based system
- Codex provider uses structured input instead of text history
- Schema-driven preset forms via JSON Schema
- Replace label with name as profile identifier
- Split preset catalog + useSchemaForm hook + profile preset link
- Ccxt override hooks accept defaultImpl + fix hyperliquid markPrice
- Reorganize Events/Heartbeat/AgentStatus into Scheduler+Logs
- Unify tab bar style, merge Tools into Settings, rename to Automation
- Split News into feed terminal + collector config
- Rename Activity → Diary and redesign as card-based feed
- Remove trigger event + trigger-router
- agent-sdk: Classify auth errors to quiet user-fixable misconfig
- brain: Drop emotion dimension, constrain frontal lobe to self-referring notes
- trading: Migrate Order price fields to Decimal end-to-end
- market-data: Merge opentypebb HTTP routes into web plugin
- ui: Stop onScroll from mutating chat scroll lock
- market: Drop bid/ask from QuoteHeader
- market: Instant multi-line tooltip on Card info icon
- connectors: Single shared message producer on ConnectorCenter
- market: Sort tradeable contracts by familiarity, not broker order
- market: Collapse tradeable contracts beyond the first 3
- news: Harden write path + retire v1 getNews
- opentypebb/fmp: Split degradation logs from real errors
- trading: Preset-based UTA config (BREAKING)
- trading: Narrow all UTA monetary fields to string
- trading/tool: Tighten positiveNumeric to string-only
- ui: Sidebar styling pass + drop misleading SSE indicator
- web: Downgrade default channel — editable, no longer privileged
- ui: Section abstraction + dialog-driven channel CRUD + panel scaffolding
- ui: Align with VS Code structure — ActivityBar / Sidebar / approval-in-sidebar
- ui: Nest settings sub-routes under /settings/*
- ui: Chat moves to explicit /chat route (was at root /)
- ui/sidebar: Extract SidebarRow, full-color text + active accent bar
- ui/automation: Hoist sub-tabs into the sidebar
- ui/logs: EventLogSection switches from SSE to 3s polling
- Connectors/web split — webui/ owns the UI server, connectors/web/ keeps the chat connector
- trading: Extract one-shot order pipeline into domain
- notifications: Drop SSE stream, switch to 20s polling
- ui: Move simulator account creation into Dev → Simulator tab
- ui/simulator: Two-column layout + PnL column, drop Chinese strings
- trading: Phase 1 — type discipline + shared position math
- trading: Phase 2 — broker output funnels through buildContract / buildPosition
- trading: Phase 3 — drain CCXT wire format from canonical Contract
- trading: Phase 4 — strict SecType union + full IBKR taxonomy
- ui/sidebar: Move Diary from ActivityBar into Chat sidebar
- task: Migrate heartbeat / cron / task-router to AgentWorkRunner
- task: Migrate heartbeat/cron to AgentWork emitters; collapse per-source events into canonical; delete task-router
- snapshot: Scheduler driven by Pump instead of cron-engine
- heartbeat: Migrate to Pump; remove isInternalJob filter; orphan cron cleanup
- config: Extract MCP server out of connectors into top-level
- workspaces: Drop global-config inheritance, wire MCP per-spawn
- inbox: Drop kind field — Linear inbox has no such category
- inbox: Per-entry read state, drop watermark model
- inbox: Jump-to-workspace as Linear-style reply bar, not floating button
- workspace: Finance-research uses cp-discovery, not plugin install
- activitybar: Linear-style widened sidebar with collapsible sections
- config: Single-source port architecture, derive everything from connectors.json
- build: Dev/test consume workspace package source, drop predev hook
- paths: Centralize fs resolution behind paths.ts, prep for DMG
- uta-protocol: Lift broker preset catalog into shared package
- telegram: Await UTA-manager calls in prep for SDK swap
- uta-service: Relocate simulator routes from Alice to UTA
- tool/trading: Await UTA-manager + per-account async calls (Phase A)
- trading: Move aliceId expansion into UnifiedTradingAccount
- uta-split: Physically move src/domain/trading into services/uta
- ui: Split Trading Accounts × Portfolio responsibilities
- workspaces: Drop CLI-pick checkboxes from create flow
- build: Extract Electron shell to apps/desktop
- ui: Move Automation from Legacy to Beta in sidebar nav
- core: Excise legacy chat cluster + retire AgentCenter (backend)
- ui: Remove traditional-chat / notifications-legacy / connectors surfaces
- workspaces: Unify AI-config IO behind CliAdapter
- workspaces: Launcher-owned context injection + uniform initial commit
- workspaces: Tool-use disposition to persona, drop internal/external framing
- workspaces: Neutral instruction.md source → copied to CLAUDE.md + AGENTS.md
- ui: Centralize locale-aware formatting (i18n stage 1)
- ui: WorkspaceAIConfigModal shares the useTestGate abstraction
- ai: Delete World B — in-process AI loop, AgentWork, heartbeat
- config: Remove the now-dead profile + heartbeat machinery
- trading: UTA health as a capability ladder (connect / read / write)
- ui: Unify asset search (one logic, both boxes) + source-aware sidebar
- ui: One board hook + one meta grammar
- market: Remove the openbb-api backend — divorce step 1
- tools,cli: News → rss — the name should say what the data is
- paths: Unify on OPENALICE_HOME + route stray data/ literals through dataPath()
- workspaces: CLI-only tool injection — no MCP into workspaces
- ui: Migrate the workspace launcher sidebar off legacy workspaces.css to Tailwind
- issues: Move the issue→inbox-reports join into the domain (svc.issueDetail)
- ui: Centralize terminal theme profile
- ui: Remove terminal output color rewriting
- webpi: Remove message identity chrome
- reports: Standardize on html extension
- terminal: Adopt Orca keyboard pipeline
- ui: Adopt semantic color system
- terminal: Adopt renderer-authoritative appearance
- ui: Make theme palettes universal
🚀 Features
- Add MCP Ask connector for external agent conversation
- Add evolution mode — two-tier permission system
- Auto-seed config files on first startup, untrack from git
- ui: Add responsive sidebar — collapse to hamburger menu on narrow screens
- ui: Add section descriptions to Settings and fix nav highlight
- ui: Beautify chat — ChatGPT/Claude-style layout, code copy, animations
- ui: Polish layout — SVG sidebar icons, Alice avatar, message grouping, safe area
- Add OpenBB equity data layer (src/openbb/equity)
- Equity symbol search with local regex index
- Equity indicator calculator with OpenBB data
- Make interval a required parameter in indicator formula syntax
- Add OpenBB crypto data layer (types + client)
- Add OpenBB commodity data layer (types + client)
- Add EIA petroleum status and energy outlook endpoints to commodity client
- Add OpenBB currency data layer (types + client)
- Add crypto search tool (adapter layer)
- Add currency search tool (adapter layer)
- Register crypto search, currency search, and analysis-kit tools
- Add Data Sources page with connection test and provider key management
- web: Render tool calls as collapsible groups in chat history
- Add multi-provider model support with hot-reload
- openbb: Inject provider credentials via HTTP header and add economy client
- ui: Expand provider keys to 8 providers with descriptions
- ui: Add per-provider Test button for API key validation
- ccxt: Add ticker, funding rate queries and fix realizedPnL
- ccxt: Expose order book depth query for liquidity evaluation
- alpaca: Add real-time quote and native closePosition
- crypto: Add extensible guard pipeline for trading operations
- ui: Add Crypto Trading config page with exchange and guard management
- ui: Replace manual save buttons with auto-save and debounce
- securities: Add extensible guard pipeline for trading operations
- ui: Add Securities Trading config page with broker and guard management
- openbb: Add News client and complete Commodity client coverage
- tools: Expose equity fundamentals and news tools to AI loop
- ui: Add Portfolio Dashboard + split routes and API into domain modules
- ui: Add card-based SDK selector and enable/disable toggles to trading pages
- ui: Add sidebar nested navigation for trading config pages
- Consolidate connector configs into connectors.json with enable/disable toggles
- ui: Multi-select card grid for connectors enable/disable
- news-collector: Add persistent news collection with RSS and OpenBB piggyback
- Hot-reload connector enable/disable without restart
- ui: Add News Collector section to DataSourcesPage with enable/disable cards
- Add Custom provider option for relay/proxy endpoints
- Add /dev debug page + rename deliver() to send() with kind
- Persist push messages to session for history survival
- Persistent media store with 3-word content-addressable names
- Image ContentBlock + date-based media storage
- Add paginated event log with full disk history
- Add dedicated Heartbeat page with config, prompt editor, and recent events
- Add Tool Panel for granular tool enable/disable with hot-reload
- Add unified trading types — Contract, ITradingAccount, AccountManager, TradingGit
- Add unified guard pipeline — merge crypto + securities guards
- Unified trading architecture — provider adapters, tool factory, main.ts rewrite
- Add test coverage, fix CCXT bug, merge frontend trading UI
- Unified multi-account tool routing with source parameter
- Aggregate getQuote across all accounts
- Add read-only mode to CcxtAccount for keyless market data access
- Introduce Platform layer for multi-account trading
- Trading config CRUD API + table/panel UI redesign
- Alpaca realized PnL via FILL activities + Portfolio page redesign
- Add React Router for URL-based navigation
- Replace Python OpenBB sidecar with in-process OpenTypeBB SDK
- openbb: Add backend selector and embedded API server support
- opentypebb: Add ~40 economy/commodity routes with FRED, OECD, BLS, EIA providers
- web: Add sub-channel support with per-channel AI config
- ui: Redesign channel UI with popover + config modal
- Per-channel Vercel AI SDK model override (provider/model/baseUrl/apiKey)
- Add Agent SDK as third AI provider backend
- ui: Add Agent SDK to frontend provider UI
- Add streaming event layer to AI providers
- ui: Consume SSE streaming events for real-time AI response progress
- Publish @traderalice/opentypebb to GitHub Packages
- opentypebb: Add widgets.json endpoint for OpenBB Workspace frontend
- ui: Add favicon
- opentypebb: Add SEC provider with EquitySearch model
- openbb: Enable embedded API server by default
- openbb: Hot-reload embedded API server via plugin lifecycle
- Scaffold @traderalice/ibkr package — types, protocol, decoder, wrapper
- Complete EClient with all 100+ request methods
- Implement protobuf decoding for core TWS messages
- ToolCallLog + fix equity nullable OHLC (#69)
- Sync() accepts delayMs — exchange API settle time
- TradingPush requires manual approval via UI panel
- Push approval panel — reject with history, visual polish
- Agent SDK OAuth login + revert MCP server to per-request mode
- UTA health tracking + auto-recovery on broker failure
- Test connection before persisting account, exchange dropdown
- Structured error type system for broker → tool → AI chain
- Add IbkrBroker — IBroker adapter for Interactive Brokers TWS/Gateway
- Dynamic broker config UI — frontend renders forms from /broker-types
- Account enable/disable toggle
- Capture fill data (qty, avgPrice) in order sync + IBKR completed orders
- Add UTA snapshot system — periodic + event-driven account state capture
- Add equity curve UI and snapshot API routes
- Make snapshot interval configurable via config.json + frontend UI
- Equity curve defaults to single UTA view with account switcher
- Add single-level TPSL (take profit / stop loss) to placeOrder
- Expose TPSL on fetched orders (OpenOrder.tpsl)
- Register ETF, Index, Derivatives SDK clients
- Add commodity to calculateIndicator + fix test isolation
- Add FMP CommoditySpotPrice fetcher
- Add session awareness tools + connector context injection
- Dev page tab layout + tool execution workbench
- Telegram magic link onboarding for chat authorization
- Telegram /trading panel with multi-account support
- Hot-reload persona and brain state in system prompt
- Add Codex AI provider — OpenAI models via ChatGPT subscription OAuth
- Codex provider UI + dual auth mode (OAuth / API key)
- Rewrite frontend for profile-based AI config
- Preset system for guided profile creation + OAuth model fix
- Modal-based profile UI + remove global API keys
- Currency-aware UTA with FxService dual-table architecture
- Profile creation UX — name lockdown, duplicate check, connection test
- Ask() accepts profile parameter + test before save
- Currency-aware portfolio UI + FX rates sidebar
- Snapshot management in Dev page + CLAUDE.md verification rules
- Dynamic CCXT credentials + single-page New Account wizard
- Commodity canonical naming + catalog search
- CalculateIndicator returns dataRange with OHLCV time span
- Add GET /api/news endpoint + dev watch mode
- Add news feed view with lookback/source filtering
- Introduce AgentEvent type system with runtime validation
- Add Activity page exposing heartbeat session as read-only status feed
- Default Claude to Opus 4.7 and expose inline model switcher in profile list
- Introduce ListenerRegistry for unified event subscription lifecycle
- Open the system — webhook ingest + TriggerListener + causedBy
- Constrained emitter + topology endpoint + Flow visualization
- Unified subscribes/emits grammar + typed webhook ingest
- Event system maturation — metadata + fire() + wildcard aura + metrics
- Producer concept — pure event sources in the listener registry
- Task-router listener + task.requested external event
- Webhook sub-tab on /automation — docs + try-it for event ingestion
- security: Bearer-token auth on /api/events/ingest
- news: Curated feed menu + per-feed enable/description
- ai-providers: Add GLM (Zhipu) preset via Anthropic-compatible endpoint
- ai-providers: Region-aware endpoint picker + Kimi preset
- diary: Add Brain sidebar showing frontal lobe + emotion state
- market: Symbol search + K-line page, provider resolution from config
- market: Interval selector + labeled button groups on K-line
- ai-providers: Bump Kimi default to K2.6
- ui: Test buttons on existing AI provider profiles
- agent-sdk: Observability — result metadata, opt-in debug, notes doc
- market: Per-asset-class detail routes with equity pilot
- market: Per-card data source hint + partial metrics tolerance
- market: Auto-refresh price-sensitive panels on a timer
- chat: Infinite-scroll-up history pagination
- ai-providers: Add DeepSeek preset (V4 Pro default)
- trading: Broker-side contract search domain helper + HTTP route
- market: TradeableContractsPanel — bridge analysis to UTA
- trading: Centralized broker-search normalization rules
- market: Pass assetClass through TradeableContractsPanel
- brokers: Shared fuzzy ranker + optional catalog refresh
- brokers: EnumeratingCatalog for Alpaca + CCXT, 6h refresh cron
- brokers/ccxt: Synthesize spot holdings into Position records
- trading/wizard: Multi-step new-account flow with explicit test
- uta: Detail page at /uta/:id + UTA-naming pass top-to-bottom
- uta: Manual order entry from frontend
- brokers/others: LeverUp Monad perp DEX adapter via OCT relayer
- brokers/longbridge: Longbridge OpenAPI multi-region adapter
- trading: Broker preset wizard — Recommended vs Crypto sections
- ui: VS Code-style activity bar + secondary sidebar
- ui: URL-routed Dev tabs + absorb Logs as Dev sub-page
- ui: Wrap ChatPage in PanelGroup (v2, no app-level wrap)
- ui: Trading as its own ActivityBar item — separate activity from Chat
- ui: Drag-to-resize Sidebar + reusable Resizer primitive
- ui: Swap hand-rolled Sidebar resize for react-resizable-panels v4
- ui: Persist resizable panel layout to localStorage
- trading: Split CRYPTO secType into CRYPTO + CRYPTO_PERP
- ui/tabs: Workspace store foundation (zustand + types)
- ui/tabs: Replace Routes with TabHost — phase 1 shell switchover
- ui/chat: Drop SSE push channel, add disconnect-resume polling
- ui/tabs: Phase 2 — decouple ActivityBar from tabs, add sidebars
- ui/tabs: Per-activity ActivityBar behavior + Portfolio sidebar
- ui/live: Introduce LiveStore abstraction, migrate useAccountHealth
- core: Notifications store as canonical record; per-connector surfacing
- ui/notifications: Notification center sidebar + LiveStore
- ui: Notifications inbox tab + chat-sidebar entry with unread badge
- ui/chat: Confirm dialog before deleting a channel
- trading: MockBroker simulator console — manual撮合 + DevPage tab
- trading: Derive UTA id from broker identity, drop user-typed ids
- ui/simulator: Tab strip + sticky action panel + event log + keyboard
- ui/tabs: Right-click context menu — close others / right / left / all + copy URL
- simulator: Support OPT / FOP / FUT / STK / CASH / BOND alongside CRYPTO
- uta: Ephemeral test UTA lifecycle (boot purge + manual destroy)
- tool: Expose FRED via three economy tools (search/series/regional)
- tool: Expose EIA energy outlook + petroleum status as economy tools
- tool: Expose BLS search + series as economy tools, fix NaN sneak-through
- opentypebb: Classify network-unreachable errors for AI tool callers
- ui/uta: Redesign Trading list + UTA detail with live data, NAV chart, grouped positions, snapshot timeline
- ui: Cross-cutting design polish — typography scale, lucide icons, PnL color discipline, live-pulse indicator, Portfolio polish
- migration: Introduce versioned migration framework + extract AI credentials as 0002
- ai-providers: Preset-driven SDK adapter selection for test path
- ai-provider page: Credentials + SDKs two-region layout with bidirectional highlight
- version: GitHub Releases update detection + banner UI
- core: AgentWork primitive + ProviderResult.toolCalls plumbing
- tool: Add notify_user — intent signal for autonomous notifications
- core: Add canonical agent.work.* events for AgentWork dispatch
- core: Agent-work-listener with source registry + 17 tests
- core: Extract parseDuration to src/core/duration.ts
- core: Pump primitive — interval-scheduled callback
- workspaces: Add VS Code-style Workspaces activity
- workspaces/chat: Write Alice persona into CLAUDE.md + AGENTS.md
- workspaces/auto-quant: Zero-config via public mirror + per-workspace isolated data
- workspaces: Per-workspace AI provider config via CLI-native files
- workspaces/ui: Add ⚙ AI Provider button to sidebar workspace row
- workspaces/ui: Readable tab titles + sidebar truncate + SDK icons
- workspaces: Overview dashboard with card-based status view
- workspaces: Group Overview dashboard by template type
- chat: Two-section sidebar — workspace chat (recommended) + traditional
- chat: Chat sidebar UX — default tag, collapsible groups, visual parity
- workspaces/ui: Paused-session view — blurred faux-TUI backdrop
- inbox: Add workspace-anchored Inbox v0 alongside legacy notifications
- inbox: Docs + comments schema, live render from workspace
- inbox: Inbox_push MCP tool via per-workspace /mcp/:wsId route
- inbox: Jump-to-workspace CTA below comments
- workspace: Session cards in no-session empty state
- workspace: Finance-research template + satellite-repo pattern
- workspaces: Windows compat via Git for Windows bash wrap
- inbox: Per-entry delete (trash button + Delete shortcut)
- workspace: AI provider test button with test-before-save gating
- workspace: Lock Codex wire_api to "responses" + chat-only provider hint
- activitybar: Split Chat into workspace-shortcut + Legacy section
- activitybar: Promote Connectors to Legacy section, drop from Settings
- activitybar: Introduce Beta section; promote trading-related entries
- electron: Introduce guardian skeleton (port probe + backend spawn)
- dev: Orchestrator unifies pnpm dev to single command with auto port adjustment
- workspaces: Path-centric debug infra for session spawn/resume
- workspaces: Headless probe API for self-debug closure
- docker: Self-host image with bundled claude + codex CLIs
- ui/workspace: Collapsible side panels + Git status labels
- workspaces: Template catalog + README convention + version lineage
- uta-protocol: Bootstrap shared wire protocol package
- uta-service: Bootstrap co-located UTA service process
- guardian: Introduce L2 supervisor module, replace scripts/dev.ts
- guardian: Add flag-based UTA restart protocol
- uta-split: Cut Alice trading routes over to BFF proxy
- uta-client: Lift trading types to uta-protocol + build SDK skeleton
- uta-service: Add 4 routes the AI tool layer needs
- uta-client: Wire SDK's commit/sync/simulatePriceChange/getContractDetails
- uta-service: Add 4 stage-only wallet routes for the AI tool layer
- uta-service: Expand aliceId server-side in contracts/details route
- uta-service: Add POST /quote with aliceId expansion + SDK envelope fixes
- alice: Swap main.ts to UTAManagerSDK — Alice no longer holds broker state
- docker: Dual-bundle build + tini-supervised Guardian prod entry
- safe: Add agent-first red-team penetration kit
- auth: Admin token + session cookie + middleware (L1+L2 gate)
- auth: Gate WebSocket upgrades + close TDD loop on playbooks 01-03
- auth: UI login gate + /api/auth/status localhost passthrough
- auth: SPA shell exception + bind 0.0.0.0 in container
- ui: Stage 1 demo mode — UI runs with no backend
- workspace: Bearer auth option for Claude provider config
- workspace: Carry authMode through profile Apply + MiniMax preset
- ai-providers: Honor profile authMode in GenerateRouter runtime (ANG-72)
- demo: Stage 2 PR-1 — Vercel-deployable + visual skeleton
- demo: Stage 2 PR-2 — PTY transcript replay + recorder tool
- demo: Stage 2 PR-3 — flagship scenario (Inbox ↔ workspace ↔ transcript)
- demo: Stage 2 PR-4 — secondary fixture richness
- migrations: Add 0007 to retire legacy-chat config orphans
- demo: Add Vercel Web Analytics, gated to demo mode only
- cli: Add
aliceworkspace CLI adapter over the tool registry - demo: Snapshot AAPL market data, serve in demo mode
- skills: Pre-trade pipeline — sector-rotation + build-thesis, tool-agnostic
- workspaces: Tell chat agents to hand finished work back via the inbox
- workspaces: Chat-cli template — tools via
aliceCLI, inbox via MCP - workspaces: Launcher-level toolAccess option (MCP vs CLI); merge chat-cli into chat
- devtools: Pre-fill Tools tab from a tool's declared example input
- devtools: Declare example inputs for the read-only data tools
- devtools: Example inputs for trading tools (mutations conservative)
- ui: Create-workspace dialog + single-source the form across surfaces
- entities: Phase 1 — entity store + entity_upsert/entity_search MCP tools
- entities: Phase 2 — Tracked tab + [[name]] backlinks
- entities: Surface entity_upsert / [[name]] in the chat workspace instruction
- entities: Self-describing asset names — kind-prefixed (stock-vst, crypto-btc)
- workspace: Drop the git panel; fold the files panel from a top-bar toggle
- workspace: Add opencode as a third agent adapter
- workspace: Add Pi as a fourth agent adapter (CLI-injection tools)
- ui: React-i18next foundation + language picker (i18n stage 2)
- ui: Translate ActivityBar + Settings page (i18n slice)
- ui: Translate nav secondary sidebars (i18n batch 1)
- ui: Translate login gate (i18n batch 2)
- devtools: Tool-audit skill + repo-root .mcp.json for dev-side auditing
- analysis: Right-side volume signals — RVOL/OBV/MFI/VWAP + relative-volume movers
- discovery: Add dollar_volume (traded notional) as the absolute volume axis
- tool: Expose ETF tools to the agent (ANG-79) — thematic-ETF self-serve
- workspace: Give Pi full MCP via an injected bridge extension
- ui: Show all agents on template cards + opencode/pi glyphs
- analysis: Sector rotation map — GICS-11 cross-section (ANG-80)
- ui/market: Sector rotation map — quadrant chart + ranked table
- ui/workspace: Top-right Spawn button on template detail, unify create flow
- ui/workspace: Always-visible "New session" button in workspace header
- ui: Dedicated file viewer tab + clickable [[wikilinks]]
- workspace: Pi by-id session resume via launcher-assigned id
- workspace: Codex + opencode by-id session resume (post-spawn harvest)
- workspace: Unified headless launch interface + standard dispatch API
- ui: Add Traditional Chinese (zh-Hant)
- ui: Translate Inbox / Tracked / News pages (i18n)
- ui: Translate Chat workspace surface (i18n)
- cli: Split the alice CLI into an export family (data + workspace)
- workspace: Headless task management plane (registry + async dispatch + panel)
- ui: Headless Runs panel — frontend for the management plane
- workspace,ui: Runs panel — store full prompt + collapsible task cell
- market-data: Federated bar layer — Phase 0 (vendor, behavior-preserving)
- market-data,trading: Broker K-lines via UTA + federated search — Phase 1 (CCXT)
- trading: Alpaca getHistorical — equity broker bars (Phase 4a)
- trading: Keyless read-only data UTAs — OOTB crypto K-lines, no key
- analysis: Quant Calculator v2 — barId-keyed Python-subset DSL (Phase 2)
- ai-config: Refresh provider model catalog to current lineups
- workspace: Central credentials — template injection + bidirectional modal
- automation: Cron fires a headless Workspace run, not in-process AgentWork
- ui: Reframe AI Provider page as a credential vault; Test via probe
- ui: Add Agent runtimes panel to the AI Provider page
- ai-config: First-class wire-shape registry + modern test-gated credential form
- ai-config: Persist wireShape on the credential + show the resolved endpoint URL
- ai-config: Unify Test on a shared wireShape dispatcher + honor it at runtime
- ai-config: Credential holds a wires map (multi-wire), dedup by key
- ai-config: Multi-wire credentials — one key declares every shape it speaks
- quant,trading: Retire v1 indicator from the tool surface + harden UTA bootstrap
- quant: Expose searchBars — the unified barId search handle for v2
- cli: Expose searchBars as
alice analysis search-bars— workspace agents run v2 via CLI - quant: Panels — dict/list result so v2 batches many computations in one call
- quant: 7 more primitives + a dedicated openalice-quant skill
- market,ui: Federated K-line sources in the chart — pick the provider (Phase 3)
- market,ui: Reform the asset search to be source-aware (explicit provider)
- market,ui: Reference-data contract + Movers board (own standard, not OpenBB-compat)
- market,ui: Calendar board (earnings / IPO / ex-dividend, FMP)
- market,ui: Macro board (curated FRED regime dashboard)
- market,ui: Term Structure board (Deribit BTC/ETH futures curve)
- market,ui: S&P 500 valuation strip on the market landing (multpl, keyless)
- market,tools,ui: Global Macro board + OECD country tools
- market,tools,ui: IMF PortWatch shipping data — stub provider retired
- config: User-global data-vendor keys (~/.openalice/provider-keys.json)
- market,tools: Keyless yfinance fallbacks for FMP-only cells
- guardian: Configurable ports via data/config/ports.json + env
- market,tools,ui: Land the salvageable no-consumer endpoints
- market,tools: Fix the broken long-tail fetchers and land the rest
- market,ui: Fed board + Global Macro house/share columns + batched OECD
- market: Reference cache — the hub's cache layer in single-node form
- market: Hub-first reference boards — zero-key out of the box
- market: Endpoint-grain hub coverage — FRED/EIA/BLS proxy sentinel + hub calendars
- ui: Surface meta.origin on boards — hub/local/stale badges
- market: Hub-first rotation + detail panels off the legacy passthrough + settings reorder
- uta: Hub FX table — one cached GET replaces per-currency vendor fetches
- cli:
traderhub— a dedicated CLI for low-frequency market data - workspace: Bundle a self-maintained opencli-reader skill into chat
- workspace,ui: CLI as the default tool access + community template tier
- ui: I18n for template/create surfaces, spawn → create, auto-derived tags
- cli: Alice-uta — trading lands on the CLI surface (cron stays MCP-only)
- ui: Make the secondary sidebar per-activity optional — News goes full-width
- ui: Status-first Market Data settings — coverage map + Advanced fold
- guardian: Own the Vite dev port — probe, strictPort, truthful banner, origin allowlist
- workspaces: Headless runs capture their agent session id + full output log
- webui: Spawn-with-resume accepts adapter-native session ids
- ui: Headless runs as a collapsed second tier under each workspace
- paths: Default user-data home moves to ~/.openalice
- desktop: Relocate packaged user data into ~/.openalice on first launch
- security: Seal broker credentials at rest (AES-256-GCM, machine-bound key)
- uta: Record externally-placed orders as squashed [observed] commits
- uta: External-order observation cadence is configurable, default 15m
- ui: External-order monitoring cadence is editable from the Trading page
- uta,ui: UTA detail page becomes an exchange frontend
- ui: Exchange-style two-column layout, honest account panel, aligned header actions
- tool,cli: Agent-boundary compaction — trading outputs stop lying to the model
- uta,ibkr: Hub/leaf contract identity — bond chains, option chains, FX families
- workspaces,ui: Ask-Alice quick-chat launch — seeded TUI + landing composer
- workspaces: Quick-chat is one chat workspace per day
- ui: Files panel default-collapsed, Workspaces below News, pending-push badge
- ui: Trading-as-Git history as one recency stream + per-UTA filter
- ui: Ask Alice as the primary entry + cleaner session rows
- ui: Redesign the Ask Alice sidebar — prominent New chat, chat-history feel
- ui: Split-button on New chat — keep New workspace in a dropdown
- ui: Session titles from the first message + state-as-action icon
- ui: Confirm before deleting a session
- workspaces: Cross-workspace file collaboration — inbox read + peer path + git identity
- ui: Linear dark palette — re-traced from #302, glare-softened
- ui: Linear shell density pass + responsive Ask Alice backdrop
- ui: Light / dark / auto theme — Daybreak + Midnight palettes + toggle
- ui: Theme the Workspaces surface + terminal (kill the dark island)
- uta: Add Binance broker preset (live + demo trading)
- desktop: Supervise UTA in the Electron shell + beta-aware L1 update check
- workspaces: Native cross-platform bootstrap — bundle git (dugite) + port bash to Node
- workspaces: Auto-detect installed agent runtimes + frontend install guidance
- workspaces: Inject AI config into quick-chat for loginless runtimes (opencode/pi)
- workspaces: Workspace self-scheduling + retire central cron
- ui: Redesign inbox detail + add prose base size + hide editor tabs by default
- ui: Graduate Automation from Beta to the primary nav section
- ui: Cluster inbox by workspace with a Time/Workspace view toggle
- ui: Per-activity secondary-sidebar width + layout polish across 7 sidebars
- ui: Spawn a session per chat workspace from Ask Alice
- ui: Per-workspace "+" opens the Ask Alice composer, targeted
- analysis: Retrospective / Time-Machine primitives — as-of snapshot, backtest, dated news, freshness contract
- issues: Phase 1 — human+AI issue board over per-workspace markdown issues
- issues: Phase 2a — read-only issue detail view + link runs to issues
- issues: Phase 2b — issue write paths (UI edits + comments, CLI verbs)
- issues: Issues join the [[]] graph — cross-ref entities + issues, warn on duplicate names
- inbox: Stamp agent-invisible origin on entries → Inbox↔issue cross-link
- issues: Expose the global issue board on the alice-workspace CLI (reads global, writes local)
- workspaces: Seed per-agent default credentials into new workspaces
- inbox: Phase 2 origin — stamp interactive-session pushes (agent-invisible)
- market-data: Reach global equities via yfinance online search
- market-data: Opt-in incremental vendors + Eastmoney CN A-share
- market-data: Native TWSE/TPEx vendor — search, quote, metrics, profiles
- market-data: Self-describing vendors + agent-toggleable picker
- uta,ccxt: Sub-accounts — backward-compatible multi-wallet layer
- uta: Risk visibility, proxy bridging, partial-tolerant aggregation
- ui,uta: Instrument long-name + primary exchange on contract rows
- trading: AI auto-trading master switch (replaces dead evolution mode)
- ui: Systematic first-load skeletons + shimmer for data surfaces
- ui: Skeleton loading for the chat + workspace sidebars
- ui: Skeleton loading for remaining data surfaces
- workspaces: Add self-described display metadata
- ui: Add terminal theme controls
- Make agent runtime readiness probes async
- Probe runtimes in the durable chat workspace
- automation: Normalize headless runtime output
- automation: Paginate run history
- automation: Add durable resume identities
- automation: Add readable resume ids
- issues: Add explicit execution ownership (#533)
- inbox: Record published report revisions (#534)
- issues: Expose Session provenance (#535)
- trading: Attribute UTA decisions to Sessions (#536)
- workspace: Add provenance-aware collaboration (#537)
- chat: Teach awaited peer collaboration
- cli: Ask Inbox and Issue authors
- cli: Collect peer replies together
- collaboration: Ask Inbox and Issue agents
- issues: Make markdown What canonical
- ui: Add visual Markdown issue editor
- ui: Autosave issue What inline
- issues: Unify and coalesce activity log
- issues: Unify assignee and schedule ownership
- workspaces: Add WebPi session surface
- webpi: Group tool activity in transcript
- remote: Add SSH tunnel connector
- cli: Add local runtime bootstrap
- cli: Add guided installer experience
- cli: Harden guided installer
- reports: Support static HTML attachments
- workspaces: Add safe template upgrades
- workspaces: Add safe Workspace absorb
- Install broker integrations as optional packs
- Add sticky issue owners and mutation activity (#606)
- Add native server and managed ssh remote
- Add workspace template upgrade CLI
- Bootstrap source runtime build tools
- Add workspace manager control plane
- installer: Bootstrap managed Pi
- installer: Align remote bootstrap with local CLI
- Publish the stable CLI installer
- remote: Manage source checkout lifecycle
- alice-invest: Add safety configuration foundation
- connector: Define generic inbound text contract
- connector: Define inbound journal state machine
- connector: Persist inbound journal and dedupe
- connector: Dispatch inbound messages with retry
- connector: Add authenticated Alice inbound bridge
- connector: Mount authenticated inbound bridge
- connector: Recover inbound work after restart
- workspaces: Persist external conversation bindings
- workspaces: Serialize external conversation dispatch
- workspaces: Resume external conversations through session control
- workspaces: Dispatch inbound conversations to sessions
- connector: Reserve new conversation command
- workspaces: Rotate external conversation bindings
- connector: Add owner conversation rotation
- alice-invest: Add safe router fast path
- alice-invest: Define fixed income contracts
- alice-invest: Define market freshness contract
- alice-invest: Add structured router transport
- alice-invest: Validate structured router output
- alice-invest: Define router decision schema
- alice-invest: Implement message router
- alice-invest: Add fixed income calculations
- alice-invest: Compare fixed income products
- alice-invest: Gate B3 source evidence
- alice-invest: Gate crypto source evidence
- alice-invest: Add market universe gates
- alice-invest: Define signal contracts
- analysis: Add trailing volatility indicator
- alice-invest: Add B3 trend strategy
- alice-invest: Add crypto spot strategy
- alice-invest: Add deterministic risk validator
- alice-invest: Add append-only signal ledger
- alice-invest: Format Telegram signals
- alice-invest: Add reproducible B3 backtest
- alice-invest: Add reproducible crypto backtest
- alice-invest: Add B3 shadow mode
- alice-invest: Add crypto shadow mode
- alice-invest: Evaluate B3 shadow evidence
- alice-invest: Evaluate crypto shadow evidence
- alice-invest: Add capability readiness core
- alice-invest: Gate readiness by market evidence
- alice-invest: Dispatch gated paper alerts
- alice-invest: Add deterministic signal monitor
- alice-invest: Add redacted correlation audit
- alice-invest: Add operational health metrics
- ui: Add Alice Invest operations tab
- alice-invest: Expose operational readiness
- alice-invest: Persist readiness evidence
- alice-invest: Derive readiness from evidence
- alice-invest: Expose readiness evidence
- alice-invest: Migrate readiness evidence journal
- alice-invest: Complete signal lifecycle monitor
- alice-invest: Recover monitor inbox delivery
- ui: Display alice invest evidence and blockers
- alice-invest: Supervise monitor ticks in Alice
- alice-invest: Record monitor gaps and crossings
- market-data: Add brapi research source
- Show brapi profiles and key metrics
- Show key metrics refresh time
- market-data: Add brapi fundamentals
- market: Show quote and reporting base dates
- market-data: Enable BRAPI intraday candles
- market: Show candle details on hover
- market-data: Add HG Brasil research vendor
- portfolio: Add read-only Pluggy custody sync
- portfolio: Include Open Finance custody in equity dashboard
- portfolio: Present Pluggy as a connected account
- uta: Expose Pluggy custody as read-only account
- terminal: Enable Kitty keyboard reporting
- terminal: Restore cold attaches from headless snapshots
- ai: Register model semantics for workspace injection
- ui: Add paired day and night palettes
- market: Add FX analysis workbench
- ui: Add three terminal-aware palettes
- ai: Surface and inject reasoning effort defaults
- demo: Showcase sessions with WebPi
- portfolio: Show cached holdings while refreshing
- pluggy: Surface investment returns
- portfolio: Add investment returns page
- market: Add Brazil market context board
- market: Show portfolio equity quotes
- portfolio: Add wealth forecast
- beta: Forecast wealth from monthly contributions
- beta: Add balanced model portfolio comparison
- beta: Reserve six months of salary in fixed income
🧪 Testing
- Add 48 unit tests for equity indicator calculator
- Add unit tests for trading dispatchers and wallet state machines
- Add message pipeline integration tests (42 tests)
- Add core module unit tests (134 tests)
- Add web streaming integration tests (chat pipeline + SSE transport)
- Add streaming POST SSE transport tests (3 tests)
- Expand unit test coverage from 62% to 74% statements
- Port Python tests + add comprehensive test suite (51 tests)
- Add unit tests for all IBroker methods on Alpaca and CCXT
- Precision + reduceOnly behavior tests (TDD contracts)
- Add UTA e2e tests — MockBroker lifecycle + Bybit sandbox
- Add raw CCXT diagnostic + e2e serial execution
- E2e confirms aliceId fix — orders now route to perp correctly
- Ccxt-bybit getOrder with 5s delay — still null, not a timing issue
- Fix E2E for sync-fill behavior + market hours skip
- Fix remaining return→skip in ccxt-bybit e2e + add README
- Add IBKR E2E tests, refactor setup.ts safety mechanism
- Add order lifecycle E2E tests that run outside market hours
- Add bbProvider integration test framework + yfinance tests
- Add FMP bbProvider integration tests (33 fetchers)
- Add Codex provider e2e tests
- Add IBKR currency tracking e2e tests
- Add analysis tool e2e tests across equity/crypto/commodity
- e2e: OKX broker — covers spot synthesis end-to-end
- e2e: Assert UNSET_DECIMAL never crosses TradingGit wire boundary
- paths: Cover dataPath/defaultPath/uiBundlePath/templatesPath
- auth: Unit tests for token-store, session-store, and middleware
- core: Rewrite AgentWork/heartbeat/cron specs for the rewired path
- config: Sandbox the global-provider-keys spec (OPENALICE_HOME temp dir)
- market: Strict-type the cache spec helper (tsc-only issue post-merge)
- Pin OPENALICE_HOME to sandbox roots in vitest + smoke harness
- config: Cover workspace-credential-defaults routes; enrich demo
- automation: Cover current Claude and Codex streams
- cli: Add local installer Docker smoke
- Harden broker pack installation
- cli: Make install identity fixture portable
- Make Windows package checks resilient
- Allow cold broker registry loading on Windows
- workspaces: Await external dispatch scheduling
- workspaces: Stabilize external dispatch serialization
- alice-invest: Rerun validation blockers
- alice-invest: Record environment validation rerun
- alice-invest: Fix readiness evidence fixture
- Stabilize slow recovery checks
- alice-invest: Validate operational readiness view
- installer: Close the dev release loop
- market-data: Drop direct BLS e2e
- desktop: Normalize Windows probe paths