Release v3.5.9: Workspace modes, resilient search & AI, custom endpoints, and policy pages
Description
Summary
Comprehensive stability, security, and UI/UX release (v3.5.9) bringing mutual-exclusion workspace layouts, resilient AI task execution, custom OpenAI-compatible endpoint support, hardened manifest parsing, and legal/SEO infrastructure.
Key Changes
-
Workspace Layout:
- Replaced ambiguous sidebar visibility logic with 4 mutually exclusive modes: Full Workspace (
full), Explorer Only (explorer), Insights Only (insights), and Focus Mode (focus). - Added regression test coverage for mobile and desktop panel constraints.
- Replaced ambiguous sidebar visibility logic with 4 mutually exclusive modes: Full Workspace (
-
Resilient AI & Search Indexing:
- Unified AI providers across Gemini, OpenAI, Anthropic, and Mock.
- Implemented
tool-cache.tswith in-memory task promise deduplication so in-flight AI requests survive panel remounts and branch switching. - Added cache revision tracking (
chatConfigStore.ts) that invalidates stale responses when provider credentials or models change. - Bounded semantic search memory, file counts, and concurrency with checkpointed resumable indexing.
-
Custom AI Endpoints & SSRF Guard:
- Added Settings controls for user-provided OpenAI-compatible base URLs and custom models.
- Added SSRF protection (
public-chat-fetch.ts) that validates public HTTPS endpoints, blocks loopback/private/link-local addresses, and pins DNS lookups per connection.
-
Python Manifest Parser:
- Extended
pip-parser.tsto support standard PEP 621dependencies = [...]arrays and Poetry[tool.poetry.dependencies]tables.
- Extended
-
Accessibility & Site Infrastructure:
- Added persistent motion preferences (System / Full / Reduced) controlling Framer Motion and D3 physics animations.
- Added prerendered HTML for homepage and HTTP 404 handling.
- Added Terms of Service (
/terms) and Privacy Policy (/privacy) pages matching workspace styling. - Added OpenGraph SVG banner, sitemap, and robots metadata.
Validation
bun test --isolate: 489 unit/integration tests pass (1,254 expect calls).bun run test:e2e: 41 offline Playwright E2E tests pass.bun run typecheck: 0 TypeScript errors (app + node).bun run lint: 0 ESLint errors/warnings.
Types of Changes
What types of changes does your code introduce to gitSdm? (Check all that apply)
- Bug fix (non-breaking change which fixes an issue)
- New feature (non-breaking change which adds functionality)
- Breaking change (fix or feature that would cause existing functionality to not work as expected)
- Documentation update (edits to README, templates, or instructions)
- Refactoring (improving code quality without altering behavior)
Checklist
Before submitting, please make sure your PR meets the following:
- My code follows the code style of this project.
- I have ran linting locally (
bun run lint) and fixed all errors/warnings. - I have ran typecheck locally (
bun run typecheck) and resolved all compile errors. - I have run the tests locally (
bun run test) and all 210+ tests pass. - I have updated the documentation / README if applicable.
Screenshots / Flow Diagrams (if applicable)
If you made user interface changes, please include screenshots or animated GIFs.
Summary by cubic
Adds explicit workspace layouts, keeps in-flight search and AI work alive across navigation, and hardens the server against stale caches, overload, and SSRF.
New Features
- Replaces sidebar visibility with four explicit workspace modes: full, explorer only, insights only, and focus.
- Lets users configure OpenAI-compatible base URLs and models in Settings; custom endpoints require their own API key.
- Adds separate embedding settings, persistent motion preferences, and prerendered Terms, Privacy, and 404 pages with sitemap, robots, and OpenGraph metadata.
- Adds
/api/repo/churnand/api/repo/healthendpoints that defer enrichment and resume credential-scoped batches. - Extends
pyproject.tomlparsing to PEP 621 arrays, Poetry tables, markers, extras, and development groups.
Fixes and Hardening
- Keys tool caches and in-flight work by commit SHA and provider credentials so remounts or config changes cannot serve stale results.
- Invalidates in-flight AI mutations when settings change, and redraws the canvas on metadata updates.
- Makes search indexing resumable with checkpoints, atomic snapshots, bounded resources, and safe cancellation and eviction.
- Scopes analysis and search caches to the effective GitHub credential so cached data cannot leak between users.
- Hardens outbound requests: 15s GitHub timeouts, bounded provider queues that honor caller aborts, and a single-flight cached trending snapshot.
- Adds per-IP, body-size, provider queue, and usage limits; shared or Redis mode requires
TOKEN_CACHE_HASH_SECRET, andTRUSTED_PROXY_IPScontrols forwarded client IPs. - Validates resolved limiter addresses against SSRF rules, fails closed on lookup errors or non-public addresses, rejects redirects, expands IPv6 transition prefixes, and bounds DNS lookups.
- Rejects outbound fetches to non-HTTP(S), loopback, private, or reserved hosts.
- Removes the EdgeOne provider; use an OpenAI-compatible endpoint instead.
- Restricts SPA fallbacks to repository routes in dev and prod so missing assets return 404, and fixes dev middleware API routing.