Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -78,6 +78,14 @@ GITHUB_TOKEN=
# OpenAlex email for faster rate limits (paper search works without it)
# OPENALEX_EMAIL=you@example.com

# ═══════════════════════════════════════════════════════════
# PROJECT WORKSPACES
# ═══════════════════════════════════════════════════════════

# Where project workspaces are stored (bind mount in production)
# Docker Compose dev uses a named volume; production uses this path.
# OPENMLR_WORKSPACES_PATH=./.workspaces

# ═══════════════════════════════════════════════════════════
# SANDBOX / CODE EXECUTION
# ═══════════════════════════════════════════════════════════
Expand Down
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,8 @@ Thumbs.db
*.swo
*~

.pnpm-store/

# Environment
.env
.env.local
Expand Down
2 changes: 1 addition & 1 deletion .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ repos:
hooks:
- id: eslint
name: eslint (frontend)
entry: bash -c 'cd frontend && npx eslint --max-warnings 50 "$@"' --
entry: bash -c 'args=(); for f; do args+=("${f#frontend/}"); done; cd frontend && npx eslint --max-warnings 50 "${args[@]}"' --
language: system
files: ^frontend/src/.*\.(ts|tsx)$
types: [file]
6 changes: 4 additions & 2 deletions Dockerfile.dev
Original file line number Diff line number Diff line change
Expand Up @@ -36,9 +36,11 @@ if ! /app/backend/.venv/bin/python -c "import sys" 2>/dev/null; then
cd /app/backend && uv sync && uv pip install "watchdog[watchmedo]"
echo "[dev-entrypoint] Dependencies installed."
else
# Venv exists and works, but ensure watchmedo is there too
# Venv works — run uv sync to pick up any new/changed dependencies
echo "[dev-entrypoint] Syncing dependencies..."
cd /app/backend && uv sync --quiet 2>/dev/null || true
# Ensure watchmedo is there too
if ! command -v watchmedo >/dev/null 2>&1; then
echo "[dev-entrypoint] Installing watchmedo..."
cd /app/backend && uv pip install "watchdog[watchmedo]"
fi
fi
Expand Down
59 changes: 58 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,67 @@ BACKEND := backend
FRONTEND := frontend
PORT ?= 3000
DOCKER_USER ?= xprilion
VERSION ?= 0.3.0
VERSION := $(shell cat VERSION 2>/dev/null || echo 0.0.0)
DOCKER_COMPOSE := docker compose
LOGO_SRC := assets/full-logo.png

# ─── Versioning ───────────────────────────────────────────
# Single source of truth: VERSION file at repo root.
# Bump targets compute the new version, write it, then sync everywhere.

MAJOR := $(word 1,$(subst ., ,$(VERSION)))
MINOR := $(word 2,$(subst ., ,$(VERSION)))
PATCH := $(word 3,$(subst ., ,$(VERSION)))

.PHONY: version
version: ## Print current version
@echo $(VERSION)

.PHONY: version-major
version-major: ## Bump major version (e.g. 0.3.1 -> 1.0.0)
@NEW=$$(( $(MAJOR) + 1 )).0.0; \
echo "$$NEW" > VERSION; \
$(MAKE) _version-sync; \
echo "Version bumped: $(VERSION) -> $$NEW"

.PHONY: version-minor
version-minor: ## Bump minor version (e.g. 0.3.1 -> 0.4.0)
@NEW=$(MAJOR).$$(( $(MINOR) + 1 )).0; \
echo "$$NEW" > VERSION; \
$(MAKE) _version-sync; \
echo "Version bumped: $(VERSION) -> $$NEW"

.PHONY: version-patch
version-patch: ## Bump patch version (e.g. 0.3.0 -> 0.3.1)
@NEW=$(MAJOR).$(MINOR).$$(( $(PATCH) + 1 )); \
echo "$$NEW" > VERSION; \
$(MAKE) _version-sync; \
echo "Version bumped: $(VERSION) -> $$NEW"

.PHONY: version-set
version-set: ## Set explicit version (V=1.2.3)
@if [ -z "$(V)" ]; then echo "Usage: make version-set V=1.2.3"; exit 1; fi
@echo "$(V)" > VERSION
@$(MAKE) _version-sync
@echo "Version set: $(VERSION) -> $(V)"

.PHONY: _version-sync
_version-sync: # (internal) propagate VERSION file to all project files
$(eval NEW_VERSION := $(shell cat VERSION))
@# backend/openmlr/__init__.py
@sed -i '' 's/^__version__ = ".*"/__version__ = "$(NEW_VERSION)"/' $(BACKEND)/openmlr/__init__.py
@# backend/pyproject.toml
@sed -i '' 's/^version = ".*"/version = "$(NEW_VERSION)"/' $(BACKEND)/pyproject.toml
@# frontend/src/version.ts
@sed -i '' 's/^export const APP_VERSION = ".*"/export const APP_VERSION = "$(NEW_VERSION)"/' $(FRONTEND)/src/version.ts
@# site/docs/.vitepress/version.ts
@sed -i '' 's/^export const APP_VERSION = ".*"/export const APP_VERSION = "$(NEW_VERSION)"/' site/docs/.vitepress/version.ts
@# package.json (root)
@sed -i '' 's/"version": ".*"/"version": "$(NEW_VERSION)"/' package.json
@# frontend/package.json
@sed -i '' 's/"version": ".*"/"version": "$(NEW_VERSION)"/' $(FRONTEND)/package.json
@echo "Synced version $(NEW_VERSION) to all project files"

# ─── Setup ────────────────────────────────────────────────

.PHONY: install
Expand Down
12 changes: 10 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,12 +19,15 @@

## Features

- **Projects & Workspaces** — Persistent workspaces with knowledge graphs, file trees, and cross-conversation memory. Research accumulates across chats.
- **Interactive terminal** — Built-in terminal connected to the project workspace. Run commands directly alongside AI-driven research.
- **Plan + Execute modes** — Plan mode gathers context; Execute mode does the work. Toggle with `Cmd+M`.
- **Paper research** — OpenAlex, Semantic Scholar, arXiv, CrossRef, Papers With Code. Reads full papers, crawls citation graphs.
- **Paper writing** — Section-by-section drafting with auto-save. Export to Markdown/LaTeX.
- **Compute environments** — Execute code on local Docker, SSH remotes, or Modal cloud. Probe GPU/CPU capabilities.
- **Compute environments** — Execute code on local Docker, SSH remotes, or Modal cloud. Workspace persists independently of compute.
- **Background jobs** — Celery + Redis. Close the browser, come back later.
- **Multi-provider LLMs** — OpenAI, Anthropic, OpenRouter, plus local models (Ollama, LM Studio).
- **Multi-provider LLMs** — OpenAI, Anthropic, OpenRouter, plus local models (Ollama, LM Studio). Add custom providers with OpenAI SDK, Anthropic SDK, OpenRouter, or LiteLLM compatibility.
- **Model picker** — Browse models grouped by provider with logos, sorted by release date. Recently used models at the top. Fetches live from [models.dev](https://models.dev).
- **MCP servers** — Connect external tools via the Model Context Protocol.
- **Onboarding flow** — Guided setup when no LLM provider is configured.

Expand All @@ -40,6 +43,8 @@ make up

Open `http://localhost:3000`. Create an account. Add your API keys in **Settings > Providers**.

Project workspaces are stored in a persistent Docker volume (`.workspaces/`), so your research data survives container rebuilds.

> No API keys needed to start — the app guides you through configuration after login.

## Development
Expand All @@ -50,6 +55,9 @@ make dev-up # Start with live reload
make dev-logs # Watch logs
```

Open `http://localhost:5173` for the UI (Vite HMR).
`http://localhost:3000` serves the API with Swagger docs at `/docs`.

### Native
```bash
make install # Install dependencies
Expand Down
1 change: 1 addition & 0 deletions VERSION
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0.4.0
Loading
Loading