teknium1
34b4fe495e
fix: add title validation — sanitize, length limit, control char stripping
...
- Add SessionDB.sanitize_title() static method:
- Strips ASCII control chars (null, bell, ESC, etc.) except whitespace
- Strips problematic Unicode controls (zero-width, RTL override, BOM)
- Collapses whitespace runs, strips edges
- Normalizes empty/whitespace-only to None
- Enforces 100 char max length (raises ValueError)
- set_session_title() now calls sanitize_title() internally,
so all call sites (CLI, gateway, auto-lineage) are protected
- CLI /title handler sanitizes early to show correct feedback
- Gateway /title handler sanitizes early to show correct feedback
- 24 new tests: sanitize_title (17 cases covering control chars,
zero-width, RTL, BOM, emoji, CJK, length, integration),
gateway validation (too long, control chars, only-control-chars)
2026-03-08 15:54:51 -07:00
teknium1
4fdd6c0dac
fix: harden session title system + add /title to gateway
...
- Empty string titles normalized to None (prevents uncaught IntegrityError
when two sessions both get empty-string titles via the unique index)
- Escape SQL LIKE wildcards (%, _) in resolve_session_by_title and
get_next_title_in_lineage to prevent false matches on titles like
'test_project' matching 'testXproject #2 '
- Optimize list_sessions_rich from N+2 queries to a single query with
correlated subqueries (preview + last_active computed in SQL)
- Add /title slash command to gateway (Telegram, Discord, Slack, WhatsApp)
with set and show modes, uniqueness conflict handling
- Add /title to gateway /help text and _known_commands
- 12 new tests: empty string normalization, multi-empty-title safety,
SQL wildcard edge cases, gateway /title set/show/conflict/cross-platform
2026-03-08 15:48:09 -07:00
teknium1
60b6abefd9
feat: session naming with unique titles, auto-lineage, rich listing, resume by name
...
- Schema v4: unique title index, migration from v2/v3
- set/get/resolve session titles with uniqueness enforcement
- Auto-lineage: context compression auto-numbers titles (Task -> Task #2 -> Task #3 )
- resolve_session_by_title: auto-latest finds most recent continuation
- list_sessions_rich: preview (first 60 chars) + last_active timestamp
- CLI: -c accepts optional name arg (hermes -c 'my project')
- CLI: /title command with deferred mode (set before session exists)
- CLI: sessions list shows Title, Preview, Last Active, ID
- 27 new tests (1844 total passing)
2026-03-08 15:20:29 -07:00
teknium1
a44e041acf
test: strengthen assertions across 7 test files (batch 1)
...
Replaced weak 'is not None' / '> 0' / 'len >= 1' assertions with
concrete value checks across the most flagged test files:
gateway/test_pairing.py (11 weak → 0):
- Code assertions verify isinstance + len == CODE_LENGTH
- Approval results verify dict structure + specific user_id/user_name
- Added code2 != code1 check in rate_limit_expires
test_hermes_state.py (6 weak → 0):
- ended_at verified as float timestamp
- Search result counts exact (== 2, not >= 1)
- Context verified as non-empty list
- Export verified as dict, session ID verified
test_cli_init.py (4 weak → 0):
- max_turns asserts exact value (60)
- model asserts string with provider/name format
gateway/test_hooks.py (2 zero-assert tests → fixed):
- test_no_handlers_for_event: verifies no handler registered
- test_handler_error_does_not_propagate: verifies handler count + return
gateway/test_platform_base.py (9 weak image tests → fixed):
- extract_images tests now verify actual URL and alt_text
- truncate_message verifies content preservation after splitting
cron/test_scheduler.py (1 weak → 0):
- resolve_origin verifies dict equality, not just existence
cron/test_jobs.py (2 weak → 0 + 4 new tests):
- Schedule parsing verifies ISO timestamp type
- Cron expression verifies result is valid datetime string
- NEW: 4 tests for update_job() (was completely untested)
2026-03-05 18:39:37 -08:00
0xbyt4
0ac3af8776
test: add unit tests for 8 untested modules
...
Add comprehensive test coverage for:
- cron/jobs.py: schedule parsing, job CRUD, due-job detection (34 tests)
- tools/memory_tool.py: security scanning, MemoryStore ops, dispatcher (32 tests)
- toolsets.py: resolution, validation, composition, cycle detection (19 tests)
- tools/file_operations.py: write deny list, result dataclasses, helpers (37 tests)
- agent/prompt_builder.py: context scanning, truncation, skills index (24 tests)
- agent/model_metadata.py: token estimation, context lengths (16 tests)
- hermes_state.py: SessionDB SQLite CRUD, FTS5 search, export, prune (28 tests)
Total: 210 new tests, all passing (380 total suite).
2026-02-26 13:27:58 +03:00