Commit Graph
858 Commits
Author SHA1 Message Date
google-labs-jules[bot]andPR0M3TH3AN e1400f32a5 refactor: improve test determinism by removing time.sleep
Replaced non-deterministic `time.sleep` calls with active polling loops or
thread joins in `src/tests/` to improve test determinism and reliability.
Modified `test_unlock_sync.py`, `test_nostr_sdk_workflow.py`,
`test_background_relay_check.py`, `test_offline_mode_behavior.py`, and
`test_nostr_index_size.py`.
Generated integrity and audit reports in `reports/test-audit/`.
Completed the scheduler rotation by publishing completion logic and
task log file to `torch/task-logs/daily/`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-03-01 02:59:43 +00:00
thePR0M3TH3AN 65d9f916d2 Merge branch 'beta' into agents/daily/audit-agent-17254275400947240958 2026-02-28 13:44:45 -05:00
thePR0M3TH3AN 3cd919eead Merge branch 'beta' into content-audit-agent-fixes-3621733322784994394 2026-02-28 13:44:08 -05:00
thePR0M3TH3AN 916bec7653 Merge pull request #950 from PR0M3TH3AN/agents/weekly/changelog-agent-12990813539484632705
docs(ai): weekly changelog draft
2026-02-28 13:42:55 -05:00
google-labs-jules[bot]andPR0M3TH3AN 6db570f2a7 test: gracefully skip test_ai_tui_agent_harness on Windows
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-28 03:32:48 +00:00
google-labs-jules[bot]andPR0M3TH3AN a3b8a91977 fix(test): Skip pty and termios tests on Windows
- Added `pytest.importorskip` calls for `pty` and `termios` to `src/tests/test_ai_tui_agent_harness.py`.
- Formatted `torch/scripts/test-audit/run_python_static_analysis.py` and `torch/scripts/test-audit/run_python_flaky_check.py` using `black`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-28 02:05:31 +00:00
google-labs-jules[bot]andPR0M3TH3AN 228cdee71e chore: Daily ci-health-agent execution
- Executed daily scheduler logic for ci-health-agent.
- Generated flake report artifacts/ci-flakes-<date>.md
- Updated context, decisions, test_logs, and todo.
- Recorded memory retrieve/store artifacts.
- Created task completion log.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-28 01:51:47 +00:00
google-labs-jules[bot]andPR0M3TH3AN a4fb4c24ed fix(tests): skip pty/termios tests on non-unix systems
Added pytest.importorskip calls for 'pty' and 'termios' modules in
test_ai_tui_agent_harness.py to fix test failures on Windows where
these modules are unavailable.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-28 00:46:37 +00:00
google-labs-jules[bot]andPR0M3TH3AN b8da933fb7 fix: skip pty and termios on windows for test_ai_tui_agent_harness.py
Added `pytest.importorskip("pty")` and `pytest.importorskip("termios")` before `_load_harness_module()` call to properly skip `test_ai_tui_agent_harness.py` on Windows environments where these modules are not available. This prevents the `ModuleNotFoundError: No module named 'termios'` error during pytest collection.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-28 00:07:54 +00:00
google-labs-jules[bot]andPR0M3TH3AN d8e854b07e fix: content-audit-agent docs links and write completion task log
Fixed broken documentation links pointing to non-existent \`docs/agent-handoffs/learnings\`
and \`docs/prompt-versioning.md\` files in \`TORCH.md\` and \`scheduler-lock.mjs\`.
Completed memory storage/retrieval steps and finalized the scheduler loop by
writing the required \`_completed.md\` task log.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 23:49:29 +00:00
google-labs-jules[bot]andPR0M3TH3AN 596b4912ea fix: conditionally skip test_ai_tui_agent_harness on Windows
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 21:26:56 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5195063444 [constants] extract numeric literals to domain constants in memory service
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 21:17:24 +00:00
google-labs-jules[bot]andPR0M3TH3AN ee7cde10f8 Fix Windows CI failure in AI TUI agent tests
- Skip `src/tests/test_ai_tui_agent_harness.py` on Windows to avoid `ImportError` due to missing `termios`/`pty` modules.
- Ensure the harness module is only loaded if the skip condition is not met.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 19:16:52 +00:00
google-labs-jules[bot]andPR0M3TH3AN 9303558efe Execute audit-agent via daily scheduler
- Install `torch/` dependencies for host-repo mode
- Acquire daily lock for `audit-agent`
- Run memory retrieval and storage cycles
- Execute audit scripts (file size, innerHTML, lint)
- Generate audit reports and artifacts
- Publish task completion log

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 19:00:30 +00:00
google-labs-jules[bot]andPR0M3TH3AN 4ba2581eff style: reformat src/tests/conftest.py with black
- Formatted `src/tests/conftest.py` using `black` to fix CI formatting failures.
- This change ensures compliance with the repository's strict formatting checks (`poetry run black --check .`).

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 03:55:13 +00:00
google-labs-jules[bot]andPR0M3TH3AN d84363ef83 style: fix formatting in src/tests/conftest.py
- Manually applied PEP 8 formatting (sorted imports, correct spacing) to `src/tests/conftest.py` to satisfy `poetry run black --check .` in CI.
- Retained the robust `try-import-except` logic for `trio` detection.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 03:43:38 +00:00
google-labs-jules[bot]andPR0M3TH3AN 7295807013 fix: resolve CI failures in trio tests and GUI/CLI test pollution
- Made `trio` backend detection in `src/tests/conftest.py` robust by using `try-import-except` instead of `find_spec`, fixing `ModuleNotFoundError` in environments where `find_spec` behavior differs or trio is partially present but not importable.
- Prevented test pollution in `src/tests/test_gui_features.py` by adding `try...finally` block to unsubscribe `refresh_codes` from the global `bus`, ensuring subsequent CLI tests (like `test_nostr_sync`) don't crash due to lingering callbacks.
- Hardened `src/seedpass_gui/app.py` against test-induced errors:
    - `TotpViewerWindow.refresh_codes` now accepts `*args, **kwargs` to safely ignore event arguments if called via subscription.
    - `MainWindow.vault_locked` catches `ValueError` when closing, handling cases where the window is already detached in test environments.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 03:32:38 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5767742050 fix: restore conftest.py and clean pubsub
- Restored `src/tests/conftest.py` from `.bak` to fix missing `trio` conditional check, resolving `ModuleNotFoundError: No module named 'trio'`.
- Added `clean_pubsub` autouse fixture to `conftest.py` to clear the global `bus` subscribers between tests. This prevents test pollution that was causing `TypeError` in CLI tests and `ValueError` in GUI tests due to lingering callbacks.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 03:22:41 +00:00
thePR0M3TH3AN 7dc80ed50f Merge branch 'beta' into agents/daily/style-agent-3237388057797561077 2026-02-26 21:36:11 -05:00
thePR0M3TH3AN b414f797d9 Merge branch 'beta' into agents/daily/test-audit-agent-9196356756711804853 2026-02-26 21:33:27 -05:00
google-labs-jules[bot]andPR0M3TH3AN 8495df0910 test(ci): mock masked_input in profile management test
Fixes `OSError: [Errno 22] Invalid argument` in Windows CI runs by mocking
`utils.password_prompt.masked_input` in `test_add_and_delete_entry`. This prevents
`msvcrt.getwch()` from being called in non-interactive environments when
`PasswordManager.add_new_fingerprint` requests a password/seed.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 00:45:49 +00:00
google-labs-jules[bot]andPR0M3TH3AN 5e9ff2ab8f chore(style-agent): format code and update task logs
- Ran `black .` to reformat Python files:
  - src/seedpass/core/display_service.py
  - src/seedpass/core/manager.py
  - src/seedpass/core/password_generation.py
  - src/tests/test_stats_manager.py
  - test_atomic_write_perms.py
- Verified with `pytest` (766 passed) and `npm run lint`.
- Updated `.scheduler-memory/latest/daily/memories.md` with execution details.
- Added daily task log: `torch/task-logs/daily/2026-02-27T...__style-agent__completed.md`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 00:14:18 +00:00
google-labs-jules[bot]andPR0M3TH3AN b891787a92 Fix: Monkeypatch masked_input in test_profile_management to prevent Windows CI crash
- Explicitly mocks `utils.seed_prompt.masked_input`, `seedpass.core.manager.masked_input`, and `utils.password_prompt.masked_input` in `test_add_and_delete_entry`.
- This prevents `msvcrt.getwch()` from being called in non-interactive CI environments on Windows, which was causing `OSError: [Errno 22] Invalid argument`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-27 00:03:47 +00:00
google-labs-jules[bot]andPR0M3TH3AN 198ed4e440 chore(ai): format sources (style-agent)
Reformatted 5 Python files using black and verified linting for Node.js sources. No functional changes.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 22:20:16 +00:00
thePR0M3TH3AN 4459dfea78 Fix display service input hooks and clean pytest warnings 2026-02-26 15:45:55 -05:00
thePR0M3TH3AN 44a5afa99b Merge pull request #928 from PR0M3TH3AN/refactor/gui-backend-constants-18119685441517758660
Refactor GUI backend configuration to constants
2026-02-26 14:37:14 -05:00
thePR0M3TH3AN 53dcbb72c6 Merge pull request #929 from PR0M3TH3AN/refactor-menu-handler-generic-8639963642107346
Refactor entry menus to use generic `MenuHandler.run_menu`
2026-02-26 14:37:03 -05:00
thePR0M3TH3AN ca1b371e85 Merge pull request #930 from PR0M3TH3AN/refactor/password-complexity-4748189869193669602
🧹 Refactor _enforce_complexity for better maintainability
2026-02-26 14:36:49 -05:00
thePR0M3TH3AN 9a8c68dc81 Merge pull request #926 from PR0M3TH3AN/refactor/handle-add-methods-duplication-16655045915046682728
Refactor handle_add_* methods in manager.py to remove duplication
2026-02-26 14:36:12 -05:00
thePR0M3TH3AN 1c4ccb0bcb Merge pull request #925 from PR0M3TH3AN/fix/pycryptodome-dependency-10448946637332491323
🔒 Fix missing pycryptodome dependency for PGP features
2026-02-26 14:35:56 -05:00
thePR0M3TH3AN b680e1dfa5 Merge pull request #924 from PR0M3TH3AN/test-fingerprint-edge-cases-17056355250998203024
🧪 Add edge case tests for generate_fingerprint
2026-02-26 14:35:44 -05:00
thePR0M3TH3AN 9408a64c1c Merge pull request #921 from PR0M3TH3AN/fix-backup-seed-overwrite-3580566875642074998
🔒 Fix Arbitrary File Overwrite in backup_parent_seed
2026-02-26 14:34:32 -05:00
thePR0M3TH3AN 11f61cec4c Merge pull request #919 from PR0M3TH3AN/code-health-display-service-3270220411041344632
🧹 Refactor display logic to DisplayService
2026-02-26 14:33:22 -05:00
thePR0M3TH3AN 7a74a3d77d Merge pull request #918 from PR0M3TH3AN/refactor-initialize-managers-2379820850270818796
Refactor initialize_managers in PasswordManager
2026-02-26 14:33:05 -05:00
thePR0M3TH3AN 499f2c0915 Merge pull request #917 from PR0M3TH3AN/perf-import-vault-blocking-7033826596991244331
⚡ Optimize import_vault endpoint to prevent blocking event loop
2026-02-26 14:32:50 -05:00
thePR0M3TH3AN 115eacb326 Merge pull request #916 from PR0M3TH3AN/jules-stats-manager-test-11560243951841616901
Add test for StatsManager.reset
2026-02-26 14:32:34 -05:00
google-labs-jules[bot]andPR0M3TH3AN a1b459f98f Refactor entry menus to use generic MenuHandler.run_menu
Consolidated duplicated menu loop logic from `_entry_actions_menu`, `_entry_edit_menu`, and `_entry_qr_menu` in `src/seedpass/core/manager.py` into a reusable `run_menu` method in `src/seedpass/core/menu_handler.py`. This improves maintainability by centralizing the loop handling, input prompting, and header clearing logic.

*   Added `run_menu` to `MenuHandler`.
*   Refactored `_entry_actions_menu` to use `run_menu`.
*   Refactored `_entry_edit_menu` to use `run_menu`.
*   Refactored `_entry_qr_menu` (NOSTR section) to use `run_menu`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 19:26:55 +00:00
google-labs-jules[bot]andPR0M3TH3AN 9e08e5082b Refactor GUI backend config to constants.py
Extracts the hardcoded BeeWare GUI backend configuration (package names, versions, and SHA256 hashes) from `src/seedpass/cli/__init__.py` into a new `GUI_BACKEND_CONFIG` dictionary in `src/constants.py`. This improves maintainability by centralizing configuration and simplifying the CLI logic.

- Adds `GUI_BACKEND_CONFIG` to `src/constants.py`.
- Updates `src/seedpass/cli/__init__.py` to import and use `GUI_BACKEND_CONFIG`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 19:25:24 +00:00
google-labs-jules[bot]andPR0M3TH3AN 4ebc14e703 Refactor handle_add_* methods to remove duplication
- Introduced `_clear_header_add_entry`, `_mark_dirty`, `_sync_and_pause` helpers.
- Introduced `_entry_op_context` context manager for error handling.
- Applied these patterns to `handle_add_totp`, `handle_add_ssh_key`, `handle_add_seed`, `handle_add_pgp`, `handle_add_nostr_key`, `handle_add_key_value`, and `handle_add_managed_account`.
- Ensured `is_dirty` flag is set immediately after entry creation to prevent data loss if subsequent UI steps are cancelled.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 19:18:51 +00:00
google-labs-jules[bot]andPR0M3TH3AN 1dc98a3e96 fix(deps): add pycryptodome dependency for PGP RSA features
This change explicitly adds `pycryptodome` to `pyproject.toml` and `src/requirements.txt` to resolve a `ModuleNotFoundError` when generating PGP RSA keys. The `Crypto` namespace provided by `pycryptodome` is required by `src/seedpass/core/password_generation.py`.

Verified with `reproduce_issue.py` (which now passes) and `src/tests/test_pgp_entry.py`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 19:17:29 +00:00
google-labs-jules[bot]andPR0M3TH3AN 6a921b8f84 test: add comprehensive unit tests for generate_fingerprint
Add `src/tests/test_fingerprint.py` to cover:
- Happy path fingerprint generation.
- Custom fingerprint length.
- Input normalization (whitespace/case).
- Error handling via mocked exception in `hashlib.sha256`.
- Invalid input handling (NoneType).

This addresses the gap where the exception path in `src/utils/fingerprint.py` was unreachable with standard inputs.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 19:15:19 +00:00
google-labs-jules[bot]andPR0M3TH3AN 39f552d589 Fix: Prevent arbitrary file overwrite in backup_parent_seed
This change mitigates an arbitrary file overwrite vulnerability in the
`backup_parent_seed` API endpoint. Previously, the endpoint did not
check if the destination file already existed, allowing attackers or
accidental misuse to overwrite critical files if the path validation
passed.

The fix introduces a check using `resolved_path.exists()` after path
validation. If the file exists, the request is rejected with a
409 Conflict error.

A reproduction test case confirmed the vulnerability and verified the
fix. Regression tests on the API passed successfully.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 19:09:06 +00:00
google-labs-jules[bot]andPR0M3TH3AN a6856c1fec Refactor _enforce_complexity in password_generation.py
Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 18:17:59 +00:00
google-labs-jules[bot]andPR0M3TH3AN 40f37b30bd Refactor display_sensitive_entry_info into DisplayService
Extracted the monolithic `display_sensitive_entry_info` method from `PasswordManager` into a new `DisplayService` class in `src/seedpass/core/display_service.py`. This improves maintainability and separation of concerns.

- Created `src/seedpass/core/display_service.py` with `DisplayService` class.
- Implemented specific display methods for each entry type (TOTP, SSH, SEED, PGP, Nostr, Key/Value, Managed Account, Password).
- Updated `src/seedpass/core/manager.py` to use `DisplayService`.
- Verified with existing tests `test_manager_retrieve_totp.py` and `test_manager_search_display.py`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 18:11:07 +00:00
google-labs-jules[bot]andPR0M3TH3AN 24fa2e8e1a Refactor initialize_managers in PasswordManager for better readability
Extracted logic from `initialize_managers` into helper methods:
- `_initialize_config_and_state`
- `_initialize_entry_manager`
- `_initialize_password_generator`
- `_initialize_nostr_client`
- `_handle_migration`

This improves code organization and maintainability without altering functionality. Verified with `test_vault_initialization.py`.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 18:11:05 +00:00
google-labs-jules[bot]andPR0M3TH3AN cf9d473abe perf: offload blocking import_vault operations to thread
Refactors `import_vault` endpoint in `src/seedpass/api.py` to use `asyncio.to_thread` for blocking file I/O and synchronous `PasswordManager.handle_import_database` calls.
Replaces synchronous `pm.sync_vault()` with `await pm.sync_vault_async()` (with fallback) to prevent blocking the event loop or triggering `asyncio.run` errors.

This change ensures the API remains responsive during large vault imports.
Verified with a custom benchmark script showing concurrent requests are no longer blocked.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 17:48:27 +00:00
google-labs-jules[bot]andPR0M3TH3AN 407dfee1a5 Add unit test for StatsManager.reset method
This commit adds a new test file `src/tests/test_stats_manager.py` to verify the functionality of the `StatsManager.reset` method. The test ensures that the `reset` method correctly resets the internal `_displayed` flag, allowing stats to be displayed again after a reset.

Testing:
- Added `test_stats_manager_reset` which mocks the manager and verifies `display_stats` calls before and after reset.
- Verified the test passes in isolation.
- Skipped full integration tests due to environment limitations, but the change is isolated to a new test file and does not modify production code.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 17:46:25 +00:00
google-labs-jules[bot]andPR0M3TH3AN 566988bdf9 test: verify atomic_write cleanup on failure
Added two new test cases to `src/tests/test_atomic_write.py`:
- `test_atomic_write_cleanup_on_failure`: Verifies that the temporary file is deleted if the write operation fails.
- `test_atomic_write_preserves_existing_on_failure`: Verifies that an existing destination file is preserved if the write operation fails.

These tests ensure the robustness of the `atomic_write` utility function.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 17:45:29 +00:00
thePR0M3TH3AN 67fd7a1063 Merge pull request #914 from PR0M3TH3AN/fix-legacy-empty-salt-8731732856332646806
🔒 Fix Weak Legacy Key Derivation (Empty Salt)
2026-02-26 12:26:30 -05:00
google-labs-jules[bot]andPR0M3TH3AN b5a321544b 🔒 fix: Weak Legacy Key Derivation (Empty Salt)
This commit addresses a security vulnerability where legacy Fernet keys
were derived using PBKDF2 with an empty salt (b"").

Changes:
- Modified `_derive_legacy_key_from_password` to accept an optional `salt`
  parameter.
- Updated `EncryptionManager.decrypt_legacy` to attempt decryption using
   a salt derived from the user's fingerprint (unique per user) before
  falling back to the empty salt for backward compatibility.
- Added a new test file `src/tests/test_legacy_salt_fix.py` to verify the
  new logic.

Rationale: Using a unique salt per user is standard practice to prevent
precomputed attacks. While legacy vaults cannot be retroactively
secured, this change ensures that any future legacy-style derivations
use a unique salt if possible, while maintaining access to existing
vaults.

Co-authored-by: PR0M3TH3AN <[email protected]>
2026-02-26 17:26:00 +00:00