Skip to content

chore(release): merge Dev_new_gui into main#4987

Merged
mrveiss merged 488 commits intomainfrom
Dev_new_gui
Apr 17, 2026
Merged

chore(release): merge Dev_new_gui into main#4987
mrveiss merged 488 commits intomainfrom
Dev_new_gui

Conversation

@mrveiss
Copy link
Copy Markdown
Owner

@mrveiss mrveiss commented Apr 17, 2026

Summary

  • Promotes all 486 commits from Dev_new_gui into main
  • Clears CodeQL / security scan backlog accumulated since last release merge
  • Includes all recent batch implementations, bug fixes, UI improvements, and dependency updates

What's included (recent highlights)

🤖 Generated with Claude Code

mrveiss and others added 30 commits April 15, 2026 20:04
…warning for missing paths (#4695)

After parsing each collection, warn (do not raise) for any declared path
that does not exist relative to the repo root.  Adds repo_root param to
load_synthesis_schema() (defaults to __file__-relative root) and threads
it through _parse_collection().  Adds 3 tests: existing path → no warning,
missing path → warning, mixed list → one warning per missing path.
fix(tools): replace hardcoded _BUILTIN_TOOL_SCHEMAS with imported constants (#4561)
fix(rag): wire expanded_queries into _retrieve_hybrid_results (#4685)
…stale paths (#4689)

Add `_filter_stale_chunks()` to RAGService: after each ChromaDB retrieval,
load the DocIndexer hash cache and drop any chunks whose source_path is
absent (file removed/moved since last index run).  Logs a WARNING with the
stale path list.  Graceful fallback: if the cache file is missing, empty,
or unreadable the full result list is returned unchanged so RAG is never
disrupted.  Called from `advanced_search()` after `_execute_and_cache_search`.

6 unit tests cover: valid chunk passes through, stale chunk filtered,
warning logged, cache unavailable → no filter, empty cache → no filter,
missing cache file → no filter.
fix(rag): wire advanced_search_with_refinement into RAGService (#4696)
… runs (#4655)

get_doc_indexer_service() now lazily resolves the process-level LLMService
singleton when no llm_service is supplied, ensuring DocIndexerService is
never created with _llm_service=None and _run_kb_synthesis() can call the
LLM without an AttributeError.  Three new tests cover the lazy-resolution
path, explicit-injection path, and the _run_kb_synthesis → synthesize_docs
call chain.
…ice (#4686)

NeuralMeshRetriever requires 7+ injected dependencies (PPR, EdgeLearner,
mesh_db, etc.) that don't exist in any production startup path. Remove
_mesh_retriever field, _run_mesh_retriever() method, the guard block in
advanced_search(), and mesh_retriever_enabled from RAGConfig.to_dict().
NeuralMeshRetriever class itself is retained — it has its own tests.
fix(knowledge): pass llm_service to DocIndexerService so KB synthesis runs (#4655)
fix(rag): validate source paths on retrieved chunks — filter stale paths (#4689)
fix(knowledge): validate synthesis_schema source paths on load — warn on missing (#4695)
fix(rag): remove dead NeuralMeshRetriever injection gate from RAGService (#4686)
…4697)

Add TestRealKBBenchmarks class to rag_benchmarks.py that seeds a real
ChromaDB EphemeralClient with 40 domain-relevant documents across 4 topics
(Python, database, networking, ML/RAG) and runs precision@k assertions using
deterministic term-frequency embeddings.  No external services required.
Also register the real_kb pytest marker and make the benchmark_base import
non-fatal so TestRealKBBenchmarks can be collected independently.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…vice config (#4661)

Add AUTOBOT_CHAT_ENDPOINT, AUTOBOT_RAG_ENDPOINT, and AUTOBOT_CLASSIFICATION_ENDPOINT
to ai-stack.env.j2 template and corresponding defaults in defaults/main.yml pointing
to the Ollama host/port. These vars are required by get_agent_endpoint_explicit() in
ssot_config.py — without them all three core agents fail to initialize on startup.
…ns (#4664)

Enhance _create_permissive_ssl_context() with a 4-level trust hierarchy:
1. AUTOBOT_TLS_CA_PATH env var — load explicit CA cert (production mTLS)
2. AUTOBOT_SKIP_TLS_VERIFY=true — disable verification (dev/test only)
3. AutoBot project CA fallback (certs/ca/ca-cert.pem) — covers single-host
   installs where the SLM uses an AutoBot-issued self-signed cert
4. System trust store — default Python SSL behaviour

Add slm_client_test.py with 11 tests covering SSL trust hierarchy and
exponential backoff in the WebSocket reconnect loop.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(deployment): add missing AUTOBOT_*_ENDPOINT env vars to ai-stack template (#4661)
fix(backend): trust self-signed CA cert for internal WebSocket connections (#4664)
…le paths were returned on fallback path (#4721)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…_costs, get_all_agent_costs, _fetch_model_costs (#4443)

Eliminates O(N) blocking KEYS command across three cost-tracking methods;
adds 5 async unit tests verifying scan_iter is called and daily sub-keys
are correctly filtered.
…am — was patching non-existent get_redis_client (#4720)
fix(testing): patch get_async_redis_client in TestStoreFeedbackInStream (#4720)
fix(rag): call _filter_stale_chunks() in _fallback_basic_search — stale paths on fallback path (#4721)
fix(usage): replace redis.keys() with async scan_iter in cost tracker — eliminates O(N) block (#4443)
#4729)

Add CAUSAL_ANALYSIS to ThinkCategory enum and think_causally() convenience
function to agent_loop/think_tool.py; fix _extract_root_cause to prefer
conclusion over reasoning for root cause extraction; mark integration test
xfail where llama_index optional dep is absent.
…circular import (#4557)

Circular import chain: chat_workflow.__init__ → manager → tool_handler
→ tools (code_interpreter) → tools.__init__ → tool_registry →
chat_workflow.tool_handler (partially initialized, ImportError).

Fix: remove the module-level `from chat_workflow.tool_handler import
BROWSER_TOOL_NAMES` in tool_registry.py and move it inside
get_available_tools() as a lazy import. This breaks the cycle while
preserving the single-source-of-truth semantics documented in #2609.

Result: 262 chat_workflow unit tests now collect and pass.
…r._synthesize_cluster (#4656)

KBSynthesizer never called log_run after synthesis, so GET /knowledge/synthesis/log
always returned empty for KB runs. Injects SynthesisProvenanceLog at __init__ (same
pattern as KnowledgeSynthesizer) and calls log_run after _index_documents succeeds.
Adds two tests: log_run called on success, not called on LLM error.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…_schema.yaml (#4688)

- CollectionConfig gains optional synthesis_model field (None by default)
- _ALLOWED_KEYS updated; _parse_collection validates non-empty string when present
- KBSynthesizer._synthesize_cluster passes model= kwarg to llm.chat() when override is set
- synthesis_schema.yaml documents the field via a commented example
- 8 new unit tests: loader validation (omit/parse/empty/whitespace/mixed) + synthesizer model routing (override/no-override/no-config)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(testing): lazy-load BROWSER_TOOL_NAMES import in tool_registry — breaks circular import (#4557)
fix(testing): add think_causally + ThinkCategory.CAUSAL_ANALYSIS — fix broken test_causal_reasoning.py (#4729)
fix(testing): add missing sys.modules stubs for autobot_shared sub-modules in test_property_graph.py (#4730)
mrveiss and others added 29 commits April 17, 2026 09:13
feat(kb): DocIndexerService.search() merges autobot_docs into RAGService (#4953)
… variable in sys.path.append (#4945)

Replace literal '${AUTOBOT_PROJECT_ROOT:-/opt/autobot/code_source}' strings (which Python never expands) with
os.environ.get("AUTOBOT_PROJECT_ROOT", "/opt/autobot/code_source") across 30 files. Add missing import os
where needed.
…itter is counted as failed not skipped (#4938)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…eeded after #4924 (#4936)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…_normalize_dow_field (#4944)

Add range-step pattern r'(\d+)-(\d+)/(\d+)' to _replace_token so that
tokens like '1-7/2' are rewritten to '1-6/2,0' instead of falling
through to the scalar branch unchanged. Add 4 tests covering
'1-7/2', '5-7/2', '0-7/2', and end-to-end firing on Sunday.
…ard is effective (#4937)

Set self._running = True at the start of run_once() and reset it to
False in a finally block, so the get_loop_orchestrator() singleton guard
added in #4917 correctly prevents replacing an in-flight orchestrator.
Add 5 tests covering _running lifecycle and singleton guard behavior.
fix(infrastructure): use os.environ.get() instead of unexpanded shell variable in sys.path (#4945)
fix(mesh): store community_cluster_task on app.state and cancel on shutdown (#4946)
fix(knowledge): propagate dep_error so missing tree-sitter counts as failed not skipped (#4938)
fix(mesh): correct graspologic ImportError log message — no restart needed after #4924 (#4936)
fix(scheduler): normalize day-7 in range-step tokens like '1-7/2' in _normalize_dow_field (#4944)
fix(knowledge): set _running=True during loop execution so re-init guard is effective (#4937)
fix(rag): guard metadata None and clamp hybrid_score to [0,1] in _deduplicate_and_rank (#4939 #4943)
…for frontend dialog (#4959)

RedisEventStreamManager (agent_loop) and LiveEventManager (WebSocket/frontend) are
two disconnected event buses. After publishing APPROVAL_REQUIRED to the Redis bus,
also call publish_live_event("global", "tool_approval_required", ...) so the
WebSocket layer receives the event and the frontend approval dialog fires.
)

Show remaining seconds and a shrinking progress bar in the agent-loop
tool approval dialog, counting down from timeout_seconds to 0.
Bar turns red at ≤10 s; interval is cleared on approve/deny/unmount.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…r TS7016 compatibility (#4534)

- Add ManPageManager.vue.d.ts stub matching SystemKnowledgeManager pattern
- Add ManPageManager export to manpage/index.ts barrel
- Create ui/index.ts barrel exporting all ui components
- CommandPermissionDialog and TerminalWindow already had .vue.d.ts stubs
- vue-tsc reports no TS7016 errors and no new errors introduced (1939 baseline maintained)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
fix(agent_loop): bridge APPROVAL_REQUIRED events to LiveEventManager for frontend dialog (#4959)
feat(agent_terminal): add countdown timer to tool approval dialog (#4960)
refactor(frontend): add TypeScript stubs for Options API Vue components (#4534)
…ostSelectionDialog (#4806)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Adds autobot-frontend/scripts/check-i18n-keys.mjs that statically
extracts all $t() and t() calls from .vue/.ts source files, resolves
them against src/i18n/locales/en.json, and exits 1 if any keys are
absent. Wired as `npm run check:i18n` in package.json and added as a
CI step in both .github/workflows/ci.yml and frontend-test.yml so
missing translations are caught on every push/PR.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…4676)

Add publish_feedback_events() evaluator adapter to rag_benchmarks.py that
publishes synthetic rag:feedback:__global__:{date} Redis stream entries from
precision@k benchmark results, plus run_benchmark_suite() to execute the
benchmark against an ephemeral ChromaDB collection. Add POST /rag/benchmark/run
endpoint in knowledge_rag.py so the suite can be triggered manually or via
scheduler. RetrievalLearner.consume_feedback_stream() picks up these events
unchanged (no schema modifications). Five new unit tests cover the full
benchmark → feedback → pattern-distillation round-trip.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
feat(rag): wire rag_benchmarks into RetrievalLearner feedback loop (#4676)
fix(ui): add ARIA roles, labels and focus management to BaseModal, DataTable, HostSelectionDialog (#4806)
feat(i18n): add CI check script for missing i18n keys (#4826)
Brings main up to date with Dev_new_gui. Resolves 31 conflicts by taking
Dev_new_gui as authoritative (confirmed #4571 content already present in
Dev_new_gui before merge).

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
api/user_management module existed but was never registered — endpoints
were unreachable. Ported registration from main (#4571) that bypassed
Dev_new_gui.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@mrveiss mrveiss merged commit e2fad76 into main Apr 17, 2026
1 of 8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant