dsh-loci 2.0.0 → 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +18 -0
- package/client.js +1367 -1367
- package/docs/ACCEPTANCE.md +279 -279
- package/docs/PRIVACY.md +93 -93
- package/package.json +1 -1
- package/src/host/index.js +290 -290
- package/src/host/store/audit.js +208 -208
- package/src/host/store/store.js +1538 -1538
- package/src/mcp/store-facade.js +1 -1
package/docs/PRIVACY.md
CHANGED
|
@@ -1,93 +1,93 @@
|
|
|
1
|
-
# PRIVACY — what is stored, where it goes, and how to delete it
|
|
2
|
-
|
|
3
|
-
## What is stored
|
|
4
|
-
|
|
5
|
-
| Data | Contents | Default retention |
|
|
6
|
-
|---|---|---|
|
|
7
|
-
| Memory entries | title, body, tags, entity names, status, evidence quote, source session id | until deleted |
|
|
8
|
-
| Revision history | every prior version of an entry | with the entry |
|
|
9
|
-
| Audit log | event name, timestamp, memory id, byte counts, session id | 5 generations × 8 MB |
|
|
10
|
-
| Request statistics | per-request injected bytes, listed/hidden counts | 90 days |
|
|
11
|
-
| Session summaries | a deterministic digest of the last 24 messages of a finished session | as an entry |
|
|
12
|
-
|
|
13
|
-
Never stored: tool results, full transcripts, model reasoning, credentials, or
|
|
14
|
-
anything from a session that is not the root session of a conversation.
|
|
15
|
-
|
|
16
|
-
## Where it is
|
|
17
|
-
|
|
18
|
-
`$DSH_HOME/memory/loci/` — nothing outside it. The location is printed by
|
|
19
|
-
`dsh-loci doctor` and by `loci_stats`.
|
|
20
|
-
|
|
21
|
-
## What leaves the machine
|
|
22
|
-
|
|
23
|
-
Nothing, by default. There is no telemetry, no analytics, and no network call in the
|
|
24
|
-
plugin's normal path.
|
|
25
|
-
|
|
26
|
-
Two things can reach the network, and both are opt-in:
|
|
27
|
-
|
|
28
|
-
| Path | When | What is sent | How to disable |
|
|
29
|
-
|---|---|---|---|
|
|
30
|
-
| Update check | only when you press "check for updates" on the sidebar card | one `GET https://registry.npmjs.org/dsh-loci/latest`; no query string, no identifier | `updateCheck: false`, or simply never press it |
|
|
31
|
-
| Embedding channel | only when `vectorMode` is `http` and an endpoint is configured | the text of the memory being embedded | leave `vectorMode` at `off` |
|
|
32
|
-
|
|
33
|
-
Opening the panel or the card does **not** contact the registry - the version
|
|
34
|
-
badge renders what is installed, and the update answer is served from a local
|
|
35
|
-
cache that only a press populates. `updateRegistry` exists for people behind a
|
|
36
|
-
slow or blocked route (`https://registry.npmmirror.com` works); it is a config
|
|
37
|
-
value, never something a project file can set.
|
|
38
|
-
|
|
39
|
-
Optional and off by default:
|
|
40
|
-
|
|
41
|
-
- **`vectorMode: 'http'`** sends the entry text (at write time) and the query text
|
|
42
|
-
(at search time) to the endpoint you configure. Set it to your own
|
|
43
|
-
`llama-server`/embedding gateway if you want vectors without a third party.
|
|
44
|
-
- The MCP facade, if you compose it, is a local stdio process; it makes no network
|
|
45
|
-
calls itself.
|
|
46
|
-
|
|
47
|
-
The model provider already sees the injected index, because that is what a prompt
|
|
48
|
-
is. The index contains titles, kinds and dates — not bodies. Bodies reach the model
|
|
49
|
-
only when a tool returns them for a specific query.
|
|
50
|
-
|
|
51
|
-
## What a model sees
|
|
52
|
-
|
|
53
|
-
1. **Every request**: the index (default budget 3,584 bytes ≈ 1.2k tokens), plus the
|
|
54
|
-
rules block. Titles only.
|
|
55
|
-
2. **On demand**: `loci_search` snippets and `loci_get` bodies, for the entries the
|
|
56
|
-
model chose to fetch.
|
|
57
|
-
3. **Never**: candidates, disputed entries, deleted entries, superseded revisions,
|
|
58
|
-
or history — unless a tool asks for them explicitly.
|
|
59
|
-
|
|
60
|
-
## User control
|
|
61
|
-
|
|
62
|
-
| Want | Where |
|
|
63
|
-
|---|---|
|
|
64
|
-
| See everything | Memory panel → Index / Stats; `dsh-loci stats` |
|
|
65
|
-
| See what is waiting | Memory panel → Review; `dsh-loci review` |
|
|
66
|
-
| Approve or reject | Review tab: Verify / Dispute |
|
|
67
|
-
| Delete a fact | entry detail → Delete (soft; history retained) |
|
|
68
|
-
| Delete permanently | `dsh-loci purge --id <id> --confirm <id>` (requires `allowHardDelete: true`) |
|
|
69
|
-
| Turn capture off | Settings → Session capture → off |
|
|
70
|
-
| Turn injection off | set `sectionMaxBytes` to its minimum and keep everything unverified, or disable the bundle |
|
|
71
|
-
| Export a copy | `dsh-loci export` |
|
|
72
|
-
| Stop everything | remove the bundle and delete `$DSH_HOME/memory/loci/` |
|
|
73
|
-
|
|
74
|
-
## Retention details
|
|
75
|
-
|
|
76
|
-
- **Deletion is soft by default**: the head revision is marked `deleted`, excluded
|
|
77
|
-
from search and injection, and the history stays readable by id. `purge` removes
|
|
78
|
-
every revision, the full-text rows, entity links and embeddings, and writes one
|
|
79
|
-
audit line.
|
|
80
|
-
- **Expiry is time-based, not destructive**: `valid_to` in the past means "no longer
|
|
81
|
-
current"; the row remains queryable with `asOf`.
|
|
82
|
-
- **Candidates** older than 30 days are closed by maintenance (still readable, no
|
|
83
|
-
longer counted as pending).
|
|
84
|
-
- **Audit** rotates at 8 MB and keeps 5 generations; its lines contain ids and counts,
|
|
85
|
-
never text.
|
|
86
|
-
- **Request statistics** are pruned after 90 days.
|
|
87
|
-
|
|
88
|
-
## Data a third party could infer
|
|
89
|
-
|
|
90
|
-
If someone obtains `memory.db`, they obtain the memory. If they obtain
|
|
91
|
-
`audit.jsonl`, they obtain the *pattern* of activity (when memory was written or
|
|
92
|
-
searched, how many bytes were injected, which memory ids), not its content. Treat
|
|
93
|
-
both as private files; neither is encrypted by Loci.
|
|
1
|
+
# PRIVACY — what is stored, where it goes, and how to delete it
|
|
2
|
+
|
|
3
|
+
## What is stored
|
|
4
|
+
|
|
5
|
+
| Data | Contents | Default retention |
|
|
6
|
+
|---|---|---|
|
|
7
|
+
| Memory entries | title, body, tags, entity names, status, evidence quote, source session id | until deleted |
|
|
8
|
+
| Revision history | every prior version of an entry | with the entry |
|
|
9
|
+
| Audit log | event name, timestamp, memory id, byte counts, session id | 5 generations × 8 MB |
|
|
10
|
+
| Request statistics | per-request injected bytes, listed/hidden counts | 90 days |
|
|
11
|
+
| Session summaries | a deterministic digest of the last 24 messages of a finished session | as an entry |
|
|
12
|
+
|
|
13
|
+
Never stored: tool results, full transcripts, model reasoning, credentials, or
|
|
14
|
+
anything from a session that is not the root session of a conversation.
|
|
15
|
+
|
|
16
|
+
## Where it is
|
|
17
|
+
|
|
18
|
+
`$DSH_HOME/memory/loci/` — nothing outside it. The location is printed by
|
|
19
|
+
`dsh-loci doctor` and by `loci_stats`.
|
|
20
|
+
|
|
21
|
+
## What leaves the machine
|
|
22
|
+
|
|
23
|
+
Nothing, by default. There is no telemetry, no analytics, and no network call in the
|
|
24
|
+
plugin's normal path.
|
|
25
|
+
|
|
26
|
+
Two things can reach the network, and both are opt-in:
|
|
27
|
+
|
|
28
|
+
| Path | When | What is sent | How to disable |
|
|
29
|
+
|---|---|---|---|
|
|
30
|
+
| Update check | only when you press "check for updates" on the sidebar card | one `GET https://registry.npmjs.org/dsh-loci/latest`; no query string, no identifier | `updateCheck: false`, or simply never press it |
|
|
31
|
+
| Embedding channel | only when `vectorMode` is `http` and an endpoint is configured | the text of the memory being embedded | leave `vectorMode` at `off` |
|
|
32
|
+
|
|
33
|
+
Opening the panel or the card does **not** contact the registry - the version
|
|
34
|
+
badge renders what is installed, and the update answer is served from a local
|
|
35
|
+
cache that only a press populates. `updateRegistry` exists for people behind a
|
|
36
|
+
slow or blocked route (`https://registry.npmmirror.com` works); it is a config
|
|
37
|
+
value, never something a project file can set.
|
|
38
|
+
|
|
39
|
+
Optional and off by default:
|
|
40
|
+
|
|
41
|
+
- **`vectorMode: 'http'`** sends the entry text (at write time) and the query text
|
|
42
|
+
(at search time) to the endpoint you configure. Set it to your own
|
|
43
|
+
`llama-server`/embedding gateway if you want vectors without a third party.
|
|
44
|
+
- The MCP facade, if you compose it, is a local stdio process; it makes no network
|
|
45
|
+
calls itself.
|
|
46
|
+
|
|
47
|
+
The model provider already sees the injected index, because that is what a prompt
|
|
48
|
+
is. The index contains titles, kinds and dates — not bodies. Bodies reach the model
|
|
49
|
+
only when a tool returns them for a specific query.
|
|
50
|
+
|
|
51
|
+
## What a model sees
|
|
52
|
+
|
|
53
|
+
1. **Every request**: the index (default budget 3,584 bytes ≈ 1.2k tokens), plus the
|
|
54
|
+
rules block. Titles only.
|
|
55
|
+
2. **On demand**: `loci_search` snippets and `loci_get` bodies, for the entries the
|
|
56
|
+
model chose to fetch.
|
|
57
|
+
3. **Never**: candidates, disputed entries, deleted entries, superseded revisions,
|
|
58
|
+
or history — unless a tool asks for them explicitly.
|
|
59
|
+
|
|
60
|
+
## User control
|
|
61
|
+
|
|
62
|
+
| Want | Where |
|
|
63
|
+
|---|---|
|
|
64
|
+
| See everything | Memory panel → Index / Stats; `dsh-loci stats` |
|
|
65
|
+
| See what is waiting | Memory panel → Review; `dsh-loci review` |
|
|
66
|
+
| Approve or reject | Review tab: Verify / Dispute |
|
|
67
|
+
| Delete a fact | entry detail → Delete (soft; history retained) |
|
|
68
|
+
| Delete permanently | `dsh-loci purge --id <id> --confirm <id>` (requires `allowHardDelete: true`) |
|
|
69
|
+
| Turn capture off | Settings → Session capture → off |
|
|
70
|
+
| Turn injection off | set `sectionMaxBytes` to its minimum and keep everything unverified, or disable the bundle |
|
|
71
|
+
| Export a copy | `dsh-loci export` |
|
|
72
|
+
| Stop everything | remove the bundle and delete `$DSH_HOME/memory/loci/` |
|
|
73
|
+
|
|
74
|
+
## Retention details
|
|
75
|
+
|
|
76
|
+
- **Deletion is soft by default**: the head revision is marked `deleted`, excluded
|
|
77
|
+
from search and injection, and the history stays readable by id. `purge` removes
|
|
78
|
+
every revision, the full-text rows, entity links and embeddings, and writes one
|
|
79
|
+
audit line.
|
|
80
|
+
- **Expiry is time-based, not destructive**: `valid_to` in the past means "no longer
|
|
81
|
+
current"; the row remains queryable with `asOf`.
|
|
82
|
+
- **Candidates** older than 30 days are closed by maintenance (still readable, no
|
|
83
|
+
longer counted as pending).
|
|
84
|
+
- **Audit** rotates at 8 MB and keeps 5 generations; its lines contain ids and counts,
|
|
85
|
+
never text.
|
|
86
|
+
- **Request statistics** are pruned after 90 days.
|
|
87
|
+
|
|
88
|
+
## Data a third party could infer
|
|
89
|
+
|
|
90
|
+
If someone obtains `memory.db`, they obtain the memory. If they obtain
|
|
91
|
+
`audit.jsonl`, they obtain the *pattern* of activity (when memory was written or
|
|
92
|
+
searched, how many bytes were injected, which memory ids), not its content. Treat
|
|
93
|
+
both as private files; neither is encrypted by Loci.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-loci",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.1",
|
|
4
4
|
"description": "Layered long-term memory for DeepSeek Harness: the prompt sees only a stable index, full text is one lookup away. Bi-temporal facts, strict scope isolation, verified-only injection.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|