Release v3.5.9: Workspace modes, resilient search & AI, custom endpoints, and policy pages

MB
5d ago
+10404-3455

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.
  • Resilient AI & Search Indexing:

    • Unified AI providers across Gemini, OpenAI, Anthropic, and Mock.
    • Implemented tool-cache.ts with 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.ts to support standard PEP 621 dependencies = [...] arrays and Poetry [tool.poetry.dependencies] tables.
  • 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/churn and /api/repo/health endpoints that defer enrichment and resume credential-scoped batches.
  • Extends pyproject.toml parsing 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, and TRUSTED_PROXY_IPS controls 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.