feat: add local agent MCP tools and optional source-grounded AI answers
Core CI / core (ubuntu-latest) (push) Failing after 3m6s
Core CI / core (macos-latest) (push) Canceled after 0s
Core CI / core (windows-latest) (push) Canceled after 0s
Core CI / desktop (ubuntu-latest) (push) Successful in 5m41s
Core CI / desktop (macos-latest) (push) Canceled after 0s
Core CI / desktop (windows-latest) (push) Canceled after 0s

This commit is contained in:
karl committed 2026-10-12 20:28:38 +02:00
1 parent 70746ef428
commit f5b03c6fb0
27 files changed
+2988 -13

No files matched your search

+44
View File
@@ -0,0 +1,44 @@
# Optional source-grounded AI
This GUI-free crate sends a bounded explicit request to a user-configured
OpenAI-compatible Chat Completions endpoint. It is independent of search and
contains no default provider, endpoint, model, implicit setup call or download.
Validating configuration and constructing a client do not contact the endpoint.
`AiConfig {base_url, model, api_key}` accepts an explicit HTTP(S) base such as
`http://127.0.0.1:1234/v1`; `/chat/completions` is appended. URL credentials,
queries and fragments are rejected. Credentials are optional, header-only,
marked sensitive, and redacted by configuration Debug. Redirects and ambient
proxies are disabled. Reqwest with rustls provides portable maintained HTTP/TLS.
Errors contain static descriptions/status codes, never raw URLs, provider error
bodies, credentials or selected text. The crate performs no logging.
`AiClient::generate(&AiRequest)` is the sole network operation. Callers must
require explicit enablement and a user action, validate that sources belong to
the current index, and obtain consent before sending excerpts to the configured
endpoint. Desktop code should use a blocking worker; background searches must
never depend on this client. Session credential storage is a caller concern.
Requests contain `AiMode::Summary` or `Question`, an optional question, and
1–8 `AiSource` records with short unique IDs, title, text and optional location.
Bounds: 16 KiB per source, 32 KiB total selected text, 2 KiB question, 96 KiB
encoded HTTP payload, 64 KiB response and 16 KiB answer. Request timeout is
45 seconds including response consumption, with a five-second connect limit.
There is no automatic retry or silent truncation.
Sources are explicitly untrusted data in the system instruction; source commands
cannot authorize tools or application actions. The only Chat Completions fields
sent are model and messages, for broad provider compatibility. The model must
return a JSON answer/citations object inside `choices[0].message.content`.
Returned IDs must exist, citations must appear inline as `[id]`, and the inline
ID set must match the citation array. Unknown or inconsistent IDs are rejected.
A no-citation answer remains an **uncited draft**; citation validation does not
prove factual grounding or neutralize all model prompt injection. Callers must
label output accordingly and retain the original source for verification.
Local HTTP tests inspect actual endpoint path/messages/header-only credential,
untrusted source boundaries, offline validation, pre-network input limits,
malformed/unknown/mismatched citations, keyless local endpoints, actual timeout,
response cap and error redaction. They use no real provider credentials, cloud
endpoints, GPU inference or simulated production model output. Real-provider
behavior and Linux/macOS execution remain untested release checks.