Rank every query, unite the top notes into one context under a per-document
and a total budget, expand context choices over paragraph or document ids
plus NONE, add the covered gate, judge context choices alone and the rest
batched, attach the answering paragraphs' text. A missing TypeSafe key is a
call-time error shown in status, not a startup failure.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
IJudge over TypeSafe's System One API: serialises noul/choice/score
questions and the caller's state, retries 429/529 with Retry-After or
backoff to 30s, rejects Choice past the 255-option cap before sending,
and skips the request entirely for an empty question set.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
The fact sink was a second adapter over the same backend. INoteStore
gains CreateAsync (DocumentExistsException on a taken path); the raw
note's shape, slug and collision numbering live in DepositFactUseCase;
GiteaRepository only moves text.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Two classes over the same backend showed as two adapters on the status
page. One GiteaRepository, one HttpClient, one health entry; the host
lists an adapter once even when it serves several ports.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
A long sync over one keep-alive connection to Gitea behind Traefik saw a
TLS connection reset after ~1000 documents and aborted the whole run.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
INoteStore reads the vault straight from Gitea (branch HEAD, a paged
recursive tree listing, raw file reads); IFactSink appends a new raw/
file via the contents API, numbering around any path collision. Both
verified against the live gitea.renner.uno API for response shape
rather than the swagger doc.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
FileVectorIndex persists one binary file per model under index/ with
atomic tmp+rename writes; FileDocumentCatalog persists a single
catalog.json, rebuilding the link graph via WikiLinks.Extract on every
upsert. Both start empty and report health Ok with a reset detail if
their file on disk is corrupt, rather than crashing.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Batches requests (default size 2, matching llama-server's limits for long
notes), sorts responses by index, and normalises vectors to unit length.
CheckAsync prefers GET /health, falling back to a one-word embed call when
the server doesn't expose it. Registers as a keyed IEmbeddingModel so
multiple models can be wired up under different names.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>