coding-agents
vectorize-io/hindsightHindsight:会学习的 Agent 长期记忆系统,自动召回/保存、知识页、深度反思与按仓库隔离的记忆银行。
dsh 网页端项目级+全局长期记忆:分拆 POST /items 路由避免路径冲突,多轮工具调用上下文压缩后存入记忆项,去重与会话级持久化。
Long-term memory for the DeepSeek Harness Web GUI: project-scoped + global memory stores with automatic extraction, automatic briefing injection, small-model periodic consolidation, and an Obsidian-style memory graph.
See README.zh.md for the full Chinese documentation.
Compatibility: this release is 2.1.0, adapted to harness 0.2.0 / 0.2.0-rc.2 — configuration travels through the package's Config export and apply(ctx, config), the session log is read with snapshotEvents(), and dsh.client.inject lists the owner packages of every seat. Harness 0.1.7+ removed settings.register(), so there is no hot-reloadable settings namespace or generated settings panel any more: configuration lives in the profile's cordis.patch.yml.
~/.dsh/memory/ (respects $DSH_HOME), atomic writes.system-prompt/assemble waterfall listener appends the top-K memories (freshness x reinforcement x degree, interleaved scopes, char-capped) as a dynamic context; agentless assemblies get globals only; failures never touch the assembly.turn/end, new events are replayed as a transcript and distilled by the model into JSON candidates; near-duplicates (bigram Jaccard >= 0.65) reinforce instead of duplicating; 3 consecutive failures pause auto-extraction until a manual run recovers.dsh plugin --profile web add <repo-or-local-path>
dsh web # restart, then refresh the page
cordis.patch.yml)Override the entry the plugin's own patch inserts (id: ui-memory). A profile patch replaces the entry's config wholesale, so write only the keys you want to change — the rest fall back to the Config schema defaults (and to the plugin's built-in DEFAULTS):
# ~/.dsh/profiles/web/cordis.patch.yml
- id: ui-memory
config:
enabled: true
injectEnabled: true
autoExtract: true
extractProvider: '' # pair with extractModel to pin a small model
extractModel: ''
manageProvider: '' # consolidation model provider (empty = fall back to extract*)
manageModel: ''
consolidateEveryTurns: 20
topK: 8
maxInjectChars: 1500
maxInputChars: 12000
maxTokens: 1024
autoArchiveDays: 90 # heuristic auto-archive age in days (0 = off)
memoryLocale: '' # force memory language: '' = follow the conversation, or zh/en
embeddingsEnabled: true # local semantic embeddings (needs the optional dependency)
embeddingRemoteHost: '' # HuggingFace mirror, e.g. https://hf-mirror.com
autoLinkThreshold: 0.78 # cosine threshold for auto-linking during consolidation (0 = off)
The old ~/.dsh/settings.yaml namespace form no longer works on 0.1.7+.
lib/index.js — host half: Config export + apply(ctx, config), injection/extraction listeners, consolidation pipeline, routes.lib/store.js — two-scope JSON store + durable cursors/counters.lib/util.js — pure helpers (scope keys, similarity, parsers, transcript builder, message-source classification).lib/embeddings.js — optional local embeddings (transformers.js WASM): vector sidecar + serial inference queue.lib/client.js — browser half (hand-written bundle): additive conversation.view entry, per-message remember action, global toast.test/smoke.cjs — node test/smoke.cjs.test/e2e-flow.cjs — six-stage end-to-end business flow (node test/e2e-flow.cjs).settings.register() gone there is no equivalent live channel — a config change means editing the profile patch and reloading.snapshotEvents() is marked deprecated upstream (0.2.0 still ships it and it is the exact equivalent of the removed session.events getter). The plugin uses it to replay extraction transcripts; a future removal would require reading logs through an asynchronous session-query service.sessions.open() was removed, so "open source session" calls uiWorkspace.openSession() and silently does nothing when that service is absent.@huggingface/transformers resolvable from the plugin install (the 0.2.0 desktop asar no longer bundles it); otherwise retrieval degrades to lexical scoring.MIT