- Derived the mandatory low, high, and max ladder for Kimi K3 across OpenAI-compatible routes.
- Mapped generic requested tiers onto K3 wire values and defaulted the model to max.
- Added request-level regression coverage for LiteLLM-compatible models.
Fixes#5983
- getDeviceId threw ENOENT when ~/.omp/agent was missing (fresh installs, CI runners), and getKimiCommonHeaders propagated it into fetchUsage's catch, silently nulling every kimi-code usage report.
- Now creates the parent directory and falls back to a per-process ephemeral id when persistence fails; unreadable device-id files regenerate instead of throwing.
- Enable `moonshot-mfjs` tool schema flavor for Kimi-family ids on any host, not just native endpoints, since proxies forward schemas verbatim to Moonshot's validator.
The Kimi Code usages endpoint returns resetTime on each limit's detail
object, while window carries only duration/timeUnit. buildWindow() only
reads window fields, so the 5h row parsed to a window with durationMs but
no resetsAt — and omp usage renders "resets in …" only when
window.resetsAt is set. The Total quota row worked because toUsageLimit
falls back to row.resetsAt when no window exists, but the row.window ??
short-circuit bypassed that fallback for the 5h row.
Carry the row-level reset onto the window when the window itself has
none; an explicit window resetTime still wins.
TranscriptContainer gated committed-prefix compaction on version === undefined, so version-tracked AssistantMessageComponent history never compacted and every stream tick re-walked all N sealed blocks (depth-linear compose).
Compact fully-committed finalized blocks regardless of post-finalize version tracking: their rows are immutable native scrollback the terminal owns. A post-commit mutation no longer recommits on ordinary frames (no duplication) and rehydrates on the next destructive full replay (no loss). Adds the permanent bench/transcript-compose.bench.ts fixture; ratio(N5000/N500) drops 2.30 -> 0.90.
Fixes#5930
Review follow-ups:
- The corruption retry now goes THROUGH the sidecar heal, so a cache
broken in both ways (truncated model blob AND stale/missing
config/tokenizer sidecars) recovers in one pass instead of the retry
escaping with a sidecar error.
- defaultLocalModelInitializer is exported from core as the shared
initializer and the coding-agent embed worker now uses it instead of
calling FlagEmbedding.init directly, so omp's subprocess embeddings
inherit both heals; fastembed/onnxruntime still load only in the
child address space.
resolveBlobRefsInEntries handed every non-session entry to the recursive
async resolvePersistedBlobRefs walk, allocating and awaiting child promises
even for plain-text entries with no blob:sha256: refs. On large text-heavy
histories this dominated the blob_resolve phase of session open.
Add a cheap synchronous containsBlobRef precheck that early-exits on the
first ref and allocates nothing. Interleave the precheck with per-entry
initiation so positive entries still start resolution at the same relative
point as the old filter+map schedule (a later entry that gains a ref during
an earlier BlobStore.get is still scanned after that mutation).
Blob-free N=5000 fixture: blob_resolve median 19.5ms -> 1.1ms, zero
BlobStore.get calls.
Fixes#5922
defaultLocalModelInitializer (exported @internal for tests; production
seam stays setLocalModelInitializer) now provably retries
FlagEmbedding.init EXACTLY once after a Protobuf-corruption failure,
quarantining the cached file in between, and surfaces the error without
looping when the retry fails too. The heal callsite now passes
options.cacheDir so containment checks the caller's cache root, not
only the global default.
A truncated model_optimized.onnx (observed live: 5.7MB file from June,
'Protobuf parsing failed' on every load) blocks local embeddings
forever: the downloader treats the existing file as complete, so every
init re-parses the same broken bytes and local recall/retain loses its
embedder. defaultLocalModelInitializer now quarantines the exact file
named by the loader (atomic rename to *.corrupt-<ts>) and retries init
ONCE so the model re-downloads.
The extracted path is error-message content: it is honored only when
it resolves inside the fastembed cache directory, so a dependency
emitting an unexpected message can never rename an arbitrary file.
Contract tests: protobuf failure quarantines exactly the named cache
file and reports retry-safe; unrelated errors touch nothing; a missing
file (concurrent heal) stays retry-safe; a path outside the cache root
is refused untouched.
- Probed Linux ffmpeg demuxers and fell back to ALSA when PulseAudio input is unavailable.
- Preserved recorder stderr so immediate capture failures report their real cause.
- Added regressions for ALSA selection and stderr diagnostics.
Fixes#5907
- 33d66643d removed the process-local URL response cache (#5803) but left
two fetch-kagi-toggle tests asserting the old reuse contract.
- Deleted the obsolete repeated-read reuse test (refetch behavior is
covered by fetch-raw-mode and search-url-paths regressions) and kept
the offset/limit selector contract without the no-network assertion.
- `DEL N:` previously consumed the colon and body rows then failed with the
wrong guidance; it now falls through to contamination detection which
emits the corrective "has no colon" message, matching `DEL.BLK N`.
- Aligns tokenizer with the leniency removal in 766790cba.