Update all documentation to reflect new global LOG_LEVEL environment variable.
- Add LOG_LEVEL to configuration reference tables
- Update deployment guides with LOG_LEVEL=error examples
- Clarify dev (info) vs production (error) log level recommendations
- Add LOG_LEVEL to all .env examples and quick start guides
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Configure production deployments to use LOG_LEVEL=error for minimal log volume.
- Add LOG_LEVEL=error to docker-compose.yml environment
- Add LOG_LEVEL: error to K8s ConfigMap
- Update .env.example with dev/prod LOG_LEVEL guidance
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Replace custom console-based logger with pino backend supporting LOG_LEVEL environment variable.
- Add pino dependency for structured JSON logging
- Implement LOG_LEVEL env var support (debug/info/warn/error, default: info)
- Remove REPO_LIST_DEBUG_LOGS special flag in favor of global LOG_LEVEL
- Preserve existing logger API compatibility (message, meta?)
- Add safe error serialization to prevent credential leakage
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
- Test runtime self-healing when repository_review_prompts table is dropped
- Test migration layer self-healing for inconsistent DB state
- Verify repository listing remains functional during schema recovery
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
- Add REPO_LIST_DEBUG_LOGS environment variable to control debug output
- Gate debug logs in admin controller and gitea service
- Keep error/warn logs always enabled for production visibility
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Recover inconsistent SQLite states where migration v3 is marked applied but repository_review_prompts objects are absent, preventing admin repository listing failures in docker deployments.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
Capture request/runtime context plus nested error metadata so docker-only repository-list issues can be diagnosed quickly.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-openagent)
- Add database migration and repository for project review prompts
- Add API endpoint for setting project-level prompts
- Integrate project prompts into Agent and Codex review flows
- Redesign repository management UI with dialog-based prompt editor
- Replace flat buttons with Switch for webhook toggle and dedicated prompt button
- Add Dialog and DropdownMenu UI components from Radix UI
- Add comprehensive tests for wiring and interactions
Align project docs with current behavior using progressive disclosure and bilingual deep-dive guides. Add per-page admin screenshots with consistent page-* naming to make UI documentation clearer.
Drop legacy runtime paths and role assignments across backend/frontend, and add upgrade-safe DB migration for existing installs. This aligns config, docs, tests, and UI to the agent-first architecture with codex as the only alternate engine.
- Replace default Vite favicon and title with project-specific branding
- Add axios response interceptor to handle 401 by clearing token and redirecting to login
- Move health check endpoint from '/' to '/api/health' so SPA index.html is served on root
- Integrate next-themes ThemeProvider with system preference detection and manual toggle
- Update docker-compose and k8s health check paths accordingly
- Replace hardcoded dark-only colors with semantic CSS variable tokens for theme compatibility
- Delete snapshot refs (refs/reviewed/pr/{n}/*) when PR is closed or merged
- Add daily 2:00 AM scheduled cleanup for mirrors/workspaces older than 3 days
- Expose deleteReviewedRefs, getMirrorPath, cleanStaleMirrors on LocalRepoManager
Install Node.js 22 and @openai/codex globally in the production Docker
image to support the Codex review engine runtime dependency.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
Add ReviewConfigPage with engine selector (legacy/agent/codex) and
Codex-specific configuration fields. Restructure sidebar navigation
to separate review settings from general config. Update ConfigGroupCard
with improved styling.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
Save baseSha + headSha as git refs (refs/reviewed/pr/{n}/base and
refs/reviewed/pr/{n}/head) after each successful PR review. On
subsequent reviews, compare saved baseSha with current baseSha to
decide incremental (two-dot diff) vs full (three-dot diff). Falls
back to full review only when PR base changes (rebase scenario).
Protects custom refs from fetch --prune via negative refspec.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
Add a new Codex-based review engine that runs OpenAI Codex CLI in
full-auto mode with a Streamable HTTP MCP server providing Gitea
review tools (get_pr_info, add_review_comment, add_review_summary,
get_file_content). Includes incremental review support via
lastReviewedHead in MCP context and review prompt.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
Remove the per-provider listModels API (GET /providers/:id/models) and all
four provider implementations (OpenAI Compatible, OpenAI Responses, Anthropic,
Gemini). ModelCombobox now only shows tokenlens suggestions (tagged '推荐') plus
free-form custom input — no more unfiltered 'API' models from provider SDKs.
Fixes: switching provider type in ProviderDialog no longer shows stale models
from the original provider's API.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
Add GET /llm/model-suggestions endpoint that maps ProviderType to models.dev
provider keys and returns chat model IDs from the tokenlens catalog. Lazy-loads
catalog on first request to avoid empty results when engine hasn't started.
Frontend ModelCombobox now fetches suggestions via useQuery with 30min cache
instead of reading from hardcoded MODEL_SUGGESTIONS constant.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
Implement TriageAgent with heuristic fast path (skip trivial changes like
lockfiles, CI configs, docs-only) and LLM fallback via chatForRole('planner').
Orchestrator now runs triage before specialist dispatch, only invoking agents
for relevant domains instead of all 4 specialists on every change.
Uses the pre-reserved 'planner' model role that was defined in DB schema and
frontend UI but never wired to backend logic.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
Add LLMSemaphore for concurrency control (default 4) and retryWithBackoff
with exponential backoff respecting 429 retryAfterSeconds. Wrap all
LLMGateway calls (chatForRole, chatDirect, embedForRole) via withResilience.
New config fields: LLM_MAX_CONCURRENT_CALLS, LLM_RETRY_MAX_ATTEMPTS,
LLM_RETRY_BASE_DELAY_MS, ENABLE_TRIAGE.
Ultraworked with [Sisyphus](https://github.com/code-yeongyu/oh-my-opencode)
After migrating config to DB, values changed via Web UI were not picked
up by consumers that cached config at module load time.
- gitea.ts: replace static axios.create() with request interceptors that
read config.gitea.apiUrl and accessToken on every request
- feishu.ts: remove constructor caching of webhookUrl/webhookSecret,
read from config.feishu.* on each sendMessage() call
- engine.ts: create SandboxExec/LocalRepoManager/DiffExtractor/Orchestrator
per review run instead of once at class init, so workdir/token/limits
always reflect current config. FileReviewStore stays singleton (has state).
- index.ts: wrap JWT middleware in per-request handler so config.admin.jwtSecret
is read dynamically instead of captured once at startup
These env vars are no longer read by the application — all runtime
settings are managed through the Admin Dashboard Web UI backed by
SQLite. Only PORT remains in the ConfigMap. Secret resource removed
entirely. README k8s sections updated accordingly.
- docker-compose.e2e.yml: remove WEBHOOK_SECRET, REVIEW_* env vars
(now configured via assistant API in seed.sh)
- e2e/seed.sh: add step to configure assistant via Admin API after boot
(login with default password, set webhook secret + review settings)
- k8s/gitea-assistant.yaml: Secret now only contains GITEA_ACCESS_TOKEN;
ConfigMap reduced to GITEA_API_URL, PORT, QDRANT_URL
- cursor rules updated to document DB-first config architecture
- Configuration Reference now shows only PORT/DATABASE_PATH/MASTER_KEY_PATH as env vars
- All other settings documented as Web UI configuration
- Installation steps simplified (no more .env editing for runtime config)
- Docker run command updated to use volume mount instead of --env-file
- k8s section simplified: only GITEA_ACCESS_TOKEN in Secret