Skip to content

Releases

v1.2.0

Choose a tag to compare

@github-actions github-actions released this 12 Nov 17:18
03c4aed

New Feature

  • The reference extractor reads Parquet files: each file becomes a table whose rows are searchable passages cited by row, and a typed dataset. (#269)
  • knowledge.query calculates over the datasets ingested files become: a typed plan of filters, joins, groups and aggregates (or the rows themselves) runs over every row of the live snapshots, and the result carries a receipt naming each snapshot it read. (#278)
  • knowledge.synthesize takes datasets: the model proposes a knowledge.query plan from their schemas, the server checks and runs it over every row, and the answer cites the result as [knowledge.query#1]; when the task is ambiguous the answer abstains with the question to ask. (#279)
  • The TypeScript SDK sends a file for the server's extractor to parse: loom.knowledge.upload posts its bytes, loom.knowledge.waitForIngest follows the ingest job until it ends, and loom.knowledge.ingestFile does both around knowledge.ingest, from Node or a browser (Blob, File). (#281)
  • knowledge.formats lists every document format an ingest reads, the file extensions and media types that select each, and whether a configured extractor serves it, with the upload's size limit and the extensions it refuses, so a client can tell a person before sending a file that it would not be read. (#282)
  • loom knowledge migrate-originals moves the document originals still stored in ClickHouse to the S3-compatible bucket. Each one is hash-verified before and after the copy, and only then switched to the object. (#285)
  • The reference extractor reads scanned PDF pages, and pictures that cover a fifth of a page or slide, with OCR: a scan's headings, tables and text are cited by page like any page's, and a diagram's labels are searchable. Without OCR (LOOM_EXTRACTOR_OCR=off, or an image built with OCR=off) such a page or slide is reported not complete instead of read as if it held nothing. (#298)
  • The dashboard can erase or export everything Loom holds for a namespace or a user (Activity → Erasures, with each erasure's status and what it left behind), show which tokens read how much of a namespace and of one user's memory (Activity → Exposure), and forget every memory one agent wrote (Agents). (#346)
  • A deployment can keep live memory in Postgres (LOOM_STORAGE_AUTHORITY=postgres, LOOM_PG_DSN): point reads, compare-and-set and the conflict check's view of concurrent writes come from a Postgres transaction, while vectors, search and history stay in ClickHouse. ClickHouse alone stays the default. A deployment chooses the authority at its first boot, on an empty ClickHouse; one whose ClickHouse already holds memory refuses to start with LOOM_STORAGE_AUTHORITY=postgres, so it leaves the setting unset. (#158)
  • The Helm chart takes a postgres block that runs Loom with an external Postgres as the memory authority over verify-full TLS, and values-clickhouse-cloud.yaml with a guide sets up ClickHouse Cloud plus ClickHouse Managed Postgres. (#467)
  • Under the Postgres authority, loom reconcile --restored clickhouse|postgres --point <time> repairs a deployment after one of its stores is restored from a backup: the erasures and redactions the other store records past the restore point run again, and after a ClickHouse restore every revision and knowledge document committed since is published again, so nothing erased or redacted comes back. Knowledge chunks live in ClickHouse alone: the command names each source to re-chunk with loom rechunk (past 20 in a namespace, the namespace). (#460)
  • Under the Postgres storage authority, namespace.audit, namespace.validate, namespace.tune, memory.inspect and knowledge.inspect's decision counts and memory findings read memory once ClickHouse holds every write the namespace committed, and say so in skipped when it does not; a finding cites a row only while the authority still serves that version. (#391)
  • Under the Postgres storage authority, knowledge.inspect says in skipped how many document commits have not finished publishing to ClickHouse (owed and parked). It lists a document only while knowledge.get serves it at the listed version, so listed_complete is false whenever the document sections may be short. (#439)
  • Under the Postgres storage authority, knowledge ingestion jobs are kept in Postgres. A job's status and cancel read what was last saved, and a run that lost its job to another worker saves nothing more. (#447)
  • Under the Postgres authority, knowledge.inspect says how many ingestion jobs ClickHouse holds at an older version than Postgres, so the job counts and listed jobs are not read as current when they lag. (#466)
  • Under the Postgres storage authority, the knowledge dataset catalog (which snapshot serves each dataset, and its schema approval) is kept in Postgres. knowledge.dataset_approve commits only while the document and snapshot it reviewed still serve. (#465)
  • Under the Postgres authority, Loom reports how long a search waits for earlier writes to reach ClickHouse, how long a revision takes to become searchable, how many deliveries are owed or parked, and how many ClickHouse inserts its publishers make. GET /v1/health?include=postgres gains the same backlog, and the monitoring guide states the pipeline's SLOs and alerts. (#469)
  • Under LOOM_STORAGE_AUTHORITY=postgres with LOOM_PG_PAYLOAD_CLEAR_ENABLED, a memory revision keeps only its metadata in Postgres once every usable ClickHouse backup holds it. That happens past a horizon that is never shorter than LOOM_CH_BACKUP_INTERVAL_MINUTES plus 60. Before restoring a ClickHouse backup, turn the switch off; the steps are in backup and recovery. (#457)
  • Under LOOM_STORAGE_AUTHORITY=postgres, a memory.set of a key with no live head answers once Postgres commits, and each process publishes its commits to ClickHouse in shared flushes, one insert per table and month, on average one flush every LOOM_PG_PUBLISH_INTERVAL_MS (250 ms) with bursts of up to a second's worth, so loom.memory and loom.memory_embeddings get parts at that rate. (#433)
  • Under the Postgres storage authority, knowledge documents have their current version in Postgres. Two concurrent writes of one document cannot both publish or both take the same revision: the later one answers 409 PRECONDITION_FAILED, and a parked document delivery is counted in GET /v1/health?include=postgres (postgres.parked_knowledge_deliveries). Under that authority a namespace's retention_days does not expire knowledge documents or their chunks, and the server refuses to start with LOOM_RETENTION_DOCUMENTS_DAYS set. (#405)
  • Under the Postgres storage authority, knowledge.search, knowledge.outline, knowledge.synthesize and memory.stack serve only the chunks of each document's current version (a document written before its namespace had heads keeps serving every version ClickHouse holds): an older version still being retired, a deleted document whose delete is not yet published, and a write that has not committed are left out, and knowledge.search counts them in a new stale_dropped field. Under that authority knowledge.add and knowledge.bulk_add retire a source's earlier chunk versions, as knowledge.upsert does. (#441)
  • Under LOOM_STORAGE_AUTHORITY=postgres, a memory.bulk_set that writes one key twice does not hold the namespace's searches at their barrier, and a bulk write or import of a value the same identity wrote a moment ago is held by it as an exact duplicate. (#446)
  • Under the Postgres authority, the delivery worker decides a claimed search document from a durable read whenever the key's head is not the claimed revision, a deleted decision's record retirement reads its writers durably, and a knowledge job whose projection lags is sent again only from a durable read, so a failover never leaves ClickHouse with a row, or without one, because of a commit the new primary does not have. (#456)
  • The Review queue settles duplicate memories and documents (Duplicates tab, with the namespace-wide repairs), accepts or rejects facts on trial (Proposals tab), and suggests a decision for the conflict on screen. (#359)
  • Health shows the namespace's memory report, its search gates and its waiting extractions; a namespace admin applies expiry, re-embeds, removes an extractor's facts, rolls back, snapshots and restores there, and an org admin retries or dismisses projection failures. (#395)
  • The memory drawer can lock and unlock a memory, mark it as wrong, share it with every agent in the namespace, record whether it helped, redact a past version, and show the source turns it came from and the typed links into and out of it. Memory history rows carry version_text, the version as an exact decimal string. (#351)
  • Guardrails can delete the stored memories a pattern already matches, and an org admin sets the org's and a namespace's extraction rules and switches the org's model calls off or on there; Settings → Memory lists, adds and removes the namespace's memory webhooks and shows their deliveries. (#371)
  • The Library stops an ingestion while it runs, shows the typed tables a document's file became and approves their column types, and moves a collection under another; a repository's document source opens its settings, last sync and the documents it wrote. (#396)
  • knowledge.restore undoes a knowledge.delete or knowledge.bulk_delete: the document's last version and its chunks are searchable again. It never brings back what an erasure retired, and it says whether the stored original could be kept and, when it restores nothing, why. (#309)
  • Settings has a Structure tab: a namespace's record schemas and their records, its profile schema, its graph ontology and its categories, which an admin registers, approves and edits there and a writer adds ca...
Read more

v1.2.0-rc.2

v1.2.0-rc.2 Pre-release
Pre-release

Choose a tag to compare

@github-actions github-actions released this 12 Nov 16:14
03c4aed

What's Changed

  • The design-rationale bench measures feature questions and extracted rows with knowledge hits by @zlareb1 in #274
  • A search excerpt serves a decision or constraint row as stored by @zlareb1 in #276
  • The reference extractor reads Parquet as a table, its decimals exact by @zlareb1 in #269
  • Decisions are extracted from the whole document as claims cited by quotes and checked against them by @zlareb1 in #277
  • knowledge.query calculates over ingested datasets with a typed plan and a receipt by @zlareb1 in #278
  • knowledge.synthesize answers from datasets with a plan it checks and runs, and abstains when the task is ambiguous by @zlareb1 in #279
  • The ingest CLI and the Python SDK upload files for the server's extractor to parse by @zlareb1 in #280
  • The TypeScript SDK uploads a file and follows its ingest job by @zlareb1 in #281
  • knowledge.formats lists the formats an ingest reads and whether an extractor serves each by @zlareb1 in #282
  • The dashboard uploads a file for the server's extractor and follows its ingest job by @zlareb1 in #283
  • The Playwright API mock answers knowledge.formats, so the repository add dialog opens in e2e by @zlareb1 in #286
  • The Library finds a passage inside its documents, cited by revision and place by @zlareb1 in #284
  • The extractor image and the test environment pin pypdf 6.21.4 by @dependabot[bot] in #275
  • tests/analyzer/shapes.txt holds the datasets' erasure and count statements by @zlareb1 in #296
  • Frontend tests run as vitest and Playwright parts on separate runners, the budget specs after one warm-up boot by @zlareb1 in #288
  • A DOCX document's headings sit under its Title paragraph by @zlareb1 in #295
  • Five unit test files hold their literal-duplicate cases as parametrize tables by @zlareb1 in #294
  • The unit job runs the suite on every core with pytest-xdist by @zlareb1 in #287
  • Integration tests run as four parts and an isolation gates part, each on its own stack by @zlareb1 in #290
  • PDF pages are read as laid out: tables, headings, columns and page furniture by @zlareb1 in #292
  • A document-parsing bench scores the reference extractor on a labelled corpus of Loom's document shapes by @zlareb1 in #289
  • loom knowledge migrate-originals moves the originals held in ClickHouse to the bucket, hash-verified by @zlareb1 in #285
  • The detection tests' zip cases have the same ids in every worker by @zlareb1 in #299
  • The parsing bench measures what a parse does downstream: search hits cited to their page, and decision quotes found in the file by @zlareb1 in #300
  • Knowledge reads draw from their own rate bucket, and the extractor-less ingest tests configure no extractor by @zlareb1 in #291
  • The reference extractor reads scanned pages and pictures with OCR, in process by @zlareb1 in #298
  • The benchmark results report document parsing against a layout-model baseline, downstream included by @zlareb1 in #304
  • An XLSX header over two rows names each column from both rows by @zlareb1 in #308
  • A page or slide of text names the pictures, charts and diagrams it does not read by @zlareb1 in #301
  • A gdrive source syncs the .docx files of a folder whose include names them by @zlareb1 in #314
  • The unit job runs as six parts that each collect only their own files, their coverage combined in one job by @zlareb1 in #297
  • Recalled memory, tracker titles and brief goals reach the agent in id-closed data blocks, and the plugin's temp files refuse planted links by @zlareb1 in #321
  • An MCP JSON-RPC batch holds 1 to 64 requests by @zlareb1 in #330
  • A release checks its owner-granted prerequisites first, builds each architecture natively, and can be rehearsed with a dry run by @zlareb1 in #316
  • Noise sections of a document rank below close hits and stay out of a context pack by @zlareb1 in #293
  • A server whose LOOM_BIND_HOST is not loopback refuses MCP open mode and a signing or verifying key below the minimum size, and the dev ClickHouse stays on loopback by @zlareb1 in #327
  • A PDF font's ToUnicode map is read in one linear pass, not rescanned from each block opening by @zlareb1 in #339
  • code.search authorizes a one-entry namespaces list, a tracker is linked only by its admin, and a taken inbox hides its owner by @zlareb1 in #310
  • The inspector's Last recalled counts every agent read that served a memory by @zlareb1 in #311
  • A dashboard sign-in link asks before switching accounts unless this tab started the sign-in by @zlareb1 in #320
  • Every operation is on the dashboard or names why not, and the reach census gates it by @zlareb1 in #315
  • The one-line SQL comment split test checks a linear ratio, so a newline scan to the end of the text fails it by @zlareb1 in #335
  • The server image's Go and Node pins carry no fixed critical CVE: Go 1.27.3, Node 22.23.4 by @zlareb1 in #319
  • A namespace's classify endpoint off the gateway is reached only over https at a public address it vetted by @zlareb1 in #318
  • Blacklist regexes run on RE2 off the event loop, and the email and JWT detectors run in linear time by @zlareb1 in #307
  • The Assistant page opens on the namespace's overview, and a user or agent is picked from it, not typed by @zlareb1 in #306
  • The coding-agent plugins declare a minimum server version and SessionStart warns when the server is older by @zlareb1 in #328
  • main's CI is green: the canary expects memory.get's served fields, the analyzer shapes carry the new schema dump, and the coalescer windows test does not race its timers by @zlareb1 in #350
  • A synced document's Markdown export drops its pictures' base64 and marks where they were by @zlareb1 in #312
  • The dashboard erases and exports a namespace's or a user's data, and shows who read what by @zlareb1 in #346
  • bench.docparse score refuses two parses that share a name by @zlareb1 in #363
  • code.search, tracker.ask and the decision extractor match identifier regexes in linear time by @zlareb1 in #342
  • FlatBuffers union members and block headers are matched in linear time by @zlareb1 in #357
  • testing.md says CI runs on pushes to main too and only a pull request's newer push cancels its run by @zlareb1 in #364
  • The prompt-pack and code-shunt hooks match their tag and pattern regexes in linear time by @zlareb1 in #365
  • The dataset delete tests wait for the catalog's delete too and count it under FINAL by @zlareb1 in #369
  • The C++ compiler tier fetches submodule pins with the entry's GitHub token by @zlareb1 in #341
  • canCall's role table shares one object per gate, so the index chunk carries no literal per op by @zlareb1 in #375
  • A source sync reads an address's owner again just before it writes, so a document a person wrote during the fetch is left alone by @zlareb1 in #353
  • An entity name longer than 256 characters once normalised is no entity, and a point write refuses one by @zlareb1 in #366
  • A user erasure keeps the user's cancel on another writer's open ingest job, without the user's identity by @zlareb1 in #362
  • Image and link-target markup in a decision document is read in linear time by @zlareb1 in #370
  • The knowledge retrieval harnesses refuse a --param that filters the corpus by @zlareb1 in #373
  • The loom-session and loom-status skills find the Codex plugin under the loom marketplace only by @zlareb1 in #372
  • The audit-v1 and set-from-messages integration tests run under a minted token instead of skipping without self-signup by @zlareb1 in #376
  • A CSV's quote guess reads its first 4 Ki...
Read more

v1.0.1: Release 1.0.1 (#154)

Choose a tag to compare

@zlareb1 zlareb1 released this 27 Oct 07:45
cdbc3c4
The version set everywhere it lives: server, Python SDK, TypeScript SDK, web
app, root skills, and the uv and npm lock files. The coding-agent plugins stay
at 1.2.1 (nothing under integrations/ changed since v1.0.0).

Signed-off-by: pufit <pufit.dev@gmail.com>