Skip to content

feat(session): encrypted sessions, Settings, and OS keychain#2

Open
JessicaMulein wants to merge 1 commit into
mainfrom
feat/session-persistence
Open

feat(session): encrypted sessions, Settings, and OS keychain#2
JessicaMulein wants to merge 1 commit into
mainfrom
feat/session-persistence

Conversation

@JessicaMulein
Copy link
Copy Markdown
Member

Summary

  • Cecli submodule pinned to Digital-Defiance/cecli#8 (feat/session-encryption): optional AES-256-GCM for .cecli/sessions/ JSON
  • Vision API: CreateSessionRequest persistence fields; headless_persistence.apply_persistence_to_args; session create wires encrypt/auto-save/auto-load/chat history
  • Tauri: session_key.rs + ensure_session_encryption_keyCECLI_SESSION_KEY when Settings enable encryption
  • Settings: SessionPersistenceSection (encrypt, auto-save/load, session name, chat history file)
  • Stop: POST /sessions/{id}/interrupt + client interruptTurn on SSE abort
  • Tests: 43 session-related core tests; e2e settings persistence flags

Not in this PR (left on main working tree): agent-todo sync, message-queue chip, suggested-files /add tray changes, About dialog, fonts/appearance.

Depends on

Test plan

  • source activate.sh && python -m pytest tests/core/test_session_crypto.py tests/core/test_headless_persistence.py tests/core/test_http_session_persistence.py tests/core/test_http_interrupt.py tests/core/test_sessions.py -q
  • yarn test:bright-core
  • Desktop: Settings → enable encrypt + auto-save → restart session → verify .cecli/sessions/*.json is encrypted blob
  • yarn test:e2e e2e/settings-config.spec.ts (session persistence tests)

Made with Cursor

Wire optional AES-256-GCM session save/load through Vision API and Tauri
(CECLI_SESSION_KEY via keyring), add Settings persistence toggles, and
pin cecli submodule to feat/session-encryption. Includes Stop/interrupt
API for in-flight turns; excludes agent-todo sync and /add queue UI.

Co-authored-by: Cursor <cursoragent@cursor.com>
@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 27, 2026

Warning

Review limit reached

@JessicaMulein, we couldn't start this review because you've reached your PR review rate limit.

More reviews will be available in 59 minutes and 43 seconds. Learn how PR review limits work.

Your organization has run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available.

Please see our Fair Usage Limits Policy for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro

Run ID: 4043cf7f-d489-48f0-99b7-e3f393b91723

📥 Commits

Reviewing files that changed from the base of the PR and between 9785746 and 0b57ed8.

⛔ Files ignored due to path filters (1)
  • src-tauri/Cargo.lock is excluded by !**/*.lock
📒 Files selected for processing (25)
  • bright_vision_core/headless_args.py
  • bright_vision_core/headless_persistence.py
  • bright_vision_core/http_api.py
  • bright_vision_core/session.py
  • cecli
  • docs/IPC.md
  • docs/ROADMAP.md
  • docs/TESTING.md
  • e2e/settings-config.spec.ts
  • package.json
  • src-tauri/Cargo.toml
  • src-tauri/src/main.rs
  • src-tauri/src/session_key.rs
  • src/App.tsx
  • src/components/settings/SessionPersistenceSection.tsx
  • src/components/settings/SettingsPanel.tsx
  • src/ipc/config.ts
  • src/ipc/httpClient.ts
  • src/ipc/visionApi.ts
  • tests/core/test_headless_args.py
  • tests/core/test_headless_persistence.py
  • tests/core/test_http_interrupt.py
  • tests/core/test_http_session_persistence.py
  • tests/core/test_session_crypto.py
  • tests/core/test_sessions.py
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch feat/session-persistence

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@typo-app
Copy link
Copy Markdown

typo-app Bot commented May 27, 2026

Static Code Review 📊

🛑 36 quality checks failed!

@qodo-code-review
Copy link
Copy Markdown

CI Feedback 🧐

A test triggered by this PR failed. Here is an AI-generated analysis of the failure:

Action: audit

Failed stage: Rename / headless compat audit [❌]

Failed test name: ""

Failure summary:

The action failed because the workflow step attempted to run python
aider-vision-core/scripts/audit_rename_compat.py, but the script file was not found in the runner
workspace.
- Error at log line 163: python: can't open file
'/home/runner/work/BrightVision/BrightVision/aider-vision-core/scripts/audit_rename_compat.py':
[Errno 2] No such file or directory
- This caused the command to exit with code 2 (log line 164),
failing the job.

Relevant error logs:
1:  ##[group]Runner Image Provisioner
2:  Hosted Compute Agent
...

149:  ##[group]Installed versions
150:  Successfully set up CPython (3.12.13)
151:  ##[endgroup]
152:  ##[group]Run python aider-vision-core/scripts/audit_rename_compat.py
153:  �[36;1mpython aider-vision-core/scripts/audit_rename_compat.py�[0m
154:  shell: /usr/bin/bash -e {0}
155:  env:
156:  pythonLocation: /opt/hostedtoolcache/Python/3.12.13/x64
157:  PKG_CONFIG_PATH: /opt/hostedtoolcache/Python/3.12.13/x64/lib/pkgconfig
158:  Python_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.13/x64
159:  Python2_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.13/x64
160:  Python3_ROOT_DIR: /opt/hostedtoolcache/Python/3.12.13/x64
161:  LD_LIBRARY_PATH: /opt/hostedtoolcache/Python/3.12.13/x64/lib
162:  ##[endgroup]
163:  python: can't open file '/home/runner/work/BrightVision/BrightVision/aider-vision-core/scripts/audit_rename_compat.py': [Errno 2] No such file or directory
164:  ##[error]Process completed with exit code 2.
165:  Post job cleanup.

@qodo-code-review
Copy link
Copy Markdown

Review Summary by Qodo

Add encrypted session persistence, Settings UI, and OS keychain integration

✨ Enhancement 🧪 Tests

Grey Divider

Walkthroughs

Description
• Add optional AES-256-GCM session encryption via Cecli with OS keychain integration
  - session_encrypt, auto_save, auto_load flags in HTTP API and headless args
  - CECLI_SESSION_KEY environment variable set by Tauri session_key.rs module
  - New headless_persistence.py module to wire persistence options to Cecli
• Implement session persistence Settings UI with toggles for encryption, auto-save/load
  - SessionPersistenceSection component with chat history, session name, encryption controls
  - Config migration and localStorage persistence for all session flags
• Add POST /sessions/{id}/interrupt endpoint for UI Stop button during in-flight turns
• Comprehensive test coverage for session crypto, persistence, and HTTP API integration
  - 43 session-related core tests including encryption roundtrip and keychain scenarios
  - E2E tests for Settings persistence flags and API payload validation
• Pin Cecli submodule to feat/session-encryption branch with session crypto support
• Update workspace metadata directory references from .aider-vision to .cecli
Diagram
flowchart LR
  A["Settings UI<br/>SessionPersistenceSection"] -->|sessionEncrypt<br/>autoSave flags| B["VisionConfig"]
  B -->|passed to API| C["CreateSessionRequest"]
  C -->|apply_persistence_to_args| D["Cecli Headless Args"]
  D -->|session_encrypt=true| E["Cecli SessionManager"]
  E -->|encrypt_session_dict| F["AES-256-GCM Blob"]
  F -->|saved to| G[".cecli/sessions/*.json"]
  H["Tauri session_key.rs"] -->|ensure_session_encryption_key| I["OS Keychain"]
  I -->|CECLI_SESSION_KEY env| J["Vision API Process"]
  J -->|resolve_key| E
  K["POST /interrupt"] -->|interrupt_turn| L["In-flight Turn"]

Loading

Grey Divider

File Changes

1. bright_vision_core/headless_persistence.py ✨ Enhancement +37/-0

New module for session persistence flag wiring

bright_vision_core/headless_persistence.py


2. bright_vision_core/headless_args.py ✨ Enhancement +5/-0

Add persistence fields to default headless args

bright_vision_core/headless_args.py


3. bright_vision_core/http_api.py ✨ Enhancement +39/-1

Add persistence fields to CreateSessionRequest and interrupt endpoint

bright_vision_core/http_api.py


View more (23)
4. bright_vision_core/session.py ✨ Enhancement +152/-23

Wire persistence to Cecli, add file add helpers, reduce timeout

bright_vision_core/session.py


5. tests/core/test_headless_persistence.py 🧪 Tests +77/-0

New tests for persistence flag application and key availability

tests/core/test_headless_persistence.py


6. tests/core/test_session_crypto.py 🧪 Tests +83/-0

New tests for Cecli session encryption roundtrip and key resolution

tests/core/test_session_crypto.py


7. tests/core/test_http_interrupt.py 🧪 Tests +34/-0

New tests for POST /interrupt endpoint

tests/core/test_http_interrupt.py


8. tests/core/test_http_session_persistence.py 🧪 Tests +121/-0

New tests for HTTP API persistence flag integration

tests/core/test_http_session_persistence.py


9. tests/core/test_sessions.py 🧪 Tests +214/-33

Add encrypted session save/load and keychain scenario tests

tests/core/test_sessions.py


10. tests/core/test_headless_args.py 🧪 Tests +5/-0

Add persistence fields to headless args test coverage

tests/core/test_headless_args.py


11. src-tauri/src/session_key.rs ✨ Enhancement +53/-0

New module for OS keychain session key management

src-tauri/src/session_key.rs


12. src-tauri/src/main.rs ✨ Enhancement +16/-5

Integrate session key module and pass encryption flag to Vision API

src-tauri/src/main.rs


13. src-tauri/Cargo.toml Dependencies +3/-0

Add keyring, getrandom, base64 dependencies

src-tauri/Cargo.toml


14. src/ipc/config.ts ✨ Enhancement +15/-0

Add session persistence config fields to VisionConfig

src/ipc/config.ts


15. src/ipc/httpClient.ts ✨ Enhancement +16/-0

Add persistence params to createSession and new interruptTurn method

src/ipc/httpClient.ts


16. src/ipc/visionApi.ts ✨ Enhancement +14/-0

Wire persistence config to API and call ensure_session_encryption_key

src/ipc/visionApi.ts


17. src/components/settings/SessionPersistenceSection.tsx ✨ Enhancement +102/-0

New Settings UI component for session persistence toggles

src/components/settings/SessionPersistenceSection.tsx


18. src/components/settings/SettingsPanel.tsx ✨ Enhancement +3/-0

Integrate SessionPersistenceSection into Settings panel

src/components/settings/SettingsPanel.tsx


19. src/App.tsx ✨ Enhancement +15/-0

Add config migration for new session persistence fields

src/App.tsx


20. src/brand.ts ✨ Enhancement +0/-0

Export WORKSPACE_META_DIR constant for .cecli directory

src/brand.ts


21. e2e/settings-config.spec.ts 🧪 Tests +44/-0

Add E2E tests for session persistence Settings and API integration

e2e/settings-config.spec.ts


22. docs/IPC.md 📝 Documentation +4/-4

Update workspace metadata directory from .aider-vision to .cecli

docs/IPC.md


23. docs/ROADMAP.md 📝 Documentation +2/-1

Mark session persistence as partial and update timeout default

docs/ROADMAP.md


24. docs/TESTING.md 📝 Documentation +19/-1

Add session persistence test instructions and coverage

docs/TESTING.md


25. package.json ⚙️ Configuration changes +1/-1

Add session persistence tests to test:bright-core script

package.json


26. cecli Dependencies +1/-1

Pin submodule to feat/session-encryption branch

cecli


Grey Divider

Qodo Logo

@qodo-code-review
Copy link
Copy Markdown

qodo-code-review Bot commented May 27, 2026

Code Review by Qodo

🐞 Bugs (5) 📘 Rule violations (1)

Grey Divider


Action required

1. Broken workspace_paths import 🐞 Bug ≡ Correctness
Description
bright_vision_core.session imports bright_vision_core.workspace_paths, but that module is not
present in the package, so importing Session (and starting http_api) will crash with
ModuleNotFoundError. stage_uploaded_file() also calls attachments_dir(), so uploads break even
if the import were patched ad-hoc.
Code

bright_vision_core/session.py[41]

Evidence
session.py imports the missing module and calls functions from it during file upload staging; this
will fail at import time or at first upload call.

bright_vision_core/session.py[37-42]
bright_vision_core/session.py[676-679]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
`bright_vision_core/session.py` imports `attachments_dir`/`attachments_prefix` from `bright_vision_core.workspace_paths`, but the module is missing from the repo, causing runtime import failure.

### Issue Context
This import is executed when the FastAPI app imports `Session`, so it prevents the Vision API from starting.

### Fix Focus Areas
- Add module: `bright_vision_core/workspace_paths.py` with `attachments_dir(workspace: Path) -> Path` and `attachments_prefix() -> str` (and any other helpers you intended).
- Or remove the import and inline the path logic in `bright_vision_core/session.py`.

### Fix Focus Areas (paths/lines)
- bright_vision_core/session.py[37-42]
- bright_vision_core/session.py[676-679]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


2. Meta dir path divergence 🐞 Bug ≡ Correctness
Description
Desktop (Tauri) now persists todos/specs under .cecli/, but the Python core WorkspaceTodos still
reads/writes .aider-vision/, so the desktop Tasks UI and core session/todo APIs will operate on
different on-disk stores. This will manifest as “missing tasks/specs” depending on whether the
operation was performed by desktop UI (Rust) or core API (Python).
Code

src-tauri/src/main.rs[R735-740]

Evidence
Tauri’s WORKSPACE_META_DIR is set to .cecli and used to compute todos paths, while Python
WorkspaceTodos hardcodes .aider-vision for the same persisted artifacts.

src-tauri/src/main.rs[735-748]
bright_vision_core/workspace_todos.py[224-232]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
Rust/Tauri has switched workspace state paths to `.cecli/`, but Python core still uses `.aider-vision/` for todos/specs. This splits persisted state across two directories.

### Issue Context
Desktop UI uses Tauri commands to read/write todos; core session APIs use `WorkspaceTodos`.

### Fix Focus Areas
- Choose a single workspace metadata dir (likely `.cecli/`).
- Update Python `WorkspaceTodos` paths accordingly.
- If you need backward compatibility, implement migration (copy/merge `.aider-vision/` into `.cecli/` once).

### Fix Focus Areas (paths/lines)
- src-tauri/src/main.rs[735-748]
- bright_vision_core/workspace_todos.py[224-232]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


3. Missing WORKSPACE_META_DIR export 🐞 Bug ≡ Correctness
Description
SessionPersistenceSection imports WORKSPACE_META_DIR from src/brand.ts, but src/brand.ts
does not export that symbol, causing a TypeScript build failure. This blocks the Settings panel from
compiling.
Code

src/components/settings/SessionPersistenceSection.tsx[R10-13]

Evidence
The Settings component imports WORKSPACE_META_DIR, but the brand module currently exports only
product/branding constants and helper functions; no WORKSPACE_META_DIR export exists in the file.

src/components/settings/SessionPersistenceSection.tsx[10-13]
src/brand.ts[1-68]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
A new Settings component imports `WORKSPACE_META_DIR` from `../../brand`, but `src/brand.ts` does not export it.

### Issue Context
This is a compile-time failure in the frontend.

### Fix Focus Areas
- Add `export const WORKSPACE_META_DIR = '.cecli'` (or whichever dir you standardize on) to `src/brand.ts`.
- Optionally also add a matching constant in `bright_vision_core/brand.py` and keep them in sync.

### Fix Focus Areas (paths/lines)
- src/components/settings/SessionPersistenceSection.tsx[10-13]
- src/brand.ts[1-68]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools



Remediation recommended

4. New keyring dependency unaudited 📘 Rule violation ⛨ Security
Description
New Rust dependencies (keyring, getrandom, base64) are introduced without any in-repo
documentation of license permissiveness or a brief security/size impact assessment. This increases
legal and supply-chain risk if the dependencies are not reviewed and justified.
Code

src-tauri/Cargo.toml[R20-22]

Evidence
PR Compliance ID 5 requires permissive-license verification and an evaluation/justification when
adding dependencies. The PR adds new crates in src-tauri/Cargo.toml without any accompanying audit
notes in the change set.

AGENTS.md: Use Permissively Licensed Dependencies and Audit Dependency Size/Security
src-tauri/Cargo.toml[17-22]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

## Issue description
New Rust dependencies were added without documenting license permissiveness and basic security/size impact assessment.

## Issue Context
PR Compliance requires new dependencies to be permissively licensed and to have their footprint/security implications evaluated/justified (especially when adding native keychain access via `keyring`).

## Fix Focus Areas
- src-tauri/Cargo.toml[17-22]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


5. Silent auto-load failures 🐞 Bug ◔ Observability
Description
When auto_load is enabled, Session.create() catches all exceptions from
SessionManager.load_session() and ignores them, so failed restores (missing file, decrypt error,
parse error) are invisible to the user and hard to debug. This can leave users thinking persistence
is working when it is not.
Code

bright_vision_core/session.py[R292-300]

Evidence
The code path that performs auto-load explicitly suppresses all exceptions without logging/emitting
events.

bright_vision_core/session.py[292-300]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
Auto-load exceptions are swallowed with `except Exception: pass`, producing no tool output/event.

### Issue Context
Users enabling Settings auto-load need feedback when a restore fails.

### Fix Focus Areas
- Catch expected failures explicitly (e.g., FileNotFoundError) and emit a `tool_warning`.
- For unexpected exceptions, emit `tool_error` with the exception message (and possibly re-raise if you want session creation to fail).

### Fix Focus Areas (paths/lines)
- bright_vision_core/session.py[292-300]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


6. Ambiguous base64 validation 🐞 Bug ☼ Reliability
Description
valid_key_b64() pads the stored key to a multiple-of-4 but then decodes with the URL_SAFE_NO_PAD
engine; this is unnecessary and can be brittle across base64 implementations/configurations.
Tightening this logic (and adding a small Rust unit test) reduces the risk of falsely rejecting an
existing keychain key and regenerating a new one.
Code

src-tauri/src/session_key.rs[R15-25]

Evidence
The module generates keys using URL_SAFE_NO_PAD.encode but validation first introduces = padding
and decodes using the no-pad engine.

src-tauri/src/session_key.rs[3-5]
src-tauri/src/session_key.rs[15-25]
src-tauri/src/session_key.rs[36-42]

Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution

### Issue description
The key is generated with `URL_SAFE_NO_PAD.encode`, but validation repads with `=` and decodes via `URL_SAFE_NO_PAD`, which is conceptually inconsistent and easy to break.

### Issue Context
If a stored key is (incorrectly) considered invalid, `ensure_session_encryption_key()` will generate/store a new key, making existing encrypted sessions undecryptable.

### Fix Focus Areas
- Decode the trimmed string directly with `URL_SAFE_NO_PAD` (no manual padding).
- Optionally accept both padded and unpadded forms by trying `URL_SAFE_NO_PAD` first and then `URL_SAFE`.
- Add a Rust unit test that round-trips a 32-byte key: encode (no pad) -> validate -> decode length == 32.

### Fix Focus Areas (paths/lines)
- src-tauri/src/session_key.rs[15-25]
- src-tauri/src/session_key.rs[36-42]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools


Grey Divider

Qodo Logo

Copy link
Copy Markdown

@typo-app typo-app Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

AI Code Review 🤖

Files Reviewed: 26
Comments Added: 1
Lines of Code Analyzed: 1158
Critical Issues: 1

PR Health: Risky 🚫

Give 👍 or 👎 on each review comment to help us improve.

Comment on lines +299 to +300
except Exception:
pass
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

logic: Broad exception with 'pass' silently ignores all session loading errors. Emit a warning event to inform the user of failures.

Suggested change
except Exception:
pass
except Exception as e:
io.emit("warning", text=f"Could not auto-load session '{name}': {e}")

from bright_vision_core.headless_persistence import apply_persistence_to_args
from bright_vision_core.todo_spec_generate import build_generate_message, parse_generated_layers
from bright_vision_core.slash_helpers import is_switch_coder_signal, run_slash_command_sync
from bright_vision_core.workspace_paths import attachments_dir, attachments_prefix
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

1. Broken workspace_paths import 🐞 Bug ≡ Correctness

bright_vision_core.session imports bright_vision_core.workspace_paths, but that module is not
present in the package, so importing Session (and starting http_api) will crash with
ModuleNotFoundError. stage_uploaded_file() also calls attachments_dir(), so uploads break even
if the import were patched ad-hoc.
Agent Prompt
### Issue description
`bright_vision_core/session.py` imports `attachments_dir`/`attachments_prefix` from `bright_vision_core.workspace_paths`, but the module is missing from the repo, causing runtime import failure.

### Issue Context
This import is executed when the FastAPI app imports `Session`, so it prevents the Vision API from starting.

### Fix Focus Areas
- Add module: `bright_vision_core/workspace_paths.py` with `attachments_dir(workspace: Path) -> Path` and `attachments_prefix() -> str` (and any other helpers you intended).
- Or remove the import and inline the path logic in `bright_vision_core/session.py`.

### Fix Focus Areas (paths/lines)
- bright_vision_core/session.py[37-42]
- bright_vision_core/session.py[676-679]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment thread src-tauri/src/main.rs
Comment on lines +735 to 740
/// Cecli project tree; BrightVision uses ``todos.json``, ``specs/``, ``attachments/`` subtrees.
const WORKSPACE_META_DIR: &str = ".cecli";

fn is_image_ext(path: &Path) -> bool {
path.extension()
.and_then(|e| e.to_str())
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

2. Meta dir path divergence 🐞 Bug ≡ Correctness

Desktop (Tauri) now persists todos/specs under .cecli/, but the Python core WorkspaceTodos still
reads/writes .aider-vision/, so the desktop Tasks UI and core session/todo APIs will operate on
different on-disk stores. This will manifest as “missing tasks/specs” depending on whether the
operation was performed by desktop UI (Rust) or core API (Python).
Agent Prompt
### Issue description
Rust/Tauri has switched workspace state paths to `.cecli/`, but Python core still uses `.aider-vision/` for todos/specs. This splits persisted state across two directories.

### Issue Context
Desktop UI uses Tauri commands to read/write todos; core session APIs use `WorkspaceTodos`.

### Fix Focus Areas
- Choose a single workspace metadata dir (likely `.cecli/`).
- Update Python `WorkspaceTodos` paths accordingly.
- If you need backward compatibility, implement migration (copy/merge `.aider-vision/` into `.cecli/` once).

### Fix Focus Areas (paths/lines)
- src-tauri/src/main.rs[735-748]
- bright_vision_core/workspace_todos.py[224-232]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Comment on lines +10 to +13
import type { VisionConfig } from '../../ipc/config'
import { isTauriRuntime } from '../../ipc/isTauri'
import { WORKSPACE_META_DIR } from '../../brand'

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Action required

3. Missing workspace_meta_dir export 🐞 Bug ≡ Correctness

SessionPersistenceSection imports WORKSPACE_META_DIR from src/brand.ts, but src/brand.ts
does not export that symbol, causing a TypeScript build failure. This blocks the Settings panel from
compiling.
Agent Prompt
### Issue description
A new Settings component imports `WORKSPACE_META_DIR` from `../../brand`, but `src/brand.ts` does not export it.

### Issue Context
This is a compile-time failure in the frontend.

### Fix Focus Areas
- Add `export const WORKSPACE_META_DIR = '.cecli'` (or whichever dir you standardize on) to `src/brand.ts`.
- Optionally also add a matching constant in `bright_vision_core/brand.py` and keep them in sync.

### Fix Focus Areas (paths/lines)
- src/components/settings/SessionPersistenceSection.tsx[10-13]
- src/brand.ts[1-68]

ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant