Commit Graph
60 Commits
Author SHA1 Message Date
Arnav NavalandCursor 64dfd50d12 [arnav] remove dead code identified by audit
Each removal verified by checking actual production callers (frontend,
electron, internal HTTP, MCP-server subprocesses) — not just test
references. Symbols whose only callers were tests are removed along
with those tests.

Production removals (~390 LOC):

- backend/main.py
  - websocket_session: drop `agent:edit_message` WS branch. Frontend
    only ever uses HTTP `POST /api/agents/sessions/{id}/edit_message`
    (frontend/src/shared/state/agentsSlice.ts); nothing on the wire
    sends a WS message of this type.

- backend/apps/agents/agent_manager.py
  - AgentManager._build_connected_tools_context (~80 LOC): zero call
    sites in production; the connected-tools system-prompt context is
    built inline in _compose_system_prompt now.
  - AgentManager._approx_tokens / _summarize_message_block: pure
    helpers whose only callers were tests. The compaction path uses
    LLM-driven _maybe_compact instead.

- backend/apps/agents/browser_agent.py
  - clear_browser_history: only used by tests. _browser_history is
    pruned via the size cap inline.
  - MODEL_MAP constant: never read.

- backend/apps/agents/mcp_preflight.py
  - DISCOVERY_SCAFFOLDING (~25-line system-prompt block): defined but
    never appended anywhere. The header comment described an intended
    use that the codebase no longer has.

- backend/apps/agents/providers/registry.py
  - thinking_params_for, _is_9router_available, OPENROUTER_BASE_URL,
    get_context_window: zero callers in production. Thinking-params
    routing is done by the provider classes directly; 9Router presence
    is detected at request time; context-window numbers are stamped
    onto sessions from BUILTIN_MODELS at launch.

- backend/apps/agents/tools/{base,web}.py
  - BaseTool.get_schema (abstract) + WebSearchTool/WebFetchTool
    overrides: production code in backend/apps/web/web.py instantiates
    these tools and only calls .execute(); the JSON-schema lives in
    the HTTP wrapper, not on the tool class.

- backend/apps/outputs/outputs.py
  - _resolve_model + MODEL_MAP: tests-only.
  - load_output: docstring claimed it was a public helper for "other
    modules" but no module imported it.

- backend/apps/service/client.py
  - set_user_id, the _user_id module global, and the dead cache short-
    circuit in _get_user_id: setter was tests-only. _get_user_id now
    reads user_email directly from settings on every call.

- backend/apps/settings/credentials.py
  - get_provider_credentials: zero callers. The sibling get_agent_sdk_env
    is kept (it has the explicit "Legacy helpers" keep-comment).

Test updates:

- test_agent_manager_unit.py: drop _approx_tokens / _summarize_message_block
  cases (5 tests), update module docstring index.
- test_browser_agent_unit.py: drop clear_browser_history cases (2 tests)
  and the unused _Boom helper class in the repr-fallback test.
- test_outputs_unit.py: drop _resolve_model / load_output cases
  (4 tests), update docstring + import list.
- test_v2_invariants.py: drop get_context_window tests + get_schema
  assertions on web tools (kept name + BaseTool inheritance checks).
- test_service.py: rewrite the 4 set_user_id-driven tests to drive
  user_id through settings.user_email instead, so _get_user_id's live
  envelope-stamping path stays covered.

Verification:
- ruff --select F401,F811,F841 backend/  →  clean.
- pytest backend/tests/ → 1167 passed, 1 deselected (pre-existing
  sandbox git test, unrelated). No tests dropped silently — every
  deletion is paired with the corresponding test removal/rewrite.
- Dead-code scan re-run: dead WS events 1→0, Tier-2 high-confidence
  14→11 (residue is SDK-callback `context` params + Pydantic `cls`
  validators — both false positives vulture can't see through),
  vulture total 165→145.

Total diff: -565 / +34 LOC across 15 files.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-06 18:49:30 -05:00
Arnav NavalandCursor 9100e91652 [arnav] clean up unused imports and dead local variables
Auto-fixed 52 ruff F401 findings (unused imports) across 22 files
in backend/ and backend/tests/. Manually resolved 8 F841 unused
locals that ruff flagged as unsafe-fix:

- agent_manager.resume_session: drop dead hours_since_closed block.
- main.py mcp-meta + outputs-meta activate handlers: drop dead
  reason = body.get("reason") binding (server ignores the field).
- dashboards.seed_demo, tools_lib.m365_device_login: keep _load(...)
  call for its 404 side-effect, drop unused binding, add intent
  comment.
- outputs.auto_run_output: keep `import anthropic` as availability
  probe, mark with `# noqa: F401` and explanation.
- dead_code_scan._extract_ws_event_branches: drop vestigial
  ws_handler_lines set (never written or read).
- test_browser_agent_unit.test_hash_tool_call_falls_back_to_repr:
  drop the unused _Boom class+instance (the actual self-referential
  bait is bad_input/bad_result; _Boom was never passed to the
  function under test).

Result: 1184/1184 backend tests pass (1 deselected: pre-existing
sandbox-only git test). ruff --select F401,F811,F841 backend/ now
clean (was 60 findings).

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-05-06 18:30:34 -05:00
ciregenz c64bf65c66 [eric] session state additions + ui hook refinements 2026-05-05 17:05:54 -07:00
ciregenz 49c649e3d9 [eric] single sync function for all state syncing 2026-05-05 12:11:07 -07:00
ciregenz 3c42d8738f [eric] refactor internal service layer 2026-05-04 19:39:19 -07:00
ciregenz b7a1faee38 [eric] delete miscelaneous scrapped code 2026-05-04 19:15:42 -07:00
ciregenz 5df979a59a analytics: fix completion-rate, mock-cost, and tool-count accuracy bugs 2026-05-04 17:50:11 -07:00
ciregenz 8286cc1a5c [eric] delete ~3.6k lines of dead code (old unused agent runtime, ghost fields, orphan scripts). all 660 tests still pass, no functional
change.
2026-05-03 22:39:17 -07:00
ciregenz 5f5b932c53 [eric] tiny dead-code sweep — drop unused langchain pins from requirements.txt (saves ~5MB on packaged build) plus a few orphan exports left
over from past iterations (temp_state slice fields, clipboard timestamp getter, three never-imported lastSeq helpers).
2026-05-03 21:31:13 -07:00
ciregenz d14cc89300 [eric] tool labels read like a person — Plugged into Gmail, Saved a snapshot, varied phrasings per call; session/turn labels
in sentence case; activating an MCP mid-chat now actually works instead of the model guessing at made-up tool names. Also a bunch miscelaneous ui/ux tweaks, I cant be bothered :)
2026-05-03 20:44:32 -07:00
ciregenz ade79315a9 [eric] thinking pill shows full turn cost (input + output + subagent + tool work) with click-to-see input/output breakdown; reopening
completed chats no longer replays the typewriter (per-session lastSeq survives AgentChat remount so resume protocol stays at the high-water
  mark instead of last_seq=0)
2026-05-03 11:21:02 -07:00
ciregenz d310f9e031 [eric] thinking pill works on GPT/Gemini (clickable bubble with duration + token count + honest "provider does not expose
reasoning text" note instead of vanishing); friendlier MCP tool names (Gmail/Slack/etc with verb-derived actions); auto-collapse Anthropic
  thinking pill on turn end so the answer comes first; header timer matches per-turn pill (sums in ms, rounds once); thinking pill rolls 251s
  to 4m 11s; parallel tool count chips do not jitter as N grows; drop Gemini 2.5 from picker (Gemini 3 family only); aux-LLM calls route
  per-model so cheap-tier auxiliary calls do not 401 on cc/ subscription routes
2026-05-02 23:46:13 -07:00
ciregenz 691a92c2a1 [eric] dynamic turn labels in the thinking pill via cheap-tier aux LLM + cache pre-warm on dashboard mount for faster turn-1
TTFT
2026-04-30 12:31:48 -04:00
ciregenz 98349df9f1 [eric] faster replies + smarter chat: optimistic message bubbles, live thinking... pill, friendlier tool-call labels (Reading → Read),
compaction chip, native completion notifications, prompt-cache flip for ~70% cheaper/faster
2026-04-29 14:07:18 -04:00
ciregenz b7c93e2251 [eric] global ⌘K search + ⌘L clear chat + sticky notes on canvas + merge Chat into Ask + chat composer/dock sizing + spellcheck 2026-04-29 02:41:01 -04:00
ciregenz 5d69215739 [eric] phase 2+3: outputs gate, smart compaction, slash commands, preflight + auto-continue, bumped Anthropic SDK 2026-04-28 19:55:06 -04:00
ciregenz 30d581e9ec [eric] phase 1: MCP activation gate, context pill, friendly 429s, -api routes so API keys actually work 2026-04-28 19:01:07 -04:00
ciregenz 2379dd92be [eric] security: lock down the local websocket + http api with a per-install auth token 2026-04-25 02:26:13 -07:00
ciregenz f5cc3a36fb [eric] remove vendored 9router (now fetched from npm at build), remove Copilot, and fix subs + tools 2026-04-25 02:26:08 -07:00
ciregenz 11b07bde28 [eric] production push 1.0.24: removed non-Claude MCP upfront-load warning (context-cost only, zero functionality impact), fixed fullscreen
+ webview popup dark-screen via new-window → exitFullscreen so parent stays interactive, ErrorSlime extracted to shared component and
  rendered on all chat error cards (Network / Servers maxed / Plan limit / Subscription), Network issue classifier tightened to real errno
  codes + retry CTA removed since edit_message-based replay was truncating successful tool history — copy now directs user to send-new-message
   once WS auto-reconnects
2026-04-21 15:11:56 -07:00
ciregenz b9f7698b0c [eric] default-model + thinking-mode settings overhaul: Settings dropdown mirrors the in-session picker (provider-grouped from
state.models.byProvider, disambiguates same-named models by · Provider), toolbar now honors the stored default_model instead of snapping to
  stale Redux initial 'sonnet' and re-syncs on every reopen so last-used picks don't leak, smart fallback per priority Anthropic > OpenAI >
  Gemini > OpenSwarm Pro > OpenSwarm with Snackbar warning when the user's default becomes unreachable, new Default thinking mode setting
  (Auto/Off/Low/Medium/High) added to AppSettings and threaded into AgentSession on launch, onboarding flow for user intuitive-ness slight tweaks
2026-04-20 14:56:09 -07:00
ciregenz 7eb85a7127 [eric] subscription UI fixes: cards no longer flicker to the Starting-subscription-service spinner mid-task (is_running TTL cache + retry/poll on mount), show
Anthropic as its own picker group alongside OpenSwarm Pro when both are connected so users can pick per-request
2026-04-16 11:12:27 -07:00
ciregenz 1a68ccfc7b [eric] OpenSwarm Pro: new managed plan alongside BYO — deep-link activation from billing checkout, onboarding + Settings card with live usage, gradient OpenSwarm Pro group in
the model picker, inline error cards for rate-limit/connection failures, debugger startup fix
2026-04-15 23:05:02 -07:00
ciregenz 14e1d02bbb [eric] reasoning UI + thinking-level controls: collapsible 'Thought for Ns' bubble with shimmer, per-session thinking level (off/low/med/high/auto) on
reasoning-capable models, gate GitHub Copilot as 'Coming soon', delete Twitter/xbird integration, fix model-picker first-click + 200K context cap on Sonnet/Opus, revive
  arrow-key dashboard nav after typing/clicking/zooming
2026-04-15 12:47:34 -07:00
ciregenz 4778cea80e [eric] multi-model subscription support: connect ChatGPT Plus, Gemini Advanced, and GitHub Copilot subscriptions via 9Router
- Add BUILTIN_MODELS for OpenAI (GPT-5.4/Mini/5.3-Codex), Google (Gemini 3 Pro/Flash, 2.5 Pro/Flash), and GitHub Copilot
  - Add resolve_model_id_for_sdk() and resolve_aux_model() to route prefixed model IDs (cx/, gc/, gh/) through 9Router translator
  - Add GET /agents/models endpoint returning available models based on live 9Router connection state
  - Enable ENABLE_TOOL_SEARCH=auto for all providers so non-Claude models get full tool access (23 built-in + all MCPs)
  - Add thinking block streaming support (ThinkingBlock in stream handler + AssistantMessage) for reasoning models
  - Fix Gemini 3 thought-signature errors: use skip_thought_signature_validator per Google docs
  - Fix WebSearch blocked_domains/allowed_domains empty-list rejection on Anthropic API
  - Fix browser_agent text_parts UnboundLocalError on non-Claude models
  - Fix auxiliary LLM calls (title gen, group meta, dashboard naming, view builder, browser agent) via resolve_aux_model
  - Add Codex OAuth callback listener on port 1455 for ChatGPT Plus subscription connect
  - Route Gemini OAuth through system browser since Google blocks embedded webviews
  - Override Electron popup user-agent for OAuth
  - Fix duplicate OAuth callback with idempotent completed_oauth tracking
  - Fix Settings modal tab routing and stale warning banner
  - Add API key inputs for OpenAI, Google, and OpenRouter
  - Add MCP warning banner when selecting non-Claude model with many tools
  - Force session fork on cross-provider model switch to prevent transcript corruption
  - Disable GitHub Copilot subscription card (9Router poll issue, marked preview)
  - Delete dead CopilotProvider import and unused CopilotAuthButton component
2026-04-12 12:06:36 -07:00
ciregenz e252fcc20f [eric] harden chat title + tool group name prompts against role confusion (wrap content in tags, add anti-answer framing & examples) 2026-04-09 16:39:16 -07:00
ciregenz 27149eeb3f [eric] fix extended actions (ToolSearch in allowedTools, claude_code preset+append for system_prompt and tools, ENABLE_TOOL_SEARCH=auto,
drop --bare which was stubbing the default system prompt), drop connected_tools_ctx that leaked MCP server names/emails into every turn, fix
   nine_router asyncio UnboundLocalError, gate 9Router subprocess output on OPENSWARM_DEBUG_9ROUTER
2026-04-09 16:13:03 -07:00
ciregenz 077d9b4011 [eric] add Discord MCP integration with shared bot + per-user guild scoping 2026-04-06 20:02:27 -07:00
ciregenz 5d7c93d9a5 [eric] HubSpot MCP integrations with OAuth PKCE, fix backend crash from unhandled BaseExceptionGroup during MCP tool denial 2026-04-06 14:43:53 -07:00
ciregenz 3bbc29ea98 [eric] add Airtable MCP integration with OAuth + PKCE 2026-04-06 13:18:43 -07:00
ciregenz 44d2eb306b [eric] Fix dashboard sessions lost after app restart 2026-04-05 00:42:52 -07:00
ciregenz 2412b981b4 [eric] Canvas UX overhaul: minimap, momentum panning, arrow navigation, smooth transitions, and card focus behavior + slight title prompt tweak 2026-04-03 18:41:05 -07:00
ciregenz cc5b3da0cd [eric] dashboard / chat title fix + notion auth logic tweak 2026-04-03 12:34:39 -07:00
ciregenz cac9872702 [eric] notion integration 2026-04-02 16:40:36 -07:00
ciregenz 57465a919f [eric] analytics: fix cost tracking, onboarding profile, and data accuracy, also janky titles 2026-04-02 11:18:46 -07:00
ciregenz 75d5d8c382 [eric] fix context loss on edit, branch, and resume: fork SDK session instead of clearing it, load stopped sessions from disk 2026-04-01 18:20:19 -07:00
ciregenz e1c22dfaba [eric] fix browser agent stop: cancel mid-flight API calls, stop children before parent, guard frontend state 2026-04-01 16:22:31 -07:00
ciregenz ab42a9db05 [eric] fix Google Workspace MCP tools: system prompt truncation + macOS code signing 2026-03-28 10:42:35 -07:00
ciregenz c50eecc8f3 [eric] v1.0.18: fix session duration tracking, bump version, google workplace mcp tool fix, ui/ux improvements, qol 2026-03-27 19:59:01 -07:00
ciregenz 97622f87e0 [eric] fix API key priority over 9Router, fix OAuth callback 500, polish Settings UI 2026-03-27 13:06:17 -07:00
ciregenz 7c3da1ab4c [eric] fix 9Router CLI auth for subscription users, add analytics, update models 2026-03-27 00:21:19 -07:00
ciregenz e04eb2fb74 [eric] fix browser agent for 9Router, subscription-first priority, uvx fallback for non-dev users
- browser_agent.py: use get_anthropic_client instead of raw api_key, fix model map for 9Router
  - credentials.py + agent_manager.py: subscription (9Router) checked before API key everywhere
  - main.py: clean browser-agent endpoint, no credential params
  - tools_lib.py: when uvx not found, fall back to pip-installed binary from venv
  - requirements.txt: add google-workspace-mcp so it works without uvx
2026-03-26 12:17:37 -07:00
ciregenz cf775b4977 [eric] - build-app.sh: pre-build 9Router, bundle .next/standalone into Electron
- electron/package.json: add 9router to extraResources
2026-03-25 13:35:23 -07:00
ciregenz ebea25f0c2 [eric] [eric] add PostHog analytics, 9Router subscription proxy, unified usage tracking
- PostHog integration: collector, analytics subapp, opt-in UI, Analytics page
  - 9Router: auto-start, OAuth subscription flow, /v1/messages Anthropic format support
  - Settings overhaul: multi-provider API keys, subscription connect UI, onboarding modal
  - Unified usage: merge 9Router cost/token data into Settings Usage tab
  - Provider system: providers/, agent_loop, tools/ (unused, for future non-Anthropic support)
  - Agent SDK: restored as primary with 9Router ANTHROPIC_BASE_URL fallback
  - Updated system prompt, credential resolution, dashboard analytics
2026-03-24 14:02:58 -07:00
haikdc 809eacc041 [Haik]: round 2 of dynamic island redesign (collapsible completed tab) (approve/deny from collapsed state) (height limited and scrollable expanded state) 2026-03-20 23:41:20 -07:00
haikdc 3f37ad8847 [Haik]: browser agent issues fixed (e.g. stopping it via parent or sub agent acc stops it now) (the lil browser agent modal properly shows up when a browser is reinvoked) 2026-03-20 21:54:46 -07:00
haikdc c0afabb964 [Haik]: (moved logo out of island) (fixed notification derefrencing issues when u swap dashboards) (fixed chat header update issue where itd get stuck in the completed state) 2026-03-20 21:37:27 -07:00
haikdc 6dcfb19b17 [Haik]: ckpt, view builder saving issue fixed via templates, system prompts, and skills. Also added a reset to default for modes. 2026-03-19 01:58:20 -07:00
haikdc 9943ccafd5 [Haik]: (Agent browser render size matches that of user browser spawn) (queing messages) (chat loading bubble fix) (tethers to sub agents and branches are now permament and inputs are swapped to a continue chat button) (auto focus for everything) (history card position fix when redeployed) (dashboard persistance fixed) (non browser link clicks open in the in app browser now) (chat message tooltips for copy, branching, and editing / swapping between edited messages) 2026-03-18 23:45:54 -07:00
haikdc a1138a1782 [Haik]: (ability to resume chats if force end early) (agent selection actually works as advertised) (browser control/creation tool isolation) (in dev mode can see the action input schema) 2026-03-18 14:19:42 -07:00