> ## Documentation Index
> Fetch the complete documentation index at: https://docs.moss.dev/llms.txt
> Use this file to discover all available pages before exploring further.

# Changelog

> Every release across the Moss SDKs, integrations, CLI, Portal, and API.

<Tabs>
  <Tab title="All">
    <Update label="2026-09-01" tags={["API"]}>
      * **Web sources**: crawl a website into an index via new `/v1/manage` actions (`createWebSource`, `listWebSources`, `getWebSource`, `resyncWebSource`, `updateWebSource`, `deleteWebSource`), with optional daily or weekly refresh schedules and linked PDF/DOCX parsing. See [Create Web Source](/docs/api-reference/v1/web-sources/createWebSource).
    </Update>

    <Update label="2026-08-26" description="v1.7.3" tags={["Python SDK"]}>
      **Added**

      * `create_index_from_files` accepts `parse_options` (`ParseOptions`): `use_high_resolution`, `segmentation_method` ("smart\_layout\_detection" or "page\_by\_page"), `ocr_mode` ("auto\_ocr" or "full\_ocr"), and `merge_tables`.
      * `session()` accepts `artifact_version` and `manifest_sha256` keyword arguments to pin a foundation model's immutable publisher release, part of the model-cache provenance hardening (#329).

      **Changed**

      * Supported `content_type` values are `application/pdf` and the DOCX MIME, matching the parse service's admission check.
      * `JobPhase` includes the crawl and parse pipeline phases.
      * Requires `inferedge-moss-core` 0.21.3 (parse options support and the moss-mediumlm 512 dimension fix).

      **Fixed**

      * Local text queries on foundation indexes without an exact model artifact identity keep the core's actionable error instead of a misleading "custom embeddings" message.

      See [Index from files](/docs/reference/python/files).
    </Update>

    <Update label="2026-08-26" description="v1.7.1" tags={["JavaScript SDK"]}>
      **Fixed**

      * `createIndexFromFiles` with in-memory `data` (Uint8Array, ArrayBuffer, Blob, or File) failed at the native boundary with "Failed to get Array length on JsParseFileInput.data"; bytes are now marshalled in the representation the binding accepts. The `path` flow was unaffected.

      See [Index from files](/docs/reference/js/files).
    </Update>

    <Update label="2026-08-26" description="v1.7.0" tags={["JavaScript SDK"]}>
      * New `CreateIndexFromFilesOptions.parseOptions` (`ParseOptions`, now exported): control server-side extraction with `useHighResolution`, `segmentationMethod` (`smart_layout_detection` or `page_by_page`), `ocrMode` (`auto_ocr` or `full_ocr`, the latter for scanned documents with no text layer), and `mergeTables`. Requires `@moss-dev/moss-core` `0.23.0`.
      * `ParseFileInput.contentType` supports `application/pdf` and the DOCX MIME, matching the parse service's admission check; unsupported types fail fast locally with a clear error.
      * `JobProgress.currentPhase` includes the crawl and parse pipeline phases (`queued`, `crawling`, `parsing_documents`, `parsing`, `waiting_for_parser`, `parsing_complete`).
      * Local text queries on server-built foundation indexes without an exact model artifact identity are refused with an actionable error instead of embedding against a guessed artifact; explicit query embeddings and cloud queries are unaffected.
    </Update>

    <Update label="2026-08-26" description="v1.1.0" tags={["Elixir SDK"]}>
      **Added**

      * `Client.create_index_from_files/5` accepts a `parse_options` map controlling server-side extraction: `:use_high_resolution`, `:segmentation_method` ("smart\_layout\_detection" or "page\_by\_page"), `:ocr_mode` ("auto\_ocr" or "full\_ocr"), and `:merge_tables`. Atom or string keys are accepted; unknown keys and wrong value types raise a clear error.

      **Changed**

      * Supported parse content types are `application/pdf` and the DOCX MIME, matching the parse service's admission check. Docs now state that `:name`, `:content_type`, and `:path` are all required per file.
      * Job status `current_phase` includes the crawl and parse phases ("crawling", "parsing\_documents", and the parser phases).
      * Bumped `moss_core` dependency to 0.18.0.

      **Fixed**

      * `Client.session/3` with invalid credentials returns `{:error, reason}` instead of exiting the calling process; sessions start unlinked and link on success.

      **Included from earlier unreleased work**

      * Device-id contract for usage tracking (#312): `Moss.Client.new/3` resolves a stable per-device id once and applies it to both manager and session telemetry, so a device counts once toward Monthly Active Devices across the whole client.
    </Update>

    <Update label="2026-08-06" description="v1.6.0" tags={["JavaScript SDK"]}>
      * New `MossClientOptions.identity` (`MossIdentity`): pass a stable caller-managed `deviceId` and optional `userId` at construction. The caller's `deviceId` is emitted as the billable telemetry `deviceId` (Monthly Active Device key); Moss's stable UUID is always emitted alongside as `mossDeviceId` for correlation; `userId` is never billable. Values must be 1-256 UTF-8 bytes with no surrounding whitespace, control or format characters, lone surrogates, or replacement characters; invalid values throw at construction. Without a configured identity, `deviceId` and `mossDeviceId` both carry Moss's UUID, so existing billing behavior is unchanged. Requires `@moss-dev/moss-core` `0.22.0`; constructing with an identity on an older core fails fast with an actionable error. Opt out of telemetry with `MOSS_DISABLE_TELEMETRY=1` as before.
    </Update>

    <Update label="2026-07-21" description="v0.1.0" tags={["TEN"]}>
      **Added**

      * `MossSessionManager.last_time_taken_ms` - the engine-measured retrieval time (ms) from the most recent `query_context` call (`SearchResult.time_taken_ms`); `None` before the first query or on error.

      **Changed**

      * First public release to PyPI (`pip install ten-moss`).
    </Update>

    <Update label="2026-07-20" description="v1.7.2" tags={["Python SDK"]}>
      **Dependencies**

      * Bump `inferedge-moss-core` to `0.21.0`. The core now publishes an **abi3 wheel** (`cp310-abi3`, installs on Python 3.10-3.14) and a **glibc ≥ 2.35 x86\_64 wheel**, so `moss` installs in common older-runtime environments - notably the TEN Framework dev container (Ubuntu 22.04 / Python 3.10), where the previous `cp312+` / `manylinux_2_38` wheels did not resolve. No API changes.
    </Update>

    <Update label="2026-07-15" description="v0.0.1" tags={["TEN"]}>
      **Added**

      * `MossSessionManager` - session-scoped Moss grounding for TEN extensions, built on the Moss Sessions API: `open`, `query_context`, `add_docs`, `get_docs`, `delete_docs`, `push_index`, `from_config`, `doc_count`.
      * `MossSessionConfig` - standardized `moss_*` properties for TEN extensions. The project key is a masked `SecretStr`; `moss_top_k`/`moss_alpha`/`moss_max_context_chars` are range-validated; unset `moss_model_id` adopts the stored index's model; `moss_max_context_chars` caps the injected grounding block.
      * `examples/create_index.py` - create and populate a demo index.
    </Update>

    <Update label="2026-07-14" description="v0.0.5" tags={["Pipecat"]}>
      **Changed**

      * Bumped `pipecat-ai` minimum from `>=1.1.0` to `>=1.5.0`.
    </Update>

    <Update label="2026-07-13" description="v1.4.0" tags={["JavaScript SDK"]}>
      * New: SessionIndex.close() and MossClient.close(), both idempotent, plus Symbol.asyncDispose support so `await using` works on Node 24. Closing releases the native index, pollers, and the session's reference to the shared embedding model (the service is dropped when the last session using it closes; the allocator retains and reuses those pages for the next load, so footprint stays bounded at one model per model id). Threads are no longer per-session. Concurrent close() callers share one completion promise and all settle when disposal finishes.
      * Published type declarations no longer force consumers to enable the ESNext.Disposable lib (the bundle carries the reference itself); consumers need TypeScript 5.2 or newer.
      * README and samples now demonstrate the close() / await using lifecycle.
      * MossClient.close() now also closes every live session created by that client (tracked via weak references); sessions can still be closed individually first.
      * close() fails loudly when the installed @moss-dev/moss-core predates the lifecycle API instead of silently leaking; this release requires @moss-dev/moss-core 0.20.0.
      * Declared engines: node >= 20.4 (first Node release where Symbol.asyncDispose exists).
    </Update>

    <Update label="2026-07-10" description="v0.1.0" tags={["VS Code"]}>
      **Added**

      * Semantic code search sidebar with live debounced queries
      * Manual **Create Index** / **Rebuild Index** workflow
      * Local index persistence (`saveToDisk` / `loadFromDisk`)
      * Moss Cloud sync via `pushIndex()` with restore on new machines
      * Sidebar gear settings for API credentials and cloud sync toggle
      * **Sync to Cloud** button and command
      * Hard exclusions for `node_modules`, build output, and common dependency folders
      * Moss native runtime isolated in a worker process
      * Marketplace packaging with cross-platform native binaries
    </Update>

    <Update label="2026-07-09" description="v1.7.1" tags={["Python SDK"]}>
      **Added**

      * **Verbatim payload round-trip** (`DocumentInfo.payload`): store an opaque structured payload (e.g. a JSON string) verbatim alongside a document and get it back as-is on query/get - never embedded or searched.
      * **Stable per-device id for usage tracking**: the SDK now sources a persisted device id (`~/.moss/.moss-device-id`, `MOSS_DISABLE_TELEMETRY` opt-out) and hands it to the core, making per-device usage attribution stable across restarts.
      * **Non-blocking `create_index`.** `create_index(..., wait=False)` returns a `JobHandle` as soon as the build is submitted, instead of blocking until it completes:
        * `handle.job_id` is available immediately.
        * `handle.status()` gives a live progress readout (phase + percent) as a `JobStatusResponse`.
        * `handle.wait()` blocks until the build finishes and returns the terminal `JobStatusResponse`. It polls asynchronously, so it parks no threads and never holds the GIL.
        * New `MossClient.wait_for_job(job_id)` blocks by `job_id` alone - submit, tear down the machine, then reconnect in a fresh process to wait on or poll the build.
        * The build runs server-side, so a submitted job completes regardless of the client. `wait` defaults to `True` and is keyword-only, so existing blocking callers are unaffected.

      **Dependencies**

      * Requires `inferedge-moss-core==0.20.1`.
    </Update>

    <Update label="2026-07-09" description="v1.3.2" tags={["JavaScript SDK"]}>
      **Changed**

      * Picks up `@moss-dev/moss-core` `0.19.2` (dependency currency; native-binding `DocumentInfo.payload` round-trip fix). No SDK API changes. (Prior `1.3.1` release re-run failed because the version was not bumped; this restores a publishable version.)
    </Update>

    <Update label="2026-07-08" description="v1.0.0-beta.15" tags={["Voice Agent Manager"]}>
      **Changed**

      * LiveKit stack bumped atomically 1.5.7 -> 1.6.4 (`livekit-agents` + all `livekit-plugins-*`); live Deepgram -> Gemini -> Cartesia round-trip verified.
      * `transformers` constrained to turn-detector's validated line: `>=4.47.1,!=4.57.2,!=4.57.3,<5.0.0` (the previous `>=5.0.0` floor was unintentional).
      * `google-genai>=1.67,<2.0.0`; `livekit-api>=1.0.7`.
    </Update>

    <Update label="2026-07-07" description="v1.7.0 (superseded by 1.7.1)" tags={["Python SDK"]}>
      * First cut of non-blocking `create_index`. **Use 1.7.1 instead**, which finalized the API (`wait` is keyword-only; `JobHandle.wait()` and `MossClient.wait_for_job()` return `JobStatusResponse`) and fixed a GIL hold that could freeze the event loop while a build was submitted or awaited.
    </Update>

    <Update label="2026-06-30" description="v1.6.0" tags={["Python SDK"]}>
      **Added**

      * **Exact / graph retrieval on `SessionIndex`, at parity with the iOS SDK.** `get_docs` now accepts a deterministic-fetch `GetDocumentsOptions` - fetch by `doc_ids`, by a metadata `filter` (same dict shape as query filters; no query vector, no ranking), with `sort_by`/`ascending` ordering, and `group_by` parent grouping. New `ParentGrouping(parent_field, order_field)` collapses sibling chunks into one result per unit. `QueryOptions.group_by` applies the same grouping to semantic queries.

      ```python theme={null}
      from moss import GetDocumentsOptions, ParentGrouping
      scenes = await session.get_docs(GetDocumentsOptions(
          filter={"field": "level", "condition": {"$eq": "scene"}}, sort_by="chunk_index"))
      units = await session.get_docs(GetDocumentsOptions(
          group_by=ParentGrouping("unit_id", "chunk_index")))
      ```

      **Dependencies**

      * Bumped `inferedge-moss-core` to `0.19.0` (adds the graph-retrieval surface).
    </Update>

    <Update label="2026-06-30" description="v1.5.0" tags={["Python SDK"]}>
      **Added**

      * **Verbatim document `payload`.** `DocumentInfo` now carries an optional `payload` string - an opaque structured value (e.g. JSON) stored and returned unchanged, never embedded or searched. Set it when building/adding documents and read it back from `get_docs` / query results. Useful for keeping the full structured record alongside the embeddable `text`. Requires the new core and the index-manager service that persists it.

      **Fixed**

      * Managed (cloud) query results now surface `payload` (previously dropped when mapping the response).

      **Dependencies**

      * Bumped `inferedge-moss-core` to `0.18.0` (adds payload support through the upload/build pipeline).
    </Update>

    <Update label="2026-06-29" description="v0.6.2" tags={["Swift SDK"]}>
      **Fixed**

      * **Parent grouping on `query` no longer under-assembles units.** The engine truncated to `topK` before sibling collapse, so siblings ranked below the cutoff were dropped. `query(…, groupByParent:)` now over-fetches candidates and returns `topK` units assembled from a wider window. For guaranteed-complete units, prefer `getDocs(where:…, groupByParent:)`, which collapses over its full fetch.
      * **Deterministic sibling order under grouping.** Parent grouping breaks `orderField` ties by document id, so equal/missing order values yield a stable within-unit order.

      Native runtime `sdkVersion`: `0.21.2`.
    </Update>

    <Update label="2026-06-29" description="v0.6.1" tags={["Swift SDK"]}>
      **Fixed**

      * **Restored `SessionOptions.autoLoadOnInit`.** It shipped in 0.5.0 but was absent from 0.6.0 (the graph-retrieval branch predated the feature and never picked it up), so code using `SessionOptions(autoLoadOnInit:)` failed to compile against 0.6.0. 0.6.1 carries both graph/exact retrieval *and* `autoLoadOnInit`. Upgrade straight from 0.5.0 or 0.6.0 to 0.6.1.

      Native runtime `sdkVersion`: `0.21.1`.
    </Update>

    <Update label="2026-06-28" description="v0.6.0" tags={["Swift SDK"]}>
      **Added**

      * **Deterministic / exact ("graph") retrieval on a session.** `getDocs(ids:)` now returns documents in the order requested; new `getDocs(where:sortBy:ascending:)` fetches by a metadata predicate with no query vector and no similarity ranking.
      * **Typed metadata filter.** A `Filter` DSL (`.equals` / `.and` / `.greaterThanOrEqual` / `.isIn` / `.near` / …) with literal-expressible `FilterValue`, usable in both `getDocs(where:)` and `QueryOptions.filter` - no hand-written filter JSON.
      * **Parent-unit grouping.** `ParentGrouping(parentField:orderField:)` on `getDocs` / `query` collapses sibling documents that share a parent id into a single result, assembled in `orderField` order.
      * **Verbatim structured payload.** `DocumentInfo.payload` (and `QueryResult.payload`) stores and returns an opaque value unchanged - not embedded or searched. Codable sugar: `init(…, structured:)` and `decodedPayload(_:)`. Indexes saved without a payload load with `payload = nil`.

      Native runtime `sdkVersion`: `0.21.0`.
    </Update>

    <Update label="2026-06-27" description="v0.5.0" tags={["Swift SDK"]}>
      **Added**

      * **`SessionOptions.autoLoadOnInit`.** Defaults to `true` (auto-load the named index from the cloud at session creation). Set `false` for a local-only, disk-first session: creation returns immediately and you populate it yourself (`loadFromDisk`, falling back to `loadIndex` only on a cache miss).

      Native runtime `sdkVersion`: `0.20.0`.
    </Update>

    <Update label="2026-06-26" description="v1.3.1" tags={["JavaScript SDK"]}>
      **Fixed**

      * **Fixed a native crash when re-saving an on-disk session.** Calling `saveToDisk` on a session previously restored with `loadFromDisk` could crash the process while writing the on-disk index, because the index file was rewritten in place while the loaded session was still reading from it. `saveToDisk` still persists immediately, but now writes to a temporary file and atomically renames it into place, so the file the live session is reading from is never rewritten underneath it. Requires `@moss-dev/moss-core` `0.19.1`.
    </Update>

    <Update label="2026-06-25" description="v1.3.0" tags={["JavaScript SDK"]}>
      **Added**

      * **Sessions work with a custom `IAuthenticator`.** `MossClient.session()` now works when the client is constructed with a custom authenticator (short-lived tokens / delegated auth), not just a static project key - it previously threw. The session authenticates (credential validation, `pushIndex`, `loadIndex`) and reports usage through the same auth bridge as `loadIndex`. Requires `@moss-dev/moss-core` `0.19.0` (adds the `SessionIndex.withAuthenticator` napi factory).
    </Update>

    <Update label="2026-06-25" description="v1.2.1" tags={["JavaScript SDK"]}>
      **Added**

      * **Client-level `cachePath`.** `new MossClient(projectId, key, { cachePath })` (and the `IAuthenticator` overload) sets one location for the per-device telemetry id, honored by every operation that emits telemetry - `loadIndex`, `session`, and so on. Set it once instead of per call.

      **Fixed**

      * **Session telemetry now carries the per-device id.** `MossClient.session()` now attaches the anonymous `deviceId` to `session.*` telemetry events, matching `loadIndex`. Previously only the `loadIndex` path attached a `deviceId`, so usage from session-only clients was reported without one.
      * The per-device id is now resolved once and shared across `loadIndex` and `session()` within a client, so a client that uses both surfaces reports a single, consistent id.

      **Changed**

      * The per-device id location is now resolved with this precedence: the client-level `cachePath`, then the `cachePath` passed to `loadIndex` (back-compat), then a per-user fallback, `<home>/.moss/.moss-device-id`. Previously the id was only written when `loadIndex` was given a `cachePath`.
    </Update>

    <Update label="2026-06-23" description="v1.2.0" tags={["JavaScript SDK"]}>
      **Added**

      * **Usage telemetry on the custom-authenticator path.** Automatic, privacy-light usage telemetry now works when the client is constructed with a custom `IAuthenticator` (e.g. short-lived tokens), not just a plain project key - previously it was silently disabled on that path. This enables device-level usage reporting for client-side / delegated-auth deployments.
      * A stable, anonymous per-device id is generated once and persisted at `<cachePath>/.moss-device-id` (the `cachePath` you already pass to `loadIndex`), then attached to telemetry as `deviceId`. It is a random UUID - no hardware identifier, no PII.
      * Opt out entirely with `MOSS_DISABLE_TELEMETRY=1`.
      * Bumped `@moss-dev/moss-core` to `0.18.0` (adds the `setDeviceId` napi binding and auth-provider telemetry).
    </Update>

    <Update label="2026-06-15" description="v1.4.1" tags={["Python SDK"]}>
      **Fixed**

      * Loading `moss-litelm` indexes could fail with `Deserialization error: unsupported version: 3`. These indexes use the v3 index format, which requires `inferedge-moss-core` `0.17.0`; installing `moss` now brings in that core version automatically, so `moss-litelm` indexes load out of the box with no manual dependency steps. (`moss-minilm` / `moss-mediumlm` indexes are unaffected.)

      **Dependencies**

      * Pinned `inferedge-moss-core==0.17.0`.
    </Update>

    <Update label="2026-06-03" description="v1.1.0" tags={["JavaScript SDK"]}>
      **Added**

      * **`MossClient.session(name, modelId?)`** - local-first session index. Construct a session, add/delete/get documents and run queries entirely in-process (no cloud round-trip per operation), then `pushIndex()` to persist to the cloud. Also `loadIndex(indexName, { autoRefresh, pollingIntervalInSeconds })` to pull an existing cloud index into the session.
      * New top-level exports: `SessionIndex`, `PushIndexResult`, `LoadSessionOptions`.
      * Bumped `@moss-dev/moss-core` to `0.17.0` (adds the `SessionIndex` napi binding).
    </Update>

    <Update label="2026-06-03" description="v0.4.1" tags={["Swift SDK"]}>
      * Clean re-release of the v0.4.0 fixes. The v0.4.0 tag was force-moved, which SwiftPM caches as a pin mismatch; v0.4.1 ships the same xcframework as v0.4.0 with the synced 4-argument Swift wrapper. Consume with `from: "0.4.0"` (resolves up) or `from: "0.4.1"`.
    </Update>

    <Update label="2026-06-02" description="v1.4.0" tags={["Python SDK"]}>
      **Dependencies**

      * Bumped `inferedge-moss-core` to `0.17.0`.
    </Update>

    <Update label="2026-06-02" description="v0.4.0" tags={["Swift SDK"]}>
      * `Moss.xcframework` release with iOS device (arm64) and iOS simulator (arm64) slices, consumed via `.package(url: "https://github.com/usemoss/moss", from: "0.4.0")`.
    </Update>

    <Update label="2026-06-01" description="v0.3.0" tags={["Swift SDK"]}>
      * First tagged SwiftPM release of the Moss iOS SDK: binary `Moss.xcframework` with iOS device (arm64) and iOS simulator (arm64) slices, consumed via `.package(url: "https://github.com/usemoss/moss", from: "0.3.0")`.
    </Update>

    <Update label="2026-05-31" description="v1.3.0" tags={["Python SDK"]}>
      **Added**

      * **Local-first session indexing** (merged from the separate `moss-session` package):
        * `MossClient.session(index_name, model_id?)` - creates a `SessionIndex`; auto-loads from cloud if an index with that name already exists, otherwise starts empty.
        * `SessionIndex.add_docs(docs, options?)` / `delete_docs(doc_ids)` / `get_docs(options?)` - local in-memory mutations and reads.
        * `SessionIndex.query(query, options?)` - semantic search over the local session index (\~1-10ms, no network). Supports the same filter syntax as `MossClient.query()`.
        * `SessionIndex.push_index()` - uploads the session index to cloud, creating or replacing the index with the same name. Documents are pushed with their locally-computed embeddings; no server-side re-embedding.
        * New exports from `moss`: `SessionIndex`, `PushIndexResult`.
      * `model_id="custom"` is supported for sessions - bring your own embeddings via `DocumentInfo.embedding` and `QueryOptions.embedding`; no local model is loaded.
    </Update>

    <Update label="2026-05-27" description="v1.2.0" tags={["Python SDK"]}>
      **Changed**

      * **`pip install moss` is now \~64% smaller.**

      **Fixed**

      * Built-in model downloads (`moss-minilm`, `moss-mediumlm`) survive slow networks: resume after an interrupted connection instead of restarting, with automatic retries and exponential backoff on transient failures. (Also in 1.1.1.)

      **Dependencies**

      * Bumped `inferedge-moss-core` to `0.14.0`.
    </Update>

    <Update label="2026-05-27" description="v1.1.1" tags={["Python SDK"]}>
      **Fixed**

      * Built-in model downloads (`moss-minilm`, `moss-mediumlm`) survive slow networks: resume after an interrupted connection instead of restarting, with automatic retries and exponential backoff on transient failures.
      * Bumped `inferedge-moss-core` to `0.12.1`.
    </Update>

    <Update label="2026-05-21" description="v1.0.0" tags={["moss-agent"]}>
      First stable release of `moss-agent`.

      **Added**

      * `MossAgent` - process-wide Moss runtime. Holds a hot index cache shared across every room (voice) or every request (text).
      * **Voice path** - `MossAgent.attach(ctx) -> MossCall` binds a Moss call scope to a LiveKit `JobContext`. Idempotent on `ctx.room.name`. `MossCall.query` and `MossCall.query_multi_index` route through the call scope.
      * **Text path** - `MossAgent.query(name, query, options=None)` and `MossAgent.query_multi_index(names, query, options=None)` for HTTP / chat / non-LiveKit callers.
      * Full index CRUD (`create_index`, `add_docs`, `delete_docs`, `delete_index`, `list_indexes`, `get_index`, `get_docs`, `get_job_status`) and cache lifecycle (`load_index`, `load_indexes`, `unload_index`, `unload_indexes`) on `MossAgent`.
      * Re-exports of `DocumentInfo`, `IndexInfo`, `QueryOptions`, `SearchResult`, etc. from `moss_core`.

      **Requires**

      * `inferedge-moss-core == 0.12.0` - introduces the `moss_core.Agent` and `moss_core.CallScope` PyO3 bindings this package wraps.
    </Update>

    <Update label="2026-05-13" description="v0.2.0" tags={["Founding Agent"]}>
      Breaking: top-level React component replaced.

      * Replaced `MossFoundingAgentCard` with `MossFoundingAgentBubble`, a compact click-to-talk FAB that morphs into a pill with mute, elapsed-time, and end-call controls while live. Supports `position="fixed"` (default, bottom-right with safe-area insets) or `position="inline"`. Keyboard: Esc = end, M = mute.
      * Added a curated 6-color palette (`violet`, `cobalt`, `teal`, `emerald`, `coral`, `amber`) exported as `BUBBLE_COLORS`. The bubble's `color` prop accepts a preset name.
      * Added `examples/bubble-playground/`, a local Vite playground for previewing the bubble across all presets.
    </Update>

    <Update label="2026-05-06" description="v1.1.0" tags={["Python SDK"]}>
      **Added**

      * `query_multi_index(names, query, options)`: search across multiple loaded indexes; returns the global top-K with each doc tagged by source `index_name`. Embedding-only; `options.alpha` is ignored.
      * `load_indexes(names, ...)` / `unload_indexes(names)`: bulk lifecycle. `load_indexes` is best-effort and returns `LoadIndexesResult { loaded, failed }`.
      * `index_name` field on `QueryResultDocumentInfo` (set on multi-index results).
      * Bumped `inferedge-moss-core` to `0.11.0`.
    </Update>

    <Update label="2026-05-05" description="v1.0.2" tags={["JavaScript SDK"]}>
      **Changed**

      * Bumped `@moss-dev/moss-core` dependency from `0.9.1` to `0.10.0`, which adds prebuilt binaries for `x86_64-apple-darwin` (Intel Macs) and realigns the npm package version with the underlying Rust core.
    </Update>

    <Update label="2026-05-01" description="v0.0.4" tags={["Pipecat"]}>
      **Changed**

      * Updated `requires-python` from `>=3.10` to `>=3.11` to match `pipecat-ai 1.1.0` requirements.
    </Update>

    <Update label="2026-04-28" description="v1.0.0-beta.2" tags={["VitePress"]}>
      **Changed**

      * Swapped runtime browser SDK from `@inferedge/moss` to `@moss-dev/moss-web`
    </Update>

    <Update label="2026-04-24" description="v0.1.1" tags={["CLI"]}>
      * Added named **config profiles** to switch between accounts and projects, and an **interactive mode** for `moss query`.
    </Update>

    <Update label="2026-04-22" description="v0.1.0" tags={["Founding Agent"]}>
      Initial release.

      * `MossFoundingAgent` server class and `createFoundingAgentSession` helper for minting voice sessions from a Node backend (Next.js, Express, anywhere with `fetch`).
      * `<MossFoundingAgent />` React component (exported from `@moss-tools/founding-agent/react`) that renders a voice UI - idle state, start button, visualizer, end-call - and connects to LiveKit via a company-supplied token endpoint.
    </Update>

    <Update label="2026-04-19" description="v1.0.0" tags={["Browser SDK"]}>
      Initial release of @moss-dev/moss-web - browser SDK for in-browser semantic search.

      **Added**

      * **In-browser semantic search**: Full query pipeline runs entirely in the browser via WebAssembly
      * **Full CRUD operations**: `createIndex`, `addDocs`, `deleteDocs`, `deleteIndex`, `listIndexes`, `getIndex`, `getDocs`, `getJobStatus`
      * **File-based index creation**: `createIndexFromFiles` accepts `Uint8Array` data (no filesystem paths in browser)
      * **Local index operations**: `loadIndex`, `query`, `refreshIndex`, `unloadIndex`, `hasIndex`, `getIndexInfo`
      * **Lazy initialization**: WASM + model download happens automatically on first operation
      * **Metadata filtering**: Same filter syntax as Node SDK (`$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$in`, `$nin`, `$near`, `$and`, `$or`)
      * Embedding models: `moss-minilm` (default), `moss-mediumlm`
      * API shape aligned with `@moss-dev/moss` (Node SDK)
    </Update>

    <Update label="2026-04-17" description="v1.0.1" tags={["JavaScript SDK"]}>
      **Added**

      * **Custom authenticator** for browser-safe authentication: new `MossClient.withAuthenticator()` and `IndexManager.withAuthenticator()` factory methods accept a JS-side token callback, backed by `JsAuthBridge` in `@moss-dev/moss-core` (#226).

      **Changed**

      * `CLOUD_API_MANAGE_URL` replaced by granular constants: `CLOUD_API_IDENTITY_URL`, `CLOUD_API_AUTH_URL`, etc. (#226).
    </Update>

    <Update label="2026-04-13" description="v1.0.0-beta.14" tags={["Voice Agent Manager"]}>
      **Added**

      * `submit_session_report(ctx, room_name)` method on `MossAgentSession` for submitting LiveKit session reports (transcripts) to the Moss backend. Call from your `on_session_end` callback to enable transcript download via the CLI.
    </Update>

    <Update label="2026-04-09" description="v0.9.0" tags={["C SDK"]}>
      * Precompiled `libmoss` binaries for macOS ARM64, Linux x86\_64, Linux ARM64, and Windows x86\_64. Each archive ships `include/libmoss.h` plus shared and static libraries. See [C SDK](/docs/reference/c/getting-started).
    </Update>

    <Update label="2026-04-05" description="v1.0.1" tags={["Elixir SDK"]}>
      **Changed**

      * Bumped `moss_core` dependency to 0.9.0.
      * Session authentication now uses short-lived JWT tokens (enterprise plan required).
      * Removed `validate_credentials` call from `Client.session/3`; credential exchange happens inside the Rust core during session init.
      * Updated package metadata and README.
    </Update>

    <Update label="2026-04-04" tags={["Portal"]}>
      * Refreshed dashboard aesthetic and added **multi-org support** with team management.
    </Update>

    <Update label="2026-04-01" description="v1.0.0" tags={["JavaScript SDK"]}>
      **Architecture**

      * **Rust-native core**: The SDK now delegates all index management, querying, and embedding generation to `@moss-dev/moss-core` (Rust via NAPI-RS), replacing the previous pure-JavaScript implementations
      * **Node-only**: Dropped browser/WASM support; the SDK targets Node.js 20+ exclusively
      * Query embeddings are now generated in Rust (`queryText` / `loadQueryModel`), matching the Python SDK architecture

      **Changed**

      * Package renamed from `@inferedge/moss` to `@moss-dev/moss`
      * NAPI binding renamed from `moss-core` to `@moss-dev/moss-core` (v0.8.7, tracking Rust core version)
      * `query()` uses Rust-native `queryText()` for local queries (no JS embedding pipeline)
      * `query()` with `embedding` option uses Rust `query()` directly
      * `query()` falls back to cloud HTTP when index is not loaded locally
    </Update>

    <Update label="2026-04-01" description="v1.0.0" tags={["Elixir SDK"]}>
      **Changed**

      * Renamed package from `moss_session` to `moss`.
      * Published as a public Hex package (no longer requires `organization: "moss"`).
      * Bumped version to 1.0.0 stable.
    </Update>

    <Update label="2026-03-30" description="v1.0.0-beta.8" tags={["JavaScript SDK"]}>
      **Added**

      * **Filesystem Index Caching**: `loadIndex()` now accepts an optional `cachePath` in `LoadIndexOptions` to cache index binaries and documents to disk (Node.js/Bun only)
        * Cache is automatically invalidated when the cloud index is updated
        * Auto-refresh also persists refreshed data to the cache
        * Atomic writes prevent cache corruption from partial/interrupted writes
        * Path traversal protection on index names
        * Graceful fallback to re-download if cached data is corrupted
      * **Metadata Filtering**: `query()` now accepts an optional `filter` in `QueryOptions` to narrow results by document metadata on locally loaded indexes
        * Comparison operators: `$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`
        * Set operators: `$in`, `$nin`
        * Composable with `$and` / `$or` for complex predicates (supports arbitrary nesting)
        * Numeric coercion: number filter values are automatically stringified for consistent matching
      * **Geo-distance filtering**: new `$near` operator filters documents by haversine distance from a `"lat,lng,radiusMeters"` value
      * New exported types: `FilterCondition`, `MetadataFilter`
    </Update>

    <Update label="2026-03-30" description="v0.0.1" tags={["ElevenLabs"]}>
      **Added**

      * Initial release of `elevenlabs-moss` integration.
      * `MossClientTool` for registering Moss semantic search as an ElevenLabs client tool.
      * Example `moss-elevenlabs-demo.py` demonstrating tool registration.
    </Update>

    <Update label="2026-03-29" description="v1.0.0" tags={["Python SDK"]}>
      First stable release of the `moss` Python SDK (previously published as `inferedge-moss`).

      **Import path changed:** `from moss import MossClient` (was `from inferedge_moss import ...`)

      **Features**

      * **Semantic search** with built-in on-device models (`moss-minilm`, `moss-mediumlm`); embedding computation runs in Rust for speed; custom embeddings supported via `QueryOptions.embedding`
      * **Hybrid search** with keyword + semantic search and configurable alpha blending
      * **Metadata filtering** on locally loaded indexes with rich operators (`$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$in`, `$nin`, `$and`, `$or`, `$near` for geo-distance)
      * **Cloud query fallback**: `query()` automatically falls back to the cloud API when the index is not loaded locally
      * **Hot reload & auto-refresh**: `load_index()` supports `auto_refresh` with configurable polling interval to detect and reload updated indexes
      * **Async bulk index pipeline**: binary upload, server-side build, poll until completion
      * **Index mutations**: `create_index`, `add_docs`, `delete_docs` return `MutationResult` with `job_id`, `index_name`, `doc_count`
      * **Multi-index support** for isolated search spaces
      * **Python 3.10 to 3.14** supported
    </Update>

    <Update label="2026-03-29" description="v0.1.0" tags={["CLI"]}>
      * **Initial release** - CLI wrapper for the Moss Python SDK (v1.0.0)
      * Index management: `moss index create`, `list`, `get`, `delete`
      * Document management: `moss doc add`, `delete`, `get`
      * Semantic search: `moss query` with `--cloud`, `--filter`, `--alpha`, `--top-k`
      * Job tracking: `moss job status` with `--wait` for live progress
      * Interactive credential setup: `moss init`
      * Three-tier auth resolution: CLI flags > env vars > config file
      * JSON and CSV document input, stdin piping with `--file -`
      * `--json` flag on all commands for machine-readable output
      * Rich terminal output: tables, progress spinners, colored status
    </Update>

    <Update label="2026-03-24" description="v1.0.0-beta.19" tags={["Python SDK"]}>
      * Updated `inferedge-moss-core` dependency to `0.8.7`
      * Telemetry improvements
      * Embedding computation for built-in models (`moss-minilm`, `moss-mediumlm`) now runs in Rust; custom embeddings continue to be supported via `QueryOptions.embedding`
      * Fixed `list_indexes()` failing when the cloud API returns `null` for certain `IndexInfo` fields on indexes created by older SDK versions
    </Update>

    <Update label="2026-03-24" description="v0.0.3" tags={["Pipecat"]}>
      **Added**

      * Supports latest version of moss
    </Update>

    <Update label="2026-03-16" description="v1.0.0-beta.5" tags={["Elixir SDK"]}>
      **Changed**

      * Bumped `moss_core` dependency to 0.8.7, which fixes the precompiled NIF tarball for macOS - the file inside the archive is now named with the versioned filename so RustlerPrecompiled places it correctly in `priv/native`.
    </Update>

    <Update label="2026-03-16" description="v1.0.0-beta.4" tags={["Elixir SDK"]}>
      **Changed**

      * Bumped `moss_core` dependency to 0.8.6, which fixes precompiled NIF packaging for macOS - the binary is now correctly distributed as `.so` (required by RustlerPrecompiled) instead of `.dylib`.
    </Update>

    <Update label="2026-03-16" description="v1.0.0-beta.3" tags={["Elixir SDK"]}>
      **Changed**

      * Bumped `moss_core` dependency to 0.8.5.
    </Update>

    <Update label="2026-03-12" description="v1.0.0-beta.18" tags={["Python SDK"]}>
      * Telemetry improvements
    </Update>

    <Update label="2026-03-12" description="v1.0.0-beta.1" tags={["Elixir SDK"]}>
      Initial release of the `moss_session` Elixir SDK (later renamed to `moss` in 1.0.0) with local-first session indexing.

      **Added**

      * **`Moss.Client`** - single entry point for all operations
        * `new/3` - creates a client; starts an internal local index manager
        * `session/3` - auto-loads from cloud if the named index exists; starts empty otherwise; pre-warms built-in models (`"moss-minilm"` / `"moss-mediumlm"`) to eliminate cold-start delay on first query
        * Cloud CRUD: `create_index/4` (model\_id optional, defaults to `"moss-minilm"`), `add_docs/4`, `delete_docs/3`, `get_job_status/2`, `get_index/2`, `list_indexes/1`, `delete_index/2`, `get_docs/3`
        * Local index ops: `load_index/3`, `unload_index/2`, `has_index/2`, `query/4`, `refresh_index/2`, `get_index_info/2`
        * Generates a per-client UUID (`client_id`) propagated to all sessions and managers for telemetry correlation
      * **`Moss.Session`** GenServer - local in-session index backed by Rust core
        * `add_docs/3` - built-in models embed automatically; `model_id: "custom"` reads `.embedding` from each `DocumentInfo`; returns `{added, updated}`
        * `delete_docs/2` - remove documents by ID
        * `get_docs/2` - retrieve documents (optionally filtered by ID list)
        * `query/3` - semantic search; built-in models embed automatically; `model_id: "custom"` requires `embedding:` opt; accepts metadata filters
        * `load_index/2` - load an existing cloud index into the session
        * `push_index/1` - push local index to cloud (create or replace); flushes telemetry
      * **`Moss.Models`** - Elixir structs: `DocumentInfo`, `SearchResult`, `QueryResultDoc`, `IndexInfo`, `PushIndexResult`, `RefreshResult`, `SerializedIndex`, `MutationResult`, `JobStatusResponse`, `CredentialsInfo`, `ModelRef`
      * **Metadata filtering** - all query functions accept `:filter` map with full operator support
        * Field conditions: `$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$in`, `$nin`, `$near`
        * Logical combinators: `$and`, `$or` (fully nestable)
      * **Background telemetry** - aggregated telemetry handled by the Rust core
      * **Built-in models** - `"moss-minilm"` (fast) and `"moss-mediumlm"` (higher quality); embedding computation runs entirely in the Rust core via ONNX Runtime
      * **`model_id: "custom"`** - bring your own pre-computed embeddings; no local model required
    </Update>

    <Update label="2026-03-11" description="v1.0.0-beta.13" tags={["Voice Agent Manager"]}>
      **Fixed**

      * OpenAI TTS models (`tts-*` / `*-tts`) are no longer cached at worker startup. The TTS instance is created per-session instead.
    </Update>

    <Update label="2026-03-09" description="v1.0.0-beta.12" tags={["Voice Agent Manager"]}>
      **Added**

      * Support for passing Moss credentials (`project_id`, `project_key`, `voice_agent_id`) directly into the `MossAgentSession` constructor and `MossAgentSession.prewarm()`, falling back to `MOSS_*` environment variables when not provided.
      * TTS configuration via the `options` parameter on `MossAgentSession`, using `SessionOptions(tts=TTSOptions(...))`. Supported `TTSOptions` fields: `model`, `voice`, `language` (Cartesia), `emotion` (Cartesia), `instructions` (OpenAI `gpt-4o-mini-tts` only). All fields override the platform-configured defaults and are forwarded directly to the underlying provider.
      * `SessionOptions` and `TTSOptions` exported from `moss_voice_agent_manager` for IDE autocompletion support.
      * OpenAI TTS support: routes any model matching `tts-*` prefix or `*-tts` suffix (e.g. `tts-1`, `gpt-4o-mini-tts`) to the OpenAI plugin (optional dependency: `pip install 'moss-voice-agent-manager[openai]'`).
    </Update>

    <Update label="2026-03-05" description="v1.0.0-beta.1" tags={["VitePress"]}>
      **Added**

      * Initial beta release of the Moss semantic search plugin for VitePress
      * `MossPlugin` VitePress plugin with automatic markdown indexing via `@moss-tools/md-indexer`
      * `Search.vue` component - full search modal with keyboard navigation
      * `SearchButton.vue` component - trigger button for the search modal
      * TypeScript types exported via `./types`
      * Support for both ESM and CJS consumers
      * Configurable `apiKey`, `indexId`, `placeholder`, and `maxResults` options
    </Update>

    <Update label="2026-03-03" description="v1.0.0-beta.9" tags={["Voice Agent Manager"]}>
      **Added**

      * `AgentServer` re-exported from `moss_voice_agent_manager`
      * `AgentSession` re-exported from `moss_voice_agent_manager`
      * `inference` module re-exported from `moss_voice_agent_manager`
      * `room_io` module re-exported from `moss_voice_agent_manager` (includes `RoomOptions`, `AudioInputOptions`)
      * `MultilingualModel` re-exported from `moss_voice_agent_manager` (turn detection)
      * `livekit-plugins-turn-detector==1.3.11` added as a dependency
      * `voice_agent_name` field added to `MossConfig` - populated from the platform credentials API, eliminating the need for a separate `httpx` call in agent code
    </Update>

    <Update label="2026-02-27" description="v1.0.0-beta.8" tags={["Voice Agent Manager"]}>
      **Fixed**

      * `MossAgentSession.prewarm()` no longer crashes with "no running event loop".
    </Update>

    <Update label="2026-02-27" description="v1.0.0-beta.7" tags={["Voice Agent Manager"]}>
      **Added**

      * `MossAgentSession.prewarm()` static method for use as `prewarm_fnc` in `WorkerOptions` - initializes providers once at worker startup instead of per session
      * `ctx` parameter on `MossAgentSession.__init__()` - when provided, reuses prewarmed providers from the worker process instead of creating new ones
      * `JobProcess` re-exported from `moss_voice_agent_manager`

      **Improved**

      * Reduced agent session startup latency by supporting the LiveKit prewarm pattern

      **Usage**

      ```python theme={null}
      from moss_voice_agent_manager import MossAgentSession, WorkerOptions, cli

      async def entrypoint(ctx):
          session = MossAgentSession(userdata=data, ctx=ctx)
          ...

      cli.run_app(WorkerOptions(
          entrypoint_fnc=entrypoint,
          prewarm_fnc=MossAgentSession.prewarm,
      ))
      ```
    </Update>

    <Update label="2026-02-26" description="v1.0.0-beta.17" tags={["Python SDK"]}>
      **Added**

      * **Metadata Filtering**: `query()` now accepts an optional `filter` dict to narrow results by document metadata on locally loaded indexes
        * Comparison operators: `$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`
        * Set operators: `$in`, `$nin`
        * Composable with `$and` / `$or` for complex predicates (supports arbitrary nesting)
        * Numeric coercion: int and float filter values are automatically converted to strings for consistent matching
      * **Geo-distance filtering**: new `$near` operator filters documents by haversine distance from a `"lat,lng,radiusMeters"` value
      * When `filter` is passed to `query()` but the index is not loaded locally, a warning is logged and the filter is skipped (cloud query API does not yet support filtering)
      * Updated `inferedge-moss-core` dependency to `0.6.0`
    </Update>

    <Update label="2026-02-24" tags={["Portal"]}>
      * Billing UI updates.
    </Update>

    <Update label="2026-02-23" description="v1.0.0-beta.16" tags={["Python SDK"]}>
      * Bumped `inferedge-moss-core` dependency to `0.5.0` to support session index telemetry and `push_index` improvements
    </Update>

    <Update label="2026-02-23" tags={["Portal"]}>
      * Self-service **password and profile updates** from account settings.
    </Update>

    <Update label="2026-02-21" description="v1.0.0-beta.3" tags={["Voice Server"]}>
      **Changed**

      * Only set room agent configuration when `agentName` is explicitly provided to `createParticipantToken()`
      * Removed automatic fallback to `voice_agent_name` from credentials, allowing dispatch rules to handle agent joining
    </Update>

    <Update label="2026-02-21" description="v1.0.0-beta.2" tags={["Voice Server"]}>
      **Fixed**

      * Updated API endpoint from `/api/voice-agent-deploy/get-voice-agent` to `/api/voice-agent/get-voice-agent` to match backend API changes
    </Update>

    <Update label="2026-02-19" description="v1.0.0-beta.4" tags={["Voice Agent Manager"]}>
      **Changed (Complete Rewrite)**

      Complete architectural rewrite. The SDK is now a runtime agent library instead of a deployment client.

      **Old SDK:** Deployment client that uploads code to backend
      **New SDK:** Drop-in replacement for LiveKit AgentSession with Moss platform integration

      **Added**

      * `MossAgentSession` - Drop-in replacement for LiveKit AgentSession
      * Dynamic configuration fetching from Moss platform API
      * Runtime config API endpoint (`/api/voice-agent/get-runtime-config`)
      * Voice agent credentials API endpoint (`/api/voice-agent/get-voice-agent`)
      * Automatic provider configuration (STT, LLM, TTS)
      * Built-in metrics tracking (LLM, TTS, STT, VAD, EOU)
      * Diagnostics reporting with performance metrics
      * Model/provider name masking for proprietary information
      * Auto-initialization of VAD (Voice Activity Detection)
      * `py.typed` marker for IDE IntelliSense support

      **Configuration**

      All configuration now comes from environment variables and platform API:

      **Required Environment Variables:**

      * `MOSS_PROJECT_ID` - Project identifier
      * `MOSS_PROJECT_KEY` - Project authentication key
      * `MOSS_VOICE_AGENT_ID` - Voice agent identifier

      **Optional:**

      * `MOSS_PLATFORM_API_URL` - Platform API URL (defaults to production)

      **Architecture**

      * **No fallbacks** - Fails hard if configuration/credentials missing
      * **Dynamic models** - Model selection fetched from backend at runtime
      * **Secure credentials** - LiveKit credentials fetched from Supabase via API
      * **No hardcoded secrets** - All secrets from environment or API

      **Removed**

      * `MossVoiceClient` class (replaced with `MossAgentSession`)
      * `deploy()` method (now runtime library, not deployment tool)
      * Custom tool source extraction
      * Static configuration files

      **Migration Guide**

      **This version is NOT backward compatible.** Complete migration required.

      **Before (v1.x - Deployment SDK):**

      ```python theme={null}
      from moss_voice_agent_manager import MossVoiceClient

      client = MossVoiceClient(project_id="...", project_key="...")
      client.deploy(
          voice_agent_id="...",
          prompt="...",
          function_tools=[my_tool]
      )
      ```

      **After (v1.0.0-beta.4 - Runtime SDK):**

      ```python theme={null}
      from moss_voice_agent_manager import MossAgentSession

      # Set environment variables first
      session = MossAgentSession(
          userdata=your_data,
          vad=vad,  # optional
          max_tool_steps=10
      )

      # Access platform API
      api = session.platform_api

      # Get metrics
      metrics = session.metrics
      diagnostics = session.diagnostics
      ```
    </Update>

    <Update label="2026-02-18" description="v1.0.0-beta.7" tags={["JavaScript SDK"]}>
      **Added**

      * Async job-based mutations (`createIndex`, `addDocs`, `deleteDocs`) with built-in polling and `onProgress` callbacks
      * Large index support - up to 100k documents via presigned upload + server-side build
      * New binary index format with smaller payloads and faster deserialization; existing indexes using the previous format are still supported
    </Update>

    <Update label="2026-02-18" description="v1.0.0-beta.3" tags={["md-indexer"]}>
      * Internal maintenance
    </Update>

    <Update label="2026-02-17" description="v1.0.0-beta.15" tags={["Python SDK"]}>
      * All index mutations and reads now go through the Rust ManageClient, replacing the Python HTTP layer
      * Index creation uses an async bulk pipeline: binary upload → server-side build → poll until completion
      * `load_index` supports both V1 and V2 binary formats, with cloud query fallback when index isn't loaded locally
      * New return type `MutationResult` (with `job_id`, `index_name`, `doc_count`) for `create_index`, `add_docs`, `delete_docs`
      * `get_docs` takes `doc_ids` directly instead of wrapping in `GetDocumentsOptions`
    </Update>

    <Update label="2026-02-11" description="v1.0.0-beta.3" tags={["Voice Agent Manager"]}>
      **Changed (Breaking)**

      * **Removed `agent_id` parameter** from `deploy()` method
      * `voice_agent_id` is now used internally as the agent identifier
      * **Reordered parameters**: `voice_agent_id` now comes before `prompt` in `deploy()`
      * `project_name` parameter now defaults to `voice_agent_id` (previously defaulted to `agent_id`)

      **Migration Guide**

      **Before:**

      ```python theme={null}
      client.deploy(
          agent_id="my-agent",
          prompt="You are helpful",
          voice_agent_id="agent-uuid"
      )
      ```

      **After:**

      ```python theme={null}
      client.deploy(
          voice_agent_id="agent-uuid",
          prompt="You are helpful"
      )
      ```
    </Update>

    <Update label="2026-02-11" description="v1.0.0-beta.1" tags={["Voice Agent Manager"]}>
      Initial beta release.

      **Added**

      * `MossVoiceClient` for deploying voice agents to LiveKit
      * `deploy()` method with custom Python function tools support
      * Automatic source code extraction for custom tools
      * Project-based authentication (X-Project-Id, X-Project-Key)
      * Zero external dependencies (uses Python standard library)
    </Update>

    <Update label="2026-02-11" description="v1.0.0-beta.1" tags={["Voice Server"]}>
      Initial beta release.

      **Added**

      * `MossVoiceServer` class for managing voice agent connections
      * `MossVoiceServer.create()` - Fetch and initialize credentials from Moss API
      * `voiceServer.getServerUrl()` - Get voice agent server URL
      * `voiceServer.createParticipantToken()` - Generate participant tokens
      * `voiceServer.getAgentName()` - Get configured agent name
      * Automatic credential caching
      * Full TypeScript support with JSDoc
    </Update>

    <Update label="2026-02-06" description="v1.0.0-beta.14" tags={["Python SDK"]}>
      * Query latency reduced from \~2,300ms to \~10ms for 100K vectors
      * Optimized search pipeline reducing memory allocations
      * Significantly reduced memory overhead for large indexes (100K+ documents) in the context of hybrid search (keyword + semantic)
      * Enhanced performance across all index sizes
    </Update>

    <Update label="2026-02-03" description="v1.0.0-beta.2" tags={["md-indexer"]}>
      * Fixed ESM related conflicts
    </Update>

    <Update label="2026-02-02" description="v1.0.0-beta.13" tags={["Python SDK"]}>
      **Added**

      * **Hot Reload & Auto-Refresh**: Indexes can now automatically detect and reload when updated in the cloud.
        * `load_index()` now accepts optional `auto_refresh` and `polling_interval_in_seconds` parameters
        * When `auto_refresh` is enabled, the SDK polls for updates at the configured interval (default: 600 seconds)
        * To stop auto-refresh, call `load_index()` again without the `auto_refresh` option
      * `load_index()` now allows reloading an already-loaded index (previously threw an error)
      * Index management now uses Rust core for improved performance and reliability
    </Update>

    <Update label="2026-02-02" description="v1.0.0-beta.6" tags={["JavaScript SDK"]}>
      **Added**

      * **Hot Reload & Auto-Refresh**: Indexes can now automatically detect and reload when updated in the cloud.
        * `loadIndex()` now accepts optional `LoadIndexOptions` with `autoRefresh` and `pollingIntervalInSeconds` parameters
        * When `autoRefresh` is enabled, the SDK polls for updates at the configured interval (default: 600 seconds)
        * To stop auto-refresh, call `loadIndex()` again without the `autoRefresh` option
      * `loadIndex()` now allows reloading an already-loaded index (previously threw an error)
    </Update>

    <Update label="2026-01-30" description="v1.0.0-beta.12" tags={["Python SDK"]}>
      * Adds partial support for Python 3.14 by disabling local embedding service functionality. Full support coming soon.
    </Update>

    <Update label="2026-01-29" description="v1.0.0-beta.11" tags={["Python SDK"]}>
      * Adds support for user-supplied embeddings.
      * `query()` now automatically falls back to the cloud API when the index is not loaded locally, enabling queries without requiring `load_index()` first.
      * Adds better scoring evaluation for search results
    </Update>

    <Update label="2026-01-29" description="v1.0.0-beta.5" tags={["JavaScript SDK"]}>
      **Added**

      * Query optimizations for custom-embedding workflow
    </Update>

    <Update label="2026-01-28" description="v1.0.0-beta.4" tags={["JavaScript SDK"]}>
      **Fixed**

      * Fixed `ReferenceError: process is not defined` crash in browser environments. The SDK now works seamlessly across all JavaScript runtimes including browsers, Node.js, Deno, and Bun.
    </Update>

    <Update label="2026-01-26" description="v1.0.0-beta.10" tags={["Python SDK"]}>
      * Removes the '\<2' upper bound on numpy dependency.
    </Update>

    <Update label="2026-01-24" description="v1.0.0-beta.3" tags={["JavaScript SDK"]}>
      **Added**

      * Support for user-supplied document embeddings during ingestion. The SDK supports optional `embedding` arrays in `DocumentInfo` payloads without using the native embedding service from moss.
      * Query overloads now accept `QueryOptions` so users can provide a custom embedding alongside query text.
      * Relaxed `modelId` requirement when creating indexes. The SDK aligns with the service default of `moss-minilm` when no explicit model is provided.
      * `query()` now automatically falls back to the cloud API when the index is not loaded locally, enabling queries without requiring `loadIndex()` first.

      **Enhancements**

      * New service endpoint with significant infrastructure upgrades. Management operations are now \~3× faster across most real-world use cases, providing faster index operations while also supporting larger payloads.
    </Update>

    <Update label="2026-01-18" description="v0.0.2" tags={["Pipecat"]}>
      **Added**

      * Support for Pipecat v0.0.99.
      * Support for LLMContext and LLMContextAggregatorPair
      * removed deprecated OpenAILLMContext and OpenAILLMContextAggregatorPair
    </Update>

    <Update label="2026-01-14" description="v1.0.0-beta.9" tags={["Python SDK"]}>
      * Drops support for Python 3.9 and below.
      * Bug fix: Keyword search now functions correctly after `load_index()`.
      * New service endpoint with significant infrastructure upgrades. Management operations are now \~3× faster across most real-world use cases, providing faster index operations while also supporting larger payloads.
    </Update>

    <Update label="2026-01-05" description="v1.0.0-beta.1" tags={["md-indexer"]}>
      * function-based API for programmatic usage
        * Exported `sync()` function for building and uploading in one call
        * Exported `buildJsonDocs()` function for building search index programmatically
        * Exported `uploadDocuments()` function for uploading documents programmatically
        * Exported `createIndex()` function for uploading an existing index file
        * Functions can be imported and called directly in code
        * Support for passing credentials via function options or environment variables
        * Functions return structured data (e.g., `{ success: boolean, count: number }`)
    </Update>

    <Update label="2025-12-29" description="v0.0.1" tags={["Pipecat"]}>
      **Added**

      * Initial release of `pipecat-moss` integration.
      * `MossRetrievalService` for augmenting Pipecat LLM contexts with retrieved documents
      * Example `moss-retrieval-demo.py` demonstrating a full voice pipeline with retrieval.
      * `moss-create-index-demo.py` for creating and populating a Moss index.
    </Update>

    <Update label="2025-12-15" description="v1.0.0-beta.8" tags={["Python SDK"]}>
      * Updates `inferedge-moss-core` dependency to version 0.2.3 for new ARM64 wheel support.
    </Update>

    <Update label="2025-12-01" description="v1.0.0-beta.7" tags={["Python SDK"]}>
      Adds IntelliSense support in all the IDEs
    </Update>

    <Update label="2025-11-30" description="v1.0.0-beta.2" tags={["JavaScript SDK"]}>
      **Fixed**

      * Fixed ESM (ES Module) import compatibility issue. The package now correctly exports as an ES module and can be imported using standard ESM syntax.

      **Upgrade Instructions**

      * Migrate from CommonJS (`require`) to ES Module syntax (`import`).
    </Update>

    <Update label="2025-11-29" description="v1.0.0-beta.6" tags={["Python SDK"]}>
      Adds support for keyword search and alpha blending between keyword and semantic search.
    </Update>

    <Update label="2025-10-23" description="v1.0.0-beta.5" tags={["Python SDK"]}>
      Removes Pipecat integration and MossContextRetriever from the SDK. Will be offered as a pipecat extension instead soon.
    </Update>

    <Update label="2025-10-09" description="v1.0.0-beta.4" tags={["Python SDK"]}>
      Performance improvements for query() calls.
    </Update>

    <Update label="2025-10-09" description="v1.0.0-beta.3" tags={["Python SDK"]}>
      **New Features**

      * **MossContextRetriever**: Added Pipecat integration for real-time voice AI applications
        * Automatically enhances LLM conversations with semantic search results from Moss indexes
        * Seamless integration with OpenAI LLM context frames
    </Update>

    <Update label="2025-10-01" description="v1.0.0-beta.1" tags={["JavaScript SDK"]}>
      Initial release of @moss-dev/moss with core features:

      * Semantic search using transformer-based embeddings
      * Lightweight embedding models for edge computing; supports proprietary "moss-minilm" and "moss-mediumlm" models
      * Multi-index support for isolated search spaces
      * Add, update, and remove documents across indexes
      * Blazing fast querying support after loading indexes
      * TypeScript support with full type definitions
    </Update>

    <Update label="2025-09-14" description="v1.0.0-beta.1" tags={["Python SDK"]}>
      Initial release of inferedge-moss with core features:

      * Semantic search using transformer-based embeddings
      * Lightweight embedding models for edge computing; supports proprietary "moss-minilm" model
      * API key validation with secure host access
      * Cloudflare CDN support for fast model loading
      * Multi-index support for isolated search spaces
      * Add, update, and remove items across indexes
      * Query interface with configurable result count
      * Performance metrics tracking
    </Update>
  </Tab>

  <Tab title="Python">
    <Update label="2026-08-26" description="v1.7.3" tags={["Python SDK"]}>
      **Added**

      * `create_index_from_files` accepts `parse_options` (`ParseOptions`): `use_high_resolution`, `segmentation_method` ("smart\_layout\_detection" or "page\_by\_page"), `ocr_mode` ("auto\_ocr" or "full\_ocr"), and `merge_tables`.
      * `session()` accepts `artifact_version` and `manifest_sha256` keyword arguments to pin a foundation model's immutable publisher release, part of the model-cache provenance hardening (#329).

      **Changed**

      * Supported `content_type` values are `application/pdf` and the DOCX MIME, matching the parse service's admission check.
      * `JobPhase` includes the crawl and parse pipeline phases.
      * Requires `inferedge-moss-core` 0.21.3 (parse options support and the moss-mediumlm 512 dimension fix).

      **Fixed**

      * Local text queries on foundation indexes without an exact model artifact identity keep the core's actionable error instead of a misleading "custom embeddings" message.

      See [Index from files](/docs/reference/python/files).
    </Update>

    <Update label="2026-07-20" description="v1.7.2" tags={["Python SDK"]}>
      **Dependencies**

      * Bump `inferedge-moss-core` to `0.21.0`. The core now publishes an **abi3 wheel** (`cp310-abi3`, installs on Python 3.10-3.14) and a **glibc ≥ 2.35 x86\_64 wheel**, so `moss` installs in common older-runtime environments - notably the TEN Framework dev container (Ubuntu 22.04 / Python 3.10), where the previous `cp312+` / `manylinux_2_38` wheels did not resolve. No API changes.
    </Update>

    <Update label="2026-07-09" description="v1.7.1" tags={["Python SDK"]}>
      **Added**

      * **Verbatim payload round-trip** (`DocumentInfo.payload`): store an opaque structured payload (e.g. a JSON string) verbatim alongside a document and get it back as-is on query/get - never embedded or searched.
      * **Stable per-device id for usage tracking**: the SDK now sources a persisted device id (`~/.moss/.moss-device-id`, `MOSS_DISABLE_TELEMETRY` opt-out) and hands it to the core, making per-device usage attribution stable across restarts.
      * **Non-blocking `create_index`.** `create_index(..., wait=False)` returns a `JobHandle` as soon as the build is submitted, instead of blocking until it completes:
        * `handle.job_id` is available immediately.
        * `handle.status()` gives a live progress readout (phase + percent) as a `JobStatusResponse`.
        * `handle.wait()` blocks until the build finishes and returns the terminal `JobStatusResponse`. It polls asynchronously, so it parks no threads and never holds the GIL.
        * New `MossClient.wait_for_job(job_id)` blocks by `job_id` alone - submit, tear down the machine, then reconnect in a fresh process to wait on or poll the build.
        * The build runs server-side, so a submitted job completes regardless of the client. `wait` defaults to `True` and is keyword-only, so existing blocking callers are unaffected.

      **Dependencies**

      * Requires `inferedge-moss-core==0.20.1`.
    </Update>

    <Update label="2026-07-07" description="v1.7.0 (superseded by 1.7.1)" tags={["Python SDK"]}>
      * First cut of non-blocking `create_index`. **Use 1.7.1 instead**, which finalized the API (`wait` is keyword-only; `JobHandle.wait()` and `MossClient.wait_for_job()` return `JobStatusResponse`) and fixed a GIL hold that could freeze the event loop while a build was submitted or awaited.
    </Update>

    <Update label="2026-06-30" description="v1.6.0" tags={["Python SDK"]}>
      **Added**

      * **Exact / graph retrieval on `SessionIndex`, at parity with the iOS SDK.** `get_docs` now accepts a deterministic-fetch `GetDocumentsOptions` - fetch by `doc_ids`, by a metadata `filter` (same dict shape as query filters; no query vector, no ranking), with `sort_by`/`ascending` ordering, and `group_by` parent grouping. New `ParentGrouping(parent_field, order_field)` collapses sibling chunks into one result per unit. `QueryOptions.group_by` applies the same grouping to semantic queries.

      ```python theme={null}
      from moss import GetDocumentsOptions, ParentGrouping
      scenes = await session.get_docs(GetDocumentsOptions(
          filter={"field": "level", "condition": {"$eq": "scene"}}, sort_by="chunk_index"))
      units = await session.get_docs(GetDocumentsOptions(
          group_by=ParentGrouping("unit_id", "chunk_index")))
      ```

      **Dependencies**

      * Bumped `inferedge-moss-core` to `0.19.0` (adds the graph-retrieval surface).
    </Update>

    <Update label="2026-06-30" description="v1.5.0" tags={["Python SDK"]}>
      **Added**

      * **Verbatim document `payload`.** `DocumentInfo` now carries an optional `payload` string - an opaque structured value (e.g. JSON) stored and returned unchanged, never embedded or searched. Set it when building/adding documents and read it back from `get_docs` / query results. Useful for keeping the full structured record alongside the embeddable `text`. Requires the new core and the index-manager service that persists it.

      **Fixed**

      * Managed (cloud) query results now surface `payload` (previously dropped when mapping the response).

      **Dependencies**

      * Bumped `inferedge-moss-core` to `0.18.0` (adds payload support through the upload/build pipeline).
    </Update>

    <Update label="2026-06-15" description="v1.4.1" tags={["Python SDK"]}>
      **Fixed**

      * Loading `moss-litelm` indexes could fail with `Deserialization error: unsupported version: 3`. These indexes use the v3 index format, which requires `inferedge-moss-core` `0.17.0`; installing `moss` now brings in that core version automatically, so `moss-litelm` indexes load out of the box with no manual dependency steps. (`moss-minilm` / `moss-mediumlm` indexes are unaffected.)

      **Dependencies**

      * Pinned `inferedge-moss-core==0.17.0`.
    </Update>

    <Update label="2026-06-02" description="v1.4.0" tags={["Python SDK"]}>
      **Dependencies**

      * Bumped `inferedge-moss-core` to `0.17.0`.
    </Update>

    <Update label="2026-05-31" description="v1.3.0" tags={["Python SDK"]}>
      **Added**

      * **Local-first session indexing** (merged from the separate `moss-session` package):
        * `MossClient.session(index_name, model_id?)` - creates a `SessionIndex`; auto-loads from cloud if an index with that name already exists, otherwise starts empty.
        * `SessionIndex.add_docs(docs, options?)` / `delete_docs(doc_ids)` / `get_docs(options?)` - local in-memory mutations and reads.
        * `SessionIndex.query(query, options?)` - semantic search over the local session index (\~1-10ms, no network). Supports the same filter syntax as `MossClient.query()`.
        * `SessionIndex.push_index()` - uploads the session index to cloud, creating or replacing the index with the same name. Documents are pushed with their locally-computed embeddings; no server-side re-embedding.
        * New exports from `moss`: `SessionIndex`, `PushIndexResult`.
      * `model_id="custom"` is supported for sessions - bring your own embeddings via `DocumentInfo.embedding` and `QueryOptions.embedding`; no local model is loaded.
    </Update>

    <Update label="2026-05-27" description="v1.2.0" tags={["Python SDK"]}>
      **Changed**

      * **`pip install moss` is now \~64% smaller.**

      **Fixed**

      * Built-in model downloads (`moss-minilm`, `moss-mediumlm`) survive slow networks: resume after an interrupted connection instead of restarting, with automatic retries and exponential backoff on transient failures. (Also in 1.1.1.)

      **Dependencies**

      * Bumped `inferedge-moss-core` to `0.14.0`.
    </Update>

    <Update label="2026-05-27" description="v1.1.1" tags={["Python SDK"]}>
      **Fixed**

      * Built-in model downloads (`moss-minilm`, `moss-mediumlm`) survive slow networks: resume after an interrupted connection instead of restarting, with automatic retries and exponential backoff on transient failures.
      * Bumped `inferedge-moss-core` to `0.12.1`.
    </Update>

    <Update label="2026-05-06" description="v1.1.0" tags={["Python SDK"]}>
      **Added**

      * `query_multi_index(names, query, options)`: search across multiple loaded indexes; returns the global top-K with each doc tagged by source `index_name`. Embedding-only; `options.alpha` is ignored.
      * `load_indexes(names, ...)` / `unload_indexes(names)`: bulk lifecycle. `load_indexes` is best-effort and returns `LoadIndexesResult { loaded, failed }`.
      * `index_name` field on `QueryResultDocumentInfo` (set on multi-index results).
      * Bumped `inferedge-moss-core` to `0.11.0`.
    </Update>

    <Update label="2026-03-29" description="v1.0.0" tags={["Python SDK"]}>
      First stable release of the `moss` Python SDK (previously published as `inferedge-moss`).

      **Import path changed:** `from moss import MossClient` (was `from inferedge_moss import ...`)

      **Features**

      * **Semantic search** with built-in on-device models (`moss-minilm`, `moss-mediumlm`); embedding computation runs in Rust for speed; custom embeddings supported via `QueryOptions.embedding`
      * **Hybrid search** with keyword + semantic search and configurable alpha blending
      * **Metadata filtering** on locally loaded indexes with rich operators (`$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`, `$in`, `$nin`, `$and`, `$or`, `$near` for geo-distance)
      * **Cloud query fallback**: `query()` automatically falls back to the cloud API when the index is not loaded locally
      * **Hot reload & auto-refresh**: `load_index()` supports `auto_refresh` with configurable polling interval to detect and reload updated indexes
      * **Async bulk index pipeline**: binary upload, server-side build, poll until completion
      * **Index mutations**: `create_index`, `add_docs`, `delete_docs` return `MutationResult` with `job_id`, `index_name`, `doc_count`
      * **Multi-index support** for isolated search spaces
      * **Python 3.10 to 3.14** supported
    </Update>

    <Update label="2026-03-24" description="v1.0.0-beta.19" tags={["Python SDK"]}>
      * Updated `inferedge-moss-core` dependency to `0.8.7`
      * Telemetry improvements
      * Embedding computation for built-in models (`moss-minilm`, `moss-mediumlm`) now runs in Rust; custom embeddings continue to be supported via `QueryOptions.embedding`
      * Fixed `list_indexes()` failing when the cloud API returns `null` for certain `IndexInfo` fields on indexes created by older SDK versions
    </Update>

    <Update label="2026-03-12" description="v1.0.0-beta.18" tags={["Python SDK"]}>
      * Telemetry improvements
    </Update>

    <Update label="2026-02-26" description="v1.0.0-beta.17" tags={["Python SDK"]}>
      **Added**

      * **Metadata Filtering**: `query()` now accepts an optional `filter` dict to narrow results by document metadata on locally loaded indexes
        * Comparison operators: `$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`
        * Set operators: `$in`, `$nin`
        * Composable with `$and` / `$or` for complex predicates (supports arbitrary nesting)
        * Numeric coercion: int and float filter values are automatically converted to strings for consistent matching
      * **Geo-distance filtering**: new `$near` operator filters documents by haversine distance from a `"lat,lng,radiusMeters"` value
      * When `filter` is passed to `query()` but the index is not loaded locally, a warning is logged and the filter is skipped (cloud query API does not yet support filtering)
      * Updated `inferedge-moss-core` dependency to `0.6.0`
    </Update>

    <Update label="2026-02-23" description="v1.0.0-beta.16" tags={["Python SDK"]}>
      * Bumped `inferedge-moss-core` dependency to `0.5.0` to support session index telemetry and `push_index` improvements
    </Update>

    <Update label="2026-02-17" description="v1.0.0-beta.15" tags={["Python SDK"]}>
      * All index mutations and reads now go through the Rust ManageClient, replacing the Python HTTP layer
      * Index creation uses an async bulk pipeline: binary upload → server-side build → poll until completion
      * `load_index` supports both V1 and V2 binary formats, with cloud query fallback when index isn't loaded locally
      * New return type `MutationResult` (with `job_id`, `index_name`, `doc_count`) for `create_index`, `add_docs`, `delete_docs`
      * `get_docs` takes `doc_ids` directly instead of wrapping in `GetDocumentsOptions`
    </Update>

    <Update label="2026-02-06" description="v1.0.0-beta.14" tags={["Python SDK"]}>
      * Query latency reduced from \~2,300ms to \~10ms for 100K vectors
      * Optimized search pipeline reducing memory allocations
      * Significantly reduced memory overhead for large indexes (100K+ documents) in the context of hybrid search (keyword + semantic)
      * Enhanced performance across all index sizes
    </Update>

    <Update label="2026-02-02" description="v1.0.0-beta.13" tags={["Python SDK"]}>
      **Added**

      * **Hot Reload & Auto-Refresh**: Indexes can now automatically detect and reload when updated in the cloud.
        * `load_index()` now accepts optional `auto_refresh` and `polling_interval_in_seconds` parameters
        * When `auto_refresh` is enabled, the SDK polls for updates at the configured interval (default: 600 seconds)
        * To stop auto-refresh, call `load_index()` again without the `auto_refresh` option
      * `load_index()` now allows reloading an already-loaded index (previously threw an error)
      * Index management now uses Rust core for improved performance and reliability
    </Update>

    <Update label="2026-01-30" description="v1.0.0-beta.12" tags={["Python SDK"]}>
      * Adds partial support for Python 3.14 by disabling local embedding service functionality. Full support coming soon.
    </Update>

    <Update label="2026-01-29" description="v1.0.0-beta.11" tags={["Python SDK"]}>
      * Adds support for user-supplied embeddings.
      * `query()` now automatically falls back to the cloud API when the index is not loaded locally, enabling queries without requiring `load_index()` first.
      * Adds better scoring evaluation for search results
    </Update>

    <Update label="2026-01-26" description="v1.0.0-beta.10" tags={["Python SDK"]}>
      * Removes the '\<2' upper bound on numpy dependency.
    </Update>

    <Update label="2026-01-14" description="v1.0.0-beta.9" tags={["Python SDK"]}>
      * Drops support for Python 3.9 and below.
      * Bug fix: Keyword search now functions correctly after `load_index()`.
      * New service endpoint with significant infrastructure upgrades. Management operations are now \~3× faster across most real-world use cases, providing faster index operations while also supporting larger payloads.
    </Update>

    <Update label="2025-12-15" description="v1.0.0-beta.8" tags={["Python SDK"]}>
      * Updates `inferedge-moss-core` dependency to version 0.2.3 for new ARM64 wheel support.
    </Update>

    <Update label="2025-12-01" description="v1.0.0-beta.7" tags={["Python SDK"]}>
      Adds IntelliSense support in all the IDEs
    </Update>

    <Update label="2025-11-29" description="v1.0.0-beta.6" tags={["Python SDK"]}>
      Adds support for keyword search and alpha blending between keyword and semantic search.
    </Update>

    <Update label="2025-10-23" description="v1.0.0-beta.5" tags={["Python SDK"]}>
      Removes Pipecat integration and MossContextRetriever from the SDK. Will be offered as a pipecat extension instead soon.
    </Update>

    <Update label="2025-10-09" description="v1.0.0-beta.4" tags={["Python SDK"]}>
      Performance improvements for query() calls.
    </Update>

    <Update label="2025-10-09" description="v1.0.0-beta.3" tags={["Python SDK"]}>
      **New Features**

      * **MossContextRetriever**: Added Pipecat integration for real-time voice AI applications
        * Automatically enhances LLM conversations with semantic search results from Moss indexes
        * Seamless integration with OpenAI LLM context frames
    </Update>

    <Update label="2025-09-14" description="v1.0.0-beta.1" tags={["Python SDK"]}>
      Initial release of inferedge-moss with core features:

      * Semantic search using transformer-based embeddings
      * Lightweight embedding models for edge computing; supports proprietary "moss-minilm" model
      * API key validation with secure host access
      * Cloudflare CDN support for fast model loading
      * Multi-index support for isolated search spaces
      * Add, update, and remove items across indexes
      * Query interface with configurable result count
      * Performance metrics tracking
    </Update>
  </Tab>

  <Tab title="JavaScript">
    <Update label="2026-08-26" description="v1.7.1" tags={["JavaScript SDK"]}>
      **Fixed**

      * `createIndexFromFiles` with in-memory `data` (Uint8Array, ArrayBuffer, Blob, or File) failed at the native boundary with "Failed to get Array length on JsParseFileInput.data"; bytes are now marshalled in the representation the binding accepts. The `path` flow was unaffected.

      See [Index from files](/docs/reference/js/files).
    </Update>

    <Update label="2026-08-26" description="v1.7.0" tags={["JavaScript SDK"]}>
      * New `CreateIndexFromFilesOptions.parseOptions` (`ParseOptions`, now exported): control server-side extraction with `useHighResolution`, `segmentationMethod` (`smart_layout_detection` or `page_by_page`), `ocrMode` (`auto_ocr` or `full_ocr`, the latter for scanned documents with no text layer), and `mergeTables`. Requires `@moss-dev/moss-core` `0.23.0`.
      * `ParseFileInput.contentType` supports `application/pdf` and the DOCX MIME, matching the parse service's admission check; unsupported types fail fast locally with a clear error.
      * `JobProgress.currentPhase` includes the crawl and parse pipeline phases (`queued`, `crawling`, `parsing_documents`, `parsing`, `waiting_for_parser`, `parsing_complete`).
      * Local text queries on server-built foundation indexes without an exact model artifact identity are refused with an actionable error instead of embedding against a guessed artifact; explicit query embeddings and cloud queries are unaffected.
    </Update>

    <Update label="2026-08-06" description="v1.6.0" tags={["JavaScript SDK"]}>
      * New `MossClientOptions.identity` (`MossIdentity`): pass a stable caller-managed `deviceId` and optional `userId` at construction. The caller's `deviceId` is emitted as the billable telemetry `deviceId` (Monthly Active Device key); Moss's stable UUID is always emitted alongside as `mossDeviceId` for correlation; `userId` is never billable. Values must be 1-256 UTF-8 bytes with no surrounding whitespace, control or format characters, lone surrogates, or replacement characters; invalid values throw at construction. Without a configured identity, `deviceId` and `mossDeviceId` both carry Moss's UUID, so existing billing behavior is unchanged. Requires `@moss-dev/moss-core` `0.22.0`; constructing with an identity on an older core fails fast with an actionable error. Opt out of telemetry with `MOSS_DISABLE_TELEMETRY=1` as before.
    </Update>

    <Update label="2026-07-13" description="v1.4.0" tags={["JavaScript SDK"]}>
      * New: SessionIndex.close() and MossClient.close(), both idempotent, plus Symbol.asyncDispose support so `await using` works on Node 24. Closing releases the native index, pollers, and the session's reference to the shared embedding model (the service is dropped when the last session using it closes; the allocator retains and reuses those pages for the next load, so footprint stays bounded at one model per model id). Threads are no longer per-session. Concurrent close() callers share one completion promise and all settle when disposal finishes.
      * Published type declarations no longer force consumers to enable the ESNext.Disposable lib (the bundle carries the reference itself); consumers need TypeScript 5.2 or newer.
      * README and samples now demonstrate the close() / await using lifecycle.
      * MossClient.close() now also closes every live session created by that client (tracked via weak references); sessions can still be closed individually first.
      * close() fails loudly when the installed @moss-dev/moss-core predates the lifecycle API instead of silently leaking; this release requires @moss-dev/moss-core 0.20.0.
      * Declared engines: node >= 20.4 (first Node release where Symbol.asyncDispose exists).
    </Update>

    <Update label="2026-07-09" description="v1.3.2" tags={["JavaScript SDK"]}>
      **Changed**

      * Picks up `@moss-dev/moss-core` `0.19.2` (dependency currency; native-binding `DocumentInfo.payload` round-trip fix). No SDK API changes. (Prior `1.3.1` release re-run failed because the version was not bumped; this restores a publishable version.)
    </Update>

    <Update label="2026-06-26" description="v1.3.1" tags={["JavaScript SDK"]}>
      **Fixed**

      * **Fixed a native crash when re-saving an on-disk session.** Calling `saveToDisk` on a session previously restored with `loadFromDisk` could crash the process while writing the on-disk index, because the index file was rewritten in place while the loaded session was still reading from it. `saveToDisk` still persists immediately, but now writes to a temporary file and atomically renames it into place, so the file the live session is reading from is never rewritten underneath it. Requires `@moss-dev/moss-core` `0.19.1`.
    </Update>

    <Update label="2026-06-25" description="v1.3.0" tags={["JavaScript SDK"]}>
      **Added**

      * **Sessions work with a custom `IAuthenticator`.** `MossClient.session()` now works when the client is constructed with a custom authenticator (short-lived tokens / delegated auth), not just a static project key - it previously threw. The session authenticates (credential validation, `pushIndex`, `loadIndex`) and reports usage through the same auth bridge as `loadIndex`. Requires `@moss-dev/moss-core` `0.19.0` (adds the `SessionIndex.withAuthenticator` napi factory).
    </Update>

    <Update label="2026-06-25" description="v1.2.1" tags={["JavaScript SDK"]}>
      **Added**

      * **Client-level `cachePath`.** `new MossClient(projectId, key, { cachePath })` (and the `IAuthenticator` overload) sets one location for the per-device telemetry id, honored by every operation that emits telemetry - `loadIndex`, `session`, and so on. Set it once instead of per call.

      **Fixed**

      * **Session telemetry now carries the per-device id.** `MossClient.session()` now attaches the anonymous `deviceId` to `session.*` telemetry events, matching `loadIndex`. Previously only the `loadIndex` path attached a `deviceId`, so usage from session-only clients was reported without one.
      * The per-device id is now resolved once and shared across `loadIndex` and `session()` within a client, so a client that uses both surfaces reports a single, consistent id.

      **Changed**

      * The per-device id location is now resolved with this precedence: the client-level `cachePath`, then the `cachePath` passed to `loadIndex` (back-compat), then a per-user fallback, `<home>/.moss/.moss-device-id`. Previously the id was only written when `loadIndex` was given a `cachePath`.
    </Update>

    <Update label="2026-06-23" description="v1.2.0" tags={["JavaScript SDK"]}>
      **Added**

      * **Usage telemetry on the custom-authenticator path.** Automatic, privacy-light usage telemetry now works when the client is constructed with a custom `IAuthenticator` (e.g. short-lived tokens), not just a plain project key - previously it was silently disabled on that path. This enables device-level usage reporting for client-side / delegated-auth deployments.
      * A stable, anonymous per-device id is generated once and persisted at `<cachePath>/.moss-device-id` (the `cachePath` you already pass to `loadIndex`), then attached to telemetry as `deviceId`. It is a random UUID - no hardware identifier, no PII.
      * Opt out entirely with `MOSS_DISABLE_TELEMETRY=1`.
      * Bumped `@moss-dev/moss-core` to `0.18.0` (adds the `setDeviceId` napi binding and auth-provider telemetry).
    </Update>

    <Update label="2026-06-03" description="v1.1.0" tags={["JavaScript SDK"]}>
      **Added**

      * **`MossClient.session(name, modelId?)`** - local-first session index. Construct a session, add/delete/get documents and run queries entirely in-process (no cloud round-trip per operation), then `pushIndex()` to persist to the cloud. Also `loadIndex(indexName, { autoRefresh, pollingIntervalInSeconds })` to pull an existing cloud index into the session.
      * New top-level exports: `SessionIndex`, `PushIndexResult`, `LoadSessionOptions`.
      * Bumped `@moss-dev/moss-core` to `0.17.0` (adds the `SessionIndex` napi binding).
    </Update>

    <Update label="2026-05-05" description="v1.0.2" tags={["JavaScript SDK"]}>
      **Changed**

      * Bumped `@moss-dev/moss-core` dependency from `0.9.1` to `0.10.0`, which adds prebuilt binaries for `x86_64-apple-darwin` (Intel Macs) and realigns the npm package version with the underlying Rust core.
    </Update>

    <Update label="2026-04-17" description="v1.0.1" tags={["JavaScript SDK"]}>
      **Added**

      * **Custom authenticator** for browser-safe authentication: new `MossClient.withAuthenticator()` and `IndexManager.withAuthenticator()` factory methods accept a JS-side token callback, backed by `JsAuthBridge` in `@moss-dev/moss-core` (#226).

      **Changed**

      * `CLOUD_API_MANAGE_URL` replaced by granular constants: `CLOUD_API_IDENTITY_URL`, `CLOUD_API_AUTH_URL`, etc. (#226).
    </Update>

    <Update label="2026-04-01" description="v1.0.0" tags={["JavaScript SDK"]}>
      **Architecture**

      * **Rust-native core**: The SDK now delegates all index management, querying, and embedding generation to `@moss-dev/moss-core` (Rust via NAPI-RS), replacing the previous pure-JavaScript implementations
      * **Node-only**: Dropped browser/WASM support; the SDK targets Node.js 20+ exclusively
      * Query embeddings are now generated in Rust (`queryText` / `loadQueryModel`), matching the Python SDK architecture

      **Changed**

      * Package renamed from `@inferedge/moss` to `@moss-dev/moss`
      * NAPI binding renamed from `moss-core` to `@moss-dev/moss-core` (v0.8.7, tracking Rust core version)
      * `query()` uses Rust-native `queryText()` for local queries (no JS embedding pipeline)
      * `query()` with `embedding` option uses Rust `query()` directly
      * `query()` falls back to cloud HTTP when index is not loaded locally
    </Update>

    <Update label="2026-03-30" description="v1.0.0-beta.8" tags={["JavaScript SDK"]}>
      **Added**

      * **Filesystem Index Caching**: `loadIndex()` now accepts an optional `cachePath` in `LoadIndexOptions` to cache index binaries and documents to disk (Node.js/Bun only)
        * Cache is automatically invalidated when the cloud index is updated
        * Auto-refresh also persists refreshed data to the cache
        * Atomic writes prevent cache corruption from partial/interrupted writes
        * Path traversal protection on index names
        * Graceful fallback to re-download if cached data is corrupted
      * **Metadata Filtering**: `query()` now accepts an optional `filter` in `QueryOptions` to narrow results by document metadata on locally loaded indexes
        * Comparison operators: `$eq`, `$ne`, `$gt`, `$gte`, `$lt`, `$lte`
        * Set operators: `$in`, `$nin`
        * Composable with `$and` / `$or` for complex predicates (supports arbitrary nesting)
        * Numeric coercion: number filter values are automatically stringified for consistent matching
      * **Geo-distance filtering**: new `$near` operator filters documents by haversine distance from a `"lat,lng,radiusMeters"` value
      * New exported types: `FilterCondition`, `MetadataFilter`
    </Update>

    <Update label="2026-02-18" description="v1.0.0-beta.7" tags={["JavaScript SDK"]}>
      **Added**

      * Async job-based mutations (`createIndex`, `addDocs`, `deleteDocs`) with built-in polling and `onProgress` callbacks
      * Large index support - up to 100k documents via presigned upload + server-side build
      * New binary index format with smaller payloads and faster deserialization; existing indexes using the previous format are still supported
    </Update>

    <Update label="2026-02-02" description="v1.0.0-beta.6" tags={["JavaScript SDK"]}>
      **Added**

      * **Hot Reload & Auto-Refresh**: Indexes can now automatically detect and reload when updated in the cloud.
        * `loadIndex()` now accepts optional `LoadIndexOptions` with `autoRefresh` and `pollingIntervalInSeconds` parameters
        * When `autoRefresh` is enabled, the SDK polls for updates at the configured interval (default: 600 seconds)
        * To stop auto-refresh, call `loadIndex()` again without the `autoRefresh` option
      * `loadIndex()` now allows reloading an already-loaded index (previously threw an error)
    </Update>

    <Update label="2026-01-29" description="v1.0.0-beta.5" tags={["JavaScript SDK"]}>
      **Added**

      * Query optimizations for custom-embedding workflow
    </Update>

    <Update label="2026-01-28" description="v1.0.0-beta.4" tags={["JavaScript SDK"]}>
      **Fixed**

      * Fixed `ReferenceError: process is not defined` crash in browser environments. The SDK now works seamlessly across all JavaScript runtimes including browsers, Node.js, Deno, and Bun.
    </Update>

    <Update label="2026-01-24" description="v1.0.0-beta.3" tags={["JavaScript SDK"]}>
      **Added**

      * Support for user-supplied document embeddings during ingestion. The SDK supports optional `embedding` arrays in `DocumentInfo` payloads without using the native embedding service from moss.
      * Query overloads now accept `QueryOptions` so users can provide a custom embedding alongside query text.
      * Relaxed `modelId` requirement when creating indexes. The SDK aligns with the service default of `moss-minilm` when no explicit model is provided.
      * `query()` now automatically falls back to the cloud API when the index is not loaded locally, enabling queries without requiring `loadIndex()` first.

      **Enhancements**

      * New service endpoint with significant infrastructure upgrades. Management operations are now \~3× faster across most real-world use cases, providing faster index operations while also supporting larger payloads.
    </Update>

    <Update label="2025-11-30" description="v1.0.0-beta.2" tags={["JavaScript SDK"]}>
      **Fixed**

      * Fixed ESM (ES Module) import compatibility issue. The package now correctly exports as an ES module and can be imported using standard ESM syntax.

      **Upgrade Instructions**

      * Migrate from CommonJS (`require`) to ES Module syntax (`import`).
    </Update>

    <Update label="2025-10-01" description="v1.0.0-beta.1" tags={["JavaScript SDK"]}>
      Initial release of @moss-dev/moss with core features:

      * Semantic search using transformer-based embeddings
      * Lightweight embedding models for edge computing; supports proprietary "moss-minilm" and "moss-mediumlm" models
      * Multi-index support for isolated search spaces
      * Add, update, and remove documents across indexes
      * Blazing fast querying support after loading indexes
      * TypeScript support with full type definitions
    </Update>
  </Tab>

  <Tab title="Moss CLI">
    <Update label="2026-04-24" description="v0.1.1" tags={["CLI"]}>
      * Added named **config profiles** to switch between accounts and projects, and an **interactive mode** for `moss query`.
    </Update>

    <Update label="2026-03-29" description="v0.1.0" tags={["CLI"]}>
      * **Initial release** - CLI wrapper for the Moss Python SDK (v1.0.0)
      * Index management: `moss index create`, `list`, `get`, `delete`
      * Document management: `moss doc add`, `delete`, `get`
      * Semantic search: `moss query` with `--cloud`, `--filter`, `--alpha`, `--top-k`
      * Job tracking: `moss job status` with `--wait` for live progress
      * Interactive credential setup: `moss init`
      * Three-tier auth resolution: CLI flags > env vars > config file
      * JSON and CSV document input, stdin piping with `--file -`
      * `--json` flag on all commands for machine-readable output
      * Rich terminal output: tables, progress spinners, colored status
    </Update>
  </Tab>

  <Tab title="Portal">
    <Update label="2026-04-04" tags={["Portal"]}>
      * Refreshed dashboard aesthetic and added **multi-org support** with team management.
    </Update>

    <Update label="2026-02-24" tags={["Portal"]}>
      * Billing UI updates.
    </Update>

    <Update label="2026-02-23" tags={["Portal"]}>
      * Self-service **password and profile updates** from account settings.
    </Update>
  </Tab>

  <Tab title="API">
    <Update label="2026-09-01" tags={["API"]}>
      * **Web sources**: crawl a website into an index via new `/v1/manage` actions (`createWebSource`, `listWebSources`, `getWebSource`, `resyncWebSource`, `updateWebSource`, `deleteWebSource`), with optional daily or weekly refresh schedules and linked PDF/DOCX parsing. See [Create Web Source](/docs/api-reference/v1/web-sources/createWebSource).
    </Update>
  </Tab>
</Tabs>

## Packages covered

Each entry in the **All** tab is labelled with one of these tags. Dates are the release dates recorded in each package changelog.

| Tag                 | Package                                                            | Latest entry                |
| ------------------- | ------------------------------------------------------------------ | --------------------------- |
| Python SDK          | `moss` on PyPI                                                     | v1.7.3 (2026-08-26)         |
| JavaScript SDK      | `@moss-dev/moss` on npm                                            | v1.7.1 (2026-08-26)         |
| Browser SDK         | `@moss-dev/moss-web` on npm                                        | v1.0.0 (2026-04-19)         |
| Swift SDK           | SwiftPM tag on `usemoss/moss`                                      | v0.6.2 (2026-06-29)         |
| Elixir SDK          | `moss` on Hex                                                      | v1.1.0 (2026-08-26)         |
| C SDK               | `libmoss` GitHub release on `usemoss/moss`                         | v0.9.0 (2026-04-09)         |
| CLI                 | `moss-cli` on PyPI                                                 | v0.1.1 (2026-04-24)         |
| moss-agent          | `moss-agent` on PyPI                                               | v1.0.0 (2026-05-21)         |
| Voice Agent Manager | `moss-voice-agent-manager` on PyPI                                 | v1.0.0-beta.15 (2026-07-08) |
| Voice Server        | `@moss-tools/voice-server` on npm                                  | v1.0.0-beta.3 (2026-02-21)  |
| Founding Agent      | `@moss-tools/founding-agent` on npm                                | v0.2.0 (2026-05-13)         |
| Pipecat             | `pipecat-moss` on PyPI                                             | v0.0.5 (2026-07-14)         |
| TEN                 | `ten-moss` on PyPI                                                 | v0.1.0 (2026-07-21)         |
| ElevenLabs          | `elevenlabs-moss` on PyPI                                          | v0.0.1 (2026-03-30)         |
| VitePress           | `vitepress-plugin-moss` on npm                                     | v1.0.0-beta.2 (2026-04-28)  |
| md-indexer          | `@moss-tools/md-indexer` on npm                                    | v1.0.0-beta.3 (2026-02-18)  |
| VS Code             | Moss for VS Code (Marketplace)                                     | v0.1.0 (2026-07-10)         |
| Portal              | [portal.usemoss.dev](https://portal.usemoss.dev)                   | 2026-04-04                  |
| API                 | [REST API v1](/docs/api-reference/v1/getting-started/introduction) | 2026-09-01                  |
