Merge pull request #147 from samvallad33/release/v2.3.0

v2.3.0 — Cognitive Observatory + Zero-Knowledge Sync

CI 12/12 green. Also restores main to green after 8 days red (Rust 1.97 clippy + toolchain pin).
This commit is contained in:
Sam Valladares 2026-07-26 12:16:22 +08:00 committed by GitHub
commit 54f69b369e
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
367 changed files with 7093 additions and 4474 deletions

View file

@ -59,6 +59,9 @@ jobs:
- name: Test
run: cargo test --workspace
- name: Test paid cloud-sync path
run: cargo test --locked --package vestige-core --features cloud-sync cloud --lib
release-build:
name: Release Build (${{ matrix.target }})
runs-on: ${{ matrix.os }}
@ -81,7 +84,7 @@ jobs:
# runtime linking is a user concern documented in INSTALL-INTEL-MAC.md.
- os: macos-14
target: x86_64-apple-darwin
cargo_flags: "--no-default-features --features ort-dynamic,vector-search"
cargo_flags: "--no-default-features --features ort-dynamic,vector-search,cloud-sync"
- os: ubuntu-latest
target: x86_64-unknown-linux-gnu
cargo_flags: ""
@ -93,6 +96,13 @@ jobs:
with:
targets: ${{ matrix.target }}
# rust-toolchain.toml pins the toolchain, so cargo runs the pinned version
# rather than the stable one the action installed. Add the cross-compile
# target to the pinned toolchain too, or the build fails with
# "can't find crate for `core`".
- name: Add target to the pinned toolchain
run: rustup target add ${{ matrix.target }}
- name: Cache cargo
uses: actions/cache@v4
with:

View file

@ -38,7 +38,7 @@ jobs:
# generates 0 embeddings, and no model download is ever attempted.
# usearch builds cleanly on MSVC because vestige-core pins it with
# features=["fp16lib"] (see crates/vestige-core/Cargo.toml).
cargo_flags: "--no-default-features --features embeddings,ort-download,vector-search"
cargo_flags: "--no-default-features --features embeddings,ort-download,vector-search,cloud-sync,connectors"
needs_onnxruntime: false
# Intel Mac uses the ort-dynamic feature to runtime-link against a
# system libonnxruntime (Homebrew), sidestepping the missing
@ -48,7 +48,7 @@ jobs:
- target: x86_64-apple-darwin
os: macos-latest
archive: tar.gz
cargo_flags: "--no-default-features --features ort-dynamic,vector-search"
cargo_flags: "--no-default-features --features ort-dynamic,vector-search,cloud-sync,connectors"
- target: aarch64-apple-darwin
os: macos-latest
archive: tar.gz
@ -75,6 +75,13 @@ jobs:
with:
targets: ${{ matrix.target }}
# rust-toolchain.toml pins the toolchain, so cargo runs the pinned version
# rather than the stable one the action installed. Add the cross-compile
# target to the pinned toolchain too, or the build fails with
# "can't find crate for `core`".
- name: Add target to the pinned toolchain
run: rustup target add ${{ matrix.target }}
- name: Validate release version
shell: bash
env:

14
.gitignore vendored
View file

@ -142,3 +142,17 @@ fastembed-rs/
.claude/
.codebase-memory/
# Internal AI-council planning scratch + session dumps — never public
.council/
# Private business material: pricing strategy, sales playbooks, and outreach
# lists containing third parties' names and contact details. These sit in the
# working tree untracked; without this rule a single `git add -A` would publish
# real people's personal data to a public repo.
docs/business/
*.session.jsonl
blackbox-proof-*/*.jsonl
# Hermes agent-runtime conversation dumps (dated hex, tens of MB, embed system prompts)
[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]_[0-9][0-9][0-9][0-9][0-9][0-9]_[0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f][0-9a-f]

View file

@ -5,9 +5,150 @@ All notable changes to Vestige will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
## [Unreleased]
## [2.3.0] - 2026-07-26 — "Cognitive Observatory + Zero-Knowledge Sync"
### Fixed — Auto-consolidation merge: opt-out lever + protected pins honored (#142)
Two audits (39 verified fixes), three dormant features brought to life, a
raw-WebGPU dashboard, and the first Vestige Pro surface — a cloud-sync client
that refuses to sync anything it hasn't encrypted first.
### Added — Cognitive Observatory: a raw-WebGPU living memory field
The dashboard gains a full-bleed, zero-library WebGPU surface that renders the
memory graph as a living cognitive field: GPU force simulation, HDR bloom, and
a recall wavefront sweeping the **real** memory graph. Five deterministic demo
moments are driven by a URL contract (`?demo=<name>&seed=...&frame=N`):
recall-path, engram-birth, salience-rescue, forgetting-horizon, firewall —
capture mode (`?frame=N`) freezes the sim so the same URL produces identical
pixels. No Three.js, no chart library: bare-metal WebGPU engine, WGSL shaders,
DOM as instrument overlays only. The Observatory is also embedded in the main
graph page (an Observatory button beside Dream and Memory Cinema takes over
full-bleed; Esc exits), and the field is clickable — GPU picking opens the
same Memory Detail inspector Classic's picking drove.
### Added — Vestige Pro: zero-knowledge cloud-sync client + CLI/npm upgrade surfaces
The public client for the hosted Vestige Cloud managed-sync service lands
behind the optional `cloud-sync` cargo feature, and encryption is mandatory:
**the client refuses plaintext sync**. The portable archive is encrypted
on-device before upload (Argon2id KDF → XChaCha20-Poly1305 AEAD, a
self-describing `VSTGENC1` envelope) under a passphrase
(`VESTIGE_CLOUD_ENCRYPTION_KEY`) that is **never sent to the server** and is
independent of the bearer sync key — the hosted service only ever stores
ciphertext, so "we hold no keys" is literally true, and a lost passphrase means
the synced blob is unrecoverable by design (we cannot reset what we never
have). The refusal cuts both ways: the client will not upload an unencrypted
archive, and it rejects a plaintext blob on download instead of quietly
accepting it. The transport is the existing pull-merge-push portable-sync
engine over HTTP with ETag/`If-Match` optimistic concurrency, so two devices
converge without lost updates. The Pro upgrade surfaces that ship with it are
**CLI and npm only** — the `vestige sync --cloud` subscribe wall, the `--help`
and `vestige health` footers, the npm README, and the postinstall banner. The
dashboard gains no Pro surface in this release. **The hosted service is optional
and paid; local-first stays free** — the default `vestige-core` library build
links no HTTP client at all, and in the shipped server binary (whose default
features do include `connectors` and `cloud-sync`, so it links `reqwest`) the
cloud client is inert unless you set `VESTIGE_CLOUD_ENDPOINT`,
`VESTIGE_CLOUD_SYNC_KEY`, and `VESTIGE_CLOUD_ENCRYPTION_KEY` and explicitly run
`vestige sync --cloud`.
### Changed — The living field is now the main graph renderer
The main graph page defaults to the Observatory engine wherever WebGPU exists.
A new **Field | Classic** toggle in the control bar keeps the Three.js view one
click away and untouched (picking, colour modes, temporal scrubbing and legends
remain Classic features); a missing or non-functional WebGPU stack forces
Classic automatically — including the case where `'gpu' in navigator` is true
but `requestAdapter()` returns null, `requestDevice()` throws, or the device is
lost mid-session — and the choice persists in `localStorage` (the automatic
fallback deliberately does not persist, so a machine whose GPU recovers gets
the field back next session). Dream, Observatory takeover, Memory Cinema,
and Reload work in both modes.
### Changed — `smart_ingest` batch mode honors an explicit `forceCreate: false`
**Write-semantics change for existing clients.** Batch mode has defaulted to
`batchMergePolicy: "force_create"` since v2.1.23 — but under that default, an
explicit per-call `forceCreate: false` was silently inverted into a
force-create. An explicit `forceCreate` is now authoritative in both policies:
pass `forceCreate: false` and batch items go through Prediction Error Gating
(merge/update/create against existing memories) even under the default policy.
Callers that were sending `forceCreate: false` while relying on the old
always-create behavior will now see merges and updates instead of new nodes —
drop the parameter (or send `true`) to keep the old behavior.
### Fixed — 29 bugs from the full-backend adversarial audit (#139)
A backend-wide audit (18 feature areas, each finding adversarially re-verified)
surfaced 31 real bugs; this release fixes 29. Highlights: **migrations now run
in a transaction** (a mid-migration failure no longer bricks the DB),
`decide_memory_pr` rejects re-deciding a finalized PR, `suppress` reverse is a
true inverse (was leaving stability permanently halved), `update_node_content`
regenerates a stale embedding when the embedder wasn't ready, `plan_merge`
validates `survivor_id` (was an unchecked-unwrap panic), the contradiction
heuristic requires a real polarity flip (was demoting correct memories on
benign "do not" notes), and hybrid-search relevance is the min-max-normalized
RRF fused score. Full workspace stayed green (1556 tests, clippy `-D warnings`
clean).
### Fixed — Three dormant features wired live (#117, #124, #137 via #140)
Honesty first: each of these is now genuinely producing data, and none of the
three is 100% finished. The remaining edges are stated per item.
- **Agent Black Box records traces for real (#117)**: the trace recorder had
zero production callers, so `agent_traces` never populated.
`handle_tools_call` now records the opening `mcp.call` event before dispatch
and the memory events after, under a shared `run_id` — including in pure
stdio mode (was gated on a dashboard socket). **Tracing is on by default**
and writes rows to your local database on every MCP tool call; set
`VESTIGE_TRACE=0` (or `false`/`off`/`no`) to turn the recorder off. **Traces
are pruned after 30 days by default** — the consolidation cycle sweeps
`agent_traces` older than the retention window and drops any `agent_runs`
roll-up left with no events. Override with `VESTIGE_TRACE_RETENTION_DAYS`;
`0` keeps traces forever (sweep disabled). **Not yet wired**: the receipts
and memory-PR producers — those Black Box surfaces still have no production
writer and stay empty for now.
- **Recurring intentions re-arm (#124)**: `mark_triggered` advances a
recurring trigger's `next_occurrence` and returns it to Active (was firing
once and staying Triggered forever). **Not yet done**: the re-arm logic is
fixed, but recurring intentions are not yet hydrated into the live engine,
so a re-armed intention is not automatically picked up by the running
trigger loop.
- **Co-access prediction is live (#137)**: `search_unified` feeds retrieved
sets to the speculative retriever, so co-access patterns populate (were
permanently empty). **Partially wired**: #137's remaining speculative
channels are still only partially connected to production callers.
### Fixed — 10 more bugs from the second full-codebase audit (#141)
A second adversarial pass over areas the first under-covered. Majors: the FTS5
sanitizer leaked bare operators on doubled input ("foo AND AND AND"), aborting
MATCH or silently flipping AND→OR; unbounded MCP `hours_back`/`hours_forward`
and an unclamped `limit` could panic the server (DoS); and the connector
idempotency key omitted `source_project`, so two repos with overlapping issue
ids clobbered each other's memories — **migration V19** adds the project to the
key and unique index. Minors: `list_memories` honors `node_type`/`tag` on the
search path, HTTP Accept handles `*/*` wildcards, Bearer matches
case-insensitively (RFC 7235), dream insights no longer fabricate a
TemporalTrend from sentinel dates, the dashboard WebSocket can't resurrect
itself after `disconnect()`, and Redmine thread truncation keeps the newest
journals. 1559 tests + clippy clean; dashboard check green.
### Fixed — Dashboard mock data replaced with real APIs
The `/duplicates`, `/contradictions`, and `/patterns` routes shipped hardcoded
mock data — and `/duplicates` rendered a "Live" badge over it. The three mocks
are replaced (`898bd33`) with real dashboard HTTP endpoints backed by existing
core capabilities: `GET /api/duplicates` (dedup cluster detection),
`GET /api/contradictions` (trust-weighted contradiction analysis), and
`GET /api/patterns/cross-project` (cross-project pattern transfer). The "Live"
badge is now truthful. Two more honesty fixes on the same routes: `/duplicates`
loses its no-op "Merge all" button (the copy now points at the `dedup` MCP
tool, which actually performs previewable, reversible merges), and the
`/contradictions` stat card reports the number of memories actually analyzed
instead of an inflated total.
### Fixed — Auto-consolidation merge: opt-out lever + protected pins honored (#142, via #143)
The background consolidation cycle's auto-dedup pass silently concat-merges
near-duplicate memories (cosine ≥ 0.85): it keeps the strongest node, folds the
@ -21,7 +162,68 @@ available for on-demand, previewable, reversible merges regardless. Second,
unattended, contradicting the interactive contract that a protected node may only
survive a merge, never be absorbed. A protected node is now never an anchor, never
a cluster member, and thus never merged into or deleted, whether the lever is on
or off.
or off. To be plain about what did **not** change: when the pass is enabled,
its merges are still hard-deletes with no reversible trail — the lever and the
pin exclusion narrow the blast radius, they do not add a reflog. Thanks
@Vrakoss for the report and the fix.
### Docs — README rewrite; CauseBench replaced by Silent Rotation
The README is rewritten for clarity, with stale facts and a dead link fixed.
The advertised CauseBench benchmark is withdrawn: `benchmarks/causebench/` no
longer exists, so its link and repro command 404'd, and its published numbers
are retracted. It is replaced by **Silent Rotation**, which is real and
auditable — three coding agents, one failing end-to-end test, a signing key
that exists only in the memory layer, and 246 raw agent transcripts published
instead of a summary table. The headline metric is the converged-wrong column:
a no-memory fleet agrees on a planted decoy 21 times in 25; dense cosine 12 in
23. The repro is three verbatim commands verified from a fresh clone. The
ComposeBench roadmap note now points at the silent-rotation harness.
### Upgrade notes
- **BREAKING for 2.2.x cloud-sync users: encryption is no longer optional.**
In 2.2.x, `VESTIGE_CLOUD_ENCRYPTION_KEY` was optional and `vestige sync
--cloud` would upload a plaintext archive when it was unset. 2.3.0 makes
zero-knowledge encryption mandatory in **both** directions: it refuses to
start a cloud sync without a passphrase, and on download it **hard-rejects a
plaintext remote archive** ("refusing plaintext cloud archive") rather than
quietly accepting it. So if you synced plaintext under 2.2.x, 2.3.0 will not
read that blob. Recovery: on the machine that **still holds the local data**,
set `VESTIGE_CLOUD_ENCRYPTION_KEY` to a strong passphrase and re-run `vestige
sync --cloud` to re-upload an encrypted archive, then set that same
passphrase on every other device. Vestige never receives the passphrase and
cannot reset it for you.
- **Black Box tracing is on by default and writes to your database.** Every MCP
tool call now records trace rows (`agent_traces` / `agent_runs`). Set
`VESTIGE_TRACE=0` (or `false`/`off`/`no`) to opt out. **Retention changed
too**: traces older than **30 days** are pruned during the consolidation
cycle; tune with `VESTIGE_TRACE_RETENTION_DAYS`, where `0` keeps them
forever.
- **Migrations V19 and V20 run automatically.** V19 adds `source_project` to
the connector idempotency key and unique index. If you synced **two or more
projects of the same source system** (e.g. two GitHub repos) under 2.2.x,
their overlapping issue ids clobbered each other's memories. V20 then clears
the connector sync cursors, so the next `source_sync` for each project does a
full re-scan and repairs the clobbered rows **automatically** — there is no
manual step beyond running your normal sync. One caveat for large projects: a
single `source_sync` run is bounded by `max_pages`, which defaults to `10`, so
a big backlog may take more than one call (or one call with a higher
`max_pages`) before the re-scan is complete.
### Credits
This release was again driven in part by the community:
- **@Vrakoss** reported the silent auto-consolidation merge behavior (#142)
with a precise write-up of the missing opt-out and the ignored `dedup
protect` pins, and contributed the basis of the fix itself — the
`VESTIGE_AUTO_CONSOLIDATE_MERGE` lever and the protected-pin exclusion
shipped as they built them (PR #143, co-authored in `f7a782d`).
Thank you.
## [2.2.1] - 2026-07-02 — "Windows embeddings + backfill safety"

81
Cargo.lock generated
View file

@ -456,7 +456,7 @@ dependencies = [
"num_cpus",
"objc2-foundation",
"objc2-metal",
"rand",
"rand 0.9.3",
"rand_distr",
"rayon",
"safetensors 0.7.0",
@ -569,6 +569,17 @@ dependencies = [
"cpufeatures 0.2.17",
]
[[package]]
name = "chacha20"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d524456ba66e72eb8b115ff89e01e497f8e6d11d78b70b1aa13c0fbd97540a81"
dependencies = [
"cfg-if",
"cpufeatures 0.3.0",
"rand_core 0.10.1",
]
[[package]]
name = "chacha20poly1305"
version = "0.10.1"
@ -576,7 +587,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "10cd79432192d1c0f4e1a0fef9527696cc039165d729fb41b3f4f4f354c2dc35"
dependencies = [
"aead",
"chacha20",
"chacha20 0.9.1",
"cipher",
"poly1305",
"zeroize",
@ -861,9 +872,9 @@ dependencies = [
[[package]]
name = "crossbeam-epoch"
version = "0.9.18"
version = "0.9.20"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e"
checksum = "2d6914041f254d6e9176c01941b21115dcfb7089e55135a35411081bd106ef3f"
dependencies = [
"crossbeam-utils",
]
@ -1348,7 +1359,7 @@ checksum = "c2d1f04709a8ac06e8e8042875a3c466cc4832d3c1a18dbcb9dba3c6e83046bc"
dependencies = [
"half",
"num-traits",
"rand",
"rand 0.9.3",
"rand_distr",
]
@ -1769,11 +1780,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"r-efi 5.3.0",
"wasip2",
"wasm-bindgen",
]
[[package]]
@ -1783,10 +1792,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0de51e6874e94e7bf76d726fc5d13ba782deca734ff60d5bb2fb2607c7406555"
dependencies = [
"cfg-if",
"js-sys",
"libc",
"r-efi 6.0.0",
"rand_core 0.10.1",
"wasip2",
"wasip3",
"wasm-bindgen",
]
[[package]]
@ -1849,7 +1861,7 @@ dependencies = [
"cfg-if",
"crunchy",
"num-traits",
"rand",
"rand 0.9.3",
"rand_distr",
"zerocopy",
]
@ -1915,7 +1927,7 @@ dependencies = [
"libc",
"log",
"native-tls",
"rand",
"rand 0.9.3",
"reqwest",
"serde",
"serde_json",
@ -3480,14 +3492,15 @@ dependencies = [
[[package]]
name = "quinn-proto"
version = "0.11.14"
version = "0.11.16"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "434b42fec591c96ef50e21e886936e66d3cc3f737104fdb9b737c40ffb94c098"
checksum = "2f4bfc015262b9df63c8845072ce59068853ff5872180c2ce2f13038b970e560"
dependencies = [
"bytes",
"getrandom 0.3.4",
"getrandom 0.4.2",
"lru-slab",
"rand",
"rand 0.10.2",
"rand_pcg",
"ring",
"rustc-hash",
"rustls",
@ -3544,6 +3557,17 @@ dependencies = [
"rand_core 0.9.5",
]
[[package]]
name = "rand"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c7f5fa3a058cd35567ef9bfa5e75732bee0f9e4c55fa90477bef2dfcdbc4be80"
dependencies = [
"chacha20 0.10.1",
"getrandom 0.4.2",
"rand_core 0.10.1",
]
[[package]]
name = "rand_chacha"
version = "0.9.0"
@ -3572,6 +3596,12 @@ dependencies = [
"getrandom 0.3.4",
]
[[package]]
name = "rand_core"
version = "0.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69"
[[package]]
name = "rand_distr"
version = "0.5.1"
@ -3579,7 +3609,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a8615d50dcf34fa31f7ab52692afec947c4dd0ab803cc87cb3b0b4570ff7463"
dependencies = [
"num-traits",
"rand",
"rand 0.9.3",
]
[[package]]
name = "rand_pcg"
version = "0.10.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a"
dependencies = [
"rand_core 0.10.1",
]
[[package]]
@ -3609,7 +3648,7 @@ dependencies = [
"num-traits",
"paste",
"profiling",
"rand",
"rand 0.9.3",
"rand_chacha",
"simd_helpers",
"thiserror 2.0.18",
@ -3874,9 +3913,9 @@ dependencies = [
[[package]]
name = "rustls-webpki"
version = "0.103.11"
version = "0.103.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "20a6af516fea4b20eccceaf166e8aa666ac996208e8a644ce3ef5aa783bc7cd4"
checksum = "61c429a8649f110dddef65e2a5ad240f747e85f7758a6bccc7e5777bd33f756e"
dependencies = [
"ring",
"rustls-pki-types",
@ -4395,7 +4434,7 @@ dependencies = [
"monostate",
"onig",
"paste",
"rand",
"rand 0.9.3",
"rayon",
"rayon-cond",
"regex",
@ -4631,7 +4670,7 @@ dependencies = [
"http",
"httparse",
"log",
"rand",
"rand 0.9.3",
"sha1",
"thiserror 2.0.18",
"utf-8",
@ -4897,7 +4936,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
[[package]]
name = "vestige-core"
version = "2.2.1"
version = "2.3.0"
dependencies = [
"argon2",
"blake3",
@ -4938,7 +4977,7 @@ dependencies = [
[[package]]
name = "vestige-mcp"
version = "2.2.1"
version = "2.3.0"
dependencies = [
"anyhow",
"axum",

View file

@ -11,7 +11,7 @@ exclude = [
]
[workspace.package]
version = "2.2.1"
version = "2.3.0"
edition = "2024"
license = "AGPL-3.0-only"
repository = "https://github.com/samvallad33/vestige"

View file

@ -7,7 +7,7 @@ Local-first long-term memory for AI agents, delivered over MCP. Vestige remember
[![Binary](https://img.shields.io/badge/binary-25MB_single_file-informational)](https://github.com/samvallad33/vestige/releases/latest)
[![License](https://img.shields.io/badge/license-AGPL--3.0-3b82f6)](LICENSE)
[What it is](#what-vestige-is) · [Install](#install) · [First interaction](#your-first-real-interaction) · [vs RAG](#how-it-differs-from-rag) · [Backward reach](#backward-reach-the-backfill-feature) · [Benchmark](#silent-rotation-a-reproducible-benchmark) · [Science](#the-science) · [Tools](#the-13-tools) · [Dashboard](#the-dashboard) · [Integrations](#works-with-every-agent) · [Docs](#go-deeper)
[What it is](#what-vestige-is) · [Install](#install) · [First interaction](#your-first-real-interaction) · [vs RAG](#how-it-differs-from-rag) · [Backward reach](#backward-reach-the-backfill-feature) · [Benchmark](#silent-rotation-a-reproducible-benchmark) · [Science](#the-science) · [Tools](#the-13-tools) · [Dashboard](#the-dashboard) · [Integrations](#works-with-every-agent) · [Pro](#vestige-pro) · [Docs](#go-deeper)
---
@ -248,6 +248,26 @@ This is opt-in. Vestige works fine with no protocol at all.
---
## Vestige Pro
Everything above is free forever and never metered. The engine runs on your machine, with no account, no quota, and no upsell inside the product.
Vestige Pro is for when that memory needs to follow you. It is managed, end-to-end encrypted continuity of your memory graph and your accountability history (Black Box traces, receipts, memory PRs) across every machine you work on. You record a decision on the laptop, and the agent on the desktop already knows it.
| | Detail |
|---|---|
| Price | $19/month |
| What syncs | Your memory graph plus your accountability history |
| Encryption | XChaCha20-Poly1305, applied on your machine before anything is uploaded |
| Key derivation | Argon2id over a passphrase you choose |
| What the server holds | Ciphertext only |
Zero-knowledge is the design, not a setting. You pick one passphrase, you use the same one on every device, and it never leaves your machine. The server stores bytes it cannot read, and the client refuses to sync anything in plaintext. If you lose that passphrase, the encrypted data is unrecoverable, by me and by anyone else. That is the property you are paying for, not a gap in it.
**Availability.** Checkout is not open yet, so there is nothing to buy today and no payment link here pretending otherwise. The client half already ships in this release, which is why `vestige sync --cloud` exists and tells you what it needs. Subscriptions open shortly. To catch the announcement, watch [Releases](https://github.com/samvallad33/vestige/releases) or follow [Discussions](https://github.com/samvallad33/vestige/discussions).
---
## Under the hood
Vestige is a single Rust binary. No sidecar services, no external database, no cloud dependency.

View file

@ -4,8 +4,10 @@
| Version | Supported |
| ------- | ------------------ |
| 2.1.x | :white_check_mark: |
| 2.0.x | Critical fixes only |
| 2.3.x | :white_check_mark: |
| 2.2.x | Critical fixes only |
| 2.1.x | Critical fixes only |
| 2.0.x | :x: |
| 1.x | :x: |
## Reporting a Vulnerability
@ -70,10 +72,38 @@ All MCP tool inputs are validated:
### Dependencies
We use well-maintained dependencies and run `cargo audit` regularly. Current status:
We use well-maintained dependencies and run `cargo audit` as part of the release gate. Status as of the v2.3.0 audit (2026-07-25, 564 crate dependencies scanned):
- **Vulnerabilities**: 0
- **Warnings**: 2 (unmaintained transitive dependencies with no known CVEs)
- **Warnings**: 9 (3 unmaintained, 5 unsound, 1 yanked), all transitive, none with a known exploit path in Vestige
That zero is not the default state. The 2.3.0 lockfile carried 5 vulnerabilities
until three transitive dependencies were updated. Resolved for this release:
| Advisory | Crate | Issue | Resolved by |
|---|---|---|---|
| RUSTSEC-2026-0185 (7.5 high) | `quinn-proto` | Remote memory exhaustion from unbounded out-of-order stream reassembly | 0.11.14 -> 0.11.16 |
| RUSTSEC-2026-0104 | `rustls-webpki` | Reachable panic parsing a certificate revocation list | 0.103.11 -> 0.103.13 |
| RUSTSEC-2026-0098 | `rustls-webpki` | Name constraints for URI names incorrectly accepted | 0.103.11 -> 0.103.13 |
| RUSTSEC-2026-0099 | `rustls-webpki` | Name constraints accepted for certificates asserting a wildcard name | 0.103.11 -> 0.103.13 |
| RUSTSEC-2026-0204 | `crossbeam-epoch` | Invalid pointer dereference in the `fmt::Pointer` impl | 0.9.18 -> 0.9.20 |
`rustls-webpki` is the certificate validation path that Vestige Pro cloud sync
depends on, so these versions are pinned forward in `Cargo.lock` and a downgrade
is a release blocker, not a lockfile detail.
The 9 remaining warnings are not vulnerabilities and have no available fix we can
apply, because each is pulled in transitively by `fastembed`, `candle`,
`usearch`, or `git2`:
- **Unmaintained**: `core2` (RUSTSEC-2026-0105, also yanked), `number_prefix`
(RUSTSEC-2025-0119), `paste` (RUSTSEC-2024-0436)
- **Unsound**: `anyhow` (RUSTSEC-2026-0190), `cxx` (RUSTSEC-2026-0202), `git2`
(RUSTSEC-2026-0183, RUSTSEC-2026-0184), `memmap2` (RUSTSEC-2026-0186)
We track these and will pull the fixes through as soon as our direct
dependencies publish releases that carry them. We would rather print the real
number here than a zero.
## Security Checklist

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
.spine.svelte-8n8iia{position:absolute;left:8%;right:8%;bottom:calc(2.5rem + env(safe-area-inset-bottom,0px));pointer-events:none}.active-label.svelte-8n8iia{text-align:center;margin-bottom:.6rem;font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;font-size:.72rem;letter-spacing:.08em;color:#cfe9ff;text-shadow:0 0 24px rgba(30,180,255,.35);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.track.svelte-8n8iia{position:relative;height:2px;background:#ffffff12;border-radius:1px}.tick.svelte-8n8iia{position:absolute;top:50%;width:3px;height:10px;transform:translate(-50%,-50%);border-radius:2px;background:#6ef0e6;transition:opacity .2s linear}.tick.hot.svelte-8n8iia{box-shadow:0 0 12px #6ef0e6bf}.tick.backward.svelte-8n8iia{background:#ff4070}.tick.backward.hot.svelte-8n8iia{box-shadow:0 0 12px #ff4070bf}.playhead.svelte-8n8iia{position:absolute;top:50%;width:1.5px;height:16px;transform:translate(-50%,-50%);background:#cfe9ffe6;box-shadow:0 0 10px #1eb4ff80}.verdict.svelte-ssd7yu{position:fixed;left:50%;top:50%;transform:translate(-50%,-50%);text-align:center;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Helvetica,Arial,sans-serif;padding:clamp(18px,3vw,40px) clamp(28px,6vw,80px);border-radius:20px;background:radial-gradient(ellipse at center,#05070edb,#05070eb8 60%,#05070e00);pointer-events:none}.k.svelte-ssd7yu{font-size:clamp(13px,1.8vw,18px);color:#9fd0e4;letter-spacing:.16em;text-transform:uppercase}.v.svelte-ssd7yu{font-size:clamp(32px,6.4vw,72px);font-weight:600;margin-top:.12em;line-height:1.05;background:linear-gradient(90deg,#7fe6c0,#6ef0e6,#a6dcff);-webkit-background-clip:text;background-clip:text;color:transparent;filter:drop-shadow(0 0 26px rgba(110,240,220,.45))}.s.svelte-ssd7yu{font-size:clamp(11px,1.5vw,15px);color:#8fb0be;margin-top:.6em;font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;letter-spacing:.04em}.quarantine.svelte-ssd7yu .k:where(.svelte-ssd7yu){color:#ffb0a6}.quarantine.svelte-ssd7yu .v:where(.svelte-ssd7yu){background:linear-gradient(90deg,#ff6a5e,#ff9d6b,#ffd2a8);filter:drop-shadow(0 0 26px rgba(255,90,70,.45))}.quarantine.svelte-ssd7yu .s:where(.svelte-ssd7yu){color:#d9a49a}.observatory-canvas.svelte-16248mg{position:absolute;top:0;right:0;bottom:0;left:0;width:100%;height:100%;display:block;background:#05060a}.fallback.svelte-16248mg{position:absolute;top:0;right:0;bottom:0;left:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;text-align:center;padding:0 10%;font-family:SF Mono,ui-monospace,Menlo,Consolas,monospace;pointer-events:auto}.fallback-title.svelte-16248mg{color:#5dcaa5;font-size:.95rem;letter-spacing:.28em;text-shadow:0 0 20px rgba(93,202,165,.4)}.fallback-reason.svelte-16248mg{color:#9fd0e4;font-size:.8rem;letter-spacing:.04em;opacity:.85}.fallback-hint.svelte-16248mg{color:#7c8a97;font-size:.75rem;max-width:34rem;line-height:1.6}.fallback-hint.svelte-16248mg a:where(.svelte-16248mg){color:#cfe9ff;text-decoration:underline;text-underline-offset:3px}

View file

@ -1,2 +0,0 @@
import{D as z,q as dr,aD as sr,G as A,L as U,N as gr,T as pr,g as m,U as hr,W as _r,X as x,K,M as G,I as Er,aE as Ar,aF as y,w as Sr,aG as b,$ as q,aH as Tr,a1 as Nr,ao as br,z as Ir,aI as V,aJ as Mr,aK as Or,ac as Cr,aL as rr,aM as Rr,Y as ur,_ as or,aN as P,R as lr,aO as Lr,aP as wr,aQ as Hr,Z as kr,J as Dr,aR as Fr,aS as Gr,aT as zr,aU as Ur,aV as tr,aW as Kr}from"./wpu9U-D0.js";function jr(r,e){return e}function Pr(r,e,f){for(var a=[],n=e.length,s,u=e.length,v=0;v<n;v++){let g=e[v];or(g,()=>{if(s){if(s.pending.delete(g),s.done.add(g),s.pending.size===0){var t=r.outrogroups;B(V(s.done)),t.delete(s),t.size===0&&(r.outrogroups=null)}}else u-=1},!1)}if(u===0){var o=a.length===0&&f!==null;if(o){var d=f,l=d.parentNode;Hr(l),l.append(d),r.items.clear()}B(e,!o)}else s={pending:new Set(e),done:new Set},(r.outrogroups??(r.outrogroups=new Set)).add(s)}function B(r,e=!0){for(var f=0;f<r.length;f++)kr(r[f],e)}var er;function mr(r,e,f,a,n,s=null){var u=r,v=new Map,o=(e&sr)!==0;if(o){var d=r;u=A?U(gr(d)):d.appendChild(z())}A&&pr();var l=null,g=br(()=>{var c=f();return Ir(c)?c:c==null?[]:V(c)}),t,p=!0;function S(){i.fallback=l,Yr(i,t,u,e,a),l!==null&&(t.length===0?(l.f&b)===0?ur(l):(l.f^=b,k(l,null,u)):or(l,()=>{l=null}))}var T=dr(()=>{t=m(g);var c=t.length;let C=!1;if(A){var R=hr(u)===_r;R!==(c===0)&&(u=x(),U(u),K(!1),C=!0)}for(var _=new Set,M=Sr,L=Nr(),h=0;h<c;h+=1){A&&G.nodeType===Er&&G.data===Ar&&(u=G,C=!0,K(!1));var O=t[h],w=a(O,h),E=p?null:v.get(w);E?(E.v&&y(E.v,O),E.i&&y(E.i,h),L&&M.unskip_effect(E.e)):(E=qr(v,p?u:er??(er=z()),O,w,h,n,e,f),p||(E.e.f|=b),v.set(w,E)),_.add(w)}if(c===0&&s&&!l&&(p?l=q(()=>s(u)):(l=q(()=>s(er??(er=z()))),l.f|=b)),c>_.size&&Tr(),A&&c>0&&U(x()),!p)if(L){for(const[D,F]of v)_.has(D)||M.skip_effect(F.e);M.oncommit(S),M.ondiscard(()=>{})}else S();C&&K(!0),m(g)}),i={effect:T,items:v,outrogroups:null,fallback:l};p=!1,A&&(u=G)}function H(r){for(;r!==null&&(r.f&Lr)===0;)r=r.next;return r}function Yr(r,e,f,a,n){var E,D,F,X,J,W,$,Q,Z;var s=(a&wr)!==0,u=e.length,v=r.items,o=H(r.effect.first),d,l=null,g,t=[],p=[],S,T,i,c;if(s)for(c=0;c<u;c+=1)S=e[c],T=n(S,c),i=v.get(T).e,(i.f&b)===0&&((D=(E=i.nodes)==null?void 0:E.a)==null||D.measure(),(g??(g=new Set)).add(i));for(c=0;c<u;c+=1){if(S=e[c],T=n(S,c),i=v.get(T).e,r.outrogroups!==null)for(const N of r.outrogroups)N.pending.delete(i),N.done.delete(i);if((i.f&b)!==0)if(i.f^=b,i===o)k(i,null,f);else{var C=l?l.next:o;i===r.effect.last&&(r.effect.last=i.prev),i.prev&&(i.prev.next=i.next),i.next&&(i.next.prev=i.prev),I(r,l,i),I(r,i,C),k(i,C,f),l=i,t=[],p=[],o=H(l.next);continue}if((i.f&P)!==0&&(ur(i),s&&((X=(F=i.nodes)==null?void 0:F.a)==null||X.unfix(),(g??(g=new Set)).delete(i))),i!==o){if(d!==void 0&&d.has(i)){if(t.length<p.length){var R=p[0],_;l=R.prev;var M=t[0],L=t[t.length-1];for(_=0;_<t.length;_+=1)k(t[_],R,f);for(_=0;_<p.length;_+=1)d.delete(p[_]);I(r,M.prev,L.next),I(r,l,M),I(r,L,R),o=R,l=L,c-=1,t=[],p=[]}else d.delete(i),k(i,o,f),I(r,i.prev,i.next),I(r,i,l===null?r.effect.first:l.next),I(r,l,i),l=i;continue}for(t=[],p=[];o!==null&&o!==i;)(d??(d=new Set)).add(o),p.push(o),o=H(o.next);if(o===null)continue}(i.f&b)===0&&t.push(i),l=i,o=H(i.next)}if(r.outrogroups!==null){for(const N of r.outrogroups)N.pending.size===0&&(B(V(N.done)),(J=r.outrogroups)==null||J.delete(N));r.outrogroups.size===0&&(r.outrogroups=null)}if(o!==null||d!==void 0){var h=[];if(d!==void 0)for(i of d)(i.f&P)===0&&h.push(i);for(;o!==null;)(o.f&P)===0&&o!==r.fallback&&h.push(o),o=H(o.next);var O=h.length;if(O>0){var w=(a&sr)!==0&&u===0?f:null;if(s){for(c=0;c<O;c+=1)($=(W=h[c].nodes)==null?void 0:W.a)==null||$.measure();for(c=0;c<O;c+=1)(Z=(Q=h[c].nodes)==null?void 0:Q.a)==null||Z.fix()}Pr(r,h,w)}}s&&lr(()=>{var N,j;if(g!==void 0)for(i of g)(j=(N=i.nodes)==null?void 0:N.a)==null||j.apply()})}function qr(r,e,f,a,n,s,u,v){var o=(u&Mr)!==0?(u&Or)===0?Cr(f,!1,!1):rr(f):null,d=(u&Rr)!==0?rr(n):null;return{v:o,i:d,e:q(()=>(s(e,o??f,d??n,v),()=>{r.delete(a)}))}}function k(r,e,f){if(r.nodes)for(var a=r.nodes.start,n=r.nodes.end,s=e&&(e.f&b)===0?e.nodes.start:f;a!==null;){var u=Dr(a);if(s.before(a),a===n)return;a=u}}function I(r,e,f){e===null?r.effect.first=f:e.next=f,f===null?r.effect.last=e:f.prev=e}function cr(r){var e,f,a="";if(typeof r=="string"||typeof r=="number")a+=r;else if(typeof r=="object")if(Array.isArray(r)){var n=r.length;for(e=0;e<n;e++)r[e]&&(f=cr(r[e]))&&(a&&(a+=" "),a+=f)}else for(f in r)r[f]&&(a&&(a+=" "),a+=f);return a}function Br(){for(var r,e,f=0,a="",n=arguments.length;f<n;f++)(r=arguments[f])&&(e=cr(r))&&(a&&(a+=" "),a+=e);return a}function xr(r){return typeof r=="object"?Br(r):r??""}const fr=[...`
\r\f \v\uFEFF`];function Vr(r,e,f){var a=r==null?"":""+r;if(e&&(a=a?a+" "+e:e),f){for(var n of Object.keys(f))if(f[n])a=a?a+" "+n:n;else if(a.length)for(var s=n.length,u=0;(u=a.indexOf(n,u))>=0;){var v=u+s;(u===0||fr.includes(a[u-1]))&&(v===a.length||fr.includes(a[v]))?a=(u===0?"":a.substring(0,u))+a.substring(v+1):u=v}}return a===""?null:a}function ar(r,e=!1){var f=e?" !important;":";",a="";for(var n of Object.keys(r)){var s=r[n];s!=null&&s!==""&&(a+=" "+n+": "+s+f)}return a}function Y(r){return r[0]!=="-"||r[1]!=="-"?r.toLowerCase():r}function yr(r,e){if(e){var f="",a,n;if(Array.isArray(e)?(a=e[0],n=e[1]):a=e,r){r=String(r).replaceAll(/\s*\/\*.*?\*\/\s*/g,"").trim();var s=!1,u=0,v=!1,o=[];a&&o.push(...Object.keys(a).map(Y)),n&&o.push(...Object.keys(n).map(Y));var d=0,l=-1;const T=r.length;for(var g=0;g<T;g++){var t=r[g];if(v?t==="/"&&r[g-1]==="*"&&(v=!1):s?s===t&&(s=!1):t==="/"&&r[g+1]==="*"?v=!0:t==='"'||t==="'"?s=t:t==="("?u++:t===")"&&u--,!v&&s===!1&&u===0){if(t===":"&&l===-1)l=g;else if(t===";"||g===T-1){if(l!==-1){var p=Y(r.substring(d,l).trim());if(!o.includes(p)){t!==";"&&g++;var S=r.substring(d,g).trim();f+=" "+S+";"}}d=g+1,l=-1}}}}return a&&(f+=ar(a)),n&&(f+=ar(n,!0)),f=f.trim(),f===""?null:f}return r==null?null:String(r)}function re(r,e,f,a,n,s){var u=r.__className;if(A||u!==f||u===void 0){var v=Vr(f,a,s);(!A||v!==r.getAttribute("class"))&&(v==null?r.removeAttribute("class"):e?r.className=v:r.setAttribute("class",v)),r.__className=f}else if(s&&n!==s)for(var o in s){var d=!!s[o];(n==null||d!==!!n[o])&&r.classList.toggle(o,d)}return s}const Xr=Symbol("is custom element"),Jr=Symbol("is html"),Wr=tr?"link":"LINK",$r=tr?"progress":"PROGRESS";function ee(r){if(A){var e=!1,f=()=>{if(!e){if(e=!0,r.hasAttribute("value")){var a=r.value;ir(r,"value",null),r.value=a}if(r.hasAttribute("checked")){var n=r.checked;ir(r,"checked",null),r.checked=n}}};r.__on_r=f,lr(f),Kr()}}function fe(r,e){var f=vr(r);f.value===(f.value=e??void 0)||r.value===e&&(e!==0||r.nodeName!==$r)||(r.value=e??"")}function ir(r,e,f,a){var n=vr(r);A&&(n[e]=r.getAttribute(e),e==="src"||e==="srcset"||e==="href"&&r.nodeName===Wr)||n[e]!==(n[e]=f)&&(e==="loading"&&(r[Fr]=f),f==null?r.removeAttribute(e):typeof f!="string"&&Qr(r).includes(e)?r[e]=f:r.setAttribute(e,f))}function vr(r){return r.__attributes??(r.__attributes={[Xr]:r.nodeName.includes("-"),[Jr]:r.namespaceURI===Gr})}var nr=new Map;function Qr(r){var e=r.getAttribute("is")||r.nodeName,f=nr.get(e);if(f)return f;nr.set(e,f=[]);for(var a,n=r,s=Element.prototype;s!==n;){a=Ur(n);for(var u in a)a[u].set&&f.push(u);n=zr(n)}return f}export{ir as a,fe as b,xr as c,mr as e,jr as i,ee as r,re as s,yr as t};

View file

@ -0,0 +1 @@
import{q as T,v as o,w as h,E as b,V as p,W as v,X as A,Y as E,N as R,M as l}from"./CW7md74C.js";import{B as g}from"./DExHDOmW.js";function S(t,u,_=!1){o&&h();var n=new g(t),c=_?b:0;function i(a,r){if(o){const e=p(t);var s;if(e===v?s=0:e===A?s=!1:s=parseInt(e.substring(1)),a!==s){var f=E();R(f),n.anchor=f,l(!1),n.ensure(a,r),l(!0);return}}n.ensure(a,r)}T(()=>{var a=!1;u((r,s=0)=>{a=!0,i(s,r)}),a||i(!1,null)},c)}export{S as i};

View file

@ -0,0 +1 @@
import{b as s,w as g}from"./D90q9c2i.js";const v=200;function $(){const{subscribe:e,set:n,update:t}=g({connected:!1,reconnecting:!1,events:[],lastHeartbeat:null,error:null});let o=null,a=null,d=0;function m(l){const i=l||(window.location.port==="5173"?`ws://${window.location.hostname}:3927/ws`:`ws://${window.location.host}/ws`);if((o==null?void 0:o.readyState)!==WebSocket.OPEN)try{o=new WebSocket(i),o.onopen=()=>{d=0,t(r=>({...r,connected:!0,reconnecting:!1,error:null}))},o.onmessage=r=>{try{const u=JSON.parse(r.data);t(f=>{if(u.type==="Heartbeat")return{...f,lastHeartbeat:u};const h=[u,...f.events].slice(0,v);return{...f,events:h}})}catch(u){console.warn("[vestige] Failed to parse WebSocket message:",u)}},o.onclose=()=>{t(r=>({...r,connected:!1})),p(i)},o.onerror=()=>{t(r=>({...r,error:"WebSocket connection failed"}))}}catch(r){t(u=>({...u,error:String(r)}))}}function p(l){a&&clearTimeout(a),t(r=>({...r,reconnecting:!0}));const i=Math.min(1e3*2**d,3e4);d++,a=setTimeout(()=>m(l),i)}function b(){a&&(clearTimeout(a),a=null),o&&(o.onclose=null,o.onerror=null,o.onmessage=null,o.close()),o=null,n({connected:!1,reconnecting:!1,events:[],lastHeartbeat:null,error:null})}function w(){t(l=>({...l,events:[]}))}function y(l){t(i=>{const r=[l,...i.events].slice(0,v);return{...i,events:r}})}return{subscribe:e,connect:m,disconnect:b,clearEvents:w,injectEvent:y}}const c=$(),S=s(c,e=>e.connected),H=s(c,e=>e.reconnecting),T=s(c,e=>e.events);s(c,e=>e.lastHeartbeat);const M=s(c,e=>{var n,t;return((t=(n=e.lastHeartbeat)==null?void 0:n.data)==null?void 0:t.memory_count)??0}),k=s(c,e=>{var n,t;return((t=(n=e.lastHeartbeat)==null?void 0:n.data)==null?void 0:t.avg_retention)??0}),_=s(c,e=>{var n,t;return((t=(n=e.lastHeartbeat)==null?void 0:n.data)==null?void 0:t.suppressed_count)??0}),W=s(c,e=>{var n,t;return((t=(n=e.lastHeartbeat)==null?void 0:n.data)==null?void 0:t.uptime_secs)??0}),N=s(c,e=>e.events.filter(n=>n.type==="TraceEvent")),P=s(c,e=>{var t;const n=e.events.find(o=>o.type==="TraceEvent");return((t=n==null?void 0:n.data)==null?void 0:t.run_id)??null}),R=s(c,e=>e.events.find(n=>n.type==="TraceEvent")??null),C=s(c,e=>e.events.filter(n=>n.type==="MemoryPrOpened"||n.type==="MemoryPrDecided"));function F(e){if(!Number.isFinite(e)||e<0)return"—";const n=Math.floor(e/86400),t=Math.floor(e%86400/3600),o=Math.floor(e%3600/60),a=Math.floor(e%60);return n>0?t>0?`${n}d ${t}h`:`${n}d`:t>0?o>0?`${t}h ${o}m`:`${t}h`:o>0?a>0?`${o}m ${a}s`:`${o}m`:`${a}s`}export{k as a,M as b,H as c,P as d,T as e,F as f,S as i,R as l,C as m,_ as s,N as t,W as u,c as w};

View file

@ -1 +1 @@
import{w as N,g as T}from"./D8mhvFt8.js";import{e as E}from"./BhIgFntf.js";import{E as p}from"./CcUbQ_Wl.js";const y=4,R=5500,F=1500;function x(){const{subscribe:b,update:u}=N([]);let m=1,f=0;const c=new Map,a=new Map,l=new Map;function w(e,s){l.set(e,Date.now());const t=setTimeout(()=>{c.delete(e),l.delete(e),h(e)},s);c.set(e,t)}function g(e){const s=m++,t=Date.now(),o={id:s,createdAt:t,...e};u(n=>{const r=[o,...n];if(r.length>y){for(const i of r.slice(y)){const d=c.get(i.id);d&&clearTimeout(d),c.delete(i.id),a.delete(i.id),l.delete(i.id)}return r.slice(0,y)}return r}),w(s,e.dwellMs)}function h(e){const s=c.get(e);s&&(clearTimeout(s),c.delete(e)),a.delete(e),l.delete(e),u(t=>t.filter(o=>o.id!==e))}function D(e,s){const t=c.get(e);if(!t)return;clearTimeout(t),c.delete(e);const o=l.get(e)??Date.now(),n=Date.now()-o,r=Math.max(200,s-n);a.set(e,{remaining:r})}function C(e){const s=a.get(e);s&&(a.delete(e),w(e,s.remaining))}function S(){for(const e of c.values())clearTimeout(e);c.clear(),a.clear(),l.clear(),u(()=>[])}function _(e){const s=p[e.type]??"#818CF8",t=e.data;switch(e.type){case"DreamCompleted":{const o=Number(t.memories_replayed??0),n=Number(t.connections_found??0),r=Number(t.insights_generated??0),i=Number(t.duration_ms??0),d=[];return d.push(`Replayed ${o} ${o===1?"memory":"memories"}`),n>0&&d.push(`${n} new connection${n===1?"":"s"}`),r>0&&d.push(`${r} insight${r===1?"":"s"}`),{type:e.type,title:"Dream consolidated",body:`${d.join(" · ")} in ${(i/1e3).toFixed(1)}s`,color:s,dwellMs:7e3}}case"ConsolidationCompleted":{const o=Number(t.nodes_processed??0),n=Number(t.decay_applied??0),r=Number(t.embeddings_generated??0),i=Number(t.duration_ms??0),d=[];return n>0&&d.push(`${n} decayed`),r>0&&d.push(`${r} embedded`),{type:e.type,title:"Consolidation swept",body:`${o} node${o===1?"":"s"}${d.length?" · "+d.join(" · "):""} in ${(i/1e3).toFixed(1)}s`,color:s,dwellMs:6e3}}case"ConnectionDiscovered":{const o=Date.now();if(o-f<F)return null;f=o;const n=String(t.connection_type??"link"),r=Number(t.weight??0);return{type:e.type,title:"Bridge discovered",body:`${n} · weight ${r.toFixed(2)}`,color:s,dwellMs:4500}}case"MemoryPromoted":{const o=Number(t.new_retention??0);return{type:e.type,title:"Memory promoted",body:`retention ${(o*100).toFixed(0)}%`,color:s,dwellMs:4500}}case"MemoryDemoted":{const o=Number(t.new_retention??0);return{type:e.type,title:"Memory demoted",body:`retention ${(o*100).toFixed(0)}%`,color:s,dwellMs:4500}}case"MemorySuppressed":{const o=Number(t.suppression_count??0),n=Number(t.estimated_cascade??0);return{type:e.type,title:"Forgetting",body:n>0?`suppression #${o} · Rac1 cascade ~${n} neighbors`:`suppression #${o}`,color:s,dwellMs:5500}}case"MemoryUnsuppressed":{const o=Number(t.remaining_count??0);return{type:e.type,title:"Recovered",body:o>0?`${o} suppression${o===1?"":"s"} remain`:"fully unsuppressed",color:s,dwellMs:5e3}}case"Rac1CascadeSwept":{const o=Number(t.seeds??0),n=Number(t.neighbors_affected??0);return{type:e.type,title:"Rac1 cascade",body:`${o} seed${o===1?"":"s"} · ${n} dendritic spine${n===1?"":"s"} pruned`,color:s,dwellMs:6e3}}case"MemoryDeleted":return{type:e.type,title:"Memory deleted",body:String(t.id??"").slice(0,8),color:s,dwellMs:4e3};case"HookVerdictRecorded":{const o=String(t.verdict??"NOTE"),n=String(t.reason??"Sanhedrin receipt updated");return{type:e.type,title:`Sanhedrin ${o}`,body:n,color:s,dwellMs:o==="VETO"?8e3:R}}case"Heartbeat":case"SearchPerformed":case"RetentionDecayed":case"ActivationSpread":case"ImportanceScored":case"MemoryCreated":case"MemoryUpdated":case"DreamStarted":case"DreamProgress":case"ConsolidationStarted":case"Connected":return null;default:return null}}let M=null;return E.subscribe(e=>{if(e.length===0)return;const s=[];for(const t of e){if(t===M)break;s.push(t)}if(s.length!==0){M=e[0];for(let t=s.length-1;t>=0;t--){const o=_(s[t]);o&&g(o)}}}),{subscribe:b,dismiss:h,clear:S,pauseDwell:D,resumeDwell:C,push:g}}const $=x();function I(){[{type:"DreamCompleted",title:"Dream consolidated",body:"Replayed 127 memories · 43 new connections · 5 insights in 2.4s",color:p.DreamCompleted,dwellMs:7e3},{type:"ConnectionDiscovered",title:"Bridge discovered",body:"semantic · weight 0.87",color:p.ConnectionDiscovered,dwellMs:4500},{type:"MemorySuppressed",title:"Forgetting",body:"suppression #2 · Rac1 cascade ~8 neighbors",color:p.MemorySuppressed,dwellMs:5500},{type:"ConsolidationCompleted",title:"Consolidation swept",body:"892 nodes · 156 decayed · 48 embedded in 1.1s",color:p.ConsolidationCompleted,dwellMs:6e3}].forEach((u,m)=>{setTimeout(()=>{$.push(u)},m*800)}),T($)}export{I as f,$ as t};
import{w as N,g as T}from"./D90q9c2i.js";import{e as E}from"./BFpewGai.js";import{E as p}from"./CcUbQ_Wl.js";const y=4,R=5500,F=1500;function x(){const{subscribe:b,update:u}=N([]);let m=1,f=0;const c=new Map,a=new Map,l=new Map;function w(e,s){l.set(e,Date.now());const t=setTimeout(()=>{c.delete(e),l.delete(e),h(e)},s);c.set(e,t)}function g(e){const s=m++,t=Date.now(),o={id:s,createdAt:t,...e};u(n=>{const r=[o,...n];if(r.length>y){for(const i of r.slice(y)){const d=c.get(i.id);d&&clearTimeout(d),c.delete(i.id),a.delete(i.id),l.delete(i.id)}return r.slice(0,y)}return r}),w(s,e.dwellMs)}function h(e){const s=c.get(e);s&&(clearTimeout(s),c.delete(e)),a.delete(e),l.delete(e),u(t=>t.filter(o=>o.id!==e))}function D(e,s){const t=c.get(e);if(!t)return;clearTimeout(t),c.delete(e);const o=l.get(e)??Date.now(),n=Date.now()-o,r=Math.max(200,s-n);a.set(e,{remaining:r})}function C(e){const s=a.get(e);s&&(a.delete(e),w(e,s.remaining))}function S(){for(const e of c.values())clearTimeout(e);c.clear(),a.clear(),l.clear(),u(()=>[])}function _(e){const s=p[e.type]??"#818CF8",t=e.data;switch(e.type){case"DreamCompleted":{const o=Number(t.memories_replayed??0),n=Number(t.connections_found??0),r=Number(t.insights_generated??0),i=Number(t.duration_ms??0),d=[];return d.push(`Replayed ${o} ${o===1?"memory":"memories"}`),n>0&&d.push(`${n} new connection${n===1?"":"s"}`),r>0&&d.push(`${r} insight${r===1?"":"s"}`),{type:e.type,title:"Dream consolidated",body:`${d.join(" · ")} in ${(i/1e3).toFixed(1)}s`,color:s,dwellMs:7e3}}case"ConsolidationCompleted":{const o=Number(t.nodes_processed??0),n=Number(t.decay_applied??0),r=Number(t.embeddings_generated??0),i=Number(t.duration_ms??0),d=[];return n>0&&d.push(`${n} decayed`),r>0&&d.push(`${r} embedded`),{type:e.type,title:"Consolidation swept",body:`${o} node${o===1?"":"s"}${d.length?" · "+d.join(" · "):""} in ${(i/1e3).toFixed(1)}s`,color:s,dwellMs:6e3}}case"ConnectionDiscovered":{const o=Date.now();if(o-f<F)return null;f=o;const n=String(t.connection_type??"link"),r=Number(t.weight??0);return{type:e.type,title:"Bridge discovered",body:`${n} · weight ${r.toFixed(2)}`,color:s,dwellMs:4500}}case"MemoryPromoted":{const o=Number(t.new_retention??0);return{type:e.type,title:"Memory promoted",body:`retention ${(o*100).toFixed(0)}%`,color:s,dwellMs:4500}}case"MemoryDemoted":{const o=Number(t.new_retention??0);return{type:e.type,title:"Memory demoted",body:`retention ${(o*100).toFixed(0)}%`,color:s,dwellMs:4500}}case"MemorySuppressed":{const o=Number(t.suppression_count??0),n=Number(t.estimated_cascade??0);return{type:e.type,title:"Forgetting",body:n>0?`suppression #${o} · Rac1 cascade ~${n} neighbors`:`suppression #${o}`,color:s,dwellMs:5500}}case"MemoryUnsuppressed":{const o=Number(t.remaining_count??0);return{type:e.type,title:"Recovered",body:o>0?`${o} suppression${o===1?"":"s"} remain`:"fully unsuppressed",color:s,dwellMs:5e3}}case"Rac1CascadeSwept":{const o=Number(t.seeds??0),n=Number(t.neighbors_affected??0);return{type:e.type,title:"Rac1 cascade",body:`${o} seed${o===1?"":"s"} · ${n} dendritic spine${n===1?"":"s"} pruned`,color:s,dwellMs:6e3}}case"MemoryDeleted":return{type:e.type,title:"Memory deleted",body:String(t.id??"").slice(0,8),color:s,dwellMs:4e3};case"HookVerdictRecorded":{const o=String(t.verdict??"NOTE"),n=String(t.reason??"Sanhedrin receipt updated");return{type:e.type,title:`Sanhedrin ${o}`,body:n,color:s,dwellMs:o==="VETO"?8e3:R}}case"Heartbeat":case"SearchPerformed":case"RetentionDecayed":case"ActivationSpread":case"ImportanceScored":case"MemoryCreated":case"MemoryUpdated":case"DreamStarted":case"DreamProgress":case"ConsolidationStarted":case"Connected":return null;default:return null}}let M=null;return E.subscribe(e=>{if(e.length===0)return;const s=[];for(const t of e){if(t===M)break;s.push(t)}if(s.length!==0){M=e[0];for(let t=s.length-1;t>=0;t--){const o=_(s[t]);o&&g(o)}}}),{subscribe:b,dismiss:h,clear:S,pauseDwell:D,resumeDwell:C,push:g}}const $=x();function I(){[{type:"DreamCompleted",title:"Dream consolidated",body:"Replayed 127 memories · 43 new connections · 5 insights in 2.4s",color:p.DreamCompleted,dwellMs:7e3},{type:"ConnectionDiscovered",title:"Bridge discovered",body:"semantic · weight 0.87",color:p.ConnectionDiscovered,dwellMs:4500},{type:"MemorySuppressed",title:"Forgetting",body:"suppression #2 · Rac1 cascade ~8 neighbors",color:p.MemorySuppressed,dwellMs:5500},{type:"ConsolidationCompleted",title:"Consolidation swept",body:"892 nodes · 156 decayed · 48 embedded in 1.1s",color:p.ConsolidationCompleted,dwellMs:6e3}].forEach((u,m)=>{setTimeout(()=>{$.push(u)},m*800)}),T($)}export{I as f,$ as t};

View file

@ -1 +1 @@
import{t as b}from"./60_R_Vbt.js";import{G as c}from"./wpu9U-D0.js";function A(i,u={},r,f){for(var a in r){var o=r[a];u[a]!==o&&(r[a]==null?i.style.removeProperty(a):i.style.setProperty(a,o,f))}}function P(i,u,r,f){var a=i.__style;if(c||a!==u){var o=b(u,f);(!c||o!==i.getAttribute("style"))&&(o==null?i.removeAttribute("style"):i.style.cssText=o),i.__style=u}else f&&(Array.isArray(f)?(A(i,r==null?void 0:r[0],f[0]),A(i,r==null?void 0:r[1],f[1],"important")):A(i,r,f));return f}export{P as s};
import{t as b}from"./Cc0l8Nd4.js";import{v as c}from"./CW7md74C.js";function A(i,u={},r,f){for(var a in r){var o=r[a];u[a]!==o&&(r[a]==null?i.style.removeProperty(a):i.style.setProperty(a,o,f))}}function P(i,u,r,f){var a=i.__style;if(c||a!==u){var o=b(u,f);(!c||o!==i.getAttribute("style"))&&(o==null?i.removeAttribute("style"):i.style.cssText=o),i.__style=u}else f&&(Array.isArray(f)?(A(i,r==null?void 0:r[0],f[0]),A(i,r==null?void 0:r[1],f[1],"important")):A(i,r,f));return f}export{P as s};

View file

@ -1 +0,0 @@
var B=Object.defineProperty;var g=i=>{throw TypeError(i)};var F=(i,e,s)=>e in i?B(i,e,{enumerable:!0,configurable:!0,writable:!0,value:s}):i[e]=s;var w=(i,e,s)=>F(i,typeof e!="symbol"?e+"":e,s),M=(i,e,s)=>e.has(i)||g("Cannot "+s);var t=(i,e,s)=>(M(i,e,"read from private field"),s?s.call(i):e.get(i)),l=(i,e,s)=>e.has(i)?g("Cannot add the same private member more than once"):e instanceof WeakSet?e.add(i):e.set(i,s),y=(i,e,s,a)=>(M(i,e,"write to private field"),a?a.call(i,s):e.set(i,s),s);import{w as D,Y as C,Z as k,_ as G,D as x,$ as A,G as S,M as Y,a0 as Z,a1 as $}from"./wpu9U-D0.js";var r,n,h,u,p,_,v;class z{constructor(e,s=!0){w(this,"anchor");l(this,r,new Map);l(this,n,new Map);l(this,h,new Map);l(this,u,new Set);l(this,p,!0);l(this,_,()=>{var e=D;if(t(this,r).has(e)){var s=t(this,r).get(e),a=t(this,n).get(s);if(a)C(a),t(this,u).delete(s);else{var c=t(this,h).get(s);c&&(t(this,n).set(s,c.effect),t(this,h).delete(s),c.fragment.lastChild.remove(),this.anchor.before(c.fragment),a=c.effect)}for(const[f,o]of t(this,r)){if(t(this,r).delete(f),f===e)break;const d=t(this,h).get(o);d&&(k(d.effect),t(this,h).delete(o))}for(const[f,o]of t(this,n)){if(f===s||t(this,u).has(f))continue;const d=()=>{if(Array.from(t(this,r).values()).includes(f)){var b=document.createDocumentFragment();Z(o,b),b.append(x()),t(this,h).set(f,{effect:o,fragment:b})}else k(o);t(this,u).delete(f),t(this,n).delete(f)};t(this,p)||!a?(t(this,u).add(f),G(o,d,!1)):d()}}});l(this,v,e=>{t(this,r).delete(e);const s=Array.from(t(this,r).values());for(const[a,c]of t(this,h))s.includes(a)||(k(c.effect),t(this,h).delete(a))});this.anchor=e,y(this,p,s)}ensure(e,s){var a=D,c=$();if(s&&!t(this,n).has(e)&&!t(this,h).has(e))if(c){var f=document.createDocumentFragment(),o=x();f.append(o),t(this,h).set(e,{effect:A(()=>s(o)),fragment:f})}else t(this,n).set(e,A(()=>s(this.anchor)));if(t(this,r).set(a,e),c){for(const[d,m]of t(this,n))d===e?a.unskip_effect(m):a.skip_effect(m);for(const[d,m]of t(this,h))d===e?a.unskip_effect(m.effect):a.skip_effect(m.effect);a.oncommit(t(this,_)),a.ondiscard(t(this,v))}else S&&(this.anchor=Y),t(this,_).call(this)}}r=new WeakMap,n=new WeakMap,h=new WeakMap,u=new WeakMap,p=new WeakMap,_=new WeakMap,v=new WeakMap;export{z as B};

View file

@ -1 +0,0 @@
import{b as c,w as g}from"./D8mhvFt8.js";const v=200;function $(){const{subscribe:e,set:n,update:t}=g({connected:!1,reconnecting:!1,events:[],lastHeartbeat:null,error:null});let o=null,s=null,d=0;function m(i){const l=i||(window.location.port==="5173"?`ws://${window.location.hostname}:3927/ws`:`ws://${window.location.host}/ws`);if((o==null?void 0:o.readyState)!==WebSocket.OPEN)try{o=new WebSocket(l),o.onopen=()=>{d=0,t(r=>({...r,connected:!0,reconnecting:!1,error:null}))},o.onmessage=r=>{try{const u=JSON.parse(r.data);t(f=>{if(u.type==="Heartbeat")return{...f,lastHeartbeat:u};const w=[u,...f.events].slice(0,v);return{...f,events:w}})}catch(u){console.warn("[vestige] Failed to parse WebSocket message:",u)}},o.onclose=()=>{t(r=>({...r,connected:!1})),p(l)},o.onerror=()=>{t(r=>({...r,error:"WebSocket connection failed"}))}}catch(r){t(u=>({...u,error:String(r)}))}}function p(i){s&&clearTimeout(s),t(r=>({...r,reconnecting:!0}));const l=Math.min(1e3*2**d,3e4);d++,s=setTimeout(()=>m(i),l)}function b(){s&&clearTimeout(s),o==null||o.close(),o=null,n({connected:!1,reconnecting:!1,events:[],lastHeartbeat:null,error:null})}function y(){t(i=>({...i,events:[]}))}function h(i){t(l=>{const r=[i,...l.events].slice(0,v);return{...l,events:r}})}return{subscribe:e,connect:m,disconnect:b,clearEvents:y,injectEvent:h}}const a=$(),S=c(a,e=>e.connected),H=c(a,e=>e.reconnecting),T=c(a,e=>e.events);c(a,e=>e.lastHeartbeat);const M=c(a,e=>{var n,t;return((t=(n=e.lastHeartbeat)==null?void 0:n.data)==null?void 0:t.memory_count)??0}),k=c(a,e=>{var n,t;return((t=(n=e.lastHeartbeat)==null?void 0:n.data)==null?void 0:t.avg_retention)??0}),_=c(a,e=>{var n,t;return((t=(n=e.lastHeartbeat)==null?void 0:n.data)==null?void 0:t.suppressed_count)??0}),W=c(a,e=>{var n,t;return((t=(n=e.lastHeartbeat)==null?void 0:n.data)==null?void 0:t.uptime_secs)??0}),N=c(a,e=>e.events.filter(n=>n.type==="TraceEvent")),P=c(a,e=>{var t;const n=e.events.find(o=>o.type==="TraceEvent");return((t=n==null?void 0:n.data)==null?void 0:t.run_id)??null}),R=c(a,e=>e.events.find(n=>n.type==="TraceEvent")??null),C=c(a,e=>e.events.filter(n=>n.type==="MemoryPrOpened"||n.type==="MemoryPrDecided"));function F(e){if(!Number.isFinite(e)||e<0)return"—";const n=Math.floor(e/86400),t=Math.floor(e%86400/3600),o=Math.floor(e%3600/60),s=Math.floor(e%60);return n>0?t>0?`${n}d ${t}h`:`${n}d`:t>0?o>0?`${t}h ${o}m`:`${t}h`:o>0?s>0?`${o}m ${s}s`:`${o}m`:`${s}s`}export{k as a,M as b,H as c,P as d,T as e,F as f,S as i,R as l,C as m,_ as s,N as t,W as u,a as w};

View file

@ -0,0 +1 @@
import{ac as R,ad as U,g as o,B,ae as N,i as A,af as y,ag as M,ah as Y,d as $,ai as h,aj as q,ak as w,al as x,R as j,am as p,an as z,ao as C,a8 as G,ap as Z,aq as F,U as H,ar as J}from"./CW7md74C.js";import{c as K,g as Q}from"./D90q9c2i.js";let v=!1,g=Symbol();function k(e,r,i){const n=i[r]??(i[r]={store:null,source:U(void 0),unsubscribe:R});if(n.store!==e&&!(g in i))if(n.unsubscribe(),n.store=e??null,e==null)n.source.v=void 0,n.unsubscribe=R;else{var u=!0;n.unsubscribe=K(e,t=>{u?n.source.v=t:A(n.source,t)}),u=!1}return e&&g in i?Q(e):o(n.source)}function ee(){const e={};function r(){B(()=>{for(var i in e)e[i].unsubscribe();N(e,g,{enumerable:!1,value:!0})})}return[e,r]}function V(e){var r=v;try{return v=!1,[e(),v]}finally{v=r}}function re(e,r,i,n){var E;var u=!p||(i&z)!==0,t=(i&x)!==0,T=(i&F)!==0,f=n,b=!0,P=()=>(b&&(b=!1,f=T?j(n):n),f),d;if(t){var m=H in e||J in e;d=((E=y(e,r))==null?void 0:E.set)??(m&&r in e?a=>e[r]=a:void 0)}var _,I=!1;t?[_,I]=V(()=>e[r]):_=e[r],_===void 0&&n!==void 0&&(_=P(),d&&(u&&M(),d(_)));var s;if(u?s=()=>{var a=e[r];return a===void 0?P():(b=!0,a)}:s=()=>{var a=e[r];return a!==void 0&&(f=void 0),a===void 0?f:a},u&&(i&Y)===0)return s;if(d){var D=e.$$legacy;return(function(a,c){return arguments.length>0?((!u||!c||D||I)&&d(c?s():a),a):s()})}var S=!1,l=((i&C)!==0?G:Z)(()=>(S=!1,s()));t&&o(l);var L=q;return(function(a,c){if(arguments.length>0){const O=c?o(l):u&&t?$(a):a;return A(l,O),S=!0,f!==void 0&&(f=O),a}return h&&S||(L.f&w)!==0?l.v:o(l)})}export{ee as a,re as p,k as s};

View file

@ -1 +0,0 @@
import{ab as R,ac as y,g as o,y as N,ad as U,i as A,ae as B,af as M,ag as Y,d as $,ah as h,ai as q,aj as w,ak as x,P as j,al as p,am as z,an as C,a7 as G,ao as Z,ap as F,S as H,aq as J}from"./wpu9U-D0.js";import{c as K,g as Q}from"./D8mhvFt8.js";let v=!1,g=Symbol();function k(e,r,i){const n=i[r]??(i[r]={store:null,source:y(void 0),unsubscribe:R});if(n.store!==e&&!(g in i))if(n.unsubscribe(),n.store=e??null,e==null)n.source.v=void 0,n.unsubscribe=R;else{var u=!0;n.unsubscribe=K(e,t=>{u?n.source.v=t:A(n.source,t)}),u=!1}return e&&g in i?Q(e):o(n.source)}function ee(){const e={};function r(){N(()=>{for(var i in e)e[i].unsubscribe();U(e,g,{enumerable:!1,value:!0})})}return[e,r]}function V(e){var r=v;try{return v=!1,[e(),v]}finally{v=r}}function re(e,r,i,n){var E;var u=!p||(i&z)!==0,t=(i&x)!==0,T=(i&F)!==0,f=n,b=!0,P=()=>(b&&(b=!1,f=T?j(n):n),f),d;if(t){var m=H in e||J in e;d=((E=B(e,r))==null?void 0:E.set)??(m&&r in e?a=>e[r]=a:void 0)}var _,I=!1;t?[_,I]=V(()=>e[r]):_=e[r],_===void 0&&n!==void 0&&(_=P(),d&&(u&&M(),d(_)));var s;if(u?s=()=>{var a=e[r];return a===void 0?P():(b=!0,a)}:s=()=>{var a=e[r];return a!==void 0&&(f=void 0),a===void 0?f:a},u&&(i&Y)===0)return s;if(d){var D=e.$$legacy;return(function(a,c){return arguments.length>0?((!u||!c||D||I)&&d(c?s():a),a):s()})}var S=!1,l=((i&C)!==0?G:Z)(()=>(S=!1,s()));t&&o(l);var L=q;return(function(a,c){if(arguments.length>0){const O=c?o(l):u&&t?$(a):a;return A(l,O),S=!0,f!==void 0&&(f=O),a}return h&&S||(L.f&w)!==0?l.v:o(l)})}export{ee as a,re as p,k as s};

File diff suppressed because one or more lines are too long

View file

@ -0,0 +1 @@
const i="/api";async function t(e,o){const r=await fetch(`${i}${e}`,{headers:{"Content-Type":"application/json"},...o});if(!r.ok)throw new Error(`API ${r.status}: ${r.statusText}`);return r.json()}const n={memories:{list:e=>{const o=e?"?"+new URLSearchParams(e).toString():"";return t(`/memories${o}`)},get:e=>t(`/memories/${e}`),delete:e=>t(`/memories/${e}`,{method:"DELETE"}),promote:e=>t(`/memories/${e}/promote`,{method:"POST"}),demote:e=>t(`/memories/${e}/demote`,{method:"POST"}),suppress:(e,o)=>t(`/memories/${e}/suppress`,{method:"POST",body:o?JSON.stringify({reason:o}):void 0}),unsuppress:e=>t(`/memories/${e}/unsuppress`,{method:"POST"})},search:(e,o=20)=>t(`/search?q=${encodeURIComponent(e)}&limit=${o}`),stats:()=>t("/stats"),health:()=>t("/health"),timeline:(e=7,o=200)=>t(`/timeline?days=${e}&limit=${o}`),graph:e=>{const o=e?"?"+new URLSearchParams(Object.entries(e).filter(([,r])=>r!==void 0).map(([r,s])=>[r,String(s)])).toString():"";return t(`/graph${o}`)},dream:()=>t("/dream",{method:"POST"}),explore:(e,o="associations",r,s=10)=>t("/explore",{method:"POST",body:JSON.stringify({from_id:e,action:o,to_id:r,limit:s})}),predict:()=>t("/predict",{method:"POST"}),importance:e=>t("/importance",{method:"POST",body:JSON.stringify({content:e})}),consolidate:()=>t("/consolidate",{method:"POST"}),retentionDistribution:()=>t("/retention-distribution"),duplicates:(e=.8,o=20)=>t(`/duplicates?threshold=${e}&limit=${o}`),contradictions:e=>{const o=e?"?"+new URLSearchParams(Object.entries(e).filter(([,r])=>r!==void 0).map(([r,s])=>[r,String(s)])).toString():"";return t(`/contradictions${o}`)},crossProjectPatterns:()=>t("/patterns/cross-project"),memoryAudit:(e,o=100)=>t(`/memories/${encodeURIComponent(e)}/audit?limit=${o}`),intentions:(e="active")=>t(`/intentions?status=${e}`),deepReference:(e,o=20)=>t("/deep_reference",{method:"POST",body:JSON.stringify({query:e,depth:o})}),sanhedrin:{latest:()=>t("/sanhedrin/latest"),telemetry:(e=7)=>t(`/sanhedrin/telemetry?days=${e}`),appeal:(e,o,r,s)=>t("/sanhedrin/appeal",{method:"POST",body:JSON.stringify({reason:e,note:o,claimId:r,receiptId:s})})},traces:{list:(e=50)=>t(`/traces?limit=${e}`),get:e=>t(`/traces/${encodeURIComponent(e)}`),exportUrl:e=>`${i}/traces/${encodeURIComponent(e)}/export`},receipts:{list:(e=50)=>t(`/receipts?limit=${e}`),listForRun:(e,o=50)=>t(`/receipts?run=${encodeURIComponent(e)}&limit=${o}`),get:e=>t(`/receipts/${encodeURIComponent(e)}`)},memoryPrs:{list:(e,o=100)=>{const r=new URLSearchParams;return e&&r.set("status",e),r.set("limit",String(o)),t(`/memory-prs?${r.toString()}`)},get:e=>t(`/memory-prs/${encodeURIComponent(e)}`),act:(e,o)=>t(`/memory-prs/${encodeURIComponent(e)}/${o}`,{method:"POST"}),getMode:()=>t("/memory-prs/mode"),setMode:e=>t("/memory-prs/mode",{method:"POST",body:JSON.stringify({mode:e})})}};export{n as a};

View file

@ -1 +1 @@
import{v as s,w as v,x as o,y as c,z as b,A as m,B as h,C as y}from"./wpu9U-D0.js";function _(e,r,f=!1){if(e.multiple){if(r==null)return;if(!b(r))return m();for(var a of e.options)a.selected=r.includes(i(a));return}for(a of e.options){var t=i(a);if(h(t,r)){a.selected=!0;return}}(!f||r!==void 0)&&(e.selectedIndex=-1)}function q(e){var r=new MutationObserver(()=>{_(e,e.__value)});r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),c(()=>{r.disconnect()})}function p(e,r,f=r){var a=new WeakSet,t=!0;s(e,"change",u=>{var l=u?"[selected]":":checked",n;if(e.multiple)n=[].map.call(e.querySelectorAll(l),i);else{var d=e.querySelector(l)??e.querySelector("option:not([disabled])");n=d&&i(d)}f(n),v!==null&&a.add(v)}),o(()=>{var u=r();if(e===document.activeElement){var l=y??v;if(a.has(l))return}if(_(e,u,t),t&&u===void 0){var n=e.querySelector(":checked");n!==null&&(u=i(n),f(u))}e.__value=u,t=!1}),q(e)}function i(e){return"__value"in e?e.__value:e.value}export{p as b};
import{y as s,z as v,A as o,B as c,C as b,D as m,F as h,G as y}from"./CW7md74C.js";function _(e,r,f=!1){if(e.multiple){if(r==null)return;if(!b(r))return m();for(var a of e.options)a.selected=r.includes(i(a));return}for(a of e.options){var t=i(a);if(h(t,r)){a.selected=!0;return}}(!f||r!==void 0)&&(e.selectedIndex=-1)}function q(e){var r=new MutationObserver(()=>{_(e,e.__value)});r.observe(e,{childList:!0,subtree:!0,attributes:!0,attributeFilter:["value"]}),c(()=>{r.disconnect()})}function p(e,r,f=r){var a=new WeakSet,t=!0;s(e,"change",u=>{var l=u?"[selected]":":checked",n;if(e.multiple)n=[].map.call(e.querySelectorAll(l),i);else{var d=e.querySelector(l)??e.querySelector("option:not([disabled])");n=d&&i(d)}f(n),v!==null&&a.add(v)}),o(()=>{var u=r();if(e===document.activeElement){var l=y??v;if(a.has(l))return}if(_(e,u,t),t&&u===void 0){var n=e.querySelector(":checked");n!==null&&(u=i(n),f(u))}e.__value=u,t=!1}),q(e)}function i(e){return"__value"in e?e.__value:e.value}export{p as b};

View file

@ -0,0 +1 @@
import{H as y,q as u,I as _,J as o,v as t,K as g,L as i,M as l,N as d,O as p,P as v}from"./CW7md74C.js";function C(n,r){let s=null,E=t;var a;if(t){s=p;for(var e=v(document.head);e!==null&&(e.nodeType!==g||e.data!==n);)e=i(e);if(e===null)l(!1);else{var f=i(e);e.remove(),d(f)}}t||(a=document.head.appendChild(y()));try{u(()=>r(a),_|o)}finally{E&&(l(!0),d(s))}}export{C as h};

View file

@ -1 +1 @@
import{a2 as g,a3 as d,o as c,P as m,a4 as i,a5 as b,g as p,a6 as v,a7 as h,a8 as k}from"./wpu9U-D0.js";function x(t=!1){const a=g,e=a.l.u;if(!e)return;let f=()=>v(a.s);if(t){let n=0,s={};const _=h(()=>{let l=!1;const r=a.s;for(const o in r)r[o]!==s[o]&&(s[o]=r[o],l=!0);return l&&n++,n});f=()=>p(_)}e.b.length&&d(()=>{u(a,f),i(e.b)}),c(()=>{const n=m(()=>e.m.map(b));return()=>{for(const s of n)typeof s=="function"&&s()}}),e.a.length&&c(()=>{u(a,f),i(e.a)})}function u(t,a){if(t.l.s)for(const e of t.l.s)p(e);a()}k();export{x as i};
import{a3 as g,a4 as d,x as c,R as m,a5 as i,a6 as b,g as p,a7 as v,a8 as h,a9 as k}from"./CW7md74C.js";function y(t=!1){const a=g,e=a.l.u;if(!e)return;let f=()=>v(a.s);if(t){let n=0,s={};const _=h(()=>{let l=!1;const r=a.s;for(const o in r)r[o]!==s[o]&&(s[o]=r[o],l=!0);return l&&n++,n});f=()=>p(_)}e.b.length&&d(()=>{u(a,f),i(e.b)}),c(()=>{const n=m(()=>e.m.map(b));return()=>{for(const s of n)typeof s=="function"&&s()}}),e.a.length&&c(()=>{u(a,f),i(e.a)})}function u(t,a){if(t.l.s)for(const e of t.l.s)p(e);a()}k();export{y as i};

View file

@ -1 +1 @@
import{v as k,w as f,O as m,P as t,Q as _,G as b,C as i}from"./wpu9U-D0.js";function E(e,a,v=a){var c=new WeakSet;k(e,"input",async r=>{var l=r?e.defaultValue:e.value;if(l=o(e)?u(l):l,v(l),f!==null&&c.add(f),await m(),l!==(l=a())){var h=e.selectionStart,d=e.selectionEnd,n=e.value.length;if(e.value=l??"",d!==null){var s=e.value.length;h===d&&d===n&&s>n?(e.selectionStart=s,e.selectionEnd=s):(e.selectionStart=h,e.selectionEnd=Math.min(d,s))}}}),(b&&e.defaultValue!==e.value||t(a)==null&&e.value)&&(v(o(e)?u(e.value):e.value),f!==null&&c.add(f)),_(()=>{var r=a();if(e===document.activeElement){var l=i??f;if(c.has(l))return}o(e)&&r===u(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function S(e,a,v=a){k(e,"change",c=>{var r=c?e.defaultChecked:e.checked;v(r)}),(b&&e.defaultChecked!==e.checked||t(a)==null)&&v(e.checked),_(()=>{var c=a();e.checked=!!c})}function o(e){var a=e.type;return a==="number"||a==="range"}function u(e){return e===""?null:+e}export{S as a,E as b};
import{y as k,z as f,Q as m,R as t,S as _,v as b,G as y}from"./CW7md74C.js";function S(e,a,v=a){var c=new WeakSet;k(e,"input",async r=>{var l=r?e.defaultValue:e.value;if(l=o(e)?u(l):l,v(l),f!==null&&c.add(f),await m(),l!==(l=a())){var h=e.selectionStart,d=e.selectionEnd,n=e.value.length;if(e.value=l??"",d!==null){var s=e.value.length;h===d&&d===n&&s>n?(e.selectionStart=s,e.selectionEnd=s):(e.selectionStart=h,e.selectionEnd=Math.min(d,s))}}}),(b&&e.defaultValue!==e.value||t(a)==null&&e.value)&&(v(o(e)?u(e.value):e.value),f!==null&&c.add(f)),_(()=>{var r=a();if(e===document.activeElement){var l=y??f;if(c.has(l))return}o(e)&&r===u(e.value)||e.type==="date"&&!r&&!e.value||r!==e.value&&(e.value=r??"")})}function E(e,a,v=a){k(e,"change",c=>{var r=c?e.defaultChecked:e.checked;v(r)}),(b&&e.defaultChecked!==e.checked||t(a)==null)&&v(e.checked),_(()=>{var c=a();e.checked=!!c})}function o(e){var a=e.type;return a==="number"||a==="range"}function u(e){return e===""?null:+e}export{E as a,S as b};

View file

@ -1 +0,0 @@
const i="/api";async function t(e,o){const r=await fetch(`${i}${e}`,{headers:{"Content-Type":"application/json"},...o});if(!r.ok)throw new Error(`API ${r.status}: ${r.statusText}`);return r.json()}const n={memories:{list:e=>{const o=e?"?"+new URLSearchParams(e).toString():"";return t(`/memories${o}`)},get:e=>t(`/memories/${e}`),delete:e=>t(`/memories/${e}`,{method:"DELETE"}),promote:e=>t(`/memories/${e}/promote`,{method:"POST"}),demote:e=>t(`/memories/${e}/demote`,{method:"POST"}),suppress:(e,o)=>t(`/memories/${e}/suppress`,{method:"POST",body:o?JSON.stringify({reason:o}):void 0}),unsuppress:e=>t(`/memories/${e}/unsuppress`,{method:"POST"})},search:(e,o=20)=>t(`/search?q=${encodeURIComponent(e)}&limit=${o}`),stats:()=>t("/stats"),health:()=>t("/health"),timeline:(e=7,o=200)=>t(`/timeline?days=${e}&limit=${o}`),graph:e=>{const o=e?"?"+new URLSearchParams(Object.entries(e).filter(([,r])=>r!==void 0).map(([r,s])=>[r,String(s)])).toString():"";return t(`/graph${o}`)},dream:()=>t("/dream",{method:"POST"}),explore:(e,o="associations",r,s=10)=>t("/explore",{method:"POST",body:JSON.stringify({from_id:e,action:o,to_id:r,limit:s})}),predict:()=>t("/predict",{method:"POST"}),importance:e=>t("/importance",{method:"POST",body:JSON.stringify({content:e})}),consolidate:()=>t("/consolidate",{method:"POST"}),retentionDistribution:()=>t("/retention-distribution"),intentions:(e="active")=>t(`/intentions?status=${e}`),deepReference:(e,o=20)=>t("/deep_reference",{method:"POST",body:JSON.stringify({query:e,depth:o})}),sanhedrin:{latest:()=>t("/sanhedrin/latest"),telemetry:(e=7)=>t(`/sanhedrin/telemetry?days=${e}`),appeal:(e,o,r,s)=>t("/sanhedrin/appeal",{method:"POST",body:JSON.stringify({reason:e,note:o,claimId:r,receiptId:s})})},traces:{list:(e=50)=>t(`/traces?limit=${e}`),get:e=>t(`/traces/${encodeURIComponent(e)}`),exportUrl:e=>`${i}/traces/${encodeURIComponent(e)}/export`},receipts:{list:(e=50)=>t(`/receipts?limit=${e}`),listForRun:(e,o=50)=>t(`/receipts?run=${encodeURIComponent(e)}&limit=${o}`),get:e=>t(`/receipts/${encodeURIComponent(e)}`)},memoryPrs:{list:(e,o=100)=>{const r=new URLSearchParams;return e&&r.set("status",e),r.set("limit",String(o)),t(`/memory-prs?${r.toString()}`)},get:e=>t(`/memory-prs/${encodeURIComponent(e)}`),act:(e,o)=>t(`/memory-prs/${encodeURIComponent(e)}/${o}`,{method:"POST"}),getMode:()=>t("/memory-prs/mode"),setMode:e=>t("/memory-prs/mode",{method:"POST",body:JSON.stringify({mode:e})})}};export{n as a};

Some files were not shown because too many files have changed in this diff Show more