mirror of
https://github.com/samvallad33/vestige.git
synced 2026-06-14 20:55:14 +02:00
Compare commits
No commits in common. "main" and "v2.1.2" have entirely different histories.
231 changed files with 816 additions and 10610 deletions
94
.github/workflows/release.yml
vendored
94
.github/workflows/release.yml
vendored
|
|
@ -50,93 +50,14 @@ jobs:
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v4
|
uses: actions/checkout@v4
|
||||||
with:
|
|
||||||
ref: ${{ github.event.inputs.tag || github.ref }}
|
|
||||||
|
|
||||||
- name: Setup pnpm
|
|
||||||
uses: pnpm/action-setup@v4
|
|
||||||
with:
|
|
||||||
version: 10
|
|
||||||
|
|
||||||
- name: Setup Node
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: 22
|
|
||||||
|
|
||||||
- name: Install Rust
|
- name: Install Rust
|
||||||
uses: dtolnay/rust-toolchain@stable
|
uses: dtolnay/rust-toolchain@stable
|
||||||
with:
|
with:
|
||||||
targets: ${{ matrix.target }}
|
targets: ${{ matrix.target }}
|
||||||
|
|
||||||
- name: Validate release version
|
|
||||||
shell: bash
|
|
||||||
env:
|
|
||||||
RELEASE_TAG: ${{ github.event.inputs.tag || github.ref_name }}
|
|
||||||
run: |
|
|
||||||
node <<'NODE'
|
|
||||||
const { execFileSync } = require('node:child_process');
|
|
||||||
const tag = process.env.RELEASE_TAG || '';
|
|
||||||
const expected = tag.replace(/^refs\/tags\//, '').replace(/^v/, '');
|
|
||||||
if (!expected) {
|
|
||||||
throw new Error('Release tag is empty');
|
|
||||||
}
|
|
||||||
|
|
||||||
const packageFiles = [
|
|
||||||
'package.json',
|
|
||||||
'apps/dashboard/package.json',
|
|
||||||
'packages/vestige-init/package.json',
|
|
||||||
'packages/vestige-mcp-npm/package.json'
|
|
||||||
];
|
|
||||||
for (const file of packageFiles) {
|
|
||||||
const actual = require(`./${file}`).version;
|
|
||||||
if (actual !== expected) {
|
|
||||||
throw new Error(`${file} version ${actual} does not match ${tag}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const metadata = JSON.parse(execFileSync('cargo', [
|
|
||||||
'metadata',
|
|
||||||
'--format-version',
|
|
||||||
'1',
|
|
||||||
'--locked',
|
|
||||||
'--no-deps'
|
|
||||||
], { encoding: 'utf8' }));
|
|
||||||
for (const name of ['vestige-core', 'vestige-mcp']) {
|
|
||||||
const pkg = metadata.packages.find((candidate) => candidate.name === name);
|
|
||||||
if (!pkg) throw new Error(`Missing Cargo package ${name}`);
|
|
||||||
if (pkg.version !== expected) {
|
|
||||||
throw new Error(`${name} version ${pkg.version} does not match ${tag}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NODE
|
|
||||||
|
|
||||||
- name: Build embedded dashboard
|
|
||||||
shell: bash
|
|
||||||
env:
|
|
||||||
RELEASE_TAG: ${{ github.event.inputs.tag || github.ref_name }}
|
|
||||||
run: |
|
|
||||||
pnpm install --frozen-lockfile
|
|
||||||
pnpm --filter @vestige/dashboard check
|
|
||||||
pnpm --filter @vestige/dashboard test
|
|
||||||
pnpm --filter @vestige/dashboard build
|
|
||||||
node <<'NODE'
|
|
||||||
const fs = require('node:fs');
|
|
||||||
const tag = process.env.RELEASE_TAG || '';
|
|
||||||
const expected = tag.replace(/^refs\/tags\//, '').replace(/^v/, '');
|
|
||||||
const versionFile = 'apps/dashboard/build/_app/version.json';
|
|
||||||
const version = JSON.parse(fs.readFileSync(versionFile, 'utf8')).version;
|
|
||||||
if (version !== expected) {
|
|
||||||
throw new Error(`${versionFile} version ${version} does not match ${tag}`);
|
|
||||||
}
|
|
||||||
for (const file of ['apps/dashboard/build/index.html', versionFile]) {
|
|
||||||
if (!fs.existsSync(file)) {
|
|
||||||
throw new Error(`Dashboard build did not produce ${file}`);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
NODE
|
|
||||||
|
|
||||||
- name: Build
|
- name: Build
|
||||||
run: cargo build --locked --package vestige-mcp --release --target ${{ matrix.target }} ${{ matrix.cargo_flags }}
|
run: cargo build --package vestige-mcp --release --target ${{ matrix.target }} ${{ matrix.cargo_flags }}
|
||||||
|
|
||||||
- name: Package (Unix)
|
- name: Package (Unix)
|
||||||
if: matrix.os != 'windows-latest'
|
if: matrix.os != 'windows-latest'
|
||||||
|
|
@ -156,21 +77,10 @@ jobs:
|
||||||
cd target/${{ matrix.target }}/release
|
cd target/${{ matrix.target }}/release
|
||||||
Compress-Archive -Path vestige-mcp.exe,vestige.exe,vestige-restore.exe -DestinationPath ../../../vestige-mcp-${{ matrix.target }}.zip
|
Compress-Archive -Path vestige-mcp.exe,vestige.exe,vestige-restore.exe -DestinationPath ../../../vestige-mcp-${{ matrix.target }}.zip
|
||||||
|
|
||||||
- name: Generate checksum
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
if command -v shasum >/dev/null 2>&1; then
|
|
||||||
shasum -a 256 vestige-mcp-${{ matrix.target }}.${{ matrix.archive }} > vestige-mcp-${{ matrix.target }}.${{ matrix.archive }}.sha256
|
|
||||||
else
|
|
||||||
sha256sum vestige-mcp-${{ matrix.target }}.${{ matrix.archive }} > vestige-mcp-${{ matrix.target }}.${{ matrix.archive }}.sha256
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: Upload to Release
|
- name: Upload to Release
|
||||||
uses: softprops/action-gh-release@v2
|
uses: softprops/action-gh-release@v2
|
||||||
with:
|
with:
|
||||||
tag_name: ${{ github.event.inputs.tag || github.ref_name }}
|
tag_name: ${{ github.event.inputs.tag || github.ref_name }}
|
||||||
files: |
|
files: vestige-mcp-${{ matrix.target }}.${{ matrix.archive }}
|
||||||
vestige-mcp-${{ matrix.target }}.${{ matrix.archive }}
|
|
||||||
vestige-mcp-${{ matrix.target }}.${{ matrix.archive }}.sha256
|
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|
|
||||||
13
.github/workflows/test.yml
vendored
13
.github/workflows/test.yml
vendored
|
|
@ -12,19 +12,6 @@ env:
|
||||||
VESTIGE_TEST_MOCK_EMBEDDINGS: "1"
|
VESTIGE_TEST_MOCK_EMBEDDINGS: "1"
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
hook-tests:
|
|
||||||
name: Hook Tests
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
timeout-minutes: 5
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
- uses: actions/setup-python@v5
|
|
||||||
with:
|
|
||||||
python-version: "3.9"
|
|
||||||
- run: python3 -m unittest discover -s tests/hooks -p 'test_*.py'
|
|
||||||
- run: python3 -m py_compile hooks/sanhedrin-local.py tests/hooks/test_sanhedrin_claim_mode.py
|
|
||||||
- run: bash -n hooks/sanhedrin.sh scripts/install-sandwich.sh scripts/check-sandwich-prereqs.sh
|
|
||||||
|
|
||||||
unit-tests:
|
unit-tests:
|
||||||
name: Unit Tests
|
name: Unit Tests
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
|
|
||||||
188
CHANGELOG.md
188
CHANGELOG.md
|
|
@ -7,194 +7,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
|
|
||||||
## [Unreleased]
|
## [Unreleased]
|
||||||
|
|
||||||
## [2.1.25] - 2026-06-12 — "Merge / Supersede Controls"
|
|
||||||
|
|
||||||
v2.1.25 ships Phase 3: diff-previewed, confidence-gated, reversible,
|
|
||||||
self-explaining combine/dedupe/supersede on a never-delete (bitemporal) store.
|
|
||||||
The default is always preview/review — these tools never silently mutate memory.
|
|
||||||
The differentiator is the reversible operation log: every merge/supersede/undo is
|
|
||||||
an auditable, reversible event with provenance ("why did these combine?") — a git
|
|
||||||
reflog for your agent's memory.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **Seven new MCP tools** for merge/supersede control:
|
|
||||||
- `merge_candidates` — surface likely duplicate/overlapping clusters with
|
|
||||||
confidence scores and the signals behind each (Fellegi-Sunter
|
|
||||||
match/possible/non-match). Read-only.
|
|
||||||
- `plan_merge` — produce a previewable merge PLAN (a diff of combined
|
|
||||||
content/tags/provenance) without applying it.
|
|
||||||
- `plan_supersede` — preview superseding A with B (bitemporal invalidation,
|
|
||||||
audit-preserving) without applying.
|
|
||||||
- `apply_plan` — execute a previously-generated plan id; recorded as a
|
|
||||||
reversible operation.
|
|
||||||
- `merge_undo` — reverse a prior merge/supersede operation, or list the
|
|
||||||
reversible operation log (the "memory reflog").
|
|
||||||
- `protect` — pin a memory so it can never be auto-merged, superseded, or
|
|
||||||
garbage-collected.
|
|
||||||
- `merge_policy` — get/set the per-project Fellegi-Sunter two thresholds
|
|
||||||
(`match_threshold`, `possible_threshold`) and `auto_apply`.
|
|
||||||
- **Bitemporal "invalidate, don't delete" supersede** (Graphiti-style): a
|
|
||||||
superseded memory is kept and stays queryable for audit. It is stamped with
|
|
||||||
`valid_until = now` and a new `superseded_by` lineage pointer, instead of being
|
|
||||||
deleted or merely demoted.
|
|
||||||
- **Reversible operation log** (`merge_operations` table) — every applied
|
|
||||||
merge/supersede records an undo payload and provenance signals so any operation
|
|
||||||
can be reversed, including restoring survivor content/tags and clearing the
|
|
||||||
bitemporal invalidation.
|
|
||||||
- **Fellegi-Sunter two-threshold scoring** for dedup/merge candidates, combining
|
|
||||||
embedding cosine similarity with tag and content-token overlap. Borderline
|
|
||||||
"possible" matches are surfaced for review instead of force-merged.
|
|
||||||
- **Memory protection / pinning** — `protected` column on `knowledge_nodes`;
|
|
||||||
protected memories are excluded from auto-merge/supersede/GC paths.
|
|
||||||
- **Migration V14** adding the `merge_plans` and `merge_operations` tables, the
|
|
||||||
`protected` and `superseded_by` columns on `knowledge_nodes`, and their
|
|
||||||
indexes. Idempotent on replay.
|
|
||||||
- **Docs**: `docs/MERGE_SUPERSEDE.md` describing the design, the bitemporal
|
|
||||||
model, the two-threshold policy, the reversible operation log, and the tool
|
|
||||||
surface.
|
|
||||||
|
|
||||||
### Notes
|
|
||||||
|
|
||||||
- All merge/supersede operations are **opt-in and preview-first**. `apply_plan`
|
|
||||||
requires `confirm=true` for `possible`/`non_match` plans, and only applies
|
|
||||||
`match` plans without confirmation when `merge_policy.auto_apply` is enabled
|
|
||||||
(default off). This deliberately avoids the silent-merge / auto-delete /
|
|
||||||
audit-trail-loss anti-patterns reported against other memory systems.
|
|
||||||
- The merge policy persists per-project and is also overridable via
|
|
||||||
`VESTIGE_MERGE_MATCH_THRESHOLD`, `VESTIGE_MERGE_POSSIBLE_THRESHOLD`, and
|
|
||||||
`VESTIGE_MERGE_AUTO_APPLY` environment variables.
|
|
||||||
|
|
||||||
## [2.1.23] - 2026-05-27 — "Receipt Lock Hardening"
|
|
||||||
|
|
||||||
v2.1.23 hardens the Sanhedrin launch path so Receipt Lock is portable,
|
|
||||||
observable, and precise enough for broader use.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **Model-agnostic Sanhedrin backend presets** for custom OpenAI-compatible
|
|
||||||
servers, small laptops, Ollama, MLX, vLLM, llama.cpp, hosted APIs, and
|
|
||||||
Anthropic via LiteLLM. Sanhedrin no longer guesses a large default verifier.
|
|
||||||
- **Fail-open telemetry** in `fail-open.jsonl`, plus a dashboard telemetry API
|
|
||||||
and 7-day ambient dashboard counters for vetoes, appeals, and fail-open runs.
|
|
||||||
- **Receipt schema documentation** covering receipt artifacts, appeals, command
|
|
||||||
ledgers, fail-open logs, compatibility rules, and staged-evidence trust
|
|
||||||
boundaries.
|
|
||||||
- **Opt-in CUDA feature flags** for Qwen3 embedding builds on NVIDIA hardware.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Receipt Lock strips code fences, inline code, blockquotes, quoted regions, and
|
|
||||||
scoped epistemic hedges before matching verification claims.
|
|
||||||
- Structured transcript tool-use receipts are the default evidence path; loose
|
|
||||||
JSON command scanning now requires `VESTIGE_SANHEDRIN_ALLOW_LOOSE_LEDGER=1`.
|
|
||||||
- Claim-mode sampling now prioritizes higher-severity claims instead of taking
|
|
||||||
the first eight source-order claims.
|
|
||||||
- Hosted Sanhedrin credentials now require `VESTIGE_SANHEDRIN_API_KEY` and are
|
|
||||||
only sent to the configured Sanhedrin endpoint, never to Vestige retrieval.
|
|
||||||
- `smart_ingest` batch mode now defaults to `batchMergePolicy: "force_create"`
|
|
||||||
so caller-separated items stay separate unless callers opt into smart merging.
|
|
||||||
- CUDA-enabled Qwen3 builds now try `Device::new_cuda(0)` before falling back to
|
|
||||||
Metal or CPU.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- Standalone dashboard mode now hydrates the cognitive engine for Dream and
|
|
||||||
Deep Reference instead of returning 503s.
|
|
||||||
- `--data-dir` now rejects existing non-directory paths with a clear error.
|
|
||||||
- `vestige-restore` now handles `--help` and `--version` instead of treating
|
|
||||||
them as backup file paths.
|
|
||||||
- Smart ingest merge/update responses now include `previousContent`,
|
|
||||||
`mergedFrom`, and `mergePreview` so callers can inspect mutated memories.
|
|
||||||
- Daily Sanhedrin telemetry now preserves NOTE and CAUTION buckets instead of
|
|
||||||
folding both into PASS.
|
|
||||||
|
|
||||||
## [2.1.22] - 2026-05-25 — "Sanhedrin Receipts"
|
|
||||||
|
|
||||||
v2.1.22 makes the optional Sanhedrin hook quieter and more accountable by
|
|
||||||
turning draft judgment into local, appealable receipts instead of opaque vetoes.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **Receipt Lock** blocks unsupported verification claims such as "tests passed"
|
|
||||||
unless the current transcript contains a matching successful test, build,
|
|
||||||
lint, or typecheck command receipt.
|
|
||||||
- **Veto receipts** are written to `~/.vestige/sanhedrin/latest.json` and
|
|
||||||
`latest.html` with Claim -> Verdict -> Precedent -> Fix -> Appeal fields.
|
|
||||||
- **Dashboard Verdict Bar** surfaces the latest PASS, NOTE, CAUTION, VETO, or
|
|
||||||
APPEALED state and lets users appeal stale, wrong, or too-strict vetoes.
|
|
||||||
- **Appeal training** records feedback in `appeals.jsonl` and suppresses future
|
|
||||||
vetoes for the same claim fingerprint.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- Sanhedrin claim-mode output now feeds a per-claim receipt ledger while keeping
|
|
||||||
the existing one-line Stop-hook contract for Claude Code.
|
|
||||||
|
|
||||||
## [2.1.21] - 2026-05-24 — "Agent-Neutral Hardening"
|
|
||||||
|
|
||||||
v2.1.21 is a release-hardening pass for normal MCP usage across agents. It keeps
|
|
||||||
Claude Code Cognitive Sandwich companion files optional while making the MCP
|
|
||||||
server, package installer, release workflow, and portable sync path safer.
|
|
||||||
|
|
||||||
### Added
|
|
||||||
|
|
||||||
- **Agent-neutral memory protocol** — new `docs/AGENT-MEMORY-PROTOCOL.md` gives
|
|
||||||
any MCP-compatible client the same practical memory loop: initialize context,
|
|
||||||
search/deep-reference when needed, save durable facts with `smart_ingest`, and
|
|
||||||
promote/demote/purge with `memory`.
|
|
||||||
- **HTTP transport opt-in** — `vestige-mcp` now requires `--http`,
|
|
||||||
`--http-port`, or `VESTIGE_HTTP_ENABLED=1` before starting MCP-over-HTTP.
|
|
||||||
- **Release checksums** — release assets now publish `.sha256` files beside each
|
|
||||||
archive.
|
|
||||||
|
|
||||||
### Changed
|
|
||||||
|
|
||||||
- **`vestige update` is binary-only by default** — Claude Code Cognitive
|
|
||||||
Sandwich companion files refresh only with `vestige update --sandwich-companion`
|
|
||||||
or `vestige sandwich install`.
|
|
||||||
- **MCP tool results include structured content** while keeping text content for
|
|
||||||
clients that only consume the classic MCP response shape.
|
|
||||||
- **NPM install messaging is agent-neutral** and unsupported release targets
|
|
||||||
fail fast instead of trying to download assets that do not exist.
|
|
||||||
- **Portable merge uses UPSERT instead of `INSERT OR REPLACE`** for keyed tables,
|
|
||||||
preserving related rows instead of causing delete-and-insert side effects.
|
|
||||||
|
|
||||||
### Fixed
|
|
||||||
|
|
||||||
- **Destructive delete confirmation** — `memory(action="delete")` now requires
|
|
||||||
`confirm=true`, matching `purge`; the deprecated `delete_knowledge` shim no
|
|
||||||
longer bypasses confirmation.
|
|
||||||
- **Portable purge tombstone sync** — merge imports now carry
|
|
||||||
`deletion_tombstones` and apply purges without retaining deleted memory text.
|
|
||||||
Hard purge tombstones win over newer local edits during portable sync, while
|
|
||||||
tombstone merges keep the newest deletion timestamp.
|
|
||||||
- **Vector index reload staleness** — loading persisted embeddings rebuilds the
|
|
||||||
in-memory index from an empty index before adding current embeddings.
|
|
||||||
- **HTTP transport hardening** — origin, Accept, session, and protocol-version
|
|
||||||
validation now reject incompatible or cross-origin browser requests earlier.
|
|
||||||
- **Init config safety** — `@vestige/init` backs up existing config files, writes
|
|
||||||
atomically, accepts JSONC-style comments/trailing commas, and no longer writes
|
|
||||||
Xcode trust-accepted flags.
|
|
||||||
- **Release tag checkout** — manual release builds now checkout the requested tag
|
|
||||||
or ref before packaging.
|
|
||||||
|
|
||||||
### Verified
|
|
||||||
|
|
||||||
- `cargo test -p vestige-mcp --lib --no-fail-fast`
|
|
||||||
- `cargo test -p vestige-mcp --bin vestige-mcp --no-fail-fast`
|
|
||||||
- `cargo test -p vestige-core portable_merge_import --no-fail-fast`
|
|
||||||
- `cargo test -p vestige-mcp --bin vestige --no-fail-fast`
|
|
||||||
- `cargo test -p vestige-e2e-tests --test mcp_protocol --no-fail-fast`
|
|
||||||
- `cargo check --workspace`
|
|
||||||
- `cargo metadata --format-version 1 --locked --no-deps`
|
|
||||||
- `pnpm --filter @vestige/dashboard check`
|
|
||||||
- `pnpm --filter @vestige/dashboard test`
|
|
||||||
- `pnpm --filter @vestige/dashboard build`
|
|
||||||
- `node --check packages/vestige-init/bin/init.js`
|
|
||||||
- `node --check packages/vestige-mcp-npm/scripts/postinstall.js`
|
|
||||||
- `node --check packages/vestige-mcp-npm/bin/vestige-restore.js`
|
|
||||||
|
|
||||||
## [2.1.2] - 2026-05-01 — "Honest Memory"
|
## [2.1.2] - 2026-05-01 — "Honest Memory"
|
||||||
|
|
||||||
v2.1.2 focuses on operational trust: exact search stays exact, purge really removes content, contradictions are directly inspectable, and the update flow no longer depends on copied curl commands.
|
v2.1.2 focuses on operational trust: exact search stays exact, purge really removes content, contradictions are directly inspectable, and the update flow no longer depends on copied curl commands.
|
||||||
|
|
|
||||||
|
|
@ -88,7 +88,7 @@ Tags: ["decision", "topic-name"]
|
||||||
| "Don't forget" | `smart_ingest` with tags: ["important"] |
|
| "Don't forget" | `smart_ingest` with tags: ["important"] |
|
||||||
| "I always..." / "I never..." | Save as preference |
|
| "I always..." / "I never..." | Save as preference |
|
||||||
| "I prefer..." / "I like..." | Save as preference |
|
| "I prefer..." / "I like..." | Save as preference |
|
||||||
| "This is important" | `smart_ingest` + `memory(action="promote")` |
|
| "This is important" | `smart_ingest` + `promote_memory` |
|
||||||
| "Remind me..." | Create `intention` with trigger |
|
| "Remind me..." | Create `intention` with trigger |
|
||||||
| "Next time we..." | Create `intention` with context trigger |
|
| "Next time we..." | Create `intention` with context trigger |
|
||||||
| "When I'm working on X..." | Create `intention` with codebase trigger |
|
| "When I'm working on X..." | Create `intention` with codebase trigger |
|
||||||
|
|
@ -115,7 +115,7 @@ Act on feedback immediately — don't ask permission to promote/demote.
|
||||||
|
|
||||||
### Proactive Health Checks
|
### Proactive Health Checks
|
||||||
If you notice degraded recall or a user mentions memory issues:
|
If you notice degraded recall or a user mentions memory issues:
|
||||||
1. Run `system_status` — check overall system status
|
1. Run `health_check` — check overall system status
|
||||||
2. If `averageRetention < 0.5` → suggest running `consolidate`
|
2. If `averageRetention < 0.5` → suggest running `consolidate`
|
||||||
3. If `dueForReview > 50` → mention that some memories need review
|
3. If `dueForReview > 50` → mention that some memories need review
|
||||||
|
|
||||||
|
|
|
||||||
120
Cargo.lock
generated
120
Cargo.lock
generated
|
|
@ -392,10 +392,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6bd9895436c1ba5dc1037a19935d084b838db066ff4e15ef7dded020b7c12a4a"
|
checksum = "6bd9895436c1ba5dc1037a19935d084b838db066ff4e15ef7dded020b7c12a4a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"byteorder",
|
"byteorder",
|
||||||
"candle-kernels",
|
|
||||||
"candle-metal-kernels",
|
"candle-metal-kernels",
|
||||||
"candle-ug",
|
"candle-ug",
|
||||||
"cudarc 0.19.7",
|
|
||||||
"float8",
|
"float8",
|
||||||
"gemm 0.19.0",
|
"gemm 0.19.0",
|
||||||
"half",
|
"half",
|
||||||
|
|
@ -415,15 +413,6 @@ dependencies = [
|
||||||
"zip",
|
"zip",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "candle-kernels"
|
|
||||||
version = "0.10.2"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "742e2ac226b777134436e9e692f44e77c278b8a7abb1554dc10e44dc911b349f"
|
|
||||||
dependencies = [
|
|
||||||
"cudaforge",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "candle-metal-kernels"
|
name = "candle-metal-kernels"
|
||||||
version = "0.10.2"
|
version = "0.10.2"
|
||||||
|
|
@ -464,7 +453,6 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "ca0fc3167cbc99c8ec1be618cb620aa21dca95038f118c3579a79370e3dc5f77"
|
checksum = "ca0fc3167cbc99c8ec1be618cb620aa21dca95038f118c3579a79370e3dc5f77"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ug",
|
"ug",
|
||||||
"ug-cuda",
|
|
||||||
"ug-metal",
|
"ug-metal",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
@ -783,46 +771,6 @@ dependencies = [
|
||||||
"typenum",
|
"typenum",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cudaforge"
|
|
||||||
version = "0.1.5"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6f7a0d45b139b5beeeb1c34188717e12241c44a0120afb498815ce7f5373c691"
|
|
||||||
dependencies = [
|
|
||||||
"anyhow",
|
|
||||||
"fs2",
|
|
||||||
"glob",
|
|
||||||
"num_cpus",
|
|
||||||
"rayon",
|
|
||||||
"serde",
|
|
||||||
"serde_json",
|
|
||||||
"sha2",
|
|
||||||
"thiserror 2.0.18",
|
|
||||||
"walkdir",
|
|
||||||
"which",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cudarc"
|
|
||||||
version = "0.17.8"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0bf99ab37ee7072d64d906aa2dada9a3422f1d975cdf8c8055a573bc84897ed8"
|
|
||||||
dependencies = [
|
|
||||||
"half",
|
|
||||||
"libloading 0.8.9",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cudarc"
|
|
||||||
version = "0.19.7"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "1cea5f10a99e025c1b44ae2354c2d8326b25ddbd0baf76bde8e55cfd4018a2cc"
|
|
||||||
dependencies = [
|
|
||||||
"float8",
|
|
||||||
"half",
|
|
||||||
"libloading 0.9.0",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cxx"
|
name = "cxx"
|
||||||
version = "1.0.194"
|
version = "1.0.194"
|
||||||
|
|
@ -1086,12 +1034,6 @@ dependencies = [
|
||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "env_home"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "c7f84e12ccf0a7ddc17a6c41c93326024c42920d7ee630d04950e6926645c0fe"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "equator"
|
name = "equator"
|
||||||
version = "0.4.2"
|
version = "0.4.2"
|
||||||
|
|
@ -1312,16 +1254,6 @@ dependencies = [
|
||||||
"percent-encoding",
|
"percent-encoding",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "fs2"
|
|
||||||
version = "0.4.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
|
|
||||||
dependencies = [
|
|
||||||
"libc",
|
|
||||||
"winapi",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "fsevent-sys"
|
name = "fsevent-sys"
|
||||||
version = "4.1.0"
|
version = "4.1.0"
|
||||||
|
|
@ -1700,12 +1632,6 @@ dependencies = [
|
||||||
"url",
|
"url",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "glob"
|
|
||||||
version = "0.3.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "h2"
|
name = "h2"
|
||||||
version = "0.4.13"
|
version = "0.4.13"
|
||||||
|
|
@ -3826,17 +3752,6 @@ dependencies = [
|
||||||
"digest",
|
"digest",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "sha2"
|
|
||||||
version = "0.10.9"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283"
|
|
||||||
dependencies = [
|
|
||||||
"cfg-if",
|
|
||||||
"cpufeatures",
|
|
||||||
"digest",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "sharded-slab"
|
name = "sharded-slab"
|
||||||
version = "0.1.7"
|
version = "0.1.7"
|
||||||
|
|
@ -4412,19 +4327,6 @@ dependencies = [
|
||||||
"yoke 0.7.5",
|
"yoke 0.7.5",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "ug-cuda"
|
|
||||||
version = "0.5.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9f0a1fa748f26166778c33b8498255ebb7c6bffb472bcc0a72839e07ebb1d9b5"
|
|
||||||
dependencies = [
|
|
||||||
"cudarc 0.17.8",
|
|
||||||
"half",
|
|
||||||
"serde",
|
|
||||||
"thiserror 1.0.69",
|
|
||||||
"ug",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "ug-metal"
|
name = "ug-metal"
|
||||||
version = "0.5.0"
|
version = "0.5.0"
|
||||||
|
|
@ -4629,7 +4531,7 @@ checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vestige-core"
|
name = "vestige-core"
|
||||||
version = "2.1.25"
|
version = "2.1.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"candle-core",
|
"candle-core",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
|
@ -4665,7 +4567,7 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "vestige-mcp"
|
name = "vestige-mcp"
|
||||||
version = "2.1.25"
|
version = "2.1.2"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"axum",
|
"axum",
|
||||||
|
|
@ -4890,18 +4792,6 @@ version = "0.1.12"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
|
checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "which"
|
|
||||||
version = "7.0.3"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "24d643ce3fd3e5b54854602a080f34fb10ab75e0b813ee32d00ca2b44fa74762"
|
|
||||||
dependencies = [
|
|
||||||
"either",
|
|
||||||
"env_home",
|
|
||||||
"rustix",
|
|
||||||
"winsafe",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winapi"
|
name = "winapi"
|
||||||
version = "0.3.9"
|
version = "0.3.9"
|
||||||
|
|
@ -5168,12 +5058,6 @@ version = "0.53.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
|
checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "winsafe"
|
|
||||||
version = "0.0.19"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-bindgen"
|
name = "wit-bindgen"
|
||||||
version = "0.51.0"
|
version = "0.51.0"
|
||||||
|
|
|
||||||
|
|
@ -10,7 +10,7 @@ exclude = [
|
||||||
]
|
]
|
||||||
|
|
||||||
[workspace.package]
|
[workspace.package]
|
||||||
version = "2.1.25"
|
version = "2.1.2"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
license = "AGPL-3.0-only"
|
license = "AGPL-3.0-only"
|
||||||
repository = "https://github.com/samvallad33/vestige"
|
repository = "https://github.com/samvallad33/vestige"
|
||||||
|
|
|
||||||
186
README.md
186
README.md
|
|
@ -2,36 +2,111 @@
|
||||||
|
|
||||||
# Vestige
|
# Vestige
|
||||||
|
|
||||||
### Local cognitive memory for MCP-compatible AI agents.
|
### The cognitive engine that gives AI agents a brain.
|
||||||
|
|
||||||
[](https://github.com/samvallad33/vestige)
|
[](https://github.com/samvallad33/vestige)
|
||||||
[](https://github.com/samvallad33/vestige/releases/latest)
|
[](https://github.com/samvallad33/vestige/releases/latest)
|
||||||
[](https://github.com/samvallad33/vestige/actions)
|
[](https://github.com/samvallad33/vestige/actions)
|
||||||
[](LICENSE)
|
[](LICENSE)
|
||||||
[](https://modelcontextprotocol.io)
|
[](https://modelcontextprotocol.io)
|
||||||
|
|
||||||
**Your agent forgets project decisions between sessions. Vestige gives it local, inspectable memory.**
|
**Your Agent forgets everything between sessions. Vestige fixes that.**
|
||||||
|
|
||||||
Built on proven memory and retrieval ideas — FSRS-6 spaced repetition, prediction error gating, synaptic tagging, spreading activation, and memory consolidation — all running in a single Rust binary with a local dashboard. 100% local. Zero cloud.
|
Built on 130 years of memory research — FSRS-6 spaced repetition, prediction error gating, synaptic tagging, spreading activation, memory dreaming — all running in a single Rust binary with a 3D neural visualization dashboard. 100% local. Zero cloud.
|
||||||
|
|
||||||
[Quick Start](#quick-start) | [Dashboard](#-3d-memory-dashboard) | [How It Works](#-the-cognitive-science-stack) | [Tools](#-25-mcp-tools) | [Docs](docs/)
|
[Quick Start](#quick-start) | [Dashboard](#-3d-memory-dashboard) | [How It Works](#-the-cognitive-science-stack) | [Tools](#-24-mcp-tools) | [Docs](docs/)
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## What's New in v2.1.23 "Receipt Lock Hardening"
|
## What's New in v2.1.2 "Honest Memory"
|
||||||
|
|
||||||
v2.1.23 turns the Sanhedrin Receipt Lock launch into something more portable,
|
v2.1.2 makes Vestige easier to trust in everyday work: literal lookups stay literal, purge really removes content, contradictions are inspectable, and updates no longer require a curl reinstall flow.
|
||||||
observable, and harder to spoof.
|
|
||||||
|
|
||||||
- **Model-agnostic Sanhedrin presets.** Sanhedrin no longer guesses a large default verifier. Users choose any OpenAI-compatible endpoint/model, or start from custom, small laptop, Ollama, MLX, vLLM, llama.cpp, hosted API, or LiteLLM presets.
|
- **Concrete search mode.** Quoted strings, env vars, UUIDs, paths, and code identifiers now take a keyword/literal path that skips HyDE, semantic fusion, FSRS reweighting, competition, and spreading activation. Exact things like `OPENAI_API_KEY`, `mlx_lm.server`, and migration IDs land first.
|
||||||
- **Sharper Receipt Lock.** Verification claims inside code fences, quotes, blockquotes, or explicitly hedged "let me verify" language no longer trigger false vetoes, while actual "tests passed" claims still require command receipts.
|
- **Irreversible purge.** `memory(action="purge", confirm=true)` permanently removes memory content and embeddings, scrubs insight JSON references, detaches temporal-summary children, prunes graph edges, and keeps only a non-content deletion tombstone for sync/audit.
|
||||||
- **Safer command receipts.** Transcript command evidence now prefers structured tool-use receipts; loose JSON scanning is opt-in only.
|
- **First-class contradiction inspection.** New `contradictions` MCP tool surfaces trust-weighted disagreements directly instead of hiding them inside `deep_reference`.
|
||||||
- **Visible fail-open telemetry.** Timeouts, unavailable model endpoints, and malformed verdicts are logged locally and surfaced in the dashboard's 7-day Sanhedrin stats.
|
- **Simple update flow.** `vestige update` and `vestige sandwich install` refresh binaries and companion files without making users paste curl commands.
|
||||||
- **Durable evidence boundary.** Staged evidence remains useful context, but it cannot satisfy durable support or contradiction requirements by itself.
|
- **Pro waitlist preview.** `/dashboard/waitlist` adds a local-first Solo Pro and Team Pro early-access surface. `VITE_WAITLIST_ENDPOINT` and `VITE_SUPPORT_BOT_ENDPOINT` are opt-in dashboard env vars, so no signup data is captured unless endpoints are configured.
|
||||||
- **Safer batch writes.** `smart_ingest` batch mode now keeps caller-separated items separate by default and returns merge previews when an existing memory is mutated.
|
|
||||||
- **Opt-in NVIDIA acceleration path.** Qwen3 embedding builds expose CUDA/cuDNN feature flags for contributors and users with CUDA-capable hosts.
|
## What's New in v2.1.1 "Portable Sync"
|
||||||
|
|
||||||
|
v2.1.1 focuses on the biggest post-launch ask: move memories between machines without losing cognitive state. It also adds opt-in Qwen3 embeddings for higher-recall local retrieval.
|
||||||
|
|
||||||
|
- **Exact portable archives.** `vestige portable-export` / `vestige portable-import` preserve IDs, FSRS state, graph edges, suppression state, audit rows, and embedding blobs for Vestige-to-Vestige device transfer.
|
||||||
|
- **Sync-safe merge storage.** `vestige portable-import --merge` and `vestige sync <archive>` merge non-empty databases, apply delete tombstones, keep newer local memories, rebuild FTS, and push through a pluggable portable-sync backend. v2.1.1 ships the file backend for Dropbox, iCloud, Syncthing, Git, and shared folders.
|
||||||
|
- **Qwen3 embeddings.** Build with `qwen3-embeddings`, set `VESTIGE_EMBEDDING_MODEL=qwen3-0.6b`, and run `vestige consolidate` to re-embed existing memories. `vestige health` reports mixed-model stores before search quality is affected.
|
||||||
|
- **Model-aware retrieval.** Vestige now avoids comparing Qwen and Nomic vectors in the same search/dedup path.
|
||||||
|
|
||||||
|
## What's New in v2.1.0 "Cognitive Sandwich Goes Local"
|
||||||
|
|
||||||
|
v2.1.0 adds an opt-in Claude Code hook harness around the existing Vestige MCP server. The MCP tool surface and database schema stay backward compatible, while preflight hooks can inject trusted memory context before Claude answers. The heavyweight Sanhedrin verifier is optional and can be enabled separately.
|
||||||
|
|
||||||
|
- **Optional Sanhedrin Executioner.** The post-response verifier is off by default. Users can enable it with an OpenAI-compatible endpoint on x86/Linux/Intel Mac, or add `--with-launchd` on Apple Silicon to run the local MLX Qwen backend.
|
||||||
|
- **One-command Cognitive Sandwich installer.** `vestige sandwich install` stages hook files and agents by default, removes old Vestige hook wiring, and leaves all Claude Code hook layers plus the 19 GB model path opt-in.
|
||||||
|
- **Pulse hook backed by `/api/changelog`.** Fresh dream and connection events can be injected into the next Claude Code prompt context without blocking the prompt.
|
||||||
|
- **`VESTIGE_DATA_DIR` support.** `--data-dir` now has an env-var fallback, tilde expansion, secure directory creation, and clear precedence docs.
|
||||||
|
- **NPM release wrapper fixed.** `vestige-mcp-server@2.1.0` now downloads binaries from the matching `v2.1.0` GitHub release tag instead of an old hardcoded release.
|
||||||
|
|
||||||
|
## What's New in v2.0.9 "Autopilot"
|
||||||
|
|
||||||
|
Autopilot flips Vestige from passive memory library to **self-managing cognitive surface**. Same 24 MCP tools, zero schema changes — but the moment you upgrade, 14 previously dormant cognitive primitives start firing on live events without any tool call from your client.
|
||||||
|
|
||||||
|
- **One supervised backend task subscribes to the 20-event WebSocket bus** and routes six event classes into the cognitive engine: `MemoryCreated` triggers synaptic-tagging PRP + predictive-access records, `SearchPerformed` warms the speculative-retrieval model, `MemoryPromoted` fires activation spread, `MemorySuppressed` emits the Rac1 cascade wave, high-importance `ImportanceScored` (>0.85) auto-promotes, and `Heartbeat` rate-limit-fires `find_duplicates` on large DBs. **The engine mutex is never held across `.await`, so MCP dispatch is never starved.**
|
||||||
|
- **Panic-resilient supervisors.** Both background tasks run inside an outer supervisor loop — if one handler panics on a bad memory, the supervisor respawns it in 5 s instead of losing every future event.
|
||||||
|
- **Fully backward compatible.** No new MCP tools. No schema migration. Existing v2.0.8 databases open without a single step. Opt out with `VESTIGE_AUTOPILOT_ENABLED=0` if you want the passive-library contract back.
|
||||||
|
- **3,091 LOC of orphan v1.0 tool code removed** — nine superseded modules (`checkpoint`, `codebase`, `consolidate`, `ingest`, `intentions`, `knowledge`, `recall`, plus helpers) verified zero non-test callers before deletion. Tool surface unchanged.
|
||||||
|
|
||||||
|
## What's New in v2.0.8 "Pulse"
|
||||||
|
|
||||||
|
v2.0.8 wires the dashboard through to the cognitive engine. Eight new surfaces expose the reasoning stack visually — every one was MCP-only before.
|
||||||
|
|
||||||
|
- **Reasoning Theater (`/reasoning`)** — `Cmd+K` Ask palette over the 8-stage `deep_reference` pipeline (hybrid retrieval → cross-encoder rerank → spreading activation → FSRS-6 trust → temporal supersession → contradiction analysis → relation assessment → template reasoning chain). Evidence cards, confidence meter, contradiction geodesic arcs, superseded-memory lineage, evolution timeline. **Zero LLM calls, 100% local.**
|
||||||
|
- **Pulse InsightToast** — real-time toasts for `DreamCompleted`, `ConsolidationCompleted`, `ConnectionDiscovered`, promote/demote/suppress/unsuppress, `Rac1CascadeSwept`. Rate-limited, auto-dismiss, click-to-dismiss.
|
||||||
|
- **Memory Birth Ritual (Terrarium)** — new memories materialize in the 3D graph on every `MemoryCreated`: elastic scale-in, quadratic Bezier flight path, glow sprite fade-in, Newton's Cradle docking recoil. 60-frame sequence, zero-alloc math.
|
||||||
|
- **7 more dashboard surfaces** — `/duplicates`, `/dreams`, `/schedule`, `/importance`, `/activation`, `/contradictions`, `/patterns`. Left nav expanded 8 → 16 with single-key shortcuts.
|
||||||
|
- **Intel Mac (`x86_64-apple-darwin`) support restored** via the `ort-dynamic` Cargo feature + Homebrew `onnxruntime`. Microsoft deprecated x86_64 macOS prebuilts; the dynamic-link path sidesteps that permanently. **Closes #41.**
|
||||||
|
- **Contradiction-detection false positives eliminated** — four thresholds tightened so adjacent-domain memories no longer flag as conflicts. On an FSRS-6 query this collapses false contradictions 12 → 0 without regressing legitimate test cases.
|
||||||
|
|
||||||
|
## What's New in v2.0.7 "Visible"
|
||||||
|
|
||||||
|
Hygiene release closing two UI gaps and finishing schema cleanup. No breaking changes, no user-data migrations.
|
||||||
|
|
||||||
|
- **`POST /api/memories/{id}/suppress` + `/unsuppress` HTTP endpoints** — dashboard can trigger Anderson 2025 SIF + Rac1 cascade without dropping to raw MCP. `suppressionCount`, `retrievalPenalty`, `reversibleUntil`, `labileWindowHours` all in response. Suppress button joins Promote / Demote / Delete on the Memories page.
|
||||||
|
- **Uptime in the sidebar footer** — the `Heartbeat` event has carried `uptime_secs` since v2.0.5 but was never rendered. Now shows as `up 3d 4h` / `up 18m` / `up 47s`.
|
||||||
|
- **`execute_export` panic fix** — unreachable match arm replaced with a clean "unsupported export format" error instead of unwinding through the MCP dispatcher.
|
||||||
|
- **`predict` surfaces `predict_degraded: true`** on lock poisoning instead of silently returning empty vecs. `memory_changelog` honors `start` / `end` bounds. `intention` check honors `include_snoozed`.
|
||||||
|
- **Migration V11** — drops dead `knowledge_edges` + `compressed_memories` tables (added speculatively in V4, never used).
|
||||||
|
|
||||||
|
## What's New in v2.0.6 "Composer"
|
||||||
|
|
||||||
|
v2.0.6 is a polish release that makes the existing cognitive stack finally *feel* alive in the dashboard and stays out of your way on the prompt side.
|
||||||
|
|
||||||
|
- **Six live graph reactions, not one** — `MemorySuppressed`, `MemoryUnsuppressed`, `Rac1CascadeSwept`, `Connected`, `ConsolidationStarted`, and `ImportanceScored` now light the 3D graph in real time. v2.0.5 shipped `suppress` but the graph was silent when you called it; consolidation and importance scoring have been silent since v2.0.0. No longer.
|
||||||
|
- **Intentions page actually works** — fixes a long-standing bug where every intention rendered as "normal priority" (type/schema drift between backend and frontend) and context/time triggers surfaced as raw JSON.
|
||||||
|
- **Opt-in composition mandate** — the new MCP `instructions` string stays minimal by default. Opt in to the full Composing / Never-composed / Recommendation composition protocol with `VESTIGE_SYSTEM_PROMPT_MODE=full` when you want it, and nothing is imposed on your sessions when you don't.
|
||||||
|
|
||||||
|
## What's New in v2.0.5 "Intentional Amnesia"
|
||||||
|
|
||||||
|
**The first shipped AI memory system with top-down inhibitory control over retrieval.** Other systems implement passive decay — memories fade if you don't touch them. Vestige v2.0.5 also implements *active* suppression: the new **`suppress`** tool compounds a retrieval penalty on every call (up to 80%), a background Rac1 worker fades co-activated neighbors over 72 hours, and the whole thing is reversible within a 24-hour labile window. **Never deletes.** The memory is inhibited, not erased.
|
||||||
|
|
||||||
|
Ebbinghaus 1885 models what happens to memories you don't touch. Anderson 2025 models what happens when you actively want to stop thinking about one. Every other AI memory system implements the first. Vestige is the first to ship the second.
|
||||||
|
|
||||||
|
Based on [Anderson et al. 2025](https://www.nature.com/articles/s41583-025-00929-y) (Suppression-Induced Forgetting, *Nat Rev Neurosci*) and [Cervantes-Sandoval et al. 2020](https://pmc.ncbi.nlm.nih.gov/articles/PMC7477079/) (Rac1 synaptic cascade).
|
||||||
|
|
||||||
|
<details>
|
||||||
|
<summary>Earlier releases (v2.0 "Cognitive Leap" → v2.0.4 "Deep Reference")</summary>
|
||||||
|
|
||||||
|
- **v2.0.4 — `deep_reference` Tool** — 8-stage cognitive reasoning pipeline with FSRS-6 trust scoring, intent classification, spreading activation, contradiction analysis, and pre-built reasoning chains. Token budgets raised 10K → 100K. CORS tightened.
|
||||||
|
- **v2.0 — 3D Memory Dashboard** — SvelteKit + Three.js neural visualization with real-time WebSocket events, bloom post-processing, force-directed graph layout.
|
||||||
|
- **v2.0 — WebSocket Event Bus** — Every cognitive operation broadcasts events: memory creation, search, dreaming, consolidation, retention decay.
|
||||||
|
- **v2.0 — HyDE Query Expansion** — Template-based Hypothetical Document Embeddings for dramatically improved search quality on conceptual queries.
|
||||||
|
- **v2.0 — Nomic v2 MoE (experimental)** — fastembed 5.11 with optional Nomic Embed Text v2 MoE (475M params, 8 experts) + Metal GPU acceleration.
|
||||||
|
- **v2.0 — Command Palette** — `Cmd+K` navigation, keyboard shortcuts, responsive mobile layout, PWA installable.
|
||||||
|
- **v2.0 — FSRS Decay Visualization** — SVG retention curves with predicted decay at 1d/7d/30d.
|
||||||
|
|
||||||
|
</details>
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -41,11 +116,10 @@ observable, and harder to spoof.
|
||||||
# 1. Install
|
# 1. Install
|
||||||
npm install -g vestige-mcp-server@latest
|
npm install -g vestige-mcp-server@latest
|
||||||
|
|
||||||
# 2. Connect to any MCP-compatible agent
|
# 2. Connect to Claude Code
|
||||||
# Claude Code
|
|
||||||
claude mcp add vestige vestige-mcp -s user
|
claude mcp add vestige vestige-mcp -s user
|
||||||
|
|
||||||
# Codex
|
# Or connect to Codex
|
||||||
codex mcp add vestige -- vestige-mcp
|
codex mcp add vestige -- vestige-mcp
|
||||||
|
|
||||||
# 3. Test it
|
# 3. Test it
|
||||||
|
|
@ -63,9 +137,9 @@ codex mcp add vestige -- vestige-mcp
|
||||||
vestige update
|
vestige update
|
||||||
```
|
```
|
||||||
|
|
||||||
`vestige update` updates only the Vestige binaries by default. Use
|
`vestige update` updates the binaries and refreshes Cognitive Sandwich companion
|
||||||
`vestige update --sandwich-companion` if you also want to refresh optional Claude
|
files while keeping every hook layer disabled by default. Use
|
||||||
Code Cognitive Sandwich companion files.
|
`vestige update --no-sandwich` if you only want the binaries.
|
||||||
|
|
||||||
**macOS/Linux manual binary install:**
|
**macOS/Linux manual binary install:**
|
||||||
```bash
|
```bash
|
||||||
|
|
@ -105,7 +179,7 @@ Open `%APPDATA%\Claude\claude_desktop_config.json` and point Claude Desktop at t
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
If Claude Desktop cannot find `vestige-mcp`, run `where vestige-mcp` in PowerShell and use the exact `.cmd` path it prints as `command`. Example: `"C:\\Users\\you\\AppData\\Roaming\\npm\\vestige-mcp.cmd"`. Reopen Claude Desktop after saving. Future binary updates use `vestige update`; optional Claude Code companion files require `vestige update --sandwich-companion`.
|
If Claude Desktop cannot find `vestige-mcp`, run `where vestige-mcp` in PowerShell and use the exact `.cmd` path it prints as `command`. Example: `"C:\\Users\\you\\AppData\\Roaming\\npm\\vestige-mcp.cmd"`. Reopen Claude Desktop after saving. Future binary and companion-file updates can run with `vestige update`.
|
||||||
|
|
||||||
**Windows source build:** Prebuilt binaries ship but `usearch 2.24.0` hit an MSVC compile break ([usearch#746](https://github.com/unum-cloud/usearch/issues/746)); we've pinned `=2.23.0` until upstream fixes it. Source builds work with:
|
**Windows source build:** Prebuilt binaries ship but `usearch 2.24.0` hit an MSVC compile break ([usearch#746](https://github.com/unum-cloud/usearch/issues/746)); we've pinned `=2.23.0` until upstream fixes it. Source builds work with:
|
||||||
|
|
||||||
|
|
@ -132,7 +206,7 @@ cargo build --release -p vestige-mcp --features metal
|
||||||
|
|
||||||
## Works Everywhere
|
## Works Everywhere
|
||||||
|
|
||||||
Vestige speaks MCP, so any client that can register a stdio MCP server can use it.
|
Vestige speaks MCP — the universal protocol for AI tools. One brain, every IDE.
|
||||||
|
|
||||||
| IDE | Setup |
|
| IDE | Setup |
|
||||||
|-----|-------|
|
|-----|-------|
|
||||||
|
|
@ -305,9 +379,16 @@ This isn't a key-value store with an embedding model bolted on. Vestige implemen
|
||||||
|
|
||||||
## Make Your AI Use Vestige Automatically
|
## Make Your AI Use Vestige Automatically
|
||||||
|
|
||||||
Registering the MCP server exposes tools; the agent still needs an instruction
|
Add this to your `CLAUDE.md`:
|
||||||
that tells it when to call memory. Use the agent-neutral protocol, then adapt it
|
|
||||||
to your client-specific instruction file.
|
```markdown
|
||||||
|
## Memory
|
||||||
|
|
||||||
|
At the start of every session:
|
||||||
|
1. Search Vestige for user preferences and project context
|
||||||
|
2. Save bug fixes, decisions, and patterns without being asked
|
||||||
|
3. Create reminders when the user mentions deadlines
|
||||||
|
```
|
||||||
|
|
||||||
| You Say | AI Does |
|
| You Say | AI Does |
|
||||||
|---------|---------|
|
|---------|---------|
|
||||||
|
|
@ -316,7 +397,7 @@ to your client-specific instruction file.
|
||||||
| "Remind me..." | Creates a future trigger |
|
| "Remind me..." | Creates a future trigger |
|
||||||
| "This is important" | Saves + promotes |
|
| "This is important" | Saves + promotes |
|
||||||
|
|
||||||
[Agent memory protocol ->](docs/AGENT-MEMORY-PROTOCOL.md) · [Claude Code template ->](docs/CLAUDE-SETUP.md)
|
[Full CLAUDE.md templates ->](docs/CLAUDE-SETUP.md)
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|
@ -325,7 +406,7 @@ to your client-specific instruction file.
|
||||||
| Metric | Value |
|
| Metric | Value |
|
||||||
|--------|-------|
|
|--------|-------|
|
||||||
| **Language** | Rust 2024 edition (MSRV 1.91) |
|
| **Language** | Rust 2024 edition (MSRV 1.91) |
|
||||||
| **Codebase** | 80,000+ lines with Rust core/MCP/e2e, dashboard, and hook coverage |
|
| **Codebase** | 80,000+ lines, 1,292 tests (366 core + 425 mcp + 497 e2e + 4 doctests) |
|
||||||
| **Binary size** | ~20MB |
|
| **Binary size** | ~20MB |
|
||||||
| **Embeddings** | Nomic Embed Text v1.5 by default (768d -> 256d Matryoshka, 8192 context); Qwen3 0.6B optional |
|
| **Embeddings** | Nomic Embed Text v1.5 by default (768d -> 256d Matryoshka, 8192 context); Qwen3 0.6B optional |
|
||||||
| **Vector search** | USearch HNSW (20x faster than FAISS) |
|
| **Vector search** | USearch HNSW (20x faster than FAISS) |
|
||||||
|
|
@ -345,53 +426,6 @@ cargo build --release -p vestige-mcp --features qwen3-embeddings,metal
|
||||||
VESTIGE_EMBEDDING_MODEL=qwen3-0.6b vestige consolidate
|
VESTIGE_EMBEDDING_MODEL=qwen3-0.6b vestige consolidate
|
||||||
```
|
```
|
||||||
|
|
||||||
### Building with CUDA support (NVIDIA hosts - Windows / Linux)
|
|
||||||
|
|
||||||
The `cuda` feature routes Qwen3 embedding through NVIDIA GPUs via
|
|
||||||
`candle-core/cuda`. On a host with the CUDA toolkit installed and a supported
|
|
||||||
NVIDIA runtime, this drops Qwen3-Embedding inference from CPU-bound to GPU-bound
|
|
||||||
for batched workloads.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Linux / Windows + CUDA toolkit (12.x or 13.x)
|
|
||||||
cargo build --release -p vestige-mcp --features qwen3-embeddings,cuda
|
|
||||||
|
|
||||||
# Optional cuDNN acceleration on top of CUDA
|
|
||||||
cargo build --release -p vestige-mcp --features qwen3-embeddings,cudnn
|
|
||||||
|
|
||||||
VESTIGE_EMBEDDING_MODEL=qwen3-0.6b vestige consolidate
|
|
||||||
```
|
|
||||||
|
|
||||||
**Prerequisites:**
|
|
||||||
|
|
||||||
- NVIDIA driver + CUDA toolkit (12.x or 13.x). Verify with `nvcc --version`.
|
|
||||||
- A C++ host compiler that `nvcc` can drive (Linux: `gcc`; Windows: MSVC /
|
|
||||||
`cl.exe` from a recent Visual Studio Build Tools install).
|
|
||||||
|
|
||||||
**Windows + MSVC + CUDA 13.x build note.** Recent CCCL headers shipped with
|
|
||||||
CUDA 13.x require the modern preprocessor. Without it, the `candle-kernels`
|
|
||||||
`.cu` compile pass can fail at `cuda/include/cuda/std/__cccl/compiler.h`. Set
|
|
||||||
this env var before `cargo build` to pass `/Zc:preprocessor` through `nvcc`:
|
|
||||||
|
|
||||||
```powershell
|
|
||||||
# PowerShell
|
|
||||||
$env:NVCC_PREPEND_FLAGS = '-Xcompiler="/Zc:preprocessor"'
|
|
||||||
cargo build --release -p vestige-mcp --features qwen3-embeddings,cuda
|
|
||||||
```
|
|
||||||
|
|
||||||
```cmd
|
|
||||||
:: cmd.exe
|
|
||||||
set NVCC_PREPEND_FLAGS=-Xcompiler="/Zc:preprocessor"
|
|
||||||
cargo build --release -p vestige-mcp --features qwen3-embeddings,cuda
|
|
||||||
```
|
|
||||||
|
|
||||||
Linux + CUDA 13.x builds with `gcc` do not need the equivalent flag.
|
|
||||||
|
|
||||||
**Verifying GPU is actually used.** With CUDA-enabled builds, run
|
|
||||||
`VESTIGE_EMBEDDING_MODEL=qwen3-0.6b vestige consolidate` on a corpus of 1000+
|
|
||||||
memories and watch `nvidia-smi`; embedding passes should pin a single GPU while
|
|
||||||
the run is active.
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## CLI
|
## CLI
|
||||||
|
|
@ -447,7 +481,7 @@ First run downloads ~130MB from Hugging Face. If behind a proxy:
|
||||||
export HTTPS_PROXY=your-proxy:port
|
export HTTPS_PROXY=your-proxy:port
|
||||||
```
|
```
|
||||||
|
|
||||||
Cache: platform user cache directory first, then `./.fastembed_cache` as a fallback. Override with `FASTEMBED_CACHE_PATH`.
|
Cache: macOS `~/Library/Caches/com.vestige.core/fastembed` | Linux `~/.cache/vestige/fastembed`
|
||||||
</details>
|
</details>
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
|
||||||
|
|
@ -4,8 +4,7 @@
|
||||||
|
|
||||||
| Version | Supported |
|
| Version | Supported |
|
||||||
| ------- | ------------------ |
|
| ------- | ------------------ |
|
||||||
| 2.1.x | :white_check_mark: |
|
| 2.0.x | :white_check_mark: |
|
||||||
| 2.0.x | Critical fixes only |
|
|
||||||
| 1.x | :x: |
|
| 1.x | :x: |
|
||||||
|
|
||||||
## Reporting a Vulnerability
|
## Reporting a Vulnerability
|
||||||
|
|
@ -28,13 +27,13 @@ You can expect a response within 48 hours.
|
||||||
|
|
||||||
Vestige is a **local MCP server** designed to run on your machine with your user permissions:
|
Vestige is a **local MCP server** designed to run on your machine with your user permissions:
|
||||||
|
|
||||||
- **Trusted**: The MCP client or local agent that connects via stdio
|
- **Trusted**: The MCP client (Claude Code/Desktop) that connects via stdio
|
||||||
- **Untrusted**: Content passed through MCP tool arguments (validated before use)
|
- **Untrusted**: Content passed through MCP tool arguments (validated before use)
|
||||||
|
|
||||||
### What Vestige Does NOT Do
|
### What Vestige Does NOT Do
|
||||||
|
|
||||||
- ❌ Make network requests during normal memory use, except first-run model download from Hugging Face
|
- ❌ Make network requests (except first-run model download from Hugging Face)
|
||||||
- ❌ Require telemetry, hosted memory storage, or a cloud account
|
- ❌ Execute shell commands
|
||||||
- ❌ Access files outside its data directory
|
- ❌ Access files outside its data directory
|
||||||
- ❌ Send telemetry or analytics
|
- ❌ Send telemetry or analytics
|
||||||
- ❌ Phone home to any server
|
- ❌ Phone home to any server
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
---
|
---
|
||||||
name: executioner
|
name: executioner
|
||||||
description: Optional Sanhedrin fallback verifier. Decomposes a draft into check-worthy claims, checks high-trust durable Vestige evidence, and returns a pass/veto verdict.
|
description: Optional Sanhedrin fallback verifier. Decomposes a draft into atomic claims, checks high-trust Vestige evidence, and returns a one-line pass/veto verdict.
|
||||||
tools: mcp__vestige__deep_reference, mcp__vestige__memory, mcp__vestige__search
|
tools: mcp__vestige__deep_reference, mcp__vestige__memory, mcp__vestige__search
|
||||||
model: claude-haiku-4-5-20251001
|
model: claude-haiku-4-5-20251001
|
||||||
---
|
---
|
||||||
|
|
@ -11,9 +11,9 @@ You are a one-turn verifier. You do not converse. You return exactly one line.
|
||||||
|
|
||||||
# Job
|
# Job
|
||||||
|
|
||||||
Decompose the draft response into check-worthy claims, verify each claim against
|
Decompose the draft response into atomic claims, verify each claim against
|
||||||
high-trust durable Vestige memory when available, and veto only when the draft
|
high-trust Vestige memory when available, and veto only when the draft
|
||||||
contradicts memory or makes a sensitive user-specific assertion without durable
|
contradicts memory or makes a sensitive user-specific assertion without
|
||||||
supporting evidence.
|
supporting evidence.
|
||||||
|
|
||||||
# Claim Classes
|
# Claim Classes
|
||||||
|
|
@ -24,22 +24,18 @@ Check all relevant classes:
|
||||||
2. `BIOGRAPHICAL` — identity, role, location, employment, education.
|
2. `BIOGRAPHICAL` — identity, role, location, employment, education.
|
||||||
3. `FINANCIAL` — costs, revenue, pricing, funding, prizes.
|
3. `FINANCIAL` — costs, revenue, pricing, funding, prizes.
|
||||||
4. `ACHIEVEMENT` — releases, rankings, completions, scores, milestones.
|
4. `ACHIEVEMENT` — releases, rankings, completions, scores, milestones.
|
||||||
5. `TIMELINE` — dates, durations, ordering, deadlines.
|
5. `TEMPORAL` — dates, durations, ordering, deadlines.
|
||||||
6. `QUANTITATIVE` — counts, percentages, metrics, measurements.
|
6. `QUANTITATIVE` — counts, percentages, metrics, measurements.
|
||||||
7. `ATTRIBUTION` — who said, decided, agreed, shipped, or committed.
|
7. `ATTRIBUTION` — who said, decided, agreed, shipped, or committed.
|
||||||
8. `CAUSAL` — claimed causes and effects.
|
8. `CAUSAL` — claimed causes and effects.
|
||||||
9. `COMPARATIVE` — better, most, fastest, more than, fewer than.
|
9. `COMPARATIVE` — better, most, fastest, more than, fewer than.
|
||||||
10. `EXISTENTIAL` — whether a file, feature, repo, or artifact exists.
|
10. `EXISTENTIAL` — whether a file, feature, repo, or artifact exists.
|
||||||
11. `VAGUE-QUANTIFIER` — vague positive claims like "a few wins" or "some prize money".
|
|
||||||
|
|
||||||
# Decision Rules
|
# Decision Rules
|
||||||
|
|
||||||
- Veto direct contradiction with high-trust memory.
|
- Veto direct contradiction with high-trust memory.
|
||||||
- Veto unsupported positive claims about the user's biography, finances,
|
- Veto unsupported positive claims about the user's biography, finances,
|
||||||
achievements, timeline, quantitative results, attribution, or vague
|
achievements, or attribution.
|
||||||
positive outcomes.
|
|
||||||
- Treat staged/current-turn evidence as context only. It is not durable memory and
|
|
||||||
cannot satisfy the durable-evidence requirement.
|
|
||||||
- Do not veto purely stylistic disagreement.
|
- Do not veto purely stylistic disagreement.
|
||||||
- Do not veto technical claims just because Vestige lacks evidence; the draft
|
- Do not veto technical claims just because Vestige lacks evidence; the draft
|
||||||
may rely on source files or external docs.
|
may rely on source files or external docs.
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/assets/0.IIz8MMYb.css.br
Normal file
BIN
apps/dashboard/build/_app/immutable/assets/0.IIz8MMYb.css.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/assets/0.IIz8MMYb.css.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/assets/0.IIz8MMYb.css.gz
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/chunks/BHGLDPij.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/BHGLDPij.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/chunks/BHGLDPij.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/BHGLDPij.js.gz
Normal file
Binary file not shown.
1
apps/dashboard/build/_app/immutable/chunks/BjdL4Pm2.js
Normal file
1
apps/dashboard/build/_app/immutable/chunks/BjdL4Pm2.js
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
import{w as S,g as T}from"./BeMFXnHE.js";import{e as R}from"./MAY1QfFZ.js";import{E as u}from"./DzfRjky4.js";const M=4,x=1500;function F(){const{subscribe:y,update:i}=S([]);let m=1,b=0;const d=new Map,a=new Map,l=new Map;function f(e,o){l.set(e,Date.now());const t=setTimeout(()=>{d.delete(e),l.delete(e),g(e)},o);d.set(e,t)}function w(e){const o=m++,t=Date.now(),s={id:o,createdAt:t,...e};i(n=>{const r=[s,...n];return r.length>M?r.slice(0,M):r}),f(o,e.dwellMs)}function g(e){const o=d.get(e);o&&(clearTimeout(o),d.delete(e)),a.delete(e),l.delete(e),i(t=>t.filter(s=>s.id!==e))}function C(e,o){const t=d.get(e);if(!t)return;clearTimeout(t),d.delete(e);const s=l.get(e)??Date.now(),n=Date.now()-s,r=Math.max(200,o-n);a.set(e,{remaining:r})}function D(e){const o=a.get(e);o&&(a.delete(e),f(e,o.remaining))}function N(){for(const e of d.values())clearTimeout(e);d.clear(),a.clear(),l.clear(),i(()=>[])}function _(e){const o=u[e.type]??"#818CF8",t=e.data;switch(e.type){case"DreamCompleted":{const s=Number(t.memories_replayed??0),n=Number(t.connections_found??0),r=Number(t.insights_generated??0),p=Number(t.duration_ms??0),c=[];return c.push(`Replayed ${s} ${s===1?"memory":"memories"}`),n>0&&c.push(`${n} new connection${n===1?"":"s"}`),r>0&&c.push(`${r} insight${r===1?"":"s"}`),{type:e.type,title:"Dream consolidated",body:`${c.join(" · ")} in ${(p/1e3).toFixed(1)}s`,color:o,dwellMs:7e3}}case"ConsolidationCompleted":{const s=Number(t.nodes_processed??0),n=Number(t.decay_applied??0),r=Number(t.embeddings_generated??0),p=Number(t.duration_ms??0),c=[];return n>0&&c.push(`${n} decayed`),r>0&&c.push(`${r} embedded`),{type:e.type,title:"Consolidation swept",body:`${s} node${s===1?"":"s"}${c.length?" · "+c.join(" · "):""} in ${(p/1e3).toFixed(1)}s`,color:o,dwellMs:6e3}}case"ConnectionDiscovered":{const s=Date.now();if(s-b<x)return null;b=s;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:o,dwellMs:4500}}case"MemoryPromoted":{const s=Number(t.new_retention??0);return{type:e.type,title:"Memory promoted",body:`retention ${(s*100).toFixed(0)}%`,color:o,dwellMs:4500}}case"MemoryDemoted":{const s=Number(t.new_retention??0);return{type:e.type,title:"Memory demoted",body:`retention ${(s*100).toFixed(0)}%`,color:o,dwellMs:4500}}case"MemorySuppressed":{const s=Number(t.suppression_count??0),n=Number(t.estimated_cascade??0);return{type:e.type,title:"Forgetting",body:n>0?`suppression #${s} · Rac1 cascade ~${n} neighbors`:`suppression #${s}`,color:o,dwellMs:5500}}case"MemoryUnsuppressed":{const s=Number(t.remaining_count??0);return{type:e.type,title:"Recovered",body:s>0?`${s} suppression${s===1?"":"s"} remain`:"fully unsuppressed",color:o,dwellMs:5e3}}case"Rac1CascadeSwept":{const s=Number(t.seeds??0),n=Number(t.neighbors_affected??0);return{type:e.type,title:"Rac1 cascade",body:`${s} seed${s===1?"":"s"} · ${n} dendritic spine${n===1?"":"s"} pruned`,color:o,dwellMs:6e3}}case"MemoryDeleted":return{type:e.type,title:"Memory deleted",body:String(t.id??"").slice(0,8),color:o,dwellMs:4e3};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 h=null;return R.subscribe(e=>{if(e.length===0)return;const o=[];for(const t of e){if(t===h)break;o.push(t)}if(o.length!==0){h=e[0];for(let t=o.length-1;t>=0;t--){const s=_(o[t]);s&&w(s)}}}),{subscribe:y,dismiss:g,clear:N,pauseDwell:C,resumeDwell:D,push:w}}const $=F();function O(){[{type:"DreamCompleted",title:"Dream consolidated",body:"Replayed 127 memories · 43 new connections · 5 insights in 2.4s",color:u.DreamCompleted,dwellMs:7e3},{type:"ConnectionDiscovered",title:"Bridge discovered",body:"semantic · weight 0.87",color:u.ConnectionDiscovered,dwellMs:4500},{type:"MemorySuppressed",title:"Forgetting",body:"suppression #2 · Rac1 cascade ~8 neighbors",color:u.MemorySuppressed,dwellMs:5500},{type:"ConsolidationCompleted",title:"Consolidation swept",body:"892 nodes · 156 decayed · 48 embedded in 1.1s",color:u.ConsolidationCompleted,dwellMs:6e3}].forEach((i,m)=>{setTimeout(()=>{$.push(i)},m*800)}),T($)}export{O as f,$ as t};
|
||||||
BIN
apps/dashboard/build/_app/immutable/chunks/BjdL4Pm2.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/BjdL4Pm2.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/chunks/BjdL4Pm2.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/BjdL4Pm2.js.gz
Normal file
Binary file not shown.
1
apps/dashboard/build/_app/immutable/chunks/BskPcZf7.js
Normal file
1
apps/dashboard/build/_app/immutable/chunks/BskPcZf7.js
Normal file
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/chunks/BskPcZf7.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/BskPcZf7.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/chunks/BskPcZf7.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/BskPcZf7.js.gz
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1 +0,0 @@
|
||||||
import{w as N,g as T}from"./BeMFXnHE.js";import{e as E}from"./MAY1QfFZ.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};
|
|
||||||
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
|
|
@ -1 +1 @@
|
||||||
const r="/api";async function t(e,o){const i=await fetch(`${r}${e}`,{headers:{"Content-Type":"application/json"},...o});if(!i.ok)throw new Error(`API ${i.status}: ${i.statusText}`);return i.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(([,i])=>i!==void 0).map(([i,s])=>[i,String(s)])).toString():"";return t(`/graph${o}`)},dream:()=>t("/dream",{method:"POST"}),explore:(e,o="associations",i,s=10)=>t("/explore",{method:"POST",body:JSON.stringify({from_id:e,action:o,to_id:i,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,i,s)=>t("/sanhedrin/appeal",{method:"POST",body:JSON.stringify({reason:e,note:o,claimId:i,receiptId:s})})}};export{n as a};
|
const r="/api";async function t(e,o){const i=await fetch(`${r}${e}`,{headers:{"Content-Type":"application/json"},...o});if(!i.ok)throw new Error(`API ${i.status}: ${i.statusText}`);return i.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(([,i])=>i!==void 0).map(([i,s])=>[i,String(s)])).toString():"";return t(`/graph${o}`)},dream:()=>t("/dream",{method:"POST"}),explore:(e,o="associations",i,s=10)=>t("/explore",{method:"POST",body:JSON.stringify({from_id:e,action:o,to_id:i,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})})};export{n as a};
|
||||||
BIN
apps/dashboard/build/_app/immutable/chunks/DNjM5a-l.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/DNjM5a-l.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/chunks/DNjM5a-l.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/DNjM5a-l.js.gz
Normal file
Binary file not shown.
|
|
@ -1 +1 @@
|
||||||
const e={fact:"#00A8FF",concept:"#9D00FF",event:"#FFB800",person:"#00FFD1",place:"#00D4FF",note:"#8B95A5",pattern:"#FF3CAC",decision:"#FF4757"},F={MemoryCreated:"#00FFD1",MemoryUpdated:"#00A8FF",MemoryDeleted:"#FF4757",MemoryPromoted:"#00FF88",MemoryDemoted:"#FF6B35",MemorySuppressed:"#A33FFF",MemoryUnsuppressed:"#14E8C6",Rac1CascadeSwept:"#6E3FFF",SearchPerformed:"#818CF8",DeepReferenceCompleted:"#C4B5FD",HookVerdictRecorded:"#F59E0B",DreamStarted:"#9D00FF",DreamProgress:"#B44AFF",DreamCompleted:"#C084FC",ConsolidationStarted:"#FFB800",ConsolidationCompleted:"#FF9500",RetentionDecayed:"#FF4757",ConnectionDiscovered:"#00D4FF",ActivationSpread:"#14E8C6",ImportanceScored:"#FF3CAC",Heartbeat:"#8B95A5"};export{F as E,e as N};
|
const e={fact:"#00A8FF",concept:"#9D00FF",event:"#FFB800",person:"#00FFD1",place:"#00D4FF",note:"#8B95A5",pattern:"#FF3CAC",decision:"#FF4757"},F={MemoryCreated:"#00FFD1",MemoryUpdated:"#00A8FF",MemoryDeleted:"#FF4757",MemoryPromoted:"#00FF88",MemoryDemoted:"#FF6B35",MemorySuppressed:"#A33FFF",MemoryUnsuppressed:"#14E8C6",Rac1CascadeSwept:"#6E3FFF",SearchPerformed:"#818CF8",DeepReferenceCompleted:"#C4B5FD",DreamStarted:"#9D00FF",DreamProgress:"#B44AFF",DreamCompleted:"#C084FC",ConsolidationStarted:"#FFB800",ConsolidationCompleted:"#FF9500",RetentionDecayed:"#FF4757",ConnectionDiscovered:"#00D4FF",ActivationSpread:"#14E8C6",ImportanceScored:"#FF3CAC",Heartbeat:"#8B95A5"};export{F as E,e as N};
|
||||||
BIN
apps/dashboard/build/_app/immutable/chunks/DzfRjky4.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/DzfRjky4.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/chunks/DzfRjky4.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/chunks/DzfRjky4.js.gz
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/entry/app.CYIcgKkt.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/entry/app.CYIcgKkt.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/entry/app.CYIcgKkt.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/entry/app.CYIcgKkt.js.gz
Normal file
Binary file not shown.
|
|
@ -1 +0,0 @@
|
||||||
import{a as r}from"../chunks/C2TQQEIa.js";import{w as t}from"../chunks/D8UfWY0j.js";export{t as load_css,r as start};
|
|
||||||
Binary file not shown.
Binary file not shown.
|
|
@ -0,0 +1 @@
|
||||||
|
import{a as r}from"../chunks/BHGLDPij.js";import{w as t}from"../chunks/BskPcZf7.js";export{t as load_css,r as start};
|
||||||
BIN
apps/dashboard/build/_app/immutable/entry/start.gT92nAJC.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/entry/start.gT92nAJC.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/entry/start.gT92nAJC.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/entry/start.gT92nAJC.js.gz
Normal file
Binary file not shown.
86
apps/dashboard/build/_app/immutable/nodes/0.COz2esg5.js
Normal file
86
apps/dashboard/build/_app/immutable/nodes/0.COz2esg5.js
Normal file
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/nodes/0.COz2esg5.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/0.COz2esg5.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/nodes/0.COz2esg5.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/0.COz2esg5.js.gz
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
|
@ -1 +1 @@
|
||||||
import"../chunks/Bzak7iHL.js";import{i as h}from"../chunks/BUoSzNdg.js";import{p as g,f as d,t as l,a as v,d as s,r as o,e as _}from"../chunks/CpWkWWOo.js";import{s as p}from"../chunks/BlVfL1ME.js";import{a as x,f as $}from"../chunks/CHOnp4oo.js";import{p as m}from"../chunks/D8UfWY0j.js";import{s as k}from"../chunks/C2TQQEIa.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var E=$("<h1> </h1> <p> </p>",1);function C(f,n){g(n,!1),h();var t=E(),r=d(t),c=s(r,!0);o(r);var a=_(r,2),u=s(a,!0);o(a),l(()=>{var e;p(c,i.status),p(u,(e=i.error)==null?void 0:e.message)}),x(f,t),v()}export{C as component};
|
import"../chunks/Bzak7iHL.js";import{i as h}from"../chunks/BUoSzNdg.js";import{p as g,f as d,t as l,a as v,d as s,r as o,e as _}from"../chunks/CpWkWWOo.js";import{s as p}from"../chunks/BlVfL1ME.js";import{a as x,f as $}from"../chunks/CHOnp4oo.js";import{p as m}from"../chunks/BskPcZf7.js";import{s as k}from"../chunks/BHGLDPij.js";const b={get error(){return m.error},get status(){return m.status}};k.updated.check;const i=b;var E=$("<h1> </h1> <p> </p>",1);function C(f,n){g(n,!1),h();var t=E(),r=d(t),c=s(r,!0);o(r);var a=_(r,2),u=s(a,!0);o(a),l(()=>{var e;p(c,i.status),p(u,(e=i.error)==null?void 0:e.message)}),x(f,t),v()}export{C as component};
|
||||||
BIN
apps/dashboard/build/_app/immutable/nodes/1.DJo7hfwf.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/1.DJo7hfwf.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/nodes/1.DJo7hfwf.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/1.DJo7hfwf.js.gz
Normal file
Binary file not shown.
|
|
@ -1,4 +1,4 @@
|
||||||
var Bc=Object.defineProperty;var zc=(i,t,e)=>t in i?Bc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var kt=(i,t,e)=>zc(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as jl,a as Zl}from"../chunks/GG5zm9kr.js";import{s as me,c as va,h as zt,g as B,p as ys,aB as kc,a as Es,d as yt,e as bt,n as Hc,r as xt,t as Ke,u as Gn,f as Kl,j as Vc}from"../chunks/CpWkWWOo.js";import{s as fe,d as $l,a as Fe}from"../chunks/BlVfL1ME.js";import{i as kn}from"../chunks/B4yTwGkE.js";import{e as _s,i as hr}from"../chunks/CGEBXrjl.js";import{a as _e,f as Se,c as Gc}from"../chunks/CHOnp4oo.js";import{s as ve,r as xa}from"../chunks/A7po6GxK.js";import{s as Us}from"../chunks/aVbAZ-t7.js";import{s as Sr}from"../chunks/Cx-f-Pzo.js";import{b as Ma}from"../chunks/sZcqyNBA.js";import{b as Jl}from"../chunks/BnXDGOmJ.js";import{s as Wc,a as Xc}from"../chunks/C6HuKgyx.js";import{b as Do}from"../chunks/D8UfWY0j.js";import{b as Yc}from"../chunks/CJsMJEun.js";import{p as vs}from"../chunks/V6gjw5Ec.js";import{N as Sa}from"../chunks/CcUbQ_Wl.js";import{i as qc}from"../chunks/BUoSzNdg.js";import{a as gi}from"../chunks/B7CfdQuM.js";import{e as jc}from"../chunks/MAY1QfFZ.js";/**
|
var Bc=Object.defineProperty;var zc=(i,t,e)=>t in i?Bc(i,t,{enumerable:!0,configurable:!0,writable:!0,value:e}):i[t]=e;var kt=(i,t,e)=>zc(i,typeof t!="symbol"?t+"":t,e);import"../chunks/Bzak7iHL.js";import{o as jl,a as Zl}from"../chunks/GG5zm9kr.js";import{s as me,c as va,h as zt,g as B,p as ys,aB as kc,a as Es,d as yt,e as bt,n as Hc,r as xt,t as Ke,u as Gn,f as Kl,j as Vc}from"../chunks/CpWkWWOo.js";import{s as fe,d as $l,a as Fe}from"../chunks/BlVfL1ME.js";import{i as kn}from"../chunks/B4yTwGkE.js";import{e as _s,i as hr}from"../chunks/CGEBXrjl.js";import{a as _e,f as Se,c as Gc}from"../chunks/CHOnp4oo.js";import{s as ve,r as xa}from"../chunks/A7po6GxK.js";import{s as Us}from"../chunks/aVbAZ-t7.js";import{s as Sr}from"../chunks/Cx-f-Pzo.js";import{b as Ma}from"../chunks/sZcqyNBA.js";import{b as Jl}from"../chunks/BnXDGOmJ.js";import{s as Wc,a as Xc}from"../chunks/C6HuKgyx.js";import{b as Do}from"../chunks/BskPcZf7.js";import{b as Yc}from"../chunks/CJsMJEun.js";import{p as vs}from"../chunks/V6gjw5Ec.js";import{N as Sa}from"../chunks/DzfRjky4.js";import{i as qc}from"../chunks/BUoSzNdg.js";import{a as gi}from"../chunks/DNjM5a-l.js";import{e as jc}from"../chunks/MAY1QfFZ.js";/**
|
||||||
* @license
|
* @license
|
||||||
* Copyright 2010-2024 Three.js Authors
|
* Copyright 2010-2024 Three.js Authors
|
||||||
* SPDX-License-Identifier: MIT
|
* SPDX-License-Identifier: MIT
|
||||||
BIN
apps/dashboard/build/_app/immutable/nodes/10.Btb56kL1.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/10.Btb56kL1.js.br
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/nodes/11.WP3QAgOF.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/11.WP3QAgOF.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/nodes/11.WP3QAgOF.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/11.WP3QAgOF.js.gz
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/nodes/12.DaxyVsV4.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/12.DaxyVsV4.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/nodes/12.DaxyVsV4.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/12.DaxyVsV4.js.gz
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/nodes/13.D52bbIQQ.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/13.D52bbIQQ.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/nodes/13.D52bbIQQ.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/13.D52bbIQQ.js.gz
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/nodes/15.C7Fk4d1G.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/15.C7Fk4d1G.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/nodes/15.C7Fk4d1G.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/15.C7Fk4d1G.js.gz
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/nodes/16.DeYkCVEo.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/16.DeYkCVEo.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/nodes/16.DeYkCVEo.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/16.DeYkCVEo.js.gz
Normal file
Binary file not shown.
File diff suppressed because one or more lines are too long
BIN
apps/dashboard/build/_app/immutable/nodes/17.CLL0vjL4.js.br
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/17.CLL0vjL4.js.br
Normal file
Binary file not shown.
BIN
apps/dashboard/build/_app/immutable/nodes/17.CLL0vjL4.js.gz
Normal file
BIN
apps/dashboard/build/_app/immutable/nodes/17.CLL0vjL4.js.gz
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue