dsh-memento 0.4.0 → 0.4.2
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/ARCHITECTURE.md +177 -177
- package/CHANGELOG.md +104 -92
- package/README.es.md +163 -138
- package/README.hi.md +161 -136
- package/README.md +140 -137
- package/README.pt.md +164 -139
- package/README.zh.md +159 -156
- package/client/client.js +241 -241
- package/index.mjs +1739 -1730
- package/lib/constants.mjs +68 -68
- package/lib/store.mjs +717 -717
- package/package.json +153 -147
- package/types.d.ts +237 -237
package/README.es.md
CHANGED
|
@@ -1,192 +1,217 @@
|
|
|
1
|
+
<div align="center">
|
|
2
|
+
|
|
1
3
|
# dsh-memento
|
|
2
4
|
|
|
3
5
|
**Memoria entre sesiones acotada, por capas, con puerta de aprobación y auditable para DeepSeek Harness.**
|
|
4
6
|
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
[](LICENSE)
|
|
10
|
+
[](https://github.com/topics/dsh-plugin)
|
|
11
|
+
[](#)
|
|
12
|
+
[](https://github.com/PerryLink/dsh-memento/actions)
|
|
13
|
+
[](https://github.com/PerryLink/dsh-memento/releases)
|
|
10
14
|
[](https://www.npmjs.com/package/dsh-memento)
|
|
11
15
|
[](https://www.npmjs.com/package/dsh-memento)
|
|
12
|
-
[](https://github.com/PerryLink/dsh-memento/actions/workflows/ci.yml)
|
|
13
16
|
|
|
14
|
-
[English](README.md) · [
|
|
17
|
+
[English](README.md) · [简体中文](README.zh.md) · [Español](README.es.md) · [Português](README.pt.md) · [हिन्दी](README.hi.md)
|
|
15
18
|
|
|
16
|
-
>
|
|
19
|
+
</div>
|
|
17
20
|
|
|
18
|
-
|
|
21
|
+
---
|
|
19
22
|
|
|
20
|
-
|
|
21
|
-
- **La puerta no se puede eludir.** Toda ruta de escritura (`add`/`replace`/`remove`/`seed`) se fuerza a través de la cascada de aprobación **dentro del servicio**, no en la capa de herramientas. `writePolicy: ask | auto | off` es configuración que el modelo no puede ver ni cambiar; una postura `never` a nivel de sesión sigue prevaleciendo sobre todo. `replace`/`remove`/`consolidate` llevan el texto completo de las entradas que cambiarán en el payload de aprobación — lo que apruebas es lo que ves, y una escritura denegada deja igualmente una fila de auditoría `*-denied`.
|
|
22
|
-
- **Visible para el modelo ⟺ registrado.** La instantánea inyectada llega textualmente a `request/header.system`; cada escritura es reconstruible a partir de `approval/asked` (carga útil completa) + `approval/decided` (resultado) + la propia tabla de auditoría del plugin.
|
|
23
|
-
- **Acotada y honesta.** Presupuestos estrictos de caracteres por pista y por capa (por defecto usuario 2000 / agente 4000). Un almacén lleno **falla con un error estructurado** (uso + límite): el modelo consolida y reintenta. Nunca se trunca, nunca se compacta automáticamente.
|
|
23
|
+
## Compatibility
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
| Surface | Status |
|
|
26
|
+
|---|---|
|
|
27
|
+
| Harness | DeepSeek Harness `0.1.0-rc.6` |
|
|
28
|
+
| Node | `^22.19.0 || >=24.0.0` |
|
|
29
|
+
| Platforms | Windows / macOS / Linux (solo host; sin código nativo, sin red) |
|
|
30
|
+
| Model | Cualquiera |
|
|
26
31
|
|
|
27
|
-
|
|
28
|
-
# requires Node ^22.19 || >=24 and DSH 0.1.0-rc.6
|
|
29
|
-
dsh plugin --profile web add dsh-memento # or ./dsh-memento / a tarball / a GitHub URL
|
|
30
|
-
dsh --profile web --dump-config # expect a "# == dsh-memento" layer, no FAILED at startup
|
|
31
|
-
```
|
|
32
|
+
## What you get
|
|
32
33
|
|
|
33
|
-
|
|
34
|
+
`dsh-memento` es una costura de capacidad, no otro almacén: un servicio tipado `ctx.memory`, un proveedor SQLite local (`node:sqlite`, WAL, `0600`, en `$DSH_HOME/dsh-memento/memory.db`) y sus consumidores — la herramienta `memory` y una instantánea congelada inyectada en el prompt del sistema.
|
|
34
35
|
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
-
|
|
38
|
-
config:
|
|
39
|
-
writePolicy: ask # ask (default) | auto | off — model-invisible
|
|
40
|
-
budgets:
|
|
41
|
-
user: { userGlobal: 4000, workspace: 2000 } # Chinese-heavy memory: raise + note why
|
|
42
|
-
agent: { userGlobal: 4000, workspace: 4000 }
|
|
43
|
-
```
|
|
36
|
+
- **La puerta no se puede eludir.** Toda ruta de escritura (`add` / `replace` / `remove` / `seed`) se fuerza a través de la cascada de aprobación dentro del servicio, no en la capa de herramientas. `writePolicy: ask | auto | off` es configuración invisible para el modelo; `replace` / `remove` / `consolidate` llevan el texto completo de las entradas que cambian en el payload de aprobación, y una escritura denegada deja igualmente una fila de auditoría `*-denied`.
|
|
37
|
+
- **Visible para el modelo ⟺ registrado.** La instantánea inyectada llega textualmente a `request/header.system`; cada escritura es reconstruible a partir de `approval/asked` + `approval/decided` + la propia tabla de auditoría del plugin.
|
|
38
|
+
- **Acotada y honesta.** Presupuestos estrictos de caracteres por pista y por capa (por defecto usuario 2000 / agente 4000). Un almacén lleno falla con un error estructurado (uso + límite): nunca se trunca, nunca se compacta automáticamente.
|
|
44
39
|
|
|
45
|
-
|
|
40
|
+
Dos pistas × dos capas × clave por agente: una pista `user` (hechos sobre el usuario) y una pista `agent` (hechos de entorno y convenciones), cada una dividida en capas `user-global` y `workspace`, aisladas por `agentPreset`. La instantánea se congela una vez por sesión en el primer ensamblado del prompt y nunca cambia a mitad de sesión.
|
|
46
41
|
|
|
47
|
-
|
|
48
|
-
| --- | --- | --- |
|
|
49
|
-
| 🧩 Definición de Servicio | `ctx.memory` — `add` / `replace` / `remove` / `query` / `seed` / `budgets()` | Servicio tipado y declarado por fusión; los métodos de escritura aplican la puerta internamente |
|
|
50
|
-
| 🧬 Registro de adaptadores | `ctx.memoryAdapters` — `register` / `list` / `adapt` / `export` | Los plugins de memoria de terceros adaptan su propio almacén al protocolo; adaptadores de referencia para mem0, `memory.md` de Hermes y `CLAUDE.md` incluidos |
|
|
51
|
-
| 💾 Proveedor | `lib/store.mjs` — un solo archivo `node:sqlite` (`$DSH_HOME/dsh-memento/memory.db`, WAL) | Cero dependencias, cero red; tablas de entradas + auditoría; coincidencia por subcadena única |
|
|
52
|
-
| 🛠 Consumidores | herramienta `memory` · inyección de instantánea congelada (sección del system prompt, orden `-50`) · herramienta `memory_recall` · comando `/memory` · panel web de solo lectura | Escrituras/lecturas orientadas al modelo, instantánea congelada encabezada por presupuesto, recuperación en dos partes, comando del lado del usuario, panel lateral en el navegador |
|
|
42
|
+
## Quick start
|
|
53
43
|
|
|
54
|
-
|
|
44
|
+
```sh
|
|
45
|
+
# 1. install the bundle into your profile
|
|
46
|
+
dsh plugin --profile web add "github:PerryLink/dsh-memento#main"
|
|
55
47
|
|
|
56
|
-
|
|
48
|
+
# or from npm (published releases)
|
|
49
|
+
dsh plugin --profile web add dsh-memento
|
|
57
50
|
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
add/replace/remove/query per-session freeze, budget-headed
|
|
61
|
-
│ writes (agent+callId) │ reads (sync, session cwd)
|
|
62
|
-
▼ ▼
|
|
63
|
-
Service Definition: ctx.memory — budgets/add/replace/remove/query/seed
|
|
64
|
-
every write: budget precheck → ctx.approval.request (approval waterfall) → budget recheck → persist → audit
|
|
65
|
-
│
|
|
66
|
-
▼
|
|
67
|
-
Provider: lib/store.mjs — node:sqlite (WAL, 0600), entries + audit tables, unique-substring match
|
|
51
|
+
# 2. restart and verify the row
|
|
52
|
+
dsh --profile web --dump-config | grep -A3 'id: memento'
|
|
68
53
|
```
|
|
69
54
|
|
|
70
|
-
##
|
|
55
|
+
## Install & uninstall
|
|
56
|
+
|
|
57
|
+
- **canal git** (último `main`): `dsh plugin --profile web add git+https://github.com/PerryLink/dsh-memento.git`.
|
|
58
|
+
- **canal npm** (versiones publicadas): `dsh plugin --profile web add dsh-memento`.
|
|
59
|
+
- **canal tarball**: `npm pack` en este repo, luego `dsh plugin --profile web add ./dsh-memento-<version>.tgz`.
|
|
60
|
+
- **desinstalar**: `dsh plugin --profile web remove dsh-memento` (la base de datos de memoria y los registros de sesión se conservan).
|
|
61
|
+
|
|
62
|
+
## Configuration
|
|
63
|
+
|
|
64
|
+
Todos los parámetros son campos Schemastery `Config` (modificables desde cordis.yml). Los valores inválidos fallan de forma ruidosa al cargar. Se sobrescriben bajo la fila `memento`.
|
|
65
|
+
|
|
66
|
+
| Key | Default | Meaning |
|
|
67
|
+
|---|---|---|
|
|
68
|
+
| `enabled` | `true` | Interruptor maestro; `false` elimina servicio, herramientas, instantánea, comando, panel y answerer |
|
|
69
|
+
| `dbPath` | `''` → `$DSH_HOME/dsh-memento/memory.db` | Absoluto, o relativo a `$DSH_HOME` (en Windows cae a `~/.dsh`) |
|
|
70
|
+
| `budgets.user.userGlobal` | `2000` | Presupuesto estricto de caracteres de la capa user-global de la pista user |
|
|
71
|
+
| `budgets.user.workspace` | `2000` | Presupuesto estricto de caracteres de la capa workspace de la pista user |
|
|
72
|
+
| `budgets.agent.userGlobal` | `4000` | Presupuesto estricto de caracteres de la capa user-global de la pista agent |
|
|
73
|
+
| `budgets.agent.workspace` | `4000` | Presupuesto estricto de caracteres de la capa workspace de la pista agent |
|
|
74
|
+
| `writePolicy` | `'ask'` | Política de escritura por defecto: `ask` / `auto` / `off` (invisible para el modelo) |
|
|
75
|
+
| `writePolicies` | `{}` | Sobrescrituras por pista/ámbito o por origen (p. ej. `user/workspace`, `source:claude`) |
|
|
76
|
+
| `language` | `'en'` | Idioma del texto visible y la salida del comando: `en` / `zh` |
|
|
77
|
+
| `snapshotOrder` | `-50` | Orden de la sección de instantánea (tras la identidad del harness, antes de persona) |
|
|
78
|
+
| `maxEntriesPerQuery` | `20` | Tope de resultados por consulta por defecto (límite duro 1000) |
|
|
79
|
+
| `commandListLimit` | `50` | Entradas mostradas por `/memory list` / `query` |
|
|
80
|
+
| `commandAuditLimit` | `10` | Filas de auditoría mostradas por `/memory audit` |
|
|
81
|
+
| `recall.historyLimitDefault` | `8` | Sesiones escaneadas por `memory_recall` por defecto |
|
|
82
|
+
| `recall.snippetCap` | `5` | Fragmentos por sesión en `memory_recall` |
|
|
83
|
+
| `recall.snippetChars` | `300` | Caracteres de fragmento en `memory_recall` |
|
|
84
|
+
| `recall.windowDays` | `30` | Ventana de antigüedad en días de `memory_recall` |
|
|
85
|
+
| `panelEntriesLimit` | `200` | Tamaño de página de entradas del panel web |
|
|
86
|
+
| `panelAuditLimit` | `20` | Filas de auditoría del panel web por defecto |
|
|
87
|
+
| `auditRetentionDays` | `0` | Retención de auditoría (0 = conservar para siempre) |
|
|
88
|
+
| `proposals.enabled` | `true` | Capturar automáticamente una propuesta de memoria tras cada compactación exitosa |
|
|
89
|
+
| `proposals.maxChars` | `2000` | Tope de caracteres de la propuesta |
|
|
90
|
+
| `proposals.maxPending` | `8` | Tope de propuestas pendientes |
|
|
91
|
+
|
|
92
|
+
## Tools & surfaces
|
|
93
|
+
|
|
94
|
+
| Surface | Kind | Notes |
|
|
95
|
+
|---|---|---|
|
|
96
|
+
| `memory` | tool | add/replace/remove/consolidate/query con guía Save/Skip; las escrituras pasan por la puerta de aprobación |
|
|
97
|
+
| `memory_recall` | tool | Coincidencias acotadas de memoria más coincidencias recientes del historial de sesión |
|
|
98
|
+
| `/memory` | command | `list` · `query` · `add` · `remove` · `consolidate` · `proposals` · `budgets` · `audit` · `export` · `import <path>` · `adapters` |
|
|
99
|
+
| web panel | client drawer | Solo lectura: explorar entradas, buscar, barras de presupuesto, cola de auditoría |
|
|
100
|
+
|
|
101
|
+
## How it's different
|
|
71
102
|
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
dsh
|
|
75
|
-
dsh
|
|
76
|
-
dsh
|
|
77
|
-
|
|
103
|
+
| Plugin | Qué es | La diferencia de dsh-memento |
|
|
104
|
+
|---|---|---|
|
|
105
|
+
| dsh-memory-evolve | almacén de memoria / bucles de evolución | una costura de servicio tipada, puerta de aprobación y auditoría de registro de sesión; sin ambición de almacén |
|
|
106
|
+
| dsh-mnemon | ayudante de almacén de memoria | protocolo + puerta + auditoría, no otro almacén |
|
|
107
|
+
| dsh-kb-sieve | tamizado de base de conocimiento | sin ingeniería de recuperación: búsqueda por subcadena en corpus pequeño, recall entre sesiones vía `session_search`/`sessionQuery` |
|
|
108
|
+
| dsh-tdai-memory | herramientas de memoria dirigidas por tarea | los presupuestos son por track×capa y se aplican en el servicio, no a mejor esfuerzo |
|
|
109
|
+
| claude-bridge | puente de Claude Code | nativo de DSH; una futura ruta `seed(source:'claude')` deja que un puente alimente el mismo almacén |
|
|
110
|
+
| dsh-external/Recall | memoria de agente externa | local primero, cero red, usa la propia costura de aprobación de DSH |
|
|
111
|
+
| Official MCP memory examples | la posición declarada de DSH de "memoria = MCP externo" | el complemento **nativo de primera parte**: mismo objetivo, sin servidor externo; ambos coexisten |
|
|
78
112
|
|
|
79
|
-
|
|
113
|
+
El nombre es **`dsh-memento`** (publicado en npm y GitHub). No `dsh-recall` (confundible con dsh-external/Recall), no el nombre heredado eliminado `dsh-memory`.
|
|
80
114
|
|
|
81
|
-
##
|
|
115
|
+
## dsh-memory-protocol v1
|
|
82
116
|
|
|
83
|
-
|
|
117
|
+
`dsh-memento` es el ensayo comunitario del protocolo de memoria DSH — una forma candidata para una costura oficial `ctx.memory`. El protocolo normaliza la costura de este plugin en un contrato entre plugins:
|
|
84
118
|
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
| `budgets.agent.userGlobal` / `budgets.agent.workspace` | `4000` / `4000` | presupuesto estricto de caracteres por capa de la pista de agente |
|
|
91
|
-
| `writePolicy` | `'ask'` | `'ask'` = aprobación del usuario; `'auto'` = dejar pasar (se registra el origen de la aprobación); `'off'` = rechazar. Invisible para el modelo |
|
|
92
|
-
| `writePolicies` | `{}` | anulaciones por pista/capa o por fuente: claves `user/workspace`, `agent/user-global`, `source:claude`, … → `ask`/`auto`/`off`; sin coincidencia cae a `writePolicy` |
|
|
93
|
-
| `language` | `'en'` | idioma del texto visible para el modelo y de la salida del comando: `'en'` (por defecto) o `'zh'` — descripciones de herramientas, instantánea congelada, comando `/memory` y panel web lo siguen |
|
|
94
|
-
| `snapshotOrder` | `-50` | orden de la sección de la instantánea: después de la identidad del harness (`-100`), antes de la persona (`0`) |
|
|
95
|
-
| `maxEntriesPerQuery` | `20` | tope de resultados por consulta por defecto (`limit` explícito permitido, tope duro 1000) |
|
|
96
|
-
| `commandListLimit` | `50` | entradas mostradas por comando `/memory list` / `query` |
|
|
97
|
-
| `commandAuditLimit` | `10` | filas de auditoría mostradas por comando `/memory audit` |
|
|
98
|
-
| `recall.historyLimitDefault` / `recall.snippetCap` / `recall.snippetChars` / `recall.windowDays` | `8` / `5` / `300` / `30` | valores por defecto de historial de `memory_recall`: sesiones escaneadas, fragmentos por sesión, caracteres por fragmento, ventana de días |
|
|
99
|
-
| `panelEntriesLimit` | `200` | tamaño de página de entradas del panel web (y tope) |
|
|
100
|
-
| `panelAuditLimit` | `20` | filas de auditoría del panel web por defecto (tope 200) |
|
|
101
|
-
| `auditRetentionDays` | `0` | retención de auditoría: 0 = para siempre, >0 = poda al abrir la tienda |
|
|
102
|
-
| `proposals.enabled` / `proposals.maxChars` / `proposals.maxPending` | `true` / `2000` / `8` | auto-captura: propuesta de memoria pendiente tras cada compactación exitosa (truncada, una por sesión); desactivar o ajustar topes |
|
|
119
|
+
- **Entry spec** — dos pistas × dos capas × clave por agente, más `tags` cortos (≤16 × ≤32 caracteres) y un `version` por entrada que se incrementa en cada `replace`.
|
|
120
|
+
- **Write semantics** — escrituras condicionales idempotentes por subcadena única; payloads de aprobar-lo-que-se-ve (`replace` / `remove` / `consolidate` llevan el texto completo que cambian).
|
|
121
|
+
- **Audit contract** — cada escritura reconstruible desde `approval/asked` + `approval/decided` + el libro mayor del proveedor.
|
|
122
|
+
- **Budget model** — semántica `BUDGET_EXCEEDED` / `AMBIGUOUS_MATCH`.
|
|
123
|
+
- **Schema versioning** — reglas de migración con verificaciones de versión ruidosas.
|
|
103
124
|
|
|
104
|
-
|
|
125
|
+
- **Spec** — [docs/protocol-v1.md](docs/protocol-v1.md) (中文: [protocol-v1.zh.md](docs/protocol-v1.zh.md)); JSON Schema normativo en [docs/schemas/dsh-memory-protocol-v1.schema.json](docs/schemas/dsh-memory-protocol-v1.schema.json).
|
|
105
126
|
|
|
106
|
-
|
|
107
|
-
- **`memory_recall`** — recuperación en dos partes: coincidencias acotadas de memoria **más** coincidencias recientes del historial de sesión vía `ctx.sessionQuery` (se degrada con elegancia a solo memoria donde el servicio está ausente).
|
|
108
|
-
- **`/memory`** — comando activado por el usuario (no es un turno del modelo): `list` · `query <word>` · `add [--track=user|agent] [--scope=user-global|workspace] <text>` · `remove [flags] <substring>` · `consolidate [flags] <substring...> => <text>` · `proposals [approve|dismiss <id>]` · `budgets` · `audit` · `export [--adapter=<id>]` · `import <path> [--adapter=<id>]` · `adapters`. Las escrituras del comando pasan por la misma cascada + política; la auditoría se registra en la tabla de auditoría del plugin + `command/done`. `export` es de solo lectura y vuelca todas las entradas + presupuestos como un documento JSON; `import` lo restaura (ruta de archivo o JSON en línea, una sola aprobación, presupuestos pre-comprobados) — un ciclo completo de copia de seguridad/migración. Los verbos de adaptador convierten formatos de memoria externos: `import --adapter=mem0 <facts.json>` alimenta hechos a través del `seed` con puerta de aprobación; `export --adapter=<id>` imprime una conversión de solo lectura. Las entradas importadas reciben ids y marcas de tiempo nuevos; las propuestas, las filas de auditoría y los contadores de recuperación no se migran.
|
|
109
|
-
- **Propuestas auto-capturadas** — tras una compactación de sesión exitosa, el resumen se registra como propuesta de memoria pendiente (`agent/workspace`); aprobarla la escribe a través de la puerta de aprobación, descartarla la elimina. Las propuestas pendientes aparecen en la instantánea congelada y en el panel.
|
|
110
|
-
- **Panel web** — panel lateral `dsh.client` sin compilación: navega por entradas por pista/capa, busca, barras de presupuesto, cola de auditoría. De solo lectura por diseño: las escrituras y la aprobación ocurren a través de la herramienta `memory` y la interfaz de aprobación integrada.
|
|
127
|
+
**Registro de adaptadores** — `ctx.memoryAdapters` (`register` / `list` / `adapt` / `export`) permite a plugins de memoria de terceros hablar el protocolo registrando un convertidor de datos puro (`register()` reversible; la importación usa el `seed` con puerta de aprobación, la exportación es de solo lectura). Incorporación: [docs/adapters-guide.md](docs/adapters-guide.md) (中文: [adapters-guide.zh.md](docs/adapters-guide.zh.md)).
|
|
111
128
|
|
|
112
|
-
|
|
129
|
+
| Built-in adapter | External format | Notes |
|
|
130
|
+
|---|---|---|
|
|
131
|
+
| `mem0` | colecciones de hechos mem0 (`{facts: [{memory, metadata?}]}`) | `metadata.category` / `metadata.tags` se convierten en tags; los arrays `messages` crudos se rechazan — los adaptadores convierten, nunca extraen |
|
|
132
|
+
| `hermes-memory-md` | `memory.md` de Hermes (`## section` + viñetas) | los nombres de sección se convierten en tags; la prosa sin viñetas falla ruidosamente |
|
|
133
|
+
| `claude-code-memory-md` | markdown estilo `CLAUDE.md` (encabezados, viñetas, párrafos) | las viñetas y párrafos se convierten en entradas; los nombres de sección se convierten en tags |
|
|
113
134
|
|
|
114
|
-
|
|
135
|
+
**Suite de conformidad** — [test/protocol-conformance/](test/protocol-conformance/README.md): un conjunto de casos distribuible que cualquier proveedor que reclame compatibilidad ejecuta (`node test/protocol-conformance/run.mjs --provider ./your-factory.mjs`); el CI de este repo lo ejecuta contra su propio proveedor como referencia dorada (`npm run test:conformance`).
|
|
115
136
|
|
|
116
|
-
|
|
117
|
-
| --- | --- | --- |
|
|
118
|
-
| **Claude Code** — `CLAUDE.md` | **archivos de memoria en texto plano** jerárquicos (nivel usuario → nivel proyecto), legibles y editables por humanos, y combinados automáticamente en cada sesión — memoria que puedes leer y corregir tú mismo | entradas en texto plano; capas `user-global` / `workspace` combinadas por sesión; un almacén que puedes navegar, `export` y auditar — la transparencia como característica |
|
|
119
|
-
| **Codex** — `AGENTS.md` | **instrucciones con alcance por directorio** autodescubiertas e inyectadas sin fricción del modelo — la localidad importa más que el volumen; no hace falta llamada de herramienta para "cargar" memoria | capa `workspace` vinculada al cwd de la sesión (insensible a mayúsculas en Windows); la instantánea congelada se inyecta automáticamente al inicio de la sesión |
|
|
120
|
-
| **Hermes** — `memory.md` | **guardados de memoria proactivos** (guardar/actualizar/borrar) y, en el [issue #48181](https://github.com/NousResearch/hermes-agent/issues/48181), la lección de seguridad de que una puerta impuesta solo en la capa de herramientas es eludible mediante inyección tardía de herramientas — hay que imponerla donde convergen todas las rutas de escritura | la herramienta `memory` con guía explícita Guardar/Omitir + propuestas de auto-captura con puerta de aprobación; la puerta de aprobación vive **dentro** de los métodos de escritura de `ctx.memory`, no en la capa de herramientas |
|
|
137
|
+
- **Upstream proposal** — [docs/upstream-proposal.md](docs/upstream-proposal.md) (中文: [upstream-proposal.zh.md](docs/upstream-proposal.zh.md)): por qué la costura oficial `ctx.memory` debería adoptar el protocolo, las diferencias y la ruta de migración.
|
|
121
138
|
|
|
122
|
-
|
|
139
|
+
## Permissions & data
|
|
123
140
|
|
|
124
|
-
|
|
141
|
+
- **Permissions**: el manifiesto de workshop declara `harness:tool`, `filesystem:read`, `filesystem:write` y `network:none` / `subprocess:none` / `shell:none` / `python:none` / `credentials:none`. La aprobación de escritura usa la costura oficial de aprobación.
|
|
142
|
+
- **Data**: base de datos SQLite local (`0600`), cero red, cero credenciales.
|
|
143
|
+
- **Session log**: la completitud de auditoría proviene del par de aprobación (`approval/asked` + `approval/decided`) más la tabla de auditoría del plugin.
|
|
125
144
|
|
|
126
|
-
##
|
|
145
|
+
## Security boundaries
|
|
127
146
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
| dsh-kb-sieve | cribado de base de conocimiento | sin ingeniería de recuperación: búsqueda por subcadena sobre un corpus pequeño, recuperación entre sesiones vía `session_search`/`sessionQuery` |
|
|
133
|
-
| dsh-tdai-memory | herramientas de memoria dirigidas por tareas | los presupuestos son por pista×capa y se aplican en el servicio, no a mejor esfuerzo |
|
|
134
|
-
| claude-bridge | puente con Claude Code | nativo de DSH; una futura ruta `seed(source:'claude')` permite que un puente alimente el mismo almacén |
|
|
135
|
-
| dsh-external/Recall | memoria externa de agente | local primero, cero red, se apoya en la propia costura de aprobación de DSH |
|
|
136
|
-
| Ejemplos oficiales de memoria MCP | la postura declarada de DSH de "memoria = MCP externo" | el complemento **nativo de primera parte**: mismo objetivo, sin servidor externo; ambos coexisten |
|
|
147
|
+
- **Solo servicios públicos.** Consume `tools`, `systemPrompt` y la costura de aprobación; sin cambios en engine / agent-loop / apiproxy / UI oficial.
|
|
148
|
+
- **Cero red, cero credenciales.** Base de datos local con modo de archivo POSIX `0600`.
|
|
149
|
+
- **Fallo ruidoso.** Base de datos corrupta, esquema más nuevo o configuración inválida falla al cargar; presupuestos llenos y coincidencias de subcadena ambiguas fallan con errores estructurados.
|
|
150
|
+
- **Un proceso, un almacén.** Varias sesiones comparten el almacén SQLite; dos procesos que comparten un `$DSH_HOME` escriben el mismo archivo (último escritor gana bajo el bloqueo de SQLite).
|
|
137
151
|
|
|
138
|
-
|
|
152
|
+
## Known limitations
|
|
139
153
|
|
|
140
|
-
|
|
154
|
+
- **Los eventos de sesión están declarados, aún no emitidos (rc.6).** `memory/added|updated|removed|recalled|snapshot` están declarados por fusión, pero rc.6 no tiene superficie de registro para tipos de evento fuera del repo; la emisión se activa cuando una build del harness los registre.
|
|
155
|
+
- **La política `ask` necesita un answerer.** Sin un answerer UI/ACP compuesto, las escrituras fallan cerradas.
|
|
156
|
+
- **Sin indexado FTS5.** La búsqueda por subcadena usa `instr` insensible a mayúsculas (correcto para CJK).
|
|
141
157
|
|
|
142
|
-
|
|
158
|
+
## What we learned from the terminal memories
|
|
143
159
|
|
|
144
|
-
-
|
|
145
|
-
- **Registro de adaptadores** — `ctx.memoryAdapters` permite que plugins de memoria de terceros hablen el protocolo registrando un conversor de datos puro (`register()` reversible; la importación pasa por `seed` con puerta de aprobación, la exportación es de solo lectura). Guía: [docs/adapters-guide.md](docs/adapters-guide.md) (chino: [adapters-guide.zh.md](docs/adapters-guide.zh.md)).
|
|
160
|
+
`dsh-memento` no es un port de Claude Code, Codex o Hermes — pero su diseño absorbió deliberadamente las partes que cada uno hizo bien, y rechazó las que dañaban:
|
|
146
161
|
|
|
147
|
-
|
|
|
148
|
-
|
|
149
|
-
| `
|
|
150
|
-
|
|
|
151
|
-
| `
|
|
162
|
+
| Terminal memory | Lo que hizo bien | Lo que dsh-memento adoptó |
|
|
163
|
+
|---|---|---|
|
|
164
|
+
| **Claude Code** — `CLAUDE.md` | archivos de memoria en texto plano jerárquicos (nivel usuario → nivel proyecto), legibles y editables por humanos, fusionados automáticamente en cada sesión | entradas en texto plano; capas `user-global` / `workspace` fusionadas por sesión; un almacén que puedes explorar, `export` y auditar — transparencia como característica |
|
|
165
|
+
| **Codex** — `AGENTS.md` | instrucciones con ámbito por directorio auto-descubiertas e inyectadas con fricción cero para el modelo | la capa `workspace` indexada por el cwd de la sesión (insensible a mayúsculas en Windows); la instantánea congelada inyectada automáticamente al iniciar la sesión |
|
|
166
|
+
| **Hermes** — `memory.md` | guardados de memoria proactivos y la lección de seguridad de que una puerta aplicada solo en la capa de herramientas es eludible por inyección tardía de herramientas | la herramienta `memory` con guía Save/Skip + propuestas de auto-captura con puerta de aprobación; la puerta vive dentro de los métodos de escritura de `ctx.memory`, no en la capa de herramientas |
|
|
152
167
|
|
|
153
|
-
|
|
154
|
-
- **Propuesta de upstream** — [docs/upstream-proposal.md](docs/upstream-proposal.md) (chino: [upstream-proposal.zh.md](docs/upstream-proposal.zh.md)): por qué la costura oficial `ctx.memory` debería adoptar el protocolo, las diferencias y la ruta de migración.
|
|
168
|
+
Fuentes: [Claude Code memory](https://code.claude.com/docs/en/memory) · [Codex AGENTS.md](https://developers.openai.com/codex/cli/agents-md) · [Hermes memory](https://github.com/NousResearch/hermes-agent/blob/main/website/docs/user-guide/features/memory.md) · [Hermes #48181](https://github.com/NousResearch/hermes-agent/issues/48181).
|
|
155
169
|
|
|
156
|
-
|
|
170
|
+
Y las partes deliberadamente rechazadas: la auto-resumación oculta hacia estado privado del modelo (los resúmenes de compactación aquí se convierten en **propuestas pendientes** que esperan un approve/dismiss humano), las ambiciones de almacén/vector-store, y cualquier escritura sin aprobación o rastro de auditoría visible para humanos. También adoptado: la advertencia documentada de Hermes de que dos procesos que comparten un directorio home escriben el mismo archivo de memoria — véase Security boundaries.
|
|
157
171
|
|
|
158
|
-
|
|
159
|
-
- **Cero red, cero credenciales.** Base de datos local; modo de archivo POSIX `0600`.
|
|
160
|
-
- **Falla de forma explícita.** Una base de datos corrupta o un esquema más nuevo falla al cargar; los presupuestos llenos y las coincidencias ambiguas de subcadena fallan con errores estructurados. Nada se traga ni se trunca en silencio.
|
|
161
|
-
- **Un proceso, un almacén.** Varias sesiones en un proceso comparten el almacén SQLite (escrituras serializadas, auditoría por sesión). Dos **procesos** que comparten un `$DSH_HOME` escriben el mismo archivo: gana el último escritor bajo el bloqueo de SQLite — no ejecutes dos instancias del harness sobre un mismo `$DSH_HOME` si necesitas coherencia entre procesos (la misma advertencia que documenta el proyecto Hermes).
|
|
172
|
+
## Development
|
|
162
173
|
|
|
163
|
-
|
|
174
|
+
```sh
|
|
175
|
+
npm install # node ^22.19 || >=24
|
|
176
|
+
npm test # node --test: 133 tests
|
|
177
|
+
npm run test:conformance # dsh-memory-protocol v1 conformance suite
|
|
178
|
+
npm run typecheck # tsc --checkJs gate
|
|
179
|
+
npm run check:coverage # line-coverage gate
|
|
180
|
+
npm run check:readmes # five-language README consistency gate
|
|
181
|
+
```
|
|
164
182
|
|
|
165
|
-
|
|
166
|
-
- **La política `ask` necesita un contestador.** Sin un contestador de UI/ACP compuesto, las escrituras fallan en modo cerrado (`unavailable`): por diseño, la postura de fallo cerrado de la costura de aprobación.
|
|
167
|
-
- **Sin índice FTS5.** La búsqueda por subcadena usa `instr` insensible a mayúsculas (correcto para CJK); el ranking de recuperación usa contadores de aciertos por entrada. El tokenizador trigram de FTS5 no puede indexar caracteres CJK de un solo carácter, así que no se usa — véase [ARCHITECTURE.md](ARCHITECTURE.md), decisión 10.
|
|
183
|
+
`lib/` tiene cero dependencias de DSH (solo builtins de node:); las importaciones de DSH solo existen en `index.mjs`.
|
|
168
184
|
|
|
169
|
-
##
|
|
185
|
+
## Topics
|
|
170
186
|
|
|
171
|
-
|
|
172
|
-
npm install
|
|
173
|
-
npm test # node --test: 133 tests — budget, unique-substring, gate policy, store, snapshot, mock-ctx integration (S2/S3 invariants), V2 command/recall/panel/import, adaptadores de protocolo + conformidad
|
|
174
|
-
npm run test:conformance # suite de conformidad dsh-memory-protocol v1 (referencia dorada; terceros usan --provider)
|
|
175
|
-
npm run typecheck # puerta tsc --checkJs sobre index.mjs / lib / scripts
|
|
176
|
-
npm run check:coverage # puerta de cobertura de líneas: lib ≥90 %, index.mjs ≥85 %, todos ≥90 %
|
|
177
|
-
npm run check:readmes # puerta de coherencia de los cinco README
|
|
178
|
-
```
|
|
187
|
+
`dsh`, `dsh-plugin`, `deepseek-harness`, `memory`, `agent-memory`, `approval`, `audit`, `sqlite`, `cordis`, `llm`
|
|
179
188
|
|
|
180
|
-
|
|
189
|
+
## Contributors
|
|
181
190
|
|
|
182
|
-
|
|
191
|
+
- [@Niuniu-Sir](https://github.com/Niuniu-Sir) — el informe de fallo de arranque en [issue #1](https://github.com/PerryLink/dsh-memento/issues/1) que llevó al fallback `~/.dsh` incluido en 0.3.1.
|
|
183
192
|
|
|
184
|
-
|
|
193
|
+
## PerryLink DSH Plugin Family
|
|
185
194
|
|
|
186
|
-
|
|
195
|
+
Este proyecto es uno de los [15 plugins de DeepSeek Harness](https://github.com/PerryLink) mantenidos por [PerryLink](https://github.com/PerryLink). Si este te ayuda, los demás probablemente también:
|
|
187
196
|
|
|
188
|
-
|
|
197
|
+
| Plugin | One-liner |
|
|
198
|
+
|---|---|
|
|
199
|
+
| [dsh-mcp-panel](https://github.com/PerryLink/dsh-mcp-panel) | Read-only MCP runtime panel: /mcp command + Settings tab with status, tools and errors |
|
|
200
|
+
| [dsh-doublecheck](https://github.com/PerryLink/dsh-doublecheck) | Engineering-discipline guard: requirements grill, test gates, adversary review |
|
|
201
|
+
| [dsh-background-agents](https://github.com/PerryLink/dsh-background-agents) | Durable background child agents with a Web UI sidebar, messaging and interrupt |
|
|
202
|
+
| [dsh-lsp-actions](https://github.com/PerryLink/dsh-lsp-actions) | LSP diagnostics, formatting, completion, code actions and rename over language servers |
|
|
203
|
+
| [dsh-output-styles](https://github.com/PerryLink/dsh-output-styles) | Claude Code outputStyles-equivalent runtime style switching |
|
|
204
|
+
| [dsh-checkpoint-rewind](https://github.com/PerryLink/dsh-checkpoint-rewind) | Claude Code /rewind-equivalent: snapshots, session forks, one-shot restore |
|
|
205
|
+
| [dsh-permission-rules](https://github.com/PerryLink/dsh-permission-rules) | Claude Code-style declarative allow/deny/ask permission rules with audit |
|
|
206
|
+
| [dsh-auto-review](https://github.com/PerryLink/dsh-auto-review) | Second-model auto-review on the approval chain, fail-closed by default |
|
|
207
|
+
| **[dsh-memento](https://github.com/PerryLink/dsh-memento)** | Approval-gated cross-session memory: ctx.memory seam + SQLite + memory tool |
|
|
208
|
+
| [dsh-skill-pack-security](https://github.com/PerryLink/dsh-skill-pack-security) | Security-audit skill pack: secret scan, dependency and supply-chain review |
|
|
209
|
+
| [dsh-session-pin](https://github.com/PerryLink/dsh-session-pin) | Pin sessions in the Web sidebar with durable ordering |
|
|
210
|
+
| [dsh-composer-history](https://github.com/PerryLink/dsh-composer-history) | Terminal-style input history for the web composer: arrows, Ctrl+R search |
|
|
211
|
+
| [dsh-github](https://github.com/PerryLink/dsh-github) | GitHub PR/issues integration for DSH, every write gated by approval |
|
|
212
|
+
| [dsh-plugin-guide](https://github.com/PerryLink/dsh-plugin-guide) | Plugin-development knowledge base as an on-demand agent skill |
|
|
213
|
+
| [dsh-claude-move](https://github.com/PerryLink/dsh-claude-move) | Migrate Claude Code sessions, memory, skills and CLAUDE.md into DSH |
|
|
189
214
|
|
|
190
|
-
##
|
|
215
|
+
## License
|
|
191
216
|
|
|
192
|
-
|
|
217
|
+
[Apache License 2.0](LICENSE) © 2026 dsh-memento contributors
|