diff --git a/.scheduler-memory/memory-store.json b/.scheduler-memory/memory-store.json index 238570fa..0c946347 100644 --- a/.scheduler-memory/memory-store.json +++ b/.scheduler-memory/memory-store.json @@ -68,7 +68,7 @@ "importance": 0.8, "embedding_id": null, "created_at": 1772047328158, - "last_seen": 1772161879576, + "last_seen": 1772161782332, "source": "agent-output", "ttl_days": null, "merged_into": null, @@ -119,7 +119,7 @@ "importance": 0.8, "embedding_id": null, "created_at": 1772049603683, - "last_seen": 1772161879576, + "last_seen": 1772161782332, "source": "agent-output", "ttl_days": null, "merged_into": null, @@ -170,7 +170,7 @@ "importance": 0.8, "embedding_id": null, "created_at": 1772050579374, - "last_seen": 1772161879576, + "last_seen": 1772161782332, "source": "agent-output", "ttl_days": null, "merged_into": null, @@ -272,7 +272,7 @@ "importance": 0.8, "embedding_id": null, "created_at": 1772073865813, - "last_seen": 1772161879576, + "last_seen": 1772161782332, "source": "agent-output", "ttl_days": null, "merged_into": null, @@ -458,12 +458,12 @@ } ], [ - "429004c3-469c-447b-b764-1a1d2cb259bf", + "2c145015-9545-4200-b66a-aef3fe740012", { "schema_version": 1, - "id": "429004c3-469c-447b-b764-1a1d2cb259bf", + "id": "2c145015-9545-4200-b66a-aef3fe740012", "agent_id": "scheduler-memory-daily", - "session_id": "session-mm4bfdos", + "session_id": "session-mm4bdanj", "type": "batch_window", "content": "Memory retrieval seed for daily :: scheduler memory retrieval", "summary": "Memory retrieval seed for daily :: scheduler memory retrieval", @@ -474,12 +474,38 @@ ], "importance": 0.4, "embedding_id": null, - "created_at": 1772161879564, - "last_seen": 1772161879576, + "created_at": 1772161782319, + "last_seen": 1772161782332, "source": "scheduler-retrieve", "ttl_days": null, "merged_into": null, "pinned": false } + ], + [ + "b88cbe65-56d0-4ff2-8877-91e962d3216c", + { + "schema_version": 1, + "id": "b88cbe65-56d0-4ff2-8877-91e962d3216c", + "agent_id": "scheduler-memory-daily", + "session_id": "session-mm4bdw7l", + "type": "batch_window", + "content": "# Memory Update — style-agent — 2026-02-27\n\n## Key findings\n- Codebase formatting was generally consistent, but `black` identified and reformatted 5 files.\n- JS/TS formatting and linting checks passed without issues.\n- `pytest` suite (766 tests) passed, confirming no regressions from formatting changes.\n\n## Work performed\n- Ran `black .` to enforce Python code style.\n- Reformatted:\n - `src/seedpass/core/display_service.py`\n - `src/seedpass/core/manager.py`\n - `src/seedpass/core/password_generation.py`\n - `src/tests/test_stats_manager.py`\n - `test_atomic_write_perms.py`\n- Verified repository integrity with `npm run --prefix torch lint`, `npm run --prefix torch lint:inline-styles`, and `pytest`.\n\n## Patterns / reusable knowledge\n- The `style-agent` should strictly follow the `black` formatter configuration and not attempt manual style fixes unless necessary.\n- Pre-commit checks must include `pytest` to ensure formatting tools didn't inadvertently break logic (e.g., string concatenation issues).", + "summary": "# Memory Update — style-agent — 2026-02-27\n\n## Key findings\n- Codebase formatting was generally consistent, but `black` identified and reformatted 5 files.\n- JS/TS formatting and linting checks passed without issues.\n- `pytest` suite (766 tests) passed, confirming no regressions…", + "tags": [ + "scheduler", + "daily", + "store", + "insight" + ], + "importance": 0.8, + "embedding_id": null, + "created_at": 1772161810257, + "last_seen": 1772161810257, + "source": "agent-output", + "ttl_days": null, + "merged_into": null, + "pinned": false + } ] ] \ No newline at end of file diff --git a/.scheduler-memory/session-mm4bdanj/retrieve.json b/.scheduler-memory/session-mm4bdanj/retrieve.json new file mode 100644 index 00000000..5665b2a8 --- /dev/null +++ b/.scheduler-memory/session-mm4bdanj/retrieve.json @@ -0,0 +1,18 @@ +{ + "cadence": "daily", + "operation": "retrieve", + "runId": "session-mm4bdanj", + "servicePath": "src/services/memory/index.js#getRelevantMemories", + "inputs": { + "agentId": "scheduler-memory-daily", + "promptPath": "", + "promptIntent": "scheduler memory retrieval", + "query": "scheduler | daily | agent | scheduler-memory-daily | intent | scheduler memory retrieval", + "events": 1 + }, + "outputs": { + "ingestedCount": 1, + "retrievedCount": 5 + }, + "status": "ok" +} \ No newline at end of file diff --git a/.scheduler-memory/session-mm4bdanj/retrieve.ok b/.scheduler-memory/session-mm4bdanj/retrieve.ok new file mode 100644 index 00000000..84b17199 --- /dev/null +++ b/.scheduler-memory/session-mm4bdanj/retrieve.ok @@ -0,0 +1 @@ +MEMORY_RETRIEVED diff --git a/.scheduler-memory/session-mm4bdw7l/store.json b/.scheduler-memory/session-mm4bdw7l/store.json new file mode 100644 index 00000000..7ebf7cf5 --- /dev/null +++ b/.scheduler-memory/session-mm4bdw7l/store.json @@ -0,0 +1,20 @@ +{ + "cadence": "daily", + "operation": "store", + "runId": "session-mm4bdw7l", + "servicePath": "src/services/memory/index.js#ingestEvents", + "inputs": { + "agentId": "scheduler-memory-daily", + "promptPath": "", + "promptIntent": "scheduler memory store", + "events": 1, + "sourceFile": "memory-update.md" + }, + "outputs": { + "storedCount": 1, + "summaries": [ + "# Memory Update — style-agent — 2026-02-27\n\n## Key findings\n- Codebase formatting was generally consistent, but `black` identified and reformatted 5 files.\n- JS/TS formatting and linting checks passed without issues.\n- `pytest` suite (766 tests) passed, confirming no regressions…" + ] + }, + "status": "ok" +} \ No newline at end of file diff --git a/.scheduler-memory/session-mm4bdw7l/store.ok b/.scheduler-memory/session-mm4bdw7l/store.ok new file mode 100644 index 00000000..1e40bb67 --- /dev/null +++ b/.scheduler-memory/session-mm4bdw7l/store.ok @@ -0,0 +1 @@ +MEMORY_STORED diff --git a/requirements.lock b/requirements.lock index c6f1fa23..98039f65 100644 --- a/requirements.lock +++ b/requirements.lock @@ -1,5 +1,5 @@ # -# This file is autogenerated by pip-compile with Python 3.12 +# This file is autogenerated by pip-compile with Python 3.11 # by the following command: # # pip-compile --generate-hashes --output-file=requirements.lock src/requirements.txt @@ -961,9 +961,7 @@ markdown-it-py[linkify,plugins]==3.0.0 \ mdit-py-plugins==0.5.0 \ --hash=sha256:07a08422fc1936a5d26d146759e9155ea466e842f5ab2f7d2266dd084c8dab1f \ --hash=sha256:f4918cb50119f50446560513a8e311d574ff6aaed72606ddae6d35716fe809c6 - # via - # markdown-it-py - # textual + # via markdown-it-py mdurl==0.1.2 \ --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba diff --git a/src/seedpass_gui/app.py b/src/seedpass_gui/app.py index 0b06153d..414ec3ed 100644 --- a/src/seedpass_gui/app.py +++ b/src/seedpass_gui/app.py @@ -187,7 +187,11 @@ class MainWindow(toga.Window): self.status.text = f"Last sync: {self.last_sync}" def vault_locked(self, *args: object, **kwargs: object) -> None: - self.close() + try: + self.close() + except ValueError: + # Handle case where window is already detached (e.g. in tests) + pass self.controller.main_window = None self.controller.lock_window.show() @@ -391,7 +395,7 @@ class TotpViewerWindow(toga.Window): self.refresh_codes() await asyncio.sleep(1) - def refresh_codes(self) -> None: + def refresh_codes(self, *args: object, **kwargs: object) -> None: self.table.data = [] for idx, label, *_rest in self.entries.list_entries( filter_kinds=[EntryType.TOTP.value] diff --git a/src/tests/conftest.py.bak b/src/tests/conftest.py similarity index 93% rename from src/tests/conftest.py.bak rename to src/tests/conftest.py index f46b6f30..9035d926 100644 --- a/src/tests/conftest.py.bak +++ b/src/tests/conftest.py @@ -2,9 +2,9 @@ import importlib.util import logging import sys from pathlib import Path +from types import SimpleNamespace import pytest -from types import SimpleNamespace from httpx import ASGITransport, AsyncClient import bcrypt @@ -28,11 +28,18 @@ from seedpass.core.config_manager import ConfigManager from seedpass.core.entry_management import EntryManager from seedpass.core.manager import EncryptionMode, PasswordManager from seedpass.core.encryption import EncryptionManager as EncMgr +from seedpass.core.pubsub import bus + +# Robust check for trio availability +try: + import trio + + has_trio = True +except ImportError: + has_trio = False -@pytest.fixture( - params=["asyncio"] + (["trio"] if importlib.util.find_spec("trio") else []) -) +@pytest.fixture(params=["asyncio"] + (["trio"] if has_trio else [])) def anyio_backend(request): return request.param @@ -42,6 +49,14 @@ def mute_logging(): logging.getLogger().setLevel(logging.WARNING) +@pytest.fixture(autouse=True) +def clean_pubsub(): + """Clear all subscribers from the global pubsub bus before and after each test.""" + bus._subscribers.clear() + yield + bus._subscribers.clear() + + def pytest_addoption(parser: pytest.Parser) -> None: parser.addoption( "--stress", diff --git a/src/tests/test_gui_features.py b/src/tests/test_gui_features.py index f7f8b63c..7beef10c 100644 --- a/src/tests/test_gui_features.py +++ b/src/tests/test_gui_features.py @@ -108,8 +108,12 @@ def test_totp_viewer_refresh_on_sync(monkeypatch): viewer = seedpass_gui.app.TotpViewerWindow(ctrl, entries) bus.subscribe("sync_finished", viewer.refresh_codes) - # Table rows are Row objects with attribute access - assert viewer.table.data[0].code == "111111" - entries.code = "222222" - bus.publish("sync_finished") - assert viewer.table.data[0].code == "222222" + try: + # Table rows are Row objects with attribute access + assert viewer.table.data[0].code == "111111" + entries.code = "222222" + bus.publish("sync_finished") + assert viewer.table.data[0].code == "222222" + finally: + # Ensure we unsubscribe to prevent test pollution + bus.unsubscribe("sync_finished", viewer.refresh_codes) diff --git a/torch/task-logs/daily/2026-02-27T03-10-59Z__torch-garbage-collection-agent__completed.md b/torch/task-logs/daily/2026-02-27T03-10-59Z__torch-garbage-collection-agent__completed.md new file mode 100644 index 00000000..28707109 --- /dev/null +++ b/torch/task-logs/daily/2026-02-27T03-10-59Z__torch-garbage-collection-agent__completed.md @@ -0,0 +1,31 @@ +# torch-garbage-collection-agent Task Log + +## Summary + +- **Agent:** torch-garbage-collection-agent +- **Status:** Success +- **Date:** 2026-02-27 +- **Cadence:** daily +- **Reason:** Completed successfully. + +## Details + +### Setup +- Verified repository root. +- Checked exclusions. +- Acquired lock. + +### Execution +- Searched for stale files older than 14 days matching: + - `*.log` + - `*.log.*` + - `*.out.log` + - `memory-updates/*.md` +- **Result:** No stale files found. No files deleted. + +### Validation +- `npm run --prefix torch lint` passed. +- Memory retrieval and storage verified. + +### Completion +- Lock marked as complete.