Skip to content

feat(config): improve rollback transparency and post-restart UX - #85

Open
Teingi wants to merge 39 commits into
ob-labs:mainfrom
Teingi:dev_0624
Open

feat(config): improve rollback transparency and post-restart UX#85
Teingi wants to merge 39 commits into
ob-labs:mainfrom
Teingi:dev_0624

Conversation

@Teingi

@Teingi Teingi commented Jun 25, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Make rollback outcomes explicit end-to-end by recording and exposing rollback_target_version_id in config version metadata and HTTP responses.
  • Improve dashboard rollback UX by auto-expanding rollback results, showing target consistency diff (target -> rollback), and making rollback target versions clickable for direct navigation.
  • Enhance operational feedback with restart-required/restarting/completed states, health polling after restart, file picker support for AgentSeek path input, and broader i18n coverage across config history and related panels.

Test plan

  • pytest tests/unit_tests/test_config_manager.py tests/unit_tests/test_config_http.py
  • cd dashboard && npm run build
  • Verified no linter errors in modified dashboard files

Notes

  • Rollback remains append-only: the rollback commit parent is still the pre-rollback HEAD by design.
  • The selected rollback target is now explicitly stored and displayed to avoid ambiguity.

Teingi and others added 30 commits June 16, 2026 19:37
Add the new design diagram to both English and Chinese README files near the top so visitors can quickly see the current proposed architecture.

Co-authored-by: Cursor <cursoragent@cursor.com>
Update uv.lock to include the new dashscope-related dependency graph and keep unit test formatting aligned with the current code style.

Co-authored-by: Cursor <cursoragent@cursor.com>
Synchronize Chinese and English README structure and examples, and remove explicit record_utility usage from public-facing learning-loop docs in favor of runtime auto-attribution plus optional feedback.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-Authored-By: Claude <noreply@anthropic.com>
…and plan

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
…ager

Append-only rollback creates a new version with the target's payload;
redo re-applies the version a rollback reverted. diff/blame/verify/status
provide introspection and tamper-detection over the versioned store.

Co-Authored-By: Claude <noreply@anthropic.com>
Render an effective config dict into the .env and config.json files the
existing loaders (ContextSeekSettings, load_runtime_config) already read.
dry_run_validate constructs both loaders from the effective payload before
writing (env mutation guarded by try/finally; RuntimeConfig via temp file).
detect_drift compares on-disk sha256 against expected hashes. _extra_env
keys pass through verbatim so migration rewrites never drop untracked vars.

Co-Authored-By: Claude <noreply@anthropic.com>
Adds ConfigManager.apply(materializer) which delegates to
materializer.materialize(current.effective). The Materializer already
dry-run-validates and raises ValueError on invalid config without
writing files, so a failed apply leaves previously materialized files
intact.

Co-Authored-By: Claude <noreply@anthropic.com>
Migrated from the agentseek-contextseek contrib's reflective env-aliasing
into a declarative, testable mapping table with provider detection.

- AGENTSEEK_MAPPING: agentseek key → (dotted path, transform fn, provider hint)
- PROVIDER_CREDS / PROVIDER_CLASS_PATH: provider credential + class-path tables
- detect_provider / strip_provider_prefix: provider inference helpers
- project_agentseek_env: projects agentseek env into a contextseek projected
  payload only when contextseek LLM is enabled; returns stable source_ref hash

Co-Authored-By: Claude <noreply@anthropic.com>
Wire a `config` subcommand group into the main CLI: registration in
build_parser and an early dispatch in run_cli (before
ContextSeekSettings) so config commands work without a storage backend.

Co-Authored-By: Claude <noreply@anthropic.com>
Adds `import_existing` (builds a native payload from .env/config.json,
reflecting env vars back to section.field paths and parking untracked
keys under `_extra_env`) and `migrate_into` (commits v1 with
origin=migration, no-op when the store is non-empty). Wires the
`config import` subcommand into cli.py.

Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
Reroute GET/PUT /config through ConfigManager via register_config_routes,
extract _build_config_snapshot helper, and add version-management endpoints
(history, version, diff, blame, rollback, redo, status, verify, ingest).
Preserve dashboard embedding-provider validation UX in the rerouted PUT.

Co-Authored-By: Claude <noreply@anthropic.com>
…utes

Co-Authored-By: Claude <noreply@anthropic.com>
…ngest

Co-Authored-By: Claude <noreply@anthropic.com>
Teingi and others added 9 commits June 25, 2026 14:03
Co-Authored-By: Claude <noreply@anthropic.com>
Co-Authored-By: Claude <noreply@anthropic.com>
…ates

Resolve merge conflicts in CLI and HTTP server while preserving both config-routing and plug runtime command paths.

Co-authored-by: Cursor <cursoragent@cursor.com>
Expose rollback targets end-to-end and surface post-rollback diffs/restart state so users can quickly verify what changed and when services are back online. This also closes remaining i18n gaps in config history and related panels for a consistent localized UX.

Co-authored-by: Cursor <cursoragent@cursor.com>
…t collection

Reintroduce desktop restart scheduling in the versioned /config update path so desktop runtime behavior matches existing server expectations. Also skip config HTTP tests when fastapi is not installed to prevent import-time failures in minimal test environments.

Co-authored-by: Cursor <cursoragent@cursor.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant