deploy: security hardening, multi-model support, S3 storage, analytics, CI improvements (70 commits) #4

Merged
0xWheatyz merged 70 commits from leeworks-agents/SPARC:main into main 2026-03-31 11:53:47 +00:00
Contributor

Deployment PR

This PR deploys 70 commits from leeworks-agents/SPARC:main accumulated since the last upstream sync.


Merged PRs Included

Security & Authentication

  • #27 feat(security): JWT startup guard, configurable CORS, externalize DB creds
  • #28 feat(auth): add rate limiting to login and register endpoints
  • #35 test(auth): add comprehensive JWT authentication test suite

Job State & Database

  • #34 feat(jobs): persist async batch job state in PostgreSQL
  • #30 refactor(db): shared pooled DatabaseClient singleton

CI / Quality

  • #32 ci: add pytest and ruff linting to CI workflow
  • #53 ci: add tsc --noEmit TypeScript type checking to CI pipeline
  • #269 CI: add tsc --noEmit TypeScript type checking to test job

Configuration & Observability

  • #29 feat: configurable LLM model, SERP cache TTL, structured logging, fix type
  • #54 feat: add structured logging to serp_api.py
  • #270 Docs: document MODEL, SERP_CACHE_TTL_HOURS, LOG_LEVEL in .env.example

Storage

  • #58 feat: add S3/MinIO object storage support for patent PDFs
  • #31 docs: patent PDF storage docs, FileNotFoundError, frontend lockfile
  • #1374 docs: document patent PDF volume mount requirement

Data & Export

  • #60 feat: add CSV export for company analysis results
  • #59 feat: add cursor-based pagination to /jobs endpoint
  • #171 feat: add PDF export for analysis reports

Notifications & Scheduling

  • #66 feat: add webhook notification support for job completion
  • #65 feat: implement scheduled/recurring analysis with change alerting

Multi-Model / LLM

  • #64 feat: add multi-model support for per-analysis LLM selection
  • #1015 Add model allow-list validation to analysis endpoints
  • #353 feat: add model picker UI and wire model param through backend

Frontend Features

  • #57 feat: add dark/light mode toggle with localStorage persistence
  • #1348 feat: theme-aware chart colors for dark/light mode
  • #56 feat: add loading skeletons and error retry to Batch and Analytics
  • #352 feat: add loading skeletons and error states to Batch page
  • #61 feat: add side-by-side patent portfolio comparison view
  • #62 feat: add patent trend charts to the Analytics page

API Client

  • #63 feat: add OpenAPI TypeScript client generation setup
  • #443 Generate TypeScript API client from OpenAPI spec

Bug Fixes

  • #55 fix: auto-download patent PDF in analyze_single_patent

Project

  • #3 chore: add ROADMAP.md for SPARC application development

Summary of Changes

  • Security: JWT guard on startup, rate-limited auth endpoints, configurable CORS, externalized DB credentials
  • Storage: S3/MinIO support for patent PDFs with volume-mount documentation for containers
  • Multi-model: Per-analysis LLM selection with model picker UI, allow-list validation, and backend wiring
  • Analytics: Patent trend charts, side-by-side portfolio comparison view, theme-aware chart colors
  • Export: CSV export for analysis results, PDF export for reports
  • Jobs: PostgreSQL-backed async job state persistence, cursor-based pagination
  • Notifications: Webhook support for job completion; scheduled/recurring analysis with change alerting
  • CI: pytest + ruff linting, TypeScript type checking (tsc --noEmit) added to pipeline
  • UX: Dark/light mode toggle with localStorage persistence, loading skeletons, error states
  • Observability: Structured logging, configurable SERP cache TTL, pooled DB singleton

This PR was updated automatically by the leeworks-agents ship cycle on 2026-03-30. Please review and merge when ready.

## Deployment PR This PR deploys 70 commits from `leeworks-agents/SPARC:main` accumulated since the last upstream sync. --- ## Merged PRs Included ### Security & Authentication - **#27** feat(security): JWT startup guard, configurable CORS, externalize DB creds - **#28** feat(auth): add rate limiting to login and register endpoints - **#35** test(auth): add comprehensive JWT authentication test suite ### Job State & Database - **#34** feat(jobs): persist async batch job state in PostgreSQL - **#30** refactor(db): shared pooled DatabaseClient singleton ### CI / Quality - **#32** ci: add pytest and ruff linting to CI workflow - **#53** ci: add tsc --noEmit TypeScript type checking to CI pipeline - **#269** CI: add tsc --noEmit TypeScript type checking to test job ### Configuration & Observability - **#29** feat: configurable LLM model, SERP cache TTL, structured logging, fix type - **#54** feat: add structured logging to serp_api.py - **#270** Docs: document MODEL, SERP_CACHE_TTL_HOURS, LOG_LEVEL in .env.example ### Storage - **#58** feat: add S3/MinIO object storage support for patent PDFs - **#31** docs: patent PDF storage docs, FileNotFoundError, frontend lockfile - **#1374** docs: document patent PDF volume mount requirement ### Data & Export - **#60** feat: add CSV export for company analysis results - **#59** feat: add cursor-based pagination to /jobs endpoint - **#171** feat: add PDF export for analysis reports ### Notifications & Scheduling - **#66** feat: add webhook notification support for job completion - **#65** feat: implement scheduled/recurring analysis with change alerting ### Multi-Model / LLM - **#64** feat: add multi-model support for per-analysis LLM selection - **#1015** Add model allow-list validation to analysis endpoints - **#353** feat: add model picker UI and wire model param through backend ### Frontend Features - **#57** feat: add dark/light mode toggle with localStorage persistence - **#1348** feat: theme-aware chart colors for dark/light mode - **#56** feat: add loading skeletons and error retry to Batch and Analytics - **#352** feat: add loading skeletons and error states to Batch page - **#61** feat: add side-by-side patent portfolio comparison view - **#62** feat: add patent trend charts to the Analytics page ### API Client - **#63** feat: add OpenAPI TypeScript client generation setup - **#443** Generate TypeScript API client from OpenAPI spec ### Bug Fixes - **#55** fix: auto-download patent PDF in analyze_single_patent ### Project - **#3** chore: add ROADMAP.md for SPARC application development --- ## Summary of Changes - **Security**: JWT guard on startup, rate-limited auth endpoints, configurable CORS, externalized DB credentials - **Storage**: S3/MinIO support for patent PDFs with volume-mount documentation for containers - **Multi-model**: Per-analysis LLM selection with model picker UI, allow-list validation, and backend wiring - **Analytics**: Patent trend charts, side-by-side portfolio comparison view, theme-aware chart colors - **Export**: CSV export for analysis results, PDF export for reports - **Jobs**: PostgreSQL-backed async job state persistence, cursor-based pagination - **Notifications**: Webhook support for job completion; scheduled/recurring analysis with change alerting - **CI**: pytest + ruff linting, TypeScript type checking (tsc --noEmit) added to pipeline - **UX**: Dark/light mode toggle with localStorage persistence, loading skeletons, error states - **Observability**: Structured logging, configurable SERP cache TTL, pooled DB singleton --- _This PR was updated automatically by the leeworks-agents ship cycle on 2026-03-30. Please review and merge when ready._
AI-Manager added 2 commits 2026-03-26 03:41:38 +00:00
- Document current project state and architecture
- Identify P1 priorities: security hardening, error handling, test coverage
- Identify P2 priorities: structured logging, configurable LLM, frontend polish, CI tests
- Identify P3 priorities: export, comparison, scheduled analysis, notifications
- Reference Talos repo for infrastructure/deployment concerns

Closes leeworks-agents/SPARC#2

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 05:03:20 +00:00
- Add check_jwt_secret() that refuses default JWT secret when APP_ENV != development
- Make CORS origins configurable via CORS_ORIGINS env var (comma-separated)
- Replace hardcoded postgres credentials in docker-compose.yml with env var references
- Add APP_ENV and cors_origins to config.py
- Update .env.example with all required variables and documentation
- Add tests for JWT startup guard and CORS configuration

Closes leeworks-agents/SPARC#4
Closes leeworks-agents/SPARC#5
Closes leeworks-agents/SPARC#6

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 05:03:35 +00:00
Add 17 tests in tests/test_auth.py covering all auth flows:
- Registration: first user admin, subsequent user, duplicate email
- Login: valid credentials, invalid credentials
- Protected routes: valid token, missing token, expired token, wrong token type
- Token refresh: valid refresh, invalid refresh, access-as-refresh rejected
- Admin endpoints: list users, change role, own-role prevention, permission checks

All tests use mocked database (no live DB required).

Closes leeworks-agents/SPARC#10

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 05:04:04 +00:00
- Add docstring to analyze_single_patent explaining the PDF prerequisite
- Raise FileNotFoundError with helpful message when PDF is missing
- Add patent PDF storage section to README with Docker volume mount example
- Commit frontend/package-lock.json for reproducible builds

Closes leeworks-agents/SPARC#15
Closes leeworks-agents/SPARC#17

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 05:04:30 +00:00
- Add jobs table to database schema (job_id, status, progress, result_json, etc.)
- Add DatabaseClient methods: create_job, update_job, get_job, list_jobs
- Add mark_stale_jobs_failed() called at startup to handle interrupted jobs
- Refactor _run_batch_job and job endpoints to read/write from PostgreSQL
- Remove in-memory _jobs dict; job state now survives API restarts
- Update init_database.py to list all tables in output

Closes leeworks-agents/SPARC#8

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 05:04:50 +00:00
- Add slowapi rate limiter: 10 req/min for /auth/login, 5 req/min for /auth/register
- Return HTTP 429 with Retry-After header when limit is exceeded
- Add slowapi to requirements.txt
- Add 4 passing tests for rate limit behavior

Closes leeworks-agents/SPARC#9

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager changed title from deploy: add ROADMAP.md for SPARC application development to deploy: security hardening, JWT auth, rate limiting, job persistence, docs 2026-03-26 05:42:21 +00:00
AI-Manager added 2 commits 2026-03-26 07:02:50 +00:00
- Replace get_db_client() creating new DatabaseClient on every call with a
  module-level singleton initialized once at startup via init_db_client()
- Add init_db_client() and close_db_client() lifecycle functions called
  from FastAPI lifespan handler
- Migrate all DatabaseClient methods from legacy self.connect()/self.conn
  to pooled self.get_conn() context manager for thread-safe connection reuse
- Pool is properly torn down on application shutdown

Closes leeworks-agents/SPARC#7

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 07:03:11 +00:00
- Make LLM model configurable via MODEL env var, default anthropic/claude-3.5-sonnet (#12)
- Expose SERP cache TTL as SERP_CACHE_TTL_HOURS env var, default 24 hours (#13)
- Fix Patent.patent_id type annotation from int to str in types.py (#14)
- Replace all print() calls with structured logging in analyzer.py and llm.py (#11)
- Add LOG_LEVEL config with basicConfig setup in config.py
- Add model and serp_cache_ttl_hours to config.py

Closes leeworks-agents/SPARC#11
Closes leeworks-agents/SPARC#12
Closes leeworks-agents/SPARC#13
Closes leeworks-agents/SPARC#14

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 07:04:34 +00:00
- Add test job to build.yaml that runs pytest and ruff before building images
- Add standalone test.yaml workflow for PRs
- Add ruff.toml with E/F/I rules configured
- Fix all ruff lint errors: sort imports, remove unused imports, fix re-exports
- Build jobs now depend on test job passing (needs: test)

Closes leeworks-agents/SPARC#18
Closes leeworks-agents/SPARC#19

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager changed title from deploy: security hardening, JWT auth, rate limiting, job persistence, docs to deploy: security, auth tests, rate limiting, job persistence, DB pooling, CI, docs 2026-03-26 07:43:21 +00:00
AI-Manager added 2 commits 2026-03-26 12:04:44 +00:00
Upgrade lucide-react to v1.7.0 for proper TypeScript declarations and
add a TypeScript type check step to the test workflow. Both ruff (Python)
and tsc --noEmit (TypeScript) now block merging on failure.

Closes leeworks-agents/SPARC#52

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 12:05:05 +00:00
Add module-level logger to serp_api.py with INFO-level messages for
patent queries and PDF downloads, and DEBUG-level messages for cache
hits and parsing details. All three target files (analyzer.py,
serp_api.py, llm.py) now use structured logging with no print() calls.

Closes leeworks-agents/SPARC#46

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 12:05:17 +00:00
When the PDF is not on disk, analyze_single_patent now looks up the
cached PDF link from the database and downloads it automatically.
If no link is cached, a clear FileNotFoundError is raised. Also adds
a GET /analyze/patent/{patent_id} API endpoint that exposes this
functionality and returns 404 when the PDF cannot be obtained.

Closes leeworks-agents/SPARC#36

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 12:05:49 +00:00
Analytics page now shows skeleton loaders (cards and chart placeholders)
while data loads, and displays a retry button when the API call fails.
Batch page error state now shows the actual error message and suggests
user action.

Closes leeworks-agents/SPARC#16

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 12:06:11 +00:00
Add a cursor query parameter to GET /jobs and return a next_cursor
field in the response envelope. Existing clients using only limit
continue to work without modification. The cursor is an opaque token
encoding created_at and job_id for stable keyset pagination.

Closes leeworks-agents/SPARC#25

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 12:06:40 +00:00
- Enable Tailwind "class" dark mode strategy
- Use CSS custom properties for theme colors (bg, text, border)
- Add ThemeProvider context with toggle and localStorage persistence
- Add Sun/Moon toggle button in the header navigation
- Inline script in index.html prevents FOUC on page load
- All pages (Layout, Login, Register, ProtectedRoute) support both modes
- Default theme follows system preference (prefers-color-scheme)

Closes leeworks-agents/SPARC#33

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 12:07:03 +00:00
Add GET /export/{company_name} backend endpoint that returns analysis
records as a downloadable CSV file. Add Export CSV button to the
Analysis page that triggers the download via the API.

Closes leeworks-agents/SPARC#20

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 12:07:50 +00:00
Add APScheduler-based background task that periodically re-analyzes
tracked companies and alerts on significant patent count changes.

- Add tracked_companies and alerts tables to database schema
- Add SPARC/scheduler.py with configurable interval and threshold
- Add admin endpoints: GET/POST/DELETE /admin/tracked, GET /admin/alerts
- Scheduler starts at app startup; interval via SCHEDULE_INTERVAL_HOURS
- Change threshold configurable via CHANGE_THRESHOLD_PERCENT env var
- apscheduler is optional; graceful fallback if not installed

Closes leeworks-agents/SPARC#22

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-26 12:08:11 +00:00
Send HTTP POST notifications to configured webhook URLs when batch
jobs complete or when scheduled analysis detects significant changes.

- Add SPARC/webhooks.py with retry logic (3 attempts, exponential backoff)
- Support generic HTTP POST and Slack-compatible text payloads
- Integrate into batch job completion handler in api.py
- Configure via WEBHOOK_URLS env var (comma-separated)
- Payload includes event type, job ID, status, and summary

Closes leeworks-agents/SPARC#23

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 3 commits 2026-03-26 12:09:53 +00:00
Introduce a StorageBackend abstraction (local filesystem and S3) for
patent PDF storage. When STORAGE_BACKEND=s3, PDFs are read/written via
boto3 to an S3-compatible bucket instead of the local filesystem.

- Add SPARC/storage.py with LocalStorageBackend and S3StorageBackend
- Update serp_api.py save_patents and parse_patent_pdf to use storage
- Add storage config vars to config.py and .env.example
- Add optional MinIO service to docker-compose.yml (--profile s3)
- Add boto3 to requirements.txt

Closes leeworks-agents/SPARC#38

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Integrates S3/MinIO storage backend with structured logging changes
from main. Both boto3 and apscheduler retained in requirements.txt.
AI-Manager added 3 commits 2026-03-26 12:11:06 +00:00
Add /compare route with two-panel layout for comparing company patent
portfolios. Each panel shows patent count, analysis timestamp, and
full LLM narrative. The page is responsive (stacks vertically on
mobile) and supports URL params (?a=nvidia&b=intel) for shareability.

Closes leeworks-agents/SPARC#21

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Combines GitCompareArrows icon import with Sun/Moon and ThemeContext imports.
AI-Manager added 3 commits 2026-03-26 12:12:28 +00:00
Add GET /analytics/trends endpoint returning per-company analysis
counts by month and analysis type distribution over time. Render
these as a line chart (analyses per company) and stacked bar chart
(analysis types) on the Analytics page using recharts.

Closes leeworks-agents/SPARC#24

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Keeps both analytics/trends endpoint and export endpoint from main.
AI-Manager added 3 commits 2026-03-26 12:13:22 +00:00
Add openapi-typescript devDependency and npm scripts for generating
typed TypeScript schema from the FastAPI OpenAPI spec. Include a
static openapi.json snapshot for offline generation.

- npm run generate: fetch schema from running backend and generate types
- npm run generate:local: generate types from the bundled openapi.json

Closes leeworks-agents/SPARC#26

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Keeps both generate scripts and typecheck script in package.json.
AI-Manager added 3 commits 2026-03-26 12:14:29 +00:00
Allow users to choose the LLM model on a per-analysis basis. The
model field is optional in both single and batch analysis requests,
defaulting to the server-configured MODEL env var. The model used
is recorded in the analysis result and database.

- Add model parameter to LLMAnalyzer.analyze_patent_content and
  analyze_patent_portfolio
- Add model field to CompanyAnalysisResult and API response
- Add model field to BatchAnalysisRequest
- Add GET /models endpoint listing supported models and the default
- Store model in llm_messages metadata for attribution

Closes leeworks-agents/SPARC#37

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Keeps model selection, analytics trends, and CSV export endpoints.
AI-Manager changed title from deploy: security, auth tests, rate limiting, job persistence, DB pooling, CI, docs to deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements 2026-03-26 12:42:30 +00:00
Author
Contributor

Shipping cycle completed 2026-03-26.

Fork main (ce31a32) is up to date with all merged PRs. No stale feature branches to clean up (all 23 feature branches are fully merged into main).

Upstream sync: fork is 51 commits ahead of upstream/main, and upstream has no new commits to merge in. No merge needed.

Issue housekeeping: Closed 24 open issues (#92-115) that were resolved by previously merged PRs. Their lower-numbered counterparts (e.g. #4-#46) were properly closed by PR references at merge time; the higher-numbered duplicates were not auto-closed and have now been closed manually.

Remaining open issues (legitimate, not yet implemented):

  • #85: PDF export for analysis reports (CSV done in PR#60, PDF not yet implemented)
  • #90: Cursor-based pagination for /analyze/batch endpoint (/jobs done in PR#59, /analyze/batch outstanding)

This PR covers all 51 commits from fork main and is mergeable. Ready for human operator review.

Shipping cycle completed 2026-03-26. Fork main (ce31a32) is up to date with all merged PRs. No stale feature branches to clean up (all 23 feature branches are fully merged into main). Upstream sync: fork is 51 commits ahead of upstream/main, and upstream has no new commits to merge in. No merge needed. Issue housekeeping: Closed 24 open issues (#92-115) that were resolved by previously merged PRs. Their lower-numbered counterparts (e.g. #4-#46) were properly closed by PR references at merge time; the higher-numbered duplicates were not auto-closed and have now been closed manually. Remaining open issues (legitimate, not yet implemented): - #85: PDF export for analysis reports (CSV done in PR#60, PDF not yet implemented) - #90: Cursor-based pagination for /analyze/batch endpoint (/jobs done in PR#59, /analyze/batch outstanding) This PR covers all 51 commits from fork main and is mergeable. Ready for human operator review.
Author
Contributor

Shipping cycle re-verified on 2026-03-26.

  • No open fork PRs remain (all merged to leeworks-agents/SPARC:main).
  • Fork main is 51 commits ahead of upstream/main.
  • Head SHA: ce31a32322
  • PR is open, mergeable, and not yet merged.
  • No upstream sync needed (upstream has no new commits).

All 35+ feature commits are included in this PR. Awaiting human operator review and merge.

Shipping cycle re-verified on 2026-03-26. - No open fork PRs remain (all merged to leeworks-agents/SPARC:main). - Fork main is 51 commits ahead of upstream/main. - Head SHA: ce31a323225445e97a9c77386f31e77ca33f1897 - PR is open, mergeable, and not yet merged. - No upstream sync needed (upstream has no new commits). All 35+ feature commits are included in this PR. Awaiting human operator review and merge.
AI-Manager changed title from deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements to deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, PDF export, UI improvements 2026-03-27 02:42:08 +00:00
AI-Manager changed title from deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, PDF export, UI improvements to deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements 2026-03-27 03:42:25 +00:00
AI-Manager added 2 commits 2026-03-27 05:05:00 +00:00
Add a new /export/{company_name}/pdf endpoint that generates a formatted
PDF report using reportlab, including a summary table and all analysis
results. Add the corresponding frontend Export PDF button alongside the
existing Export CSV button on the Analysis page.

Closes leeworks-agents/SPARC#85

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager changed title from deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements to deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements, PDF export 2026-03-27 05:42:06 +00:00
Author
Contributor

Repo-Shipper verification — 2026-03-27

Shipping cycle completed for leeworks-agents/SPARC. Summary:

  • Approved fork PRs merged: None (0 approved PRs — PRs #269 and #270 are open but unapproved, not merged per policy)
  • Fork main state: Clean, no uncommitted changes
  • Fork HEAD: f8ca1b80b1d43c42cb70781c0cba639e552378c9 — matches this PR head SHA (PR is up to date)
  • Upstream sync needed: No — upstream has 0 new commits ahead of fork
  • Commits ahead of upstream: 53 (all captured in this PR)
  • Deployment PR: This PR (#4) was already open and is current — no new PR needed

This PR is ready for human operator review and merge.

**Repo-Shipper verification — 2026-03-27** Shipping cycle completed for `leeworks-agents/SPARC`. Summary: - **Approved fork PRs merged:** None (0 approved PRs — PRs #269 and #270 are open but unapproved, not merged per policy) - **Fork main state:** Clean, no uncommitted changes - **Fork HEAD:** `f8ca1b80b1d43c42cb70781c0cba639e552378c9` — matches this PR head SHA (PR is up to date) - **Upstream sync needed:** No — upstream has 0 new commits ahead of fork - **Commits ahead of upstream:** 53 (all captured in this PR) - **Deployment PR:** This PR (#4) was already open and is current — no new PR needed This PR is ready for human operator review and merge.
AI-Manager added 2 commits 2026-03-27 11:07:01 +00:00
These environment variables were already supported in config.py but
were not documented in .env.example, making them hard to discover.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 2 commits 2026-03-27 11:07:05 +00:00
Adds a step to install Node.js and run tsc --noEmit in the frontend
directory, catching TypeScript type errors before images are built.
Ruff was already present; this completes issue #260.

Closes leeworks-agents/SPARC#260

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager changed title from deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements, PDF export to deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements, PDF export, CI and docs updates 2026-03-27 12:42:35 +00:00
AI-Manager added 2 commits 2026-03-27 16:43:45 +00:00
Add a Job History section that loads past jobs via useQuery with:
- Animated skeleton placeholders while the job list is loading
- Error banner with retry button when the API call fails
- Empty state with helpful message when no jobs exist
- Job list cards with status badges and progress bars

Also improve the batch submission error state with a retry button
alongside the existing dismiss button.

Closes leeworks-agents/SPARC#343

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager added 3 commits 2026-03-27 16:45:09 +00:00
Thread the optional model parameter through the entire analysis pipeline:
- analyzer.py: analyze_company, _analyze_company_safe, analyze_companies,
  and analyze_single_patent now accept and forward model override
- api.py: single company endpoint accepts model query param; batch and
  async batch endpoints pass request.model through to the analyzer
- client.ts: analyzeCompany, analyzeBatch, analyzeBatchAsync accept model;
  add listModels() to fetch available models from GET /models
- Analysis.tsx: add model selector dropdown that loads from /models API
- Batch.tsx: add model selector alongside the workers slider

Users can now pick a specific LLM (GPT-4o, Claude 3.5, Gemini, etc.)
per analysis request, or leave it on the server default.

Closes leeworks-agents/SPARC#351

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Combine both useQuery hooks (modelsQuery for model selector, jobsQuery for
job history) and pass selectedModel to analyzeBatch while also triggering
jobsQuery.refetch() on successful submission.
AI-Manager changed title from deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements, PDF export, CI and docs updates to deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements, PDF export, CI, docs, loading states, and model picker 2026-03-27 16:45:49 +00:00
AI-Manager added 2 commits 2026-03-27 20:42:24 +00:00
Closes leeworks-agents/SPARC#426

- Generate schema.d.ts from committed openapi.json using openapi-typescript
- Rewrite types/index.ts to derive all application types from the generated schema
- Add CI step in both build.yaml and test.yaml to verify schema.d.ts stays in sync
- TypeScript compilation passes with zero errors

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Merge pull request #443: Generate TypeScript API client from OpenAPI spec

Closes leeworks-agents/SPARC#426
Author
Contributor

Shipping cycle check (2026-03-27):

  • Fork main is confirmed 64 commits ahead of upstream/main.
  • PR head SHA matches fork main (cbc8f449a1) — PR is fully up to date.
  • Upstream has no new commits ahead of fork — no sync needed.
  • All fork PRs merged (no open PRs on fork).
  • PR is open, mergeable, and ready for human operator review and merge.
Shipping cycle check (2026-03-27): - Fork main is confirmed 64 commits ahead of upstream/main. - PR head SHA matches fork main (cbc8f449a1975d3a162135103519949e221c3037) — PR is fully up to date. - Upstream has no new commits ahead of fork — no sync needed. - All fork PRs merged (no open PRs on fork). - PR is open, mergeable, and ready for human operator review and merge.
AI-Manager changed title from deploy: security, auth, storage, multi-model, scheduled analysis, webhooks, charts, UI improvements, PDF export, CI, docs, loading states, and model picker to deploy: security hardening, multi-model support, CI pipeline, PDF/CSV export, dark mode, trend charts, TypeScript API client, and more (64 commits) 2026-03-28 05:42:26 +00:00
Author
Contributor

repo-shipper cycle check (2026-03-28): Fork main is current at cbc8f44. No new commits since last update. Upstream sync confirmed — fork is 64 commits ahead, 0 behind. No open fork PRs pending merge. This PR is ready for operator review and merge.

repo-shipper cycle check (2026-03-28): Fork main is current at cbc8f44. No new commits since last update. Upstream sync confirmed — fork is 64 commits ahead, 0 behind. No open fork PRs pending merge. This PR is ready for operator review and merge.
Author
Contributor

Repo-Shipper cycle — 2026-03-28 (latest run)

  • Fork main HEAD: cbc8f449 (64 commits ahead of upstream, 0 behind)
  • No open PRs on fork leeworks-agents/SPARC (nothing to merge)
  • Upstream sync: up to date — no new upstream commits to pull in
  • PR #4 head SHA matches fork main exactly — PR description is accurate and current
  • No updates required

Awaiting human operator review and merge.

**Repo-Shipper cycle — 2026-03-28 (latest run)** - Fork main HEAD: `cbc8f449` (64 commits ahead of upstream, 0 behind) - No open PRs on fork leeworks-agents/SPARC (nothing to merge) - Upstream sync: up to date — no new upstream commits to pull in - PR #4 head SHA matches fork main exactly — PR description is accurate and current - No updates required Awaiting human operator review and merge.
Author
Contributor

Shipping cycle check — 2026-03-29

This PR is up to date with leeworks-agents/SPARC:main (HEAD: cbc8f44).

  • Fork is 64 commits ahead of upstream; upstream has no new commits to sync
  • No approved fork PRs pending merge this cycle
  • PR is mergeable and ready for operator review

No action required from the agent — awaiting human operator merge.

**Shipping cycle check — 2026-03-29** This PR is up to date with `leeworks-agents/SPARC:main` (HEAD: `cbc8f44`). - Fork is 64 commits ahead of upstream; upstream has no new commits to sync - No approved fork PRs pending merge this cycle - PR is mergeable and ready for operator review No action required from the agent — awaiting human operator merge.
Author
Contributor

Shipping cycle check (2026-03-29): Fork main (cbc8f44) matches this PR's head SHA exactly — the PR is fully up-to-date with leeworks-agents/SPARC main. No new commits have been added since the PR was created. Upstream has no divergent commits. This PR is ready for human review and merge.

Shipping cycle check (2026-03-29): Fork main (cbc8f44) matches this PR's head SHA exactly — the PR is fully up-to-date with leeworks-agents/SPARC main. No new commits have been added since the PR was created. Upstream has no divergent commits. This PR is ready for human review and merge.
Author
Contributor

Shipping cycle ran 2026-03-29. Status check:

  • Fork main (leeworks-agents/SPARC:main) is clean — no uncommitted changes
  • Fork is 64 commits ahead of upstream (0xWheatyz/SPARC:main)
  • No new approved PRs to merge since last cycle
  • No upstream changes to sync (upstream has 0 commits not in fork)
  • This PR is current and covers all 64 commits

Awaiting human operator review and merge.

Shipping cycle ran 2026-03-29. Status check: - Fork main (`leeworks-agents/SPARC:main`) is clean — no uncommitted changes - Fork is 64 commits ahead of upstream (`0xWheatyz/SPARC:main`) - No new approved PRs to merge since last cycle - No upstream changes to sync (upstream has 0 commits not in fork) - This PR is current and covers all 64 commits Awaiting human operator review and merge.
Author
Contributor

Shipping cycle run: 2026-03-29

Status checks completed:

  • Fork main is clean (working tree has no uncommitted changes)
  • TypeScript typecheck (tsc --noEmit) passed with no errors
  • ESLint config is missing (eslint.config.js not present); ESLint skipped — this is a pre-existing issue in the repo, not introduced by this cycle
  • Python ruff linter not available in the current environment; skipped
  • No Gitea Actions workflow files found in the repo

PR sync status:

  • Fork leeworks-agents/SPARC:main HEAD is cbc8f449 (47 commits ahead of upstream)
  • This PR already targets that exact HEAD SHA — the PR is up to date
  • Fork is fully synced with upstream (no upstream commits missing from fork)
  • Mergeable: true

No action required. Awaiting human operator review and merge.

**Shipping cycle run: 2026-03-29** Status checks completed: - Fork main is clean (working tree has no uncommitted changes) - TypeScript typecheck (`tsc --noEmit`) passed with no errors - ESLint config is missing (`eslint.config.js` not present); ESLint skipped — this is a pre-existing issue in the repo, not introduced by this cycle - Python ruff linter not available in the current environment; skipped - No Gitea Actions workflow files found in the repo PR sync status: - Fork `leeworks-agents/SPARC:main` HEAD is `cbc8f449` (47 commits ahead of upstream) - This PR already targets that exact HEAD SHA — the PR is **up to date** - Fork is fully synced with upstream (no upstream commits missing from fork) - Mergeable: true No action required. Awaiting human operator review and merge.
AI-Manager added 2 commits 2026-03-29 17:03:29 +00:00
Reject unsupported LLM model identifiers with HTTP 400 on all analysis
endpoints (single, batch, async batch). The SUPPORTED_MODELS list was
already defined for the /models endpoint but not enforced on incoming
requests. This completes the multi-model support feature by adding the
missing server-side validation.

Closes leeworks-agents/SPARC#1013

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager changed title from deploy: security hardening, multi-model support, CI pipeline, PDF/CSV export, dark mode, trend charts, TypeScript API client, and more (64 commits) to deploy: security hardening, multi-model support, CI pipeline, PDF/CSV export, dark mode, trend charts, TypeScript API client, model allow-list, and more (66 commits) 2026-03-29 17:42:05 +00:00
Author
Contributor

Shipping cycle check — 2026-03-29 (latest)

  • Fork main HEAD: 87e09b36 — matches this PR head SHA exactly (PR is fully up to date)
  • Fork is 66 commits ahead of upstream/main (2 new commits since prior checks: PR #443 TypeScript API client + PR #1015 model allow-list)
  • PR description updated to reflect 66 commits (was previously showing 64 in cycle comments)
  • Upstream has no new commits to sync into fork — no merge needed
  • No open fork PRs to merge this cycle
  • PR is open, mergeable, and ready for human operator review and merge

No blockers identified.

**Shipping cycle check — 2026-03-29 (latest)** - Fork main HEAD: `87e09b36` — matches this PR head SHA exactly (PR is fully up to date) - Fork is **66 commits ahead** of upstream/main (2 new commits since prior checks: PR #443 TypeScript API client + PR #1015 model allow-list) - PR description updated to reflect 66 commits (was previously showing 64 in cycle comments) - Upstream has no new commits to sync into fork — no merge needed - No open fork PRs to merge this cycle - PR is open, mergeable, and **ready for human operator review and merge** No blockers identified.
Author
Contributor

Shipping cycle check — 2026-03-30

  • Fork main HEAD: 87e09b365b57bfe168d2ff88357e4161c695e759 — matches this PR head SHA exactly (PR is fully up to date)
  • Fork is 66 commits ahead of upstream/main — no change since last check (2026-03-29)
  • No open fork PRs on leeworks-agents/SPARC
  • Upstream has no new commits to sync into fork — no merge needed
  • PR remains open, mergeable, and ready for human operator review and merge

No action taken. No blockers identified.

**Shipping cycle check — 2026-03-30** - Fork main HEAD: `87e09b365b57bfe168d2ff88357e4161c695e759` — matches this PR head SHA exactly (PR is fully up to date) - Fork is **66 commits ahead** of upstream/main — no change since last check (2026-03-29) - No open fork PRs on leeworks-agents/SPARC - Upstream has no new commits to sync into fork — no merge needed - PR remains open, mergeable, and **ready for human operator review and merge** No action taken. No blockers identified.
AI-Manager added 2 commits 2026-03-30 15:03:48 +00:00
Replace hardcoded dark-theme hex colors in recharts components
(tooltips, axes) with a useChartTheme hook that reads the current
theme from ThemeContext. Charts now render correctly in both light
and dark mode.

Closes leeworks-agents/SPARC#1324

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager changed title from deploy: security hardening, multi-model support, CI pipeline, PDF/CSV export, dark mode, trend charts, TypeScript API client, model allow-list, and more (66 commits) to deploy: security hardening, multi-model support, CI pipeline, PDF/CSV export, dark mode, trend charts, TypeScript API client, theme-aware charts, and more (68 commits) 2026-03-30 15:43:14 +00:00
AI-Manager added 2 commits 2026-03-30 17:03:40 +00:00
Switch docker-compose.yml from bind mount to a named volume (patent_data)
so downloaded PDFs survive container recreation. Add a "Patent PDF Storage"
section to DEPLOYMENT.md covering Docker Compose, Kubernetes PVC, and S3
alternatives.

Closes leeworks-agents/SPARC#1360

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
AI-Manager changed title from deploy: security hardening, multi-model support, CI pipeline, PDF/CSV export, dark mode, trend charts, TypeScript API client, theme-aware charts, and more (68 commits) to deploy: security hardening, multi-model support, CI pipeline, PDF/CSV export, dark mode, trend charts, TypeScript API client, theme-aware charts, patent PDF docs, and more (70 commits) 2026-03-30 17:43:28 +00:00
AI-Manager changed title from deploy: security hardening, multi-model support, CI pipeline, PDF/CSV export, dark mode, trend charts, TypeScript API client, theme-aware charts, patent PDF docs, and more (70 commits) to deploy: security hardening, multi-model support, S3 storage, analytics, CI improvements (70 commits) 2026-03-30 19:42:17 +00:00
0xWheatyz merged commit 7e66d0e7e0 into main 2026-03-31 11:53:47 +00:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: 0xWheatyz/SPARC#4