Conversation
|
Important Review skippedDraft detected. Please check the settings in the CodeRabbit UI or the ⚙️ Run configurationConfiguration used: Organization UI Review profile: ASSERTIVE Plan: Pro Run ID: You can disable this status message by setting the Use the checkbox below for a quick retry:
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
There was a problem hiding this comment.
Code Review
This pull request introduces several correctness fixes, quick wins, and the major 'F4' feature enabling bulk Library export via chatbook zip archives. Key improvements include serializing the chatbook registry read-write operations with a thread lock to prevent concurrency races, fixing Home Retry scoping, and adding a robust, truncation-proof export pipeline for media, conversations, and notes. It also addresses PR 596 review findings by containing ingest pool worker exits, making launchers spawn-lightweight, securing plain-text FTS boundaries (ADR-013), and pruning legacy notes CSS. I have no feedback to provide as there are no review comments to assess.
Important
The consumer version of Gemini Code Assist on GitHub is being sunset. Starting June 18, 2026, new organization installations will be blocked, and all code review activity will officially cease on July 17, 2026.
For more details on the timeline and next steps, please review the Help Documentation.
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ❌ 29 tests failed ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
❌ UI Tests
Failed Tests:
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ❌ 33 tests failed ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
❌ UI Tests
Failed Tests:
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ❌ 29 tests failed ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
❌ UI Tests
Failed Tests:
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ❌ 26 tests failed ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
❌ UI Tests
Failed Tests:
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ❌ 24 tests failed ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
❌ UI Tests
Failed Tests:
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
Test Results SummaryOverall Summary
Status: ✅ All tests passed! ✅ Unit Tests macos - latest - 3.11
✅ Unit Tests ubuntu - latest - 3.12
✅ Unit Tests windows - latest - 3.11
✅ Unit Tests macos - latest - 3.13
✅ Unit Tests macos - latest - 3.12
✅ Unit Tests ubuntu - latest - 3.13
✅ Unit Tests windows - latest - 3.12
✅ Integration Tests 3.11
✅ Unit Tests ubuntu - latest - 3.11
✅ Integration Tests 3.12
|
…iles + markup-safe Versions names (final review) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…/O workers (pre-merge review) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Adds LibrarySkillsListCanvas (structural copy of the prompts canvas's list
view) plus screen wiring: renders both available_skills (trusted, ✓) and
blocked_skills (needs-review, ⚠) from Task 1's get_context snapshot payload
via Task 2's build_skills_list_state, wired into compose_content's
canvas_kind == "skills" branch with sort (name/status)/filter/row-press
handlers.
Unlike the prompts list (name+secondary packed into one Button label), each
skill row's Button label is just "{glyph} {name}"; the flags/description
line renders as a separate secondary Static right below it, per the brief's
interface. Blocked rows carry an additional library-skill-row-blocked class
(dim, still selectable -- the trust panel needs them visible) and remain
pressable like any other row.
handle_library_skill_row is recording-only for now (mirrors
handle_library_prompt_row's original, pre-editor shape): the in-canvas
skill detail/trust editor is a later task's work, so this just stores the
selected name.
Updated test_library_shell_skills_rail_row_shows_exact_count (stale since
Task 1, when no Skills canvas existed yet) to assert the new canvas renders
populated rows instead of the old empty-canvas landing fallback.
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…spector/stats refresh, docstrings Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…/delete Task 4 of the Skills sub-project: wires the in-canvas SKILL.md detail/trust editor onto Task 2's pure editor state and Task 3's list canvas. - handle_library_skill_row now opens the editor (was recording-only); create/update/delete route through skills_scope_service (mode="local"), with update/delete's expected_version producing a real version-conflict banner (Reload-only, per the brief's narrower scope vs. the prompts editor's Overwrite+Reload). - Save's response is already a full skill detail, so a successful save rebuilds editor state from that response directly -- no second round-trip, and no special-casing needed for save-marks-needs-review (the write never passes trust_approved=True, so a previously-trusted skill's response already comes back quarantined_modified). - Trust panel (Unlock / Review changes / Approve) reuses the shipped SkillTrustPassphraseModal and mirrors skills_screen.py's _call_skill_trust_service/_request_skill_trust_passphrase pattern verbatim -- SkillTrustService has no policy_enforcer at all, same as that screen. - user_invocable/disable_model_invocation render as toggle Buttons and context as a cycling Button, not Checkbox/Switch/Select -- matches this canvas family's own documented render-safety discipline (library_notes_canvas.py: Select/Switch don't render reliably here). - Policy ids skills.detail/create/update/delete.local were already registered (server_skills capability's CRUD_ACTIONS) -- confirmed via a real ServicePolicyEnforcer regression test, no #620-style gap. - CSS: field/body/status/warnings/trust-panel styling dual-pinned against the prompt editor's own blocks; bundle regenerated. Tests: Tests/Skills/test_skills_library_flow.py (new, real LocalSkillsService/SkillsScopeService/SkillTrustService, 7/7 -- all six brief scenarios + the real-enforcer test); Tests/UI/test_library_skills_canvas.py extended (32/32, replaced the Task-3 recording-only unit test with two tests matching the new async open+dirty-veto contract); Tests/UI/test_library_shell.py full suite green (257/257). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ing (review Critical) _save_library_skill baked the live Name-input value into the frontmatter but always wrote under the original directory name (update_skill has no rename primitive), so the service marked the persisted record validation_status: "invalid" while the editor still reported "Saved." -- silently corrupting the skill. Disable the Name Input for existing skills (with a dim hint) and, belt and braces, force the persisted frontmatter name to stay pinned to the skill's own directory name on the update path regardless of what the input reports. Also unify the post-save stale-race guard with _save_library_prompt's pattern so it applies uniformly to the (still entry-point-less) create branch too. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ry alias Library skills canvas: Import row (path Input SKILL.md file OR a skill's own directory, Browse/Import/Cancel) that always imports ONE skill per press via skills_scope_service.import_skill/import_skill_file with trust_approved=False. Uses import_skill(name=<directory name>, ...) whenever the path is a SKILL.md file or its parent directory, rather than letting import_skill_file derive the name from the filename -- every real skill package (e.g. superpowers) names every SKILL.md file identically, so filename-derivation would produce "skill" for every import regardless of which skill it actually is. Flat sibling files thread through as supporting_files; nested subfolders are skipped (schemas' supporting-file name pattern has no path-separator support). Retires the standalone Skills master-shell destination, mirroring the notes/prompts precedent: screen_registry's "skills" ScreenRoute is replaced with an alias to library; shell_destinations' standalone ShellDestination is folded into library's legacy_routes; app.py gained a _LEGACY_ROUTE_LIBRARY_NAV_CONTEXT entry (no dedicated re-entry action exists, same as "prompts"). skills_screen.py/SkillsScreen are NOT deleted -- Tests/UI/test_destination_shells.py constructs SkillsScreen directly via its own harness, independent of screen_registry, and its trust passphrase modal is still reused by the Library skill editor. Tests/Skills/test_skills_import.py imports real SKILL.md files copied from the obra/superpowers skillset (Tests/fixtures/superpowers_skills/, provenance in its README) through the actual Library Import row. Findings: the real skillset uses only name+description frontmatter (no extra fields at all); unrecognized frontmatter fields are silently dropped, not rejected; nested reference subfolders aren't importable as supporting files; name-too-long/oversized-content fail cleanly with no partial write. Full findings in .superpowers/sdd/task-5-report.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Added missing CSS rules for #library-skills-import-path, #library-skills-import-path:focus, and #library-skills-import-status to match the corresponding prompts import row styling. Regenerated the bundled stylesheet. Extended test_library_skills_canvas.py with test_library_skills_import_row_css_blocks_match_prompt_parity() to pin both source and bundle CSS blocks, preventing regression of the naked-unstyled import row. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… review findings into audit doc The RAG audit batch (PR #610) and the Library-Prompts batch merged with colliding task IDs 196-203; the Prompts program is in flight, so the RAG batch takes fresh IDs 246-256 (dependencies and doc references updated, renumber note added to the doc). Also addresses the PR #610 review follow-through: removes the duplicated Acceptance Criteria heading that the committed suggestion introduced in the indexing task, and extends the audit's dead-surface inventory with the verified companion defect - chat_rag_integration's modular layer is broken in both directions (search() called with kwargs RAGService.search does not accept -> TypeError; index path calls non-existent embed_documents -> AttributeError). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…der evidence (user decision)
…attach Roleplay P1f: character-level dictionary attachment
…age placeholder, escaped save toasts TASK-223: submit_draft's gate makes ONE capability decision — vision_block_reason gains an optional is_capable predicate and the controller injects its documented module seam, removing the pre-check-then-recheck divergence where the two seams could disagree (divergence probe: old shape let the send through, new shape blocks). TASK-224: image-only user turns whose images all fall outside the budget (over-cap or non-vision) now emit '[image omitted]' / '[N images omitted]' instead of vanishing from provider payloads; captioned messages keep their text fallback. TASK-225: both Save Image toasts escape the interpolated path (markup-like dirs render literally). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix(console): attachment riders — vision-gate dedup, omitted-image placeholder, escaped save toasts (TASK-223/224/225)
…surements, and fix backlog (tasks 246-262) Five parallel read-only audits (render/refresh, timers/workers, DB patterns, startup/imports, non-Console screens) against dev 006345b. Headliners, all measured: the Console 0.2s streaming tick runs sqlite queries + unconditional recomposes on the event loop (11-70ms/tick); Library has 124 whole-screen recomposes while its targeted sync_state methods have zero callers; ~1.3s of the ~2s cold start is import-time work for unused features; a commented-out DB log guard stringifies every query's params (14ms per 3MB image insert). Audit doc maps every finding to a task with severity, fix shape, and risk; verified-fine patterns documented so they aren't 'fixed'. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
fix(backlog): renumber RAG audit tasks to 246-256 + PR #610 review follow-through
…ead caveat, FTS semantics note, path convention Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
docs(perf): performance & snappiness audit — findings + fix backlog (tasks 246-262)
…_ERROR, not silent empty done (PR #648 review Minor 1)
…orted tool-call batches, synthesized ids for id-less calls, honest stream annotations
…46-262 in parallel)
feat(agents): native provider tool-calls with fence-protocol fallback (task-243)
…el (gemma-4-26B-A4B)
docs(qa): native tool-calls live gate completed — A/B/C PASS on rerun (task-243)
…246) execute_query built an f-string with str(params) on every single call regardless of log level, including raw image/document BLOBs (up to 14ms per 3MB param). loguru has no isEnabledFor(), so the previously-commented guard couldn't just be restored; instead add a shared DB/sql_logging.py preview_params() helper (bytes -> length-only, strings truncated, whole preview capped) and route all four sites through logger.opt(lazy=True) so nothing is built unless a sink actually admits DEBUG. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…TASK-247) app.py already calls save_state() explicitly and stores the result before switching screens away from Console. ChatScreen.on_screen_suspend called save_state() a second time and discarded the result -- Textual dispatches its own private _on_screen_suspend independently of a public override, so deleting the override loses nothing but the redundant O(sessions x messages) serialization on every tab switch. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…(TASK-248) psutil.Process.cpu_percent(interval=0.1) sleeps the calling thread 100ms to sample a fresh window. On PerformanceMetricsWidget's sync 2s timer callback -- Textual's single-threaded event loop -- that's a guaranteed 100ms UI freeze every tick while Embeddings Management is open. Switch to interval=None (compares against the last sample) at the live call site plus two latent copies with no current callers (metrics_logger.py, RAG_Search health_check.py), caching the Process handle in metrics_logger.py so repeated calls still get accurate deltas. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…K-249) search_conversations_page matched message content via a correlated EXISTS(... m.content LIKE '%q%') scan -- a per-candidate table scan with an index-hostile leading wildcard, measured 1.4->7.8ms per scope with an active query. Join messages_fts instead, following the same shape already used correctly by search_messages_by_content. User queries are wrapped as quoted FTS5 prefix expressions (embedded quotes doubled, trailing *) so FTS5-syntax-hazard input (bare quotes/asterisks/hyphens/boolean words) never raises; title and id= matching are unchanged. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ction (TASK-250) _import_conversations let every add_conversation/add_message/ set_message_attachments call commit its own top-level transaction -- ~1,500 commits for a 50x30 import. TransactionContextManager is depth-tracked/reentrant, so wrapping each conversation's writes (not the whole chatbook, to preserve per-conversation error isolation) in one outer with db.transaction() collapses that to one commit per conversation. A failure partway through a conversation's messages now rolls back that whole conversation instead of leaving a partially imported one behind -- an isolation improvement, not a behavior change, since the caller already counted that case as failed. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… success accounting, staged attachment I/O, idiomatic FTS MATCH, docstring Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s in correlated EXISTS Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
perf: P0 quick wins — DB log stringify, duplicate save_state, loop-blocking cpu_percent, FTS search, import transactions (TASK-246..250)
Summary by cubic
Adds bulk Library export to chatbook zips with live per‑phase progress, Cancel, and safe “zip first, then register” ordering. Also ships Console native attachments (files/images with vision gating and Save Image), multi‑select row export, faster startup by lazy‑loading heavy deps, local server auto‑detect + one‑click connect, safer search, Library conversations that include Console chats, URL/web ingest for articles and media, many stability fixes, and the first Agent Runtime engine (no UI) with persistence and tests.
New Features
scope_type='all') and uses “saved chat” wording.Chat/provider_catalog.llama.cpp/Ollama, populate models from/v1/models, and one‑click connect with sanitized, escaped model ids (strict localhost‑only detection; only counts valid JSON model lists).httpx+trafilaturaextractor (canonical URL, boilerplate strip, 10 MB streaming guard), and media URLs route to existing transcription processors; precise permanent vs retryable URL errors; ingests preserve theweb_article/url_downloadmarker.fts_match_query); quiet “no sources” RAG gate; spawn‑safe launchers (python -m tldw_chatbook,tldw-cli); heavy stacks (torch/transformers/numpyandnltk/scipy/sklearn/pandas) load on first use with regression tests.ToolCatalogRegistry(builtin calculator/datetime + find/load/spawn),AgentRunsDBpersistence, andAgentServicewiring; covered by new unit tests.Bug Fixes
detected_typeon requeue; contain abrupt worker death; fix PDF analysis call, OCRNameError, and PDF error truthiness; add doc‑processing fallback whendoclingis unavailable; save‑path bootstraps stay spawn‑safe; web ingest adds streaming body size guard, canonical‑URL validation, and clear permanent URL error classes.Written for commit 844b272. Summary will update on new commits.